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