@vercel/factory 0.0.14 → 0.0.16
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 +356 -0
- package/README.md +96 -2
- package/dist/agent-routes.d.mts +113 -0
- package/dist/agent-routes.mjs +91 -0
- package/dist/agent-routes.mjs.map +1 -0
- package/dist/api-contracts.d.mts +1768 -0
- package/dist/api-contracts.mjs +119 -0
- package/dist/api-contracts.mjs.map +1 -0
- package/dist/api-images.d.mts +30 -0
- package/dist/api-images.mjs +28 -0
- package/dist/api-images.mjs.map +1 -0
- package/dist/api-task-graph.mjs +57 -0
- package/dist/api-task-graph.mjs.map +1 -0
- package/dist/api.d.mts +111 -216
- package/dist/api.mjs +1063 -99
- package/dist/api.mjs.map +1 -1
- package/dist/approval-access.d.mts +39 -0
- package/dist/approval-access.mjs +62 -0
- package/dist/approval-access.mjs.map +1 -0
- package/dist/approval-contracts.d.mts +698 -0
- package/dist/approval-contracts.mjs +27 -0
- package/dist/approval-contracts.mjs.map +1 -0
- package/dist/approval.d.mts +49 -0
- package/dist/approval.mjs +39 -0
- package/dist/approval.mjs.map +1 -0
- package/dist/blob/artifacts.d.mts +37 -0
- package/dist/blob/artifacts.mjs +45 -0
- package/dist/blob/artifacts.mjs.map +1 -0
- package/dist/blob/index.d.mts +84 -12
- package/dist/blob/index.mjs +179 -45
- package/dist/blob/index.mjs.map +1 -1
- package/dist/budget.d.mts +115 -0
- package/dist/budget.mjs +147 -0
- package/dist/budget.mjs.map +1 -0
- package/dist/budgets.d.mts +4 -0
- package/dist/budgets.mjs +4 -0
- package/dist/build-factory.d.mts +7 -4
- package/dist/build-factory.mjs +2 -1
- package/dist/build-factory.mjs.map +1 -1
- package/dist/change-verification/brief.d.mts +9 -0
- package/dist/change-verification/brief.mjs +13 -0
- package/dist/change-verification/brief.mjs.map +1 -0
- package/dist/change-verification/dispatch.d.mts +37 -0
- package/dist/change-verification/dispatch.mjs +83 -0
- package/dist/change-verification/dispatch.mjs.map +1 -0
- package/dist/change-verification/eve-tool.d.mts +61 -0
- package/dist/change-verification/eve-tool.mjs +89 -0
- package/dist/change-verification/eve-tool.mjs.map +1 -0
- package/dist/change-verification/result.mjs +130 -0
- package/dist/change-verification/result.mjs.map +1 -0
- package/dist/changes/eve-record-change.d.mts +56 -0
- package/dist/changes/eve-record-change.mjs +131 -0
- package/dist/changes/eve-record-change.mjs.map +1 -0
- package/dist/changes/presentation.d.mts +14 -0
- package/dist/changes.d.mts +24 -0
- package/dist/changes.mjs +29 -0
- package/dist/changes.mjs.map +1 -0
- package/dist/client-events.d.mts +25 -0
- package/dist/client-events.mjs +45 -0
- package/dist/client-events.mjs.map +1 -0
- package/dist/client-stream.d.mts +28 -0
- package/dist/client-stream.mjs +210 -0
- package/dist/client-stream.mjs.map +1 -0
- package/dist/client-transcript.d.mts +41 -0
- package/dist/client-transcript.mjs +233 -0
- package/dist/client-transcript.mjs.map +1 -0
- package/dist/client.d.mts +343 -0
- package/dist/client.mjs +366 -0
- package/dist/client.mjs.map +1 -0
- package/dist/code-review/contracts.d.mts +27 -0
- package/dist/code-review/eve-post-review.d.mts +70 -0
- package/dist/code-review/eve-post-review.mjs +195 -0
- package/dist/code-review/eve-post-review.mjs.map +1 -0
- package/dist/code-review/eve-review-comments.d.mts +75 -0
- package/dist/code-review/eve-review-comments.mjs +193 -0
- package/dist/code-review/eve-review-comments.mjs.map +1 -0
- package/dist/code-review/github-contracts.d.mts +10 -0
- package/dist/code-review/github-reporter.d.mts +46 -0
- package/dist/code-review/github-reporter.mjs +262 -0
- package/dist/code-review/github-reporter.mjs.map +1 -0
- package/dist/code-review/preparation.d.mts +34 -0
- package/dist/code-review/preparation.mjs +23 -0
- package/dist/code-review/preparation.mjs.map +1 -0
- package/dist/code-review/stall.d.mts +17 -0
- package/dist/code-review/stall.mjs +30 -0
- package/dist/code-review/stall.mjs.map +1 -0
- package/dist/code-review.d.mts +7 -0
- package/dist/code-review.mjs +5 -0
- package/dist/communication.d.mts +9 -0
- package/dist/communication.mjs +9 -0
- package/dist/connectors/github.d.mts +26 -0
- package/dist/connectors/github.mjs +55 -0
- package/dist/connectors/github.mjs.map +1 -0
- package/dist/connectors/index.d.mts +35 -3
- package/dist/connectors/index.mjs +3 -52
- package/dist/connectors/index.mjs.map +1 -1
- package/dist/connectors/outbox.d.mts +34 -0
- package/dist/connectors/outbox.mjs +50 -0
- package/dist/connectors/outbox.mjs.map +1 -0
- package/dist/connectors/slack-approval-blocks.mjs +136 -0
- package/dist/connectors/slack-approval-blocks.mjs.map +1 -0
- package/dist/connectors/slack-approvals.d.mts +29 -0
- package/dist/connectors/slack-approvals.mjs +346 -0
- package/dist/connectors/slack-approvals.mjs.map +1 -0
- package/dist/connectors/slack.d.mts +35 -52
- package/dist/connectors/slack.mjs +13 -85
- package/dist/connectors/slack.mjs.map +1 -1
- package/dist/deepsec/eve-tool.d.mts +110 -0
- package/dist/deepsec/eve-tool.mjs +166 -0
- package/dist/deepsec/eve-tool.mjs.map +1 -0
- package/dist/deepsec/finding.d.mts +84 -0
- package/dist/deepsec/finding.mjs +56 -0
- package/dist/deepsec/finding.mjs.map +1 -0
- package/dist/deepsec.d.mts +3 -0
- package/dist/delivery-metrics/metrics.d.mts +93 -0
- package/dist/delivery-metrics/metrics.mjs +200 -0
- package/dist/delivery-metrics/metrics.mjs.map +1 -0
- package/dist/delivery-metrics.d.mts +2 -0
- package/dist/delivery-metrics.mjs +2 -0
- package/dist/dispatch.d.mts +152 -0
- package/dist/dispatch.mjs +199 -0
- package/dist/dispatch.mjs.map +1 -0
- package/dist/errors.d.mts +15 -0
- package/dist/errors.mjs +38 -0
- package/dist/errors.mjs.map +1 -0
- package/dist/eve/index.d.mts +209 -1277
- package/dist/eve/index.mjs +312 -1073
- package/dist/eve/index.mjs.map +1 -1
- package/dist/eve/invoke.d.mts +144 -0
- package/dist/eve/invoke.mjs +254 -0
- package/dist/eve/invoke.mjs.map +1 -0
- package/dist/eve/session-client.d.mts +186 -0
- package/dist/eve/session-client.mjs +245 -0
- package/dist/eve/session-client.mjs.map +1 -0
- package/dist/eve/task-execution.d.mts +380 -0
- package/dist/eve/task-execution.mjs +73 -0
- package/dist/eve/task-execution.mjs.map +1 -0
- package/dist/eve/task-session.d.mts +129 -0
- package/dist/eve/task-session.mjs +245 -0
- package/dist/eve/task-session.mjs.map +1 -0
- package/dist/eve/transcript.d.mts +37 -0
- package/dist/eve/transcript.mjs +69 -0
- package/dist/eve/transcript.mjs.map +1 -0
- package/dist/execution-public.d.mts +8 -0
- package/dist/execution-public.mjs +7 -0
- package/dist/execution.d.mts +183 -0
- package/dist/execution.mjs +223 -0
- package/dist/execution.mjs.map +1 -0
- package/dist/finding-remediation/admission.d.mts +53 -0
- package/dist/finding-remediation/admission.mjs +90 -0
- package/dist/finding-remediation/admission.mjs.map +1 -0
- package/dist/finding-remediation/brief.d.mts +14 -0
- package/dist/finding-remediation/brief.mjs +25 -0
- package/dist/finding-remediation/brief.mjs.map +1 -0
- package/dist/finding-remediation/eve-tool.d.mts +29 -0
- package/dist/finding-remediation/eve-tool.mjs +34 -0
- package/dist/finding-remediation/eve-tool.mjs.map +1 -0
- package/dist/findings/fingerprint.d.mts +14 -0
- package/dist/findings/fingerprint.mjs +28 -0
- package/dist/findings/fingerprint.mjs.map +1 -0
- package/dist/findings.d.mts +7 -0
- package/dist/findings.mjs +6 -0
- package/dist/github-app.d.mts +54 -0
- package/dist/github-app.mjs +121 -0
- package/dist/github-app.mjs.map +1 -0
- package/dist/github-publication.d.mts +199 -0
- package/dist/github-publication.mjs +442 -0
- package/dist/github-publication.mjs.map +1 -0
- package/dist/github-transfer.d.mts +81 -0
- package/dist/github-transfer.mjs +273 -0
- package/dist/github-transfer.mjs.map +1 -0
- package/dist/github.d.mts +446 -2
- package/dist/github.mjs +357 -56
- package/dist/github.mjs.map +1 -1
- package/dist/image-input.d.mts +51 -0
- package/dist/image-input.mjs +63 -0
- package/dist/image-input.mjs.map +1 -0
- package/dist/inbox-activity.d.mts +53 -0
- package/dist/inbox-activity.mjs +41 -0
- package/dist/inbox-activity.mjs.map +1 -0
- package/dist/index.d.mts +16 -484
- package/dist/index.mjs +15 -522
- package/dist/intake-contracts.d.mts +55 -0
- package/dist/intake-contracts.mjs +33 -0
- package/dist/intake-contracts.mjs.map +1 -0
- package/dist/integrations/deepsec.d.mts +5 -0
- package/dist/integrations/deepsec.mjs +3 -0
- package/dist/integrations/github.d.mts +11 -0
- package/dist/integrations/github.mjs +9 -0
- package/dist/integrations/slack.d.mts +5 -0
- package/dist/integrations/slack.mjs +5 -0
- package/dist/integrations/vercel.d.mts +5 -0
- package/dist/integrations/vercel.mjs +4 -0
- package/dist/merge-resolution/contracts.d.mts +17 -0
- package/dist/merge-resolution/contracts.mjs +19 -0
- package/dist/merge-resolution/contracts.mjs.map +1 -0
- package/dist/merge-resolution/eve-tools.d.mts +47 -0
- package/dist/merge-resolution/eve-tools.mjs +122 -0
- package/dist/merge-resolution/eve-tools.mjs.map +1 -0
- package/dist/model-settings.d.mts +41 -0
- package/dist/model-settings.mjs +35 -0
- package/dist/model-settings.mjs.map +1 -0
- package/dist/multi-repository-changes/coordination.d.mts +49 -0
- package/dist/multi-repository-changes/coordination.mjs +115 -0
- package/dist/multi-repository-changes/coordination.mjs.map +1 -0
- package/dist/planning/cancellation.mjs +82 -0
- package/dist/planning/cancellation.mjs.map +1 -0
- package/dist/planning/configuration.d.mts +23 -0
- package/dist/planning/configuration.mjs +56 -0
- package/dist/planning/configuration.mjs.map +1 -0
- package/dist/planning/contracts.d.mts +136 -0
- package/dist/planning/contracts.mjs +42 -0
- package/dist/planning/contracts.mjs.map +1 -0
- package/dist/planning/dependencies.mjs +44 -0
- package/dist/planning/dependencies.mjs.map +1 -0
- package/dist/planning/effects.mjs +122 -0
- package/dist/planning/effects.mjs.map +1 -0
- package/dist/planning/reconcile.mjs +279 -0
- package/dist/planning/reconcile.mjs.map +1 -0
- package/dist/planning/runtime.d.mts +27 -0
- package/dist/planning/runtime.mjs +25 -0
- package/dist/planning/runtime.mjs.map +1 -0
- package/dist/planning/state.mjs +92 -0
- package/dist/planning/state.mjs.map +1 -0
- package/dist/planning/turns.mjs +262 -0
- package/dist/planning/turns.mjs.map +1 -0
- package/dist/planning/validation.mjs +106 -0
- package/dist/planning/validation.mjs.map +1 -0
- package/dist/postgres/index.d.mts +48 -1
- package/dist/postgres/index.mjs +45 -3
- package/dist/postgres/index.mjs.map +1 -1
- package/dist/presets/software-development/approval.d.mts +14 -0
- package/dist/presets/software-development/approval.mjs +21 -0
- package/dist/presets/software-development/approval.mjs.map +1 -0
- package/dist/presets/software-development/deepsec-brief.d.mts +8 -0
- package/dist/presets/software-development/deepsec-brief.mjs +14 -0
- package/dist/presets/software-development/deepsec-brief.mjs.map +1 -0
- package/dist/presets/software-development/dispatch.d.mts +56 -0
- package/dist/presets/software-development/dispatch.mjs +67 -0
- package/dist/presets/software-development/dispatch.mjs.map +1 -0
- package/dist/presets/software-development/eve-delegation-policy.d.mts +7 -0
- package/dist/presets/software-development/eve-delegation-policy.mjs +34 -0
- package/dist/presets/software-development/eve-delegation-policy.mjs.map +1 -0
- package/dist/presets/software-development/eve.d.mts +18 -0
- package/dist/presets/software-development/eve.mjs +19 -0
- package/dist/presets/software-development/eve.mjs.map +1 -0
- package/dist/presets/software-development/finish-task-policy.d.mts +7 -0
- package/dist/presets/software-development/finish-task-policy.mjs +9 -0
- package/dist/presets/software-development/finish-task-policy.mjs.map +1 -0
- package/dist/presets/software-development/recovery.d.mts +32 -0
- package/dist/presets/software-development/recovery.mjs +120 -0
- package/dist/presets/software-development/recovery.mjs.map +1 -0
- package/dist/presets/software-development/task-communication.d.mts +24 -0
- package/dist/presets/software-development/task-communication.mjs +157 -0
- package/dist/presets/software-development/task-communication.mjs.map +1 -0
- package/dist/presets/software-development.d.mts +10 -0
- package/dist/presets/software-development.mjs +9 -0
- package/dist/pull-requests/contracts.d.mts +72 -0
- package/dist/pull-requests/eve-fetch.d.mts +57 -0
- package/dist/pull-requests/eve-fetch.mjs +151 -0
- package/dist/pull-requests/eve-fetch.mjs.map +1 -0
- package/dist/pull-requests/github-label-manager.d.mts +27 -0
- package/dist/pull-requests/github-label-manager.mjs +40 -0
- package/dist/pull-requests/github-label-manager.mjs.map +1 -0
- package/dist/pull-requests/github-publisher.d.mts +67 -0
- package/dist/pull-requests/github-publisher.mjs +405 -0
- package/dist/pull-requests/github-publisher.mjs.map +1 -0
- package/dist/pull-requests.d.mts +6 -0
- package/dist/pull-requests.mjs +4 -0
- package/dist/receipts.d.mts +4 -0
- package/dist/receipts.mjs +3 -0
- package/dist/repositories.d.mts +18 -0
- package/dist/repositories.mjs +33 -0
- package/dist/repositories.mjs.map +1 -0
- package/dist/sandbox/command.d.mts +18 -0
- package/dist/sandbox/execution-abort.d.mts +16 -0
- package/dist/sandbox/execution-abort.mjs +49 -0
- package/dist/sandbox/execution-abort.mjs.map +1 -0
- package/dist/sandbox/execution-environment.d.mts +25 -0
- package/dist/sandbox/execution-run-ledger.d.mts +115 -0
- package/dist/sandbox/execution-run-ledger.mjs +209 -0
- package/dist/sandbox/execution-run-ledger.mjs.map +1 -0
- package/dist/sandbox/execution.d.mts +54 -0
- package/dist/sandbox/execution.mjs +228 -0
- package/dist/sandbox/execution.mjs.map +1 -0
- package/dist/sandbox/harness-runner.d.mts +79 -0
- package/dist/sandbox/harness-runner.mjs +162 -0
- package/dist/sandbox/harness-runner.mjs.map +1 -0
- package/dist/sandbox/index.d.mts +10 -0
- package/dist/sandbox/index.mjs +7 -0
- package/dist/sandbox/task-environment.d.mts +50 -0
- package/dist/sandbox/task-environment.mjs +140 -0
- package/dist/sandbox/task-environment.mjs.map +1 -0
- package/dist/sandbox/workspace.d.mts +29 -0
- package/dist/sandbox/workspace.mjs +28 -0
- package/dist/sandbox/workspace.mjs.map +1 -0
- package/dist/schema/agent-route.d.mts +40 -0
- package/dist/schema/agent-route.mjs +33 -0
- package/dist/schema/agent-route.mjs.map +1 -0
- package/dist/schema/answer.d.mts +23 -0
- package/dist/schema/answer.mjs +21 -0
- package/dist/schema/answer.mjs.map +1 -0
- package/dist/schema/budget.d.mts +38 -0
- package/dist/schema/budget.mjs +30 -0
- package/dist/schema/budget.mjs.map +1 -0
- package/dist/schema/catalog.mjs +72 -0
- package/dist/schema/catalog.mjs.map +1 -0
- package/dist/schema/change.d.mts +117 -0
- package/dist/schema/change.mjs +68 -0
- package/dist/schema/change.mjs.map +1 -0
- package/dist/schema/common.d.mts +33 -0
- package/dist/{id-BLIkCVue.mjs → schema/common.mjs} +7 -16
- package/dist/schema/common.mjs.map +1 -0
- package/dist/schema/communication.d.mts +52 -0
- package/dist/{communication-Kd9nU5RP.mjs → schema/communication.mjs} +8 -3
- package/dist/schema/communication.mjs.map +1 -0
- package/dist/schema/execution.d.mts +101 -0
- package/dist/schema/execution.mjs +86 -0
- package/dist/schema/execution.mjs.map +1 -0
- package/dist/schema/factory-config.d.mts +122 -0
- package/dist/schema/factory-config.mjs +90 -0
- package/dist/schema/factory-config.mjs.map +1 -0
- package/dist/schema/finding.d.mts +125 -0
- package/dist/schema/finding.mjs +67 -0
- package/dist/schema/finding.mjs.map +1 -0
- package/dist/schema/id.d.mts +43 -0
- package/dist/schema/id.mjs +32 -0
- package/dist/schema/id.mjs.map +1 -0
- package/dist/schema/outbox.d.mts +240 -0
- package/dist/schema/outbox.mjs +53 -0
- package/dist/schema/outbox.mjs.map +1 -0
- package/dist/schema/question-route.mjs +16 -0
- package/dist/schema/question-route.mjs.map +1 -0
- package/dist/schema/receipt.d.mts +81 -0
- package/dist/schema/receipt.mjs +94 -0
- package/dist/schema/receipt.mjs.map +1 -0
- package/dist/schema/repository.d.mts +30 -0
- package/dist/schema/repository.mjs +29 -0
- package/dist/schema/repository.mjs.map +1 -0
- package/dist/schema/session.d.mts +136 -0
- package/dist/schema/session.mjs +54 -0
- package/dist/schema/session.mjs.map +1 -0
- package/dist/schema/signal.d.mts +105 -0
- package/dist/schema/signal.mjs +81 -0
- package/dist/schema/signal.mjs.map +1 -0
- package/dist/schema/slack-pr-notifications.d.mts +12 -0
- package/dist/schema/slack-pr-notifications.mjs +11 -0
- package/dist/schema/slack-pr-notifications.mjs.map +1 -0
- package/dist/schema/stored-session.mjs +10 -0
- package/dist/schema/stored-session.mjs.map +1 -0
- package/dist/schema/stored-task.mjs +20 -0
- package/dist/schema/stored-task.mjs.map +1 -0
- package/dist/schema/task-effect.d.mts +39 -0
- package/dist/schema/task-effect.mjs +29 -0
- package/dist/schema/task-effect.mjs.map +1 -0
- package/dist/schema/task-graph.d.mts +3173 -0
- package/dist/schema/task-graph.mjs +97 -0
- package/dist/schema/task-graph.mjs.map +1 -0
- package/dist/schema/task-message.d.mts +254 -0
- package/dist/schema/task-message.mjs +189 -0
- package/dist/schema/task-message.mjs.map +1 -0
- package/dist/schema/task.d.mts +273 -0
- package/dist/schema/task.mjs +200 -0
- package/dist/schema/task.mjs.map +1 -0
- package/dist/schema/transcript.d.mts +176 -0
- package/dist/schema/transcript.mjs +87 -0
- package/dist/schema/transcript.mjs.map +1 -0
- package/dist/schema/transitions.d.mts +50 -0
- package/dist/schema/transitions.mjs +303 -0
- package/dist/schema/transitions.mjs.map +1 -0
- package/dist/schema/work.d.mts +150 -0
- package/dist/schema/work.mjs +102 -0
- package/dist/schema/work.mjs.map +1 -0
- package/dist/session-previews.d.mts +76 -0
- package/dist/session-previews.mjs +55 -0
- package/dist/session-previews.mjs.map +1 -0
- package/dist/session-review.d.mts +120 -0
- package/dist/session-review.mjs +79 -0
- package/dist/session-review.mjs.map +1 -0
- package/dist/signal-triage.d.mts +20 -0
- package/dist/signal-triage.mjs +85 -0
- package/dist/signal-triage.mjs.map +1 -0
- package/dist/signals.d.mts +20 -0
- package/dist/signals.mjs +19 -0
- package/dist/signals.mjs.map +1 -0
- package/dist/stall.d.mts +41 -0
- package/dist/stall.mjs +83 -0
- package/dist/stall.mjs.map +1 -0
- package/dist/storage.d.mts +4 -0
- package/dist/storage.mjs +4 -0
- package/dist/store/driver.d.mts +65 -0
- package/dist/store/driver.mjs +42 -0
- package/dist/store/driver.mjs.map +1 -0
- package/dist/store/engine.d.mts +683 -0
- package/dist/store/engine.mjs +2309 -0
- package/dist/store/engine.mjs.map +1 -0
- package/dist/store/memory.d.mts +24 -0
- package/dist/store/memory.mjs +69 -0
- package/dist/store/memory.mjs.map +1 -0
- package/dist/store/slack-pr-notifications.d.mts +44 -0
- package/dist/store/slack-pr-notifications.mjs +121 -0
- package/dist/store/slack-pr-notifications.mjs.map +1 -0
- package/dist/store/task-effects.d.mts +38 -0
- package/dist/store/task-effects.mjs +118 -0
- package/dist/store/task-effects.mjs.map +1 -0
- package/dist/store/task-graphs.d.mts +60 -0
- package/dist/store/task-graphs.mjs +212 -0
- package/dist/store/task-graphs.mjs.map +1 -0
- package/dist/store/task-messages.d.mts +136 -0
- package/dist/store/task-messages.mjs +475 -0
- package/dist/store/task-messages.mjs.map +1 -0
- package/dist/store/task-work.d.mts +180 -0
- package/dist/store/task-work.mjs +137 -0
- package/dist/store/task-work.mjs.map +1 -0
- package/dist/store/work-notifications.d.mts +19 -0
- package/dist/store/work-notifications.mjs +48 -0
- package/dist/store/work-notifications.mjs.map +1 -0
- package/dist/sweep.d.mts +79 -0
- package/dist/sweep.mjs +171 -0
- package/dist/sweep.mjs.map +1 -0
- package/dist/task-communication.d.mts +35 -0
- package/dist/task-communication.mjs +47 -0
- package/dist/task-communication.mjs.map +1 -0
- package/dist/task-graph-view.d.mts +267 -0
- package/dist/task-graph-view.mjs +17 -0
- package/dist/task-graph-view.mjs.map +1 -0
- package/dist/task-message-processing.d.mts +60 -0
- package/dist/task-message-processing.mjs +200 -0
- package/dist/task-message-processing.mjs.map +1 -0
- package/dist/task-protocols.d.mts +80 -0
- package/dist/task-protocols.mjs +47 -0
- package/dist/task-protocols.mjs.map +1 -0
- package/dist/tasks.d.mts +17 -0
- package/dist/tasks.mjs +17 -0
- package/dist/vercel-git.d.mts +53 -0
- package/dist/vercel-git.mjs +344 -0
- package/dist/vercel-git.mjs.map +1 -0
- package/dist/vercel-github-api.d.mts +103 -0
- package/dist/vercel-github-api.mjs +363 -0
- package/dist/vercel-github-api.mjs.map +1 -0
- package/dist/vercel.d.mts +34 -2
- package/dist/vercel.mjs +49 -3
- package/dist/vercel.mjs.map +1 -1
- package/dist/work-triage/eve-tool.d.mts +29 -0
- package/dist/work-triage/eve-tool.mjs +32 -0
- package/dist/work-triage/eve-tool.mjs.map +1 -0
- package/dist/work-triage/find-existing-work.d.mts +32 -0
- package/dist/work-triage/find-existing-work.mjs +31 -0
- package/dist/work-triage/find-existing-work.mjs.map +1 -0
- package/dist/work-triage/github.d.mts +15 -0
- package/dist/work-triage/github.mjs +14 -0
- package/dist/work-triage/github.mjs.map +1 -0
- package/dist/work-triage.d.mts +4 -0
- package/dist/work-triage.mjs +3 -0
- package/dist/workflows.d.mts +146 -0
- package/dist/workflows.mjs +139 -0
- package/dist/workflows.mjs.map +1 -0
- package/dist/workspace-diff-assembly.d.mts +33 -0
- package/dist/workspace-diff-assembly.mjs +95 -0
- package/dist/workspace-diff-assembly.mjs.map +1 -0
- package/dist/workspace-diff.d.mts +90 -0
- package/dist/workspace-diff.mjs +61 -0
- package/dist/workspace-diff.mjs.map +1 -0
- package/dist/workspace-files-git.d.mts +15 -0
- package/dist/workspace-files-git.mjs +61 -0
- package/dist/workspace-files-git.mjs.map +1 -0
- package/dist/workspace-files.d.mts +107 -0
- package/dist/workspace-files.mjs +74 -0
- package/dist/workspace-files.mjs.map +1 -0
- package/dist/workspace-snapshot.d.mts +26 -0
- package/dist/workspace-snapshot.mjs +80 -0
- package/dist/workspace-snapshot.mjs.map +1 -0
- package/docs/getting-started.md +104 -0
- package/docs/index.md +100 -0
- package/docs/recipes/cancellation.md +215 -0
- package/docs/recipes/custom-workflow.md +153 -0
- package/docs/recipes/dependent-tasks.md +207 -0
- package/docs/recipes/eve-agent.md +277 -0
- package/docs/recipes/human-input.md +204 -0
- package/docs/recipes/persistence-recovery.md +268 -0
- package/docs/recipes/retry-recovery.md +241 -0
- package/docs/recipes/task-messaging.md +215 -0
- package/docs/recipes/typed-eve-result.md +161 -0
- package/docs/runtime-integration.md +137 -0
- package/package.json +142 -46
- package/dist/approval-JX2Px9IC.mjs +0 -132
- package/dist/approval-JX2Px9IC.mjs.map +0 -1
- package/dist/budget-DzSiIA4t.mjs +0 -42
- package/dist/budget-DzSiIA4t.mjs.map +0 -1
- package/dist/change-D2U6v7Ek.mjs +0 -554
- package/dist/change-D2U6v7Ek.mjs.map +0 -1
- package/dist/communication-Kd9nU5RP.mjs.map +0 -1
- package/dist/coordination-Cq08hb1l.mjs +0 -76
- package/dist/coordination-Cq08hb1l.mjs.map +0 -1
- package/dist/dispatch-BaZS3PT8.d.mts +0 -76
- package/dist/driver-BC0Mt5KG.d.mts +0 -34
- package/dist/driver-Bbd25rNM.mjs +0 -23
- package/dist/driver-Bbd25rNM.mjs.map +0 -1
- package/dist/engine-DFHU2Pe-.d.mts +0 -781
- package/dist/engine-WaUM2cGA.mjs +0 -1068
- package/dist/engine-WaUM2cGA.mjs.map +0 -1
- package/dist/factory-config-BoRXOw43.mjs +0 -50
- package/dist/factory-config-BoRXOw43.mjs.map +0 -1
- package/dist/factory-config-D2yU3G0c.d.mts +0 -58
- package/dist/github-C5HNBN6p.d.mts +0 -279
- package/dist/id-BLIkCVue.mjs.map +0 -1
- package/dist/index-Bw6hggoH.d.mts +0 -40
- package/dist/index.mjs.map +0 -1
- package/dist/task-CcOyOJ3k.mjs +0 -154
- package/dist/task-CcOyOJ3k.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.mjs","names":[],"sources":["../../src/store/engine.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { z, type ZodType } from \"zod\";\nimport { defaultTaskWorkflow, defineWorkflows, type WorkflowRegistry } from \"../workflows\";\nimport { parseAgentRouteBinding, routeTaskWork } from \"../agent-routes\";\nimport { jsonValueSchema, taskWorkSchema } from \"../schema/work\";\nimport { defineTaskMessageProtocols, type TaskMessageProtocols } from \"../schema/task-message\";\nimport {\n createTaskMessageStore,\n type TaskMessageAuthorize,\n type TaskMessageStore,\n} from \"./task-messages\";\nimport { createTaskGraphStore, type TaskGraphStore } from \"./task-graphs\";\nimport { createTaskEffectStore, type TaskEffectStore } from \"./task-effects\";\nimport { taskGraphDependenciesSchema } from \"../schema/task-graph\";\nimport { createTaskWorkStore, type TaskWorkStore } from \"./task-work\";\nimport { createWorkNotifier, type WorkNotifications } from \"./work-notifications\";\nimport {\n imageAttachmentSchema,\n imageAttachmentsSchema,\n imageUploadSchema,\n imageIdSchema,\n type ImageAttachment,\n type ImageId,\n} from \"../image-input\";\nimport { answerEventSchema, type AnswerEvent } from \"../schema/answer\";\nimport {\n agentSessionIdSchema,\n agentSessionSchema,\n type AgentSession,\n type AgentSessionId,\n} from \"../schema/session\";\nimport { externalSessionSchema, storedSessionSchema } from \"../schema/stored-session\";\nimport {\n SCHEMA_VERSION,\n replyToSchema,\n usdSchema,\n type IsoDateTimeClock,\n type ReplyTo,\n} from \"../schema/common\";\nimport { communicationEventSchema, type CommunicationEvent } from \"../schema/communication\";\nimport {\n answerIdSchema,\n changeIdSchema,\n outboxIdSchema,\n repositoryIdsSchema,\n taskIdSchema,\n type AnswerId,\n type ChangeId,\n type FactoryId,\n type OutboxId,\n type ReceiptId,\n type RepositoryId,\n type RepositoryIds,\n type SignalId,\n type TaskId,\n} from \"../schema/id\";\nimport { budgetSchema, type Budget, type BudgetMonth } from \"../schema/budget\";\nimport {\n changeSchema,\n type Change,\n type ChangeInState,\n type ChangeState,\n type ChangeLevel,\n} from \"../schema/change\";\nimport { outboxMessageSchema, outboxQueueSchema, type OutboxMessage } from \"../schema/outbox\";\nimport {\n changeCatalogSchema,\n sessionCatalogSchema,\n externalSessionCatalogSchema,\n taskCatalogSchema,\n taskRouteSchema,\n} from \"../schema/catalog\";\nimport { storedTaskSchema } from \"../schema/stored-task\";\nimport { transcriptSnapshotSchema, type TranscriptSnapshot } from \"../schema/transcript\";\nimport { questionRouteSchema } from \"../schema/question-route\";\nimport {\n costSchema,\n receiptSchema,\n type Cost,\n type Receipt,\n type ReceiptDelivery,\n type ReceiptKind,\n type ReceiptPhase,\n type ReceiptState,\n type StandardReceiptKind,\n type StandardReceiptPhase,\n type StandardReceiptState,\n} from \"../schema/receipt\";\nimport { repositorySchema, type Repository } from \"../schema/repository\";\nimport {\n signalSchema,\n type SignalTriage,\n type Signal,\n type SignalOutcome,\n type SignalSource,\n} from \"../schema/signal\";\nimport {\n taskSchema,\n taskKindSchema,\n taskOriginSchema,\n taskQuestionSchema,\n type ExecutionReference,\n type Task,\n type TaskOrigin,\n type TaskQuestion,\n type TaskState,\n type TaskUsage,\n} from \"../schema/task\";\nimport {\n assertTransition,\n changeInitialState,\n changeTransitions,\n InvalidTransitionError,\n legalNextStates,\n signalOutcomeTransitions,\n signalTriageTransitions,\n taskInitialState,\n taskTransitions,\n} from \"../schema/transitions\";\nimport {\n RecordExistsError,\n RecordNotFoundError,\n TransientStoreError,\n VersionConflictError,\n type CollectionName,\n type StoreDriver,\n} from \"./driver\";\n\nconst storedImageSchema = imageAttachmentSchema\n .extend({\n schemaVersion: z.literal(SCHEMA_VERSION).describe(\"Stored image schema version.\"),\n owner: z.string().min(1).describe(\"Authenticated image owner.\"),\n base64: imageUploadSchema.shape.base64,\n createdAt: z.iso.datetime().describe(\"Image creation time.\"),\n })\n .refine((image) => {\n const bytes = Buffer.from(image.base64, \"base64\");\n if (bytes.length !== image.size || bytes.toString(\"base64\") !== image.base64) return false;\n if (image.mediaType === \"image/png\")\n return (\n bytes.length >= 24 &&\n bytes.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]))\n );\n if (image.mediaType === \"image/jpeg\")\n return bytes.length >= 4 && bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255;\n return (\n bytes.length >= 16 &&\n bytes.toString(\"ascii\", 0, 4) === \"RIFF\" &&\n bytes.toString(\"ascii\", 8, 12) === \"WEBP\"\n );\n }, \"Image bytes do not match the declared PNG, JPEG, or WebP format\");\ntype StoredImage = z.infer<typeof storedImageSchema>;\nconst storedTranscriptSchema = z.object({\n schemaVersion: z.literal(SCHEMA_VERSION),\n execution: z.object({ provider: z.string().min(1), sessionId: z.string().min(1) }),\n snapshot: transcriptSnapshotSchema,\n updatedAt: z.iso.datetime(),\n});\n/** Error raised when uploaded image bytes, ownership, or attachment metadata is invalid. */\nexport class ImageInputError extends Error {}\n\n/** An approval decision that does not apply to the task's current approval or state. */\nexport class ApprovalError extends Error {\n readonly taskId: TaskId;\n readonly reason: string;\n\n constructor(taskId: TaskId, reason: string) {\n super(`approval decision on \"${taskId}\" refused: ${reason}`);\n this.name = \"ApprovalError\";\n this.taskId = taskId;\n this.reason = reason;\n }\n}\n\n/** A settlement that does not apply to the task's current state. */\nexport class SettlementError extends Error {\n readonly taskId: TaskId;\n readonly reason: string;\n\n constructor(taskId: TaskId, reason: string) {\n super(`settlement on \"${taskId}\" refused: ${reason}`);\n this.name = \"SettlementError\";\n this.taskId = taskId;\n this.reason = reason;\n }\n}\n\n/** Error raised when a Task is not authorized to create or update a requested Change. */\nexport class ChangeAssociationError extends Error {\n readonly taskId: TaskId;\n readonly repositoryId: RepositoryId;\n readonly reason: string;\n\n constructor(taskId: TaskId, repositoryId: RepositoryId, reason: string) {\n super(`change for task \"${taskId}\" refused: ${reason}`);\n this.name = \"ChangeAssociationError\";\n this.taskId = taskId;\n this.repositoryId = repositoryId;\n this.reason = reason;\n }\n}\n\n/** Error raised when a stable outbox event ID is reused with different content. */\nexport class OutboxEventConflictError extends Error {\n constructor(eventId: string) {\n super(`outbox event \"${eventId}\" was reused with different content`);\n this.name = \"OutboxEventConflictError\";\n }\n}\n\n/** Error raised when a QuestionTask already has a different immutable answer event. */\nexport class AnswerEventConflictError extends Error {\n constructor(questionTaskId: TaskId) {\n super(`question \"${questionTaskId}\" already has a different answer event`);\n this.name = \"AnswerEventConflictError\";\n }\n}\n\n/** Normalized, authenticated input required to persist one inbound Signal. */\nexport interface CreateSignalInput {\n repositoryId: RepositoryId;\n source: SignalSource;\n deliveryId: string;\n replyTo: ReplyTo;\n payload: unknown;\n}\n\n/** Outcome and optional human-readable context for one Signal decision. */\nexport interface DecideSignalInput {\n readonly outcome: SignalOutcome;\n readonly detail?: string;\n readonly reason?: string;\n}\n\ninterface CreateTaskInputBase {\n /** Repository authorization scope; children must remain within their parent's scope. */\n repositoryIds: RepositoryIds;\n /** Descriptive work vocabulary; routing comes only from `work.route`. */\n kind: Task[\"kind\"];\n /** Destination for lifecycle communication produced by this Task. */\n replyTo: ReplyTo;\n /** Same key under the same parent creates one Task and returns its current snapshot on retries. */\n dedupeKey?: string;\n /** Optional application-owned grouping label. */\n area?: string;\n /** Optional associated software Change. */\n changeId?: ChangeId;\n /** Stamp the task as needing a human decision before dispatch. */\n approval?: \"required\";\n /** Required explicit versioned workflow contract. */\n work: Task[\"work\"];\n /** Graph prerequisites that must succeed before this Task can run. */\n dependencies?: readonly TaskId[];\n}\n\n/** Provenance required when admitting a root Task with no parent to inherit from. */\nexport type RootTaskOrigin =\n | {\n /** Durable inbound Signal that caused the root work. */\n signalId: SignalId;\n /** Authenticated operator additionally associated with the work. */\n operator?: string;\n }\n | {\n /** Optional inbound Signal additionally associated with operator-created work. */\n signalId?: SignalId;\n /** Authenticated operator that caused the root work. */\n operator: string;\n };\n\n/** Explicit work, graph placement, provenance, and policy input for Task admission. */\nexport type CreateTaskInput = CreateTaskInputBase &\n (\n | {\n origin: RootTaskOrigin;\n parentTaskId?: never;\n parentTaskAttempt?: never;\n question?: TaskQuestion;\n }\n | ({ origin: TaskOrigin; parentTaskId: TaskId } & (\n | { question?: undefined; parentTaskAttempt?: never }\n | { question: TaskQuestion; parentTaskAttempt?: number }\n ))\n );\n\nconst createTaskInputSchema = z.strictObject({\n repositoryIds: repositoryIdsSchema,\n kind: taskKindSchema,\n origin: taskOriginSchema,\n replyTo: replyToSchema,\n dedupeKey: z\n .string()\n .min(1)\n .refine((key) => key.trim().length > 0)\n .optional()\n .describe(\"Stable key for retryable task admission; omitted for one-shot creation.\"),\n area: z.string().min(1).optional(),\n changeId: changeIdSchema.optional(),\n question: taskQuestionSchema.optional(),\n approval: z.literal(\"required\").optional().describe(\"Require approval before execution.\"),\n work: taskWorkSchema,\n parentTaskId: taskIdSchema.optional(),\n parentTaskAttempt: z.number().int().positive().optional(),\n dependencies: taskGraphDependenciesSchema.optional(),\n});\n\n/** Authenticated operator and optional rationale for an immutable approval decision. */\nexport interface ApprovalDecision {\n /** Authenticated operator making the decision. */\n by: string;\n reason?: string;\n}\n\n/** Authenticated operator and required rationale for denying a Task approval. */\nexport interface RejectionDecision {\n /** Authenticated operator making the decision. */\n by: string;\n /** Human-readable reason retained on the immutable rejection receipt. */\n reason: string;\n}\n\n/** Authenticated answer submitted for one open QuestionTask. */\nexport interface AnswerQuestionInput {\n questionTaskId: TaskId;\n answer: string;\n answeredBy: string;\n}\n\n/** Persisted answer and affected question/parent Tasks after answering a question. */\nexport interface AnswerQuestionResult {\n readonly answerEvent: AnswerEvent;\n readonly questionTask: Task;\n readonly parentTask: Task | null;\n}\n\n/** Exclusive binding of a Factory interaction to a Task or provider execution. */\nexport type AgentSessionBinding =\n | { taskId: TaskId; execution?: never }\n | { execution: ExecutionReference; taskId?: never };\n\n/** Continuation Task, prompt context, and optional images cached on one Agent Session. */\nexport interface CacheContinuationContextInput {\n readonly taskId: TaskId;\n readonly context: string;\n readonly attachments?: readonly ImageAttachment[];\n}\n\n// settledUsd is deliberately excluded: it is written only by tasks.settle,\n// which is receipt-first. Setting it through a transition patch would settle a\n// task with no receipt, so it is rejected at runtime as well as in the type.\n// usage is excluded likewise; only recordUsage writes it.\n/** Lifecycle-transition fields that may be changed without bypassing settlement or usage APIs. */\nexport type TaskPatch = Partial<\n Pick<Task, \"changeId\" | \"reportRef\" | \"reservedUsd\" | \"reservedAt\" | \"question\">\n>;\n\n/** One completed model step's usage, as eve's step.completed event carries it. */\nconst stepUsageSchema = z.strictObject({\n turnId: z.string().min(1).describe(\"Provider turn containing the completed step.\"),\n stepIndex: z.number().int().nonnegative().describe(\"Nonnegative index of the completed step.\"),\n costUsd: usdSchema.optional().describe(\"Measured cost for this step.\"),\n inputTokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe(\"Input tokens charged for this step.\"),\n outputTokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe(\"Output tokens charged for this step.\"),\n cacheReadTokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe(\"Cached input tokens read for this step.\"),\n cacheWriteTokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe(\"Input tokens written to cache for this step.\"),\n});\n/** Measured usage for one completed provider turn step, used for idempotent accounting. */\nexport type StepUsage = z.infer<typeof stepUsageSchema>;\n\n/** Attempt and provider execution that must still own a Task usage observation. */\nexport interface TaskExecutionFence {\n /** Current positive attempt that emitted the observation. */\n readonly attempt: number;\n /** Exact provider execution that emitted the observation. */\n readonly execution: ExecutionReference;\n}\n\n/** Error raised when a Task operation loses its exact-attempt concurrency fence. */\nexport class TaskAttemptConflictError extends Error {\n constructor(\n readonly taskId: TaskId,\n readonly actualAttempt: number,\n readonly expectedAttempt: number,\n ) {\n super(`task ${taskId} is on attempt ${actualAttempt}, not ${expectedAttempt}`);\n this.name = \"TaskAttemptConflictError\";\n }\n}\n\n/** Provider execution and optional attempt fence recorded on one running Task. */\nexport interface RecordTaskExecutionInput {\n /** Provider handle to persist for later inspection, cancellation, and callback fencing. */\n readonly execution: ExecutionReference;\n /** Current running attempt required at the write; identical replay is then a no-op while running. */\n readonly expectAttempt?: number;\n}\n\n/** One measured usage step and optional exact-execution fence for a Task. */\nexport interface RecordTaskUsageInput {\n /** Monotonic step observation to aggregate once per provider turn. */\n readonly step: StepUsage;\n /** Optional current-attempt and execution guard for provider-originated observations. */\n readonly fence?: TaskExecutionFence;\n}\n\ninterface TaskTransitionContext {\n patch?: TaskPatch;\n reason?: string;\n /** Classifies the transition receipt for lifecycle communication. */\n phase?: ReceiptPhase;\n /**\n * Refuse unless the task is in this state at write time. Closes\n * check-then-act races where the transition would also be legal from the\n * state a concurrent writer moved the task into.\n */\n expectFrom?: TaskState;\n /** Refuse late events from a previous execution attempt. */\n expectAttempt?: number;\n /** Refuse completion from a provider execution that has been replaced. */\n expectExecution?: ExecutionReference;\n /** Refuse cleanup or answers for a question that no longer blocks this task. */\n expectQuestionTaskId?: TaskId;\n}\n\n/** Destination-correlated data and concurrency fences for one Task transition. */\nexport type TaskTransitionOptions<To extends TaskState = TaskState> = To extends \"needs_human\"\n ? TaskTransitionContext & {\n /** Actionable description required whenever a Task enters needs_human. */\n needsHumanAction: string;\n /** Open child question required when the Task is not itself a QuestionTask. */\n questionTaskId?: TaskId;\n output?: never;\n reuseRecordedOutput?: never;\n }\n : To extends \"succeeded\"\n ? TaskTransitionContext &\n (\n | {\n /** Candidate output validated against the Task's exact workflow. */\n output: unknown;\n reuseRecordedOutput?: never;\n }\n | {\n output?: never;\n /** Explicitly finish with output already persisted by the work store. */\n reuseRecordedOutput: true;\n }\n ) & {\n needsHumanAction?: never;\n questionTaskId?: never;\n }\n : TaskTransitionContext & {\n output?: never;\n reuseRecordedOutput?: never;\n needsHumanAction?: never;\n questionTaskId?: never;\n };\n\n/** Argument tuple requiring destination-specific data only for constrained transitions. */\nexport type TaskTransitionArguments<To extends TaskState> = To extends \"needs_human\" | \"succeeded\"\n ? [options: TaskTransitionOptions<To>]\n : [options?: TaskTransitionOptions<To>];\n\n/** Pull-request identity, ownership, and initial trust evidence used to create a Change. */\nexport interface CreateChangeInput {\n repositoryId: RepositoryId;\n taskId?: TaskId;\n groupId?: TaskId;\n prNumber: number;\n prUrl: string;\n author: string;\n risk: ChangeLevel;\n confidence: ChangeLevel;\n evidence: Change[\"evidence\"];\n}\n\n/** Verification and merge fields that may accompany a legal Change transition. */\nexport type ChangePatch = Partial<\n Pick<Change, \"confidence\" | \"evidence\" | \"decidedBy\" | \"mergeSha\">\n>;\n\n/** Trust evidence update fenced to the complete observed Change snapshot. */\nexport interface UpdateChangeEvidenceInput {\n evidence: Change[\"evidence\"];\n confidence: ChangeLevel;\n expected: Change;\n}\n\ninterface ChangeTransitionContext {\n patch?: ChangePatch;\n reason?: string;\n}\n\n/** Destination-correlated patch and audit reason accompanying a Change transition. */\nexport type ChangeTransitionOptions<To extends ChangeState = ChangeState> = To extends \"merged\"\n ? Omit<ChangeTransitionContext, \"patch\"> & {\n /** The merge actor must be recorded when a Change first enters its merged lifecycle. */\n patch: ChangePatch & { decidedBy: string };\n }\n : ChangeTransitionContext;\n\n/** Argument tuple requiring merge attribution for the transition into merged. */\nexport type ChangeTransitionArguments<To extends ChangeState> = To extends \"merged\"\n ? [options: ChangeTransitionOptions<To>]\n : [options?: ChangeTransitionOptions<To>];\n\n/** Factory, month, and configured limits used to create or refresh a monthly Budget. */\nexport interface EnsureBudgetInput {\n factoryId: FactoryId;\n month: BudgetMonth;\n limits: Budget[\"limits\"];\n}\n\n/** Monthly Budget returned with whether this call durably stamped a notice. */\nexport interface BudgetNoticeStampResult {\n readonly budget: Budget;\n readonly stamped: boolean;\n}\n\n/** Measured cost and optional audit reason used to settle one terminal Task. */\nexport interface SettleTaskInput {\n /** Final measured Task cost, normalized to micro-dollar precision. */\n readonly cost: Cost;\n /** Optional audit context retained on the immutable settlement receipt. */\n readonly reason?: string;\n}\n\n/** Delivery attempt, failure reason, and retry delay for one outbox message. */\nexport interface RetryOutboxMessageInput {\n readonly attempt: number;\n readonly reason: string;\n readonly delayMs: number;\n}\n\ninterface AppendReceiptInputBase<State extends ReceiptState, Kind extends ReceiptKind> {\n repositoryIds: RepositoryIds;\n taskId?: TaskId;\n changeId?: ChangeId;\n kind: Kind;\n state: State;\n reason?: string;\n attempt?: number;\n execution?: ExecutionReference;\n /** Same key twice appends one receipt and returns the existing one. */\n dedupeKey?: string;\n}\n\ntype AppendReceiptCost<State extends ReceiptState> = State extends \"settled\"\n ? { cost: Cost }\n : { cost?: never };\n\ntype AppendReceiptDelivery<Phase extends ReceiptPhase | undefined> = Phase extends \"communication\"\n ? { phase: Phase; delivery?: ReceiptDelivery }\n : { phase?: Phase; delivery?: never };\n\ntype AppendReceiptDecision<\n Kind extends ReceiptKind,\n State extends ReceiptState,\n> = Kind extends \"change\"\n ? { decidedBy?: string }\n : State extends \"approved\" | \"rejected\"\n ? { decidedBy?: string }\n : { decidedBy?: never };\n\ntype AppendReceiptCallInput<\n State extends ReceiptState,\n Kind extends ReceiptKind,\n Phase extends ReceiptPhase | undefined,\n> = AppendReceiptInputBase<State, Kind> &\n AppendReceiptCost<State> &\n AppendReceiptDelivery<Phase> &\n AppendReceiptDecision<Kind, State>;\n\n/** Subject, event, cost, and deduplication input for appending immutable audit evidence. */\nexport type AppendReceiptInput<\n State extends ReceiptState = StandardReceiptState,\n Kind extends ReceiptKind = StandardReceiptKind,\n Phase extends ReceiptPhase | undefined =\n | StandardReceiptPhase\n | \"communication\"\n | \"workflow\"\n | undefined,\n> = State extends ReceiptState\n ? Kind extends ReceiptKind\n ? Phase extends ReceiptPhase | undefined\n ? AppendReceiptInputBase<State, Kind> &\n AppendReceiptCost<State> &\n AppendReceiptDelivery<Phase> &\n AppendReceiptDecision<Kind, State>\n : never\n : never\n : never;\n\n/** Error raised when an idempotent session operation conflicts with its original intent. */\nexport class SessionConflictError extends Error {}\n\nfunction sameStoredValue(left: unknown, right: unknown): boolean {\n // JSON persistence omits optional undefined fields; admission retries must compare the persisted representation.\n return isDeepStrictEqual(JSON.parse(JSON.stringify(left)), JSON.parse(JSON.stringify(right)));\n}\n\n/**\n * Whether an operator's answer matches one of the question's declared\n * closing options (trimmed, case-insensitive). The asker judged that these\n * exact replies mean no further attempt can help, so answering with one\n * resolves the parent task instead of requeuing it for identical retry.\n */\nfunction isClosingAnswer(closingOptions: readonly string[] | undefined, answer: string): boolean {\n if (closingOptions === undefined || closingOptions.length === 0) return false;\n const normalized = answer.trim().toLowerCase();\n return closingOptions.some((option) => option.trim().toLowerCase() === normalized);\n}\n\n/** Validating engine API for all canonical Factory state and auxiliary persistence. */\nexport interface FactoryStores {\n /** Name supplied by the configured persistence driver for diagnostics and health reporting. */\n driverName: string;\n /** Trusted workflow records bound to the same persistence backend as every validating store. */\n workflowRecords: Pick<StoreDriver, \"get\" | \"insert\" | \"update\">;\n /** Durable, task-scoped external-effect references and reconciliation stamps. */\n taskEffects: TaskEffectStore;\n /** Trusted workflow capabilities; application transports must authenticate and authorize callers. */\n graphs: TaskGraphStore;\n /** Validated, authorized Task-message operations; omitted protocols remain unavailable. */\n messages: TaskMessageStore;\n /** Workflow completion, message waiting, graph recovery, and usage aggregation operations. */\n work: TaskWorkStore;\n /** Materialized transcript snapshots keyed by exact provider execution. */\n transcripts: {\n get(execution: ExecutionReference): Promise<TranscriptSnapshot | null>;\n /** Persist only forward progress; safe to repeat from response-boundary hooks. */\n put(execution: ExecutionReference, snapshot: TranscriptSnapshot): Promise<TranscriptSnapshot>;\n };\n /** Owner-scoped image persistence and attachment validation. */\n images: {\n put(owner: string, input: z.infer<typeof imageUploadSchema>): Promise<ImageAttachment>;\n get(owner: string, id: ImageId): Promise<StoredImage | null>;\n validate(\n owner: string,\n attachments: readonly ImageAttachment[],\n ): Promise<readonly ImageAttachment[]>;\n };\n /** Durable operator-session admission, binding, continuation, and notification operations. */\n sessions: {\n /** Looks up an admitted session without recomputing defaults on a repeated operation. */\n getByOperation(owner: string, operationId: string): Promise<AgentSession | null>;\n create(\n input: Omit<\n AgentSession,\n | \"schemaVersion\"\n | \"id\"\n | \"createdAt\"\n | \"execution\"\n | \"taskId\"\n | \"notifications\"\n | \"attached\"\n | \"continuations\"\n | \"external\"\n > & { operationId: string },\n ): Promise<AgentSession>;\n attachTask(input: {\n owner: string;\n taskId: TaskId;\n agent: string;\n message: string;\n }): Promise<AgentSession>;\n attachConversation(input: {\n owner: string;\n agent: string;\n message: string;\n execution: ExecutionReference;\n external: NonNullable<AgentSession[\"external\"]>;\n createdAt?: string;\n }): Promise<AgentSession>;\n cacheContinuationContext(\n id: AgentSessionId,\n input: CacheContinuationContextInput,\n ): Promise<string>;\n continue(\n id: AgentSessionId,\n input: {\n operationId: string;\n parentTaskId: TaskId;\n agent: string;\n message: string;\n attachments?: readonly ImageAttachment[];\n },\n ): Promise<AgentSession>;\n get(id: AgentSessionId): Promise<AgentSession | null>;\n list(): Promise<readonly AgentSession[]>;\n /** Compact session snapshots from fixed shards for discovery; large cached continuation context is omitted. */\n summaries(): Promise<readonly AgentSession[]>;\n bind(id: AgentSessionId, reference: AgentSessionBinding): Promise<AgentSession>;\n notify(event: CommunicationEvent): Promise<void>;\n };\n /** Configured repository snapshots used for admission and routing. */\n repositories: {\n /** Atomically replaces model overrides when their observed revision still matches. */\n setModelDefaults(\n id: RepositoryId,\n input: { expectedRevision: number; agents: Readonly<Record<string, string>> },\n ): Promise<Repository>;\n put(repository: Repository): Promise<Repository>;\n get(id: RepositoryId): Promise<Repository | null>;\n list(): Promise<readonly Repository[]>;\n };\n /** External intake records and their explicit triage lifecycle. */\n signals: {\n create(input: CreateSignalInput): Promise<Signal>;\n get(id: SignalId): Promise<Signal | null>;\n /** Read a deterministic source/delivery record without scanning the Signal collection. */\n getByDelivery(input: Pick<CreateSignalInput, \"source\" | \"deliveryId\">): Promise<Signal | null>;\n beginTriage(id: SignalId, options: { expectedAttempt: number; by: string }): Promise<Signal>;\n updateTriage(\n id: SignalId,\n attempt: number,\n observation: Pick<SignalTriage, \"state\" | \"failure\" | \"sessionId\">,\n ): Promise<Signal>;\n decide(id: SignalId, input: DecideSignalInput): Promise<Signal>;\n list(): Promise<readonly Signal[]>;\n };\n /** Canonical Task lifecycle operations. */\n tasks: {\n /** Pins an application's model choice once, fencing the current attempt. */\n pinModel(id: TaskId, input: { attempt: number; model: string }): Promise<Task>;\n /**\n * Validates and durably admits a queued Task into its canonical graph.\n *\n * @remarks\n * Admission writes the immutable graph node before the mutable Task snapshot. A failure after\n * graph admission can therefore leave a repairable missing snapshot; call\n * `stores.work.recover(rootTaskId)` with the known root to restore it. The method returns only\n * after both admission and the canonical Task snapshot are durable.\n *\n * A `dedupeKey` derives a stable ID within the parent scope. An identical retry returns the\n * Task's current mutable snapshot, while changed immutable admission data is refused. Without\n * a key, every call creates a new Task.\n *\n * @param input - Explicit workflow work, scope, provenance, graph placement, and policy.\n * @returns The newly admitted Task, or the current snapshot selected by `dedupeKey`.\n * @throws When workflow input is invalid or its exact version is unregistered, parent or\n * dependency constraints fail, or a dedupe key conflicts with an earlier admission.\n */\n create(input: CreateTaskInput): Promise<Task>;\n /**\n * Returns the validated current Task snapshot without repairing a missing admitted snapshot.\n *\n * @param id - Exact Task ID to read.\n * @returns Current Task state, or `null` when its canonical snapshot is absent.\n */\n get(id: TaskId): Promise<Task | null>;\n findOpenQuestions(replyTo: ReplyTo): Promise<readonly Task[]>;\n /**\n * Performs one legal lifecycle transition with optional attempt, source-state, execution, and\n * question fences.\n *\n * @remarks\n * Lifecycle evidence is appended before the final Task-state write. A successful completion\n * first persists its validated `workResult`, then its receipt, then the terminal state. The\n * promise resolves only after the final Task snapshot is durable, but a rejected call may have\n * persisted prepared output or its idempotent receipt before a later write failed. Reread\n * canonical Task state before retrying, and retain the same fences so a late callback cannot\n * advance a replacement attempt or execution. Transitions that re-enter `queued`, and\n * `verifying` to `running`, increment the attempt and clear attempt-owned execution state.\n *\n * @param id - Exact Task to advance.\n * @param to - Legal destination state.\n * @param args - Destination data and optional concurrency fences.\n * @returns The durably updated Task snapshot.\n * @throws `InvalidTransitionError` for an illegal or stale source state,\n * `TaskAttemptConflictError` for a replaced attempt, or a persistence conflict when a\n * concurrent writer wins.\n */\n transition<To extends TaskState>(\n id: TaskId,\n to: To,\n ...args: TaskTransitionArguments<NoInfer<To>>\n ): Promise<Task>;\n /** Remove a receipt after its CommunicationEvent is durable in the outbox. */\n acknowledgeCommunication(id: TaskId, receiptId: ReceiptId): Promise<Task>;\n answerQuestion(input: AnswerQuestionInput): Promise<AnswerQuestionResult>;\n /** Grant a required approval. The task stays queued; dispatch may now take it. */\n approve(id: TaskId, decision: ApprovalDecision): Promise<Task>;\n /** Immutable human decision, addressed directly by Task ID. */\n approvalReceipt(id: TaskId): Promise<Receipt | null>;\n /** Deny a required approval. The task is cancelled with the reason. */\n reject(id: TaskId, decision: RejectionDecision): Promise<Task>;\n /**\n * Record the provider's handle on the running attempt's execution, so the\n * reconciler can inspect or cancel it.\n *\n * @remarks\n * The returned Task contains the durably recorded handle. Supply `expectAttempt` for launch\n * callbacks: while that attempt remains running, replaying the same handle is a no-op, while a\n * different handle or replaced attempt is refused. Terminal Tasks reject every binding call.\n * The engine retries bounded transient driver failures, but surfaces compare-and-swap\n * conflicts; callers should reread and reconcile rather than start an unkeyed replacement\n * execution.\n *\n * @param id - Exact running Task to bind.\n * @param input - Provider reference and recommended attempt fence.\n * @returns The Task containing the durable execution reference.\n * @throws When the Task is not running, the attempt or existing execution differs, or bounded\n * persistence retries are exhausted.\n */\n recordExecution(id: TaskId, input: RecordTaskExecutionInput): Promise<Task>;\n /**\n * Adds one provider step's measured usage without settling the Task.\n *\n * @remarks\n * Step indexes advance monotonically per `turnId`; replaying the recorded index or an earlier\n * one returns the current Task without charging it again. Use an execution fence for provider\n * callbacks. Version races are retried, transient storage failures are retried within bounded\n * limits, and new usage after settlement is refused so measured cost cannot silently diverge\n * from the immutable settlement receipt.\n *\n * @param id - Exact Task to charge.\n * @param input - Validated step observation and optional execution fence.\n * @returns The Task after aggregation, or unchanged when the step was already covered.\n */\n recordUsage(id: TaskId, input: RecordTaskUsageInput): Promise<Task>;\n /**\n * Records measured cost on a terminal Task using receipt-first persistence.\n *\n * @remarks\n * Cost is normalized to micro-dollar precision. The immutable receipt is written before the\n * Task snapshot, so retrying after an interrupted snapshot write adopts the receipt's original\n * cost. Once settled, every replay returns the unchanged Task even if a different cost is\n * supplied; callers must treat the first settlement as authoritative.\n *\n * @param id - Exact terminal Task to settle.\n * @param input - Final measured cost and optional audit reason.\n * @returns The Task with its authoritative `settledUsd` value.\n * @throws `SettlementError` when the Task is not terminal.\n */\n settle(id: TaskId, input: SettleTaskInput): Promise<Task>;\n /**\n * Stamp a QuestionTask and the parent it currently blocks after Slack delivery.\n * An attempt guard rejects confirmations from an earlier question episode.\n * Retrying repairs either stamp independently; persistence errors propagate.\n */\n recordNeedsHumanDelivery(\n id: TaskId,\n options?: { at?: string; attempt?: number },\n ): Promise<Task>;\n /** Tasks addressed to one connector or operator conversation without a collection scan. */\n forReplyTo(replyTo: ReplyTo): Promise<readonly Task[]>;\n list(): Promise<readonly Task[]>;\n };\n /** Canonical software Change admission and lifecycle operations. */\n changes: {\n create(input: CreateChangeInput): Promise<Change>;\n get(id: ChangeId): Promise<Change | null>;\n /** Save evidence without inventing a lifecycle transition; reject a changed snapshot. */\n updateEvidence(id: ChangeId, input: UpdateChangeEvidenceInput): Promise<Change>;\n transition<To extends ChangeState>(\n id: ChangeId,\n to: To,\n ...args: ChangeTransitionArguments<NoInfer<To>>\n ): Promise<ChangeInState<To>>;\n list(): Promise<readonly Change[]>;\n };\n /** Immutable audit evidence appended by engine and application policy. */\n receipts: {\n append<\n const State extends ReceiptState,\n const Kind extends ReceiptKind,\n const Phase extends ReceiptPhase | undefined = undefined,\n >(\n input: AppendReceiptCallInput<State, Kind, Phase> & {\n state: State;\n kind: Kind;\n phase?: Phase;\n },\n ): Promise<Receipt>;\n get(id: ReceiptId): Promise<Receipt | null>;\n list(): Promise<readonly Receipt[]>;\n };\n /** Monthly budget snapshots, limits, and once-only notification stamps. */\n budgets: {\n /**\n * Insert-once per month; refreshes limits when configuration changed and\n * preserves notices. Safe under concurrent sweeps.\n */\n ensure(input: EnsureBudgetInput): Promise<Budget>;\n get(month: BudgetMonth): Promise<Budget | null>;\n /**\n * Write-once notice stamp. `stamped` is false when the notice was already\n * set or a concurrent stamp won, so callers notify at most once.\n */\n stampNotice(\n month: BudgetMonth,\n notice: \"warning\" | \"exhausted\",\n ): Promise<BudgetNoticeStampResult>;\n };\n /** Immutable authenticated answers addressed by deterministic event ID. */\n answers: {\n get(id: AnswerId): Promise<AnswerEvent | null>;\n };\n /** Durable communication delivery queue with attempt-fenced leases. */\n outbox: {\n enqueue(event: CommunicationEvent): Promise<OutboxMessage>;\n get(id: OutboxId): Promise<OutboxMessage | null>;\n claim(id: OutboxId, leaseMs?: number): Promise<OutboxMessage | null>;\n retry(id: OutboxId, input: RetryOutboxMessageInput): Promise<OutboxMessage | null>;\n complete(id: OutboxId, attempt: number): Promise<OutboxMessage | null>;\n pending(limit?: number): Promise<readonly OutboxMessage[]>;\n };\n}\n\n/** Persistence, workflow, messaging, clock, and wakeup configuration for the Factory engine. */\nexport interface CreateStoresOptions {\n /** Persistence implementation. The engine owns validation and lifecycle policy above it. */\n driver: StoreDriver;\n /**\n * Optional post-commit wakeup transport. Delivery failure is reported through its `onError`\n * callback and never rolls back the canonical write.\n */\n workNotifications?: WorkNotifications;\n /** ISO timestamp source used for engine-owned records. Defaults to the current wall clock. */\n now?: IsoDateTimeClock;\n /**\n * Every workflow version that stored Tasks may reference. Omission registers only the generic\n * `task@1` workflow. A supplied registry replaces that default, so include `defaultTaskWorkflow`\n * when Factory tools or human-question flows may create generic work.\n */\n workflows?: WorkflowRegistry;\n /**\n * Versioned Task-message protocols and deny-by-default authorization. Omit when the runtime\n * does not use Task messages.\n */\n messages?: {\n /** Exact protocol versions accepted by this runtime. */\n protocols: TaskMessageProtocols;\n /** Trusted application policy applied to every message operation. */\n authorize: TaskMessageAuthorize;\n };\n}\n\nconst taskReceiptStates: Partial<Record<TaskState, ReceiptState>> = {\n queued: \"queued\",\n running: \"dispatched\",\n stalled: \"stalled\",\n succeeded: \"succeeded\",\n failed: \"failed\",\n needs_human: \"needs_human\",\n cancelled: \"cancelled\",\n};\n\nfunction needsLifecycleCommunication(\n task: Task,\n state: ReceiptState,\n phase: ReceiptPhase | undefined,\n): boolean {\n if (state === \"needs_human\") return task.question !== undefined;\n if (task.parentTaskId !== undefined) return false;\n if (state === \"dispatched\") return phase === \"retry\";\n if (state === \"failed\" || state === \"cancelled\") return true;\n if (state !== \"succeeded\") return false;\n return task.question === undefined;\n}\n\nconst changeReceiptStates: Partial<Record<ChangeState, ReceiptState>> = {\n verifying: \"verifying\",\n ready: \"ready\",\n merged: \"merged\",\n deployed: \"deployed\",\n rolled_out: \"rolled_out\",\n rolled_back: \"rolled_back\",\n};\n\nfunction randomId<const Prefix extends string>(prefix: Prefix): `${Prefix}_${string}` {\n return `${prefix}_${randomUUID().replaceAll(\"-\", \"\")}`;\n}\n\nfunction derivedId<const Prefix extends string>(\n prefix: Prefix,\n key: string,\n): `${Prefix}_${string}` {\n return `${prefix}_${createHash(\"sha256\").update(key).digest(\"hex\").slice(0, 32)}`;\n}\n\nfunction bumpsAttempt(from: TaskState, to: TaskState): boolean {\n return to === \"queued\" || (from === \"verifying\" && to === \"running\");\n}\n\nconst emptyUsage: TaskUsage = {\n costUsd: 0,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n steps: {},\n};\n\nconst unverifiedEvidence: Change[\"evidence\"] = {\n reproVerified: false,\n testsAdded: 0,\n checksGreen: false,\n attackPassed: false,\n scopeMatches: false,\n};\n\n// Integer micro-dollars, the precision settle stores, so many small steps cannot drift.\nfunction addUsd(a: number, b: number): number {\n return (Math.round(a * 1_000_000) + Math.round(b * 1_000_000)) / 1_000_000;\n}\n\n// recordUsage and recordExecution are called far more often than a task\n// transitions (once per model step, once per launch), so a Blob outage that\n// briefly returns 5xx/network errors should not immediately drop usage or\n// lose the execution handle a healthy running task needs. Bounded by both\n// attempts and total elapsed time so a real outage still surfaces as a\n// failure instead of hanging the caller (an eve event hook or dispatch\n// cycle) indefinitely. Version conflicts are a different, already-retried\n// concern and are left untouched by this helper.\nconst TRANSIENT_RETRY_ATTEMPTS = 5;\nconst TRANSIENT_RETRY_BASE_MS = 200;\nconst TRANSIENT_RETRY_MAX_TOTAL_MS = 10_000;\n\n/**\n * Backs off and returns the next attempt count, or rethrows `error` once\n * the bound (attempts or total elapsed time) is reached.\n */\nasync function nextTransientRetry(\n error: TransientStoreError,\n attempt: number,\n startedAt: number,\n): Promise<number> {\n const nextDelayMs = TRANSIENT_RETRY_BASE_MS * 2 ** attempt;\n if (\n attempt >= TRANSIENT_RETRY_ATTEMPTS - 1 ||\n Date.now() - startedAt + nextDelayMs > TRANSIENT_RETRY_MAX_TOTAL_MS\n ) {\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, nextDelayMs));\n return attempt + 1;\n}\n\n/**\n * Creates the validating Factory store engine over a deliberately policy-free driver.\n *\n * @remarks\n * The returned stores validate entities on read and write, enforce legal transitions and\n * compare-and-swap fences, and emit immutable receipts. Construct one configured instance per\n * runtime and share it with launchers, hooks, and tools. A custom workflow must be registered on\n * every process that may read its Tasks; omission is a configuration error rather than permission\n * to select a newer workflow version. Supplying `workflows` replaces the default registry, so\n * include `defaultTaskWorkflow` when generic `task@1` work, Factory tools, or human questions may\n * be created.\n *\n * Wakeups run after their source write commits. Notification failure therefore cannot roll the\n * mutation back; reconciliation must be able to rediscover canonical state.\n *\n * @param options - Persistence and exact workflow/message configuration for this runtime.\n * @returns The complete set of validating Factory stores backed by `options.driver`.\n * @see The version-matched `docs/getting-started.md` shipped with the package.\n *\n * @example\n * ```ts\n * import { createInMemoryDriver, createStores } from \"@vercel/factory/storage\";\n * import {\n * defaultTaskWorkflow,\n * defineWorkflow,\n * defineWorkflows,\n * } from \"@vercel/factory/workflows\";\n * import { z } from \"zod\";\n *\n * const greeting = defineWorkflow({\n * id: \"greeting\",\n * version: 1,\n * input: z.object({ name: z.string() }),\n * output: z.object({ message: z.string() }),\n * });\n * const stores = createStores({\n * driver: createInMemoryDriver(),\n * workflows: defineWorkflows([defaultTaskWorkflow, greeting]),\n * });\n * ```\n */\nexport function createStores(options: CreateStoresOptions): FactoryStores {\n const { driver } = options;\n const now = options.now ?? (() => new Date().toISOString());\n const workflows = options.workflows ?? defineWorkflows([defaultTaskWorkflow]);\n const notifications = createWorkNotifier(options.workNotifications);\n\n function validateTaskWork(task: Task): void {\n workflows.validateStoredInput(task.work.workflow, task.work.input);\n if (task.workResult !== undefined)\n workflows.validateStoredOutput(task.work.workflow, task.workResult.output);\n }\n\n async function read<T>(\n collection: CollectionName,\n id: string,\n schema: ZodType<T>,\n ): Promise<{ value: T; version: number } | null> {\n const record = await driver.get(collection, id);\n if (record === null) {\n return null;\n }\n const value = schema.parse(record.value);\n if (collection === \"tasks\") {\n const task = taskSchema.parse(value);\n if (task.id !== id) throw new Error(`Task ${id} does not match its storage key`);\n validateTaskWork(task);\n }\n return { value, version: record.version };\n }\n\n async function mustRead<T>(\n collection: CollectionName,\n id: string,\n schema: ZodType<T>,\n ): Promise<{ value: T; version: number }> {\n const record = await read(collection, id, schema);\n if (record === null) {\n throw new RecordNotFoundError(collection, id);\n }\n return record;\n }\n\n async function listAll<T>(collection: CollectionName, schema: ZodType<T>): Promise<T[]> {\n const entries = await driver.list(collection);\n return entries.map((entry) => schema.parse(entry.record.value));\n }\n\n async function forEachConcurrent<T>(\n values: readonly T[],\n limit: number,\n operation: (value: T) => Promise<void>,\n ): Promise<void> {\n let next = 0;\n await Promise.all(\n Array.from({ length: Math.min(limit, values.length) }, async () => {\n while (next < values.length) await operation(values[next++]!);\n }),\n );\n }\n\n const catalogShards = \"0123456789abcdef\".split(\"\");\n const shardFor = (id: string) => createHash(\"sha256\").update(id).digest(\"hex\")[0]!;\n\n function sessionSummary(session: AgentSession): AgentSession {\n return agentSessionSchema.parse({\n ...session,\n continuations: session.continuations?.map(\n ({ context: _context, ...continuation }) => continuation,\n ),\n });\n }\n\n async function projectCatalogEntry<T extends { id: string }>(\n collection: \"taskCatalogs\" | \"changeCatalogs\" | \"sessionCatalogs\" | \"externalSessionCatalogs\",\n prefix: \"tasks\" | \"changes\" | \"sessions\" | \"external-sessions\",\n schema:\n | typeof taskCatalogSchema\n | typeof changeCatalogSchema\n | typeof sessionCatalogSchema\n | typeof externalSessionCatalogSchema,\n value: T,\n sourceVersion: number,\n ): Promise<void> {\n const id = `${prefix}-${shardFor(value.id)}`;\n for (;;) {\n const existing = await driver.get(collection, id);\n const parsed = existing === null ? null : schema.parse(existing.value);\n const previous = parsed?.entries.find((entry) => entry.value.id === value.id);\n const repairs =\n parsed?.repairs.filter(\n (repair) => repair.id !== value.id || repair.sourceVersion > sourceVersion,\n ) ?? [];\n if (\n previous !== undefined &&\n previous.sourceVersion >= sourceVersion &&\n repairs.length === parsed?.repairs.length\n )\n return;\n const entries =\n previous !== undefined && previous.sourceVersion >= sourceVersion\n ? (parsed?.entries ?? [])\n : [\n ...(parsed?.entries.filter((entry) => entry.value.id !== value.id) ?? []),\n { sourceVersion, value },\n ];\n const next = schema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n entries,\n repairs,\n updatedAt: now(),\n });\n try {\n if (existing === null) await driver.insert({ collection, id, value: next });\n else\n await driver.update({ collection, id, value: next, expectedVersion: existing.version });\n return;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError))\n throw error;\n }\n }\n }\n\n const projectTaskCatalog = (value: Task, sourceVersion: number) =>\n projectCatalogEntry(\"taskCatalogs\", \"tasks\", taskCatalogSchema, value, sourceVersion);\n const projectChangeCatalog = (value: Change, sourceVersion: number) =>\n projectCatalogEntry(\"changeCatalogs\", \"changes\", changeCatalogSchema, value, sourceVersion);\n const projectSessionCatalog = (value: AgentSession, sourceVersion: number) =>\n projectCatalogEntry(\n \"sessionCatalogs\",\n \"sessions\",\n sessionCatalogSchema,\n sessionSummary(value),\n sourceVersion,\n );\n const projectExternalSessionCatalog = (value: AgentSession, sourceVersion: number) =>\n projectCatalogEntry(\n \"externalSessionCatalogs\",\n \"external-sessions\",\n externalSessionCatalogSchema,\n sessionSummary(value),\n sourceVersion,\n );\n\n async function markCatalogRepair(\n collection: \"taskCatalogs\" | \"changeCatalogs\" | \"sessionCatalogs\" | \"externalSessionCatalogs\",\n prefix: \"tasks\" | \"changes\" | \"sessions\" | \"external-sessions\",\n schema:\n | typeof taskCatalogSchema\n | typeof changeCatalogSchema\n | typeof sessionCatalogSchema\n | typeof externalSessionCatalogSchema,\n sourceId: string,\n sourceVersion: number,\n ): Promise<void> {\n const id = `${prefix}-${shardFor(sourceId)}`;\n for (;;) {\n const existing = await driver.get(collection, id);\n const parsed = existing === null ? null : schema.parse(existing.value);\n const previous = parsed?.repairs.find((repair) => repair.id === sourceId);\n if (previous !== undefined && previous.sourceVersion >= sourceVersion) return;\n const repairs = parsed?.repairs.filter((repair) => repair.id !== sourceId) ?? [];\n const next = schema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n entries: parsed?.entries ?? [],\n repairs: [...repairs, { id: sourceId, sourceVersion }],\n updatedAt: now(),\n });\n try {\n if (existing === null) await driver.insert({ collection, id, value: next });\n else\n await driver.update({ collection, id, value: next, expectedVersion: existing.version });\n return;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError))\n throw error;\n }\n }\n }\n\n const markTaskCatalogRepair = (id: TaskId, sourceVersion: number) =>\n markCatalogRepair(\"taskCatalogs\", \"tasks\", taskCatalogSchema, id, sourceVersion);\n const markChangeCatalogRepair = (id: ChangeId, sourceVersion: number) =>\n markCatalogRepair(\"changeCatalogs\", \"changes\", changeCatalogSchema, id, sourceVersion);\n const markSessionCatalogRepair = (id: string, sourceVersion: number) =>\n markCatalogRepair(\"sessionCatalogs\", \"sessions\", sessionCatalogSchema, id, sourceVersion);\n const markExternalSessionCatalogRepair = (id: string, sourceVersion: number) =>\n markCatalogRepair(\n \"externalSessionCatalogs\",\n \"external-sessions\",\n externalSessionCatalogSchema,\n id,\n sourceVersion,\n );\n\n async function projectTaskRoute(value: Task, sourceVersion: number): Promise<void> {\n if (value.replyTo.channel !== \"api\") return;\n const id = derivedId(\n \"task-route\",\n JSON.stringify([value.replyTo.channel, value.replyTo.address]),\n );\n for (;;) {\n const existing = await read(\"taskRoutes\", id, taskRouteSchema);\n const previous = existing?.value.entries.find((entry) => entry.value.id === value.id);\n const repairs =\n existing?.value.repairs.filter(\n (repair) => repair.id !== value.id || repair.sourceVersion > sourceVersion,\n ) ?? [];\n if (\n previous !== undefined &&\n previous.sourceVersion >= sourceVersion &&\n repairs.length === existing?.value.repairs.length\n )\n return;\n const entries =\n previous !== undefined && previous.sourceVersion >= sourceVersion\n ? (existing?.value.entries ?? [])\n : [\n ...(existing?.value.entries.filter((entry) => entry.value.id !== value.id) ?? []),\n { sourceVersion, value },\n ];\n const next = taskRouteSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n replyTo: value.replyTo,\n entries,\n repairs,\n updatedAt: now(),\n });\n try {\n if (existing === null) await driver.insert({ collection: \"taskRoutes\", id, value: next });\n else\n await driver.update({\n collection: \"taskRoutes\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError))\n throw error;\n }\n }\n }\n\n async function markTaskRouteRepair(value: Task, sourceVersion: number): Promise<void> {\n if (value.replyTo.channel !== \"api\") return;\n const id = derivedId(\n \"task-route\",\n JSON.stringify([value.replyTo.channel, value.replyTo.address]),\n );\n for (;;) {\n const existing = await read(\"taskRoutes\", id, taskRouteSchema);\n const previous = existing?.value.repairs.find((repair) => repair.id === value.id);\n if (previous !== undefined && previous.sourceVersion >= sourceVersion) return;\n const repairs = existing?.value.repairs.filter((repair) => repair.id !== value.id) ?? [];\n const next = taskRouteSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n replyTo: value.replyTo,\n entries: existing?.value.entries ?? [],\n repairs: [...repairs, { id: value.id, sourceVersion }],\n updatedAt: now(),\n });\n try {\n if (existing === null) await driver.insert({ collection: \"taskRoutes\", id, value: next });\n else\n await driver.update({\n collection: \"taskRoutes\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError))\n throw error;\n }\n }\n }\n\n async function prepareTaskProjection(value: Task, sourceVersion: number): Promise<void> {\n await Promise.all([\n markTaskCatalogRepair(value.id, sourceVersion),\n markTaskRouteRepair(value, sourceVersion),\n ]);\n }\n\n async function projectTask(value: Task, sourceVersion: number): Promise<void> {\n await Promise.all([\n projectTaskCatalog(value, sourceVersion),\n projectTaskRoute(value, sourceVersion),\n ]);\n }\n\n // Projection repair markers are durable before the canonical write. Once\n // that write commits, readers can overlay and repair its canonical value,\n // so a projection outage does not turn success into a client retry.\n async function projectSafely(project: () => Promise<void>): Promise<void> {\n try {\n await project();\n } catch {\n return;\n }\n }\n\n async function catalogValues<T extends { id: string }>(\n source: \"tasks\" | \"changes\" | \"sessions\" | \"externalSessions\",\n collection: \"taskCatalogs\" | \"changeCatalogs\" | \"sessionCatalogs\" | \"externalSessionCatalogs\",\n prefix: \"tasks\" | \"changes\" | \"sessions\" | \"external-sessions\",\n sourceSchema: ZodType<T>,\n catalogSchema:\n | typeof taskCatalogSchema\n | typeof changeCatalogSchema\n | typeof sessionCatalogSchema\n | typeof externalSessionCatalogSchema,\n project: (value: T, sourceVersion: number) => Promise<void>,\n fallbackValue: (value: T) => T = (value) => value,\n ): Promise<T[]> {\n let catalogs = await Promise.all(\n catalogShards.map((shard) => driver.get(collection, `${prefix}-${shard}`)),\n );\n if (catalogs.some((catalog) => catalog === null)) {\n const entries = await driver.list(source);\n const values = entries.map((entry) => fallbackValue(sourceSchema.parse(entry.record.value)));\n let projectionFailed = false;\n await forEachConcurrent(entries, 16, async (entry) => {\n try {\n await project(sourceSchema.parse(entry.record.value), entry.record.version);\n } catch {\n projectionFailed = true;\n }\n });\n if (!projectionFailed) {\n for (const shard of catalogShards) {\n const id = `${prefix}-${shard}`;\n if ((await driver.get(collection, id)) !== null) continue;\n const empty = catalogSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n entries: [],\n updatedAt: now(),\n });\n try {\n await driver.insert({ collection, id, value: empty });\n } catch (error) {\n if (!(error instanceof RecordExistsError)) projectionFailed = true;\n }\n }\n }\n if (projectionFailed) return values;\n catalogs = await Promise.all(\n catalogShards.map((shard) => driver.get(collection, `${prefix}-${shard}`)),\n );\n if (catalogs.some((catalog) => catalog === null)) return values;\n }\n const parsedCatalogs = catalogs.flatMap((catalog) =>\n catalog === null ? [] : [catalogSchema.parse(catalog.value)],\n );\n const values = new Map<string, T>();\n for (const catalog of parsedCatalogs) {\n for (const entry of catalog.entries) {\n const value = sourceSchema.parse(entry.value);\n values.set(value.id, value);\n }\n }\n const repairs = new Map<string, number>();\n for (const catalog of parsedCatalogs) {\n for (const repair of catalog.repairs) {\n repairs.set(repair.id, Math.max(repairs.get(repair.id) ?? 0, repair.sourceVersion));\n }\n }\n await forEachConcurrent([...repairs.keys()], 16, async (id) => {\n const record = await driver.get(source, id);\n if (record === null) {\n values.delete(id);\n return;\n }\n const canonical = sourceSchema.parse(record.value);\n values.set(id, fallbackValue(canonical));\n await projectSafely(() => project(canonical, record.version));\n });\n return [...values.values()];\n }\n\n async function updateTask(input: Task, expectedVersion: number): Promise<void> {\n const value = taskSchema.parse(input);\n validateTaskWork(value);\n const previous = options.workNotifications\n ? await mustRead(\"tasks\", value.id, storedTaskSchema)\n : null;\n await prepareTaskProjection(value, expectedVersion + 1);\n await driver.update({ collection: \"tasks\", id: value.id, value, expectedVersion });\n await projectSafely(() => projectTask(value, expectedVersion + 1));\n await notifications.task(value, previous?.value ?? null, expectedVersion + 1);\n }\n\n async function updateChange(value: Change, expectedVersion: number): Promise<void> {\n await markChangeCatalogRepair(value.id, expectedVersion + 1);\n await driver.update({ collection: \"changes\", id: value.id, value, expectedVersion });\n await projectSafely(() => projectChangeCatalog(value, expectedVersion + 1));\n }\n\n async function updateSession(value: AgentSession, expectedVersion: number): Promise<void> {\n await markSessionCatalogRepair(value.id, expectedVersion + 1);\n await driver.update({ collection: \"sessions\", id: value.id, value, expectedVersion });\n await projectSafely(() => projectSessionCatalog(value, expectedVersion + 1));\n }\n\n // Receipts are append-only and their inserts are idempotent: an existing id\n // returns the stored receipt instead of writing a second one. Transition\n // receipts use ids derived from their content key and are written before\n // the entity transition persists, so a failed write leaves the transition\n // unpersisted and a retry re-runs both.\n async function insertReceipt(\n receiptId: ReceiptId,\n receipt: Omit<Receipt, \"schemaVersion\" | \"receiptId\" | \"recordedAt\">,\n ): Promise<Receipt> {\n const reason = receipt.reason?.trim().slice(0, 2000) || undefined;\n const full = receiptSchema.parse({\n ...receipt,\n reason,\n schemaVersion: SCHEMA_VERSION,\n receiptId,\n recordedAt: now(),\n });\n try {\n await driver.insert({ collection: \"receipts\", id: receiptId, value: full });\n return full;\n } catch (error) {\n if (error instanceof RecordExistsError) {\n const existing = await mustRead(\"receipts\", receiptId, receiptSchema);\n return existing.value;\n }\n throw error;\n }\n }\n\n async function readApprovalReceipt(task: Task): Promise<Receipt | null> {\n const current = await read(\n \"receipts\",\n derivedId(\"rcpt\", `task:${task.id}:approval`),\n receiptSchema,\n );\n if (current) return current.value;\n return null;\n }\n\n async function decideApproval(\n id: TaskId,\n state: \"approved\" | \"rejected\",\n decision: ApprovalDecision | RejectionDecision,\n ): Promise<Task> {\n const by = z.string().trim().min(1).parse(decision.by);\n const reason =\n state === \"rejected\"\n ? z.string().trim().min(1).max(2000).parse(decision.reason)\n : decision.reason?.trim().slice(0, 2000) || undefined;\n const receiptId = derivedId(\"rcpt\", `task:${id}:approval`);\n for (;;) {\n const existing = await mustRead(\"tasks\", id, storedTaskSchema);\n const task = existing.value;\n const saved = await readApprovalReceipt(task);\n if (saved && (saved.state !== state || saved.decidedBy !== by || saved.reason !== reason)) {\n throw new ApprovalError(id, \"a different decision has already been recorded\");\n }\n const approval = state === \"approved\" ? \"granted\" : \"denied\";\n if (saved && task.approval === approval) {\n await projectSafely(() => projectTask(task, existing.version));\n return task;\n }\n if (task.approval !== \"required\")\n throw new ApprovalError(id, `approval is ${task.approval ?? \"not required\"}`);\n if (task.state !== \"queued\") throw new ApprovalError(id, `task is ${task.state}`);\n // A single immutable receipt arbitrates competing actors and opposite decisions before the Task projection.\n const receipt =\n saved ??\n (await insertReceipt(receiptId, {\n repositoryIds: task.repositoryIds,\n taskId: id,\n kind: task.kind,\n state,\n phase: \"approval\",\n reason,\n attempt: task.attempt,\n decidedBy: by,\n }));\n if (receipt.state !== state || receipt.decidedBy !== by || receipt.reason !== reason) {\n throw new ApprovalError(id, \"a different decision has already been recorded\");\n }\n if (state === \"rejected\") {\n assertTransition(taskTransitions, { from: task.state, to: \"cancelled\" });\n }\n let next = taskSchema.parse({\n ...task,\n approval,\n state: state === \"rejected\" ? \"cancelled\" : task.state,\n updatedAt: now(),\n });\n if (state === \"rejected\") {\n const cancelled = await appendReceipt(`task:${id}:cancelled:${task.attempt}`, {\n repositoryIds: task.repositoryIds,\n taskId: id,\n kind: task.kind,\n state: \"cancelled\",\n phase: \"approval\",\n reason: reason ?? `rejected by ${by}`,\n attempt: task.attempt,\n });\n if (needsLifecycleCommunication(next, \"cancelled\", \"approval\"))\n next = taskSchema.parse({\n ...next,\n pendingCommunicationReceiptIds: [\n ...new Set([...(next.pendingCommunicationReceiptIds ?? []), cancelled.receiptId]),\n ],\n });\n }\n try {\n await updateTask(next, existing.version);\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n }\n\n async function appendReceipt(\n key: string,\n receipt: Omit<Receipt, \"schemaVersion\" | \"receiptId\" | \"recordedAt\">,\n ): Promise<Receipt> {\n return insertReceipt(derivedId(\"rcpt\", key), receipt);\n }\n\n async function setQuestionRoute(\n replyTo: ReplyTo,\n questionTaskId: TaskId,\n present: boolean,\n ): Promise<void> {\n const id = derivedId(\"qroute\", JSON.stringify([replyTo.channel, replyTo.address]));\n for (;;) {\n const existing = await read(\"questionRoutes\", id, questionRouteSchema);\n const currentIds = existing?.value.questionTaskIds ?? [];\n const questionTaskIds = present\n ? [...new Set([...currentIds, questionTaskId])]\n : currentIds.filter((candidate) => candidate !== questionTaskId);\n if (existing !== null && questionTaskIds.length === existing.value.questionTaskIds.length) {\n return;\n }\n const next = questionRouteSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n replyTo,\n questionTaskIds,\n updatedAt: now(),\n });\n try {\n if (existing === null)\n await driver.insert({ collection: \"questionRoutes\", id, value: next });\n else\n await driver.update({\n collection: \"questionRoutes\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError)) {\n throw error;\n }\n }\n }\n }\n\n const stores: FactoryStores = {\n driverName: driver.name,\n workflowRecords: {\n get: driver.get.bind(driver),\n insert: driver.insert.bind(driver),\n update: driver.update.bind(driver),\n },\n taskEffects: createTaskEffectStore({\n driver,\n now,\n getTask: (id: TaskId) => stores.tasks.get(id),\n }),\n graphs: createTaskGraphStore({\n driver,\n now,\n getTask: (id) => stores.tasks.get(id),\n validateTask: validateTaskWork,\n notify: notifications.publish,\n }),\n messages: createTaskMessageStore({\n driver,\n now: () => new Date(now()),\n getTask: (id: TaskId) => stores.tasks.get(id),\n protocols: options.messages?.protocols ?? defineTaskMessageProtocols([]),\n authorize: options.messages?.authorize ?? (() => false),\n notify: notifications.publish,\n }),\n work: createTaskWorkStore({\n driver,\n now,\n stores: () => stores,\n workflows,\n update: async (task, version) => {\n await updateTask(task, version);\n },\n restore: async (task) => {\n validateTaskWork(task);\n await prepareTaskProjection(task, 1);\n try {\n await driver.insert({ collection: \"tasks\", id: task.id, value: task });\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n }\n const existing = await mustRead(\"tasks\", task.id, taskSchema);\n await projectSafely(() => projectTask(existing.value, existing.version));\n await notifications.task(existing.value, null, existing.version);\n return existing.value;\n },\n }),\n\n transcripts: {\n async get(execution) {\n const id = derivedId(\n \"transcript\",\n JSON.stringify([execution.provider, execution.sessionId]),\n );\n const record = await read(\"transcripts\", id, storedTranscriptSchema);\n if (record === null) return null;\n if (\n record.value.execution.provider !== execution.provider ||\n record.value.execution.sessionId !== execution.sessionId\n ) {\n throw new Error(\"Transcript execution key does not match its stored value\");\n }\n return record.value.snapshot;\n },\n async put(execution, value) {\n const snapshot = transcriptSnapshotSchema.parse(value);\n const id = derivedId(\n \"transcript\",\n JSON.stringify([execution.provider, execution.sessionId]),\n );\n for (;;) {\n const existing = await read(\"transcripts\", id, storedTranscriptSchema);\n if (existing !== null && existing.value.snapshot.cursor >= snapshot.cursor)\n return existing.value.snapshot;\n const next = storedTranscriptSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n execution,\n snapshot,\n updatedAt: now(),\n });\n try {\n if (existing === null)\n await driver.insert({ collection: \"transcripts\", id, value: next });\n else\n await driver.update({\n collection: \"transcripts\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return snapshot;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError))\n throw error;\n }\n }\n },\n },\n\n images: {\n async put(owner, input) {\n const parsed = imageUploadSchema.parse(input);\n const id = imageIdSchema.parse(\n `img_${createHash(\"sha256\")\n .update(JSON.stringify([owner, parsed.filename, parsed.mediaType, parsed.base64]))\n .digest(\"hex\")}`,\n );\n const image = storedImageSchema.parse({\n ...parsed,\n id,\n owner,\n schemaVersion: SCHEMA_VERSION,\n size: Buffer.from(parsed.base64, \"base64\").length,\n createdAt: now(),\n });\n try {\n await driver.insert({ collection: \"images\", id, value: image });\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n await stores.images.get(owner, id);\n }\n return imageAttachmentSchema.parse({\n id,\n filename: image.filename,\n mediaType: image.mediaType,\n size: image.size,\n });\n },\n async get(owner, id) {\n imageIdSchema.parse(id);\n const record = await driver.get(\"images\", id);\n if (!record) return null;\n const image = storedImageSchema.parse(record.value);\n return image.owner === owner ? image : null;\n },\n async validate(owner, attachments) {\n imageAttachmentsSchema.parse(attachments);\n return Promise.all(\n attachments.map(async (attachment) => {\n const image = await stores.images.get(owner, attachment.id);\n if (!image) throw new ImageInputError(\"Image is unavailable; upload it again\");\n const ref = {\n id: image.id,\n filename: image.filename,\n mediaType: image.mediaType,\n size: image.size,\n };\n if (!sameStoredValue(ref, attachment))\n throw new ImageInputError(\"Image metadata does not match the uploaded image\");\n return ref;\n }),\n );\n },\n },\n\n sessions: {\n async getByOperation(owner, operationId) {\n return stores.sessions.get(derivedId(\"ses\", JSON.stringify([owner, operationId])));\n },\n async create({ operationId, ...input }) {\n if (operationId.trim().length === 0 || operationId.length > 200)\n throw new Error(\"operationId must contain 1–200 characters\");\n const id = derivedId(\"ses\", JSON.stringify([input.owner, operationId]));\n const candidate = storedSessionSchema.parse({\n ...input,\n id,\n schemaVersion: SCHEMA_VERSION,\n createdAt: now(),\n });\n await stores.images.validate(input.owner, input.attachments ?? []);\n await markSessionCatalogRepair(candidate.id, 1);\n try {\n await driver.insert({ collection: \"sessions\", id, value: candidate });\n await projectSafely(() => projectSessionCatalog(candidate, 1));\n return candidate;\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n const record = await mustRead(\"sessions\", id, storedSessionSchema);\n await projectSafely(() => projectSessionCatalog(record.value, record.version));\n const existing = record.value;\n const {\n createdAt: _at,\n execution: _execution,\n taskId: _task,\n notifications: _notifications,\n continuations: _continuations,\n ...intent\n } = existing;\n const { createdAt: _newAt, notifications: _newNotifications, ...nextIntent } = candidate;\n if (!sameStoredValue(intent, nextIntent))\n throw new SessionConflictError(\"Session operationId was reused with different input\");\n return existing;\n }\n },\n async attachConversation(input) {\n const id = derivedId(\n \"ses\",\n JSON.stringify([\n \"conversation\",\n input.owner,\n input.execution.provider,\n input.execution.sessionId,\n ]),\n );\n const candidate = externalSessionSchema.parse({\n ...input,\n id,\n schemaVersion: SCHEMA_VERSION,\n createdAt: input.createdAt ?? now(),\n });\n await markExternalSessionCatalogRepair(id, 1);\n try {\n await driver.insert({ collection: \"externalSessions\", id, value: candidate });\n await projectSafely(() => projectExternalSessionCatalog(candidate, 1));\n return candidate;\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n const record = await mustRead(\"externalSessions\", id, externalSessionSchema);\n const existing = record.value;\n if (\n existing.owner !== candidate.owner ||\n existing.agent !== candidate.agent ||\n !sameStoredValue(existing.external, candidate.external) ||\n !sameStoredValue(existing.execution, candidate.execution)\n )\n throw new SessionConflictError(\"External conversation binding cannot be replaced\");\n await projectSafely(() => projectExternalSessionCatalog(existing, record.version));\n return existing;\n }\n },\n async attachTask(input) {\n const task = (await mustRead(\"tasks\", input.taskId, storedTaskSchema)).value;\n if (task.repositoryIds.length !== 1) {\n throw new SessionConflictError(\"Only single-repository tasks can be opened\");\n }\n if (task.replyTo.channel === \"api\") {\n const original = await stores.sessions.get(\n agentSessionIdSchema.parse(task.replyTo.address),\n );\n if (original?.owner !== input.owner)\n throw new SessionConflictError(\"Task belongs to another operator interaction\");\n const record = await mustRead(\"sessions\", original.id, storedSessionSchema);\n await projectSafely(() => projectSessionCatalog(record.value, record.version));\n return original;\n }\n if (task.work.route === undefined) {\n throw new SessionConflictError(\"Only tasks with an exact agent route can be opened\");\n }\n const id = derivedId(\"ses\", JSON.stringify([\"task\", input.owner, task.id]));\n const candidate = storedSessionSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n owner: input.owner,\n agent: input.agent,\n route: task.work.route,\n repositoryId: task.repositoryIds[0],\n message: input.message,\n taskId: task.id,\n attached: true,\n createdAt: task.createdAt,\n });\n await markSessionCatalogRepair(candidate.id, 1);\n try {\n await driver.insert({ collection: \"sessions\", id, value: candidate });\n await projectSafely(() => projectSessionCatalog(candidate, 1));\n return candidate;\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n const existing = await mustRead(\"sessions\", id, storedSessionSchema);\n await projectSafely(() => projectSessionCatalog(existing.value, existing.version));\n return existing.value;\n }\n },\n async cacheContinuationContext(id, input) {\n const { taskId, context, attachments } = input;\n for (;;) {\n const record = await mustRead(\"sessions\", id, storedSessionSchema);\n const continuation = record.value.continuations?.find((item) => item.taskId === taskId);\n if (!continuation)\n throw new SessionConflictError(\"Task is not a conversation continuation\");\n if (continuation.context !== undefined) return continuation.context;\n await stores.images.validate(record.value.owner, attachments ?? []);\n const next = storedSessionSchema.parse({\n ...record.value,\n continuations: record.value.continuations?.map((item) =>\n item.taskId === taskId\n ? {\n ...item,\n context,\n ...(attachments?.length ? { contextAttachments: attachments } : {}),\n }\n : item,\n ),\n });\n try {\n await updateSession(next, record.version);\n return context;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async continue(id, input) {\n if (input.operationId.trim().length === 0 || input.operationId.length > 200)\n throw new SessionConflictError(\"operationId must contain 1–200 characters\");\n const dedupeKey = `session:${id}:follow-up:${input.operationId}`;\n for (;;) {\n const record = await mustRead(\"sessions\", id, storedSessionSchema);\n const session = record.value;\n await stores.images.validate(session.owner, input.attachments ?? []);\n if (session.repositoryId === undefined || session.taskId === undefined)\n throw new SessionConflictError(\n \"Follow-up work requires a repository-bound task conversation\",\n );\n const parent = (await mustRead(\"tasks\", input.parentTaskId, storedTaskSchema)).value;\n if (\n parent.id !== session.taskId &&\n !(parent.replyTo.channel === \"api\" && parent.replyTo.address === id)\n )\n throw new SessionConflictError(\"Follow-up parent is outside this conversation\");\n if (parent.repositoryIds.length !== 1 || parent.repositoryIds[0] !== session.repositoryId)\n throw new SessionConflictError(\"Follow-up repository differs from its conversation\");\n const previous = session.continuations?.find(\n (item) => item.operationId === input.operationId,\n );\n if (\n previous !== undefined &&\n !sameStoredValue(\n {\n operationId: input.operationId,\n parentTaskId: input.parentTaskId,\n agent: input.agent,\n message: input.message,\n attachments: input.attachments ?? [],\n },\n {\n operationId: previous.operationId,\n parentTaskId: previous.parentTaskId,\n agent: previous.agent,\n message: previous.message,\n attachments: previous.attachments ?? [],\n },\n )\n )\n throw new SessionConflictError(\"Follow-up operationId was reused with different input\");\n const continuation = previous ?? {\n ...input,\n taskId: derivedId(\"task\", JSON.stringify([\"task\", parent.id, dedupeKey])),\n createdAt: now(),\n };\n let next: AgentSession = session;\n if (previous === undefined) {\n if (![\"succeeded\", \"failed\", \"cancelled\", \"verifying\"].includes(parent.state))\n throw new SessionConflictError(\n \"Wait for this task or answer its pending question before starting a follow-up\",\n );\n const latest = session.continuations?.at(-1);\n if (latest !== undefined && latest.taskId !== parent.id) {\n let ancestor: Task | null = parent;\n const visited = new Set<string>();\n while (ancestor && ancestor.id !== latest.taskId && !visited.has(ancestor.id)) {\n visited.add(ancestor.id);\n ancestor = ancestor.parentTaskId\n ? await stores.tasks.get(ancestor.parentTaskId)\n : null;\n }\n if (ancestor?.id !== latest.taskId)\n throw new SessionConflictError(\n \"Conversation changed; refresh before sending another follow-up\",\n );\n const latestTask = await stores.tasks.get(latest.taskId);\n if (\n latestTask === null ||\n ![\"succeeded\", \"failed\", \"cancelled\"].includes(latestTask.state)\n )\n throw new SessionConflictError(\n \"A follow-up is already being started; refresh the conversation\",\n );\n }\n next = storedSessionSchema.parse({\n ...session,\n continuations: [...(session.continuations ?? []), continuation],\n });\n try {\n await updateSession(next, record.version);\n } catch (error) {\n if (error instanceof VersionConflictError) continue;\n throw error;\n }\n }\n const replyTo = { channel: \"api\", address: id };\n const signal = await stores.signals.create({\n repositoryId: session.repositoryId,\n source: \"api\",\n deliveryId: dedupeKey,\n replyTo,\n payload: { message: continuation.message, parentTaskId: parent.id },\n });\n if (signal.outcome === \"pending\") {\n try {\n await stores.signals.decide(signal.id, {\n outcome: \"accepted\",\n ...{\n reason: `Follow-up requested by ${session.owner}`,\n },\n });\n } catch (error) {\n if (\n !(error instanceof VersionConflictError || error instanceof InvalidTransitionError)\n )\n throw error;\n }\n }\n await stores.tasks.create({\n repositoryIds: [session.repositoryId],\n kind: \"investigation\",\n area: \"conversation\",\n origin: { operator: session.owner, signalId: signal.id },\n parentTaskId: parent.id,\n work: routeTaskWork({\n route: parseAgentRouteBinding({ id: \"conversation\", version: 1 }),\n title: \"Conversation follow-up\",\n input: { message: continuation.message },\n }),\n replyTo,\n dedupeKey,\n changeId: parent.changeId,\n });\n return next;\n }\n },\n async get(id) {\n const records = (\n await Promise.all([\n read(\"sessions\", id, storedSessionSchema),\n read(\"externalSessions\", id, externalSessionSchema),\n ])\n ).filter((record) => record !== null);\n if (records.length > 1)\n throw new SessionConflictError(\"Session ID exists in multiple collections\");\n return records[0]?.value ?? null;\n },\n async list() {\n return (\n await Promise.all([\n listAll(\"sessions\", storedSessionSchema),\n listAll(\"externalSessions\", externalSessionSchema),\n ])\n ).flat();\n },\n async summaries() {\n return (\n await Promise.all([\n catalogValues(\n \"sessions\",\n \"sessionCatalogs\",\n \"sessions\",\n storedSessionSchema,\n sessionCatalogSchema,\n projectSessionCatalog,\n sessionSummary,\n ),\n catalogValues(\n \"externalSessions\",\n \"externalSessionCatalogs\",\n \"external-sessions\",\n externalSessionSchema,\n externalSessionCatalogSchema,\n projectExternalSessionCatalog,\n sessionSummary,\n ),\n ])\n ).flat();\n },\n async bind(id, reference) {\n const external = await read(\"externalSessions\", id, externalSessionSchema);\n if (external) {\n if (\n !(\"execution\" in reference) ||\n !sameStoredValue(external.value.execution, reference.execution)\n )\n throw new SessionConflictError(\"Session execution binding cannot be replaced\");\n await projectSafely(() =>\n projectExternalSessionCatalog(external.value, external.version),\n );\n return external.value;\n }\n for (;;) {\n const existing = await mustRead(\"sessions\", id, storedSessionSchema);\n if (reference.taskId !== undefined) {\n const task = (await mustRead(\"tasks\", reference.taskId, storedTaskSchema)).value;\n if (\n task.origin.operator !== existing.value.owner ||\n task.replyTo.channel !== \"api\" ||\n task.replyTo.address !== id ||\n task.repositoryIds[0] !== existing.value.repositoryId\n ) {\n throw new SessionConflictError(\"Task does not belong to this session\");\n }\n }\n const previous =\n existing.value.taskId === undefined\n ? existing.value.execution === undefined\n ? undefined\n : { execution: existing.value.execution }\n : { taskId: existing.value.taskId };\n if (previous !== undefined) {\n if (!sameStoredValue(previous, reference))\n throw new SessionConflictError(\"Session execution binding cannot be replaced\");\n await projectSafely(() => projectSessionCatalog(existing.value, existing.version));\n return existing.value;\n }\n const next = storedSessionSchema.parse({ ...existing.value, ...reference });\n try {\n await updateSession(next, existing.version);\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async notify(input) {\n const event = communicationEventSchema.parse(input);\n if (event.replyTo.channel !== \"api\")\n throw new SessionConflictError(\"Expected an API notification\");\n for (;;) {\n const record = await mustRead(\"sessions\", event.replyTo.address, storedSessionSchema);\n const existing = record.value.notifications.find(\n (item) => item.eventId === event.eventId,\n );\n if (existing !== undefined) {\n if (!sameStoredValue(existing, event))\n throw new SessionConflictError(\"Notification eventId was reused\");\n return;\n }\n const next = storedSessionSchema.parse({\n ...record.value,\n notifications: [...record.value.notifications, event],\n });\n try {\n await updateSession(next, record.version);\n return;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n },\n\n repositories: {\n async setModelDefaults(id, input) {\n const existing = await mustRead(\"repositories\", id, repositorySchema);\n if ((existing.value.modelDefaults?.revision ?? 0) !== input.expectedRevision)\n throw new VersionConflictError(\"repositories\", id, existing.version);\n const next = repositorySchema.parse({\n ...existing.value,\n modelDefaults: { revision: input.expectedRevision + 1, agents: input.agents },\n });\n await driver.update({\n collection: \"repositories\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return next;\n },\n async put(repository) {\n let parsed = repositorySchema.parse(repository);\n const existing = await read(\"repositories\", parsed.id, repositorySchema);\n if (existing === null) {\n await driver.insert({ collection: \"repositories\", id: parsed.id, value: parsed });\n } else {\n parsed = repositorySchema.parse({\n ...parsed,\n modelDefaults: existing.value.modelDefaults,\n });\n await driver.update({\n collection: \"repositories\",\n id: parsed.id,\n value: parsed,\n expectedVersion: existing.version,\n });\n }\n return parsed;\n },\n async get(id) {\n const record = await read(\"repositories\", id, repositorySchema);\n return record === null ? null : record.value;\n },\n list() {\n return listAll(\"repositories\", repositorySchema);\n },\n },\n\n signals: {\n async create(input) {\n const id = derivedId(\"sig\", `${input.source}:${input.deliveryId}`);\n const signal = signalSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n repositoryId: input.repositoryId,\n source: input.source,\n deliveryId: input.deliveryId,\n replyTo: input.replyTo,\n payload: input.payload,\n receivedAt: now(),\n outcome: \"pending\",\n });\n try {\n await driver.insert({ collection: \"signals\", id, value: signal });\n return signal;\n } catch (error) {\n if (error instanceof RecordExistsError) {\n const existing = await mustRead(\"signals\", id, signalSchema);\n return existing.value;\n }\n throw error;\n }\n },\n async get(id) {\n const record = await read(\"signals\", id, signalSchema);\n return record === null ? null : record.value;\n },\n async getByDelivery({ source, deliveryId }) {\n return stores.signals.get(derivedId(\"sig\", `${source}:${deliveryId}`));\n },\n async beginTriage(id, options) {\n const existing = await mustRead(\"signals\", id, signalSchema);\n const current = existing.value;\n if (\n current.outcome !== \"pending\" ||\n (current.triage?.attempt ?? 0) !== options.expectedAttempt\n ) {\n throw new VersionConflictError(\"signals\", id, existing.version);\n }\n if (current.triage)\n assertTransition(signalTriageTransitions, { from: current.triage.state, to: \"running\" });\n const timestamp = now();\n const next = signalSchema.parse({\n ...current,\n triage: {\n attempt: options.expectedAttempt + 1,\n state: \"running\",\n by: options.by,\n startedAt: timestamp,\n updatedAt: timestamp,\n },\n });\n await driver.update({\n collection: \"signals\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return next;\n },\n async updateTriage(id, attempt, observation) {\n for (let retry = 0; retry < 5; retry++) {\n const existing = await mustRead(\"signals\", id, signalSchema);\n const current = existing.value;\n const triage = current.triage;\n if (\n current.outcome !== \"pending\" ||\n triage?.attempt !== attempt ||\n triage.state === \"blocked\"\n )\n return current;\n if (\n triage.sessionId &&\n observation.sessionId &&\n triage.sessionId !== observation.sessionId\n )\n return current;\n if (triage.state !== observation.state)\n assertTransition(signalTriageTransitions, {\n from: triage.state,\n to: observation.state,\n });\n const next = signalSchema.parse({\n ...current,\n triage: {\n ...triage,\n ...observation,\n sessionId: observation.sessionId ?? triage.sessionId,\n updatedAt: now(),\n },\n });\n try {\n await driver.update({\n collection: \"signals\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError) || retry === 4) throw error;\n }\n }\n throw new Error(\"Triage update retries exhausted\");\n },\n async decide(id, input) {\n const { outcome, detail, reason } = input;\n const existing = await mustRead(\"signals\", id, signalSchema);\n assertTransition(signalOutcomeTransitions, {\n from: existing.value.outcome,\n to: outcome,\n });\n const next = signalSchema.parse({\n ...existing.value,\n outcome,\n detail,\n reason,\n decidedAt: now(),\n });\n await driver.update({\n collection: \"signals\",\n id,\n value: next,\n expectedVersion: existing.version,\n });\n return next;\n },\n list() {\n return listAll(\"signals\", signalSchema);\n },\n },\n\n tasks: {\n async pinModel(id, input) {\n for (let retry = 0; retry < 5; retry++) {\n const existing = await mustRead(\"tasks\", id, storedTaskSchema);\n if (existing.value.attempt !== input.attempt)\n throw new Error(\"Cannot select a model for a replaced Task attempt\");\n if (existing.value.model !== undefined) {\n if (existing.value.model !== input.model)\n throw new Error(\"Task model cannot be replaced\");\n return existing.value;\n }\n if (![\"queued\", \"running\"].includes(existing.value.state))\n throw new Error(\"Select a model before work completes or waits\");\n const next = taskSchema.parse({ ...existing.value, model: input.model });\n try {\n await updateTask(next, existing.version);\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError) || retry === 4) throw error;\n }\n }\n throw new Error(\"Task model selection conflicted repeatedly\");\n },\n async create(value) {\n const input = createTaskInputSchema.parse(value);\n const timestamp = now();\n const id =\n input.dedupeKey === undefined\n ? randomId(\"task\")\n : derivedId(\n \"task\",\n JSON.stringify([\"task\", input.parentTaskId ?? null, input.dedupeKey]),\n );\n const parsedWork = structuredClone(taskWorkSchema.parse(input.work));\n const work = {\n ...parsedWork,\n input: workflows.validateInput(parsedWork.workflow, parsedWork.input),\n };\n const parent =\n input.parentTaskId === undefined ? null : await stores.tasks.get(input.parentTaskId);\n if (input.parentTaskId !== undefined && parent === null) {\n throw new Error(\"Child Tasks require an existing parent\");\n }\n if (\n input.parentTaskAttempt !== undefined &&\n (parent === null ||\n input.question === undefined ||\n input.parentTaskAttempt !== parent.attempt)\n ) {\n throw new Error(\"Child questions must bind the current parent execution attempt\");\n }\n const origin = taskOriginSchema.parse(input.origin);\n let task = taskSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n repositoryIds: input.repositoryIds,\n kind: input.kind,\n area: input.area,\n state: taskInitialState,\n approval: input.approval,\n origin:\n origin.signalId === undefined && origin.operator === undefined && parent\n ? parent.origin\n : origin,\n work,\n rootTaskId: parent?.rootTaskId ?? id,\n parentTaskId: input.parentTaskId,\n parentTaskAttempt: input.question === undefined ? undefined : parent?.attempt,\n replyTo: input.replyTo,\n attempt: 1,\n question: input.question,\n changeId: input.changeId,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n validateTaskWork(task);\n await stores.graphs.admit({ task, dependencies: input.dependencies });\n const graph = await stores.graphs.get(task.rootTaskId);\n const admission = graph?.nodes.find((node) => node.taskId === id)?.admission;\n if (admission === undefined) throw new Error(`Task ${id} has no durable graph admission`);\n task = admission;\n await prepareTaskProjection(task, 1);\n try {\n await driver.insert({ collection: \"tasks\", id: task.id, value: task });\n await projectSafely(() => projectTask(task, 1));\n await notifications.task(task, null, 1);\n return task;\n } catch (error) {\n if (input.dedupeKey !== undefined && error instanceof RecordExistsError) {\n const existing = await mustRead(\"tasks\", task.id, storedTaskSchema);\n await projectSafely(() => projectTask(existing.value, existing.version));\n await notifications.task(existing.value, null, existing.version);\n return existing.value;\n }\n throw error;\n }\n },\n approve: (id, decision) => decideApproval(id, \"approved\", decision),\n reject: (id, decision) => decideApproval(id, \"rejected\", decision),\n async approvalReceipt(id) {\n return readApprovalReceipt((await mustRead(\"tasks\", id, storedTaskSchema)).value);\n },\n async recordExecution(id, input) {\n const { execution, expectAttempt } = input;\n // A transient Blob failure (5xx, network error) on either the read\n // or the write is retried here, bounded by attempts and elapsed\n // time: this is the only durable record of a running attempt's\n // execution handle, so losing it to a blip lets the reconciler\n // treat a healthy running task as unreachable. Version conflicts\n // are a different concern and are not retried here, unchanged.\n const startedAt = Date.now();\n for (let retries = 0; ;) {\n try {\n const existing = await mustRead(\"tasks\", id, storedTaskSchema);\n const task = existing.value;\n if (task.state !== \"running\") {\n throw new InvalidTransitionError(\n task.state,\n \"running\",\n legalNextStates(taskTransitions, task.state),\n );\n }\n if (expectAttempt !== undefined && task.attempt !== expectAttempt) {\n throw new TaskAttemptConflictError(id, task.attempt, expectAttempt);\n }\n if (expectAttempt !== undefined && task.execution) {\n if (!sameStoredValue(task.execution, execution))\n throw new Error(\n `Task ${id} already has a different execution for attempt ${expectAttempt}`,\n );\n return task;\n }\n const timestamp = now();\n const next = taskSchema.parse({\n ...task,\n execution,\n lastProgressAt: timestamp,\n updatedAt: timestamp,\n });\n await updateTask(next, existing.version);\n return next;\n } catch (error) {\n if (!(error instanceof TransientStoreError)) throw error;\n retries = await nextTransientRetry(error, retries, startedAt);\n }\n }\n },\n async recordUsage(id, input) {\n const step = stepUsageSchema.parse(input.step);\n const { fence } = input;\n // A version conflict means another writer bumped the row, not that\n // this step was counted; retry until the mark shows it or we land.\n // A transient Blob failure (5xx, network error) is retried too, but\n // bounded by attempts and elapsed time so a real outage surfaces as\n // a failure instead of spinning forever; it does not change the\n // unbounded version-conflict retry above.\n const startedAt = Date.now();\n let transientAttempt = 0;\n for (;;) {\n let existing;\n try {\n existing = await mustRead(\"tasks\", id, storedTaskSchema);\n } catch (error) {\n if (!(error instanceof TransientStoreError)) throw error;\n transientAttempt = await nextTransientRetry(error, transientAttempt, startedAt);\n continue;\n }\n const task = existing.value;\n if (\n fence &&\n (task.attempt !== fence.attempt || !sameStoredValue(task.execution, fence.execution))\n ) {\n throw new Error(`Usage for task ${id} belongs to a replaced execution`);\n }\n const usage = task.usage ?? emptyUsage;\n const recordedIndex = Object.hasOwn(usage.steps, step.turnId)\n ? usage.steps[step.turnId]\n : undefined;\n if (\n task.settledUsd !== undefined &&\n (recordedIndex === undefined || step.stepIndex > recordedIndex)\n ) {\n throw new SettlementError(\n id,\n \"task is already settled; new usage cannot be silently added\",\n );\n }\n if (recordedIndex !== undefined && step.stepIndex <= recordedIndex) {\n await projectSafely(() => projectTask(task, existing.version));\n return task;\n }\n const timestamp = now();\n const next = taskSchema.parse({\n ...task,\n lastProgressAt: timestamp,\n usage: {\n costUsd: addUsd(usage.costUsd, step.costUsd ?? 0),\n inputTokens: usage.inputTokens + (step.inputTokens ?? 0),\n outputTokens: usage.outputTokens + (step.outputTokens ?? 0),\n cacheReadTokens: usage.cacheReadTokens + (step.cacheReadTokens ?? 0),\n cacheWriteTokens: usage.cacheWriteTokens + (step.cacheWriteTokens ?? 0),\n steps: { ...usage.steps, [step.turnId]: step.stepIndex },\n },\n updatedAt: timestamp,\n });\n try {\n await updateTask(next, existing.version);\n return next;\n } catch (error) {\n if (error instanceof VersionConflictError) {\n continue;\n }\n if (error instanceof TransientStoreError) {\n transientAttempt = await nextTransientRetry(error, transientAttempt, startedAt);\n continue;\n }\n throw error;\n }\n }\n },\n async settle(id, input) {\n const existing = await mustRead(\"tasks\", id, storedTaskSchema);\n const task = existing.value;\n if (task.settledUsd !== undefined) {\n await projectSafely(() => projectTask(task, existing.version));\n return task;\n }\n if (task.state !== \"succeeded\" && task.state !== \"failed\" && task.state !== \"cancelled\") {\n throw new SettlementError(id, `task is ${task.state}, not terminal`);\n }\n // Validate before normalizing: arithmetic would coerce null or a\n // negative amount into a valid-looking zero, so the schema check must\n // see the raw input first. Then round to the ledger's micro-dollar\n // precision so the receipt and settledUsd carry the same value.\n const validated = costSchema.parse(input.cost);\n const normalized = { totalUsd: Math.round(validated.totalUsd * 1_000_000) / 1_000_000 };\n // The receipt is written first, keyed by task and attempt (not by\n // cost), and is immutable, so it is the authority: a retry after a\n // lost task write (a measured settlement, then the zero-settle sweep)\n // finds the first receipt and records THAT cost, keeping receipt and\n // settledUsd in agreement.\n let recorded = normalized;\n if (task.repositoryIds !== undefined) {\n const receipt = await appendReceipt(`task:${id}:settled:${task.attempt}`, {\n repositoryIds: task.repositoryIds,\n taskId: id,\n changeId: task.changeId,\n kind: task.kind,\n state: \"settled\",\n phase: \"budget\",\n reason: input.reason,\n attempt: task.attempt,\n cost: normalized,\n });\n recorded = receipt.cost ?? normalized;\n }\n const next = taskSchema.parse({ ...task, settledUsd: recorded.totalUsd, updatedAt: now() });\n await updateTask(next, existing.version);\n return next;\n },\n async get(id) {\n const record = await read(\"tasks\", id, storedTaskSchema);\n return record === null ? null : record.value;\n },\n async findOpenQuestions(replyTo) {\n const id = derivedId(\"qroute\", JSON.stringify([replyTo.channel, replyTo.address]));\n const route = await read(\"questionRoutes\", id, questionRouteSchema);\n if (route === null) return [];\n const questions = await Promise.all(\n route.value.questionTaskIds.map((taskId) => stores.tasks.get(taskId)),\n );\n const openQuestions = questions.filter(\n (task): task is Task =>\n task !== null &&\n task.question !== undefined &&\n task.state === \"needs_human\" &&\n task.replyTo.channel === replyTo.channel &&\n task.replyTo.address === replyTo.address,\n );\n const openIds = new Set(openQuestions.map((task) => task.id));\n for (const taskId of route.value.questionTaskIds) {\n if (!openIds.has(taskId)) {\n await setQuestionRoute(replyTo, taskId, false);\n }\n }\n return openQuestions;\n },\n async answerQuestion(input) {\n const question = await mustRead(\"tasks\", input.questionTaskId, storedTaskSchema);\n if (question.value.question === undefined) {\n throw new Error(`task ${input.questionTaskId} is not a question`);\n }\n if (question.value.state !== \"needs_human\" && question.value.state !== \"succeeded\") {\n throw new Error(\n `question task ${input.questionTaskId} is ${question.value.state}, not waiting`,\n );\n }\n const questionDetails = question.value.question;\n const id = answerIdSchema.parse(derivedId(\"ans\", input.questionTaskId));\n const candidate = answerEventSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n questionTaskId: input.questionTaskId,\n parentTaskId: question.value.parentTaskId,\n repositoryIds: question.value.repositoryIds,\n replyTo: question.value.replyTo,\n question: questionDetails.text,\n answer: input.answer,\n answeredBy: input.answeredBy,\n recordedAt: now(),\n });\n const answerOutput = jsonValueSchema.parse({\n answer: candidate.answer,\n answeredBy: candidate.answeredBy,\n questionTaskId: candidate.questionTaskId,\n });\n let answerEvent = candidate;\n try {\n await driver.insert({ collection: \"answers\", id, value: candidate });\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n const existing = await mustRead(\"answers\", id, answerEventSchema);\n const { recordedAt: _existingAt, ...existingIntent } = existing.value;\n const { recordedAt: _candidateAt, ...candidateIntent } = candidate;\n if (!isDeepStrictEqual(existingIntent, candidateIntent)) {\n throw new AnswerEventConflictError(input.questionTaskId);\n }\n answerEvent = existing.value;\n }\n\n let parentTask: Task | null = null;\n if (answerEvent.parentTaskId !== undefined) {\n parentTask = await stores.tasks.get(answerEvent.parentTaskId);\n if (parentTask === null) {\n throw new Error(`parent task ${answerEvent.parentTaskId} does not exist`);\n }\n for (;;) {\n const parent = await mustRead(\"tasks\", answerEvent.parentTaskId, storedTaskSchema);\n if (parent.value.answerEventIds?.includes(answerEvent.id) === true) {\n parentTask = parent.value;\n break;\n }\n const projected = taskSchema.parse({\n ...parent.value,\n answerEventIds: [...(parent.value.answerEventIds ?? []), answerEvent.id],\n updatedAt: now(),\n });\n try {\n await updateTask(projected, parent.version);\n parentTask = projected;\n break;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n if (\n parentTask.state === \"needs_human\" &&\n parentTask.questionTaskId === input.questionTaskId\n ) {\n const closes = isClosingAnswer(questionDetails.closingOptions, answerEvent.answer);\n parentTask = await stores.tasks.transition(\n parentTask.id,\n closes ? \"cancelled\" : \"queued\",\n {\n expectFrom: \"needs_human\",\n expectAttempt: parentTask.attempt,\n expectQuestionTaskId: input.questionTaskId,\n reason: closes\n ? `question ${answerEvent.questionTaskId} answered by ${answerEvent.answeredBy}: ${answerEvent.answer}`\n : `question ${answerEvent.questionTaskId} answered by ${answerEvent.answeredBy}`,\n },\n );\n }\n }\n\n let questionTask = await mustRead(\"tasks\", input.questionTaskId, storedTaskSchema).then(\n (record) => record.value,\n );\n if (questionTask.state === \"needs_human\") {\n questionTask = await stores.tasks.transition(questionTask.id, \"succeeded\", {\n patch: {\n question: {\n ...questionDetails,\n answer: answerEvent.answer,\n answeredBy: answerEvent.answeredBy,\n },\n },\n output: answerOutput,\n reason: \"question answered by authenticated operator\",\n });\n } else if (\n questionTask.state !== \"succeeded\" ||\n questionTask.question?.answer !== answerEvent.answer ||\n questionTask.question.answeredBy !== answerEvent.answeredBy\n ) {\n throw new Error(`question task ${questionTask.id} is ${questionTask.state}, not waiting`);\n }\n return { answerEvent, questionTask, parentTask };\n },\n async transition(id, to, ...args) {\n const transitionOptions = args[0] ?? {};\n if (transitionOptions.patch !== undefined && \"settledUsd\" in transitionOptions.patch) {\n throw new SettlementError(id, \"settledUsd is set only by settle, not a transition\");\n }\n if (transitionOptions.patch !== undefined && \"usage\" in transitionOptions.patch) {\n throw new SettlementError(id, \"usage is set only by recordUsage, not a transition\");\n }\n let existing = await mustRead(\"tasks\", id, storedTaskSchema);\n if (\n transitionOptions.expectFrom !== undefined &&\n existing.value.state !== transitionOptions.expectFrom\n ) {\n throw new InvalidTransitionError(\n existing.value.state,\n to,\n legalNextStates(taskTransitions, existing.value.state),\n );\n }\n if (\n transitionOptions.expectAttempt !== undefined &&\n existing.value.attempt !== transitionOptions.expectAttempt\n ) {\n throw new TaskAttemptConflictError(\n id,\n existing.value.attempt,\n transitionOptions.expectAttempt,\n );\n }\n if (\n transitionOptions.expectExecution !== undefined &&\n !sameStoredValue(existing.value.execution, transitionOptions.expectExecution)\n ) {\n throw new Error(`Task ${id} execution has been replaced`);\n }\n if (\n transitionOptions.expectQuestionTaskId !== undefined &&\n existing.value.questionTaskId !== transitionOptions.expectQuestionTaskId\n ) {\n throw new Error(\n `task ${id} is no longer waiting for question ${transitionOptions.expectQuestionTaskId}`,\n );\n }\n assertTransition(taskTransitions, { from: existing.value.state, to });\n if (\n transitionOptions.patch !== undefined &&\n Object.keys(transitionOptions.patch).some(\n (key) =>\n ![\"changeId\", \"reportRef\", \"reservedUsd\", \"reservedAt\", \"question\"].includes(key),\n )\n ) {\n throw new Error(\"Task transitions cannot replace workflow-owned fields\");\n }\n if (\n to !== \"succeeded\" &&\n (transitionOptions.output !== undefined || transitionOptions.reuseRecordedOutput === true)\n ) {\n throw new Error(\"Workflow output can only be recorded when succeeding\");\n }\n if (\n to === \"succeeded\" &&\n transitionOptions.output === undefined &&\n transitionOptions.reuseRecordedOutput !== true\n ) {\n throw new Error(\n \"Succeeded transitions require output or reuseRecordedOutput after work completion\",\n );\n }\n if (\n to === \"succeeded\" &&\n transitionOptions.output !== undefined &&\n transitionOptions.reuseRecordedOutput === true\n ) {\n throw new Error(\"Choose output or reuseRecordedOutput, not both\");\n }\n if (\n to !== \"needs_human\" &&\n (transitionOptions.needsHumanAction !== undefined ||\n transitionOptions.questionTaskId !== undefined)\n ) {\n throw new Error(\"Question context is only valid when entering needs_human\");\n }\n if (to === \"running\") {\n if (existing.value.approval !== undefined && existing.value.approval !== \"granted\") {\n throw new Error(`Task ${id} requires approval before execution`);\n }\n }\n const timestamp = now();\n let workResult = existing.value.workResult;\n if (to === \"succeeded\") {\n const output =\n transitionOptions.output === undefined\n ? existing.value.workResult?.output\n : workflows.validateOutput(existing.value.work.workflow, transitionOptions.output);\n if (output === undefined)\n throw new Error(`Task ${id} requires validated output to succeed`);\n if (\n existing.value.workResult &&\n !isDeepStrictEqual(existing.value.workResult.output, output)\n ) {\n throw new Error(`Task ${id} already recorded a different workflow output`);\n }\n workResult ??= { output, completedAt: timestamp };\n }\n if (to === \"stalled\" && existing.value.waitingForMessages) {\n throw new Error(`Task ${id} is waiting for messages, not stalled execution`);\n }\n if (bumpsAttempt(existing.value.state, to) && existing.value.settledUsd !== undefined) {\n throw new Error(\n `Task ${id} is settled; create new work rather than silently losing retry costs`,\n );\n }\n if (to === \"needs_human\" && existing.value.question === undefined) {\n if (transitionOptions.questionTaskId === undefined) {\n throw new Error(`task ${id} cannot enter needs_human without a QuestionTask id`);\n }\n const question = await mustRead(\n \"tasks\",\n transitionOptions.questionTaskId,\n storedTaskSchema,\n );\n if (\n question.value.question === undefined ||\n question.value.state !== \"needs_human\" ||\n question.value.parentTaskId !== id ||\n question.value.rootTaskId !== existing.value.rootTaskId ||\n question.value.parentTaskAttempt !== existing.value.attempt ||\n !sameStoredValue(question.value.replyTo, existing.value.replyTo)\n ) {\n throw new Error(\n `task ${id} cannot enter needs_human for question ${question.value.id}`,\n );\n }\n }\n // Every needs_human entry must carry a populated, actionable\n // reason a human can act on. This is enforced here (a direct read,\n // never inferred) as well as in the schema, so it is never possible\n // to persist a needs_human task without one.\n const needsHumanAction = transitionOptions.needsHumanAction?.trim();\n if (to === \"needs_human\" && (needsHumanAction === undefined || needsHumanAction === \"\")) {\n throw new Error(\n `task ${id} cannot enter needs_human without an actionable needsHumanAction`,\n );\n }\n const bumps = bumpsAttempt(existing.value.state, to);\n // A new attempt gets a new execution; stall stamps describe only the\n // stalled state; running starts the progress clock.\n const {\n stalledAt: _stalledAt,\n stalledReason: _stalledReason,\n questionTaskId: _questionTaskId,\n needsHumanAction: _needsHumanAction,\n needsHumanNotifiedAt: _needsHumanNotifiedAt,\n failureReceiptId: _failureReceiptId,\n ...cleared\n } = existing.value;\n let next = taskSchema.parse({\n ...cleared,\n workResult,\n ...(bumps ? { execution: undefined, workResult: undefined } : {}),\n waitingForMessages: undefined,\n ...transitionOptions.patch,\n ...(to === \"needs_human\" && existing.value.question === undefined\n ? { questionTaskId: transitionOptions.questionTaskId }\n : {}),\n ...(to === \"needs_human\" ? { needsHumanAction } : {}),\n ...(to === \"stalled\"\n ? { stalledAt: timestamp, stalledReason: transitionOptions.reason }\n : {}),\n ...(to === \"running\" ? { lastProgressAt: timestamp } : {}),\n state: to,\n attempt: bumps ? existing.value.attempt + 1 : existing.value.attempt,\n updatedAt: timestamp,\n });\n validateTaskWork(next);\n if (to === \"running\")\n await stores.graphs.seal({ rootTaskId: existing.value.rootTaskId, taskId: id });\n if (existing.value.question !== undefined && to === \"needs_human\") {\n await setQuestionRoute(existing.value.replyTo, existing.value.id, true);\n }\n await projectSafely(() => projectTask(existing.value, existing.version));\n if (to === \"succeeded\" && existing.value.workResult === undefined) {\n // Validate the full transition first, then persist canonical output before its receipt.\n const prepared = taskSchema.parse({\n ...existing.value,\n workResult: next.workResult,\n updatedAt: timestamp,\n });\n await updateTask(prepared, existing.version);\n existing = { value: prepared, version: existing.version + 1 };\n }\n const receiptState = taskReceiptStates[to];\n if (receiptState !== undefined && next.repositoryIds !== undefined) {\n // The key is derived from every receipt-bearing field of the\n // transition, so a crash retry of the same write dedupes while a\n // different intent (a different change or reason produced by a\n // later write at the same state and attempt) gets its own receipt.\n // A lost write's orphan receipt can never stand in for a different\n // one, so it cannot poison a genuine transition's evidence.\n const receipt = await appendReceipt(\n JSON.stringify([\n \"task\",\n id,\n receiptState,\n next.attempt,\n next.changeId ?? null,\n transitionOptions.phase ?? null,\n transitionOptions.reason ?? null,\n ]),\n {\n repositoryIds: next.repositoryIds,\n taskId: id,\n changeId: next.changeId,\n kind: next.kind,\n state: receiptState,\n phase: transitionOptions.phase,\n reason: transitionOptions.reason,\n attempt: next.attempt,\n execution: next.execution,\n },\n );\n if (to === \"failed\")\n next = taskSchema.parse({ ...next, failureReceiptId: receipt.receiptId });\n if (needsLifecycleCommunication(next, receiptState, transitionOptions.phase)) {\n next = taskSchema.parse({\n ...next,\n pendingCommunicationReceiptIds: [\n ...(next.pendingCommunicationReceiptIds ?? []),\n receipt.receiptId,\n ],\n });\n }\n }\n if (\n existing.value.question !== undefined &&\n existing.value.state === \"needs_human\" &&\n to !== \"needs_human\" &&\n existing.value.parentTaskId !== undefined\n ) {\n const parent = await stores.tasks.get(existing.value.parentTaskId);\n if (\n parent?.state === \"needs_human\" &&\n parent.questionTaskId === id &&\n parent.attempt === existing.value.parentTaskAttempt\n ) {\n await stores.tasks.transition(parent.id, \"queued\", {\n expectFrom: \"needs_human\",\n expectAttempt: parent.attempt,\n expectQuestionTaskId: id,\n reason: `question ${id} is no longer waiting`,\n });\n }\n }\n await updateTask(next, existing.version);\n if (\n existing.value.question !== undefined &&\n existing.value.state === \"needs_human\" &&\n to !== \"needs_human\"\n ) {\n await setQuestionRoute(existing.value.replyTo, existing.value.id, false);\n }\n return next;\n },\n async acknowledgeCommunication(id, receiptId) {\n for (;;) {\n const existing = await mustRead(\"tasks\", id, storedTaskSchema);\n const pending = existing.value.pendingCommunicationReceiptIds ?? [];\n if (!pending.includes(receiptId)) {\n await projectSafely(() => projectTask(existing.value, existing.version));\n return existing.value;\n }\n const remaining = pending.filter((candidate) => candidate !== receiptId);\n const { pendingCommunicationReceiptIds: _pending, ...task } = existing.value;\n const next = taskSchema.parse({\n ...task,\n ...(remaining.length === 0 ? {} : { pendingCommunicationReceiptIds: remaining }),\n updatedAt: now(),\n });\n try {\n await updateTask(next, existing.version);\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async recordNeedsHumanDelivery(id, deliveryOptions = {}) {\n const at = deliveryOptions.at ?? now();\n let question: Task;\n for (;;) {\n const existing = await mustRead(\"tasks\", id, storedTaskSchema);\n if (existing.value.question === undefined)\n throw new Error(`task ${id} is not a QuestionTask`);\n if (\n existing.value.state !== \"needs_human\" ||\n (deliveryOptions.attempt !== undefined &&\n existing.value.attempt !== deliveryOptions.attempt)\n ) {\n return existing.value;\n }\n if (existing.value.needsHumanNotifiedAt !== undefined) {\n question = existing.value;\n break;\n }\n const next = taskSchema.parse({\n ...existing.value,\n needsHumanNotifiedAt: existing.value.needsHumanNotifiedAt ?? at,\n updatedAt: now(),\n });\n try {\n await updateTask(next, existing.version);\n question = next;\n break;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n const parentId = question.parentTaskId;\n if (parentId !== undefined) {\n for (;;) {\n const parent = await mustRead(\"tasks\", parentId, storedTaskSchema);\n if (\n parent.value.state !== \"needs_human\" ||\n parent.value.questionTaskId !== id ||\n parent.value.attempt !== question.parentTaskAttempt ||\n parent.value.needsHumanNotifiedAt !== undefined\n )\n break;\n // Read after the parent so any new wait also invalidates its CAS version.\n const current = await mustRead(\"tasks\", id, storedTaskSchema);\n if (current.value.state !== \"needs_human\" || current.value.attempt !== question.attempt)\n break;\n const next = taskSchema.parse({\n ...parent.value,\n needsHumanNotifiedAt: question.needsHumanNotifiedAt,\n updatedAt: now(),\n });\n try {\n await updateTask(next, parent.version);\n break;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n }\n return question;\n },\n async forReplyTo(replyTo) {\n const id = derivedId(\"task-route\", JSON.stringify([replyTo.channel, replyTo.address]));\n let route = await read(\"taskRoutes\", id, taskRouteSchema);\n let discovered: Task[] = [];\n if (route === null) {\n discovered = (await stores.tasks.list()).filter(\n (task) =>\n task.replyTo.channel === replyTo.channel && task.replyTo.address === replyTo.address,\n );\n for (const task of discovered) {\n const record = await mustRead(\"tasks\", task.id, storedTaskSchema);\n await projectSafely(() => projectTaskRoute(record.value, record.version));\n }\n if (discovered.length === 0) {\n const empty = taskRouteSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n replyTo,\n entries: [],\n updatedAt: now(),\n });\n await projectSafely(async () => {\n try {\n await driver.insert({ collection: \"taskRoutes\", id, value: empty });\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n }\n });\n }\n route = await read(\"taskRoutes\", id, taskRouteSchema);\n }\n if (route === null) return discovered;\n const values = new Map(route.value.entries.map((entry) => [entry.value.id, entry.value]));\n await forEachConcurrent(route.value.repairs, 16, async (repair) => {\n const repairTaskId = taskIdSchema.parse(repair.id);\n const record = await driver.get(\"tasks\", repairTaskId);\n if (record === null) {\n values.delete(repairTaskId);\n return;\n }\n const canonical = storedTaskSchema.parse(record.value);\n if (\n canonical.replyTo.channel === replyTo.channel &&\n canonical.replyTo.address === replyTo.address\n )\n values.set(canonical.id, canonical);\n else values.delete(canonical.id);\n await projectSafely(() => projectTaskRoute(canonical, record.version));\n });\n const tasks = [...values.values()];\n for (const task of tasks) validateTaskWork(task);\n return tasks;\n },\n async list() {\n const tasks = await catalogValues(\n \"tasks\",\n \"taskCatalogs\",\n \"tasks\",\n storedTaskSchema,\n taskCatalogSchema,\n projectTaskCatalog,\n );\n for (const task of tasks) validateTaskWork(task);\n return tasks;\n },\n },\n\n changes: {\n async create(input) {\n const timestamp = now();\n const id = derivedId(\"chg\", `${input.repositoryId}:github-pr:${input.prNumber}`);\n const change = changeSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n repositoryId: input.repositoryId,\n taskId: input.taskId,\n groupId: input.groupId,\n prNumber: input.prNumber,\n prUrl: input.prUrl,\n author: input.author,\n risk: input.risk,\n confidence: input.confidence,\n evidence: input.evidence,\n state: changeInitialState,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n await mustRead(\"repositories\", change.repositoryId, repositorySchema);\n if (change.taskId !== undefined) {\n const task = (await mustRead(\"tasks\", change.taskId, storedTaskSchema)).value;\n const taskRepositoryId = task.repositoryIds[0];\n if (!task.repositoryIds.includes(change.repositoryId)) {\n throw new ChangeAssociationError(\n change.taskId,\n change.repositoryId,\n `repository \"${change.repositoryId}\" does not match task repository \"${taskRepositoryId}\"`,\n );\n }\n }\n await markChangeCatalogRepair(change.id, 1);\n try {\n await driver.insert({ collection: \"changes\", id: change.id, value: change });\n await projectSafely(() => projectChangeCatalog(change, 1));\n return change;\n } catch (error) {\n if (error instanceof RecordExistsError) {\n for (;;) {\n const existing = await mustRead(\"changes\", change.id, changeSchema);\n if (change.taskId !== undefined) {\n if (\n existing.value.prUrl !== change.prUrl ||\n (existing.value.taskId !== undefined && existing.value.taskId !== change.taskId)\n ) {\n throw new ChangeAssociationError(\n change.taskId,\n change.repositoryId,\n \"pull request is already recorded with a different URL or producing Task\",\n );\n }\n // GitHub intake can observe the PR before its producing Task records it.\n if (existing.value.taskId === undefined) {\n const associated = changeSchema.parse({\n ...existing.value,\n taskId: change.taskId,\n updatedAt: now(),\n });\n try {\n await updateChange(associated, existing.version);\n return associated;\n } catch (conflict) {\n if (conflict instanceof VersionConflictError) continue;\n throw conflict;\n }\n }\n }\n await projectSafely(() => projectChangeCatalog(existing.value, existing.version));\n return existing.value;\n }\n }\n throw error;\n }\n },\n async get(id) {\n const record = await read(\"changes\", id, changeSchema);\n return record === null ? null : record.value;\n },\n async updateEvidence(id, input) {\n const existing = await mustRead(\"changes\", id, changeSchema);\n if (!sameStoredValue(existing.value, input.expected))\n throw new VersionConflictError(\"changes\", id, existing.version);\n const next = changeSchema.parse({\n ...existing.value,\n evidence: input.evidence,\n confidence: input.confidence,\n updatedAt: now(),\n });\n await updateChange(next, existing.version);\n return next;\n },\n async transition(id, to, ...args) {\n const transitionOptions = args[0] ?? {};\n const existing = await mustRead(\"changes\", id, changeSchema);\n await projectSafely(() => projectChangeCatalog(existing.value, existing.version));\n assertTransition(changeTransitions, { from: existing.value.state, to });\n const invalidated = existing.value.state === \"ready\" && to === \"verifying\";\n const next = changeSchema.parse({\n ...existing.value,\n ...transitionOptions.patch,\n ...(invalidated ? { confidence: \"low\", evidence: unverifiedEvidence } : {}),\n state: to,\n updatedAt: now(),\n });\n const receiptState = changeReceiptStates[to];\n if (receiptState !== undefined) {\n await appendReceipt(`change:${id}:${receiptState}`, {\n repositoryIds: [next.repositoryId],\n taskId: next.taskId,\n changeId: id,\n kind: \"change\",\n state: receiptState,\n reason: transitionOptions.reason,\n attempt: 1,\n decidedBy: next.decidedBy,\n });\n }\n await updateChange(next, existing.version);\n return next as ChangeInState<typeof to>;\n },\n list() {\n return catalogValues(\n \"changes\",\n \"changeCatalogs\",\n \"changes\",\n changeSchema,\n changeCatalogSchema,\n projectChangeCatalog,\n );\n },\n },\n\n receipts: {\n append(input) {\n const { dedupeKey, attempt, ...fields } = input;\n const receiptId =\n dedupeKey === undefined ? randomId(\"rcpt\") : derivedId(\"rcpt\", `custom:${dedupeKey}`);\n return insertReceipt(receiptId, { ...fields, attempt: attempt ?? 1 });\n },\n async get(id) {\n const record = await read(\"receipts\", id, receiptSchema);\n return record === null ? null : record.value;\n },\n list() {\n return listAll(\"receipts\", receiptSchema);\n },\n },\n\n budgets: {\n async ensure(input) {\n const budget = budgetSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n factoryId: input.factoryId,\n month: input.month,\n limits: input.limits,\n notices: {},\n });\n try {\n await driver.insert({ collection: \"budgets\", id: input.month, value: budget });\n return budget;\n } catch (error) {\n if (!(error instanceof RecordExistsError)) {\n throw error;\n }\n }\n const existing = await mustRead(\"budgets\", input.month, budgetSchema);\n const refreshed = budgetSchema.parse({ ...existing.value, limits: input.limits });\n if (JSON.stringify(refreshed) === JSON.stringify(existing.value)) {\n return existing.value;\n }\n try {\n await driver.update({\n collection: \"budgets\",\n id: input.month,\n value: refreshed,\n expectedVersion: existing.version,\n });\n return refreshed;\n } catch (error) {\n if (error instanceof VersionConflictError) {\n const latest = await mustRead(\"budgets\", input.month, budgetSchema);\n return latest.value;\n }\n throw error;\n }\n },\n async get(month) {\n const record = await read(\"budgets\", month, budgetSchema);\n return record === null ? null : record.value;\n },\n async stampNotice(month, notice) {\n const field = notice === \"warning\" ? \"warningAt\" : \"exhaustedAt\";\n // A version conflict does not mean this notice was stamped: a limits\n // refresh or the other notice also bumps the row. Retry until the\n // notice is actually present or our write lands, so `stamped: false`\n // always means \"someone else stamped it\" and the caller never\n // delivers a notice twice. The loop terminates because every conflict\n // proves another write completed, and the budget row receives only\n // notice stamps and limits refreshes.\n for (;;) {\n const existing = await mustRead(\"budgets\", month, budgetSchema);\n if (existing.value.notices[field] !== undefined) {\n return { budget: existing.value, stamped: false };\n }\n const next = budgetSchema.parse({\n ...existing.value,\n notices: { ...existing.value.notices, [field]: now() },\n });\n try {\n await driver.update({\n collection: \"budgets\",\n id: month,\n value: next,\n expectedVersion: existing.version,\n });\n return { budget: next, stamped: true };\n } catch (error) {\n if (!(error instanceof VersionConflictError)) {\n throw error;\n }\n }\n }\n },\n },\n answers: {\n async get(id) {\n const record = await read(\"answers\", id, answerEventSchema);\n return record?.value ?? null;\n },\n },\n outbox: {\n async enqueue(input) {\n const event = communicationEventSchema.parse(input);\n const id = outboxIdSchema.parse(derivedId(\"out\", event.eventId));\n const delivered = await read(\"outboxDeliveries\", id, outboxMessageSchema);\n if (delivered !== null) {\n if (!isDeepStrictEqual(delivered.value.event, event)) {\n throw new OutboxEventConflictError(event.eventId);\n }\n return delivered.value;\n }\n const queueId = `communication-${id.slice(4, 5)}`;\n for (;;) {\n const existing = await read(\"outboxQueues\", queueId, outboxQueueSchema);\n const duplicate = existing?.value.messages.find((message) => message.id === id);\n if (duplicate !== undefined) {\n if (!isDeepStrictEqual(duplicate.event, event)) {\n throw new OutboxEventConflictError(event.eventId);\n }\n return duplicate;\n }\n const timestamp = now();\n const message = outboxMessageSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id,\n event,\n state: \"pending\",\n attempt: 0,\n availableAt: timestamp,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n const queue = outboxQueueSchema.parse({\n schemaVersion: SCHEMA_VERSION,\n id: queueId,\n messages: [...(existing?.value.messages ?? []), message],\n updatedAt: timestamp,\n });\n try {\n if (existing === null)\n await driver.insert({ collection: \"outboxQueues\", id: queueId, value: queue });\n else\n await driver.update({\n collection: \"outboxQueues\",\n id: queueId,\n value: queue,\n expectedVersion: existing.version,\n });\n return message;\n } catch (error) {\n if (!(error instanceof RecordExistsError) && !(error instanceof VersionConflictError)) {\n throw error;\n }\n }\n }\n },\n async get(id) {\n const delivered = await read(\"outboxDeliveries\", id, outboxMessageSchema);\n if (delivered !== null) return delivered.value;\n const queueId = `communication-${id.slice(4, 5)}`;\n const queue = await read(\"outboxQueues\", queueId, outboxQueueSchema);\n return queue?.value.messages.find((message) => message.id === id) ?? null;\n },\n async claim(id, leaseMs = 60_000) {\n if (!Number.isSafeInteger(leaseMs) || leaseMs <= 0) {\n throw new Error(\"outbox leaseMs must be a positive safe integer\");\n }\n const queueId = `communication-${id.slice(4, 5)}`;\n for (;;) {\n const queue = await mustRead(\"outboxQueues\", queueId, outboxQueueSchema);\n const index = queue.value.messages.findIndex((message) => message.id === id);\n if (index < 0) return null;\n if ((await read(\"outboxDeliveries\", id, outboxMessageSchema)) !== null) {\n const messages = queue.value.messages.filter((message) => message.id !== id);\n try {\n await driver.update({\n collection: \"outboxQueues\",\n id: queueId,\n value: outboxQueueSchema.parse({ ...queue.value, messages, updatedAt: now() }),\n expectedVersion: queue.version,\n });\n return null;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n continue;\n }\n }\n const message = queue.value.messages[index]!;\n const timestamp = now();\n const eligible =\n (message.state === \"pending\" && message.availableAt <= timestamp) ||\n (message.state === \"delivering\" &&\n message.leaseUntil !== undefined &&\n message.leaseUntil <= timestamp);\n if (!eligible) return null;\n const next = outboxMessageSchema.parse({\n ...message,\n state: \"delivering\",\n attempt: message.attempt + 1,\n leaseUntil: new Date(Date.parse(timestamp) + leaseMs).toISOString(),\n updatedAt: timestamp,\n });\n const messages = [...queue.value.messages];\n messages[index] = next;\n try {\n await driver.update({\n collection: \"outboxQueues\",\n id: queueId,\n value: outboxQueueSchema.parse({ ...queue.value, messages, updatedAt: timestamp }),\n expectedVersion: queue.version,\n });\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async retry(id, input) {\n const { attempt, reason, delayMs } = input;\n if (!Number.isSafeInteger(delayMs) || delayMs < 0) {\n throw new Error(\"outbox delayMs must be a nonnegative safe integer\");\n }\n const queueId = `communication-${id.slice(4, 5)}`;\n for (;;) {\n const queue = await mustRead(\"outboxQueues\", queueId, outboxQueueSchema);\n const index = queue.value.messages.findIndex((message) => message.id === id);\n if (index < 0) return null;\n const message = queue.value.messages[index]!;\n if (message.state !== \"delivering\" || message.attempt !== attempt) return null;\n const timestamp = now();\n const { leaseUntil: _leaseUntil, ...leased } = message;\n const next = outboxMessageSchema.parse({\n ...leased,\n state: \"pending\",\n availableAt: new Date(Date.parse(timestamp) + delayMs).toISOString(),\n lastError: reason.trim().slice(0, 2000) || \"delivery failed\",\n updatedAt: timestamp,\n });\n const messages = [...queue.value.messages];\n messages[index] = next;\n try {\n await driver.update({\n collection: \"outboxQueues\",\n id: queueId,\n value: outboxQueueSchema.parse({ ...queue.value, messages, updatedAt: timestamp }),\n expectedVersion: queue.version,\n });\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async complete(id, attempt) {\n const queueId = `communication-${id.slice(4, 5)}`;\n let delivered = await read(\"outboxDeliveries\", id, outboxMessageSchema);\n for (;;) {\n const queue = await mustRead(\"outboxQueues\", queueId, outboxQueueSchema);\n const index = queue.value.messages.findIndex((message) => message.id === id);\n if (index < 0) return delivered?.value ?? null;\n const message = queue.value.messages[index]!;\n const timestamp = now();\n if (delivered === null) {\n if (message.state !== \"delivering\" || message.attempt !== attempt) return null;\n const { leaseUntil: _leaseUntil, lastError: _lastError, ...leased } = message;\n const next = outboxMessageSchema.parse({\n ...leased,\n state: \"delivered\",\n deliveredAt: timestamp,\n updatedAt: timestamp,\n });\n try {\n await driver.insert({ collection: \"outboxDeliveries\", id, value: next });\n delivered = { value: next, version: 1 };\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n delivered = await mustRead(\"outboxDeliveries\", id, outboxMessageSchema);\n if (!isDeepStrictEqual(delivered.value.event, message.event)) {\n throw new OutboxEventConflictError(message.event.eventId);\n }\n }\n }\n const messages = queue.value.messages.filter((candidate) => candidate.id !== id);\n try {\n await driver.update({\n collection: \"outboxQueues\",\n id: queueId,\n value: outboxQueueSchema.parse({ ...queue.value, messages, updatedAt: timestamp }),\n expectedVersion: queue.version,\n });\n return delivered.value;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async pending(limit = 100) {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(\"outbox pending limit must be a positive safe integer\");\n }\n const queues = await Promise.all(\n \"0123456789abcdef\"\n .split(\"\")\n .map((shard) => read(\"outboxQueues\", `communication-${shard}`, outboxQueueSchema)),\n );\n const timestamp = now();\n return queues\n .flatMap((queue) => queue?.value.messages ?? [])\n .filter(\n (message) =>\n (message.state === \"pending\" && message.availableAt <= timestamp) ||\n (message.state === \"delivering\" &&\n message.leaseUntil !== undefined &&\n message.leaseUntil <= timestamp),\n )\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt))\n .slice(0, limit);\n },\n },\n };\n return stores;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { StoreDriver } from "./driver.mjs";
|
|
2
|
+
//#region src/store/memory.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Creates an isolated process-local StoreDriver for development, examples, and tests.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* Every call creates a new empty store. Records survive only for the lifetime of the returned
|
|
8
|
+
* object and are cloned at the driver boundary, so mutating caller-owned values cannot mutate
|
|
9
|
+
* stored state. Use a persistent adapter from `@vercel/factory/storage/blob` or
|
|
10
|
+
* `@vercel/factory/storage/postgres` in deployed runtimes.
|
|
11
|
+
*
|
|
12
|
+
* @returns A new empty driver whose `name` is `memory`.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { createInMemoryDriver, createStores } from "@vercel/factory/storage";
|
|
17
|
+
*
|
|
18
|
+
* const stores = createStores({ driver: createInMemoryDriver() });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
declare function createInMemoryDriver(): StoreDriver;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { createInMemoryDriver };
|
|
24
|
+
//# sourceMappingURL=memory.d.mts.map
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { RecordExistsError, RecordNotFoundError, VersionConflictError } from "./driver.mjs";
|
|
2
|
+
//#region src/store/memory.ts
|
|
3
|
+
/**
|
|
4
|
+
* Creates an isolated process-local StoreDriver for development, examples, and tests.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* Every call creates a new empty store. Records survive only for the lifetime of the returned
|
|
8
|
+
* object and are cloned at the driver boundary, so mutating caller-owned values cannot mutate
|
|
9
|
+
* stored state. Use a persistent adapter from `@vercel/factory/storage/blob` or
|
|
10
|
+
* `@vercel/factory/storage/postgres` in deployed runtimes.
|
|
11
|
+
*
|
|
12
|
+
* @returns A new empty driver whose `name` is `memory`.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { createInMemoryDriver, createStores } from "@vercel/factory/storage";
|
|
17
|
+
*
|
|
18
|
+
* const stores = createStores({ driver: createInMemoryDriver() });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
function createInMemoryDriver() {
|
|
22
|
+
const collections = /* @__PURE__ */ new Map();
|
|
23
|
+
function collection(name) {
|
|
24
|
+
let existing = collections.get(name);
|
|
25
|
+
if (existing === void 0) {
|
|
26
|
+
existing = /* @__PURE__ */ new Map();
|
|
27
|
+
collections.set(name, existing);
|
|
28
|
+
}
|
|
29
|
+
return existing;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
name: "memory",
|
|
33
|
+
get(name, id) {
|
|
34
|
+
const record = collection(name).get(id);
|
|
35
|
+
return Promise.resolve(record === void 0 ? null : structuredClone(record));
|
|
36
|
+
},
|
|
37
|
+
insert({ collection: name, id, value }) {
|
|
38
|
+
const records = collection(name);
|
|
39
|
+
if (records.has(id)) return Promise.reject(new RecordExistsError(name, id));
|
|
40
|
+
records.set(id, {
|
|
41
|
+
value: structuredClone(value),
|
|
42
|
+
version: 1
|
|
43
|
+
});
|
|
44
|
+
return Promise.resolve();
|
|
45
|
+
},
|
|
46
|
+
update({ collection: name, id, value, expectedVersion }) {
|
|
47
|
+
const records = collection(name);
|
|
48
|
+
const existing = records.get(id);
|
|
49
|
+
if (existing === void 0) return Promise.reject(new RecordNotFoundError(name, id));
|
|
50
|
+
if (existing.version !== expectedVersion) return Promise.reject(new VersionConflictError(name, id, expectedVersion));
|
|
51
|
+
records.set(id, {
|
|
52
|
+
value: structuredClone(value),
|
|
53
|
+
version: existing.version + 1
|
|
54
|
+
});
|
|
55
|
+
return Promise.resolve();
|
|
56
|
+
},
|
|
57
|
+
list(name) {
|
|
58
|
+
const entries = [...collection(name)].map(([id, record]) => ({
|
|
59
|
+
id,
|
|
60
|
+
record: structuredClone(record)
|
|
61
|
+
}));
|
|
62
|
+
return Promise.resolve(entries);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
export { createInMemoryDriver };
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=memory.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.mjs","names":[],"sources":["../../src/store/memory.ts"],"sourcesContent":["import {\n RecordExistsError,\n RecordNotFoundError,\n VersionConflictError,\n type CollectionName,\n type StoredEntry,\n type StoredRecord,\n type StoreDriver,\n} from \"./driver\";\n\n/**\n * Creates an isolated process-local StoreDriver for development, examples, and tests.\n *\n * @remarks\n * Every call creates a new empty store. Records survive only for the lifetime of the returned\n * object and are cloned at the driver boundary, so mutating caller-owned values cannot mutate\n * stored state. Use a persistent adapter from `@vercel/factory/storage/blob` or\n * `@vercel/factory/storage/postgres` in deployed runtimes.\n *\n * @returns A new empty driver whose `name` is `memory`.\n *\n * @example\n * ```ts\n * import { createInMemoryDriver, createStores } from \"@vercel/factory/storage\";\n *\n * const stores = createStores({ driver: createInMemoryDriver() });\n * ```\n */\nexport function createInMemoryDriver(): StoreDriver {\n const collections = new Map<CollectionName, Map<string, StoredRecord>>();\n\n function collection(name: CollectionName): Map<string, StoredRecord> {\n let existing = collections.get(name);\n if (existing === undefined) {\n existing = new Map();\n collections.set(name, existing);\n }\n return existing;\n }\n\n return {\n name: \"memory\",\n\n get(name, id) {\n const record = collection(name).get(id);\n return Promise.resolve(record === undefined ? null : structuredClone(record));\n },\n\n insert({ collection: name, id, value }) {\n const records = collection(name);\n if (records.has(id)) {\n return Promise.reject(new RecordExistsError(name, id));\n }\n records.set(id, { value: structuredClone(value), version: 1 });\n return Promise.resolve();\n },\n\n update({ collection: name, id, value, expectedVersion }) {\n const records = collection(name);\n const existing = records.get(id);\n if (existing === undefined) {\n return Promise.reject(new RecordNotFoundError(name, id));\n }\n if (existing.version !== expectedVersion) {\n return Promise.reject(new VersionConflictError(name, id, expectedVersion));\n }\n records.set(id, { value: structuredClone(value), version: existing.version + 1 });\n return Promise.resolve();\n },\n\n list(name) {\n const entries: StoredEntry[] = [...collection(name)].map(([id, record]) => ({\n id,\n record: structuredClone(record),\n }));\n return Promise.resolve(entries);\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA4BA,SAAgB,uBAAoC;CAClD,MAAM,8BAAc,IAAI,IAA+C;CAEvE,SAAS,WAAW,MAAiD;EACnE,IAAI,WAAW,YAAY,IAAI,IAAI;EACnC,IAAI,aAAa,KAAA,GAAW;GAC1B,2BAAW,IAAI,IAAI;GACnB,YAAY,IAAI,MAAM,QAAQ;EAChC;EACA,OAAO;CACT;CAEA,OAAO;EACL,MAAM;EAEN,IAAI,MAAM,IAAI;GACZ,MAAM,SAAS,WAAW,IAAI,CAAC,CAAC,IAAI,EAAE;GACtC,OAAO,QAAQ,QAAQ,WAAW,KAAA,IAAY,OAAO,gBAAgB,MAAM,CAAC;EAC9E;EAEA,OAAO,EAAE,YAAY,MAAM,IAAI,SAAS;GACtC,MAAM,UAAU,WAAW,IAAI;GAC/B,IAAI,QAAQ,IAAI,EAAE,GAChB,OAAO,QAAQ,OAAO,IAAI,kBAAkB,MAAM,EAAE,CAAC;GAEvD,QAAQ,IAAI,IAAI;IAAE,OAAO,gBAAgB,KAAK;IAAG,SAAS;GAAE,CAAC;GAC7D,OAAO,QAAQ,QAAQ;EACzB;EAEA,OAAO,EAAE,YAAY,MAAM,IAAI,OAAO,mBAAmB;GACvD,MAAM,UAAU,WAAW,IAAI;GAC/B,MAAM,WAAW,QAAQ,IAAI,EAAE;GAC/B,IAAI,aAAa,KAAA,GACf,OAAO,QAAQ,OAAO,IAAI,oBAAoB,MAAM,EAAE,CAAC;GAEzD,IAAI,SAAS,YAAY,iBACvB,OAAO,QAAQ,OAAO,IAAI,qBAAqB,MAAM,IAAI,eAAe,CAAC;GAE3E,QAAQ,IAAI,IAAI;IAAE,OAAO,gBAAgB,KAAK;IAAG,SAAS,SAAS,UAAU;GAAE,CAAC;GAChF,OAAO,QAAQ,QAAQ;EACzB;EAEA,KAAK,MAAM;GACT,MAAM,UAAyB,CAAC,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,aAAa;IAC1E;IACA,QAAQ,gBAAgB,MAAM;GAChC,EAAE;GACF,OAAO,QAAQ,QAAQ,OAAO;EAChC;CACF;AACF"}
|