cloving 1.2.0 → 1.4.0
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/README.md +700 -331
- package/dist/src/agent-harness-shell.d.ts +13 -0
- package/dist/src/agent-harness-shell.js +93 -0
- package/dist/src/agent-harness-versions.d.ts +8 -0
- package/dist/src/agent-harness-versions.js +49 -0
- package/dist/src/agent-harnesses.d.ts +4 -0
- package/dist/src/agent-harnesses.js +13 -0
- package/dist/src/authority/command-wait-checks.d.ts +8 -0
- package/dist/src/authority/command-wait-checks.js +88 -0
- package/dist/src/authority/command-wait-results.d.ts +15 -0
- package/dist/src/authority/command-wait-results.js +73 -0
- package/dist/src/authority/command-wait-view.d.ts +21 -0
- package/dist/src/authority/command-wait-view.js +34 -0
- package/dist/src/authority/command-waits.d.ts +39 -0
- package/dist/src/authority/command-waits.js +97 -0
- package/dist/src/authority/commands.d.ts +1 -0
- package/dist/src/authority/commands.js +46 -5
- package/dist/src/authority/dispatch-decision.d.ts +8 -0
- package/dist/src/authority/dispatch-decision.js +26 -1
- package/dist/src/authority/effect-requests.js +6 -3
- package/dist/src/authority/effect-results.js +4 -2
- package/dist/src/authority/gate-reduction.d.ts +1 -0
- package/dist/src/authority/gate-reduction.js +18 -3
- package/dist/src/authority/gates.d.ts +2 -1
- package/dist/src/authority/gates.js +5 -1
- package/dist/src/authority/history-state.d.ts +2 -0
- package/dist/src/authority/history-state.js +13 -1
- package/dist/src/authority/instants.d.ts +1 -0
- package/dist/src/authority/instants.js +21 -0
- package/dist/src/authority/operations.js +1 -1
- package/dist/src/authority/reduction-state.d.ts +2 -0
- package/dist/src/authority/reduction-state.js +5 -0
- package/dist/src/authority/reduction.d.ts +1 -1
- package/dist/src/authority/reduction.js +30 -1
- package/dist/src/authority/status-input.d.ts +3 -1
- package/dist/src/authority/status.d.ts +3 -0
- package/dist/src/authority/status.js +28 -3
- package/dist/src/authority/stop-sequence.d.ts +1 -0
- package/dist/src/authority/stop-sequence.js +2 -1
- package/dist/src/authority/transitions.d.ts +7 -5
- package/dist/src/authority/transitions.js +13 -0
- package/dist/src/broker/actor/authority-delivery.js +1 -0
- package/dist/src/broker/actor/authority-queries.d.ts +9 -2
- package/dist/src/broker/actor/authority-queries.js +29 -5
- package/dist/src/broker/actor/authority-receipts.js +11 -1
- package/dist/src/broker/actor/authority-session.js +2 -2
- package/dist/src/broker/actor/authority-settings.js +4 -0
- package/dist/src/broker/actor/authority-upgrades.d.ts +19 -2
- package/dist/src/broker/actor/authority-upgrades.js +7 -2
- package/dist/src/broker/actor/delivery-intents.d.ts +2 -1
- package/dist/src/broker/actor/delivery-intents.js +6 -4
- package/dist/src/broker/actor/effect-delivery.d.ts +1 -1
- package/dist/src/broker/actor/effect-delivery.js +18 -2
- package/dist/src/broker/actor/effect-plan.js +11 -2
- package/dist/src/broker/actor/effect-queries.d.ts +5 -0
- package/dist/src/broker/actor/effect-queries.js +16 -1
- package/dist/src/broker/actor/effect-turn.js +2 -0
- package/dist/src/broker/actor/pin-check.js +1 -1
- package/dist/src/broker/actor/stop-plan.js +10 -4
- package/dist/src/broker/actor/stop-turn.d.ts +2 -0
- package/dist/src/broker/actor/stop-turn.js +24 -11
- package/dist/src/broker/actor/turn-draft.d.ts +1 -0
- package/dist/src/broker/actor/turn-draft.js +4 -0
- package/dist/src/broker/actor/turn-state.js +6 -2
- package/dist/src/broker/authority-admission.js +80 -7
- package/dist/src/broker/authority-restore.d.ts +2 -0
- package/dist/src/broker/authority-restore.js +36 -1
- package/dist/src/broker/command-wait-restore.d.ts +31 -0
- package/dist/src/broker/command-wait-restore.js +86 -0
- package/dist/src/broker/decision-restore.d.ts +1 -1
- package/dist/src/broker/decision-restore.js +5 -4
- package/dist/src/broker/effect-upgrade.d.ts +2 -0
- package/dist/src/broker/effect-upgrade.js +8 -2
- package/dist/src/broker/socket-address.d.ts +3 -1
- package/dist/src/broker/socket-address.js +2 -2
- package/dist/src/cli/arguments.d.ts +22 -11
- package/dist/src/cli/arguments.js +73 -104
- package/dist/src/cli/chat-stores.d.ts +2 -0
- package/dist/src/cli/chat-stores.js +113 -0
- package/dist/src/cli/client.d.ts +4 -1
- package/dist/src/cli/client.js +9 -3
- package/dist/src/cli/command-effects.d.ts +7 -0
- package/dist/src/cli/command-effects.js +39 -0
- package/dist/src/cli/command-requests.d.ts +17 -0
- package/dist/src/cli/command-requests.js +43 -0
- package/dist/src/cli/command-waits.d.ts +9 -0
- package/dist/src/cli/command-waits.js +51 -0
- package/dist/src/cli/commands.js +21 -41
- package/dist/src/cli/config-arguments.d.ts +11 -0
- package/dist/src/cli/config-arguments.js +59 -0
- package/dist/src/cli/config-command.d.ts +2 -0
- package/dist/src/cli/config-command.js +105 -0
- package/dist/src/cli/config-file.d.ts +3 -0
- package/dist/src/cli/config-file.js +52 -0
- package/dist/src/cli/config-lock.d.ts +7 -0
- package/dist/src/cli/config-lock.js +61 -0
- package/dist/src/cli/config-notice.d.ts +5 -0
- package/dist/src/cli/config-notice.js +46 -0
- package/dist/src/cli/doctor-github.d.ts +9 -0
- package/dist/src/cli/doctor-github.js +138 -0
- package/dist/src/cli/doctor-harness.d.ts +13 -0
- package/dist/src/cli/doctor-harness.js +242 -0
- package/dist/src/cli/doctor-local.d.ts +18 -0
- package/dist/src/cli/doctor-local.js +77 -0
- package/dist/src/cli/doctor-runtime.d.ts +15 -0
- package/dist/src/cli/doctor-runtime.js +176 -0
- package/dist/src/cli/doctor-service.d.ts +1 -0
- package/dist/src/cli/doctor-service.js +11 -0
- package/dist/src/cli/doctor-workflows.d.ts +6 -0
- package/dist/src/cli/doctor-workflows.js +50 -0
- package/dist/src/cli/doctor.d.ts +15 -0
- package/dist/src/cli/doctor.js +187 -0
- package/dist/src/cli/github-ci-progress.d.ts +8 -0
- package/dist/src/cli/github-ci-progress.js +83 -0
- package/dist/src/cli/github-retry.d.ts +6 -0
- package/dist/src/cli/github-retry.js +47 -0
- package/dist/src/cli/harness-probes.d.ts +24 -0
- package/dist/src/cli/harness-probes.js +183 -0
- package/dist/src/cli/harness-processes.d.ts +6 -0
- package/dist/src/cli/harness-processes.js +36 -0
- package/dist/src/cli/init-command.d.ts +9 -0
- package/dist/src/cli/init-command.js +52 -0
- package/dist/src/cli/init-prompt-command.d.ts +10 -0
- package/dist/src/cli/init-prompt-command.js +145 -0
- package/dist/src/cli/init-prompt.d.ts +35 -0
- package/dist/src/cli/init-prompt.js +74 -0
- package/dist/src/cli/init-selection.d.ts +13 -0
- package/dist/src/cli/init-selection.js +75 -0
- package/dist/src/cli/main.d.ts +9 -1
- package/dist/src/cli/main.js +69 -61
- package/dist/src/cli/mcp-server.d.ts +1 -0
- package/dist/src/cli/mcp-server.js +156 -0
- package/dist/src/cli/mcp-tools.d.ts +15 -0
- package/dist/src/cli/mcp-tools.js +80 -0
- package/dist/src/cli/phone-arguments.d.ts +14 -0
- package/dist/src/cli/phone-arguments.js +37 -0
- package/dist/src/cli/phone-client.d.ts +2 -0
- package/dist/src/cli/phone-client.js +32 -0
- package/dist/src/cli/phone-command.d.ts +13 -0
- package/dist/src/cli/phone-command.js +101 -0
- package/dist/src/cli/probe-command.d.ts +36 -0
- package/dist/src/cli/probe-command.js +59 -0
- package/dist/src/cli/project-settings.d.ts +4 -0
- package/dist/src/cli/project-settings.js +33 -0
- package/dist/src/cli/render.d.ts +2 -1
- package/dist/src/cli/render.js +57 -54
- package/dist/src/cli/report-ci-jobs.d.ts +23 -0
- package/dist/src/cli/report-ci-jobs.js +103 -0
- package/dist/src/cli/report-ci-usage.d.ts +9 -0
- package/dist/src/cli/report-ci-usage.js +185 -0
- package/dist/src/cli/report-ci.d.ts +13 -0
- package/dist/src/cli/report-ci.js +74 -0
- package/dist/src/cli/report-closures.d.ts +6 -0
- package/dist/src/cli/report-closures.js +97 -0
- package/dist/src/cli/report-flow.d.ts +7 -0
- package/dist/src/cli/report-flow.js +122 -0
- package/dist/src/cli/report-github-reader.d.ts +29 -0
- package/dist/src/cli/report-github-reader.js +157 -0
- package/dist/src/cli/report-github.d.ts +25 -0
- package/dist/src/cli/report-github.js +181 -0
- package/dist/src/cli/report-operator.d.ts +3 -0
- package/dist/src/cli/report-operator.js +40 -0
- package/dist/src/cli/report-ready.d.ts +3 -0
- package/dist/src/cli/report-ready.js +96 -0
- package/dist/src/cli/report-text.d.ts +9 -0
- package/dist/src/cli/report-text.js +33 -0
- package/dist/src/cli/report.d.ts +18 -0
- package/dist/src/cli/report.js +269 -0
- package/dist/src/cli/repository-arguments.d.ts +5 -0
- package/dist/src/cli/repository-arguments.js +34 -0
- package/dist/src/cli/runtime-arguments.d.ts +6 -1
- package/dist/src/cli/runtime-arguments.js +22 -2
- package/dist/src/cli/runtime-directory.d.ts +6 -2
- package/dist/src/cli/runtime-directory.js +72 -14
- package/dist/src/cli/schedule-arguments.d.ts +14 -0
- package/dist/src/cli/schedule-arguments.js +26 -0
- package/dist/src/cli/schedule-render.d.ts +22 -0
- package/dist/src/cli/schedule-render.js +73 -0
- package/dist/src/cli/terminal-text.d.ts +3 -0
- package/dist/src/cli/terminal-text.js +28 -0
- package/dist/src/cli/toolchain.d.ts +2 -0
- package/dist/src/cli/toolchain.js +22 -2
- package/dist/src/cli/usage-render.d.ts +6 -0
- package/dist/src/cli/usage-render.js +67 -1
- package/dist/src/cli/usage.d.ts +3 -3
- package/dist/src/cli/usage.js +119 -50
- package/dist/src/cli/watch-actions.d.ts +2 -0
- package/dist/src/cli/watch-actions.js +6 -6
- package/dist/src/cli/watch-board-view.d.ts +1 -1
- package/dist/src/cli/watch-board-view.js +27 -4
- package/dist/src/cli/watch-board.d.ts +4 -2
- package/dist/src/cli/watch-board.js +58 -35
- package/dist/src/cli/watch-card-forms.d.ts +1 -1
- package/dist/src/cli/watch-card-forms.js +13 -12
- package/dist/src/cli/watch-client.d.ts +1 -1
- package/dist/src/cli/watch-client.js +7 -11
- package/dist/src/cli/watch-header-view.d.ts +22 -0
- package/dist/src/cli/watch-header-view.js +104 -0
- package/dist/src/cli/watch-model.d.ts +4 -1
- package/dist/src/cli/watch-model.js +34 -15
- package/dist/src/cli/watch-page.js +57 -23
- package/dist/src/cli/watch-phases.d.ts +12 -3
- package/dist/src/cli/watch-phases.js +68 -11
- package/dist/src/cli/watch-phone-client.d.ts +1 -0
- package/dist/src/cli/watch-phone-client.js +84 -0
- package/dist/src/cli/watch-phone-view.d.ts +56 -0
- package/dist/src/cli/watch-phone-view.js +113 -0
- package/dist/src/cli/watch-phone.d.ts +5 -0
- package/dist/src/cli/watch-phone.js +53 -0
- package/dist/src/cli/watch-pr-board.js +1 -1
- package/dist/src/cli/watch-pr-command.d.ts +1 -0
- package/dist/src/cli/watch-pull-request.d.ts +3 -1
- package/dist/src/cli/watch-pull-request.js +22 -8
- package/dist/src/cli/watch-reads.d.ts +2 -0
- package/dist/src/cli/watch-reads.js +17 -16
- package/dist/src/cli/watch-render.d.ts +23 -1
- package/dist/src/cli/watch-run-input.d.ts +0 -1
- package/dist/src/cli/watch-run-input.js +0 -13
- package/dist/src/cli/watch-server.js +29 -11
- package/dist/src/cli/watch-turn.d.ts +4 -1
- package/dist/src/cli/watch-turn.js +37 -1
- package/dist/src/cli/watch-usage.js +5 -1
- package/dist/src/cli/watch-view.d.ts +4 -21
- package/dist/src/cli/watch-view.js +26 -118
- package/dist/src/cli.js +165 -28
- package/dist/src/command-settings.d.ts +16 -0
- package/dist/src/command-settings.js +42 -0
- package/dist/src/command-wait.d.ts +4 -0
- package/dist/src/command-wait.js +45 -0
- package/dist/src/configuration-change.d.ts +18 -0
- package/dist/src/configuration-change.js +76 -0
- package/dist/src/configuration-display.d.ts +21 -0
- package/dist/src/configuration-display.js +69 -0
- package/dist/src/configuration-schema.d.ts +58 -0
- package/dist/src/configuration-schema.js +163 -0
- package/dist/src/daemon/attachment-file.d.ts +6 -0
- package/dist/src/daemon/attachment-file.js +86 -0
- package/dist/src/daemon/attachments.d.ts +14 -0
- package/dist/src/daemon/attachments.js +17 -0
- package/dist/src/daemon/claude-recovery.d.ts +50 -0
- package/dist/src/daemon/claude-recovery.js +204 -0
- package/dist/src/daemon/claude-stream.d.ts +27 -0
- package/dist/src/daemon/claude-stream.js +63 -0
- package/dist/src/daemon/claude-turn.d.ts +18 -18
- package/dist/src/daemon/claude-turn.js +151 -105
- package/dist/src/daemon/claude-worker.d.ts +5 -4
- package/dist/src/daemon/claude-worker.js +149 -158
- package/dist/src/daemon/command-journal.d.ts +5 -0
- package/dist/src/daemon/command-journal.js +50 -0
- package/dist/src/daemon/command-process.d.ts +28 -0
- package/dist/src/daemon/command-process.js +164 -0
- package/dist/src/daemon/command-worker.d.ts +19 -0
- package/dist/src/daemon/command-worker.js +182 -0
- package/dist/src/daemon/cursor-stream.d.ts +4 -0
- package/dist/src/daemon/cursor-stream.js +154 -0
- package/dist/src/daemon/daemon-adapters.d.ts +60 -0
- package/dist/src/daemon/daemon-adapters.js +126 -0
- package/dist/src/daemon/daemon-loops.d.ts +16 -0
- package/dist/src/daemon/daemon-loops.js +41 -0
- package/dist/src/daemon/daemon.d.ts +2 -33
- package/dist/src/daemon/daemon.js +133 -131
- package/dist/src/daemon/declared-input.d.ts +3 -0
- package/dist/src/daemon/declared-input.js +9 -0
- package/dist/src/daemon/delivery-router.js +1 -1
- package/dist/src/daemon/gemini-stream.d.ts +4 -0
- package/dist/src/daemon/gemini-stream.js +129 -0
- package/dist/src/daemon/github-attach.d.ts +2 -0
- package/dist/src/daemon/github-attach.js +149 -0
- package/dist/src/daemon/github-ci-filters.d.ts +6 -0
- package/dist/src/daemon/github-ci-filters.js +138 -0
- package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
- package/dist/src/daemon/github-ci-rerun.js +92 -0
- package/dist/src/daemon/github-ci-workflows.d.ts +10 -0
- package/dist/src/daemon/github-ci-workflows.js +148 -0
- package/dist/src/daemon/github-ci.js +109 -10
- package/dist/src/daemon/github-issue-methods.d.ts +2 -0
- package/dist/src/daemon/github-issue-methods.js +37 -2
- package/dist/src/daemon/github-merge-call.d.ts +4 -1
- package/dist/src/daemon/github-merge-call.js +10 -3
- package/dist/src/daemon/github-merge.js +58 -26
- package/dist/src/daemon/github-methods.js +22 -2
- package/dist/src/daemon/github-operation.d.ts +5 -0
- package/dist/src/daemon/github-operation.js +6 -0
- package/dist/src/daemon/github-retry.js +8 -44
- package/dist/src/daemon/github-worker.d.ts +4 -0
- package/dist/src/daemon/github-worker.js +6 -0
- package/dist/src/daemon/issue-queue.d.ts +1 -0
- package/dist/src/daemon/issue-queue.js +16 -34
- package/dist/src/daemon/notify-events.d.ts +6 -0
- package/dist/src/daemon/notify-events.js +84 -0
- package/dist/src/daemon/notify-journal.js +1 -1
- package/dist/src/daemon/notify-message.d.ts +4 -1
- package/dist/src/daemon/notify-message.js +36 -0
- package/dist/src/daemon/notify.d.ts +1 -1
- package/dist/src/daemon/notify.js +7 -78
- package/dist/src/daemon/opencode-stream.d.ts +5 -0
- package/dist/src/daemon/opencode-stream.js +87 -0
- package/dist/src/daemon/operation-journal.d.ts +1 -0
- package/dist/src/daemon/queue-status.d.ts +10 -0
- package/dist/src/daemon/queue-status.js +51 -0
- package/dist/src/daemon/resume-index-lock.d.ts +13 -0
- package/dist/src/daemon/resume-index-lock.js +160 -0
- package/dist/src/daemon/resume-worktree.d.ts +7 -0
- package/dist/src/daemon/resume-worktree.js +29 -0
- package/dist/src/daemon/retry-worktree.d.ts +18 -0
- package/dist/src/daemon/retry-worktree.js +139 -0
- package/dist/src/daemon/retrying-turn.d.ts +2 -10
- package/dist/src/daemon/retrying-turn.js +145 -141
- package/dist/src/daemon/schedule-control.d.ts +26 -0
- package/dist/src/daemon/schedule-control.js +110 -0
- package/dist/src/daemon/schedule-journal.d.ts +6 -0
- package/dist/src/daemon/schedule-journal.js +120 -0
- package/dist/src/daemon/text-output.d.ts +18 -0
- package/dist/src/daemon/text-output.js +44 -0
- package/dist/src/daemon/ticket-registration.d.ts +7 -14
- package/dist/src/daemon/ticket-registration.js +93 -114
- package/dist/src/daemon/turn-attempt-journal.d.ts +38 -0
- package/dist/src/daemon/turn-attempt-journal.js +136 -0
- package/dist/src/daemon/turn-attempts.d.ts +47 -0
- package/dist/src/daemon/turn-attempts.js +166 -0
- package/dist/src/daemon/turn-command.d.ts +10 -0
- package/dist/src/daemon/turn-command.js +33 -0
- package/dist/src/daemon/turn-report.d.ts +25 -0
- package/dist/src/daemon/turn-report.js +118 -0
- package/dist/src/daemon/work-tree.d.ts +11 -1
- package/dist/src/daemon/work-tree.js +35 -12
- package/dist/src/daemon/worker-profile.d.ts +8 -0
- package/dist/src/daemon/worker-profile.js +40 -0
- package/dist/src/daemon/workflow-generations.d.ts +32 -0
- package/dist/src/daemon/workflow-generations.js +57 -0
- package/dist/src/daemon/workflow-replay.d.ts +16 -0
- package/dist/src/daemon/workflow-replay.js +58 -0
- package/dist/src/daemon/workflow-schedules.d.ts +30 -0
- package/dist/src/daemon/workflow-schedules.js +238 -0
- package/dist/src/daemon/worktree-processes.d.ts +9 -0
- package/dist/src/daemon/worktree-processes.js +151 -0
- package/dist/src/decision-wait.d.ts +1 -0
- package/dist/src/decision-wait.js +3 -0
- package/dist/src/delivery-backoff.d.ts +1 -0
- package/dist/src/delivery-backoff.js +3 -0
- package/dist/src/doctor-report.d.ts +22 -0
- package/dist/src/doctor-report.js +63 -0
- package/dist/src/execution-pin.d.ts +5 -0
- package/dist/src/execution-pin.js +67 -4
- package/dist/src/grok-result.d.ts +12 -0
- package/dist/src/grok-result.js +61 -0
- package/dist/src/harness-defaults.d.ts +35 -0
- package/dist/src/harness-defaults.js +121 -0
- package/dist/src/harness-start.d.ts +15 -0
- package/dist/src/harness-start.js +37 -0
- package/dist/src/host/command-wait.d.ts +38 -0
- package/dist/src/host/command-wait.js +115 -0
- package/dist/src/host/decision-resume.d.ts +35 -0
- package/dist/src/host/decision-resume.js +86 -0
- package/dist/src/host/gate-bridge.d.ts +48 -0
- package/dist/src/host/gate-bridge.js +124 -0
- package/dist/src/host/run-wait.d.ts +26 -0
- package/dist/src/host/run-wait.js +37 -0
- package/dist/src/host/start-delivery.d.ts +6 -8
- package/dist/src/host/start-delivery.js +13 -18
- package/dist/src/host/step-bridge-host.d.ts +8 -20
- package/dist/src/host/step-bridge-host.js +65 -58
- package/dist/src/merge-request.d.ts +19 -0
- package/dist/src/merge-request.js +32 -0
- package/dist/src/operation-identity.d.ts +1 -0
- package/dist/src/operation-identity.js +4 -0
- package/dist/src/phone/canonical-json.d.ts +1 -0
- package/dist/src/phone/canonical-json.js +16 -0
- package/dist/src/phone/phone-link.d.ts +7 -0
- package/dist/src/phone/phone-link.js +21 -0
- package/dist/src/phone/qr-data.d.ts +8 -0
- package/dist/src/phone/qr-data.js +133 -0
- package/dist/src/phone/qr-matrix.d.ts +6 -0
- package/dist/src/phone/qr-matrix.js +175 -0
- package/dist/src/phone/qr-penalty.d.ts +3 -0
- package/dist/src/phone/qr-penalty.js +67 -0
- package/dist/src/phone/qr-picture.d.ts +5 -0
- package/dist/src/phone/qr-picture.js +24 -0
- package/dist/src/private-config.schema.json +303 -0
- package/dist/src/project-config.schema.json +105 -0
- package/dist/src/project-settings.d.ts +19 -0
- package/dist/src/project-settings.js +133 -0
- package/dist/src/queue-spend.d.ts +4 -0
- package/dist/src/queue-spend.js +21 -0
- package/dist/src/relay/answer-check.d.ts +24 -0
- package/dist/src/relay/answer-check.js +145 -0
- package/dist/src/relay/answer-inbox.d.ts +15 -0
- package/dist/src/relay/answer-inbox.js +173 -0
- package/dist/src/relay/daemon-keys.d.ts +16 -0
- package/dist/src/relay/daemon-keys.js +75 -0
- package/dist/src/relay/decision-check.d.ts +3 -0
- package/dist/src/relay/decision-check.js +77 -0
- package/dist/src/relay/decision-close.d.ts +6 -0
- package/dist/src/relay/decision-close.js +72 -0
- package/dist/src/relay/decision-envelopes.d.ts +29 -0
- package/dist/src/relay/decision-envelopes.js +93 -0
- package/dist/src/relay/decision-watch.d.ts +14 -0
- package/dist/src/relay/decision-watch.js +68 -0
- package/dist/src/relay/envelope-post.d.ts +8 -0
- package/dist/src/relay/envelope-post.js +71 -0
- package/dist/src/relay/envelope.d.ts +28 -0
- package/dist/src/relay/envelope.js +53 -0
- package/dist/src/relay/hpke.d.ts +25 -0
- package/dist/src/relay/hpke.js +108 -0
- package/dist/src/relay/pairing-checks.d.ts +42 -0
- package/dist/src/relay/pairing-checks.js +172 -0
- package/dist/src/relay/pairing-follow.d.ts +8 -0
- package/dist/src/relay/pairing-follow.js +95 -0
- package/dist/src/relay/pairing-session.d.ts +29 -0
- package/dist/src/relay/pairing-session.js +87 -0
- package/dist/src/relay/phone-delivery.d.ts +51 -0
- package/dist/src/relay/phone-delivery.js +139 -0
- package/dist/src/relay/phone-devices.d.ts +36 -0
- package/dist/src/relay/phone-devices.js +46 -0
- package/dist/src/relay/phone-inbox.d.ts +18 -0
- package/dist/src/relay/phone-inbox.js +17 -0
- package/dist/src/relay/phone-operations.d.ts +18 -0
- package/dist/src/relay/phone-operations.js +121 -0
- package/dist/src/relay/phone-outbox.d.ts +21 -0
- package/dist/src/relay/phone-outbox.js +25 -0
- package/dist/src/relay/phone-socket.d.ts +6 -0
- package/dist/src/relay/phone-socket.js +63 -0
- package/dist/src/relay/relay-control.d.ts +7 -0
- package/dist/src/relay/relay-control.js +24 -0
- package/dist/src/relay/relay-files.d.ts +2 -0
- package/dist/src/relay/relay-files.js +23 -0
- package/dist/src/relay/relay-heartbeat.d.ts +17 -0
- package/dist/src/relay/relay-heartbeat.js +81 -0
- package/dist/src/relay/relay-http.d.ts +14 -0
- package/dist/src/relay/relay-http.js +63 -0
- package/dist/src/relay/relay-registration.d.ts +15 -0
- package/dist/src/relay/relay-registration.js +63 -0
- package/dist/src/relay/relay-service.d.ts +28 -0
- package/dist/src/relay/relay-service.js +218 -0
- package/dist/src/relay/relay-store.d.ts +48 -0
- package/dist/src/relay/relay-store.js +131 -0
- package/dist/src/relay/sealed-post.d.ts +25 -0
- package/dist/src/relay/sealed-post.js +52 -0
- package/dist/src/relay.d.ts +1 -0
- package/dist/src/relay.js +8 -0
- package/dist/src/report-ci.d.ts +164 -0
- package/dist/src/report-ci.js +32 -0
- package/dist/src/report-effects.d.ts +15 -0
- package/dist/src/report-effects.js +212 -0
- package/dist/src/report-flow-types.d.ts +38 -0
- package/dist/src/report-flow-types.js +7 -0
- package/dist/src/report-flow.d.ts +43 -0
- package/dist/src/report-flow.js +193 -0
- package/dist/src/report-operator.d.ts +67 -0
- package/dist/src/report-operator.js +25 -0
- package/dist/src/report-quality.d.ts +221 -0
- package/dist/src/report-quality.js +94 -0
- package/dist/src/report-ready.d.ts +23 -0
- package/dist/src/report-ready.js +117 -0
- package/dist/src/report-statistics.d.ts +51 -0
- package/dist/src/report-statistics.js +106 -0
- package/dist/src/report.d.ts +712 -0
- package/dist/src/report.js +234 -0
- package/dist/src/repository-identity.d.ts +4 -0
- package/dist/src/repository-identity.js +4 -0
- package/dist/src/review-subject.d.ts +41 -0
- package/dist/src/review-subject.js +91 -0
- package/dist/src/run-wait.d.ts +23 -0
- package/dist/src/run-wait.js +20 -0
- package/dist/src/schedule-progress.d.ts +33 -0
- package/dist/src/schedule-progress.js +45 -0
- package/dist/src/service/active-tickets.d.ts +4 -0
- package/dist/src/service/active-tickets.js +49 -0
- package/dist/src/service/command-effects.d.ts +4 -0
- package/dist/src/service/command-effects.js +16 -0
- package/dist/src/service/command-waits.d.ts +34 -0
- package/dist/src/service/command-waits.js +86 -0
- package/dist/src/service/decision-handler.d.ts +4 -0
- package/dist/src/service/decision-handler.js +39 -4
- package/dist/src/service/expiry.js +2 -0
- package/dist/src/service/gateway.js +21 -4
- package/dist/src/service/queue-spend.d.ts +6 -0
- package/dist/src/service/queue-spend.js +68 -0
- package/dist/src/service/registry.d.ts +16 -3
- package/dist/src/service/registry.js +34 -3
- package/dist/src/service/replies.d.ts +16 -1
- package/dist/src/service/replies.js +23 -0
- package/dist/src/service/run-handlers.js +35 -56
- package/dist/src/service/run-metadata.d.ts +22 -0
- package/dist/src/service/run-metadata.js +138 -0
- package/dist/src/service/run-waits.d.ts +3 -0
- package/dist/src/service/run-waits.js +41 -0
- package/dist/src/service/service.d.ts +22 -2
- package/dist/src/service/service.js +29 -13
- package/dist/src/service/submission-handler.d.ts +0 -1
- package/dist/src/service/submission-handler.js +22 -36
- package/dist/src/service/worker-port.d.ts +1 -0
- package/dist/src/service/worker-port.js +9 -1
- package/dist/src/service/worker-totals.d.ts +2 -0
- package/dist/src/service/worker-totals.js +9 -24
- package/dist/src/step-bridge.d.ts +43 -0
- package/dist/src/steps/command-wait.d.ts +12 -0
- package/dist/src/steps/command-wait.js +26 -0
- package/dist/src/steps/merge-by-person.d.ts +2 -0
- package/dist/src/steps/merge-by-person.js +18 -0
- package/dist/src/steps/merge-when-green.d.ts +2 -0
- package/dist/src/steps/merge-when-green.js +62 -0
- package/dist/src/steps/open-decision-wait.d.ts +2 -0
- package/dist/src/steps/open-decision-wait.js +8 -0
- package/dist/src/steps/review-by-agent.d.ts +5 -0
- package/dist/src/steps/review-by-agent.js +124 -0
- package/dist/src/steps/review-by-person.d.ts +4 -0
- package/dist/src/steps/review-by-person.js +19 -0
- package/dist/src/steps/review-subject.d.ts +2 -0
- package/dist/src/steps/review-subject.js +11 -0
- package/dist/src/steps/run-command.d.ts +2 -0
- package/dist/src/steps/run-command.js +15 -0
- package/dist/src/steps/sleep.d.ts +3 -0
- package/dist/src/steps/sleep.js +19 -0
- package/dist/src/steps/wait-for-command.d.ts +3 -0
- package/dist/src/steps/wait-for-command.js +17 -0
- package/dist/src/steps/wait-for-decision.d.ts +2 -0
- package/dist/src/steps/wait-for-decision.js +71 -0
- package/dist/src/steps/wait-for-run.d.ts +5 -0
- package/dist/src/steps/wait-for-run.js +9 -0
- package/dist/src/storage/command-wait-rows.d.ts +30 -0
- package/dist/src/storage/command-wait-rows.js +96 -0
- package/dist/src/storage/decision-snapshots.d.ts +9 -1
- package/dist/src/storage/decision-snapshots.js +22 -2
- package/dist/src/storage/domain-changes.d.ts +2 -0
- package/dist/src/storage/domain-changes.js +3 -0
- package/dist/src/storage/domain-schema.d.ts +13 -1
- package/dist/src/storage/domain-schema.js +31 -4
- package/dist/src/storage/effect-schema.d.ts +1 -0
- package/dist/src/storage/effect-schema.js +5 -0
- package/dist/src/submission.d.ts +4 -0
- package/dist/src/submission.js +6 -2
- package/dist/src/testing-requests.d.ts +15 -0
- package/dist/src/testing-requests.js +93 -0
- package/dist/src/testing.d.ts +23 -0
- package/dist/src/testing.js +211 -0
- package/dist/src/ticket-status-stream.d.ts +9 -0
- package/dist/src/ticket-status-stream.js +94 -0
- package/dist/src/token-prices.d.ts +12 -4
- package/dist/src/token-prices.js +15 -2
- package/dist/src/turn-profile.d.ts +1 -0
- package/dist/src/turn-profile.js +8 -1
- package/dist/src/worker-usage.d.ts +17 -0
- package/dist/src/worker-usage.js +60 -0
- package/dist/src/workflow-admission.d.ts +5 -0
- package/dist/src/workflow-candidate.d.ts +8 -2
- package/dist/src/workflow-candidate.js +59 -6
- package/dist/src/workflow-contracts.d.ts +1 -0
- package/dist/src/workflow-contracts.js +9 -2
- package/dist/src/workflow-declaration.d.ts +21 -3
- package/dist/src/workflow-declaration.js +77 -9
- package/dist/src/workflow-discovery.d.ts +3 -13
- package/dist/src/workflow-discovery.js +5 -14
- package/dist/src/workflow-refusals.js +3 -1
- package/dist/src/workflow-schedule.d.ts +22 -0
- package/dist/src/workflow-schedule.js +53 -0
- package/dist/src/workflows.d.ts +12 -2
- package/dist/src/workflows.js +9 -1
- package/dist/tools/admit-workflow.d.ts +1 -0
- package/dist/tools/admit-workflow.js +18 -5
- package/dist/tools/doctor-adoption.d.ts +1 -0
- package/dist/tools/doctor-adoption.js +11 -0
- package/dist/tools/project-configuration.d.ts +4 -0
- package/dist/tools/project-configuration.js +47 -0
- package/dist/tools/red-green-command.d.ts +1 -0
- package/dist/tools/red-green-command.js +174 -0
- package/dist/tools/red-green-process.d.ts +10 -0
- package/dist/tools/red-green-process.js +59 -0
- package/dist/tools/self-host-processes.d.ts +3 -0
- package/dist/tools/self-host-processes.js +63 -33
- package/dist/tools/self-host-project.d.ts +4 -0
- package/dist/tools/self-host-project.js +42 -60
- package/dist/tools/self-host-runtime.d.ts +16 -0
- package/dist/tools/self-host-runtime.js +60 -0
- package/dist/tools/self-host-workflows.d.ts +1 -0
- package/dist/tools/self-host-workflows.js +36 -1
- package/dist/tools/self-host.js +128 -71
- package/dist/tools/template-command.d.ts +1 -0
- package/dist/tools/template-command.js +160 -0
- package/dist/tools/template-copy.d.ts +11 -0
- package/dist/tools/template-copy.js +130 -0
- package/dist/tools/template-files.d.ts +17 -0
- package/dist/tools/template-files.js +74 -0
- package/dist/tools/workflow-bundles.js +1 -0
- package/dist/tools/workflow-candidate-counts.d.ts +6 -2
- package/dist/tools/workflow-candidate-counts.js +31 -16
- package/dist/tools/workflow-candidate-fields.d.ts +5 -0
- package/dist/tools/workflow-candidate-fields.js +24 -0
- package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
- package/dist/tools/workflow-candidate-helper-counts.js +129 -0
- package/dist/tools/workflow-candidate-program.d.ts +2 -0
- package/dist/tools/workflow-candidate-program.js +36 -8
- package/dist/tools/workflow-candidate-shape.d.ts +3 -0
- package/dist/tools/workflow-candidate-shape.js +90 -0
- package/dist/tools/workflow-candidate-source.js +92 -16
- package/dist/tools/workflow-candidate-syntax.d.ts +9 -3
- package/dist/tools/workflow-candidate-syntax.js +83 -109
- package/dist/tools/workflow-command.d.ts +1 -0
- package/dist/tools/workflow-command.js +142 -0
- package/dist/tools/workflow-folder-capture.d.ts +1 -0
- package/dist/tools/workflow-folder-capture.js +47 -2
- package/dist/tools/workflow-folders.d.ts +18 -3
- package/dist/tools/workflow-folders.js +60 -7
- package/dist/tools/workflow-test-hook.d.ts +7 -0
- package/dist/tools/workflow-test-hook.js +16 -0
- package/dist/tools/workflow-test-loader.d.ts +1 -0
- package/dist/tools/workflow-test-loader.js +10 -0
- package/package.json +60 -10
- package/templates/develop/README.md +90 -0
- package/templates/develop/develop/accept.ts +11 -0
- package/templates/develop/develop/flow-tests.ts +394 -0
- package/templates/develop/develop/local.ts +40 -0
- package/templates/develop/develop/option-tests.ts +174 -0
- package/templates/develop/develop/partial-choice.ts +29 -0
- package/templates/develop/develop/partial.ts +28 -0
- package/templates/develop/develop/pull.ts +156 -0
- package/templates/develop/develop/queue-partial.ts +39 -0
- package/templates/develop/develop/refusal-tests.ts +251 -0
- package/templates/develop/develop/report.ts +156 -0
- package/templates/develop/develop/round.ts +40 -0
- package/templates/develop/develop/scenarios.ts +87 -0
- package/templates/develop/develop/turn.ts +68 -0
- package/templates/develop/develop.declaration.json +24 -0
- package/templates/develop/develop.test.ts +287 -0
- package/templates/develop/develop.ts +30 -0
- package/templates/develop/template.json +153 -0
- package/templates/idea-to-issue/README.md +27 -0
- package/templates/idea-to-issue/idea-to-issue/effects.ts +52 -0
- package/templates/idea-to-issue/idea-to-issue/leave.ts +10 -0
- package/templates/idea-to-issue/idea-to-issue/next.ts +29 -0
- package/templates/idea-to-issue/idea-to-issue/post-person.ts +18 -0
- package/templates/idea-to-issue/idea-to-issue/post.ts +50 -0
- package/templates/idea-to-issue/idea-to-issue/queue.ts +27 -0
- package/templates/idea-to-issue/idea-to-issue/review.ts +42 -0
- package/templates/idea-to-issue/idea-to-issue/scenarios.ts +50 -0
- package/templates/idea-to-issue/idea-to-issue/turn.ts +40 -0
- package/templates/idea-to-issue/idea-to-issue.declaration.json +16 -0
- package/templates/idea-to-issue/idea-to-issue.test.ts +79 -0
- package/templates/idea-to-issue/idea-to-issue.ts +49 -0
- package/templates/idea-to-issue/template.json +81 -0
- package/templates/review-day/README.md +97 -0
- package/templates/review-day/review-day/critique.ts +58 -0
- package/templates/review-day/review-day/decision.ts +29 -0
- package/templates/review-day/review-day/facts.ts +69 -0
- package/templates/review-day/review-day/label.ts +29 -0
- package/templates/review-day/review-day/next.ts +28 -0
- package/templates/review-day/review-day/post.ts +27 -0
- package/templates/review-day/review-day/report.ts +98 -0
- package/templates/review-day/review-day/rules.ts +12 -0
- package/templates/review-day/review-day/scenarios.ts +76 -0
- package/templates/review-day/review-day/turn.ts +73 -0
- package/templates/review-day/review-day.declaration.json +16 -0
- package/templates/review-day/review-day.test.ts +362 -0
- package/templates/review-day/review-day.ts +37 -0
- package/templates/review-day/template.json +56 -0
- package/dist/src/chats/analysis-batches.d.ts +0 -42
- package/dist/src/chats/analysis-batches.js +0 -97
- package/dist/src/chats/analysis-checkpoint.d.ts +0 -29
- package/dist/src/chats/analysis-checkpoint.js +0 -31
- package/dist/src/chats/analysis-contract.d.ts +0 -80
- package/dist/src/chats/analysis-contract.js +0 -16
- package/dist/src/chats/analysis-data.d.ts +0 -3
- package/dist/src/chats/analysis-data.js +0 -85
- package/dist/src/chats/analysis-input.d.ts +0 -18
- package/dist/src/chats/analysis-input.js +0 -97
- package/dist/src/chats/analysis-links.d.ts +0 -2
- package/dist/src/chats/analysis-links.js +0 -25
- package/dist/src/chats/analysis-merge.d.ts +0 -16
- package/dist/src/chats/analysis-merge.js +0 -134
- package/dist/src/chats/analysis-prompt.d.ts +0 -18
- package/dist/src/chats/analysis-prompt.js +0 -42
- package/dist/src/chats/analysis-proposal.d.ts +0 -4
- package/dist/src/chats/analysis-proposal.js +0 -41
- package/dist/src/chats/analysis-provenance.d.ts +0 -4
- package/dist/src/chats/analysis-provenance.js +0 -99
- package/dist/src/chats/analysis-shape.d.ts +0 -4
- package/dist/src/chats/analysis-shape.js +0 -235
- package/dist/src/chats/analysis.d.ts +0 -3
- package/dist/src/chats/analysis.js +0 -42
- package/dist/src/chats/corpus-input.d.ts +0 -5
- package/dist/src/chats/corpus-input.js +0 -288
- package/dist/src/chats/destination.d.ts +0 -4
- package/dist/src/chats/destination.js +0 -96
- package/dist/src/chats/import.d.ts +0 -15
- package/dist/src/chats/import.js +0 -243
- package/dist/src/chats/input-file.d.ts +0 -3
- package/dist/src/chats/input-file.js +0 -32
- package/dist/src/chats/normalize.d.ts +0 -29
- package/dist/src/chats/normalize.js +0 -155
- package/dist/src/chats/previous-import.d.ts +0 -5
- package/dist/src/chats/previous-import.js +0 -34
- package/dist/src/chats/reader.d.ts +0 -21
- package/dist/src/chats/reader.js +0 -118
- package/dist/src/chats/redact-import.d.ts +0 -14
- package/dist/src/chats/redact-import.js +0 -141
- package/dist/src/chats/redaction.d.ts +0 -41
- package/dist/src/chats/redaction.js +0 -161
- package/dist/src/chats/reference-mapping.d.ts +0 -16
- package/dist/src/chats/reference-mapping.js +0 -153
- package/dist/src/chats/revision-input.d.ts +0 -3
- package/dist/src/chats/revision-input.js +0 -180
- package/dist/src/chats/revision.d.ts +0 -48
- package/dist/src/chats/revision.js +0 -94
- package/dist/src/chats/selection.d.ts +0 -25
- package/dist/src/chats/selection.js +0 -109
- package/dist/src/chats/source.d.ts +0 -23
- package/dist/src/chats/source.js +0 -135
- package/dist/src/chats/structure.d.ts +0 -57
- package/dist/src/chats/structure.js +0 -216
- package/dist/src/chats/workflow-generation-projection.d.ts +0 -8
- package/dist/src/chats/workflow-generation-projection.js +0 -75
- package/dist/src/chats/workflow-generation-source.d.ts +0 -25
- package/dist/src/chats/workflow-generation-source.js +0 -124
- package/dist/src/chats/workflow-generation-text.d.ts +0 -23
- package/dist/src/chats/workflow-generation-text.js +0 -74
- package/dist/src/chats/workflow-generation.d.ts +0 -69
- package/dist/src/chats/workflow-generation.js +0 -142
- package/dist/src/cli/watch-start-view.d.ts +0 -18
- package/dist/src/cli/watch-start-view.js +0 -77
- package/dist/src/daemon/analysis-launch.d.ts +0 -5
- package/dist/src/daemon/analysis-launch.js +0 -81
- package/dist/src/daemon/analysis-token.d.ts +0 -6
- package/dist/src/daemon/analysis-token.js +0 -88
- package/dist/src/daemon/analysis-worker.d.ts +0 -20
- package/dist/src/daemon/analysis-worker.js +0 -271
- package/dist/src/daemon/chats-batch-binding.d.ts +0 -23
- package/dist/src/daemon/chats-batch-binding.js +0 -99
- package/dist/src/daemon/chats-capture.d.ts +0 -18
- package/dist/src/daemon/chats-capture.js +0 -194
- package/dist/src/daemon/chats-checkpoints.d.ts +0 -41
- package/dist/src/daemon/chats-checkpoints.js +0 -186
- package/dist/src/daemon/chats-files.d.ts +0 -42
- package/dist/src/daemon/chats-files.js +0 -252
- package/dist/src/daemon/chats-follow-up.d.ts +0 -38
- package/dist/src/daemon/chats-follow-up.js +0 -180
- package/dist/src/daemon/chats-question.d.ts +0 -15
- package/dist/src/daemon/chats-question.js +0 -93
- package/dist/src/daemon/chats-worker.d.ts +0 -13
- package/dist/src/daemon/chats-worker.js +0 -201
- package/dist/src/steps/decision-gate.d.ts +0 -2
- package/dist/src/steps/decision-gate.js +0 -8
- package/dist/workflows/analyze-chats.d.ts +0 -15
- package/dist/workflows/analyze-chats.declaration.json +0 -22
- package/dist/workflows/analyze-chats.js +0 -250
- package/dist/workflows/develop-prd.d.ts +0 -7
- package/dist/workflows/develop-prd.js +0 -165
- package/dist/workflows/develop-ticket.d.ts +0 -9
- package/dist/workflows/develop-ticket.js +0 -207
- package/dist/workflows/issue-labels.d.ts +0 -16
- package/dist/workflows/issue-labels.js +0 -70
- package/dist/workflows/ticket-prompts.d.ts +0 -35
- package/dist/workflows/ticket-prompts.js +0 -143
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { readCommandWaitDeadline } from "../command-wait-restore.js";
|
|
1
2
|
import { detailColumns, detailRow } from "../../storage/decision-rows.js";
|
|
2
3
|
import { integer, runRow, text, } from "../../storage/domain-rows.js";
|
|
3
4
|
import { storedRun } from "../authority-restore.js";
|
|
@@ -57,6 +58,7 @@ export async function pendingEffect(connection, attempt) {
|
|
|
57
58
|
return {
|
|
58
59
|
...intent,
|
|
59
60
|
purpose,
|
|
61
|
+
...(await readCommandWaitDeadline(connection, intent)),
|
|
60
62
|
inputDigest: text(row, "input_digest"),
|
|
61
63
|
leaseGeneration: integer(row, "generation"),
|
|
62
64
|
capability: text(row, "capability"),
|
|
@@ -7,6 +7,6 @@ export async function pinned(connection, check) {
|
|
|
7
7
|
const stored = readExecutionManifest(JSON.parse(text(await connection.get("SELECT manifest FROM definitions WHERE pin = ?", [
|
|
8
8
|
workflow,
|
|
9
9
|
]), "manifest")));
|
|
10
|
-
const current = available(stored);
|
|
10
|
+
const current = await available(stored);
|
|
11
11
|
return (current !== undefined && resumePinned(stored, current).kind === "admitted");
|
|
12
12
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { endedCommandWaitCheck } from "../../authority/command-waits.js";
|
|
1
2
|
import { stopAttempts, } from "../../authority/stop-sequence.js";
|
|
2
3
|
import { observingIntent, protectedIntent, } from "./delivery-intents.js";
|
|
3
4
|
function present(state, planning) {
|
|
@@ -15,7 +16,7 @@ function present(state, planning) {
|
|
|
15
16
|
stopped: subject.stopped || state.effects.stops[subject.operationId] !== undefined,
|
|
16
17
|
};
|
|
17
18
|
}
|
|
18
|
-
const kinds = ["start-run", "continue-run"];
|
|
19
|
+
const kinds = ["start-run", "continue-run", "resume-hook"];
|
|
19
20
|
function intentOf(state, attempt) {
|
|
20
21
|
const { runId, operationId, purpose } = attempt;
|
|
21
22
|
const kind = kinds.find((candidate) => candidate === attempt.kind);
|
|
@@ -33,9 +34,14 @@ export function presentSubjects(state, planning) {
|
|
|
33
34
|
}
|
|
34
35
|
export function stopIntents(state, planning) {
|
|
35
36
|
const { runId, stopping } = planning;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
const cancelled = state.runs[runId]?.status === "cancelled";
|
|
38
|
+
const subjects = presentSubjects(state, planning).flatMap((subject) => {
|
|
39
|
+
if (endedCommandWaitCheck(state.commandWaits ?? {}, subject.operationId))
|
|
40
|
+
return [
|
|
41
|
+
{ ...subject, stopSequence: subject.stopSequence ?? state.sequence },
|
|
42
|
+
];
|
|
43
|
+
return cancelled ? [subject] : [];
|
|
44
|
+
});
|
|
39
45
|
return stopAttempts(subjects, {
|
|
40
46
|
cancelledSequence: planning.cancelledNow[0] ?? stopping.cancelledSequence ?? 0,
|
|
41
47
|
stopLimit: planning.stopLimit,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { StopSubject } from "../../authority/stop-sequence.ts";
|
|
2
|
+
import type { CommandWaitsState } from "../../authority/command-waits.ts";
|
|
2
3
|
import { type SqlConnection } from "../../storage/domain-rows.ts";
|
|
3
4
|
export interface Stopping {
|
|
4
5
|
readonly subjects: readonly StopSubject[];
|
|
@@ -10,6 +11,7 @@ export declare function turnStopping(connection: SqlConnection, scope: {
|
|
|
10
11
|
readonly runId: string;
|
|
11
12
|
readonly status: string | undefined;
|
|
12
13
|
readonly kind: string;
|
|
14
|
+
readonly commandWaits?: CommandWaitsState;
|
|
13
15
|
}): Promise<Stopping>;
|
|
14
16
|
export declare function droppedRuns(connection: SqlConnection, rule: {
|
|
15
17
|
readonly limit: number;
|
|
@@ -11,23 +11,36 @@ function attemptOf(row) {
|
|
|
11
11
|
const closed = "NOT EXISTS (SELECT 1 FROM deliveries x WHERE x.operation_id = o.operation_id AND x.outcome IS NULL)";
|
|
12
12
|
const reported = "EXISTS (SELECT 1 FROM stopped_operations s WHERE s.operation_id = o.operation_id)";
|
|
13
13
|
const finalStatuses = "'refused', 'completed', 'failed', 'stopped', 'cancelled'";
|
|
14
|
+
const waitStopSequence = "(SELECT min(e.sequence) FROM command_waits w JOIN events e ON e.run_id = w.run_id WHERE w.check_operation = o.operation_id AND w.state != 'waiting' AND (e.type IN ('run.completed', 'run.failed', 'run.cancelled') OR (json_extract(e.payload, '$.waitName') = w.name AND (e.type = 'command-wait.expired' OR (e.type = 'command-wait.opened' AND round(unixepoch(e.recorded_at, 'subsec') * 1000) >= w.deadline)))))";
|
|
14
15
|
export async function stopping(connection, runId) {
|
|
15
|
-
const rows = await connection.all(`SELECT o.operation_id, o.kind, d.effect_id, coalesce(a.purpose, 'dispatch') AS purpose, d.outcome, d.staged_sequence, p.status, p.receipt, ${reported} AS stopped FROM outbox o JOIN deliveries d ON d.operation_id = o.operation_id LEFT JOIN dispatch_attempts a ON a.effect_id = d.effect_id LEFT JOIN operations p ON p.operation_id = o.operation_id WHERE o.run_id = ? AND ((coalesce(p.status, '') NOT IN (${finalStatuses}) AND NOT ${reported}) OR NOT ${closed}) ORDER BY d.staged_sequence, d.rowid`, [runId]);
|
|
16
|
+
const rows = await connection.all(`SELECT o.operation_id, o.kind, d.effect_id, coalesce(a.purpose, 'dispatch') AS purpose, d.outcome, d.staged_sequence, p.status, p.receipt, ${reported} AS stopped, ${waitStopSequence} AS stop_sequence FROM outbox o JOIN deliveries d ON d.operation_id = o.operation_id LEFT JOIN dispatch_attempts a ON a.effect_id = d.effect_id LEFT JOIN operations p ON p.operation_id = o.operation_id WHERE o.run_id = ? AND ((coalesce(p.status, '') NOT IN (${finalStatuses}) AND NOT ${reported}) OR NOT ${closed}) ORDER BY d.staged_sequence, d.rowid`, [runId]);
|
|
16
17
|
const grouped = Map.groupBy(rows, (row) => text(row, "operation_id"));
|
|
17
18
|
return {
|
|
18
|
-
subjects: [...grouped].map(([operationId, attempts]) =>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
subjects: [...grouped].map(([operationId, attempts]) => {
|
|
20
|
+
const stopSequence = optionalInteger(attempts[0], "stop_sequence");
|
|
21
|
+
return {
|
|
22
|
+
operationId,
|
|
23
|
+
kind: text(attempts[0], "kind"),
|
|
24
|
+
attempts: attempts.map(attemptOf),
|
|
25
|
+
status: optionalText(attempts[0], "status"),
|
|
26
|
+
receipt: optionalText(attempts[0], "receipt"),
|
|
27
|
+
stopped: integer(attempts[0], "stopped") === 1,
|
|
28
|
+
...(stopSequence === null ? {} : { stopSequence }),
|
|
29
|
+
};
|
|
30
|
+
}),
|
|
26
31
|
cancelledSequence: optionalInteger(await connection.get("SELECT max(sequence) AS sequence FROM events WHERE run_id = ? AND type = 'run.cancelled'", [runId]), "sequence"),
|
|
27
32
|
};
|
|
28
33
|
}
|
|
29
34
|
export function turnStopping(connection, scope) {
|
|
30
|
-
const
|
|
35
|
+
const endingWait = Object.values(scope.commandWaits ?? {}).some((wait) => wait.checkOperation !== null &&
|
|
36
|
+
(wait.state !== "waiting" ||
|
|
37
|
+
[
|
|
38
|
+
"expire-command-wait",
|
|
39
|
+
"open-command-wait",
|
|
40
|
+
"complete-run",
|
|
41
|
+
"fail-run",
|
|
42
|
+
].includes(scope.kind)));
|
|
43
|
+
const dropping = scope.status === "cancelled" || scope.kind === "cancel-run" || endingWait;
|
|
31
44
|
return dropping
|
|
32
45
|
? stopping(connection, scope.runId)
|
|
33
46
|
: Promise.resolve(noStopping);
|
|
@@ -37,6 +50,6 @@ const last = "(SELECT d.outcome FROM deliveries d WHERE d.operation_id = o.opera
|
|
|
37
50
|
const effectDue = `o.kind = 'protected-effect' AND p.status NOT IN (${finalStatuses}) AND (p.receipt IS NULL OR ?1 = 1 OR p.status IN ('recovering', 'blocked'))`;
|
|
38
51
|
const runDue = `o.kind != 'protected-effect' AND NOT ${reported} AND ((${sent} AND ?1 = 1) OR (NOT ${sent} AND ${last} NOT IN ('withheld', 'blocked', 'absent')))`;
|
|
39
52
|
export async function droppedRuns(connection, rule) {
|
|
40
|
-
const rows = await connection.all(`SELECT r.run_id FROM runs r WHERE
|
|
53
|
+
const rows = await connection.all(`SELECT r.run_id FROM runs r WHERE EXISTS (SELECT 1 FROM outbox o LEFT JOIN operations p ON p.operation_id = o.operation_id WHERE o.run_id = r.run_id AND (r.status = 'cancelled' OR EXISTS (SELECT 1 FROM command_waits w WHERE w.run_id = r.run_id AND w.check_operation = o.operation_id AND w.state != 'waiting')) AND ${closed} AND ((${effectDue}) OR (${runDue}))) ORDER BY r.run_id LIMIT ?2`, [rule.stopSupported ? 1 : 0, rule.limit]);
|
|
41
54
|
return rows.map((row) => text(row, "run_id"));
|
|
42
55
|
}
|
|
@@ -11,6 +11,7 @@ export interface ChangeDraft {
|
|
|
11
11
|
readonly released: readonly Row[];
|
|
12
12
|
readonly closed: readonly Row[];
|
|
13
13
|
readonly gates: readonly Row[];
|
|
14
|
+
readonly waits: readonly Row[];
|
|
14
15
|
readonly details: readonly Row[];
|
|
15
16
|
readonly documents: readonly Row[];
|
|
16
17
|
readonly budgets: readonly Row[];
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { commandWaitRows } from "../command-wait-restore.js";
|
|
1
2
|
import { evidenceOf } from "../../authority/operations.js";
|
|
2
3
|
import { detailRecord, gateRecord } from "../decision-restore.js";
|
|
3
4
|
import { effectRows } from "../effect-restore.js";
|
|
@@ -23,6 +24,7 @@ export function unchangedAt(sequence, closed) {
|
|
|
23
24
|
released: [],
|
|
24
25
|
closed,
|
|
25
26
|
gates: [],
|
|
27
|
+
waits: [],
|
|
26
28
|
details: [],
|
|
27
29
|
documents: [],
|
|
28
30
|
...unchangedEffects,
|
|
@@ -78,6 +80,7 @@ export function draft(result, extra) {
|
|
|
78
80
|
closed,
|
|
79
81
|
documents,
|
|
80
82
|
...effectDraft(result, before),
|
|
83
|
+
waits: commandWaitRows(changedEntries(state.commandWaits ?? {}, before.commandWaits ?? {})).map(columns),
|
|
81
84
|
gates: changed(state.gates, before.gates).map((gate) => columns(gateRecord(gate))),
|
|
82
85
|
details: changed(state.details, before.details).map((details) => columns(detailRecord(details))),
|
|
83
86
|
previous: before.sequence,
|
|
@@ -127,6 +130,7 @@ export function merged(first, later) {
|
|
|
127
130
|
released: joined("released"),
|
|
128
131
|
closed: joined("closed"),
|
|
129
132
|
gates: joined("gates"),
|
|
133
|
+
waits: joined("waits"),
|
|
130
134
|
details: joined("details"),
|
|
131
135
|
documents: joined("documents"),
|
|
132
136
|
budgets: joined("budgets"),
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { readCommandWaits } from "../command-wait-restore.js";
|
|
1
2
|
import { parseCommand } from "../../authority/commands.js";
|
|
2
3
|
import { readExecutionManifest } from "../../execution-pin.js";
|
|
3
4
|
import { operationScope } from "../../operation-identity.js";
|
|
@@ -76,7 +77,7 @@ export async function adoptionTurn(connection) {
|
|
|
76
77
|
return latest;
|
|
77
78
|
}
|
|
78
79
|
export async function recoverableIntents(connection) {
|
|
79
|
-
const rows = await connection.all("SELECT o.operation_id, o.kind, o.run_id, r.workflow FROM outbox o JOIN runs r ON r.run_id = o.run_id WHERE o.released_sequence IS NULL AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = o.operation_id AND d.outcome IS NULL) AND ((o.kind = 'start-run' AND r.status = 'queued') OR (o.kind
|
|
80
|
+
const rows = await connection.all("SELECT o.operation_id, o.kind, o.run_id, r.workflow FROM outbox o JOIN runs r ON r.run_id = o.run_id WHERE o.released_sequence IS NULL AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = o.operation_id AND d.outcome IS NULL) AND ((o.kind = 'start-run' AND r.status = 'queued') OR (o.kind IN ('continue-run', 'resume-hook') AND r.status = 'running') OR (o.kind = 'protected-effect' AND r.status = 'running' AND EXISTS (SELECT 1 FROM operations p WHERE p.operation_id = o.operation_id AND p.status = 'dispatch-pending'))) ORDER BY o.created_sequence, o.rowid LIMIT ?", [recoveryBatch]);
|
|
80
81
|
const intents = [];
|
|
81
82
|
for (const row of rows) {
|
|
82
83
|
const intent = {
|
|
@@ -92,7 +93,7 @@ export async function recoverableIntents(connection) {
|
|
|
92
93
|
return [...intents, ...(await uncertainEffects(connection))];
|
|
93
94
|
}
|
|
94
95
|
async function uncertainEffects(connection) {
|
|
95
|
-
const rows = await connection.all("SELECT p.operation_id, p.run_id, r.workflow FROM operations p JOIN runs r ON r.run_id = p.run_id WHERE p.status IN ('recovering', 'blocked') AND r.status != 'cancelled' AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = p.operation_id AND d.outcome IS NULL) ORDER BY p.requested_sequence LIMIT ?", [recoveryBatch]);
|
|
96
|
+
const rows = await connection.all("SELECT p.operation_id, p.run_id, r.workflow FROM operations p JOIN runs r ON r.run_id = p.run_id WHERE p.status IN ('recovering', 'blocked') AND r.status != 'cancelled' AND NOT EXISTS (SELECT 1 FROM command_waits w WHERE w.check_operation = p.operation_id AND w.state != 'waiting') AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = p.operation_id AND d.outcome IS NULL) ORDER BY p.requested_sequence LIMIT ?", [recoveryBatch]);
|
|
96
97
|
const intents = [];
|
|
97
98
|
for (const row of rows)
|
|
98
99
|
intents.push(await pendingEffect(connection, {
|
|
@@ -161,8 +162,10 @@ async function turnState(connection, scope) {
|
|
|
161
162
|
sql: "SELECT operation_id, kind, run_id, created_sequence, released_sequence FROM outbox WHERE run_id = ? AND released_sequence IS NULL ORDER BY created_sequence, rowid",
|
|
162
163
|
parameters: [runId],
|
|
163
164
|
});
|
|
165
|
+
const waits = await readCommandWaits(connection, runId);
|
|
164
166
|
return {
|
|
165
167
|
state: {
|
|
168
|
+
...waits,
|
|
166
169
|
sequence,
|
|
167
170
|
runs: { ...near.runs, ...(stored ? { [runId]: stored } : {}) },
|
|
168
171
|
commands: recorded ? { [commandId]: recorded } : {},
|
|
@@ -178,6 +181,7 @@ async function turnState(connection, scope) {
|
|
|
178
181
|
runId,
|
|
179
182
|
status: stored?.status,
|
|
180
183
|
kind: scope.kind,
|
|
184
|
+
...waits,
|
|
181
185
|
}),
|
|
182
186
|
runId,
|
|
183
187
|
created: recorded
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { commandWaitKey } from "../authority/command-waits.js";
|
|
2
|
+
import { documentDigest } from "./decision-restore.js";
|
|
1
3
|
import { parseCommand } from "../authority/commands.js";
|
|
2
4
|
import { executionCapabilities, readExecutionManifest, resumePinned, } from "../execution-pin.js";
|
|
3
5
|
import { effectInputDigest } from "./effect-restore.js";
|
|
@@ -33,15 +35,70 @@ const resumption = (command, context) => {
|
|
|
33
35
|
? resumed
|
|
34
36
|
: admissible;
|
|
35
37
|
};
|
|
36
|
-
const
|
|
38
|
+
const commandEffect = (command, context) => {
|
|
39
|
+
const pin = context.state.runs[command.runId]?.workflow ?? "";
|
|
40
|
+
const names = context.definitions.get(pin)?.commands ?? [];
|
|
41
|
+
const method = String(command.method);
|
|
42
|
+
if (!method.startsWith("run:") || !names.includes(method.slice(4)))
|
|
43
|
+
return { kind: "rejected", reason: "command-not-declared" };
|
|
44
|
+
return unpinned(command, context);
|
|
45
|
+
};
|
|
46
|
+
function waitMatches(command, wait) {
|
|
47
|
+
return (command.target === wait.command &&
|
|
48
|
+
command.maximumWaitSeconds === wait.maximumWaitSeconds &&
|
|
49
|
+
command.pollEverySeconds === wait.pollEverySeconds);
|
|
50
|
+
}
|
|
51
|
+
const commandWait = (command, context) => {
|
|
52
|
+
const pin = context.state.runs[command.runId]?.workflow ?? "";
|
|
53
|
+
const declaration = context.definitions.get(pin);
|
|
54
|
+
const name = String(command.waitName);
|
|
55
|
+
const waits = declaration?.commandWaits ?? {};
|
|
56
|
+
const wait = Object.hasOwn(waits, name) ? waits[name] : undefined;
|
|
57
|
+
if (wait === undefined || !waitMatches(command, wait))
|
|
58
|
+
return { kind: "rejected", reason: "command-wait-not-declared" };
|
|
59
|
+
return unpinned(command, context);
|
|
60
|
+
};
|
|
61
|
+
function declaredWaitCheck(command, context) {
|
|
62
|
+
const pin = context.state.runs[command.runId]?.workflow ?? "";
|
|
63
|
+
const declarations = context.definitions.get(pin)?.commandWaits ?? {};
|
|
64
|
+
const name = String(command.waitName);
|
|
65
|
+
const declaration = Object.hasOwn(declarations, name)
|
|
66
|
+
? declarations[name]
|
|
67
|
+
: undefined;
|
|
68
|
+
const wait = context.state.commandWaits?.[commandWaitKey(command.runId, name)];
|
|
69
|
+
if (declaration === undefined || wait === undefined)
|
|
70
|
+
return undefined;
|
|
71
|
+
return waitMatches({
|
|
72
|
+
...command,
|
|
73
|
+
target: wait.command,
|
|
74
|
+
maximumWaitSeconds: wait.maximumWaitSeconds,
|
|
75
|
+
pollEverySeconds: wait.pollEverySeconds,
|
|
76
|
+
}, declaration)
|
|
77
|
+
? wait
|
|
78
|
+
: undefined;
|
|
79
|
+
}
|
|
80
|
+
const commandWaitCheck = (command, context) => {
|
|
81
|
+
const wait = declaredWaitCheck(command, context);
|
|
82
|
+
if (wait === undefined)
|
|
83
|
+
return { kind: "rejected", reason: "command-wait-not-declared" };
|
|
37
84
|
const computed = effectInputDigest({
|
|
38
|
-
capability:
|
|
39
|
-
method:
|
|
40
|
-
target:
|
|
41
|
-
payload:
|
|
85
|
+
capability: "command",
|
|
86
|
+
method: `run:${wait.command}`,
|
|
87
|
+
target: wait.command,
|
|
88
|
+
payload: wait.inputDigest,
|
|
42
89
|
});
|
|
43
|
-
|
|
44
|
-
|
|
90
|
+
return command.inputDigest === computed
|
|
91
|
+
? unpinned(command, context)
|
|
92
|
+
: { kind: "rejected", reason: "input-digest-mismatch" };
|
|
93
|
+
};
|
|
94
|
+
const commandReport = (command, context) => {
|
|
95
|
+
const output = command.commandOutput;
|
|
96
|
+
if (output !== undefined &&
|
|
97
|
+
(command.worker !== "command" || documentDigest(output) !== command.result))
|
|
98
|
+
return { kind: "rejected", reason: "command-output-mismatch" };
|
|
99
|
+
return unpinned(command, context);
|
|
100
|
+
};
|
|
101
|
+
const handoffEffect = (command, context) => {
|
|
45
102
|
if (command.capability !== "handoff")
|
|
46
103
|
return unpinned(command, context);
|
|
47
104
|
const pin = context.state.runs[command.runId]?.workflow ?? "";
|
|
@@ -52,8 +109,24 @@ const effectRequest = (command, context) => {
|
|
|
52
109
|
return { kind: "rejected", reason: "invalid-handoff-request" };
|
|
53
110
|
return unpinned(command, context);
|
|
54
111
|
};
|
|
112
|
+
const effectRequest = (command, context) => {
|
|
113
|
+
const computed = effectInputDigest({
|
|
114
|
+
capability: String(command.capability),
|
|
115
|
+
method: String(command.method),
|
|
116
|
+
target: String(command.target),
|
|
117
|
+
payload: String(command.payload),
|
|
118
|
+
});
|
|
119
|
+
if (computed !== command.inputDigest)
|
|
120
|
+
return { kind: "rejected", reason: "input-digest-mismatch" };
|
|
121
|
+
return command.capability === "command"
|
|
122
|
+
? commandEffect(command, context)
|
|
123
|
+
: handoffEffect(command, context);
|
|
124
|
+
};
|
|
55
125
|
const rules = {
|
|
56
126
|
"request-effect": effectRequest,
|
|
127
|
+
"check-command-wait": commandWaitCheck,
|
|
128
|
+
"report-effect": commandReport,
|
|
129
|
+
"open-command-wait": commandWait,
|
|
57
130
|
"admit-run": admission,
|
|
58
131
|
"decide-gate": resumption,
|
|
59
132
|
"resume-run": resumption,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CommandWaitRow } from "../storage/command-wait-rows.ts";
|
|
1
2
|
import type { AuthorityEvent, AuthorityState, EffectIntent, RunState } from "../authority/reducer.ts";
|
|
2
3
|
import type { DecisionRows, DocumentRow } from "../storage/decision-rows.ts";
|
|
3
4
|
import type { EffectRows } from "../storage/effect-rows.ts";
|
|
@@ -7,6 +8,7 @@ import type { ExecutionManifest } from "../workflow-admission.ts";
|
|
|
7
8
|
export type RestoredSnapshot = AuthoritySnapshot & Partial<DecisionRows> & {
|
|
8
9
|
readonly documents?: readonly DocumentRow[];
|
|
9
10
|
readonly effects?: EffectRows;
|
|
11
|
+
readonly waits?: readonly CommandWaitRow[];
|
|
10
12
|
};
|
|
11
13
|
export type Restoration = {
|
|
12
14
|
readonly kind: "restored";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { commandWaitState, commandWaitRows, commandOutputsIntact, } from "./command-wait-restore.js";
|
|
1
2
|
import { isDeepStrictEqual } from "node:util";
|
|
2
3
|
import { parseEvent } from "../authority/events.js";
|
|
3
4
|
import { rebuildHistory } from "../authority/history.js";
|
|
@@ -51,6 +52,7 @@ export function restore(snapshot) {
|
|
|
51
52
|
isDeepStrictEqual(Object.fromEntries(snapshot.runs.map((row) => [row.runId, row.sequence])), history.runSequences),
|
|
52
53
|
],
|
|
53
54
|
["definitions", definitionsIntact(definitions, state)],
|
|
55
|
+
...waitChecks(snapshot, { state, definitions, events }),
|
|
54
56
|
...decisionChecks(snapshot, state),
|
|
55
57
|
...(snapshot.effects === undefined
|
|
56
58
|
? []
|
|
@@ -68,6 +70,21 @@ export function restore(snapshot) {
|
|
|
68
70
|
};
|
|
69
71
|
return { kind: "restored", state, events, definitions };
|
|
70
72
|
}
|
|
73
|
+
function waitChecks(snapshot, context) {
|
|
74
|
+
const { state, definitions } = context;
|
|
75
|
+
return [
|
|
76
|
+
["command-outputs", commandOutputsIntact(context.events)],
|
|
77
|
+
["command-waits", commandWaitsIntact(definitions, state)],
|
|
78
|
+
...(snapshot.waits === undefined
|
|
79
|
+
? []
|
|
80
|
+
: [
|
|
81
|
+
[
|
|
82
|
+
"waits",
|
|
83
|
+
isDeepStrictEqual(snapshot.waits, commandWaitRows(state.commandWaits ?? {})),
|
|
84
|
+
],
|
|
85
|
+
]),
|
|
86
|
+
];
|
|
87
|
+
}
|
|
71
88
|
function decisionChecks(snapshot, state) {
|
|
72
89
|
const { gates, details, documents } = snapshot;
|
|
73
90
|
if (gates === undefined || details === undefined || documents === undefined)
|
|
@@ -95,12 +112,29 @@ function definitionsIntact(definitions, state) {
|
|
|
95
112
|
const used = new Set(Object.values(state.runs).map((run) => run.workflow));
|
|
96
113
|
return ([...definitions].every(([pin, manifest]) => workflowPin(manifest) === pin && used.has(pin)) && [...used].every((pin) => definitions.has(pin)));
|
|
97
114
|
}
|
|
115
|
+
function commandWaitsIntact(definitions, state) {
|
|
116
|
+
return Object.values(state.commandWaits ?? {}).every((wait) => {
|
|
117
|
+
const pin = state.runs[wait.runId]?.workflow ?? "";
|
|
118
|
+
const waits = definitions.get(pin)?.commandWaits ?? {};
|
|
119
|
+
const permission = Object.hasOwn(waits, wait.name)
|
|
120
|
+
? waits[wait.name]
|
|
121
|
+
: undefined;
|
|
122
|
+
return (permission !== undefined &&
|
|
123
|
+
permission.command === wait.command &&
|
|
124
|
+
permission.maximumWaitSeconds === wait.maximumWaitSeconds &&
|
|
125
|
+
permission.pollEverySeconds === wait.pollEverySeconds);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
98
128
|
const projectionParts = ["sequence", "runs", "commands", "intents"];
|
|
99
129
|
function text(error) {
|
|
100
130
|
return String(Reflect.get(Object(error), "message"));
|
|
101
131
|
}
|
|
102
132
|
export function currentState(snapshot) {
|
|
103
|
-
return {
|
|
133
|
+
return {
|
|
134
|
+
...projectedState(snapshot),
|
|
135
|
+
...decisionState(snapshot),
|
|
136
|
+
...commandWaitState(snapshot.waits ?? []),
|
|
137
|
+
};
|
|
104
138
|
}
|
|
105
139
|
export function projectedState(snapshot) {
|
|
106
140
|
return {
|
|
@@ -122,6 +156,7 @@ export function projectedState(snapshot) {
|
|
|
122
156
|
const intentKinds = [
|
|
123
157
|
"start-run",
|
|
124
158
|
"continue-run",
|
|
159
|
+
"resume-hook",
|
|
125
160
|
"protected-effect",
|
|
126
161
|
];
|
|
127
162
|
export function intentKind(value) {
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Database } from "solid-objects";
|
|
2
|
+
import { type CommandWaitsState } from "../authority/command-waits.ts";
|
|
3
|
+
import type { AuthorityEvent } from "../authority/transitions.ts";
|
|
4
|
+
import type { DispatchRead } from "../authority/dispatch-decision.ts";
|
|
5
|
+
import type { AuthorityState } from "../authority/transitions.ts";
|
|
6
|
+
import { type CommandWaitRow } from "../storage/command-wait-rows.ts";
|
|
7
|
+
import type { SqlConnection } from "../storage/domain-rows.ts";
|
|
8
|
+
export declare function commandWaitRows(waits: CommandWaitsState): readonly CommandWaitRow[];
|
|
9
|
+
export declare function commandWaitState(rows: readonly CommandWaitRow[]): {
|
|
10
|
+
readonly commandWaits?: CommandWaitsState;
|
|
11
|
+
};
|
|
12
|
+
export declare function readCommandWaits(connection: SqlConnection, runId: string): Promise<{
|
|
13
|
+
readonly commandWaits?: CommandWaitsState;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function upgradeCommandWaits(database: Database, state: AuthorityState): Promise<void>;
|
|
16
|
+
export declare function upgradeCommandWaitChecks(database: Database): Promise<void>;
|
|
17
|
+
export declare function commandWaitDeadline(waits: CommandWaitsState, operationId: string): {
|
|
18
|
+
readonly commandDeadline?: string;
|
|
19
|
+
};
|
|
20
|
+
export declare function dispatchCommandWait(connection: SqlConnection, check: {
|
|
21
|
+
readonly runId: string;
|
|
22
|
+
readonly workflow: string;
|
|
23
|
+
readonly operationId: string;
|
|
24
|
+
}): Promise<Pick<DispatchRead, "commandWait">>;
|
|
25
|
+
export declare function commandOutputsIntact(events: readonly AuthorityEvent[]): boolean;
|
|
26
|
+
export declare function readCommandWaitDeadline(connection: SqlConnection, scope: {
|
|
27
|
+
readonly runId: string;
|
|
28
|
+
readonly operationId: string;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
readonly commandDeadline?: string;
|
|
31
|
+
}>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { commandWaitKey, } from "../authority/command-waits.js";
|
|
2
|
+
import { operationPhase } from "../operation-identity.js";
|
|
3
|
+
import { documentDigest } from "./decision-restore.js";
|
|
4
|
+
import { readExecutionManifest } from "../execution-pin.js";
|
|
5
|
+
import { text } from "../storage/domain-rows.js";
|
|
6
|
+
import { commandWaitStatements, loadCommandWaits, } from "../storage/command-wait-rows.js";
|
|
7
|
+
import { checkedVersion, waitingVersion, upgradeSchema, } from "../storage/domain-schema.js";
|
|
8
|
+
export function commandWaitRows(waits) {
|
|
9
|
+
return Object.values(waits).sort((left, right) => {
|
|
10
|
+
if (left.runId !== right.runId)
|
|
11
|
+
return left.runId < right.runId ? -1 : 1;
|
|
12
|
+
return left.name < right.name ? -1 : 1;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export function commandWaitState(rows) {
|
|
16
|
+
const waits = {};
|
|
17
|
+
for (const row of rows) {
|
|
18
|
+
const state = [
|
|
19
|
+
"waiting",
|
|
20
|
+
"timed-out",
|
|
21
|
+
"cancelled",
|
|
22
|
+
"completed",
|
|
23
|
+
"failed",
|
|
24
|
+
];
|
|
25
|
+
const kind = state.find((candidate) => candidate === row.state);
|
|
26
|
+
if (kind === undefined)
|
|
27
|
+
throw new Error("invalid-command-wait-state");
|
|
28
|
+
waits[commandWaitKey(row.runId, row.name)] = { ...row, state: kind };
|
|
29
|
+
}
|
|
30
|
+
return rows.length === 0 ? {} : { commandWaits: waits };
|
|
31
|
+
}
|
|
32
|
+
export async function readCommandWaits(connection, runId) {
|
|
33
|
+
return commandWaitState(await loadCommandWaits(connection, { runId }));
|
|
34
|
+
}
|
|
35
|
+
export async function upgradeCommandWaits(database, state) {
|
|
36
|
+
await database.transaction(async (connection) => {
|
|
37
|
+
await upgradeSchema(connection, waitingVersion);
|
|
38
|
+
for (const statement of commandWaitStatements(commandWaitRows(state.commandWaits ?? {}), { version: "opened" }))
|
|
39
|
+
await connection.run(statement.sql, statement.parameters);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
export async function upgradeCommandWaitChecks(database) {
|
|
43
|
+
await database.transaction(async (connection) => {
|
|
44
|
+
await upgradeSchema(connection, checkedVersion);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export function commandWaitDeadline(waits, operationId) {
|
|
48
|
+
const wait = Object.values(waits).find((wait) => wait.checkOperation === operationId);
|
|
49
|
+
return wait === undefined
|
|
50
|
+
? {}
|
|
51
|
+
: { commandDeadline: new Date(wait.deadline).toISOString() };
|
|
52
|
+
}
|
|
53
|
+
export async function dispatchCommandWait(connection, check) {
|
|
54
|
+
if (operationPhase(check.operationId) !== "command-wait")
|
|
55
|
+
return {};
|
|
56
|
+
const state = await readCommandWaits(connection, check.runId);
|
|
57
|
+
const wait = Object.values(state.commandWaits ?? {}).find((wait) => wait.checkOperation === check.operationId);
|
|
58
|
+
if (wait === undefined)
|
|
59
|
+
return {};
|
|
60
|
+
const row = await connection.get("SELECT manifest FROM definitions WHERE pin = ?", [check.workflow]);
|
|
61
|
+
const declarations = readExecutionManifest(JSON.parse(text(row, "manifest"))).commandWaits ?? {};
|
|
62
|
+
const permission = Object.hasOwn(declarations, wait.name)
|
|
63
|
+
? declarations[wait.name]
|
|
64
|
+
: undefined;
|
|
65
|
+
return { commandWait: { wait, declared: declaredWait(wait, permission) } };
|
|
66
|
+
}
|
|
67
|
+
function declaredWait(wait, permission) {
|
|
68
|
+
return (permission !== undefined &&
|
|
69
|
+
permission.command === wait.command &&
|
|
70
|
+
permission.maximumWaitSeconds === wait.maximumWaitSeconds &&
|
|
71
|
+
permission.pollEverySeconds === wait.pollEverySeconds);
|
|
72
|
+
}
|
|
73
|
+
export function commandOutputsIntact(events) {
|
|
74
|
+
return events.every((event) => {
|
|
75
|
+
const output = event.payload["commandOutput"];
|
|
76
|
+
return (output === undefined ||
|
|
77
|
+
(event.payload["worker"] === "command" &&
|
|
78
|
+
documentDigest(output) === event.payload["result"]));
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
export async function readCommandWaitDeadline(connection, scope) {
|
|
82
|
+
if (operationPhase(scope.operationId) !== "command-wait")
|
|
83
|
+
return {};
|
|
84
|
+
const state = await readCommandWaits(connection, scope.runId);
|
|
85
|
+
return commandWaitDeadline(state.commandWaits ?? {}, scope.operationId);
|
|
86
|
+
}
|
|
@@ -2,7 +2,7 @@ import type { RunDetails } from "../authority/details.ts";
|
|
|
2
2
|
import { type GateState } from "../authority/gates.ts";
|
|
3
3
|
import type { AuthorityState } from "../authority/reducer.ts";
|
|
4
4
|
import type { DecisionRows, DetailRow, DocumentRow, GateRow } from "../storage/decision-rows.ts";
|
|
5
|
-
export type DecisionState = Pick<AuthorityState, "gates" | "details" | "questions">;
|
|
5
|
+
export type DecisionState = Pick<AuthorityState, "gates" | "details" | "questions" | "commandWaits">;
|
|
6
6
|
export declare function documentDigest(body: string): string;
|
|
7
7
|
export declare function gateRecord(gate: GateState): GateRow;
|
|
8
8
|
export declare function detailRecord(details: RunDetails): DetailRow;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { delivers, gateKey } from "../authority/gates.js";
|
|
3
|
+
import { gateDelivery } from "../authority/reduction.js";
|
|
4
4
|
const kinds = ["question", "approval", "untyped"];
|
|
5
|
-
const waits = ["registered", "pending"];
|
|
5
|
+
const waits = ["registered", "pending", "hook"];
|
|
6
6
|
export function documentDigest(body) {
|
|
7
7
|
return `sha256:${createHash("sha256").update(body).digest("hex")}`;
|
|
8
8
|
}
|
|
@@ -22,7 +22,7 @@ export function gateRecord(gate) {
|
|
|
22
22
|
answer: gate.outcome?.answer ?? null,
|
|
23
23
|
decidedSequence: gate.outcome?.sequence ?? null,
|
|
24
24
|
openedSequence: gate.openedSequence,
|
|
25
|
-
continuation:
|
|
25
|
+
continuation: delivers(gate) ? gateDelivery(gate).operationId : null,
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
const unobserved = {
|
|
@@ -141,6 +141,7 @@ export function decisionRows(state) {
|
|
|
141
141
|
}
|
|
142
142
|
export function referencedDigests(state) {
|
|
143
143
|
return [
|
|
144
|
+
...Object.values(state.commandWaits ?? {}).map((wait) => wait.inputDigest),
|
|
144
145
|
...Object.values(state.gates).flatMap((gate) => [
|
|
145
146
|
gate.prompt,
|
|
146
147
|
gate.outcome?.answer ?? null,
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import type { Database } from "solid-objects";
|
|
2
2
|
import type { AuthorityState } from "../authority/reducer.ts";
|
|
3
3
|
export declare function upgradeEffects(database: Database, state: AuthorityState): Promise<void>;
|
|
4
|
+
export declare function upgradeSpendingIndexes(database: Database): Promise<void>;
|
|
5
|
+
export declare function upgradeEventIndexes(database: Database): Promise<void>;
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import { currentVersion, upgradeSchema } from "../storage/domain-schema.js";
|
|
1
|
+
import { currentVersion, effectedVersion, spendingVersion, upgradeSchema, } from "../storage/domain-schema.js";
|
|
2
2
|
import { persistEffects } from "../storage/effect-changes.js";
|
|
3
3
|
import { effectRows } from "./effect-restore.js";
|
|
4
4
|
export async function upgradeEffects(database, state) {
|
|
5
5
|
await database.transaction(async (connection) => {
|
|
6
|
-
await upgradeSchema(connection,
|
|
6
|
+
await upgradeSchema(connection, effectedVersion);
|
|
7
7
|
await persistEffects(connection, effectRows(state.effects, []));
|
|
8
8
|
});
|
|
9
9
|
}
|
|
10
|
+
export async function upgradeSpendingIndexes(database) {
|
|
11
|
+
await database.transaction((connection) => upgradeSchema(connection, spendingVersion));
|
|
12
|
+
}
|
|
13
|
+
export async function upgradeEventIndexes(database) {
|
|
14
|
+
await database.transaction((connection) => upgradeSchema(connection, currentVersion));
|
|
15
|
+
}
|
|
@@ -6,4 +6,6 @@ export type SocketAddress = {
|
|
|
6
6
|
readonly reason: "runtime-path-too-long";
|
|
7
7
|
readonly detail: string;
|
|
8
8
|
};
|
|
9
|
-
export declare function socketAddress(path: string
|
|
9
|
+
export declare function socketAddress(path: string, options?: {
|
|
10
|
+
readonly directory: string;
|
|
11
|
+
}): SocketAddress;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { relative } from "node:path";
|
|
2
2
|
const maximumBytes = 103;
|
|
3
|
-
export function socketAddress(path) {
|
|
4
|
-
const [shortest] = [path, relative(
|
|
3
|
+
export function socketAddress(path, options = { directory: process.cwd() }) {
|
|
4
|
+
const [shortest] = [path, relative(options.directory, path)]
|
|
5
5
|
.filter((candidate) => candidate.length > 0)
|
|
6
6
|
.sort((left, right) => Buffer.byteLength(left) - Buffer.byteLength(right));
|
|
7
7
|
if (shortest === undefined || Buffer.byteLength(shortest) > maximumBytes)
|