feat(ql3): establish 3.0 incubation baseline

This commit is contained in:
whyour
2026-08-12 00:25:26 +08:00
parent 4bf92dcfeb
commit c699c32461
2817 changed files with 779642 additions and 653 deletions
@@ -0,0 +1,483 @@
import {
assertLocalSqliteOptions,
assertLocalSqlitePathBoundary,
LocalSqliteConfigurationError,
openLocalSqliteClient,
type LocalSqliteDatabaseOptions,
type LocalSqliteProfile,
} from '../storage/config';
import {
auditLocalSqliteReadiness,
type LocalSqliteReadinessEvidence,
} from '../readiness/readiness';
import { LocalSqliteRunRepository } from '../run/runRepository';
import { createLocalSqliteRunRuntimeCapabilities } from '../run/runRuntimeCapabilities';
import { LocalSqliteSecurityAuthorityStore } from '../security/securityAuthorityStore';
import type { LocalRunStartupRecoverySource } from '@qinglong/runtime-core/local-startup-recovery';
import type { LocalDispatchStore } from '@qinglong/runtime-core/local-dispatch';
import type { LocalExecutionControlSource } from '@qinglong/runtime-core/local-execution-control';
import type { LocalCompletionReceiptJournal } from '@qinglong/runtime-core/local-completion-receipt-journal';
import type { LocalSecretEnvelopeRepository } from '@qinglong/runtime-core/local-secret';
import type { LocalSecretAdministrationRepository } from '@qinglong/runtime-core/local-secret-administration';
import type { ProjectPolicyRepository } from '@qinglong/runtime-core/project-policy';
import type { SecurityAuditSink } from '@qinglong/runtime-core/security-audit';
import type { ApiCredentialRepository } from '@qinglong/runtime-core/api-credential';
import type { LocalOwnerPepperRepository } from '@qinglong/runtime-core/local-owner-pepper';
import type { PluginPackageInstallRepository } from '@qinglong/runtime-core/plugin-package-install';
import type {
PluginPackageAutomationPublicationRepository,
PluginPackageAutomationPublicationRecoverySource,
} from '@qinglong/runtime-core/plugin-package-automation-publication';
import type { PluginPackageMaterializedRevisionRepository } from '@qinglong/runtime-core/plugin-package-resource-materialization';
import type { PluginPackageTaskReconciliationRepository } from '@qinglong/runtime-core/plugin-package-task-reconciliation';
import type { PluginPackageTaskPublicationRecoverySource } from '@qinglong/runtime-core/plugin-package-task-publication';
import type { StepRunRepository } from '@qinglong/runtime-core/step-run';
import type { RunCancellationRepository } from '@qinglong/runtime-core/run-cancellation';
import type { TaskStartRepository } from '@qinglong/runtime-core/task-start';
import type { ToolExecutionCompletionRepository } from '@qinglong/runtime-core/tool-execution-completion';
import type { ToolExecutionFailureCompletionRepository } from '@qinglong/runtime-core/tool-execution-failure-completion';
import type { ToolExecutionStartBarrierRepository } from '@qinglong/runtime-core/tool-execution-start-barrier';
import type { ToolInvocationArtifactRepository } from '@qinglong/runtime-core/tool-invocation-artifact';
import type { ToolResultKeyCatalogReader } from '@qinglong/runtime-core/tool-result-key-catalog';
import type { ToolExecutionResultRekeyReader } from '@qinglong/runtime-core/tool-result-rekey';
import type {
ProjectToolDefinitionSnapshotRepository,
ProjectToolDefinitionSnapshotSourceRepository,
} from '@qinglong/runtime-core/project-tool-definition-snapshot';
import { LocalSqliteApiCredentialRepository } from '../security/apiCredentialRepository';
import { LocalSqliteOwnerPepperRepository } from '../local-owner/ownerPepperRepository';
import { LocalSqliteOperationAuthority } from '../authority/operationAuthority';
import { LocalSqliteTaskDefinitionRepository } from '../task-definition/taskDefinitionRepository';
import {
TaskSpecSemanticRegistry,
createBuiltInTaskSpecSemanticRegistry,
} from '@qinglong/runtime-core/task-spec-semantic';
import {
TriggerSpecSemanticRegistry,
createBuiltInTriggerSpecSemanticRegistry,
} from '@qinglong/runtime-core/trigger';
import { LocalSqliteTriggerRepository } from '../scheduling/triggerRepository';
import { LocalSqliteScheduleRepository } from '../scheduling/scheduleRepository';
import type { LocalSqliteWorkflowTaskExecutionRepository } from '../plugin-package/workflow/workflowTaskExecutionRepository';
import type { LocalSqlitePluginPackageWorkflowFrontierRepository } from '../plugin-package/workflow/pluginPackageWorkflowFrontierRepository';
import type { LocalSqlitePluginPackageWorkflowTaskAttemptAdmissionRepository } from '../plugin-package/workflow/pluginPackageWorkflowTaskAttemptAdmissionRepository';
import type { LocalSqlitePluginPackageWorkflowCancellationConvergenceRepository } from '../plugin-package/workflow/pluginPackageWorkflowCancellationConvergenceRepository';
export interface LocalSqliteRuntimeDependencies {
readonly taskSpecSemanticRegistry?: TaskSpecSemanticRegistry;
readonly triggerSpecSemanticRegistry?: TriggerSpecSemanticRegistry;
}
export interface LocalSqliteTrustedToolStorage {
readonly invocationArtifacts: ToolInvocationArtifactRepository;
readonly stepRuns: StepRunRepository;
readonly startBarriers: ToolExecutionStartBarrierRepository;
readonly completions: ToolExecutionCompletionRepository;
readonly failureCompletions: ToolExecutionFailureCompletionRepository;
readonly resultKeyCatalog: ToolResultKeyCatalogReader;
readonly resultRekeys: ToolExecutionResultRekeyReader;
readonly toolDefinitionSnapshots: ProjectToolDefinitionSnapshotRepository &
ProjectToolDefinitionSnapshotSourceRepository;
}
export interface LocalSqlitePluginPackageWorkflowRuntime {
readonly frontier: LocalSqlitePluginPackageWorkflowFrontierRepository;
readonly taskAttempts: LocalSqlitePluginPackageWorkflowTaskAttemptAdmissionRepository;
readonly cancellation: LocalSqlitePluginPackageWorkflowCancellationConvergenceRepository;
readonly executions: LocalSqliteWorkflowTaskExecutionRepository;
}
export interface LocalSqliteRuntimeDatabase {
readonly profile: LocalSqliteProfile;
readonly readiness: LocalSqliteReadinessEvidence;
readonly runRepository: LocalSqliteRunRepository;
readonly taskDefinitions: LocalSqliteTaskDefinitionRepository;
readonly triggers: LocalSqliteTriggerRepository;
readonly schedules: LocalSqliteScheduleRepository;
readonly localDispatch: LocalDispatchStore;
readonly executionControl: LocalExecutionControlSource;
readonly completionReceipts: LocalCompletionReceiptJournal;
readonly localSecrets: LocalSecretEnvelopeRepository;
readonly localSecretAdministration: LocalSecretAdministrationRepository;
readonly projectPolicy: ProjectPolicyRepository;
readonly securityAudit: SecurityAuditSink;
readonly apiCredentials: ApiCredentialRepository;
readonly ownerPepper: LocalOwnerPepperRepository;
pluginPackageInstalls(): Promise<PluginPackageInstallRepository>;
pluginPackageMaterializedRevisions(): Promise<PluginPackageMaterializedRevisionRepository>;
pluginPackageTaskReconciliations(): Promise<
PluginPackageTaskReconciliationRepository &
PluginPackageTaskPublicationRecoverySource
>;
pluginPackageAutomationPublications(): Promise<
PluginPackageAutomationPublicationRepository &
PluginPackageAutomationPublicationRecoverySource
>;
projectToolDefinitionSnapshots(): Promise<
ProjectToolDefinitionSnapshotRepository &
ProjectToolDefinitionSnapshotSourceRepository
>;
stepRunReader(): Promise<Pick<StepRunRepository, 'listByRun'>>;
runCancellationRepository(): Promise<RunCancellationRepository>;
taskStartRepository(): Promise<TaskStartRepository>;
pluginPackageWorkflowRuntime(): Promise<LocalSqlitePluginPackageWorkflowRuntime>;
trustedToolStorage(): Promise<LocalSqliteTrustedToolStorage>;
readonly startupRecovery: LocalRunStartupRecoverySource;
close(): Promise<void>;
}
export async function openLocalSqliteRuntimeDatabase(
options: LocalSqliteDatabaseOptions,
dependencies: LocalSqliteRuntimeDependencies = {},
): Promise<LocalSqliteRuntimeDatabase> {
assertLocalSqliteOptions(options);
if (
!dependencies ||
typeof dependencies !== 'object' ||
Array.isArray(dependencies) ||
Object.keys(dependencies).some(
(key) =>
key !== 'taskSpecSemanticRegistry' &&
key !== 'triggerSpecSemanticRegistry',
) ||
(dependencies.taskSpecSemanticRegistry !== undefined &&
!(
dependencies.taskSpecSemanticRegistry instanceof
TaskSpecSemanticRegistry
)) ||
(dependencies.triggerSpecSemanticRegistry !== undefined &&
!(
dependencies.triggerSpecSemanticRegistry instanceof
TriggerSpecSemanticRegistry
))
) {
throw new LocalSqliteConfigurationError(
'runtime dependencies contain an unsupported semantic registry',
);
}
assertLocalSqlitePathBoundary(options.databasePath, false);
const client = openLocalSqliteClient(options, false);
try {
const readiness = await auditLocalSqliteReadiness(client);
const authority = new LocalSqliteOperationAuthority(client);
const taskSpecSemanticRegistry =
dependencies.taskSpecSemanticRegistry ??
createBuiltInTaskSpecSemanticRegistry();
const runRepository = new LocalSqliteRunRepository(authority);
const runRuntimeCapabilities =
createLocalSqliteRunRuntimeCapabilities(authority);
const securityAuthority = new LocalSqliteSecurityAuthorityStore(authority);
const taskDefinitions = new LocalSqliteTaskDefinitionRepository(
authority,
taskSpecSemanticRegistry,
);
const triggers = new LocalSqliteTriggerRepository(
authority,
dependencies.triggerSpecSemanticRegistry ??
createBuiltInTriggerSpecSemanticRegistry(),
);
const schedules = new LocalSqliteScheduleRepository(authority);
const apiCredentials = new LocalSqliteApiCredentialRepository(authority);
const ownerPepper = new LocalSqliteOwnerPepperRepository(authority);
let pluginPackageInstallsPromise:
| Promise<PluginPackageInstallRepository>
| undefined;
let pluginPackageMaterializedRevisionsPromise:
| Promise<PluginPackageMaterializedRevisionRepository>
| undefined;
let pluginPackageTaskReconciliationsPromise:
| Promise<
PluginPackageTaskReconciliationRepository &
PluginPackageTaskPublicationRecoverySource
>
| undefined;
let pluginPackageAutomationPublicationsPromise:
| Promise<
PluginPackageAutomationPublicationRepository &
PluginPackageAutomationPublicationRecoverySource
>
| undefined;
let projectToolDefinitionSnapshotsPromise:
| Promise<
ProjectToolDefinitionSnapshotRepository &
ProjectToolDefinitionSnapshotSourceRepository
>
| undefined;
let stepRunRepositoryPromise: Promise<StepRunRepository> | undefined;
let runCancellationRepositoryPromise:
| Promise<RunCancellationRepository>
| undefined;
let taskStartRepositoryPromise: Promise<TaskStartRepository> | undefined;
let pluginPackageWorkflowRuntimePromise:
| Promise<LocalSqlitePluginPackageWorkflowRuntime>
| undefined;
let trustedToolStoragePromise:
| Promise<LocalSqliteTrustedToolStorage>
| undefined;
const projectPolicy: ProjectPolicyRepository = Object.freeze({
resolve: (
...[projectId, subject]: Parameters<ProjectPolicyRepository['resolve']>
) => securityAuthority.resolve(projectId, subject),
append: (...[command]: Parameters<ProjectPolicyRepository['append']>) =>
securityAuthority.append(command),
});
let closePromise: Promise<void> | undefined;
return Object.freeze({
profile: options.profile,
readiness,
runRepository,
taskDefinitions,
triggers,
schedules,
localDispatch: runRuntimeCapabilities.dispatch,
executionControl: runRuntimeCapabilities.executionControl,
completionReceipts: runRuntimeCapabilities.completionReceipts,
localSecrets: securityAuthority,
localSecretAdministration: securityAuthority,
projectPolicy,
securityAudit: securityAuthority,
apiCredentials,
ownerPepper,
pluginPackageInstalls() {
pluginPackageInstallsPromise ??= import(
'../plugin-package/pluginPackageInstallRepository.js'
).then(
({ LocalSqlitePluginPackageInstallRepository }) =>
new LocalSqlitePluginPackageInstallRepository(authority),
);
return pluginPackageInstallsPromise;
},
pluginPackageMaterializedRevisions() {
pluginPackageMaterializedRevisionsPromise ??= import(
'../plugin-package/pluginPackageMaterializedRevisionRepository.js'
).then(
({ LocalSqlitePluginPackageMaterializedRevisionRepository }) =>
new LocalSqlitePluginPackageMaterializedRevisionRepository(
authority,
taskSpecSemanticRegistry,
),
);
return pluginPackageMaterializedRevisionsPromise;
},
pluginPackageTaskReconciliations() {
pluginPackageTaskReconciliationsPromise ??= import(
'../plugin-package/pluginPackageTaskReconciliationRepository.js'
).then(
({ LocalSqlitePluginPackageTaskReconciliationRepository }) =>
new LocalSqlitePluginPackageTaskReconciliationRepository(
authority,
taskSpecSemanticRegistry,
),
);
return pluginPackageTaskReconciliationsPromise;
},
pluginPackageAutomationPublications() {
pluginPackageAutomationPublicationsPromise ??= import(
'../plugin-package/pluginPackageAutomationPublicationRepository.js'
).then(
({ LocalSqlitePluginPackageAutomationPublicationRepository }) =>
new LocalSqlitePluginPackageAutomationPublicationRepository(
authority,
),
);
return pluginPackageAutomationPublicationsPromise;
},
projectToolDefinitionSnapshots() {
projectToolDefinitionSnapshotsPromise ??= import(
'../tool-execution/projectToolDefinitionSnapshotRepository.js'
).then(
({ LocalSqliteProjectToolDefinitionSnapshotRepository }) =>
new LocalSqliteProjectToolDefinitionSnapshotRepository(authority),
);
return projectToolDefinitionSnapshotsPromise;
},
stepRunReader() {
stepRunRepositoryPromise ??= import('../run/stepRunRepository.js').then(
({ LocalSqliteStepRunRepository }) =>
new LocalSqliteStepRunRepository(authority),
);
return stepRunRepositoryPromise.then((repository) =>
Object.freeze({
listByRun: repository.listByRun.bind(repository),
}),
);
},
runCancellationRepository() {
runCancellationRepositoryPromise ??= import(
'../run/runCancellationRepository.js'
).then(
({ LocalSqliteRunCancellationRepository }) =>
new LocalSqliteRunCancellationRepository(authority),
);
return runCancellationRepositoryPromise;
},
taskStartRepository() {
taskStartRepositoryPromise ??= import(
'../task-start/taskStartRepository.js'
).then(
({ LocalSqliteTaskStartRepository }) =>
new LocalSqliteTaskStartRepository(authority),
);
return taskStartRepositoryPromise;
},
pluginPackageWorkflowRuntime() {
pluginPackageWorkflowRuntimePromise ??= Promise.all([
import(
'../plugin-package/workflow/pluginPackageWorkflowFrontierRepository.js'
),
import(
'../plugin-package/workflow/pluginPackageWorkflowTaskAttemptAdmissionRepository.js'
),
import(
'../plugin-package/workflow/pluginPackageWorkflowCancellationConvergenceRepository.js'
),
import(
'../plugin-package/workflow/workflowTaskExecutionRepository.js'
),
]).then(
([
{ LocalSqlitePluginPackageWorkflowFrontierRepository },
{ LocalSqlitePluginPackageWorkflowTaskAttemptAdmissionRepository },
{
LocalSqlitePluginPackageWorkflowCancellationConvergenceRepository,
},
{ LocalSqliteWorkflowTaskExecutionRepository },
]) =>
Object.freeze({
frontier: new LocalSqlitePluginPackageWorkflowFrontierRepository(
authority,
),
taskAttempts:
new LocalSqlitePluginPackageWorkflowTaskAttemptAdmissionRepository(
authority,
),
cancellation:
new LocalSqlitePluginPackageWorkflowCancellationConvergenceRepository(
authority,
),
executions: new LocalSqliteWorkflowTaskExecutionRepository(
authority,
),
}),
);
return pluginPackageWorkflowRuntimePromise;
},
trustedToolStorage() {
trustedToolStoragePromise ??= Promise.all([
import('../tool-execution/toolInvocationArtifactRepository.js'),
stepRunRepositoryPromise ??
(stepRunRepositoryPromise = import(
'../run/stepRunRepository.js'
).then(
({ LocalSqliteStepRunRepository }) =>
new LocalSqliteStepRunRepository(authority),
)),
import('../tool-execution/toolExecutionStartBarrierRepository.js'),
import('../tool-execution/toolExecutionCompletionRepository.js'),
import(
'../tool-execution/toolExecutionFailureCompletionRepository.js'
),
import('../tool-execution/toolResultKeyCatalogRepository.js'),
import('../tool-execution/toolResultRekeyRepository.js'),
projectToolDefinitionSnapshotsPromise ??
(projectToolDefinitionSnapshotsPromise = import(
'../tool-execution/projectToolDefinitionSnapshotRepository.js'
).then(
({ LocalSqliteProjectToolDefinitionSnapshotRepository }) =>
new LocalSqliteProjectToolDefinitionSnapshotRepository(
authority,
),
)),
]).then(
([
{ LocalSqliteToolInvocationArtifactRepository },
stepRuns,
{ LocalSqliteToolExecutionStartBarrierRepository },
{ LocalSqliteToolExecutionCompletionRepository },
{ LocalSqliteToolExecutionFailureCompletionRepository },
{ LocalSqliteToolResultKeyCatalogRepository },
{ LocalSqliteToolResultRekeyRepository },
toolDefinitionSnapshots,
]) => {
const resultKeyCatalog =
new LocalSqliteToolResultKeyCatalogRepository(authority);
const resultRekeys = new LocalSqliteToolResultRekeyRepository(
authority,
);
return Object.freeze({
invocationArtifacts:
new LocalSqliteToolInvocationArtifactRepository(authority),
stepRuns,
startBarriers: new LocalSqliteToolExecutionStartBarrierRepository(
authority,
),
completions: new LocalSqliteToolExecutionCompletionRepository(
authority,
),
failureCompletions:
new LocalSqliteToolExecutionFailureCompletionRepository(
authority,
),
resultKeyCatalog: Object.freeze({
findCurrent:
resultKeyCatalog.findCurrent.bind(resultKeyCatalog),
}),
resultRekeys: Object.freeze({
findHeadByArtifactId:
resultRekeys.findHeadByArtifactId.bind(resultRekeys),
}),
toolDefinitionSnapshots,
});
},
);
return trustedToolStoragePromise;
},
startupRecovery: runRuntimeCapabilities.startupRecovery,
close() {
if (closePromise) return closePromise;
closePromise = runRepository.close();
return closePromise;
},
});
} catch (error) {
client.close();
throw error;
}
}
export async function auditLocalSqlitePath(
options: LocalSqliteDatabaseOptions,
): Promise<LocalSqliteReadinessEvidence> {
assertLocalSqliteOptions(options);
assertLocalSqlitePathBoundary(options.databasePath, false);
const client = openLocalSqliteClient(options, true);
try {
return await auditLocalSqliteReadiness(client);
} finally {
client.close();
}
}
export {
LocalSqliteConfigurationError,
type LocalSqliteDatabaseOptions,
type LocalSqliteProfile,
};
export {
LOCAL_SQLITE_CONTRACT_NAME,
LOCAL_SQLITE_CONTRACT_VERSION,
LocalSqliteReadinessError,
type LocalSqliteReadinessEvidence,
} from '../readiness/readiness';
export { localSqliteMigrationManifest } from '../migration/migrationManifest';
export { LocalSqliteRunRepository } from '../run/runRepository';
export { LocalSqliteTaskDefinitionRepository } from '../task-definition/taskDefinitionRepository';
export { LocalSqliteTriggerRepository } from '../scheduling/triggerRepository';
export { LocalSqliteScheduleRepository } from '../scheduling/scheduleRepository';
export type {
LocalRunStartupRecoveryCandidate,
LocalRunStartupRecoveryPage,
LocalRunStartupRecoverySource,
LocalRunStartupRecoveryStatus,
} from '@qinglong/runtime-core/local-startup-recovery';
export { MAX_LOCAL_RUN_STARTUP_RECOVERY_CANDIDATES } from '@qinglong/runtime-core/local-startup-recovery';