Files
qinglong/packages/ql3-local-sqlite/src/migration/migration.ts
T

273 lines
16 KiB
TypeScript

import {
runMigrationStream,
type MigrationStreamDefinition,
} from '@qinglong/runtime-core/migration-stream';
import type { DatabaseSync } from 'node:sqlite';
import fs from 'node:fs';
import {
assertLocalSqliteOptions,
assertLocalSqlitePathBoundary,
openLocalSqliteClient,
type LocalSqliteDatabaseOptions,
} from '../storage/config';
import { local0001RunCoreMigration } from '../migrations/0001-run-core';
import { local0002CapabilityMigration } from '../migrations/0002-capability';
import { local0003CompletionReceiptJournalMigration } from '../migrations/0003-completion-receipt-journal';
import { local0004CapabilityV2Migration } from '../migrations/0004-capability-v2';
import { local0005LocalDispatchPlanMigration } from '../migrations/0005-local-dispatch-plan';
import { local0006CapabilityV3Migration } from '../migrations/0006-capability-v3';
import { local0007LocalSecretEnvelopesMigration } from '../migrations/0007-local-secret-envelopes';
import { local0008CapabilityV4Migration } from '../migrations/0008-capability-v4';
import { local0009LocalProjectPolicyAuditMigration } from '../migrations/0009-local-project-policy-audit';
import { local0010CapabilityV5Migration } from '../migrations/0010-capability-v5';
import { local0011LocalIdentityCredentialMigration } from '../migrations/0011-local-identity-credential';
import { local0012CapabilityV6Migration } from '../migrations/0012-capability-v6';
import { local0013LocalOwnerBootstrapMigration } from '../migrations/0013-local-owner-bootstrap';
import { local0014CapabilityV7Migration } from '../migrations/0014-capability-v7';
import { local0015LocalOwnerDeliveryAcknowledgementsMigration } from '../migrations/0015-local-owner-delivery-acknowledgements';
import { local0016CapabilityV8Migration } from '../migrations/0016-capability-v8';
import { local0017ApiCredentialPepperBindingsMigration } from '../migrations/0017-api-credential-pepper-bindings';
import { local0018CapabilityV9Migration } from '../migrations/0018-capability-v9';
import { local0019LocalOwnerPepperCatalogMigration } from '../migrations/0019-local-owner-pepper-catalog';
import { local0020CapabilityV10Migration } from '../migrations/0020-capability-v10';
import { local0021LocalOwnerCredentialRecoveryMigration } from '../migrations/0021-local-owner-credential-recovery';
import { local0022CapabilityV11Migration } from '../migrations/0022-capability-v11';
import { local0023LocalOwnerPepperMaterialGcMigration } from '../migrations/0023-local-owner-pepper-material-gc';
import { local0024CapabilityV12Migration } from '../migrations/0024-capability-v12';
import { local0025LocalOwnerDeliveryAcknowledgementGcMigration } from '../migrations/0025-local-owner-delivery-acknowledgement-gc';
import { local0026CapabilityV13Migration } from '../migrations/0026-capability-v13';
import { local0027TaskDefinitionsMigration } from '../migrations/0027-task-definitions';
import { local0028CapabilityV14Migration } from '../migrations/0028-capability-v14';
import { local0029LocalExecutionRevisionDigestMigration } from '../migrations/0029-local-execution-revision-digest';
import { local0030CapabilityV15Migration } from '../migrations/0030-capability-v15';
import { local0031TriggerDefinitionsMigration } from '../migrations/0031-trigger-definitions';
import { local0032CapabilityV16Migration } from '../migrations/0032-capability-v16';
import { local0033LegacyAdoptionLedgerMigration } from '../migrations/0033-legacy-adoption-ledger';
import { local0034CapabilityV17Migration } from '../migrations/0034-capability-v17';
import { local0035LocalSchedulerMigration } from '../migrations/0035-local-scheduler';
import { local0036CapabilityV18Migration } from '../migrations/0036-capability-v18';
import { local0037PluginPackageInstallsMigration } from '../migrations/0037-plugin-package-installs';
import { local0038CapabilityV19Migration } from '../migrations/0038-capability-v19';
import { local0039ApprovedActionsMigration } from '../migrations/0039-approved-actions';
import { local0040CapabilityV20Migration } from '../migrations/0040-capability-v20';
import { local0041PluginPackageAdmissionReceiptsMigration } from '../migrations/0041-plugin-package-admission-receipts';
import { local0042CapabilityV21Migration } from '../migrations/0042-capability-v21';
import { local0043ApprovedActionExecutionsAndPackageProposalsMigration } from '../migrations/0043-approved-action-executions-and-package-proposals';
import { local0044CapabilityV22Migration } from '../migrations/0044-capability-v22';
import { local0045PluginPackageMaterializedRevisionsMigration } from '../migrations/0045-plugin-package-materialized-revisions';
import { local0046CapabilityV23Migration } from '../migrations/0046-capability-v23';
import { local0047PluginPackageTaskReconciliationsMigration } from '../migrations/0047-plugin-package-task-reconciliations';
import { local0048CapabilityV24Migration } from '../migrations/0048-capability-v24';
import { local0049ProjectToolDefinitionSnapshotsMigration } from '../migrations/0049-project-tool-definition-snapshots';
import { local0050CapabilityV25Migration } from '../migrations/0050-capability-v25';
import { local0051StepRunsMigration } from '../migrations/0051-step-runs';
import { local0052CapabilityV26Migration } from '../migrations/0052-capability-v26';
import { local0053ToolExecutionEvidenceMigration } from '../migrations/0053-tool-execution-evidence';
import { local0054CapabilityV27Migration } from '../migrations/0054-capability-v27';
import { local0055ToolExecutionStartBarriersMigration } from '../migrations/0055-tool-execution-start-barriers';
import { local0056CapabilityV28Migration } from '../migrations/0056-capability-v28';
import { local0057ToolInvocationArtifactsMigration } from '../migrations/0057-tool-invocation-artifacts';
import { local0058CapabilityV29Migration } from '../migrations/0058-capability-v29';
import { local0059ToolExecutionArtifactBindingsMigration } from '../migrations/0059-tool-execution-artifact-bindings';
import { local0060CapabilityV30Migration } from '../migrations/0060-capability-v30';
import { local0061ToolExecutionCompletionsMigration } from '../migrations/0061-tool-execution-completions';
import { local0062CapabilityV31Migration } from '../migrations/0062-capability-v31';
import { local0063ToolExecutionFailureCompletionsMigration } from '../migrations/0063-tool-execution-failure-completions';
import { local0064CapabilityV32Migration } from '../migrations/0064-capability-v32';
import { local0065ToolResultKeyCatalogMigration } from '../migrations/0065-tool-result-key-catalog';
import { local0066CapabilityV33Migration } from '../migrations/0066-capability-v33';
import { local0067ToolResultRekeyOverlaysMigration } from '../migrations/0067-tool-result-rekey-overlays';
import { local0068CapabilityV34Migration } from '../migrations/0068-capability-v34';
import { local0069PluginPackageQuarantineMigration } from '../migrations/0069-plugin-package-quarantine';
import { local0070CapabilityV35Migration } from '../migrations/0070-capability-v35';
import { local0071LocalIdentityCredentialAdministrationMigration } from '../migrations/0071-local-identity-credential-administration';
import { local0072CapabilityV36Migration } from '../migrations/0072-capability-v36';
import { local0073LocalProjectAdministrationMigration } from '../migrations/0073-local-project-administration';
import { local0074CapabilityV37Migration } from '../migrations/0074-capability-v37';
import { local0075SecurityAuditCompactionsMigration } from '../migrations/0075-security-audit-compactions';
import { local0076CapabilityV38Migration } from '../migrations/0076-capability-v38';
import { local0077PluginPackageLifecycleMigration } from '../migrations/0077-plugin-package-lifecycle';
import { local0078CapabilityV39Migration } from '../migrations/0078-capability-v39';
import { local0079PluginPackageAutomationPublicationsMigration } from '../migrations/0079-plugin-package-automation-publications';
import { local0080CapabilityV40Migration } from '../migrations/0080-capability-v40';
import { local0081PluginPackageWorkflowAdmissionsMigration } from '../migrations/0081-plugin-package-workflow-admissions';
import { local0082CapabilityV41Migration } from '../migrations/0082-capability-v41';
import { local0083PluginPackageWorkflowTaskAttemptAdmissionsMigration } from '../migrations/0083-plugin-package-workflow-task-attempt-admissions';
import { local0084CapabilityV42Migration } from '../migrations/0084-capability-v42';
import { local0085PluginPackageWorkflowRunListIndexMigration } from '../migrations/0085-plugin-package-workflow-run-list-index';
import { local0086CapabilityV43Migration } from '../migrations/0086-capability-v43';
import { local0087RunAttemptLogRetentionMigration } from '../migrations/0087-run-attempt-log-retention';
import { local0088CapabilityV44Migration } from '../migrations/0088-capability-v44';
import { local0089PluginPackageAutomationDispositionEventsMigration } from '../migrations/0089-plugin-package-automation-disposition-events';
import { local0090CapabilityV45Migration } from '../migrations/0090-capability-v45';
import { local0091PluginPackageSecretBindingsMigration } from '../migrations/0091-plugin-package-secret-bindings';
import { local0092CapabilityV46Migration } from '../migrations/0092-capability-v46';
import { local0093PluginPackageSecretMaterializationGuardMigration } from '../migrations/0093-plugin-package-secret-materialization-guard';
import { local0094CapabilityV47Migration } from '../migrations/0094-capability-v47';
import type { LocalSqliteMigrationContext } from '../migrations/sqlMigration';
import {
LOCAL_SQLITE_MIGRATION_STREAM_ID,
LocalSqliteMigrationStreamStore,
} from './migrationStreamStore';
import { localSqliteMigrationManifest } from './migrationManifest';
import {
auditLocalSqliteReadiness,
type LocalSqliteReadinessEvidence,
} from '../readiness/readiness';
export interface LocalSqliteMigrationResult {
readonly readiness: LocalSqliteReadinessEvidence;
}
export const localSqliteMigrationDefinition: MigrationStreamDefinition<LocalSqliteMigrationContext> =
Object.freeze({
id: LOCAL_SQLITE_MIGRATION_STREAM_ID,
dialect: 'sqlite',
migrationIdScheme: 'sqlite-numbered',
checksumScheme: 'sha256',
migrations: Object.freeze([
local0001RunCoreMigration,
local0002CapabilityMigration,
local0003CompletionReceiptJournalMigration,
local0004CapabilityV2Migration,
local0005LocalDispatchPlanMigration,
local0006CapabilityV3Migration,
local0007LocalSecretEnvelopesMigration,
local0008CapabilityV4Migration,
local0009LocalProjectPolicyAuditMigration,
local0010CapabilityV5Migration,
local0011LocalIdentityCredentialMigration,
local0012CapabilityV6Migration,
local0013LocalOwnerBootstrapMigration,
local0014CapabilityV7Migration,
local0015LocalOwnerDeliveryAcknowledgementsMigration,
local0016CapabilityV8Migration,
local0017ApiCredentialPepperBindingsMigration,
local0018CapabilityV9Migration,
local0019LocalOwnerPepperCatalogMigration,
local0020CapabilityV10Migration,
local0021LocalOwnerCredentialRecoveryMigration,
local0022CapabilityV11Migration,
local0023LocalOwnerPepperMaterialGcMigration,
local0024CapabilityV12Migration,
local0025LocalOwnerDeliveryAcknowledgementGcMigration,
local0026CapabilityV13Migration,
local0027TaskDefinitionsMigration,
local0028CapabilityV14Migration,
local0029LocalExecutionRevisionDigestMigration,
local0030CapabilityV15Migration,
local0031TriggerDefinitionsMigration,
local0032CapabilityV16Migration,
local0033LegacyAdoptionLedgerMigration,
local0034CapabilityV17Migration,
local0035LocalSchedulerMigration,
local0036CapabilityV18Migration,
local0037PluginPackageInstallsMigration,
local0038CapabilityV19Migration,
local0039ApprovedActionsMigration,
local0040CapabilityV20Migration,
local0041PluginPackageAdmissionReceiptsMigration,
local0042CapabilityV21Migration,
local0043ApprovedActionExecutionsAndPackageProposalsMigration,
local0044CapabilityV22Migration,
local0045PluginPackageMaterializedRevisionsMigration,
local0046CapabilityV23Migration,
local0047PluginPackageTaskReconciliationsMigration,
local0048CapabilityV24Migration,
local0049ProjectToolDefinitionSnapshotsMigration,
local0050CapabilityV25Migration,
local0051StepRunsMigration,
local0052CapabilityV26Migration,
local0053ToolExecutionEvidenceMigration,
local0054CapabilityV27Migration,
local0055ToolExecutionStartBarriersMigration,
local0056CapabilityV28Migration,
local0057ToolInvocationArtifactsMigration,
local0058CapabilityV29Migration,
local0059ToolExecutionArtifactBindingsMigration,
local0060CapabilityV30Migration,
local0061ToolExecutionCompletionsMigration,
local0062CapabilityV31Migration,
local0063ToolExecutionFailureCompletionsMigration,
local0064CapabilityV32Migration,
local0065ToolResultKeyCatalogMigration,
local0066CapabilityV33Migration,
local0067ToolResultRekeyOverlaysMigration,
local0068CapabilityV34Migration,
local0069PluginPackageQuarantineMigration,
local0070CapabilityV35Migration,
local0071LocalIdentityCredentialAdministrationMigration,
local0072CapabilityV36Migration,
local0073LocalProjectAdministrationMigration,
local0074CapabilityV37Migration,
local0075SecurityAuditCompactionsMigration,
local0076CapabilityV38Migration,
local0077PluginPackageLifecycleMigration,
local0078CapabilityV39Migration,
local0079PluginPackageAutomationPublicationsMigration,
local0080CapabilityV40Migration,
local0081PluginPackageWorkflowAdmissionsMigration,
local0082CapabilityV41Migration,
local0083PluginPackageWorkflowTaskAttemptAdmissionsMigration,
local0084CapabilityV42Migration,
local0085PluginPackageWorkflowRunListIndexMigration,
local0086CapabilityV43Migration,
local0087RunAttemptLogRetentionMigration,
local0088CapabilityV44Migration,
local0089PluginPackageAutomationDispositionEventsMigration,
local0090CapabilityV45Migration,
local0091PluginPackageSecretBindingsMigration,
local0092CapabilityV46Migration,
local0093PluginPackageSecretMaterializationGuardMigration,
local0094CapabilityV47Migration,
]),
});
function assertReviewedManifestMatchesDefinition(): void {
const generated = localSqliteMigrationDefinition.migrations.map(
({ id, checksum }) => ({ id, checksum }),
);
if (
localSqliteMigrationManifest.id !== localSqliteMigrationDefinition.id ||
localSqliteMigrationManifest.dialect !==
localSqliteMigrationDefinition.dialect ||
JSON.stringify(localSqliteMigrationManifest.migrations) !==
JSON.stringify(generated)
) {
throw new Error(
'Local SQLite executable migrations do not match the reviewed runtime manifest',
);
}
}
assertReviewedManifestMatchesDefinition();
export async function migrateLocalSqliteDatabase(
client: DatabaseSync,
): Promise<void> {
await runMigrationStream({
stream: localSqliteMigrationDefinition,
store: new LocalSqliteMigrationStreamStore(client),
});
}
export { localSqliteMigrationManifest };
/** Short-lived migration authority; long-lived Profile hosts must not import it. */
export async function migrateLocalSqlitePath(
options: LocalSqliteDatabaseOptions,
): Promise<LocalSqliteMigrationResult> {
assertLocalSqliteOptions(options);
assertLocalSqlitePathBoundary(options.databasePath, true);
const client = openLocalSqliteClient(options, false);
try {
await migrateLocalSqliteDatabase(client);
fs.chmodSync(options.databasePath, 0o600);
return Object.freeze({
readiness: await auditLocalSqliteReadiness(client),
});
} finally {
client.close();
}
}