@smthrs/control 0.0.0-stage → 1.0.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +194 -0
- package/LICENSE +21 -0
- package/README.md +168 -2
- package/dist/cjs/ApprovalAuthority.d.ts +73 -0
- package/dist/cjs/ApprovalAuthority.d.ts.map +1 -0
- package/dist/cjs/ApprovalAuthority.js +62 -0
- package/dist/cjs/ApprovalAuthority.js.map +7 -0
- package/dist/cjs/Cancellation.d.ts +107 -0
- package/dist/cjs/Cancellation.d.ts.map +1 -0
- package/dist/cjs/Cancellation.js +72 -0
- package/dist/cjs/Cancellation.js.map +7 -0
- package/dist/cjs/Channels.d.ts +170 -0
- package/dist/cjs/Channels.d.ts.map +1 -0
- package/dist/cjs/Channels.js +278 -0
- package/dist/cjs/Channels.js.map +7 -0
- package/dist/cjs/Control.d.ts +202 -0
- package/dist/cjs/Control.d.ts.map +1 -0
- package/dist/cjs/Control.js +47 -0
- package/dist/cjs/Control.js.map +7 -0
- package/dist/cjs/ControlClient.d.ts +52 -0
- package/dist/cjs/ControlClient.d.ts.map +1 -0
- package/dist/cjs/ControlClient.js +191 -0
- package/dist/cjs/ControlClient.js.map +7 -0
- package/dist/cjs/ControlError.d.ts +318 -0
- package/dist/cjs/ControlError.d.ts.map +1 -0
- package/dist/cjs/ControlError.js +249 -0
- package/dist/cjs/ControlError.js.map +7 -0
- package/dist/cjs/ControlExecutor.d.ts +372 -0
- package/dist/cjs/ControlExecutor.d.ts.map +1 -0
- package/dist/cjs/ControlExecutor.js +123 -0
- package/dist/cjs/ControlExecutor.js.map +7 -0
- package/dist/cjs/ControlFacts.d.ts +454 -0
- package/dist/cjs/ControlFacts.d.ts.map +1 -0
- package/dist/cjs/ControlFacts.js +261 -0
- package/dist/cjs/ControlFacts.js.map +7 -0
- package/dist/cjs/ControlLive.d.ts +23 -0
- package/dist/cjs/ControlLive.d.ts.map +1 -0
- package/dist/cjs/ControlLive.js +1293 -0
- package/dist/cjs/ControlLive.js.map +7 -0
- package/dist/cjs/ControlRpcs.d.ts +1204 -0
- package/dist/cjs/ControlRpcs.d.ts.map +1 -0
- package/dist/cjs/ControlRpcs.js +247 -0
- package/dist/cjs/ControlRpcs.js.map +7 -0
- package/dist/cjs/ControlRuntime.d.ts +635 -0
- package/dist/cjs/ControlRuntime.d.ts.map +1 -0
- package/dist/cjs/ControlRuntime.js +744 -0
- package/dist/cjs/ControlRuntime.js.map +7 -0
- package/dist/cjs/ControlSchema.d.ts +2642 -0
- package/dist/cjs/ControlSchema.d.ts.map +1 -0
- package/dist/cjs/ControlSchema.js +634 -0
- package/dist/cjs/ControlSchema.js.map +7 -0
- package/dist/cjs/ControlServer.d.ts +51 -0
- package/dist/cjs/ControlServer.d.ts.map +1 -0
- package/dist/cjs/ControlServer.js +121 -0
- package/dist/cjs/ControlServer.js.map +7 -0
- package/dist/cjs/Credential.d.ts +136 -0
- package/dist/cjs/Credential.d.ts.map +1 -0
- package/dist/cjs/Credential.js +168 -0
- package/dist/cjs/Credential.js.map +7 -0
- package/dist/cjs/CredentialCipher.d.ts +90 -0
- package/dist/cjs/CredentialCipher.d.ts.map +1 -0
- package/dist/cjs/CredentialCipher.js +45 -0
- package/dist/cjs/CredentialCipher.js.map +7 -0
- package/dist/cjs/CredentialStore.d.ts +97 -0
- package/dist/cjs/CredentialStore.d.ts.map +1 -0
- package/dist/cjs/CredentialStore.js +81 -0
- package/dist/cjs/CredentialStore.js.map +7 -0
- package/dist/cjs/DispatchReader.d.ts +112 -0
- package/dist/cjs/DispatchReader.d.ts.map +1 -0
- package/dist/cjs/DispatchReader.js +45 -0
- package/dist/cjs/DispatchReader.js.map +7 -0
- package/dist/cjs/Health.d.ts +333 -0
- package/dist/cjs/Health.d.ts.map +1 -0
- package/dist/cjs/Health.js +311 -0
- package/dist/cjs/Health.js.map +7 -0
- package/dist/cjs/JevSessionChecker.d.ts +57 -0
- package/dist/cjs/JevSessionChecker.d.ts.map +1 -0
- package/dist/cjs/JevSessionChecker.js +113 -0
- package/dist/cjs/JevSessionChecker.js.map +7 -0
- package/dist/cjs/Lineage.d.ts +131 -0
- package/dist/cjs/Lineage.d.ts.map +1 -0
- package/dist/cjs/Lineage.js +81 -0
- package/dist/cjs/Lineage.js.map +7 -0
- package/dist/cjs/Migrations.d.ts +34 -0
- package/dist/cjs/Migrations.d.ts.map +1 -0
- package/dist/cjs/Migrations.js +60 -0
- package/dist/cjs/Migrations.js.map +7 -0
- package/dist/cjs/Monitor.d.ts +282 -0
- package/dist/cjs/Monitor.d.ts.map +1 -0
- package/dist/cjs/Monitor.js +283 -0
- package/dist/cjs/Monitor.js.map +7 -0
- package/dist/cjs/ScopedToken.d.ts +193 -0
- package/dist/cjs/ScopedToken.d.ts.map +1 -0
- package/dist/cjs/ScopedToken.js +135 -0
- package/dist/cjs/ScopedToken.js.map +7 -0
- package/dist/cjs/SqlControlRuntime.d.ts +161 -0
- package/dist/cjs/SqlControlRuntime.d.ts.map +1 -0
- package/dist/cjs/SqlControlRuntime.js +1522 -0
- package/dist/cjs/SqlControlRuntime.js.map +7 -0
- package/dist/cjs/SqlCredentialStore.d.ts +43 -0
- package/dist/cjs/SqlCredentialStore.d.ts.map +1 -0
- package/dist/cjs/SqlCredentialStore.js +113 -0
- package/dist/cjs/SqlCredentialStore.js.map +7 -0
- package/dist/cjs/Steering.d.ts +69 -0
- package/dist/cjs/Steering.d.ts.map +1 -0
- package/dist/cjs/Steering.js +49 -0
- package/dist/cjs/Steering.js.map +7 -0
- package/dist/cjs/SystemFlows.d.ts +223 -0
- package/dist/cjs/SystemFlows.d.ts.map +1 -0
- package/dist/cjs/SystemFlows.js +195 -0
- package/dist/cjs/SystemFlows.js.map +7 -0
- package/dist/cjs/WebCryptoCipher.d.ts +49 -0
- package/dist/cjs/WebCryptoCipher.d.ts.map +1 -0
- package/dist/cjs/WebCryptoCipher.js +129 -0
- package/dist/cjs/WebCryptoCipher.js.map +7 -0
- package/dist/cjs/WebhookChannel.d.ts +113 -0
- package/dist/cjs/WebhookChannel.d.ts.map +1 -0
- package/dist/cjs/WebhookChannel.js +98 -0
- package/dist/cjs/WebhookChannel.js.map +7 -0
- package/dist/cjs/index.d.ts +160 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +91 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/internal/MutationBoundary.d.ts +27 -0
- package/dist/cjs/internal/MutationBoundary.d.ts.map +1 -0
- package/dist/cjs/internal/MutationBoundary.js +50 -0
- package/dist/cjs/internal/MutationBoundary.js.map +7 -0
- package/dist/cjs/internal/activeFibers.d.ts +12 -0
- package/dist/cjs/internal/activeFibers.d.ts.map +1 -0
- package/dist/cjs/internal/activeFibers.js +30 -0
- package/dist/cjs/internal/activeFibers.js.map +7 -0
- package/dist/cjs/internal/issues.d.ts +28 -0
- package/dist/cjs/internal/issues.d.ts.map +1 -0
- package/dist/cjs/internal/issues.js +34 -0
- package/dist/cjs/internal/issues.js.map +7 -0
- package/dist/cjs/internal/planning.d.ts +347 -0
- package/dist/cjs/internal/planning.d.ts.map +1 -0
- package/dist/cjs/internal/planning.js +137 -0
- package/dist/cjs/internal/planning.js.map +7 -0
- package/dist/cjs/internal/sqlSchemaErrors.d.ts +18 -0
- package/dist/cjs/internal/sqlSchemaErrors.d.ts.map +1 -0
- package/dist/cjs/internal/sqlSchemaErrors.js +40 -0
- package/dist/cjs/internal/sqlSchemaErrors.js.map +7 -0
- package/dist/cjs/migrations/0001_control_tables.d.ts +18 -0
- package/dist/cjs/migrations/0001_control_tables.d.ts.map +1 -0
- package/dist/cjs/migrations/0001_control_tables.js +115 -0
- package/dist/cjs/migrations/0001_control_tables.js.map +7 -0
- package/dist/cjs/migrations/0002_run_keys.d.ts +15 -0
- package/dist/cjs/migrations/0002_run_keys.d.ts.map +1 -0
- package/dist/cjs/migrations/0002_run_keys.js +44 -0
- package/dist/cjs/migrations/0002_run_keys.js.map +7 -0
- package/dist/cjs/migrations/0003_signal_commands.d.ts +13 -0
- package/dist/cjs/migrations/0003_signal_commands.d.ts.map +1 -0
- package/dist/cjs/migrations/0003_signal_commands.js +50 -0
- package/dist/cjs/migrations/0003_signal_commands.js.map +7 -0
- package/dist/cjs/migrations/0004_approval_decisions.d.ts +13 -0
- package/dist/cjs/migrations/0004_approval_decisions.d.ts.map +1 -0
- package/dist/cjs/migrations/0004_approval_decisions.js +45 -0
- package/dist/cjs/migrations/0004_approval_decisions.js.map +7 -0
- package/dist/cjs/migrations/0005_signal_principals.d.ts +18 -0
- package/dist/cjs/migrations/0005_signal_principals.d.ts.map +1 -0
- package/dist/cjs/migrations/0005_signal_principals.js +45 -0
- package/dist/cjs/migrations/0005_signal_principals.js.map +7 -0
- package/dist/cjs/migrations/0006_run_principals.d.ts +18 -0
- package/dist/cjs/migrations/0006_run_principals.d.ts.map +1 -0
- package/dist/cjs/migrations/0006_run_principals.js +49 -0
- package/dist/cjs/migrations/0006_run_principals.js.map +7 -0
- package/dist/cjs/migrations/0007_resume_consent.d.ts +18 -0
- package/dist/cjs/migrations/0007_resume_consent.d.ts.map +1 -0
- package/dist/cjs/migrations/0007_resume_consent.js +46 -0
- package/dist/cjs/migrations/0007_resume_consent.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/test/TestControl.d.ts +19 -0
- package/dist/cjs/test/TestControl.d.ts.map +1 -0
- package/dist/cjs/test/TestControl.js +62 -0
- package/dist/cjs/test/TestControl.js.map +7 -0
- package/dist/esm/ApprovalAuthority.d.ts +73 -0
- package/dist/esm/ApprovalAuthority.d.ts.map +1 -0
- package/dist/esm/ApprovalAuthority.js +72 -0
- package/dist/esm/ApprovalAuthority.js.map +1 -0
- package/dist/esm/Cancellation.d.ts +107 -0
- package/dist/esm/Cancellation.d.ts.map +1 -0
- package/dist/esm/Cancellation.js +116 -0
- package/dist/esm/Cancellation.js.map +1 -0
- package/dist/esm/Channels.d.ts +170 -0
- package/dist/esm/Channels.d.ts.map +1 -0
- package/dist/esm/Channels.js +312 -0
- package/dist/esm/Channels.js.map +1 -0
- package/dist/esm/Control.d.ts +202 -0
- package/dist/esm/Control.d.ts.map +1 -0
- package/dist/esm/Control.js +42 -0
- package/dist/esm/Control.js.map +1 -0
- package/dist/esm/ControlClient.d.ts +52 -0
- package/dist/esm/ControlClient.d.ts.map +1 -0
- package/dist/esm/ControlClient.js +217 -0
- package/dist/esm/ControlClient.js.map +1 -0
- package/dist/esm/ControlError.d.ts +318 -0
- package/dist/esm/ControlError.d.ts.map +1 -0
- package/dist/esm/ControlError.js +359 -0
- package/dist/esm/ControlError.js.map +1 -0
- package/dist/esm/ControlExecutor.d.ts +372 -0
- package/dist/esm/ControlExecutor.d.ts.map +1 -0
- package/dist/esm/ControlExecutor.js +212 -0
- package/dist/esm/ControlExecutor.js.map +1 -0
- package/dist/esm/ControlFacts.d.ts +454 -0
- package/dist/esm/ControlFacts.d.ts.map +1 -0
- package/dist/esm/ControlFacts.js +324 -0
- package/dist/esm/ControlFacts.js.map +1 -0
- package/dist/esm/ControlLive.d.ts +23 -0
- package/dist/esm/ControlLive.d.ts.map +1 -0
- package/dist/esm/ControlLive.js +1589 -0
- package/dist/esm/ControlLive.js.map +1 -0
- package/dist/esm/ControlRpcs.d.ts +1204 -0
- package/dist/esm/ControlRpcs.d.ts.map +1 -0
- package/dist/esm/ControlRpcs.js +299 -0
- package/dist/esm/ControlRpcs.js.map +1 -0
- package/dist/esm/ControlRuntime.d.ts +635 -0
- package/dist/esm/ControlRuntime.d.ts.map +1 -0
- package/dist/esm/ControlRuntime.js +808 -0
- package/dist/esm/ControlRuntime.js.map +1 -0
- package/dist/esm/ControlSchema.d.ts +2642 -0
- package/dist/esm/ControlSchema.d.ts.map +1 -0
- package/dist/esm/ControlSchema.js +1030 -0
- package/dist/esm/ControlSchema.js.map +1 -0
- package/dist/esm/ControlServer.d.ts +51 -0
- package/dist/esm/ControlServer.d.ts.map +1 -0
- package/dist/esm/ControlServer.js +145 -0
- package/dist/esm/ControlServer.js.map +1 -0
- package/dist/esm/Credential.d.ts +136 -0
- package/dist/esm/Credential.d.ts.map +1 -0
- package/dist/esm/Credential.js +190 -0
- package/dist/esm/Credential.js.map +1 -0
- package/dist/esm/CredentialCipher.d.ts +90 -0
- package/dist/esm/CredentialCipher.d.ts.map +1 -0
- package/dist/esm/CredentialCipher.js +56 -0
- package/dist/esm/CredentialCipher.js.map +1 -0
- package/dist/esm/CredentialStore.d.ts +97 -0
- package/dist/esm/CredentialStore.d.ts.map +1 -0
- package/dist/esm/CredentialStore.js +101 -0
- package/dist/esm/CredentialStore.js.map +1 -0
- package/dist/esm/DispatchReader.d.ts +112 -0
- package/dist/esm/DispatchReader.d.ts.map +1 -0
- package/dist/esm/DispatchReader.js +76 -0
- package/dist/esm/DispatchReader.js.map +1 -0
- package/dist/esm/Health.d.ts +333 -0
- package/dist/esm/Health.d.ts.map +1 -0
- package/dist/esm/Health.js +400 -0
- package/dist/esm/Health.js.map +1 -0
- package/dist/esm/JevSessionChecker.d.ts +57 -0
- package/dist/esm/JevSessionChecker.d.ts.map +1 -0
- package/dist/esm/JevSessionChecker.js +108 -0
- package/dist/esm/JevSessionChecker.js.map +1 -0
- package/dist/esm/Lineage.d.ts +131 -0
- package/dist/esm/Lineage.d.ts.map +1 -0
- package/dist/esm/Lineage.js +174 -0
- package/dist/esm/Lineage.js.map +1 -0
- package/dist/esm/Migrations.d.ts +34 -0
- package/dist/esm/Migrations.d.ts.map +1 -0
- package/dist/esm/Migrations.js +53 -0
- package/dist/esm/Migrations.js.map +1 -0
- package/dist/esm/Monitor.d.ts +282 -0
- package/dist/esm/Monitor.d.ts.map +1 -0
- package/dist/esm/Monitor.js +415 -0
- package/dist/esm/Monitor.js.map +1 -0
- package/dist/esm/ScopedToken.d.ts +193 -0
- package/dist/esm/ScopedToken.d.ts.map +1 -0
- package/dist/esm/ScopedToken.js +224 -0
- package/dist/esm/ScopedToken.js.map +1 -0
- package/dist/esm/SqlControlRuntime.d.ts +161 -0
- package/dist/esm/SqlControlRuntime.d.ts.map +1 -0
- package/dist/esm/SqlControlRuntime.js +1756 -0
- package/dist/esm/SqlControlRuntime.js.map +1 -0
- package/dist/esm/SqlCredentialStore.d.ts +43 -0
- package/dist/esm/SqlCredentialStore.d.ts.map +1 -0
- package/dist/esm/SqlCredentialStore.js +97 -0
- package/dist/esm/SqlCredentialStore.js.map +1 -0
- package/dist/esm/Steering.d.ts +69 -0
- package/dist/esm/Steering.d.ts.map +1 -0
- package/dist/esm/Steering.js +89 -0
- package/dist/esm/Steering.js.map +1 -0
- package/dist/esm/SystemFlows.d.ts +223 -0
- package/dist/esm/SystemFlows.d.ts.map +1 -0
- package/dist/esm/SystemFlows.js +198 -0
- package/dist/esm/SystemFlows.js.map +1 -0
- package/dist/esm/WebCryptoCipher.d.ts +49 -0
- package/dist/esm/WebCryptoCipher.d.ts.map +1 -0
- package/dist/esm/WebCryptoCipher.js +123 -0
- package/dist/esm/WebCryptoCipher.js.map +1 -0
- package/dist/esm/WebhookChannel.d.ts +113 -0
- package/dist/esm/WebhookChannel.d.ts.map +1 -0
- package/dist/esm/WebhookChannel.js +109 -0
- package/dist/esm/WebhookChannel.js.map +1 -0
- package/dist/esm/index.d.ts +160 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +160 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/MutationBoundary.d.ts +27 -0
- package/dist/esm/internal/MutationBoundary.d.ts.map +1 -0
- package/dist/esm/internal/MutationBoundary.js +40 -0
- package/dist/esm/internal/MutationBoundary.js.map +1 -0
- package/dist/esm/internal/activeFibers.d.ts +12 -0
- package/dist/esm/internal/activeFibers.d.ts.map +1 -0
- package/dist/esm/internal/activeFibers.js +17 -0
- package/dist/esm/internal/activeFibers.js.map +1 -0
- package/dist/esm/internal/issues.d.ts +28 -0
- package/dist/esm/internal/issues.d.ts.map +1 -0
- package/dist/esm/internal/issues.js +35 -0
- package/dist/esm/internal/issues.js.map +1 -0
- package/dist/esm/internal/planning.d.ts +347 -0
- package/dist/esm/internal/planning.d.ts.map +1 -0
- package/dist/esm/internal/planning.js +199 -0
- package/dist/esm/internal/planning.js.map +1 -0
- package/dist/esm/internal/sqlSchemaErrors.d.ts +18 -0
- package/dist/esm/internal/sqlSchemaErrors.d.ts.map +1 -0
- package/dist/esm/internal/sqlSchemaErrors.js +38 -0
- package/dist/esm/internal/sqlSchemaErrors.js.map +1 -0
- package/dist/esm/migrations/0001_control_tables.d.ts +18 -0
- package/dist/esm/migrations/0001_control_tables.d.ts.map +1 -0
- package/dist/esm/migrations/0001_control_tables.js +96 -0
- package/dist/esm/migrations/0001_control_tables.js.map +1 -0
- package/dist/esm/migrations/0002_run_keys.d.ts +15 -0
- package/dist/esm/migrations/0002_run_keys.d.ts.map +1 -0
- package/dist/esm/migrations/0002_run_keys.js +22 -0
- package/dist/esm/migrations/0002_run_keys.js.map +1 -0
- package/dist/esm/migrations/0003_signal_commands.d.ts +13 -0
- package/dist/esm/migrations/0003_signal_commands.d.ts.map +1 -0
- package/dist/esm/migrations/0003_signal_commands.js +26 -0
- package/dist/esm/migrations/0003_signal_commands.js.map +1 -0
- package/dist/esm/migrations/0004_approval_decisions.d.ts +13 -0
- package/dist/esm/migrations/0004_approval_decisions.d.ts.map +1 -0
- package/dist/esm/migrations/0004_approval_decisions.js +25 -0
- package/dist/esm/migrations/0004_approval_decisions.js.map +1 -0
- package/dist/esm/migrations/0005_signal_principals.d.ts +18 -0
- package/dist/esm/migrations/0005_signal_principals.d.ts.map +1 -0
- package/dist/esm/migrations/0005_signal_principals.js +27 -0
- package/dist/esm/migrations/0005_signal_principals.js.map +1 -0
- package/dist/esm/migrations/0006_run_principals.d.ts +18 -0
- package/dist/esm/migrations/0006_run_principals.d.ts.map +1 -0
- package/dist/esm/migrations/0006_run_principals.js +30 -0
- package/dist/esm/migrations/0006_run_principals.js.map +1 -0
- package/dist/esm/migrations/0007_resume_consent.d.ts +18 -0
- package/dist/esm/migrations/0007_resume_consent.d.ts.map +1 -0
- package/dist/esm/migrations/0007_resume_consent.js +27 -0
- package/dist/esm/migrations/0007_resume_consent.js.map +1 -0
- package/dist/esm/test/TestControl.d.ts +19 -0
- package/dist/esm/test/TestControl.d.ts.map +1 -0
- package/dist/esm/test/TestControl.js +30 -0
- package/dist/esm/test/TestControl.js.map +1 -0
- package/docs/README.md +189 -0
- package/docs/api.md +982 -0
- package/docs/concepts/authority.md +109 -0
- package/docs/concepts/cancellation.md +129 -0
- package/docs/concepts/lineage.md +132 -0
- package/docs/concepts/ownership.md +139 -0
- package/docs/concepts/projections.md +203 -0
- package/docs/concepts/receipts.md +128 -0
- package/docs/guides/approvals.md +284 -0
- package/docs/guides/cancel-and-resume.md +162 -0
- package/docs/guides/durable-storage.md +147 -0
- package/docs/guides/implement-an-executor.md +173 -0
- package/docs/guides/ingest-a-webhook.md +177 -0
- package/docs/guides/list-runs.md +160 -0
- package/docs/guides/monitor-runs.md +176 -0
- package/docs/guides/observe-health.md +147 -0
- package/docs/guides/postgres-tests.md +7 -0
- package/docs/guides/serve-over-rpc.md +220 -0
- package/docs/guides/signal-a-run.md +53 -0
- package/docs/guides/steer-a-run.md +138 -0
- package/docs/guides/store-credentials.md +164 -0
- package/docs/guides/testing.md +139 -0
- package/docs/guides/watch-a-run.md +154 -0
- package/docs/installation.md +106 -0
- package/docs/quickstart.md +163 -0
- package/docs/troubleshooting.md +208 -0
- package/package.json +405 -3
- package/src/ApprovalAuthority.ts +114 -0
- package/src/Cancellation.ts +172 -0
- package/src/Channels.ts +493 -0
- package/src/Control.ts +337 -0
- package/src/ControlClient.ts +319 -0
- package/src/ControlError.ts +378 -0
- package/src/ControlExecutor.ts +490 -0
- package/src/ControlFacts.ts +383 -0
- package/src/ControlLive.ts +2127 -0
- package/src/ControlRpcs.ts +443 -0
- package/src/ControlRuntime.ts +1601 -0
- package/src/ControlSchema.ts +1380 -0
- package/src/ControlServer.ts +182 -0
- package/src/Credential.ts +310 -0
- package/src/CredentialCipher.ts +110 -0
- package/src/CredentialStore.ts +152 -0
- package/src/DispatchReader.ts +122 -0
- package/src/Health.ts +591 -0
- package/src/JevSessionChecker.ts +127 -0
- package/src/Lineage.ts +203 -0
- package/src/Migrations.ts +56 -0
- package/src/Monitor.ts +600 -0
- package/src/ScopedToken.ts +306 -0
- package/src/SqlControlRuntime.ts +2478 -0
- package/src/SqlCredentialStore.ts +148 -0
- package/src/Steering.ts +96 -0
- package/src/SystemFlows.ts +225 -0
- package/src/WebCryptoCipher.ts +169 -0
- package/src/WebhookChannel.ts +166 -0
- package/src/index.ts +188 -0
- package/src/internal/MutationBoundary.ts +46 -0
- package/src/internal/activeFibers.ts +22 -0
- package/src/internal/issues.ts +40 -0
- package/src/internal/planning.ts +262 -0
- package/src/internal/sqlSchemaErrors.ts +37 -0
- package/src/migrations/0001_control_tables.ts +99 -0
- package/src/migrations/0002_run_keys.ts +23 -0
- package/src/migrations/0003_signal_commands.ts +27 -0
- package/src/migrations/0004_approval_decisions.ts +25 -0
- package/src/migrations/0005_signal_principals.ts +27 -0
- package/src/migrations/0006_run_principals.ts +31 -0
- package/src/migrations/0007_resume_consent.ts +28 -0
- package/src/test/TestControl.ts +47 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var planning_exports = {};
|
|
30
|
+
__export(planning_exports, {
|
|
31
|
+
accepted: () => accepted,
|
|
32
|
+
adoptedCode: () => adoptedCode,
|
|
33
|
+
alreadyApplied: () => alreadyApplied,
|
|
34
|
+
budgeted: () => budgeted,
|
|
35
|
+
canonical: () => canonical,
|
|
36
|
+
codeDriftOf: () => codeDriftOf,
|
|
37
|
+
digest: () => digest,
|
|
38
|
+
emptyEnvelope: () => emptyEnvelope,
|
|
39
|
+
mutationKey: () => mutationKey,
|
|
40
|
+
planCard: () => planCard,
|
|
41
|
+
planFingerprint: () => planFingerprint,
|
|
42
|
+
sameEnvelope: () => sameEnvelope
|
|
43
|
+
});
|
|
44
|
+
module.exports = __toCommonJS(planning_exports);
|
|
45
|
+
var import_canonical = require("@smthrs/canonical");
|
|
46
|
+
var import_crypto = require("@smthrs/crypto");
|
|
47
|
+
var Sha256Digest = __toESM(require("@smthrs/crypto/Sha256"), 1);
|
|
48
|
+
var import_effect = require("effect");
|
|
49
|
+
var import_ControlError = require("../ControlError.js");
|
|
50
|
+
const codeDriftOf = (run, flow, engineVersion) => {
|
|
51
|
+
const flowDrift = run.executionDigest !== void 0 && flow?.executionDigest !== run.executionDigest;
|
|
52
|
+
const engineDrift = run.engineVersion !== void 0 && engineVersion !== void 0 && engineVersion !== run.engineVersion;
|
|
53
|
+
if (!flowDrift && !engineDrift) return void 0;
|
|
54
|
+
return new import_ControlError.CodeDrift({
|
|
55
|
+
runId: run.runId,
|
|
56
|
+
flowId: run.flowId,
|
|
57
|
+
...flowDrift ? { recorded: run.executionDigest } : {},
|
|
58
|
+
...flowDrift && flow?.executionDigest !== void 0 ? { current: flow.executionDigest } : {},
|
|
59
|
+
...engineDrift ? { recordedEngine: run.engineVersion, currentEngine: engineVersion } : {}
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
const adoptedCode = (run, flow, engineVersion) => ({
|
|
63
|
+
executionDigest: flow?.executionDigest,
|
|
64
|
+
engineVersion: engineVersion ?? run.engineVersion
|
|
65
|
+
});
|
|
66
|
+
const emptyEnvelope = {
|
|
67
|
+
capabilities: [],
|
|
68
|
+
flows: [],
|
|
69
|
+
budget: {}
|
|
70
|
+
};
|
|
71
|
+
const canonical = (value) => (0, import_canonical.canonicalize)(value);
|
|
72
|
+
const mutationKey = (operation, key, principal) => `${operation}:actor:${Sha256Digest.digestSync(canonical({ id: principal.id, kind: principal.kind }))}:${key}`;
|
|
73
|
+
const digest = (value) => import_effect.Schema.decodeUnknownEffect(import_crypto.Sha256)(canonical(value)).pipe(import_effect.Effect.orDie);
|
|
74
|
+
const sameEnvelope = (left, right) => canonical(left) === canonical(right);
|
|
75
|
+
const budgeted = (envelope, budget) => budget === void 0 ? envelope : { ...envelope, budget: { ...envelope.budget, ...budget } };
|
|
76
|
+
const planFingerprint = (input) => canonical({
|
|
77
|
+
flowId: input.flowId,
|
|
78
|
+
input: input.input,
|
|
79
|
+
...input.budget === void 0 ? {} : { budget: input.budget }
|
|
80
|
+
});
|
|
81
|
+
const accepted = (receiptId, runId) => {
|
|
82
|
+
return runId === void 0 ? { _tag: "Accepted", receiptId } : { _tag: "Accepted", receiptId, runId };
|
|
83
|
+
};
|
|
84
|
+
const alreadyApplied = (key, receipt) => {
|
|
85
|
+
const receiptId = receipt._tag === "Accepted" || receipt._tag === "AlreadyApplied" ? receipt.receiptId : key;
|
|
86
|
+
const runId = receipt._tag === "Accepted" || receipt._tag === "AlreadyApplied" || receipt._tag === "Terminal" ? receipt.runId : void 0;
|
|
87
|
+
const input = receipt._tag === "Accepted" || receipt._tag === "AlreadyApplied" ? {
|
|
88
|
+
...receipt.inputConsumed === void 0 ? {} : { inputConsumed: receipt.inputConsumed },
|
|
89
|
+
...receipt.inputBody === void 0 ? {} : { inputBody: receipt.inputBody }
|
|
90
|
+
} : {};
|
|
91
|
+
return runId === void 0 ? { _tag: "AlreadyApplied", receiptId, ...input } : { _tag: "AlreadyApplied", receiptId, runId, ...input };
|
|
92
|
+
};
|
|
93
|
+
const planCard = (source) => import_effect.Effect.gen(function* () {
|
|
94
|
+
const plan = source.handoff?.plan;
|
|
95
|
+
const nodes = plan === void 0 ? [] : plan.nodes.map((node) => ({
|
|
96
|
+
...node,
|
|
97
|
+
status: source.handoff?.statuses?.[node.id] ?? "run"
|
|
98
|
+
}));
|
|
99
|
+
const planDigest = yield* digest({
|
|
100
|
+
flowId: source.flowId,
|
|
101
|
+
input: source.decodedInput,
|
|
102
|
+
envelope: source.envelope,
|
|
103
|
+
deployClass: source.deployClass,
|
|
104
|
+
...source.executionDigest === void 0 ? {} : { executionDigest: source.executionDigest },
|
|
105
|
+
// The persisted plan digest covers keys, edges, effects, conflicts,
|
|
106
|
+
// priorities, and generations. Hashing only node keys loses executable
|
|
107
|
+
// graph changes whose content keys legitimately stay stable.
|
|
108
|
+
persistedPlan: plan?.digest ?? null
|
|
109
|
+
});
|
|
110
|
+
const target = {
|
|
111
|
+
_tag: "Plan",
|
|
112
|
+
planId: source.planId,
|
|
113
|
+
digest: planDigest,
|
|
114
|
+
envelope: source.envelope
|
|
115
|
+
};
|
|
116
|
+
return {
|
|
117
|
+
planId: source.planId,
|
|
118
|
+
flowId: source.flowId,
|
|
119
|
+
digest: planDigest,
|
|
120
|
+
inputSummary: canonical(source.decodedInput),
|
|
121
|
+
envelope: source.envelope,
|
|
122
|
+
deployClass: source.deployClass,
|
|
123
|
+
...source.executionDigest === void 0 ? {} : { executionDigest: source.executionDigest },
|
|
124
|
+
...plan === void 0 ? {} : { plan },
|
|
125
|
+
nodes,
|
|
126
|
+
// Outside `digest` above on purpose: the edges are how a reader draws
|
|
127
|
+
// the plan, not what the plan will do, so gaining them must not
|
|
128
|
+
// invalidate an approval taken before the host reported them.
|
|
129
|
+
...source.handoff?.graph === void 0 ? {} : { graph: source.handoff.graph },
|
|
130
|
+
approval: {
|
|
131
|
+
target,
|
|
132
|
+
scope: "run",
|
|
133
|
+
idempotencyKey: source.idempotencyKey ?? `approve:${source.planId}`
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=planning.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/internal/planning.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Plan construction shared by every `ControlRuntime` implementation.\n *\n * The plan digest is what an approval is bound to, so the memory runtime and\n * the durable runtime must compute it the same way or an approval taken on one\n * would not validate on the other. Keeping the construction here is what makes\n * that a compile-time fact rather than a convention.\n *\n * @since 0.1.0\n */\n\nimport { canonicalize } from \"@smthrs/canonical\"\nimport { Sha256 } from \"@smthrs/crypto\"\nimport * as Sha256Digest from \"@smthrs/crypto/Sha256\"\nimport type * as PersistedPlan from \"@smthrs/plan/Plan\"\nimport { Effect, Schema } from \"effect\"\nimport type { ApprovalTarget, PlanInput } from \"../Control.ts\"\nimport { CodeDrift } from \"../ControlError.ts\"\nimport type {\n Envelope,\n FlowId,\n IdempotencyKey,\n PlanCard,\n PlanGraph,\n PlanNode,\n Principal,\n Receipt,\n RunId,\n RunSummary\n} from \"../ControlSchema.ts\"\n\n/**\n * The drift between the code a run recorded and the code that would resume\n * it, or `undefined` when there is none. A run that recorded no digest (a flow\n * without one, or a row older than the field) is not checked for flow drift,\n * and one that recorded no engine version is not checked for engine drift.\n *\n * @since 1.0.0\n * @private\n */\nexport const codeDriftOf = (\n run: RunSummary,\n flow: { readonly executionDigest?: string | undefined } | undefined,\n engineVersion: string | undefined\n): CodeDrift | undefined => {\n const flowDrift = run.executionDigest !== undefined && flow?.executionDigest !== run.executionDigest\n const engineDrift = run.engineVersion !== undefined && engineVersion !== undefined &&\n engineVersion !== run.engineVersion\n if (!flowDrift && !engineDrift) return undefined\n return new CodeDrift({\n runId: run.runId,\n flowId: run.flowId,\n ...(flowDrift ? { recorded: run.executionDigest } : {}),\n ...(flowDrift && flow?.executionDigest !== undefined ? { current: flow.executionDigest } : {}),\n ...(engineDrift ? { recordedEngine: run.engineVersion, currentEngine: engineVersion } : {})\n })\n}\n\n/**\n * The code identity a resume the operator allowed to drift records on the run,\n * so later checks compare against the code it now runs.\n *\n * @since 1.0.0\n * @private\n */\nexport const adoptedCode = (\n run: RunSummary,\n flow: { readonly executionDigest?: string | undefined } | undefined,\n engineVersion: string | undefined\n): Pick<RunSummary, \"executionDigest\" | \"engineVersion\"> => ({\n executionDigest: flow?.executionDigest,\n engineVersion: engineVersion ?? run.engineVersion\n})\n\n/**\n * The envelope a flow with no declared capabilities carries.\n *\n * @since 0.1.0\n * @private\n */\nexport const emptyEnvelope: Envelope = {\n capabilities: [],\n flows: [],\n budget: {}\n}\n\n/**\n * Canonical bytes for a value.\n * Throws on a non-serializable value; every caller either wraps it in\n * `Effect.try` or has already validated the value.\n *\n * @since 0.1.0\n * @private\n */\nexport const canonical = (value: unknown): string => canonicalize(value)\n\n/**\n * The durable key a caller's idempotency key is stored under.\n *\n * Namespaced by the effective actor: the submitted principal, or the runtime's\n * configured fallback when the caller named none. The principal's clock is\n * omitted, so an equal retry lands on the same key.\n *\n * @since 0.1.0\n * @private\n */\nexport const mutationKey = (\n operation: string,\n key: IdempotencyKey,\n principal: Pick<Principal, \"id\" | \"kind\">\n): string =>\n `${operation}:actor:${Sha256Digest.digestSync(canonical({ id: principal.id, kind: principal.kind }))}:${key}`\n\n/**\n * The content digest of a value's canonical bytes.\n *\n * @since 0.1.0\n * @private\n */\nexport const digest = (value: unknown) => Schema.decodeUnknownEffect(Sha256)(canonical(value)).pipe(Effect.orDie)\n\n/**\n * Envelope equality by canonical bytes, not by reference or key order.\n *\n * @since 0.1.0\n * @private\n */\nexport const sameEnvelope = (left: Envelope, right: Envelope): boolean => canonical(left) === canonical(right)\n\n/**\n * A flow's envelope with a planner's budget fields laid over its declared ones.\n *\n * @since 1.0.0-rc.1\n * @private\n */\nexport const budgeted = (envelope: Envelope, budget: Envelope[\"budget\"] | undefined): Envelope =>\n budget === undefined ? envelope : { ...envelope, budget: { ...envelope.budget, ...budget } }\n\n/**\n * What one plan request asks for, for idempotency: a key replayed with another\n * budget is another plan.\n *\n * @since 1.0.0-rc.1\n * @private\n */\nexport const planFingerprint = (input: PlanInput): string =>\n canonical({\n flowId: input.flowId,\n input: input.input,\n ...(input.budget === undefined ? {} : { budget: input.budget })\n })\n\n/**\n * An accepted receipt, carrying a run id when one exists.\n *\n * @since 0.1.0\n * @private\n */\nexport const accepted = (receiptId: string, runId?: RunId): Receipt => {\n /* v8 ignore next 3 -- both runtimes call this from `launch`, which has the run it just started; the parameter stays optional for the receipt's shape rather than for a caller */\n return runId === undefined\n ? { _tag: \"Accepted\", receiptId }\n : { _tag: \"Accepted\", receiptId, runId }\n}\n\n/**\n * The receipt a replayed mutation returns, derived from the recorded one.\n *\n * @since 0.1.0\n * @private\n */\nexport const alreadyApplied = (key: IdempotencyKey, receipt: Receipt): Receipt => {\n const receiptId = receipt._tag === \"Accepted\" || receipt._tag === \"AlreadyApplied\" ? receipt.receiptId : key\n const runId = receipt._tag === \"Accepted\" || receipt._tag === \"AlreadyApplied\" || receipt._tag === \"Terminal\"\n ? receipt.runId\n : undefined\n const input = receipt._tag === \"Accepted\" || receipt._tag === \"AlreadyApplied\"\n ? {\n ...(receipt.inputConsumed === undefined ? {} : { inputConsumed: receipt.inputConsumed }),\n ...(receipt.inputBody === undefined ? {} : { inputBody: receipt.inputBody })\n }\n : {}\n return runId === undefined\n ? { _tag: \"AlreadyApplied\", receiptId, ...input }\n : { _tag: \"AlreadyApplied\", receiptId, runId, ...input }\n}\n\n/**\n * The plan inputs a card is derived from.\n *\n * @since 0.1.0\n * @private\n */\nexport interface PlanSource {\n readonly planId: string\n readonly flowId: FlowId\n readonly decodedInput: unknown\n readonly envelope: Envelope\n readonly deployClass: boolean\n readonly executionDigest?: string | undefined\n /** The persisted plan value and cache verdicts produced by the host. */\n readonly handoff?: {\n readonly plan: PersistedPlan.Plan\n readonly statuses?: Readonly<Record<string, PlanNode[\"status\"]>> | undefined\n readonly graph?: PlanGraph | undefined\n } | undefined\n readonly idempotencyKey?: IdempotencyKey | undefined\n}\n\n/**\n * Builds the immutable plan card and the approval target bound to its digest.\n *\n * @since 0.1.0\n * @private\n */\nexport const planCard = (source: PlanSource) =>\n Effect.gen(function*() {\n const plan = source.handoff?.plan\n const nodes: ReadonlyArray<PlanNode> = plan === undefined\n ? []\n : plan.nodes.map((node) => ({\n ...node,\n status: source.handoff?.statuses?.[node.id] ?? \"run\"\n }))\n const planDigest = yield* digest({\n flowId: source.flowId,\n input: source.decodedInput,\n envelope: source.envelope,\n deployClass: source.deployClass,\n ...(source.executionDigest === undefined ? {} : { executionDigest: source.executionDigest }),\n // The persisted plan digest covers keys, edges, effects, conflicts,\n // priorities, and generations. Hashing only node keys loses executable\n // graph changes whose content keys legitimately stay stable.\n persistedPlan: plan?.digest ?? null\n })\n const target: ApprovalTarget = {\n _tag: \"Plan\",\n planId: source.planId,\n digest: planDigest,\n envelope: source.envelope\n }\n return {\n planId: source.planId,\n flowId: source.flowId,\n digest: planDigest,\n inputSummary: canonical(source.decodedInput),\n envelope: source.envelope,\n deployClass: source.deployClass,\n ...(source.executionDigest === undefined ? {} : { executionDigest: source.executionDigest }),\n ...(plan === undefined ? {} : { plan }),\n nodes,\n // Outside `digest` above on purpose: the edges are how a reader draws\n // the plan, not what the plan will do, so gaining them must not\n // invalidate an approval taken before the host reported them.\n ...(source.handoff?.graph === undefined ? {} : { graph: source.handoff.graph }),\n approval: {\n target,\n scope: \"run\" as const,\n idempotencyKey: source.idempotencyKey ?? `approve:${source.planId}`\n }\n } satisfies PlanCard\n })\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exact optional-schema failure classification across SQL driver wrappers.
|
|
3
|
+
* @since 1.0.0
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Driver messages stay separate so wrapper context cannot identify a different failure.
|
|
7
|
+
* The depth bound terminates cyclic driver causes.
|
|
8
|
+
* @since 1.0.0
|
|
9
|
+
* @private
|
|
10
|
+
*/
|
|
11
|
+
export declare const causeMessages: (value: unknown, depth?: number) => ReadonlyArray<string>;
|
|
12
|
+
/**
|
|
13
|
+
* Only the relation named by a driver's missing-table diagnostic may be absent.
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
* @private
|
|
16
|
+
*/
|
|
17
|
+
export declare const missingTable: (table: string) => (cause: unknown) => boolean;
|
|
18
|
+
//# sourceMappingURL=sqlSchemaErrors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlSchemaErrors.d.ts","sourceRoot":"","sources":["../../../src/internal/sqlSchemaErrors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,EAAE,cAAS,KAAG,aAAa,CAAC,MAAM,CAS7E,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,MAAM,OAAO,OAAO,KAAG,OAS7D,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var sqlSchemaErrors_exports = {};
|
|
20
|
+
__export(sqlSchemaErrors_exports, {
|
|
21
|
+
causeMessages: () => causeMessages,
|
|
22
|
+
missingTable: () => missingTable
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(sqlSchemaErrors_exports);
|
|
25
|
+
const causeMessages = (value, depth = 4) => {
|
|
26
|
+
if (typeof value === "string") return [value];
|
|
27
|
+
if (depth === 0 || typeof value !== "object" || value === null) return [];
|
|
28
|
+
const fields = value;
|
|
29
|
+
return [
|
|
30
|
+
...typeof fields.message === "string" ? [fields.message] : [],
|
|
31
|
+
...causeMessages(fields.reason, depth - 1),
|
|
32
|
+
...causeMessages(fields.cause, depth - 1)
|
|
33
|
+
];
|
|
34
|
+
};
|
|
35
|
+
const missingTable = (table) => (cause) => causeMessages(cause).some((message) => {
|
|
36
|
+
const relation = /^no such table: (\S+)$/.exec(message)?.[1] ?? /^relation "([^"]+)" does not exist$/.exec(message)?.[1];
|
|
37
|
+
if (relation !== void 0) return relation === table;
|
|
38
|
+
return /^Table '[^.']+\.([^']+)' doesn't exist$/.exec(message)?.[1] === table;
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=sqlSchemaErrors.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/internal/sqlSchemaErrors.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Exact optional-schema failure classification across SQL driver wrappers.\n * @since 1.0.0\n */\n\n/**\n * Driver messages stay separate so wrapper context cannot identify a different failure.\n * The depth bound terminates cyclic driver causes.\n * @since 1.0.0\n * @private\n */\nexport const causeMessages = (value: unknown, depth = 4): ReadonlyArray<string> => {\n if (typeof value === \"string\") return [value]\n if (depth === 0 || typeof value !== \"object\" || value === null) return []\n const fields = value as { readonly message?: unknown; readonly cause?: unknown; readonly reason?: unknown }\n return [\n ...(typeof fields.message === \"string\" ? [fields.message] : []),\n ...causeMessages(fields.reason, depth - 1),\n ...causeMessages(fields.cause, depth - 1)\n ]\n}\n\n/**\n * Only the relation named by a driver's missing-table diagnostic may be absent.\n * @since 1.0.0\n * @private\n */\nexport const missingTable = (table: string) => (cause: unknown): boolean =>\n causeMessages(cause).some((message) => {\n const relation = /^no such table: (\\S+)$/.exec(message)?.[1]\n ?? /^relation \"([^\"]+)\" does not exist$/.exec(message)?.[1]\n // These queries name unqualified relations. A qualified name can refer\n // to a different schema's dependency, so do not discard its qualifier.\n if (relation !== undefined) return relation === table\n // MySQL always names the database in its table diagnostic.\n return /^Table '[^.']+\\.([^']+)' doesn't exist$/.exec(message)?.[1] === table\n })\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWO,MAAM,gBAAgB,CAAC,OAAgB,QAAQ,MAA6B;AACjF,MAAI,OAAO,UAAU,SAAU,QAAO,CAAC,KAAK;AAC5C,MAAI,UAAU,KAAK,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO,CAAC;AACxE,QAAM,SAAS;AACf,SAAO;AAAA,IACL,GAAI,OAAO,OAAO,YAAY,WAAW,CAAC,OAAO,OAAO,IAAI,CAAC;AAAA,IAC7D,GAAG,cAAc,OAAO,QAAQ,QAAQ,CAAC;AAAA,IACzC,GAAG,cAAc,OAAO,OAAO,QAAQ,CAAC;AAAA,EAC1C;AACF;AAOO,MAAM,eAAe,CAAC,UAAkB,CAAC,UAC9C,cAAc,KAAK,EAAE,KAAK,CAAC,YAAY;AACrC,QAAM,WAAW,yBAAyB,KAAK,OAAO,IAAI,CAAC,KACtD,sCAAsC,KAAK,OAAO,IAAI,CAAC;AAG5D,MAAI,aAAa,OAAW,QAAO,aAAa;AAEhD,SAAO,0CAA0C,KAAK,OAAO,IAAI,CAAC,MAAM;AAC1E,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initial durable control-plane schema.
|
|
3
|
+
*
|
|
4
|
+
* @since 0.1.0
|
|
5
|
+
*/
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as SqlClient from "effect/unstable/sql/SqlClient";
|
|
8
|
+
/**
|
|
9
|
+
* Creates every table owned by `@smthrs/control`.
|
|
10
|
+
*
|
|
11
|
+
* `IF NOT EXISTS` lets the recorded migration and each standalone adapter's
|
|
12
|
+
* bootstrap share this exact schema without competing over table creation.
|
|
13
|
+
*
|
|
14
|
+
* @category migrations
|
|
15
|
+
* @since 0.1.0
|
|
16
|
+
*/
|
|
17
|
+
export declare const initial: Effect.Effect<void, unknown, SqlClient.SqlClient>;
|
|
18
|
+
//# sourceMappingURL=0001_control_tables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"0001_control_tables.d.ts","sourceRoot":"","sources":["../../../src/migrations/0001_control_tables.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AA4E1D;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAKpE,CAAA"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var control_tables_exports = {};
|
|
30
|
+
__export(control_tables_exports, {
|
|
31
|
+
initial: () => initial
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(control_tables_exports);
|
|
34
|
+
var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
|
|
35
|
+
var Effect = __toESM(require("effect/Effect"), 1);
|
|
36
|
+
var SqlClient = __toESM(require("effect/unstable/sql/SqlClient"), 1);
|
|
37
|
+
const statements = (sql) => [
|
|
38
|
+
sql`CREATE TABLE IF NOT EXISTS control_plans (
|
|
39
|
+
${Dialect.rowId(sql)}
|
|
40
|
+
plan_id TEXT PRIMARY KEY,
|
|
41
|
+
card_json TEXT NOT NULL,
|
|
42
|
+
decoded_input_json TEXT NOT NULL,
|
|
43
|
+
decision TEXT NOT NULL
|
|
44
|
+
)`,
|
|
45
|
+
sql`CREATE TABLE IF NOT EXISTS control_plan_keys (
|
|
46
|
+
idempotency_key TEXT PRIMARY KEY,
|
|
47
|
+
fingerprint TEXT NOT NULL,
|
|
48
|
+
plan_id TEXT NOT NULL
|
|
49
|
+
)`,
|
|
50
|
+
sql`CREATE TABLE IF NOT EXISTS control_tokens (
|
|
51
|
+
target_tag TEXT NOT NULL,
|
|
52
|
+
run_id TEXT NOT NULL,
|
|
53
|
+
target_id TEXT NOT NULL,
|
|
54
|
+
token_id TEXT NOT NULL,
|
|
55
|
+
target_json TEXT NOT NULL,
|
|
56
|
+
resolved ${Dialect.integer(sql)} NOT NULL,
|
|
57
|
+
decision_principal_json TEXT,
|
|
58
|
+
PRIMARY KEY (target_tag, run_id, target_id),
|
|
59
|
+
CHECK (target_tag IN ('Plan', 'Node')),
|
|
60
|
+
CHECK ((target_tag = 'Plan' AND run_id = '') OR (target_tag = 'Node' AND length(run_id) > 0)),
|
|
61
|
+
CHECK (length(target_id) > 0 AND token_id = target_id)
|
|
62
|
+
)`,
|
|
63
|
+
sql`CREATE TABLE IF NOT EXISTS control_grants (
|
|
64
|
+
target_tag TEXT NOT NULL,
|
|
65
|
+
run_id TEXT NOT NULL,
|
|
66
|
+
target_id TEXT NOT NULL,
|
|
67
|
+
token_id TEXT NOT NULL,
|
|
68
|
+
envelope_json TEXT NOT NULL,
|
|
69
|
+
scope TEXT NOT NULL,
|
|
70
|
+
installed_at_ms ${Dialect.integer(sql)} NOT NULL,
|
|
71
|
+
PRIMARY KEY (target_tag, run_id, target_id),
|
|
72
|
+
CHECK (target_tag IN ('Plan', 'Node')),
|
|
73
|
+
CHECK ((target_tag = 'Plan' AND run_id = '') OR (target_tag = 'Node' AND length(run_id) > 0)),
|
|
74
|
+
CHECK (length(target_id) > 0 AND token_id = target_id)
|
|
75
|
+
)`,
|
|
76
|
+
sql`CREATE TABLE IF NOT EXISTS control_mutations (
|
|
77
|
+
mutation_key TEXT PRIMARY KEY,
|
|
78
|
+
fingerprint TEXT NOT NULL,
|
|
79
|
+
receipt_json TEXT NOT NULL
|
|
80
|
+
)`,
|
|
81
|
+
sql`CREATE TABLE IF NOT EXISTS control_runs (
|
|
82
|
+
run_id TEXT PRIMARY KEY,
|
|
83
|
+
created_seq ${Dialect.integer(sql)} NOT NULL
|
|
84
|
+
)`,
|
|
85
|
+
sql`CREATE TABLE IF NOT EXISTS control_run_resumes (
|
|
86
|
+
run_id TEXT PRIMARY KEY,
|
|
87
|
+
requested_seq ${Dialect.integer(sql)} NOT NULL,
|
|
88
|
+
requested_at_ms ${Dialect.integer(sql)} NOT NULL
|
|
89
|
+
)`,
|
|
90
|
+
sql`CREATE TABLE IF NOT EXISTS control_run_messages (
|
|
91
|
+
seq ${Dialect.identity(sql)},
|
|
92
|
+
run_id TEXT NOT NULL,
|
|
93
|
+
kind TEXT NOT NULL,
|
|
94
|
+
payload_json TEXT NOT NULL
|
|
95
|
+
)`,
|
|
96
|
+
sql`CREATE TABLE IF NOT EXISTS control_sequences (
|
|
97
|
+
name TEXT PRIMARY KEY,
|
|
98
|
+
value ${Dialect.integer(sql)} NOT NULL
|
|
99
|
+
)`,
|
|
100
|
+
sql`CREATE TABLE IF NOT EXISTS control_credentials (
|
|
101
|
+
id TEXT PRIMARY KEY,
|
|
102
|
+
name TEXT NOT NULL,
|
|
103
|
+
ciphertext TEXT NOT NULL,
|
|
104
|
+
nonce TEXT NOT NULL,
|
|
105
|
+
version ${Dialect.integer(sql)} NOT NULL,
|
|
106
|
+
updated_at_ms ${Dialect.integer(sql)} NOT NULL
|
|
107
|
+
)`
|
|
108
|
+
];
|
|
109
|
+
const initial = Effect.gen(function* () {
|
|
110
|
+
const sql = yield* SqlClient.SqlClient;
|
|
111
|
+
for (const statement of statements(sql)) {
|
|
112
|
+
yield* statement;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=0001_control_tables.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/migrations/0001_control_tables.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Initial durable control-plane schema.\n *\n * @since 0.1.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\nconst statements = (sql: SqlClient.SqlClient) =>\n [\n sql`CREATE TABLE IF NOT EXISTS control_plans (\n ${Dialect.rowId(sql)}\n plan_id TEXT PRIMARY KEY,\n card_json TEXT NOT NULL,\n decoded_input_json TEXT NOT NULL,\n decision TEXT NOT NULL\n )`,\n sql`CREATE TABLE IF NOT EXISTS control_plan_keys (\n idempotency_key TEXT PRIMARY KEY,\n fingerprint TEXT NOT NULL,\n plan_id TEXT NOT NULL\n )`,\n sql`CREATE TABLE IF NOT EXISTS control_tokens (\n target_tag TEXT NOT NULL,\n run_id TEXT NOT NULL,\n target_id TEXT NOT NULL,\n token_id TEXT NOT NULL,\n target_json TEXT NOT NULL,\n resolved ${Dialect.integer(sql)} NOT NULL,\n decision_principal_json TEXT,\n PRIMARY KEY (target_tag, run_id, target_id),\n CHECK (target_tag IN ('Plan', 'Node')),\n CHECK ((target_tag = 'Plan' AND run_id = '') OR (target_tag = 'Node' AND length(run_id) > 0)),\n CHECK (length(target_id) > 0 AND token_id = target_id)\n )`,\n sql`CREATE TABLE IF NOT EXISTS control_grants (\n target_tag TEXT NOT NULL,\n run_id TEXT NOT NULL,\n target_id TEXT NOT NULL,\n token_id TEXT NOT NULL,\n envelope_json TEXT NOT NULL,\n scope TEXT NOT NULL,\n installed_at_ms ${Dialect.integer(sql)} NOT NULL,\n PRIMARY KEY (target_tag, run_id, target_id),\n CHECK (target_tag IN ('Plan', 'Node')),\n CHECK ((target_tag = 'Plan' AND run_id = '') OR (target_tag = 'Node' AND length(run_id) > 0)),\n CHECK (length(target_id) > 0 AND token_id = target_id)\n )`,\n sql`CREATE TABLE IF NOT EXISTS control_mutations (\n mutation_key TEXT PRIMARY KEY,\n fingerprint TEXT NOT NULL,\n receipt_json TEXT NOT NULL\n )`,\n sql`CREATE TABLE IF NOT EXISTS control_runs (\n run_id TEXT PRIMARY KEY,\n created_seq ${Dialect.integer(sql)} NOT NULL\n )`,\n sql`CREATE TABLE IF NOT EXISTS control_run_resumes (\n run_id TEXT PRIMARY KEY,\n requested_seq ${Dialect.integer(sql)} NOT NULL,\n requested_at_ms ${Dialect.integer(sql)} NOT NULL\n )`,\n sql`CREATE TABLE IF NOT EXISTS control_run_messages (\n seq ${Dialect.identity(sql)},\n run_id TEXT NOT NULL,\n kind TEXT NOT NULL,\n payload_json TEXT NOT NULL\n )`,\n sql`CREATE TABLE IF NOT EXISTS control_sequences (\n name TEXT PRIMARY KEY,\n value ${Dialect.integer(sql)} NOT NULL\n )`,\n sql`CREATE TABLE IF NOT EXISTS control_credentials (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n ciphertext TEXT NOT NULL,\n nonce TEXT NOT NULL,\n version ${Dialect.integer(sql)} NOT NULL,\n updated_at_ms ${Dialect.integer(sql)} NOT NULL\n )`\n ] as const\n\n/**\n * Creates every table owned by `@smthrs/control`.\n *\n * `IF NOT EXISTS` lets the recorded migration and each standalone adapter's\n * bootstrap share this exact schema without competing over table creation.\n *\n * @category migrations\n * @since 0.1.0\n */\nexport const initial: Effect.Effect<void, unknown, SqlClient.SqlClient> = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n for (const statement of statements(sql)) {\n yield* statement\n }\n})\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAyB;AACzB,aAAwB;AACxB,gBAA2B;AAE3B,MAAM,aAAa,CAAC,QAClB;AAAA,EACE;AAAA,MACE,QAAQ,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMW,QAAQ,QAAQ,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAOkB,QAAQ,QAAQ,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA,kBAEc,QAAQ,QAAQ,GAAG,CAAC;AAAA;AAAA,EAElC;AAAA;AAAA,oBAEgB,QAAQ,QAAQ,GAAG,CAAC;AAAA,sBAClB,QAAQ,QAAQ,GAAG,CAAC;AAAA;AAAA,EAEtC;AAAA,UACM,QAAQ,SAAS,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3B;AAAA;AAAA,YAEQ,QAAQ,QAAQ,GAAG,CAAC;AAAA;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA;AAAA,cAKU,QAAQ,QAAQ,GAAG,CAAC;AAAA,oBACd,QAAQ,QAAQ,GAAG,CAAC;AAAA;AAEtC;AAWK,MAAM,UAA6D,OAAO,IAAI,aAAY;AAC/F,QAAM,MAAM,OAAO,UAAU;AAC7B,aAAW,aAAa,WAAW,GAAG,GAAG;AACvC,WAAO;AAAA,EACT;AACF,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable run idempotency claims, including upgrades of existing databases.
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as SqlClient from "effect/unstable/sql/SqlClient";
|
|
8
|
+
/**
|
|
9
|
+
* Adds the run-key claim table without changing existing control data.
|
|
10
|
+
*
|
|
11
|
+
* @category migrations
|
|
12
|
+
* @since 1.0.0
|
|
13
|
+
*/
|
|
14
|
+
export declare const runKeys: Effect.Effect<void, import("effect/unstable/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
15
|
+
//# sourceMappingURL=0002_run_keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"0002_run_keys.d.ts","sourceRoot":"","sources":["../../../src/migrations/0002_run_keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,OAAO,2FAOlB,CAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var run_keys_exports = {};
|
|
30
|
+
__export(run_keys_exports, {
|
|
31
|
+
runKeys: () => runKeys
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(run_keys_exports);
|
|
34
|
+
var Effect = __toESM(require("effect/Effect"), 1);
|
|
35
|
+
var SqlClient = __toESM(require("effect/unstable/sql/SqlClient"), 1);
|
|
36
|
+
const runKeys = Effect.gen(function* () {
|
|
37
|
+
const sql = yield* SqlClient.SqlClient;
|
|
38
|
+
yield* sql`CREATE TABLE IF NOT EXISTS control_run_keys (
|
|
39
|
+
idempotency_key TEXT PRIMARY KEY,
|
|
40
|
+
fingerprint TEXT NOT NULL,
|
|
41
|
+
claimant TEXT NOT NULL
|
|
42
|
+
)`;
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=0002_run_keys.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/migrations/0002_run_keys.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Durable run idempotency claims, including upgrades of existing databases.\n *\n * @since 1.0.0\n */\n\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Adds the run-key claim table without changing existing control data.\n *\n * @category migrations\n * @since 1.0.0\n */\nexport const runKeys = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`CREATE TABLE IF NOT EXISTS control_run_keys (\n idempotency_key TEXT PRIMARY KEY,\n fingerprint TEXT NOT NULL,\n claimant TEXT NOT NULL\n )`\n})\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,aAAwB;AACxB,gBAA2B;AAQpB,MAAM,UAAU,OAAO,IAAI,aAAY;AAC5C,QAAM,MAAM,OAAO,UAAU;AAC7B,SAAO;AAAA;AAAA;AAAA;AAAA;AAKT,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable signal admission and immutable wait bindings.
|
|
3
|
+
* @since 1.0.0
|
|
4
|
+
*/
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import * as SqlClient from "effect/unstable/sql/SqlClient";
|
|
7
|
+
/**
|
|
8
|
+
* Adds the signal inbox without replaying legacy messages that lack delivery identity.
|
|
9
|
+
* @category migrations
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
export declare const signalCommands: Effect.Effect<void, import("effect/unstable/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
13
|
+
//# sourceMappingURL=0003_signal_commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"0003_signal_commands.d.ts","sourceRoot":"","sources":["../../../src/migrations/0003_signal_commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;GAIG;AACH,eAAO,MAAM,cAAc,2FAYzB,CAAA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var signal_commands_exports = {};
|
|
30
|
+
__export(signal_commands_exports, {
|
|
31
|
+
signalCommands: () => signalCommands
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(signal_commands_exports);
|
|
34
|
+
var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
|
|
35
|
+
var Effect = __toESM(require("effect/Effect"), 1);
|
|
36
|
+
var SqlClient = __toESM(require("effect/unstable/sql/SqlClient"), 1);
|
|
37
|
+
const signalCommands = Effect.gen(function* () {
|
|
38
|
+
const sql = yield* SqlClient.SqlClient;
|
|
39
|
+
yield* sql`CREATE TABLE IF NOT EXISTS control_signal_commands (
|
|
40
|
+
seq ${Dialect.identity(sql)},
|
|
41
|
+
command_id TEXT NOT NULL UNIQUE,
|
|
42
|
+
run_id TEXT NOT NULL,
|
|
43
|
+
payload_json TEXT NOT NULL,
|
|
44
|
+
wait_token TEXT,
|
|
45
|
+
state TEXT NOT NULL DEFAULT 'pending' CHECK (state IN ('pending', 'delivered', 'rejected', 'terminal'))
|
|
46
|
+
)`;
|
|
47
|
+
yield* sql`CREATE UNIQUE INDEX IF NOT EXISTS control_signal_commands_wait ON control_signal_commands(wait_token) WHERE wait_token IS NOT NULL`;
|
|
48
|
+
yield* sql`CREATE INDEX IF NOT EXISTS control_signal_commands_pending ON control_signal_commands(state, seq)`;
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=0003_signal_commands.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/migrations/0003_signal_commands.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Durable signal admission and immutable wait bindings.\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Adds the signal inbox without replaying legacy messages that lack delivery identity.\n * @category migrations\n * @since 1.0.0\n */\nexport const signalCommands = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql`CREATE TABLE IF NOT EXISTS control_signal_commands (\n seq ${Dialect.identity(sql)},\n command_id TEXT NOT NULL UNIQUE,\n run_id TEXT NOT NULL,\n payload_json TEXT NOT NULL,\n wait_token TEXT,\n state TEXT NOT NULL DEFAULT 'pending' CHECK (state IN ('pending', 'delivered', 'rejected', 'terminal'))\n )`\n yield* sql`CREATE UNIQUE INDEX IF NOT EXISTS control_signal_commands_wait ON control_signal_commands(wait_token) WHERE wait_token IS NOT NULL`\n yield* sql`CREATE INDEX IF NOT EXISTS control_signal_commands_pending ON control_signal_commands(state, seq)`\n})\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,cAAyB;AACzB,aAAwB;AACxB,gBAA2B;AAOpB,MAAM,iBAAiB,OAAO,IAAI,aAAY;AACnD,QAAM,MAAM,OAAO,UAAU;AAC7B,SAAO;AAAA,UACC,QAAQ,SAAS,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO7B,SAAO;AACP,SAAO;AACT,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preserve the actual decision without guessing erased legacy answers.
|
|
3
|
+
* @since 1.0.0
|
|
4
|
+
*/
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import * as SqlClient from "effect/unstable/sql/SqlClient";
|
|
7
|
+
/**
|
|
8
|
+
* Idempotent for both recorded migrations and standalone runtime bootstrap.
|
|
9
|
+
* @category migrations
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
export declare const approvalDecisions: Effect.Effect<void, import("effect/unstable/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
13
|
+
//# sourceMappingURL=0004_approval_decisions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"0004_approval_decisions.d.ts","sourceRoot":"","sources":["../../../src/migrations/0004_approval_decisions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,2FAU5B,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var approval_decisions_exports = {};
|
|
30
|
+
__export(approval_decisions_exports, {
|
|
31
|
+
approvalDecisions: () => approvalDecisions
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(approval_decisions_exports);
|
|
34
|
+
var Dialect = __toESM(require("@smthrs/database/Dialect"), 1);
|
|
35
|
+
var Effect = __toESM(require("effect/Effect"), 1);
|
|
36
|
+
var SqlClient = __toESM(require("effect/unstable/sql/SqlClient"), 1);
|
|
37
|
+
const approvalDecisions = Effect.gen(function* () {
|
|
38
|
+
const sql = yield* SqlClient.SqlClient;
|
|
39
|
+
yield* sql.withTransaction(Effect.gen(function* () {
|
|
40
|
+
const columns = yield* Dialect.columns(sql, "control_tokens");
|
|
41
|
+
if (columns.some((column) => column.name === "decision_json")) return;
|
|
42
|
+
yield* sql`ALTER TABLE control_tokens ADD COLUMN decision_json TEXT`;
|
|
43
|
+
}));
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=0004_approval_decisions.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/migrations/0004_approval_decisions.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Preserve the actual decision without guessing erased legacy answers.\n * @since 1.0.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Idempotent for both recorded migrations and standalone runtime bootstrap.\n * @category migrations\n * @since 1.0.0\n */\nexport const approvalDecisions = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* sql.withTransaction(Effect.gen(function*() {\n const columns = yield* Dialect.columns(sql, \"control_tokens\")\n if (columns.some((column) => column.name === \"decision_json\")) return\n // NULL is intentional: old terminal tokens erased their answer. Their\n // decoder refuses recovery instead of inferring approval from a grant.\n // An undecided token still has its unambiguous resolved=0 representation.\n yield* sql`ALTER TABLE control_tokens ADD COLUMN decision_json TEXT`\n }))\n})\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,cAAyB;AACzB,aAAwB;AACxB,gBAA2B;AAOpB,MAAM,oBAAoB,OAAO,IAAI,aAAY;AACtD,QAAM,MAAM,OAAO,UAAU;AAC7B,SAAO,IAAI,gBAAgB,OAAO,IAAI,aAAY;AAChD,UAAM,UAAU,OAAO,QAAQ,QAAQ,KAAK,gBAAgB;AAC5D,QAAI,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,eAAe,EAAG;AAI/D,WAAO;AAAA,EACT,CAAC,CAAC;AACJ,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|