@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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"engine-WaUM2cGA.mjs","names":[],"sources":["../src/schema/answer.ts","../src/schema/receipt.ts","../src/schema/outbox.ts","../src/schema/signal.ts","../src/schema/session.ts","../src/store/engine.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { isoDateTimeSchema, replyToSchema, schemaVersionSchema } from \"./common\";\nimport { answerIdSchema, repositoryIdsSchema, taskIdSchema } from \"./id\";\n\nexport const answerEventSchema = z.strictObject({\n schemaVersion: schemaVersionSchema,\n id: answerIdSchema,\n questionTaskId: taskIdSchema,\n parentTaskId: taskIdSchema.optional(),\n repositoryIds: repositoryIdsSchema,\n replyTo: replyToSchema,\n question: z.string().min(1),\n answer: z.string().min(1).max(4000),\n answeredBy: z.string().min(1),\n recordedAt: isoDateTimeSchema,\n});\n\nexport type AnswerEvent = z.infer<typeof answerEventSchema>;\n","import { z } from \"zod\";\nimport { isoDateTimeSchema, schemaVersionSchema, usdSchema, vocabularySchema } from \"./common\";\nimport { changeIdSchema, receiptIdSchema, repositoryIdsSchema, taskIdSchema } from \"./id\";\nimport { standardTaskKinds } from \"./task\";\n\n/** States the engine writes on transitions. Any vocabulary value is valid. */\nexport const standardReceiptStates = [\n \"approved\",\n \"rejected\",\n \"queued\",\n \"dispatched\",\n \"stalled\",\n \"succeeded\",\n \"failed\",\n \"needs_human\",\n \"cancelled\",\n \"settled\",\n \"verifying\",\n \"ready\",\n \"merged\",\n \"deployed\",\n \"rolled_out\",\n \"rolled_back\",\n] as const;\n\n/** Phases the standard loop uses. Any vocabulary value is valid. */\nexport const standardReceiptPhases = [\n \"approval\",\n \"budget\",\n \"dispatch\",\n \"implementation\",\n \"verification\",\n \"pull_request\",\n \"cleanup\",\n] as const;\n\n/** Kinds the standard loop writes: the standard task kinds plus \"change\". */\nexport const standardReceiptKinds = [...standardTaskKinds, \"change\"] as const;\n\nexport const receiptStateSchema = vocabularySchema.describe(\n \"What happened, e.g. dispatched, settled, merged, or a custom event name.\",\n);\n\nexport const receiptPhaseSchema = vocabularySchema.describe(\n \"Where in the process it happened, e.g. dispatch or verification.\",\n);\n\nexport const receiptKindSchema = vocabularySchema.describe(\n \"What the receipt is about: a task kind, change, or a custom kind.\",\n);\n\nexport const costSchema = z.strictObject({\n totalUsd: usdSchema,\n});\n\nexport const receiptSchema = z\n .strictObject({\n schemaVersion: schemaVersionSchema,\n receiptId: receiptIdSchema,\n repositoryIds: repositoryIdsSchema.describe(\"Repositories the recorded event concerns.\"),\n taskId: taskIdSchema.optional(),\n changeId: changeIdSchema.optional(),\n kind: receiptKindSchema,\n state: receiptStateSchema,\n phase: receiptPhaseSchema.optional(),\n reason: z\n .string()\n .min(1)\n .max(2000)\n .optional()\n .describe(\"Why it happened. Scrubbed and truncated; never secrets.\"),\n attempt: z.number().int().min(1).describe(\"Attempt the event belongs to.\"),\n cost: costSchema.optional().describe(\"Measured cost. Settled receipts only.\"),\n decidedBy: z\n .string()\n .min(1)\n .optional()\n .describe(\"Human who made the decision. Change and approval receipts only.\"),\n recordedAt: isoDateTimeSchema,\n })\n .superRefine((receipt, ctx) => {\n if (receipt.state === \"settled\" && receipt.cost === undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"cost\"],\n message: \"settled receipts require cost\",\n });\n }\n if (receipt.state !== \"settled\" && receipt.cost !== undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"cost\"],\n message: \"cost is only valid on settled receipts\",\n });\n }\n if (\n receipt.decidedBy !== undefined &&\n receipt.kind !== \"change\" &&\n receipt.state !== \"approved\" &&\n receipt.state !== \"rejected\"\n ) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"decidedBy\"],\n message: \"decidedBy is only valid on change and approval receipts\",\n });\n }\n });\n\nexport type ReceiptState = z.infer<typeof receiptStateSchema>;\nexport type ReceiptPhase = z.infer<typeof receiptPhaseSchema>;\nexport type ReceiptKind = z.infer<typeof receiptKindSchema>;\nexport type Cost = z.infer<typeof costSchema>;\nexport type Receipt = z.infer<typeof receiptSchema>;\n","import { z } from \"zod\";\nimport { communicationEventSchema } from \"./communication\";\nimport { isoDateTimeSchema, schemaVersionSchema } from \"./common\";\nimport { outboxIdSchema } from \"./id\";\n\nexport const outboxStateSchema = z\n .enum([\"pending\", \"delivering\", \"delivered\"])\n .describe(\"Durable connector delivery state.\");\n\nexport const outboxMessageSchema = z.strictObject({\n schemaVersion: schemaVersionSchema,\n id: outboxIdSchema,\n event: communicationEventSchema.describe(\"Immutable provider-neutral delivery payload.\"),\n state: outboxStateSchema,\n attempt: z.number().int().nonnegative(),\n availableAt: isoDateTimeSchema,\n leaseUntil: isoDateTimeSchema.optional(),\n deliveredAt: isoDateTimeSchema.optional(),\n lastError: z.string().min(1).max(2000).optional(),\n createdAt: isoDateTimeSchema,\n updatedAt: isoDateTimeSchema,\n});\n\nexport type OutboxMessage = z.infer<typeof outboxMessageSchema>;\n\nexport const outboxQueueSchema = z.strictObject({\n schemaVersion: schemaVersionSchema,\n id: z.string().regex(/^communication-[0-9a-f]$/u),\n messages: z.array(outboxMessageSchema),\n updatedAt: isoDateTimeSchema,\n});\n\nexport type OutboxQueue = z.infer<typeof outboxQueueSchema>;\n","import { z } from \"zod\";\nimport {\n isoDateTimeSchema,\n replyToSchema,\n schemaVersionSchema,\n vocabularySchema,\n} from \"./common\";\nimport { repositoryIdSchema, signalIdSchema } from \"./id\";\n\n/** Sources used by the standard connectors. Any vocabulary value is valid. */\nexport const standardSignalSources = [\n \"github_issue\",\n \"github_pr\",\n \"github_pr_comment\",\n \"slack\",\n \"human\",\n \"github_ci_failure\",\n \"vercel_deploy_failure\",\n \"security_scan\",\n \"investigation\",\n \"api\",\n] as const;\n\nexport const signalSourceSchema = vocabularySchema.describe(\n \"What produced the signal, e.g. github_issue or a custom connector's own name.\",\n);\n\nexport const signalOutcomeSchema = z\n .enum([\"pending\", \"accepted\", \"duplicate\", \"unactionable\", \"low_confidence\", \"ignored\"])\n .describe(\"Triage outcome. A signal starts pending and is decided exactly once.\");\n\nexport const signalSchema = z\n .strictObject({\n schemaVersion: schemaVersionSchema,\n id: signalIdSchema.describe(\"Signal id, derived from source and deliveryId.\"),\n repositoryId: repositoryIdSchema.describe(\"Repository the signal is about.\"),\n source: signalSourceSchema,\n deliveryId: z\n .string()\n .min(1)\n .describe(\"Provider idempotency key; a redelivered event maps to the same signal.\"),\n replyTo: replyToSchema,\n payload: z.unknown().describe(\"Provider-shaped payload. Untrusted data, never instructions.\"),\n receivedAt: isoDateTimeSchema,\n outcome: signalOutcomeSchema,\n detail: z\n .string()\n .min(1)\n .optional()\n .describe(\"Outcome nuance, e.g. severity when accepted or the duplicate-of signal id.\"),\n reason: z.string().min(1).optional().describe(\"Why the outcome was chosen.\"),\n decidedAt: isoDateTimeSchema.optional(),\n })\n .superRefine((signal, ctx) => {\n if (signal.outcome === \"pending\" && signal.decidedAt !== undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"decidedAt\"],\n message: \"pending signals must not carry decidedAt\",\n });\n }\n if (signal.outcome !== \"pending\" && signal.decidedAt === undefined) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"decidedAt\"],\n message: \"decided signals require decidedAt\",\n });\n }\n });\n\nexport type SignalSource = z.infer<typeof signalSourceSchema>;\nexport type SignalOutcome = z.infer<typeof signalOutcomeSchema>;\nexport type Signal = z.infer<typeof signalSchema>;\n","import { z } from \"zod\";\nimport { isoDateTimeSchema, schemaVersionSchema } from \"./common\";\nimport { changeIdSchema, repositoryIdSchema, taskIdSchema } from \"./id\";\nimport { executionReferenceSchema } from \"./task\";\nimport { communicationEventSchema } from \"./communication\";\n\nexport const agentSessionIdSchema = z.string().regex(/^ses_[a-z0-9]{6,64}$/u)\n .describe(\"Stable Factory interaction ID; independent of provider session IDs.\");\n\nexport const agentSessionSchema = z.strictObject({\n schemaVersion: schemaVersionSchema,\n id: agentSessionIdSchema,\n owner: z.string().min(1).describe(\"Authenticated principal owning this interaction.\"),\n agent: z.string().regex(/^[a-z][a-z0-9-]{0,31}$/u).describe(\"Selected application agent.\"),\n repositoryId: repositoryIdSchema.optional().describe(\"Configured repository selected for this interaction.\"),\n routeId: z.string().min(1).optional().describe(\"Declared workflow route for specialist work.\"),\n message: z.string().min(1).max(16000).describe(\"Initial request, retained for idempotent admission and recovery.\"),\n changeId: changeIdSchema.optional().describe(\"Existing change selected for this work.\"),\n taskId: taskIdSchema.optional().describe(\"Workflow-owned task; its execution reference is authoritative.\"),\n execution: executionReferenceSchema.optional().describe(\"Provider reference for taskless conversations only.\"),\n notifications: z.array(communicationEventSchema).default([]).describe(\"Durable connector deliveries, deduplicated by eventId.\"),\n createdAt: isoDateTimeSchema,\n}).refine((session) => session.taskId === undefined || session.execution === undefined, \"A session binds either a task or a conversation execution\");\n\nexport type AgentSession = z.infer<typeof agentSessionSchema>;\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport type { ZodType } from \"zod\";\nimport { answerEventSchema, type AnswerEvent } from \"../schema/answer\";\nimport { agentSessionSchema, type AgentSession } from \"../schema/session\";\nimport { SCHEMA_VERSION, type ReplyTo } from \"../schema/common\";\nimport { communicationEventSchema, type CommunicationEvent } from \"../schema/communication\";\nimport {\n answerIdSchema,\n outboxIdSchema,\n type AnswerId,\n type ChangeId,\n type FactoryId,\n type OutboxId,\n type RepositoryId,\n type SignalId,\n type TaskId,\n} from \"../schema/id\";\nimport { budgetSchema, type Budget } from \"../schema/budget\";\nimport { changeSchema, type Change, type ChangeState, type Level } from \"../schema/change\";\nimport { outboxMessageSchema, outboxQueueSchema, type OutboxMessage } from \"../schema/outbox\";\nimport { costSchema, receiptSchema, type Cost, type Receipt, type ReceiptState } from \"../schema/receipt\";\nimport { repositorySchema, type Repository } from \"../schema/repository\";\nimport { signalSchema, type Signal, type SignalOutcome, type SignalSource } from \"../schema/signal\";\nimport {\n taskSchema,\n type ExecutionReference,\n type Task,\n type TaskState,\n type TaskUsage,\n} from \"../schema/task\";\nimport {\n assertTransition,\n changeInitialState,\n changeTransitions,\n InvalidTransitionError,\n legalNextStates,\n signalOutcomeTransitions,\n taskInitialState,\n taskTransitions,\n} from \"../schema/transitions\";\nimport {\n RecordExistsError,\n RecordNotFoundError,\n VersionConflictError,\n type CollectionName,\n type StoreDriver,\n} from \"./driver\";\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\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\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\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\nexport interface CreateSignalInput {\n repositoryId: RepositoryId;\n source: SignalSource;\n deliveryId: string;\n replyTo: ReplyTo;\n payload: unknown;\n}\n\nexport interface DecideSignalOptions {\n detail?: string;\n reason?: string;\n}\n\nexport interface CreateTaskInput {\n repositoryIds: RepositoryId[];\n kind: Task[\"kind\"];\n origin: Task[\"origin\"];\n replyTo: ReplyTo;\n /** Same key creates one task and returns it on workflow retries. */\n dedupeKey?: string;\n area?: string;\n changeId?: ChangeId;\n dependsOn?: TaskId[];\n question?: Task[\"question\"];\n /** Stamp the task as needing a human decision before dispatch. */\n approval?: \"required\";\n}\n\nexport interface ApprovalDecision {\n /** Authenticated operator making the decision. */\n by: string;\n reason?: string;\n}\n\nexport interface AnswerQuestionInput {\n questionTaskId: TaskId;\n answer: string;\n answeredBy: string;\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.\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. */\nexport interface StepUsage {\n turnId: string;\n stepIndex: number;\n costUsd?: number;\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n}\n\nexport interface TaskTransitionOptions {\n patch?: TaskPatch;\n reason?: string;\n /** Required when a non-question task waits, so validation is a direct read. */\n questionTaskId?: TaskId;\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}\n\nexport interface CreateChangeInput {\n repositoryId: RepositoryId;\n taskId?: TaskId;\n groupId?: TaskId;\n prNumber: number;\n prUrl: string;\n author: string;\n risk: Level;\n confidence: Level;\n evidence: Change[\"evidence\"];\n}\n\nexport type ChangePatch = Partial<\n Pick<Change, \"confidence\" | \"evidence\" | \"decidedBy\" | \"mergeSha\">\n>;\n\nexport interface ChangeTransitionOptions {\n patch?: ChangePatch;\n reason?: string;\n}\n\nexport interface EnsureBudgetInput {\n factoryId: FactoryId;\n month: string;\n limits: Budget[\"limits\"];\n}\n\nexport interface SettleTaskOptions {\n reason?: string;\n}\n\nexport interface AppendReceiptInput {\n repositoryIds: RepositoryId[];\n taskId?: TaskId;\n changeId?: ChangeId;\n kind: string;\n state: string;\n phase?: string;\n reason?: string;\n attempt?: number;\n cost?: Cost;\n decidedBy?: string;\n /** Same key twice appends one receipt and returns the existing one. */\n dedupeKey?: string;\n}\n\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\nexport interface FactoryStores {\n driverName: string;\n sessions: {\n create(input: Omit<AgentSession, \"schemaVersion\" | \"id\" | \"createdAt\" | \"execution\" | \"taskId\" | \"notifications\"> & { operationId: string }): Promise<AgentSession>;\n get(id: string): Promise<AgentSession | null>;\n list(): Promise<AgentSession[]>;\n bind(id: string, reference: { taskId: TaskId } | { execution: ExecutionReference }): Promise<AgentSession>;\n notify(event: CommunicationEvent): Promise<void>;\n };\n repositories: {\n put(repository: Repository): Promise<Repository>;\n get(id: RepositoryId): Promise<Repository | null>;\n list(): Promise<Repository[]>;\n };\n signals: {\n create(input: CreateSignalInput): Promise<Signal>;\n get(id: SignalId): Promise<Signal | null>;\n decide(id: SignalId, outcome: SignalOutcome, options?: DecideSignalOptions): Promise<Signal>;\n list(): Promise<Signal[]>;\n };\n tasks: {\n create(input: CreateTaskInput): Promise<Task>;\n get(id: TaskId): Promise<Task | null>;\n transition(id: TaskId, to: TaskState, options?: TaskTransitionOptions): Promise<Task>;\n answerQuestion(input: AnswerQuestionInput): Promise<{\n answerEvent: AnswerEvent;\n questionTask: Task;\n parentTask: Task | null;\n }>;\n /** Grant a required approval. The task stays queued; dispatch may now take it. */\n approve(id: TaskId, decision: ApprovalDecision): Promise<Task>;\n /** Deny a required approval. The task is cancelled with the reason. */\n reject(id: TaskId, decision: ApprovalDecision): Promise<Task>;\n /**\n * Record the provider's handle on the running attempt's execution, so the\n * reconciler can inspect or cancel it. Refused unless the task is running.\n */\n recordExecution(id: TaskId, execution: ExecutionReference): Promise<Task>;\n /** Add one model step's usage to the task. Idempotent per (turnId, stepIndex). Never settles. */\n recordUsage(id: TaskId, step: StepUsage): Promise<Task>;\n /**\n * Record measured cost on a terminal task. Idempotent: an already settled\n * task returns unchanged and writes no second receipt.\n */\n settle(id: TaskId, cost: Cost, options?: SettleTaskOptions): Promise<Task>;\n list(): Promise<Task[]>;\n };\n changes: {\n create(input: CreateChangeInput): Promise<Change>;\n get(id: ChangeId): Promise<Change | null>;\n transition(id: ChangeId, to: ChangeState, options?: ChangeTransitionOptions): Promise<Change>;\n list(): Promise<Change[]>;\n };\n receipts: {\n append(input: AppendReceiptInput): Promise<Receipt>;\n get(id: string): Promise<Receipt | null>;\n list(): Promise<Receipt[]>;\n };\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: string): 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: string,\n notice: \"warning\" | \"exhausted\",\n ): Promise<{ budget: Budget; stamped: boolean }>;\n };\n answers: {\n get(id: AnswerId): Promise<AnswerEvent | null>;\n };\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, attempt: number, reason: string, delayMs: number): Promise<OutboxMessage | null>;\n complete(id: OutboxId, attempt: number): Promise<OutboxMessage | null>;\n pending(limit?: number): Promise<OutboxMessage[]>;\n };\n}\n\nexport interface CreateStoresOptions {\n driver: StoreDriver;\n now?: () => string;\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\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(prefix: string): string {\n return `${prefix}_${randomUUID().replaceAll(\"-\", \"\")}`;\n}\n\nfunction derivedId(prefix: string, key: string): 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\nexport function createStores(options: CreateStoresOptions): FactoryStores {\n const { driver } = options;\n const now = options.now ?? (() => new Date().toISOString());\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 return { value: schema.parse(record.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 // 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: string,\n receipt: Omit<Receipt, \"schemaVersion\" | \"receiptId\" | \"recordedAt\">,\n ): Promise<Receipt> {\n const full = receiptSchema.parse({\n ...receipt,\n schemaVersion: SCHEMA_VERSION,\n receiptId,\n recordedAt: now(),\n });\n try {\n await driver.insert(\"receipts\", receiptId, 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 appendReceipt(\n key: string,\n receipt: Omit<Receipt, \"schemaVersion\" | \"receiptId\" | \"recordedAt\">,\n ): Promise<Receipt> {\n return insertReceipt(derivedId(\"rcpt\", key), receipt);\n }\n\n const stores: FactoryStores = {\n driverName: driver.name,\n\n sessions: {\n async create({ operationId, ...input }) {\n if (operationId.trim().length === 0 || operationId.length > 200) throw new Error(\"operationId must contain 1–200 characters\");\n const id = derivedId(\"ses\", JSON.stringify([input.owner, operationId]));\n const candidate = agentSessionSchema.parse({ ...input, id, schemaVersion: SCHEMA_VERSION, createdAt: now() });\n try {\n await driver.insert(\"sessions\", id, candidate);\n return candidate;\n } catch (error) {\n if (!(error instanceof RecordExistsError)) throw error;\n const existing = (await mustRead(\"sessions\", id, agentSessionSchema)).value;\n const { createdAt: _at, execution: _execution, taskId: _task, notifications: _notifications, ...intent } = existing;\n const { createdAt: _newAt, notifications: _newNotifications, ...nextIntent } = candidate;\n if (!sameStoredValue(intent, nextIntent)) throw new SessionConflictError(\"Session operationId was reused with different input\");\n return existing;\n }\n },\n async get(id) {\n return (await read(\"sessions\", id, agentSessionSchema))?.value ?? null;\n },\n list() { return listAll(\"sessions\", agentSessionSchema); },\n async bind(id, reference) {\n for (;;) {\n const existing = await mustRead(\"sessions\", id, agentSessionSchema);\n if (\"taskId\" in reference) {\n const task = (await mustRead(\"tasks\", reference.taskId, taskSchema)).value;\n if (task.origin.operator !== existing.value.owner || task.replyTo.channel !== \"api\" || task.replyTo.address !== id || task.repositoryIds[0] !== existing.value.repositoryId) {\n throw new SessionConflictError(\"Task does not belong to this session\");\n }\n }\n const previous = existing.value.taskId === undefined\n ? existing.value.execution === undefined ? undefined : { execution: existing.value.execution }\n : { taskId: existing.value.taskId };\n if (previous !== undefined) {\n if (!sameStoredValue(previous, reference)) throw new SessionConflictError(\"Session execution binding cannot be replaced\");\n return existing.value;\n }\n const next = agentSessionSchema.parse({ ...existing.value, ...reference });\n try {\n await driver.update(\"sessions\", id, 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\") throw new SessionConflictError(\"Expected an API notification\");\n for (;;) {\n const record = await mustRead(\"sessions\", event.replyTo.address, agentSessionSchema);\n const existing = record.value.notifications.find((item) => item.eventId === event.eventId);\n if (existing !== undefined) {\n if (!sameStoredValue(existing, event)) throw new SessionConflictError(\"Notification eventId was reused\");\n return;\n }\n const next = agentSessionSchema.parse({ ...record.value, notifications: [...record.value.notifications, event] });\n try { await driver.update(\"sessions\", next.id, next, record.version); return; }\n catch (error) { if (!(error instanceof VersionConflictError)) throw error; }\n }\n },\n },\n\n repositories: {\n async put(repository) {\n const parsed = repositorySchema.parse(repository);\n const existing = await read(\"repositories\", parsed.id, repositorySchema);\n if (existing === null) {\n await driver.insert(\"repositories\", parsed.id, parsed);\n } else {\n await driver.update(\"repositories\", parsed.id, parsed, existing.version);\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(\"signals\", id, 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 decide(id, outcome, decideOptions = {}) {\n const existing = await mustRead(\"signals\", id, signalSchema);\n assertTransition(signalOutcomeTransitions, existing.value.outcome, outcome);\n const next = signalSchema.parse({\n ...existing.value,\n outcome,\n detail: decideOptions.detail,\n reason: decideOptions.reason,\n decidedAt: now(),\n });\n await driver.update(\"signals\", id, next, existing.version);\n return next;\n },\n list() {\n return listAll(\"signals\", signalSchema);\n },\n },\n\n tasks: {\n async create(input) {\n const timestamp = now();\n const id = input.dedupeKey === undefined\n ? randomId(\"task\")\n : derivedId(\"task\", input.dedupeKey);\n const 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: input.origin,\n dependsOn: input.dependsOn,\n replyTo: input.replyTo,\n attempt: 1,\n question: input.question,\n changeId: input.changeId,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n try {\n await driver.insert(\"tasks\", task.id, task);\n return task;\n } catch (error) {\n if (input.dedupeKey !== undefined && error instanceof RecordExistsError) {\n const existing = await mustRead(\"tasks\", task.id, taskSchema);\n return existing.value;\n }\n throw error;\n }\n },\n async approve(id, decision) {\n const existing = await mustRead(\"tasks\", id, taskSchema);\n const task = existing.value;\n if (task.approval !== \"required\") {\n throw new ApprovalError(id, `approval is ${task.approval ?? \"not required\"}`);\n }\n if (task.state !== \"queued\") {\n throw new ApprovalError(id, `task is ${task.state}, not queued`);\n }\n const next = taskSchema.parse({ ...task, approval: \"granted\", updatedAt: now() });\n if (next.repositoryIds !== undefined) {\n await appendReceipt(`task:${id}:approved:${next.attempt}`, {\n repositoryIds: next.repositoryIds,\n taskId: id,\n kind: next.kind,\n state: \"approved\",\n phase: \"approval\",\n reason: decision.reason,\n attempt: next.attempt,\n decidedBy: decision.by,\n });\n }\n await driver.update(\"tasks\", id, next, existing.version);\n return next;\n },\n async reject(id, decision) {\n const existing = await mustRead(\"tasks\", id, taskSchema);\n const task = existing.value;\n if (task.approval !== \"required\") {\n throw new ApprovalError(id, `approval is ${task.approval ?? \"not required\"}`);\n }\n if (task.state !== \"queued\") {\n throw new ApprovalError(id, `task is ${task.state}, not queued`);\n }\n const next = taskSchema.parse({\n ...task,\n approval: \"denied\",\n state: \"cancelled\",\n updatedAt: now(),\n });\n if (next.repositoryIds !== undefined) {\n await appendReceipt(`task:${id}:rejected:${next.attempt}`, {\n repositoryIds: next.repositoryIds,\n taskId: id,\n kind: next.kind,\n state: \"rejected\",\n phase: \"approval\",\n reason: decision.reason,\n attempt: next.attempt,\n decidedBy: decision.by,\n });\n await appendReceipt(`task:${id}:cancelled:${next.attempt}`, {\n repositoryIds: next.repositoryIds,\n taskId: id,\n kind: next.kind,\n state: \"cancelled\",\n reason: decision.reason ?? `rejected by ${decision.by}`,\n attempt: next.attempt,\n });\n }\n await driver.update(\"tasks\", id, next, existing.version);\n return next;\n },\n async recordExecution(id, execution) {\n const existing = await mustRead(\"tasks\", id, taskSchema);\n const task = existing.value;\n if (task.state !== \"running\") {\n throw new InvalidTransitionError(task.state, \"running\", legalNextStates(taskTransitions, task.state));\n }\n const timestamp = now();\n const next = taskSchema.parse({\n ...task,\n execution,\n lastProgressAt: timestamp,\n updatedAt: timestamp,\n });\n await driver.update(\"tasks\", id, next, existing.version);\n return next;\n },\n async recordUsage(id, step) {\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 for (;;) {\n const existing = await mustRead(\"tasks\", id, taskSchema);\n const task = existing.value;\n const usage = task.usage ?? emptyUsage;\n const recordedIndex = usage.steps[step.turnId];\n if (recordedIndex !== undefined && step.stepIndex <= recordedIndex) {\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 driver.update(\"tasks\", id, next, existing.version);\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) {\n throw error;\n }\n }\n }\n },\n async settle(id, cost, settleOptions = {}) {\n const existing = await mustRead(\"tasks\", id, taskSchema);\n const task = existing.value;\n // A task settles once. Re-execution cost after an operator retry is\n // not separately metered; that is the unresolved multi-attempt\n // accounting decision, deferred to its own change.\n if (task.settledUsd !== undefined) {\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(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: settleOptions.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 driver.update(\"tasks\", id, next, existing.version);\n return next;\n },\n async get(id) {\n const record = await read(\"tasks\", id, taskSchema);\n return record === null ? null : record.value;\n },\n async answerQuestion(input) {\n const question = await mustRead(\"tasks\", input.questionTaskId, taskSchema);\n if (question.value.kind !== \"question\" || 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(`question task ${input.questionTaskId} is ${question.value.state}, not waiting`);\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.origin.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 let answerEvent = candidate;\n try {\n await driver.insert(\"answers\", id, 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, taskSchema);\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 driver.update(\"tasks\", parent.value.id, projected, parent.version);\n parentTask = projected;\n break;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n if (parentTask.state === \"needs_human\") {\n parentTask = await stores.tasks.transition(parentTask.id, \"queued\", {\n reason: `question ${answerEvent.questionTaskId} answered by ${answerEvent.answeredBy}`,\n });\n }\n }\n\n let questionTask = await mustRead(\"tasks\", input.questionTaskId, taskSchema).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 reason: \"question answered through Foreman\",\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, transitionOptions = {}) {\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 const existing = await mustRead(\"tasks\", id, taskSchema);\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 assertTransition(taskTransitions, existing.value.state, to);\n if (to === \"needs_human\" && existing.value.kind !== \"question\") {\n if (transitionOptions.questionTaskId === undefined) {\n throw new Error(\n `task ${id} cannot enter needs_human without a QuestionTask id`,\n );\n }\n const question = await mustRead(\"tasks\", transitionOptions.questionTaskId, taskSchema);\n if (\n question.value.kind !== \"question\" ||\n question.value.state !== \"needs_human\" ||\n question.value.origin.parentTaskId !== id\n ) {\n throw new Error(`task ${id} cannot enter needs_human for question ${question.value.id}`);\n }\n }\n const bumps = bumpsAttempt(existing.value.state, to);\n const timestamp = now();\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 ...cleared\n } = existing.value;\n const next = taskSchema.parse({\n ...cleared,\n ...(bumps ? { execution: undefined } : {}),\n ...transitionOptions.patch,\n ...(to === \"needs_human\" && existing.value.kind !== \"question\"\n ? { questionTaskId: transitionOptions.questionTaskId }\n : {}),\n ...(to === \"stalled\" ? { stalledAt: timestamp, stalledReason: transitionOptions.reason } : {}),\n ...(to === \"running\" ? { lastProgressAt: timestamp } : {}),\n state: to,\n attempt: bumps ? existing.value.attempt + 1 : existing.value.attempt,\n updatedAt: timestamp,\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 await appendReceipt(\n JSON.stringify([\n \"task\",\n id,\n receiptState,\n next.attempt,\n next.changeId ?? 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 reason: transitionOptions.reason,\n attempt: next.attempt,\n },\n );\n }\n await driver.update(\"tasks\", id, next, existing.version);\n return next;\n },\n list() {\n return listAll(\"tasks\", taskSchema);\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, taskSchema)).value;\n if (task.kind !== \"code_change\") {\n throw new ChangeAssociationError(\n change.taskId,\n change.repositoryId,\n \"changes can only be produced by code_change tasks\",\n );\n }\n const taskRepositoryId = task.repositoryIds[0];\n if (taskRepositoryId !== 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 try {\n await driver.insert(\"changes\", change.id, change);\n return change;\n } catch (error) {\n if (error instanceof RecordExistsError) {\n const existing = await mustRead(\"changes\", change.id, changeSchema);\n return existing.value;\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 transition(id, to, transitionOptions = {}) {\n const existing = await mustRead(\"changes\", id, changeSchema);\n assertTransition(changeTransitions, 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 driver.update(\"changes\", id, next, existing.version);\n return next;\n },\n list() {\n return listAll(\"changes\", changeSchema);\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(\"budgets\", input.month, 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(\"budgets\", input.month, refreshed, existing.version);\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(\"budgets\", month, next, existing.version);\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) await driver.insert(\"outboxQueues\", queueId, queue);\n else await driver.update(\"outboxQueues\", queueId, queue, existing.version);\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 \"outboxQueues\",\n queueId,\n outboxQueueSchema.parse({ ...queue.value, messages, updatedAt: now() }),\n 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 \"outboxQueues\",\n queueId,\n outboxQueueSchema.parse({ ...queue.value, messages, updatedAt: timestamp }),\n queue.version,\n );\n return next;\n } catch (error) {\n if (!(error instanceof VersionConflictError)) throw error;\n }\n }\n },\n async retry(id, attempt, reason, delayMs) {\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 \"outboxQueues\",\n queueId,\n outboxQueueSchema.parse({ ...queue.value, messages, updatedAt: timestamp }),\n 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(\"outboxDeliveries\", id, 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 \"outboxQueues\",\n queueId,\n outboxQueueSchema.parse({ ...queue.value, messages, updatedAt: timestamp }),\n 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\".split(\"\").map((shard) =>\n read(\"outboxQueues\", `communication-${shard}`, outboxQueueSchema)\n ),\n );\n const timestamp = now();\n return queues\n .flatMap((queue) => queue?.value.messages ?? [])\n .filter((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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"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { s as taskKindSchema } from "./task-CcOyOJ3k.mjs";
|
|
2
|
-
import { r as defaultApprovalPolicy, t as approvalPolicySchema } from "./approval-JX2Px9IC.mjs";
|
|
3
|
-
import { a as repositorySlugSchema, t as budgetLimitsSchema } from "./budget-DzSiIA4t.mjs";
|
|
4
|
-
import { z } from "zod";
|
|
5
|
-
//#region src/schema/factory-config.ts
|
|
6
|
-
const factoryConfigRepositorySchema = z.strictObject({
|
|
7
|
-
slug: repositorySlugSchema.describe("Repository this factory may work on."),
|
|
8
|
-
dependsOn: z.array(repositorySlugSchema).default([]).describe("Repositories that must land changes before this repository.")
|
|
9
|
-
});
|
|
10
|
-
const githubConnectorSchema = z.strictObject({
|
|
11
|
-
owner: z.string().regex(/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/).describe("GitHub user or organization that owns this connector installation."),
|
|
12
|
-
connector: z.string().regex(/^github\/[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/).describe("Vercel Connect UID installed for this GitHub owner.")
|
|
13
|
-
});
|
|
14
|
-
const slackConnectorSchema = z.strictObject({ connector: z.string().regex(/^slack\/[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/).describe("Vercel Connect UID installed for this Slack app.") });
|
|
15
|
-
const executionPolicySchema = z.strictObject({
|
|
16
|
-
maxAttempts: z.number().int().min(1).describe("Attempts a task may consume before a stall fails it for good."),
|
|
17
|
-
stallMinutes: z.number().int().min(1).describe("Minutes without progress before a running task is marked stalled."),
|
|
18
|
-
stallMinutesByKind: z.record(taskKindSchema, z.number().int().min(1)).default({}).describe("Per-kind stall windows for long single-step work, e.g. security_scan: 300.")
|
|
19
|
-
});
|
|
20
|
-
const defaultExecutionPolicy = {
|
|
21
|
-
maxAttempts: 3,
|
|
22
|
-
stallMinutes: 45,
|
|
23
|
-
stallMinutesByKind: {}
|
|
24
|
-
};
|
|
25
|
-
const factoryConfigSchema = z.strictObject({
|
|
26
|
-
connectors: z.strictObject({
|
|
27
|
-
github: z.array(githubConnectorSchema).refine((connectors) => new Set(connectors.map(({ owner }) => owner)).size === connectors.length, "GitHub connector owners must be unique."),
|
|
28
|
-
slack: z.array(slackConnectorSchema).max(1, "A factory may configure one Slack connector.").default([])
|
|
29
|
-
}).default({
|
|
30
|
-
github: [],
|
|
31
|
-
slack: []
|
|
32
|
-
}).describe("Provider connections available to this factory."),
|
|
33
|
-
repositories: z.array(factoryConfigRepositorySchema).min(1).describe("Repositories this factory is allowed to inspect and change."),
|
|
34
|
-
operators: z.array(z.string().min(1)).min(1).describe("Provider-qualified identities allowed to operate this factory."),
|
|
35
|
-
approval: approvalPolicySchema.default(defaultApprovalPolicy).describe("Which tasks wait for a human before they run. First match wins."),
|
|
36
|
-
budget: budgetLimitsSchema.default({
|
|
37
|
-
totalUsd: 500,
|
|
38
|
-
investigationUsd: 100,
|
|
39
|
-
perTaskReservationUsd: 5,
|
|
40
|
-
warningPercent: 80
|
|
41
|
-
}).describe("Monthly spend limits. One non-disableable budget per factory per month."),
|
|
42
|
-
execution: executionPolicySchema.default(defaultExecutionPolicy).describe("Stall detection and retry limits for running tasks.")
|
|
43
|
-
});
|
|
44
|
-
function defineFactory(config) {
|
|
45
|
-
return factoryConfigSchema.parse(config);
|
|
46
|
-
}
|
|
47
|
-
//#endregion
|
|
48
|
-
export { factoryConfigSchema as a, factoryConfigRepositorySchema as i, defineFactory as n, executionPolicySchema as r, defaultExecutionPolicy as t };
|
|
49
|
-
|
|
50
|
-
//# sourceMappingURL=factory-config-BoRXOw43.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"factory-config-BoRXOw43.mjs","names":[],"sources":["../src/schema/factory-config.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { approvalPolicySchema, defaultApprovalPolicy } from \"../approval\";\nimport { budgetLimitsSchema } from \"./budget\";\nimport { repositorySlugSchema } from \"./repository\";\nimport { taskKindSchema } from \"./task\";\n\nexport const factoryConfigRepositorySchema = z.strictObject({\n slug: repositorySlugSchema.describe(\"Repository this factory may work on.\"),\n dependsOn: z\n .array(repositorySlugSchema)\n .default([])\n .describe(\"Repositories that must land changes before this repository.\"),\n});\n\nconst githubConnectorSchema = z.strictObject({\n owner: z\n .string()\n .regex(/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/)\n .describe(\"GitHub user or organization that owns this connector installation.\"),\n connector: z\n .string()\n .regex(/^github\\/[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/)\n .describe(\"Vercel Connect UID installed for this GitHub owner.\"),\n});\n\nconst slackConnectorSchema = z.strictObject({\n connector: z\n .string()\n .regex(/^slack\\/[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/)\n .describe(\"Vercel Connect UID installed for this Slack app.\"),\n});\n\nexport const executionPolicySchema = z.strictObject({\n maxAttempts: z\n .number()\n .int()\n .min(1)\n .describe(\"Attempts a task may consume before a stall fails it for good.\"),\n stallMinutes: z\n .number()\n .int()\n .min(1)\n .describe(\"Minutes without progress before a running task is marked stalled.\"),\n stallMinutesByKind: z\n .record(taskKindSchema, z.number().int().min(1))\n .default({})\n .describe(\"Per-kind stall windows for long single-step work, e.g. security_scan: 300.\"),\n});\n\nexport type ExecutionPolicy = z.infer<typeof executionPolicySchema>;\n\nexport const defaultExecutionPolicy: ExecutionPolicy = {\n maxAttempts: 3,\n stallMinutes: 45,\n stallMinutesByKind: {},\n};\n\nexport const factoryConfigSchema = z.strictObject({\n connectors: z\n .strictObject({\n github: z\n .array(githubConnectorSchema)\n .refine(\n (connectors) => new Set(connectors.map(({ owner }) => owner)).size === connectors.length,\n \"GitHub connector owners must be unique.\",\n ),\n slack: z\n .array(slackConnectorSchema)\n .max(1, \"A factory may configure one Slack connector.\")\n .default([]),\n })\n .default({ github: [], slack: [] })\n .describe(\"Provider connections available to this factory.\"),\n repositories: z\n .array(factoryConfigRepositorySchema)\n .min(1)\n .describe(\"Repositories this factory is allowed to inspect and change.\"),\n operators: z\n .array(z.string().min(1))\n .min(1)\n .describe(\"Provider-qualified identities allowed to operate this factory.\"),\n approval: approvalPolicySchema\n .default(defaultApprovalPolicy)\n .describe(\"Which tasks wait for a human before they run. First match wins.\"),\n budget: budgetLimitsSchema\n .default({\n totalUsd: 500,\n investigationUsd: 100,\n perTaskReservationUsd: 5,\n warningPercent: 80,\n })\n .describe(\"Monthly spend limits. One non-disableable budget per factory per month.\"),\n execution: executionPolicySchema\n .default(defaultExecutionPolicy)\n .describe(\"Stall detection and retry limits for running tasks.\"),\n});\n\nexport type FactoryConfig = z.infer<typeof factoryConfigSchema>;\nexport type FactoryConfigInput = z.input<typeof factoryConfigSchema>;\n\nexport function defineFactory(config: FactoryConfigInput): FactoryConfig {\n return factoryConfigSchema.parse(config);\n}\n"],"mappings":";;;;;AAMA,MAAa,gCAAgC,EAAE,aAAa;CAC1D,MAAM,qBAAqB,SAAS,sCAAsC;CAC1E,WAAW,EACR,MAAM,oBAAoB,CAAC,CAC3B,QAAQ,CAAC,CAAC,CAAC,CACX,SAAS,6DAA6D;AAC3E,CAAC;AAED,MAAM,wBAAwB,EAAE,aAAa;CAC3C,OAAO,EACJ,OAAO,CAAC,CACR,MAAM,mCAAmC,CAAC,CAC1C,SAAS,oEAAoE;CAChF,WAAW,EACR,OAAO,CAAC,CACR,MAAM,2CAA2C,CAAC,CAClD,SAAS,qDAAqD;AACnE,CAAC;AAED,MAAM,uBAAuB,EAAE,aAAa,EAC1C,WAAW,EACR,OAAO,CAAC,CACR,MAAM,0CAA0C,CAAC,CACjD,SAAS,kDAAkD,EAChE,CAAC;AAED,MAAa,wBAAwB,EAAE,aAAa;CAClD,aAAa,EACV,OAAO,CAAC,CACR,IAAI,CAAC,CACL,IAAI,CAAC,CAAC,CACN,SAAS,+DAA+D;CAC3E,cAAc,EACX,OAAO,CAAC,CACR,IAAI,CAAC,CACL,IAAI,CAAC,CAAC,CACN,SAAS,mEAAmE;CAC/E,oBAAoB,EACjB,OAAO,gBAAgB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC/C,QAAQ,CAAC,CAAC,CAAC,CACX,SAAS,4EAA4E;AAC1F,CAAC;AAID,MAAa,yBAA0C;CACrD,aAAa;CACb,cAAc;CACd,oBAAoB,CAAC;AACvB;AAEA,MAAa,sBAAsB,EAAE,aAAa;CAChD,YAAY,EACT,aAAa;EACZ,QAAQ,EACL,MAAM,qBAAqB,CAAC,CAC5B,QACE,eAAe,IAAI,IAAI,WAAW,KAAK,EAAE,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,WAAW,QAClF,yCACF;EACF,OAAO,EACJ,MAAM,oBAAoB,CAAC,CAC3B,IAAI,GAAG,8CAA8C,CAAC,CACtD,QAAQ,CAAC,CAAC;CACf,CAAC,CAAC,CACD,QAAQ;EAAE,QAAQ,CAAC;EAAG,OAAO,CAAC;CAAE,CAAC,CAAC,CAClC,SAAS,iDAAiD;CAC7D,cAAc,EACX,MAAM,6BAA6B,CAAC,CACpC,IAAI,CAAC,CAAC,CACN,SAAS,6DAA6D;CACzE,WAAW,EACR,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACxB,IAAI,CAAC,CAAC,CACN,SAAS,gEAAgE;CAC5E,UAAU,qBACP,QAAQ,qBAAqB,CAAC,CAC9B,SAAS,iEAAiE;CAC7E,QAAQ,mBACL,QAAQ;EACP,UAAU;EACV,kBAAkB;EAClB,uBAAuB;EACvB,gBAAgB;CAClB,CAAC,CAAC,CACD,SAAS,yEAAyE;CACrF,WAAW,sBACR,QAAQ,sBAAsB,CAAC,CAC/B,SAAS,qDAAqD;AACnE,CAAC;AAKD,SAAgB,cAAc,QAA2C;CACvE,OAAO,oBAAoB,MAAM,MAAM;AACzC"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
//#region src/schema/factory-config.d.ts
|
|
3
|
-
declare const factoryConfigRepositorySchema: z.ZodObject<{
|
|
4
|
-
slug: z.ZodString;
|
|
5
|
-
dependsOn: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
6
|
-
}, z.core.$strict>;
|
|
7
|
-
declare const executionPolicySchema: z.ZodObject<{
|
|
8
|
-
maxAttempts: z.ZodNumber;
|
|
9
|
-
stallMinutes: z.ZodNumber;
|
|
10
|
-
stallMinutesByKind: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodNumber>>;
|
|
11
|
-
}, z.core.$strict>;
|
|
12
|
-
type ExecutionPolicy = z.infer<typeof executionPolicySchema>;
|
|
13
|
-
declare const defaultExecutionPolicy: ExecutionPolicy;
|
|
14
|
-
declare const factoryConfigSchema: z.ZodObject<{
|
|
15
|
-
connectors: z.ZodDefault<z.ZodObject<{
|
|
16
|
-
github: z.ZodArray<z.ZodObject<{
|
|
17
|
-
owner: z.ZodString;
|
|
18
|
-
connector: z.ZodString;
|
|
19
|
-
}, z.core.$strict>>;
|
|
20
|
-
slack: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
21
|
-
connector: z.ZodString;
|
|
22
|
-
}, z.core.$strict>>>;
|
|
23
|
-
}, z.core.$strict>>;
|
|
24
|
-
repositories: z.ZodArray<z.ZodObject<{
|
|
25
|
-
slug: z.ZodString;
|
|
26
|
-
dependsOn: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
27
|
-
}, z.core.$strict>>;
|
|
28
|
-
operators: z.ZodArray<z.ZodString>;
|
|
29
|
-
approval: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
30
|
-
source: z.ZodOptional<z.ZodString>;
|
|
31
|
-
kind: z.ZodOptional<z.ZodString>;
|
|
32
|
-
priority: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
33
|
-
P0: "P0";
|
|
34
|
-
P1: "P1";
|
|
35
|
-
P2: "P2";
|
|
36
|
-
P3: "P3";
|
|
37
|
-
}>>>;
|
|
38
|
-
require: z.ZodBoolean;
|
|
39
|
-
}, z.core.$strict>>>;
|
|
40
|
-
budget: z.ZodDefault<z.ZodObject<{
|
|
41
|
-
totalUsd: z.ZodNumber;
|
|
42
|
-
investigationUsd: z.ZodNumber;
|
|
43
|
-
perTaskReservationUsd: z.ZodNumber;
|
|
44
|
-
warningPercent: z.ZodNumber;
|
|
45
|
-
perRepositoryUsd: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
|
|
46
|
-
}, z.core.$strict>>;
|
|
47
|
-
execution: z.ZodDefault<z.ZodObject<{
|
|
48
|
-
maxAttempts: z.ZodNumber;
|
|
49
|
-
stallMinutes: z.ZodNumber;
|
|
50
|
-
stallMinutesByKind: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodNumber>>;
|
|
51
|
-
}, z.core.$strict>>;
|
|
52
|
-
}, z.core.$strict>;
|
|
53
|
-
type FactoryConfig = z.infer<typeof factoryConfigSchema>;
|
|
54
|
-
type FactoryConfigInput = z.input<typeof factoryConfigSchema>;
|
|
55
|
-
declare function defineFactory(config: FactoryConfigInput): FactoryConfig;
|
|
56
|
-
//#endregion
|
|
57
|
-
export { defineFactory as a, factoryConfigSchema as c, defaultExecutionPolicy as i, FactoryConfig as n, executionPolicySchema as o, FactoryConfigInput as r, factoryConfigRepositorySchema as s, ExecutionPolicy as t };
|
|
58
|
-
//# sourceMappingURL=factory-config-D2yU3G0c.d.mts.map
|
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
import { a as WebhookEvent, r as NormalizedSignal } from "./index-Bw6hggoH.mjs";
|
|
2
|
-
//#region src/github.d.ts
|
|
3
|
-
interface GitHubRepositoryRequest {
|
|
4
|
-
repository: string;
|
|
5
|
-
token: string;
|
|
6
|
-
fetch?: typeof globalThis.fetch;
|
|
7
|
-
}
|
|
8
|
-
interface CreatePullRequestInput extends GitHubRepositoryRequest {
|
|
9
|
-
title: string;
|
|
10
|
-
head: string;
|
|
11
|
-
base: string;
|
|
12
|
-
body?: string;
|
|
13
|
-
draft?: boolean;
|
|
14
|
-
}
|
|
15
|
-
interface CreatedPullRequest {
|
|
16
|
-
prNumber: number;
|
|
17
|
-
prUrl: string;
|
|
18
|
-
}
|
|
19
|
-
type ReviewCommentAuthorPolicy = "write" | "any";
|
|
20
|
-
interface ReviewCommentTrustInput {
|
|
21
|
-
/** Defaults to `write`. Use `any` only when untrusted review text is handled as data. */
|
|
22
|
-
authorPolicy?: ReviewCommentAuthorPolicy;
|
|
23
|
-
}
|
|
24
|
-
interface ReadReviewCommentInput extends GitHubRepositoryRequest, ReviewCommentTrustInput {
|
|
25
|
-
commentId: number;
|
|
26
|
-
}
|
|
27
|
-
interface GitHubReviewComment {
|
|
28
|
-
id: number;
|
|
29
|
-
body: string;
|
|
30
|
-
url: string;
|
|
31
|
-
author: string;
|
|
32
|
-
inReplyToId: number | null;
|
|
33
|
-
}
|
|
34
|
-
interface AnswerReviewCommentInput extends GitHubRepositoryRequest, ReviewCommentTrustInput {
|
|
35
|
-
pullRequestNumber: number;
|
|
36
|
-
commentId: number;
|
|
37
|
-
body: string;
|
|
38
|
-
}
|
|
39
|
-
interface ReadPullRequestHeadInput extends GitHubRepositoryRequest {
|
|
40
|
-
pullRequestNumber: number;
|
|
41
|
-
}
|
|
42
|
-
interface GitHubPullRequestHead {
|
|
43
|
-
branch: string;
|
|
44
|
-
sha: string;
|
|
45
|
-
repository: string;
|
|
46
|
-
}
|
|
47
|
-
interface GitHubPullRequest {
|
|
48
|
-
number: number;
|
|
49
|
-
url: string;
|
|
50
|
-
author: string;
|
|
51
|
-
state: "open" | "closed";
|
|
52
|
-
}
|
|
53
|
-
type PullRequestReviewEvent = "APPROVE" | "REQUEST_CHANGES" | "COMMENT";
|
|
54
|
-
interface PullRequestReviewComment {
|
|
55
|
-
path: string;
|
|
56
|
-
line: number;
|
|
57
|
-
body: string;
|
|
58
|
-
}
|
|
59
|
-
interface SubmitPullRequestReviewInput extends GitHubRepositoryRequest {
|
|
60
|
-
pullRequestNumber: number;
|
|
61
|
-
commitId: string;
|
|
62
|
-
event: PullRequestReviewEvent;
|
|
63
|
-
body: string;
|
|
64
|
-
comments?: readonly PullRequestReviewComment[];
|
|
65
|
-
}
|
|
66
|
-
interface SubmittedPullRequestReview {
|
|
67
|
-
id: number;
|
|
68
|
-
url: string;
|
|
69
|
-
state: string;
|
|
70
|
-
}
|
|
71
|
-
interface GitHubIssueComment {
|
|
72
|
-
id: number;
|
|
73
|
-
body: string;
|
|
74
|
-
url: string;
|
|
75
|
-
author: string;
|
|
76
|
-
authorType: "Bot" | "User" | "Organization";
|
|
77
|
-
}
|
|
78
|
-
interface ListPullRequestCommentsInput extends GitHubRepositoryRequest {
|
|
79
|
-
pullRequestNumber: number;
|
|
80
|
-
}
|
|
81
|
-
interface CreatePullRequestCommentInput extends ListPullRequestCommentsInput {
|
|
82
|
-
body: string;
|
|
83
|
-
}
|
|
84
|
-
interface UpdatePullRequestCommentInput extends GitHubRepositoryRequest {
|
|
85
|
-
commentId: number;
|
|
86
|
-
body: string;
|
|
87
|
-
}
|
|
88
|
-
interface PullRequestLabelInput extends GitHubRepositoryRequest {
|
|
89
|
-
pullRequestNumber: number;
|
|
90
|
-
label: string;
|
|
91
|
-
}
|
|
92
|
-
interface ConflictedPullRequest {
|
|
93
|
-
prNumber: number;
|
|
94
|
-
prUrl: string;
|
|
95
|
-
headBranch: string;
|
|
96
|
-
headSha: string;
|
|
97
|
-
baseBranch: string;
|
|
98
|
-
baseSha: string;
|
|
99
|
-
}
|
|
100
|
-
type ListConflictedPullRequestsInput = GitHubRepositoryRequest;
|
|
101
|
-
type CheckRunStatus = "queued" | "in_progress" | "completed";
|
|
102
|
-
type GitHubCheckRunStatus = CheckRunStatus | "waiting" | "requested" | "pending";
|
|
103
|
-
type CheckRunConclusion = "action_required" | "cancelled" | "failure" | "neutral" | "skipped" | "success" | "timed_out";
|
|
104
|
-
type CheckRunAnnotationLevel = "notice" | "warning" | "failure";
|
|
105
|
-
interface CheckRunAnnotation {
|
|
106
|
-
path: string;
|
|
107
|
-
startLine: number;
|
|
108
|
-
endLine?: number;
|
|
109
|
-
startColumn?: number;
|
|
110
|
-
endColumn?: number;
|
|
111
|
-
annotationLevel: CheckRunAnnotationLevel;
|
|
112
|
-
message: string;
|
|
113
|
-
title?: string;
|
|
114
|
-
rawDetails?: string;
|
|
115
|
-
}
|
|
116
|
-
interface CheckRunOutput {
|
|
117
|
-
title: string;
|
|
118
|
-
summary: string;
|
|
119
|
-
text?: string;
|
|
120
|
-
annotations?: readonly CheckRunAnnotation[];
|
|
121
|
-
}
|
|
122
|
-
interface CheckRunFields {
|
|
123
|
-
status?: CheckRunStatus;
|
|
124
|
-
conclusion?: CheckRunConclusion;
|
|
125
|
-
detailsUrl?: string;
|
|
126
|
-
externalId?: string;
|
|
127
|
-
startedAt?: string;
|
|
128
|
-
completedAt?: string;
|
|
129
|
-
output?: CheckRunOutput;
|
|
130
|
-
}
|
|
131
|
-
interface CreateCheckRunInput extends GitHubRepositoryRequest, CheckRunFields {
|
|
132
|
-
name: string;
|
|
133
|
-
headSha: string;
|
|
134
|
-
}
|
|
135
|
-
interface UpdateCheckRunInput extends GitHubRepositoryRequest, CheckRunFields {
|
|
136
|
-
checkRunId: number;
|
|
137
|
-
name?: string;
|
|
138
|
-
}
|
|
139
|
-
interface ListCheckRunsForRefInput extends GitHubRepositoryRequest {
|
|
140
|
-
ref: string;
|
|
141
|
-
checkName?: string;
|
|
142
|
-
}
|
|
143
|
-
interface GitHubCheckRun {
|
|
144
|
-
id: number;
|
|
145
|
-
name: string;
|
|
146
|
-
headSha: string;
|
|
147
|
-
status: GitHubCheckRunStatus;
|
|
148
|
-
conclusion: CheckRunConclusion | "stale" | "startup_failure" | null;
|
|
149
|
-
url: string | null;
|
|
150
|
-
detailsUrl: string | null;
|
|
151
|
-
externalId: string | null;
|
|
152
|
-
startedAt: string | null;
|
|
153
|
-
completedAt: string | null;
|
|
154
|
-
}
|
|
155
|
-
declare class GitHubReviewCommentAuthorError extends Error {
|
|
156
|
-
readonly author: string;
|
|
157
|
-
constructor(author: string);
|
|
158
|
-
}
|
|
159
|
-
/** Create a pull request from an existing head branch. */
|
|
160
|
-
declare function createPullRequest(input: CreatePullRequestInput): Promise<CreatedPullRequest>;
|
|
161
|
-
/** Create a check run for one commit. Requires a GitHub App token with checks:write. */
|
|
162
|
-
declare function createCheckRun(input: CreateCheckRunInput): Promise<GitHubCheckRun>;
|
|
163
|
-
/** Update a check run previously created by the authenticated GitHub App. */
|
|
164
|
-
declare function updateCheckRun(input: UpdateCheckRunInput): Promise<GitHubCheckRun>;
|
|
165
|
-
/** List check runs reported for a commit, branch, or tag. */
|
|
166
|
-
declare function listCheckRunsForRef(input: ListCheckRunsForRefInput): Promise<GitHubCheckRun[]>;
|
|
167
|
-
/** List every issue-style comment in a pull request conversation. */
|
|
168
|
-
declare function listPullRequestComments(input: ListPullRequestCommentsInput): Promise<GitHubIssueComment[]>;
|
|
169
|
-
/** Add one issue-style comment to a pull request conversation. */
|
|
170
|
-
declare function createPullRequestComment(input: CreatePullRequestCommentInput): Promise<GitHubIssueComment>;
|
|
171
|
-
/** Edit one issue-style pull request comment. */
|
|
172
|
-
declare function updatePullRequestComment(input: UpdatePullRequestCommentInput): Promise<GitHubIssueComment>;
|
|
173
|
-
/** Read one inline review comment after applying the author policy, which requires write access by default. */
|
|
174
|
-
declare function readReviewComment(input: ReadReviewCommentInput): Promise<GitHubReviewComment>;
|
|
175
|
-
/** Reply to an inline review comment after applying the author policy, which requires write access by default. */
|
|
176
|
-
declare function answerReviewComment(input: AnswerReviewCommentInput): Promise<GitHubReviewComment>;
|
|
177
|
-
/** Submit a summary and optional inline comments against a reviewed pull request commit. */
|
|
178
|
-
declare function submitPullRequestReview(input: SubmitPullRequestReviewInput): Promise<SubmittedPullRequestReview>;
|
|
179
|
-
/** Read the current head branch and commit of a pull request. */
|
|
180
|
-
declare function readPullRequestHead(input: ReadPullRequestHeadInput): Promise<GitHubPullRequestHead>;
|
|
181
|
-
/** Read the provider-owned identity and lifecycle of one pull request. */
|
|
182
|
-
declare function readPullRequest(input: ReadPullRequestHeadInput): Promise<GitHubPullRequest>;
|
|
183
|
-
/** List open, same-repository pull requests by one author that GitHub reports as conflicting. */
|
|
184
|
-
declare function listConflictedPullRequests(input: ListConflictedPullRequestsInput): Promise<ConflictedPullRequest[]>;
|
|
185
|
-
/** Add one label to a pull request. */
|
|
186
|
-
declare function addLabel(input: PullRequestLabelInput): Promise<string[]>;
|
|
187
|
-
/** Remove one label from a pull request. */
|
|
188
|
-
declare function removeLabel(input: PullRequestLabelInput): Promise<string[]>;
|
|
189
|
-
/**
|
|
190
|
-
* Verify a GitHub webhook HMAC signature (the x-hub-signature-256 header)
|
|
191
|
-
* against the raw request body. Returns false for missing or malformed
|
|
192
|
-
* signatures instead of throwing.
|
|
193
|
-
*/
|
|
194
|
-
declare function verifyGitHubSignature(options: {
|
|
195
|
-
secret: string;
|
|
196
|
-
payload: string;
|
|
197
|
-
signature: string | null;
|
|
198
|
-
}): boolean;
|
|
199
|
-
interface GitHubDefaultBranchPush {
|
|
200
|
-
source: "github_default_branch_push";
|
|
201
|
-
deliveryId: string;
|
|
202
|
-
repositorySlug: string;
|
|
203
|
-
defaultBranch: string;
|
|
204
|
-
}
|
|
205
|
-
/** Normalize a push to a repository's default branch for deterministic reconciliation. */
|
|
206
|
-
declare function normalizeGitHubDefaultBranchPush(options: {
|
|
207
|
-
deliveryId: string;
|
|
208
|
-
event: string;
|
|
209
|
-
payload: unknown;
|
|
210
|
-
}): GitHubDefaultBranchPush | null;
|
|
211
|
-
interface GitHubPullRequestSignal extends NormalizedSignal<"github_pr"> {
|
|
212
|
-
repositorySlug: string;
|
|
213
|
-
pullRequest: {
|
|
214
|
-
number: number;
|
|
215
|
-
url: string;
|
|
216
|
-
author: string;
|
|
217
|
-
draft: boolean;
|
|
218
|
-
headSha: string;
|
|
219
|
-
headBranch: string;
|
|
220
|
-
headRepositorySlug: string;
|
|
221
|
-
baseSha: string;
|
|
222
|
-
baseBranch: string;
|
|
223
|
-
sender: string;
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
/** Normalize a newly reviewable or updated pull request into a factory signal. */
|
|
227
|
-
declare function normalizeGitHubPullRequest(options: WebhookEvent): GitHubPullRequestSignal | null;
|
|
228
|
-
interface GitHubIssueSignal extends NormalizedSignal<"github_issue"> {
|
|
229
|
-
repositorySlug: string;
|
|
230
|
-
issue: {
|
|
231
|
-
number: number;
|
|
232
|
-
title: string;
|
|
233
|
-
body: string | null;
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
interface GitHubCIFailureSignal extends NormalizedSignal<"github_ci_failure"> {
|
|
237
|
-
repositoryDefaultBranch: string;
|
|
238
|
-
repositorySlug: string;
|
|
239
|
-
workflowRun: {
|
|
240
|
-
id: number;
|
|
241
|
-
name: string;
|
|
242
|
-
trigger: string;
|
|
243
|
-
branch: string | null;
|
|
244
|
-
headRepositorySlug: string | null;
|
|
245
|
-
headSha: string;
|
|
246
|
-
url: string;
|
|
247
|
-
conclusion: string;
|
|
248
|
-
attempt: number;
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Normalize a GitHub issues webhook into the factory's signal shape. Returns
|
|
253
|
-
* null for payloads that are not an opened issue. The caller supplies the
|
|
254
|
-
* repository id; the payload stays untrusted data.
|
|
255
|
-
*/
|
|
256
|
-
declare function normalizeGitHubIssueOpened(options: WebhookEvent): GitHubIssueSignal | null;
|
|
257
|
-
interface GitHubPullRequestClosed {
|
|
258
|
-
source: "github_pull_request_closed";
|
|
259
|
-
deliveryId: string;
|
|
260
|
-
repositorySlug: string;
|
|
261
|
-
prNumber: number;
|
|
262
|
-
prUrl: string;
|
|
263
|
-
merged: boolean;
|
|
264
|
-
/** The merge commit on the base branch; null when closed without merging. */
|
|
265
|
-
mergeCommitSha: string | null;
|
|
266
|
-
/** The GitHub login that merged the pull request, or closed it without merging. */
|
|
267
|
-
decidedBy: string;
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Normalize a closed pull_request webhook so the factory can observe what
|
|
271
|
-
* happened to its change: merged records merged_by (the sender when GitHub
|
|
272
|
-
* omits it), a close without merge records the sender.
|
|
273
|
-
*/
|
|
274
|
-
declare function normalizeGitHubPullRequestClosed(options: WebhookEvent): GitHubPullRequestClosed | null;
|
|
275
|
-
/** Normalize a completed, unsuccessful GitHub Actions run into a CI failure signal. */
|
|
276
|
-
declare function normalizeGitHubWorkflowRunFailure(options: WebhookEvent): GitHubCIFailureSignal | null;
|
|
277
|
-
//#endregion
|
|
278
|
-
export { readReviewComment as $, PullRequestReviewEvent as A, createCheckRun as B, GitHubReviewComment as C, ListPullRequestCommentsInput as D, ListConflictedPullRequestsInput as E, SubmittedPullRequestReview as F, listPullRequestComments as G, createPullRequestComment as H, UpdateCheckRunInput as I, normalizeGitHubPullRequest as J, normalizeGitHubDefaultBranchPush as K, UpdatePullRequestCommentInput as L, ReadReviewCommentInput as M, ReviewCommentAuthorPolicy as N, PullRequestLabelInput as O, SubmitPullRequestReviewInput as P, readPullRequestHead as Q, addLabel as R, GitHubRepositoryRequest as S, ListCheckRunsForRefInput as T, listCheckRunsForRef as U, createPullRequest as V, listConflictedPullRequests as W, normalizeGitHubWorkflowRunFailure as X, normalizeGitHubPullRequestClosed as Y, readPullRequest as Z, GitHubIssueSignal as _, CheckRunOutput as a, GitHubPullRequestHead as b, CreateCheckRunInput as c, CreatedPullRequest as d, removeLabel as et, GitHubCIFailureSignal as f, GitHubIssueComment as g, GitHubDefaultBranchPush as h, CheckRunConclusion as i, verifyGitHubSignature as it, ReadPullRequestHeadInput as j, PullRequestReviewComment as k, CreatePullRequestCommentInput as l, GitHubCheckRunStatus as m, CheckRunAnnotation as n, updateCheckRun as nt, CheckRunStatus as o, GitHubCheckRun as p, normalizeGitHubIssueOpened as q, CheckRunAnnotationLevel as r, updatePullRequestComment as rt, ConflictedPullRequest as s, AnswerReviewCommentInput as t, submitPullRequestReview as tt, CreatePullRequestInput as u, GitHubPullRequest as v, GitHubReviewCommentAuthorError as w, GitHubPullRequestSignal as x, GitHubPullRequestClosed as y, answerReviewComment as z };
|
|
279
|
-
//# sourceMappingURL=github-C5HNBN6p.d.mts.map
|
package/dist/id-BLIkCVue.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id-BLIkCVue.mjs","names":[],"sources":["../src/schema/common.ts","../src/schema/id.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const SCHEMA_VERSION = 1;\n\nexport const schemaVersionSchema = z\n .literal(SCHEMA_VERSION)\n .describe(\"Version of the entity schema this row was written with.\");\n\nexport const isoDateTimeSchema = z.iso\n .datetime()\n .describe(\"UTC timestamp in ISO 8601 format, e.g. 2026-08-26T12:00:00Z.\");\n\nexport const usdSchema = z.number().finite().nonnegative().describe(\"Amount in US dollars.\");\n\n/**\n * Open vocabulary value. Standard values ship as exported constants; custom\n * values matching the pattern are equally valid.\n */\nexport const vocabularySchema = z\n .string()\n .regex(/^[a-z][a-z0-9_]{0,63}$/, \"must be lowercase snake_case starting with a letter\")\n .describe(\"Lowercase snake_case name, e.g. github_issue or sentry_alert.\");\n\nexport const replyToSchema = z.strictObject({\n channel: z\n .string()\n .min(1)\n .describe(\"Connector that should carry replies, e.g. github or slack.\"),\n address: z\n .string()\n .min(1)\n .describe(\"Connector-specific reply address, e.g. acme/web#41 or a Slack thread id.\"),\n});\n\nexport type ReplyTo = z.infer<typeof replyToSchema>;\n","import { z } from \"zod\";\n\nfunction idSchema(prefix: string) {\n return z.string().regex(new RegExp(`^${prefix}_[a-z0-9]{6,64}$`));\n}\n\nexport const factoryIdSchema = idSchema(\"fac\");\nexport const repositoryIdSchema = idSchema(\"repo\");\nexport const signalIdSchema = idSchema(\"sig\");\nexport const taskIdSchema = idSchema(\"task\");\nexport const changeIdSchema = idSchema(\"chg\");\nexport const receiptIdSchema = idSchema(\"rcpt\");\nexport const outboxIdSchema = idSchema(\"out\");\nexport const answerIdSchema = idSchema(\"ans\");\n\nexport const repositoryIdsSchema = z.array(repositoryIdSchema).min(1);\n\nexport type FactoryId = z.infer<typeof factoryIdSchema>;\nexport type RepositoryId = z.infer<typeof repositoryIdSchema>;\nexport type SignalId = z.infer<typeof signalIdSchema>;\nexport type TaskId = z.infer<typeof taskIdSchema>;\nexport type ChangeId = z.infer<typeof changeIdSchema>;\nexport type ReceiptId = z.infer<typeof receiptIdSchema>;\nexport type OutboxId = z.infer<typeof outboxIdSchema>;\nexport type AnswerId = z.infer<typeof answerIdSchema>;\n"],"mappings":";;AAEA,MAAa,iBAAiB;AAE9B,MAAa,sBAAsB,EAChC,QAAA,CAAsB,CAAC,CACvB,SAAS,yDAAyD;AAErE,MAAa,oBAAoB,EAAE,IAChC,SAAS,CAAC,CACV,SAAS,8DAA8D;AAE1E,MAAa,YAAY,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,uBAAuB;;;;;AAM3F,MAAa,mBAAmB,EAC7B,OAAO,CAAC,CACR,MAAM,0BAA0B,qDAAqD,CAAC,CACtF,SAAS,+DAA+D;AAE3E,MAAa,gBAAgB,EAAE,aAAa;CAC1C,SAAS,EACN,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,SAAS,4DAA4D;CACxE,SAAS,EACN,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,SAAS,0EAA0E;AACxF,CAAC;;;AC9BD,SAAS,SAAS,QAAgB;CAChC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,IAAI,OAAO,iBAAiB,CAAC;AAClE;AAEA,MAAa,kBAAkB,SAAS,KAAK;AAC7C,MAAa,qBAAqB,SAAS,MAAM;AACjD,MAAa,iBAAiB,SAAS,KAAK;AAC5C,MAAa,eAAe,SAAS,MAAM;AAC3C,MAAa,iBAAiB,SAAS,KAAK;AAC5C,MAAa,kBAAkB,SAAS,MAAM;AAC9C,MAAa,iBAAiB,SAAS,KAAK;AAC5C,MAAa,iBAAiB,SAAS,KAAK;AAE5C,MAAa,sBAAsB,EAAE,MAAM,kBAAkB,CAAC,CAAC,IAAI,CAAC"}
|