@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,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Versioned control lifecycle facts and their shared read projection.
|
|
3
|
+
* @since 1.0.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { Journal, JournalEvent } from "@smthrs/journal"
|
|
7
|
+
import { Effect, Schema } from "effect"
|
|
8
|
+
import type * as ControlRuntime from "./ControlRuntime.ts"
|
|
9
|
+
import * as ControlSchema from "./ControlSchema.ts"
|
|
10
|
+
|
|
11
|
+
/** This is the control producer contract, independent of the harness journal format.
|
|
12
|
+
* @category facts
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
export const version = 1
|
|
16
|
+
|
|
17
|
+
/** A committed control snapshot. A baseline claims no history before its sequence.
|
|
18
|
+
* @category facts
|
|
19
|
+
* @since 1.0.0
|
|
20
|
+
*/
|
|
21
|
+
export const RunFact = Schema.Struct({
|
|
22
|
+
factVersion: Schema.Literal(version),
|
|
23
|
+
baseline: Schema.Literals(["created", "legacy"]),
|
|
24
|
+
run: ControlSchema.RunSummary
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
/** Capture the exact result of a fenced write, inside its journal transaction.
|
|
28
|
+
* @category facts
|
|
29
|
+
* @since 1.0.0
|
|
30
|
+
*/
|
|
31
|
+
export const runFact = (
|
|
32
|
+
run: ControlSchema.RunSummary,
|
|
33
|
+
baseline: "created" | "legacy" = "legacy"
|
|
34
|
+
): typeof RunFact.Type => {
|
|
35
|
+
if (run.executionObservation !== undefined || run.executionView !== undefined) {
|
|
36
|
+
throw new Error("A control fact cannot persist an executor observation")
|
|
37
|
+
}
|
|
38
|
+
return Schema.decodeUnknownSync(RunFact)({ factVersion: version, baseline, run: structuredClone(run) })
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** The exact facts of the guard that parked a run, frozen when it tripped.
|
|
42
|
+
*
|
|
43
|
+
* `Runaway` is a run spending past an approved ceiling (`tokens`, `usd`,
|
|
44
|
+
* `latency`). `Stuck` is one operation that ran past its time limit
|
|
45
|
+
* (`model-call`, `tool-call`, `cell`). Every number is in the source's unit,
|
|
46
|
+
* tokens, dollars, or milliseconds: `used`, `reserved`, `max`, and `next` are
|
|
47
|
+
* a budget's spend, held forecast, ceiling, and refused call; `max` is a
|
|
48
|
+
* timeout's limit.
|
|
49
|
+
* `allowance` is what Continue authorizes: the raised ceiling for a budget,
|
|
50
|
+
* one more run of `max` for a timeout. `subject` names the operation a
|
|
51
|
+
* timeout interrupted.
|
|
52
|
+
* @category facts
|
|
53
|
+
* @since 1.0.0
|
|
54
|
+
*/
|
|
55
|
+
export const GuardIncident = Schema.Struct({
|
|
56
|
+
classification: Schema.Literals(["Runaway", "Stuck"]),
|
|
57
|
+
source: Schema.Literals(["tokens", "usd", "latency", "model-call", "tool-call", "cell"]),
|
|
58
|
+
message: Schema.String,
|
|
59
|
+
used: Schema.optional(Schema.Number),
|
|
60
|
+
reserved: Schema.optional(Schema.Number),
|
|
61
|
+
max: Schema.optional(Schema.Number),
|
|
62
|
+
next: Schema.optional(Schema.Number),
|
|
63
|
+
allowance: Schema.optional(Schema.Number),
|
|
64
|
+
subject: Schema.optional(Schema.String)
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
/** The identity-bearing request admitted with its approval token.
|
|
68
|
+
*
|
|
69
|
+
* `incident` is present on a request a guard made, so a restarted host reads
|
|
70
|
+
* the facts the park was made on rather than measuring them again.
|
|
71
|
+
* @category facts
|
|
72
|
+
* @since 1.0.0
|
|
73
|
+
*/
|
|
74
|
+
export const ApprovalRequestFact = Schema.Struct({
|
|
75
|
+
factVersion: Schema.Literal(version),
|
|
76
|
+
runId: Schema.String,
|
|
77
|
+
requestId: Schema.String,
|
|
78
|
+
question: Schema.String,
|
|
79
|
+
payload: ControlSchema.ApprovalPayload,
|
|
80
|
+
incident: Schema.optional(GuardIncident)
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
/** The exact target a committed decision resolves; old target-tag fields remain readable.
|
|
84
|
+
* @category facts
|
|
85
|
+
* @since 1.0.0
|
|
86
|
+
*/
|
|
87
|
+
export const ApprovalDecisionFact = Schema.Struct({
|
|
88
|
+
factVersion: Schema.Literal(version),
|
|
89
|
+
tokenId: Schema.String,
|
|
90
|
+
approvalTarget: ControlSchema.ApprovalTarget
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
/** Capture and validate the target the decision writer has actually resolved.
|
|
94
|
+
* @category facts
|
|
95
|
+
* @since 1.0.0
|
|
96
|
+
*/
|
|
97
|
+
export const approvalDecisionFact = (
|
|
98
|
+
tokenId: string,
|
|
99
|
+
approvalTarget: ControlSchema.ApprovalTarget
|
|
100
|
+
): typeof ApprovalDecisionFact.Type =>
|
|
101
|
+
Schema.decodeUnknownSync(ApprovalDecisionFact)({
|
|
102
|
+
factVersion: version,
|
|
103
|
+
tokenId,
|
|
104
|
+
approvalTarget: structuredClone(approvalTarget)
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
/** Commit a fenced control write and the exact resulting lifecycle fact together.
|
|
108
|
+
* @category facts
|
|
109
|
+
* @since 1.0.0
|
|
110
|
+
*/
|
|
111
|
+
export const commitRun = <E, R>(
|
|
112
|
+
journal: Journal.Service,
|
|
113
|
+
change: Effect.Effect<ControlSchema.RunSummary, E, R>,
|
|
114
|
+
sourceId: string,
|
|
115
|
+
eventType: string,
|
|
116
|
+
detail: Readonly<Record<string, unknown>> = {},
|
|
117
|
+
baseline: "created" | "legacy" = "legacy"
|
|
118
|
+
) =>
|
|
119
|
+
journal.transact(Effect.gen(function*() {
|
|
120
|
+
const run = yield* change
|
|
121
|
+
yield* journal.emitDurableUnfenced(
|
|
122
|
+
new JournalEvent.Input({
|
|
123
|
+
runId: JournalEvent.RunId.make(run.runId),
|
|
124
|
+
sourceId: JournalEvent.SourceId.make(sourceId),
|
|
125
|
+
eventType,
|
|
126
|
+
payload: JSON.parse(
|
|
127
|
+
JSON.stringify({ ...detail, runId: run.runId, status: run.status, ...runFact(run, baseline) })
|
|
128
|
+
)
|
|
129
|
+
})
|
|
130
|
+
)
|
|
131
|
+
return run
|
|
132
|
+
}))
|
|
133
|
+
|
|
134
|
+
/** The token and submit-ready request have one durable admission boundary.
|
|
135
|
+
* @category facts
|
|
136
|
+
* @since 1.0.0
|
|
137
|
+
*/
|
|
138
|
+
export const commitApprovalRequest = (
|
|
139
|
+
journal: Journal.Service,
|
|
140
|
+
runtime: Pick<ControlRuntime.Service, "registerApproval">,
|
|
141
|
+
input: Omit<typeof ApprovalRequestFact.Type, "factVersion">,
|
|
142
|
+
sourceId: string
|
|
143
|
+
) =>
|
|
144
|
+
Effect.suspend(() => {
|
|
145
|
+
const fact = Schema.decodeUnknownSync(ApprovalRequestFact)({ ...structuredClone(input), factVersion: version })
|
|
146
|
+
const target = fact.payload.target
|
|
147
|
+
if (target._tag !== "Node" || target.runId !== fact.runId || target.requestId !== fact.requestId) {
|
|
148
|
+
return Effect.fail(
|
|
149
|
+
new Journal.JournalError({
|
|
150
|
+
code: "invalid_event",
|
|
151
|
+
message: "Approval request identity does not match its target"
|
|
152
|
+
})
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
return journal.transact(Effect.gen(function*() {
|
|
156
|
+
const token = yield* runtime.registerApproval(target)
|
|
157
|
+
if (token._tag === "Pending") {
|
|
158
|
+
yield* journal.emitDurableUnfenced(
|
|
159
|
+
new JournalEvent.Input({
|
|
160
|
+
runId: JournalEvent.RunId.make(fact.runId),
|
|
161
|
+
sourceId: JournalEvent.SourceId.make(sourceId),
|
|
162
|
+
eventType: "control.approval.requested",
|
|
163
|
+
payload: JSON.parse(JSON.stringify(fact))
|
|
164
|
+
})
|
|
165
|
+
)
|
|
166
|
+
}
|
|
167
|
+
return token
|
|
168
|
+
}))
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
/** Honest coverage of the displayed lifecycle; engine rows are a separate authority.
|
|
172
|
+
* @category facts
|
|
173
|
+
* @since 1.0.0
|
|
174
|
+
*/
|
|
175
|
+
export const LifecycleProvenance = Schema.Struct({
|
|
176
|
+
control: Schema.Literals(["events", "legacy-snapshot", "unverified-snapshot"]),
|
|
177
|
+
execution: Schema.Literals(["control", "engine-observed", "engine-missing"]),
|
|
178
|
+
baseline: Schema.optional(Schema.Literals(["created", "legacy"])),
|
|
179
|
+
fromSequence: Schema.optional(Schema.Number),
|
|
180
|
+
throughSequence: Schema.optional(Schema.Number)
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
/** Submit-ready approval state derived solely from admitted facts.
|
|
184
|
+
* @category facts
|
|
185
|
+
* @since 1.0.0
|
|
186
|
+
*/
|
|
187
|
+
export interface Approval {
|
|
188
|
+
readonly runId: string
|
|
189
|
+
readonly waitRunId?: string | undefined
|
|
190
|
+
readonly questionProvenance?: "events" | "legacy-observation" | "unverified-observation" | undefined
|
|
191
|
+
readonly requestId: string
|
|
192
|
+
readonly title: string
|
|
193
|
+
readonly request: ControlSchema.ControlEvent["payload"]
|
|
194
|
+
readonly payload: ControlSchema.ApprovalPayload
|
|
195
|
+
readonly requestedAt: number
|
|
196
|
+
readonly status: "pending" | "approved" | "denied"
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const record = (value: unknown): Record<string, unknown> =>
|
|
200
|
+
value !== null && typeof value === "object" && !Array.isArray(value) ? value as Record<string, unknown> : {}
|
|
201
|
+
const string = (value: unknown): string | undefined => typeof value === "string" ? value : undefined
|
|
202
|
+
const key = (runId: string, requestId: string): string => JSON.stringify([runId, requestId])
|
|
203
|
+
const lifecycleKinds = new Set([
|
|
204
|
+
"control.run.accepted",
|
|
205
|
+
"control.run.running",
|
|
206
|
+
"control.run.pending",
|
|
207
|
+
"control.run.parked",
|
|
208
|
+
"control.run.waiting-approval",
|
|
209
|
+
"control.run.completed",
|
|
210
|
+
"control.run.failed",
|
|
211
|
+
"control.run.cancelled",
|
|
212
|
+
"control.run.resume",
|
|
213
|
+
"control.run.claimed",
|
|
214
|
+
"control.steer.woke"
|
|
215
|
+
])
|
|
216
|
+
const consistentStatus = (kind: string, run: ControlSchema.RunSummary): boolean => {
|
|
217
|
+
if (kind === "control.run.pending") return run.status === "accepted"
|
|
218
|
+
if (kind === "control.run.resume" || kind === "control.run.claimed" || kind === "control.steer.woke") return true
|
|
219
|
+
return kind === `control.run.${run.status}`
|
|
220
|
+
}
|
|
221
|
+
const coordinationFields = [
|
|
222
|
+
"runId",
|
|
223
|
+
"flowId",
|
|
224
|
+
"createdAt",
|
|
225
|
+
"updatedAt",
|
|
226
|
+
"planId",
|
|
227
|
+
"planDigest",
|
|
228
|
+
"ownerId",
|
|
229
|
+
"parkedBy"
|
|
230
|
+
] as const
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* One fold for gateway snapshots and subscriptions. Current writers are strict;
|
|
234
|
+
* legacy unnamed decisions may close only a legacy request in the same run.
|
|
235
|
+
* Observed human waits may seed the approval projection without claiming a
|
|
236
|
+
* journaled request. They still require an exact named decision, and share the
|
|
237
|
+
* same digest binding as admitted requests.
|
|
238
|
+
* Duplicate requests never reopen decisions, and a new-style unknown identity
|
|
239
|
+
* never consumes another gate. Snapshot fallback is explicitly unverified.
|
|
240
|
+
* @category facts
|
|
241
|
+
* @since 1.0.0
|
|
242
|
+
*/
|
|
243
|
+
export const fold = (
|
|
244
|
+
events: ReadonlyArray<ControlSchema.ControlEvent>,
|
|
245
|
+
snapshot?: ControlSchema.RunSummary,
|
|
246
|
+
observedApprovals: ReadonlyArray<Approval> = []
|
|
247
|
+
): {
|
|
248
|
+
readonly run: ControlSchema.RunSummary | undefined
|
|
249
|
+
readonly provenance: typeof LifecycleProvenance.Type
|
|
250
|
+
readonly approvals: ReadonlyArray<Approval>
|
|
251
|
+
} => {
|
|
252
|
+
let latest: { readonly fact: typeof RunFact.Type; readonly sequence: number } | undefined
|
|
253
|
+
let first: { readonly baseline: "created" | "legacy"; readonly sequence: number } | undefined
|
|
254
|
+
let uncovered = false
|
|
255
|
+
const requests = new Map<string, { readonly row: Approval; readonly versioned: boolean }>()
|
|
256
|
+
for (const row of observedApprovals) {
|
|
257
|
+
if (snapshot !== undefined && row.runId !== snapshot.runId) continue
|
|
258
|
+
const target = row.payload.target
|
|
259
|
+
if (target._tag !== "Node" || target.runId !== row.runId || target.requestId !== row.requestId) continue
|
|
260
|
+
requests.set(key(row.runId, row.requestId), { row: { ...row, status: "pending" }, versioned: true })
|
|
261
|
+
}
|
|
262
|
+
const decisions = new Map<string, { readonly status: "approved" | "denied"; readonly digest?: string }>()
|
|
263
|
+
for (const event of events) {
|
|
264
|
+
if (snapshot !== undefined && event.runId !== snapshot.runId) continue
|
|
265
|
+
const payload = record(event.payload)
|
|
266
|
+
if (lifecycleKinds.has(event.kind) || payload.factVersion !== undefined && event.kind.startsWith("control.run.")) {
|
|
267
|
+
if (
|
|
268
|
+
Schema.is(RunFact)(payload) && payload.run.runId === event.runId &&
|
|
269
|
+
payload.run.executionObservation === undefined && payload.run.executionView === undefined &&
|
|
270
|
+
consistentStatus(event.kind, payload.run)
|
|
271
|
+
) {
|
|
272
|
+
latest = { fact: payload, sequence: event.sequence }
|
|
273
|
+
first ??= { baseline: payload.baseline, sequence: event.sequence }
|
|
274
|
+
// This full snapshot establishes a new baseline after a gap; the
|
|
275
|
+
// earlier prefix can no longer be claimed as continuously covered.
|
|
276
|
+
if (uncovered) first = { baseline: "legacy", sequence: event.sequence }
|
|
277
|
+
uncovered = false
|
|
278
|
+
} else if (payload.factVersion !== undefined || latest !== undefined) uncovered = true
|
|
279
|
+
}
|
|
280
|
+
if (event.kind === "control.approval.requested") {
|
|
281
|
+
const versioned = payload.factVersion !== undefined
|
|
282
|
+
if (versioned && !Schema.is(ApprovalRequestFact)(payload)) continue
|
|
283
|
+
const runId = string(payload.runId) ?? event.runId
|
|
284
|
+
const requestId = string(payload.requestId)
|
|
285
|
+
if (
|
|
286
|
+
runId === undefined || requestId === undefined || event.runId !== runId ||
|
|
287
|
+
payload.payload === undefined
|
|
288
|
+
) continue
|
|
289
|
+
// Historical payloads were open JSON. Preserve their read-only display;
|
|
290
|
+
// only the versioned contract can establish exact target correspondence.
|
|
291
|
+
const submitted = payload.payload as ControlSchema.ApprovalPayload
|
|
292
|
+
if (
|
|
293
|
+
versioned &&
|
|
294
|
+
(submitted.target._tag !== "Node" || submitted.target.runId !== runId ||
|
|
295
|
+
submitted.target.requestId !== requestId)
|
|
296
|
+
) continue
|
|
297
|
+
const identity = key(runId, requestId)
|
|
298
|
+
if (requests.has(identity)) continue
|
|
299
|
+
const decision = decisions.get(identity)
|
|
300
|
+
requests.set(identity, {
|
|
301
|
+
versioned,
|
|
302
|
+
row: {
|
|
303
|
+
runId,
|
|
304
|
+
requestId,
|
|
305
|
+
title: string(payload.question) ?? `Approval needed — ${requestId}`,
|
|
306
|
+
request: event.payload,
|
|
307
|
+
payload: submitted,
|
|
308
|
+
requestedAt: typeof payload.at === "number" && Number.isFinite(payload.at) ? payload.at : event.occurredAt,
|
|
309
|
+
status: decision !== undefined &&
|
|
310
|
+
(decision.digest === undefined || decision.digest === record(record(submitted).target).digest)
|
|
311
|
+
? decision.status :
|
|
312
|
+
"pending"
|
|
313
|
+
}
|
|
314
|
+
})
|
|
315
|
+
}
|
|
316
|
+
if (event.kind === "control.approval.approved" || event.kind === "control.approval.denied") {
|
|
317
|
+
const status = event.kind === "control.approval.approved" ? "approved" : "denied"
|
|
318
|
+
let identity: string | undefined
|
|
319
|
+
let digest: string | undefined
|
|
320
|
+
if (payload.factVersion !== undefined) {
|
|
321
|
+
if (
|
|
322
|
+
!Schema.is(ApprovalDecisionFact)(payload) || payload.approvalTarget._tag !== "Node" ||
|
|
323
|
+
payload.approvalTarget.runId !== event.runId || payload.tokenId !== payload.approvalTarget.requestId
|
|
324
|
+
) continue
|
|
325
|
+
identity = key(payload.approvalTarget.runId, payload.approvalTarget.requestId)
|
|
326
|
+
digest = payload.approvalTarget.digest
|
|
327
|
+
} else {
|
|
328
|
+
const tokenId = string(payload.tokenId) ?? string(payload.requestId)
|
|
329
|
+
if (tokenId !== undefined && event.runId !== undefined) identity = key(event.runId, tokenId)
|
|
330
|
+
else {identity = [...requests].find(([, request]) =>
|
|
331
|
+
!request.versioned && request.row.status === "pending" &&
|
|
332
|
+
request.row.runId === event.runId
|
|
333
|
+
)?.[0]}
|
|
334
|
+
}
|
|
335
|
+
if (identity === undefined || decisions.has(identity)) continue
|
|
336
|
+
const request = requests.get(identity)
|
|
337
|
+
if (
|
|
338
|
+
request !== undefined && digest !== undefined && record(record(request.row.payload).target).digest !== digest
|
|
339
|
+
) continue
|
|
340
|
+
decisions.set(identity, { status, ...(digest === undefined ? {} : { digest }) })
|
|
341
|
+
if (request !== undefined) requests.set(identity, { ...request, row: { ...request.row, status } })
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
const matches = !uncovered && latest !== undefined && (snapshot === undefined ||
|
|
345
|
+
coordinationFields.every((field) => latest.fact.run[field] === snapshot[field]) &&
|
|
346
|
+
(snapshot.executionObservation === "observed" || latest.fact.run.status === snapshot.status))
|
|
347
|
+
const run = snapshot === undefined ? uncovered ? undefined : latest?.fact.run : matches
|
|
348
|
+
? {
|
|
349
|
+
...snapshot,
|
|
350
|
+
...latest!.fact.run,
|
|
351
|
+
...(snapshot.executionObservation === "observed" ?
|
|
352
|
+
{
|
|
353
|
+
status: snapshot.status,
|
|
354
|
+
waitingReason: snapshot.waitingReason,
|
|
355
|
+
parentRunId: snapshot.parentRunId,
|
|
356
|
+
lineageId: snapshot.lineageId,
|
|
357
|
+
roundOrdinal: snapshot.roundOrdinal,
|
|
358
|
+
pendingWaits: snapshot.pendingWaits
|
|
359
|
+
} :
|
|
360
|
+
{})
|
|
361
|
+
}
|
|
362
|
+
: snapshot
|
|
363
|
+
return {
|
|
364
|
+
run,
|
|
365
|
+
provenance: {
|
|
366
|
+
control: uncovered
|
|
367
|
+
? "unverified-snapshot"
|
|
368
|
+
: latest === undefined
|
|
369
|
+
? "legacy-snapshot"
|
|
370
|
+
: matches
|
|
371
|
+
? "events"
|
|
372
|
+
: "unverified-snapshot",
|
|
373
|
+
execution: snapshot?.executionObservation === "observed" ?
|
|
374
|
+
"engine-observed"
|
|
375
|
+
: snapshot?.executionObservation === "missing"
|
|
376
|
+
? "engine-missing"
|
|
377
|
+
: "control",
|
|
378
|
+
...(first === undefined ? {} : { baseline: first.baseline, fromSequence: first.sequence }),
|
|
379
|
+
...(latest === undefined ? {} : { throughSequence: latest.sequence })
|
|
380
|
+
},
|
|
381
|
+
approvals: [...requests.values()].map(({ row }) => row)
|
|
382
|
+
}
|
|
383
|
+
}
|