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
|
@@ -88,8 +88,10 @@ const unavailablePin = assessed("infrastructure-failure", {
|
|
|
88
88
|
nextAction: "restore-pinned-workflow",
|
|
89
89
|
humanInputCanHelp: true,
|
|
90
90
|
});
|
|
91
|
-
function
|
|
91
|
+
function workflowFailure(input) {
|
|
92
92
|
const code = input.details?.observation?.reason;
|
|
93
|
+
if (code === "pinned-workflow-unavailable")
|
|
94
|
+
return unavailablePin;
|
|
93
95
|
if (code !== "world-run-conflict")
|
|
94
96
|
return undefined;
|
|
95
97
|
return assessed("infrastructure-failure", {
|
|
@@ -103,7 +105,7 @@ function queued(input) {
|
|
|
103
105
|
return unknownEffect;
|
|
104
106
|
if (blocked(input.operations))
|
|
105
107
|
return unavailablePin;
|
|
106
|
-
const conflict =
|
|
108
|
+
const conflict = workflowFailure(input);
|
|
107
109
|
if (conflict !== undefined)
|
|
108
110
|
return conflict;
|
|
109
111
|
if (dispatched(input.operations))
|
|
@@ -141,10 +143,13 @@ function running(input) {
|
|
|
141
143
|
return effect;
|
|
142
144
|
if (blocked(input.operations))
|
|
143
145
|
return unavailablePin;
|
|
144
|
-
return
|
|
146
|
+
return workflowFailure(input) ?? observed(input);
|
|
145
147
|
}
|
|
146
148
|
function observed(input) {
|
|
147
149
|
const observation = input.details?.observation ?? null;
|
|
150
|
+
const wait = runWaitAssessment(observation);
|
|
151
|
+
if (wait !== undefined)
|
|
152
|
+
return wait;
|
|
148
153
|
if (observation !== null &&
|
|
149
154
|
Object.hasOwn(observedActions, observation.condition))
|
|
150
155
|
return observedWork(observation);
|
|
@@ -160,7 +165,20 @@ function observed(input) {
|
|
|
160
165
|
humanInputCanHelp: false,
|
|
161
166
|
});
|
|
162
167
|
}
|
|
168
|
+
function runWaitAssessment(observation) {
|
|
169
|
+
if (observation?.condition === "waiting-run")
|
|
170
|
+
return assessed("waiting-run", {
|
|
171
|
+
code: "awaiting-run",
|
|
172
|
+
detail: `The run waits for run ${observation.evidence ?? "unknown"}.`,
|
|
173
|
+
nextAction: "await-run",
|
|
174
|
+
nextActionAt: observation.retryAt,
|
|
175
|
+
humanInputCanHelp: false,
|
|
176
|
+
});
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
163
179
|
function waiting(input) {
|
|
180
|
+
if (input.details?.observation?.reason === "pinned-workflow-unavailable")
|
|
181
|
+
return unavailablePin;
|
|
164
182
|
const pending = input.gates.filter((gate) => gate.outcome === null);
|
|
165
183
|
const question = pending.some((gate) => gate.kind === "question");
|
|
166
184
|
const approval = pending.some((gate) => gate.kind === "approval");
|
|
@@ -226,6 +244,7 @@ export function runView(input) {
|
|
|
226
244
|
workflow: run.workflow,
|
|
227
245
|
state: run.status,
|
|
228
246
|
condition: assessment.condition,
|
|
247
|
+
awaitedRunId: awaitedRun(assessment, observation),
|
|
229
248
|
revision: run.revision,
|
|
230
249
|
latestSequence: input.latestSequence,
|
|
231
250
|
pendingDecisions: input.gates
|
|
@@ -247,6 +266,7 @@ export function runView(input) {
|
|
|
247
266
|
attempts: observation?.attempt ?? 0,
|
|
248
267
|
limit: observation?.limit ?? null,
|
|
249
268
|
},
|
|
269
|
+
commandWaits: input.commandWaits,
|
|
250
270
|
budget: input.budget,
|
|
251
271
|
effects: effectViews(input.effects),
|
|
252
272
|
nextAction: assessment.nextAction,
|
|
@@ -254,3 +274,8 @@ export function runView(input) {
|
|
|
254
274
|
humanInputCanHelp: assessment.humanInputCanHelp,
|
|
255
275
|
};
|
|
256
276
|
}
|
|
277
|
+
function awaitedRun(assessment, observation) {
|
|
278
|
+
return assessment.condition === "waiting-run"
|
|
279
|
+
? (observation?.evidence ?? null)
|
|
280
|
+
: null;
|
|
281
|
+
}
|
|
@@ -39,7 +39,8 @@ const stopPurposes = ["stop", "reconcile"];
|
|
|
39
39
|
export function stopCount(subject, cancelledSequence) {
|
|
40
40
|
return subject.attempts.filter((attempt) => attempt.outcome !== null &&
|
|
41
41
|
stopPurposes.includes(attempt.purpose) &&
|
|
42
|
-
attempt.stagedSequence >=
|
|
42
|
+
attempt.stagedSequence >=
|
|
43
|
+
Math.max(cancelledSequence, subject.stopSequence ?? 0)).length;
|
|
43
44
|
}
|
|
44
45
|
const uncertainStatuses = ["recovering", "blocked"];
|
|
45
46
|
function uncertain(subject) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CommandWaitsState } from "./command-waits.ts";
|
|
1
2
|
import type { RunDetails } from "./details.ts";
|
|
2
3
|
import type { GateState } from "./gates.ts";
|
|
3
4
|
import type { EffectState } from "./operations.ts";
|
|
@@ -11,7 +12,7 @@ export interface RunState {
|
|
|
11
12
|
readonly gates: readonly string[];
|
|
12
13
|
}
|
|
13
14
|
export interface EffectIntent {
|
|
14
|
-
readonly kind: "start-run" | "continue-run" | "protected-effect";
|
|
15
|
+
readonly kind: "start-run" | "continue-run" | "resume-hook" | "protected-effect";
|
|
15
16
|
readonly runId: string;
|
|
16
17
|
readonly operationId: string;
|
|
17
18
|
}
|
|
@@ -26,9 +27,10 @@ export interface AuthorityState {
|
|
|
26
27
|
readonly gates: Readonly<Record<string, GateState>>;
|
|
27
28
|
readonly details: Readonly<Record<string, RunDetails>>;
|
|
28
29
|
readonly questions: number;
|
|
30
|
+
readonly commandWaits?: CommandWaitsState;
|
|
29
31
|
readonly effects: EffectState;
|
|
30
32
|
}
|
|
31
|
-
export declare const eventTypes: readonly ["run.created", "run.started", "gate.opened", "gate.wait-registered", "gate.decided", "gate.expired", "run.paused", "run.resumed", "run.completed", "run.failed", "run.cancelled", "run.observed", "step.dispatched", "effect.requested", "lease.granted", "lease.expired", "effect.reported", "operation.reconciled"];
|
|
33
|
+
export declare const eventTypes: readonly ["run.created", "run.started", "gate.opened", "gate.wait-registered", "gate.decided", "gate.expired", "run.paused", "run.resumed", "run.completed", "run.failed", "run.cancelled", "run.observed", "step.dispatched", "effect.requested", "lease.granted", "lease.expired", "effect.reported", "operation.reconciled", "schedule.skipped", "command-wait.opened", "command-wait.checked", "command-wait.expired"];
|
|
32
34
|
export type EventType = (typeof eventTypes)[number];
|
|
33
35
|
export interface AuthorityEvent {
|
|
34
36
|
readonly sequence: number;
|
|
@@ -39,8 +41,8 @@ export interface AuthorityEvent {
|
|
|
39
41
|
readonly request: string;
|
|
40
42
|
readonly payload: Readonly<Record<string, string>>;
|
|
41
43
|
}
|
|
42
|
-
export declare const numberFields: readonly ["expectedRevision", "generation", "attempt", "limit", "effectLimit", "units", "recoveryLimit", "leaseGeneration", "sourceGeneration", "capacity"];
|
|
43
|
-
export declare const textFields: readonly ["parentRunId", "chainId", "workflow", "submission", "input", "resolver", "gateId", "gateKind", "subject", "prompt", "expiresAt", "decision", "answer", "condition", "reason", "evidence", "retryAt", "operationId", "receipt", "capabilities", "capability", "method", "target", "payload", "inputDigest", "resource", "transport", "source", "worker", "outcome", "outcomeReason", "promotionId", "ticketStatus", "issueUpdate", "result"];
|
|
44
|
+
export declare const numberFields: readonly ["expectedRevision", "expectedObservation", "generation", "attempt", "limit", "effectLimit", "units", "recoveryLimit", "leaseGeneration", "sourceGeneration", "capacity", "slot", "maximumWaitSeconds", "pollEverySeconds"];
|
|
45
|
+
export declare const textFields: readonly ["parentRunId", "chainId", "workflow", "workflowId", "submission", "input", "resolver", "gateId", "gateKind", "waitMode", "subject", "prompt", "expiresAt", "decision", "answer", "condition", "reason", "evidence", "retryAt", "operationId", "receipt", "capabilities", "capability", "method", "target", "payload", "inputDigest", "resource", "transport", "source", "worker", "outcome", "outcomeReason", "promotionId", "ticketStatus", "issueUpdate", "result", "actor", "waitName", "commandOutput"];
|
|
44
46
|
export type NumberField = (typeof numberFields)[number];
|
|
45
47
|
export type TextField = (typeof textFields)[number];
|
|
46
48
|
export type AuthorityCommand = {
|
|
@@ -48,7 +50,7 @@ export type AuthorityCommand = {
|
|
|
48
50
|
readonly commandId: string;
|
|
49
51
|
readonly runId: string;
|
|
50
52
|
} & Readonly<Partial<Record<NumberField, number>>> & Readonly<Partial<Record<TextField, string>>>;
|
|
51
|
-
export type Move = Exclude<EventType, "run.created" | "step.dispatched" | "gate.wait-registered" | "run.observed" | "effect.requested" | "lease.granted" | "lease.expired" | "effect.reported" | "operation.reconciled">;
|
|
53
|
+
export type Move = Exclude<EventType, "run.created" | "step.dispatched" | "gate.wait-registered" | "run.observed" | "effect.requested" | "lease.granted" | "lease.expired" | "effect.reported" | "operation.reconciled" | "schedule.skipped" | "command-wait.opened" | "command-wait.checked" | "command-wait.expired">;
|
|
52
54
|
export declare const terminal: readonly RunStatus[];
|
|
53
55
|
export type Transition = {
|
|
54
56
|
readonly kind: "moved";
|
|
@@ -17,9 +17,14 @@ export const eventTypes = [
|
|
|
17
17
|
"lease.expired",
|
|
18
18
|
"effect.reported",
|
|
19
19
|
"operation.reconciled",
|
|
20
|
+
"schedule.skipped",
|
|
21
|
+
"command-wait.opened",
|
|
22
|
+
"command-wait.checked",
|
|
23
|
+
"command-wait.expired",
|
|
20
24
|
];
|
|
21
25
|
export const numberFields = [
|
|
22
26
|
"expectedRevision",
|
|
27
|
+
"expectedObservation",
|
|
23
28
|
"generation",
|
|
24
29
|
"attempt",
|
|
25
30
|
"limit",
|
|
@@ -29,16 +34,21 @@ export const numberFields = [
|
|
|
29
34
|
"leaseGeneration",
|
|
30
35
|
"sourceGeneration",
|
|
31
36
|
"capacity",
|
|
37
|
+
"slot",
|
|
38
|
+
"maximumWaitSeconds",
|
|
39
|
+
"pollEverySeconds",
|
|
32
40
|
];
|
|
33
41
|
export const textFields = [
|
|
34
42
|
"parentRunId",
|
|
35
43
|
"chainId",
|
|
36
44
|
"workflow",
|
|
45
|
+
"workflowId",
|
|
37
46
|
"submission",
|
|
38
47
|
"input",
|
|
39
48
|
"resolver",
|
|
40
49
|
"gateId",
|
|
41
50
|
"gateKind",
|
|
51
|
+
"waitMode",
|
|
42
52
|
"subject",
|
|
43
53
|
"prompt",
|
|
44
54
|
"expiresAt",
|
|
@@ -66,6 +76,9 @@ export const textFields = [
|
|
|
66
76
|
"ticketStatus",
|
|
67
77
|
"issueUpdate",
|
|
68
78
|
"result",
|
|
79
|
+
"actor",
|
|
80
|
+
"waitName",
|
|
81
|
+
"commandOutput",
|
|
69
82
|
];
|
|
70
83
|
export const terminal = [
|
|
71
84
|
"completed",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Database } from "solid-objects";
|
|
2
|
-
import type {
|
|
2
|
+
import type { ExecutionManifest } from "../../workflow-admission.ts";
|
|
3
|
+
import type { AuthorityCommand, AuthorityEvent, RunState } from "../../authority/transitions.ts";
|
|
3
4
|
import { type SqlConnection } from "../../storage/domain-rows.ts";
|
|
4
5
|
import { type RunLinks, type RunOrigins } from "../../authority/handoff-chain.ts";
|
|
5
6
|
export interface CommandRecord {
|
|
@@ -31,13 +32,19 @@ export interface CompletionCursor {
|
|
|
31
32
|
readonly atOrBefore: number;
|
|
32
33
|
readonly terminal?: boolean;
|
|
33
34
|
}
|
|
35
|
+
export interface RunRecord extends RunState {
|
|
36
|
+
readonly admissionCommandId: string | null;
|
|
37
|
+
readonly sequence: number;
|
|
38
|
+
}
|
|
34
39
|
export interface AuthorityQueries {
|
|
40
|
+
readonly run: (runId: string) => Promise<RunRecord | undefined>;
|
|
41
|
+
readonly manifest: (runId: string) => Promise<ExecutionManifest | undefined>;
|
|
35
42
|
readonly document: (digest: string) => Promise<string | undefined>;
|
|
36
43
|
readonly receipt: (commandId: string) => Promise<CommandRecord | undefined>;
|
|
37
44
|
readonly eventsAfter: (cursor: EventCursor) => Promise<EventPage>;
|
|
38
45
|
readonly latestCompletion: (cursor: CompletionCursor) => Promise<PublishedEvent | undefined>;
|
|
39
46
|
readonly sequences: () => Promise<Sequences>;
|
|
40
|
-
readonly workflowIds: () => Promise<Readonly<Record<string, string>>>;
|
|
47
|
+
readonly workflowIds: (runIds?: readonly string[]) => Promise<Readonly<Record<string, string>>>;
|
|
41
48
|
readonly runOrigins: () => Promise<RunOrigins>;
|
|
42
49
|
readonly runLinks: () => Promise<Readonly<Record<string, RunLinks>>>;
|
|
43
50
|
}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
|
+
import { readExecutionManifest } from "../../execution-pin.js";
|
|
1
2
|
import { parseCommand } from "../../authority/commands.js";
|
|
2
3
|
import { documentBody } from "../../storage/decision-rows.js";
|
|
3
|
-
import { integer, optionalText, latestSequence, text, } from "../../storage/domain-rows.js";
|
|
4
|
-
import { storedEvents } from "../authority-restore.js";
|
|
4
|
+
import { integer, optionalText, latestSequence, runRow, text, } from "../../storage/domain-rows.js";
|
|
5
|
+
import { storedEvents, storedRun } from "../authority-restore.js";
|
|
5
6
|
import { documentDigest } from "../decision-restore.js";
|
|
6
7
|
import { runLinks, } from "../../authority/handoff-chain.js";
|
|
8
|
+
async function run(connection, runId) {
|
|
9
|
+
const row = await connection.get("SELECT r.run_id, r.status, r.revision, r.workflow, r.paused_from, r.gates, r.sequence, c.command_id AS admission_command_id FROM runs r LEFT JOIN events c ON c.run_id = r.run_id AND c.type = 'run.created' WHERE r.run_id = ? ORDER BY c.sequence LIMIT 1", [runId]);
|
|
10
|
+
if (row === undefined)
|
|
11
|
+
return undefined;
|
|
12
|
+
const record = runRow(row);
|
|
13
|
+
return {
|
|
14
|
+
...storedRun(record),
|
|
15
|
+
sequence: record.sequence,
|
|
16
|
+
admissionCommandId: optionalText(row, "admission_command_id"),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
7
19
|
async function runOrigins(connection, cursor) {
|
|
8
20
|
const rows = await connection.all("SELECT run_id, json_extract(payload, '$.parentRunId') AS parent_run_id, coalesce(json_extract(payload, '$.chainId'), run_id) AS chain_id FROM events WHERE type = 'run.created' AND sequence > ? AND sequence <= ? ORDER BY sequence", [cursor.after, cursor.through]);
|
|
9
21
|
return Object.fromEntries(rows.map((row) => [
|
|
@@ -76,8 +88,13 @@ async function sequences(connection) {
|
|
|
76
88
|
times: Object.fromEntries(rows.map((row) => [text(row, "run_id"), text(row, "recorded_at")])),
|
|
77
89
|
};
|
|
78
90
|
}
|
|
79
|
-
async function workflowIds(connection) {
|
|
80
|
-
|
|
91
|
+
async function workflowIds(connection, runIds) {
|
|
92
|
+
if (runIds?.length === 0)
|
|
93
|
+
return {};
|
|
94
|
+
const scoped = runIds === undefined
|
|
95
|
+
? ""
|
|
96
|
+
: ` AND d.run_id IN (${runIds.map(() => "?").join(", ")})`;
|
|
97
|
+
const rows = await connection.all(`SELECT d.run_id, json_extract(s.body, '$.workflowId') AS workflow_id FROM run_details d JOIN documents s ON s.digest = d.submission WHERE json_valid(s.body) AND json_type(s.body, '$.workflowId') = 'text'${scoped}`, runIds);
|
|
81
98
|
return Object.fromEntries(rows.map((row) => [text(row, "run_id"), text(row, "workflow_id")]));
|
|
82
99
|
}
|
|
83
100
|
function cachedOrigins(read) {
|
|
@@ -122,12 +139,19 @@ export function authorityQueries(read) {
|
|
|
122
139
|
return links;
|
|
123
140
|
};
|
|
124
141
|
return {
|
|
142
|
+
run: (runId) => read((connection) => run(connection, runId)),
|
|
143
|
+
manifest: (runId) => read(async (connection) => {
|
|
144
|
+
const row = await connection.get("SELECT d.manifest FROM runs r JOIN definitions d ON d.pin = r.workflow WHERE r.run_id = ?", [runId]);
|
|
145
|
+
return row === undefined
|
|
146
|
+
? undefined
|
|
147
|
+
: readExecutionManifest(JSON.parse(text(row, "manifest")));
|
|
148
|
+
}),
|
|
125
149
|
document: (digest) => read((connection) => documentBody(connection, digest)),
|
|
126
150
|
receipt: (commandId) => read((connection) => receipt(connection, commandId)),
|
|
127
151
|
eventsAfter: (cursor) => read((connection) => eventsAfter(connection, cursor)),
|
|
128
152
|
latestCompletion: (cursor) => read((connection) => latestCompletion(connection, cursor)),
|
|
129
153
|
sequences: () => read(sequences),
|
|
130
|
-
workflowIds: () => read(workflowIds),
|
|
154
|
+
workflowIds: (runIds) => read((connection) => workflowIds(connection, runIds)),
|
|
131
155
|
runOrigins: origins,
|
|
132
156
|
runLinks: currentLinks,
|
|
133
157
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { integer, text } from "../../storage/domain-rows.js";
|
|
2
2
|
import { intentKind } from "../authority-restore.js";
|
|
3
|
+
import { commandLimits } from "../../command-settings.js";
|
|
3
4
|
export const unserializable = {
|
|
4
5
|
kind: "rejected",
|
|
5
6
|
reason: "invalid-command",
|
|
@@ -16,7 +17,16 @@ export const tooLarge = {
|
|
|
16
17
|
detail: `A request has at most ${String(maximumRequestBytes)} bytes.`,
|
|
17
18
|
};
|
|
18
19
|
export function oversized(request) {
|
|
19
|
-
|
|
20
|
+
const command = request["command"];
|
|
21
|
+
const report = typeof command === "object" &&
|
|
22
|
+
command !== null &&
|
|
23
|
+
!Array.isArray(command) &&
|
|
24
|
+
command["kind"] === "report-effect" &&
|
|
25
|
+
command["worker"] === "command";
|
|
26
|
+
const limit = report
|
|
27
|
+
? maximumRequestBytes + commandLimits.stdoutBytes * 12
|
|
28
|
+
: maximumRequestBytes;
|
|
29
|
+
return Buffer.byteLength(JSON.stringify(request)) > limit;
|
|
20
30
|
}
|
|
21
31
|
export function failed(error) {
|
|
22
32
|
const name = String(Reflect.get(Object(error), "name"));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { eligibleIntents, } from "../../authority/reducer.js";
|
|
2
|
-
import { loadProjections, } from "../../storage/decision-snapshots.js";
|
|
2
|
+
import { loadOperationSnapshot, loadProjections, } from "../../storage/decision-snapshots.js";
|
|
3
3
|
import { loadEvents } from "../../storage/domain-rows.js";
|
|
4
4
|
import { pinnedResumption } from "../authority-admission.js";
|
|
5
5
|
import { currentState, intentKind, storedDefinitions, storedEvents, } from "../authority-restore.js";
|
|
@@ -40,7 +40,7 @@ export function authoritySession(parts) {
|
|
|
40
40
|
return storedEvents(await parts.reader.connection(loadEvents));
|
|
41
41
|
},
|
|
42
42
|
eligibleIntents: async () => eligible(await projected(session)),
|
|
43
|
-
operations: async () => operationRecords(await
|
|
43
|
+
operations: async () => operationRecords(await read(loadOperationSnapshot)),
|
|
44
44
|
resumePinned: async (runId, manifest) => {
|
|
45
45
|
const snapshot = await projected(session);
|
|
46
46
|
return pinnedResumption(currentState(snapshot), {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { recoveryBound } from "../../authority/commands.js";
|
|
2
2
|
import { lineLogger } from "./authority-logger.js";
|
|
3
|
+
import { commandLimits } from "../../command-settings.js";
|
|
3
4
|
export const authorityTiming = {
|
|
4
5
|
leaseMilliseconds: 2_000,
|
|
5
6
|
renewalMilliseconds: 500,
|
|
@@ -50,6 +51,9 @@ export function librarySettings(timing, log) {
|
|
|
50
51
|
return {
|
|
51
52
|
tableNamePrefix: "solid_",
|
|
52
53
|
maxAttempts: 1,
|
|
54
|
+
maxActivationDurationMilliseconds: 50,
|
|
55
|
+
maxPayloadBytes: 900_000 + commandLimits.stdoutBytes * 12,
|
|
56
|
+
maxResultBytes: 900_000 + commandLimits.stdoutBytes * 12,
|
|
53
57
|
logger: lineLogger(log ?? standardError),
|
|
54
58
|
leaseDurationMilliseconds: timing.leaseMilliseconds,
|
|
55
59
|
leaseRenewalIntervalMilliseconds: timing.renewalMilliseconds,
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { upgradeCommandWaits, upgradeCommandWaitChecks } from "../command-wait-restore.ts";
|
|
2
|
+
import { loadDecided, loadEffected, loadWaiting, loadCurrent } from "../../storage/decision-snapshots.ts";
|
|
2
3
|
import { loadSnapshot } from "../../storage/domain-rows.ts";
|
|
3
4
|
import { upgradeDecisions } from "../decision-upgrade.ts";
|
|
4
|
-
import { upgradeEffects } from "../effect-upgrade.ts";
|
|
5
|
+
import { upgradeEffects, upgradeEventIndexes, upgradeSpendingIndexes } from "../effect-upgrade.ts";
|
|
5
6
|
declare const upgrades: readonly [{
|
|
6
7
|
readonly from: "adopted";
|
|
7
8
|
readonly load: typeof loadSnapshot;
|
|
@@ -10,6 +11,22 @@ declare const upgrades: readonly [{
|
|
|
10
11
|
readonly from: "decided";
|
|
11
12
|
readonly load: typeof loadDecided;
|
|
12
13
|
readonly apply: typeof upgradeEffects;
|
|
14
|
+
}, {
|
|
15
|
+
readonly from: "effected";
|
|
16
|
+
readonly load: typeof loadEffected;
|
|
17
|
+
readonly apply: typeof upgradeCommandWaits;
|
|
18
|
+
}, {
|
|
19
|
+
readonly from: "waiting";
|
|
20
|
+
readonly load: typeof loadWaiting;
|
|
21
|
+
readonly apply: typeof upgradeCommandWaitChecks;
|
|
22
|
+
}, {
|
|
23
|
+
readonly from: "checked";
|
|
24
|
+
readonly load: typeof loadCurrent;
|
|
25
|
+
readonly apply: typeof upgradeSpendingIndexes;
|
|
26
|
+
}, {
|
|
27
|
+
readonly from: "indexed";
|
|
28
|
+
readonly load: typeof loadCurrent;
|
|
29
|
+
readonly apply: typeof upgradeEventIndexes;
|
|
13
30
|
}];
|
|
14
31
|
export type UpgradeStep = (typeof upgrades)[number];
|
|
15
32
|
export declare function upgradeSteps(kind: string): readonly UpgradeStep[];
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { upgradeCommandWaits, upgradeCommandWaitChecks, } from "../command-wait-restore.js";
|
|
2
|
+
import { loadDecided, loadEffected, loadWaiting, loadCurrent, } from "../../storage/decision-snapshots.js";
|
|
2
3
|
import { loadSnapshot } from "../../storage/domain-rows.js";
|
|
3
4
|
import { upgradeDecisions } from "../decision-upgrade.js";
|
|
4
|
-
import { upgradeEffects } from "../effect-upgrade.js";
|
|
5
|
+
import { upgradeEffects, upgradeEventIndexes, upgradeSpendingIndexes, } from "../effect-upgrade.js";
|
|
5
6
|
const upgrades = [
|
|
6
7
|
{ from: "adopted", load: loadSnapshot, apply: upgradeDecisions },
|
|
7
8
|
{ from: "decided", load: loadDecided, apply: upgradeEffects },
|
|
9
|
+
{ from: "effected", load: loadEffected, apply: upgradeCommandWaits },
|
|
10
|
+
{ from: "waiting", load: loadWaiting, apply: upgradeCommandWaitChecks },
|
|
11
|
+
{ from: "checked", load: loadCurrent, apply: upgradeSpendingIndexes },
|
|
12
|
+
{ from: "indexed", load: loadCurrent, apply: upgradeEventIndexes },
|
|
8
13
|
];
|
|
9
14
|
export function upgradeSteps(kind) {
|
|
10
15
|
const first = upgrades.findIndex((step) => step.from === kind);
|
|
@@ -18,6 +18,7 @@ export interface DeliveryIntent extends EffectIntent, Partial<DeliveryDecision>,
|
|
|
18
18
|
readonly workflow: string;
|
|
19
19
|
readonly inputDigest: string;
|
|
20
20
|
readonly purpose: Purpose;
|
|
21
|
+
readonly commandDeadline?: string;
|
|
21
22
|
}
|
|
22
23
|
export type ProtectedIntent = DeliveryIntent & EffectArguments;
|
|
23
24
|
export type Undigested = Omit<DeliveryIntent, "inputDigest" | "purpose">;
|
|
@@ -54,7 +55,7 @@ export interface Delivery {
|
|
|
54
55
|
readonly retry?: Delivery["reconcile"];
|
|
55
56
|
readonly stop?: (intent: DeliveryIntent, signal: AbortSignal) => Promise<AdapterOutcome>;
|
|
56
57
|
}
|
|
57
|
-
export type AvailableManifest = (pinned: ExecutionManifest) => ExecutionManifest | undefined
|
|
58
|
+
export type AvailableManifest = (pinned: ExecutionManifest) => ExecutionManifest | undefined | Promise<ExecutionManifest | undefined>;
|
|
58
59
|
export declare function intentDigest(intent: Undigested): string;
|
|
59
60
|
export declare function deliveryIntent(intent: Undigested): DeliveryIntent;
|
|
60
61
|
export declare function protectedIntent(state: AuthorityState, attempt: {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { commandWaitDeadline } from "../command-wait-restore.js";
|
|
1
2
|
import { createHash } from "node:crypto";
|
|
2
|
-
import {
|
|
3
|
+
import { delivers, isSettled } from "../../authority/gates.js";
|
|
3
4
|
import { eligibleIntents, } from "../../authority/reducer.js";
|
|
4
|
-
import {
|
|
5
|
+
import { gateDelivery } from "../../authority/reduction.js";
|
|
5
6
|
export function intentDigest(intent) {
|
|
6
7
|
const base = [intent.kind, intent.runId, intent.operationId, intent.workflow];
|
|
7
8
|
const bound = intent.gateId === undefined
|
|
@@ -26,6 +27,7 @@ export function protectedIntent(state, attempt) {
|
|
|
26
27
|
.filter((lease) => lease.resourceKey === operation.leaseKey)
|
|
27
28
|
.map((lease) => ({
|
|
28
29
|
...intent,
|
|
30
|
+
...commandWaitDeadline(state.commandWaits ?? {}, operation.operationId),
|
|
29
31
|
workflow,
|
|
30
32
|
purpose,
|
|
31
33
|
inputDigest: operation.inputDigest,
|
|
@@ -37,7 +39,7 @@ export function protectedIntent(state, attempt) {
|
|
|
37
39
|
})));
|
|
38
40
|
}
|
|
39
41
|
export function gateDecision(gate) {
|
|
40
|
-
if (gate === undefined || gate.kind === "untyped" || !
|
|
42
|
+
if (gate === undefined || gate.kind === "untyped" || !delivers(gate))
|
|
41
43
|
return null;
|
|
42
44
|
return {
|
|
43
45
|
gateId: gate.gateId,
|
|
@@ -51,7 +53,7 @@ function workflowOf(state, runId) {
|
|
|
51
53
|
function decisionOf(state, intent) {
|
|
52
54
|
return gateDecision(Object.values(state.gates).find((gate) => gate.runId === intent.runId &&
|
|
53
55
|
isSettled(gate) &&
|
|
54
|
-
|
|
56
|
+
gateDelivery(gate).operationId === intent.operationId));
|
|
55
57
|
}
|
|
56
58
|
export function observingIntent(state, attempt) {
|
|
57
59
|
const { intent, purpose } = attempt;
|
|
@@ -16,4 +16,4 @@ export interface Attempt {
|
|
|
16
16
|
readonly effectId: string;
|
|
17
17
|
}
|
|
18
18
|
export declare function deliverEffect(parts: EffectDelivery, attempt: Attempt): Promise<JsonObject>;
|
|
19
|
-
export declare function protectedArguments(value: JsonObject): EffectArguments
|
|
19
|
+
export declare function protectedArguments(value: JsonObject): EffectArguments & Pick<ProtectedIntent, "commandDeadline">;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { dispatchCommandWait, readCommandWaitDeadline, } from "../command-wait-restore.js";
|
|
1
2
|
import { dispatchDecision, } from "../../authority/dispatch-decision.js";
|
|
2
3
|
import { integer, optionalInteger, optionalText, text, } from "../../storage/domain-rows.js";
|
|
3
4
|
import { budgetRow } from "../../storage/effect-rows.js";
|
|
4
5
|
import { effectInputDigest, storedBudget } from "../effect-restore.js";
|
|
5
6
|
import { settlement } from "./adapter-outcomes.js";
|
|
6
7
|
import { pinned } from "./pin-check.js";
|
|
8
|
+
import { commandLimits } from "../../command-settings.js";
|
|
7
9
|
const absent = {
|
|
8
10
|
attempt: undefined,
|
|
9
11
|
released: false,
|
|
@@ -15,11 +17,16 @@ const absent = {
|
|
|
15
17
|
budget: undefined,
|
|
16
18
|
};
|
|
17
19
|
async function dispatchRead(connection, attempt) {
|
|
18
|
-
const row = await connection.get("SELECT d.outcome, d.input_digest, a.lease_generation, o.released_sequence, r.status, r.workflow, p.status AS operation_status, p.capability, p.units, l.operation_id AS lease_owner, l.generation, l.expires_at, l.state AS lease_state, b.run_id, b.effect_limit, b.spent, b.capabilities, b.exhausted_sequence FROM deliveries d JOIN outbox o ON o.operation_id = d.operation_id JOIN runs r ON r.run_id = o.run_id JOIN dispatch_attempts a ON a.effect_id = d.effect_id JOIN operations p ON p.operation_id = d.operation_id JOIN leases l ON l.resource_key = p.lease_key JOIN run_budgets b ON b.run_id = o.run_id WHERE d.effect_id = ? AND d.operation_id = ?", [attempt.effectId, attempt.intent.operationId]);
|
|
20
|
+
const row = await connection.get("SELECT d.outcome, d.input_digest, a.lease_generation, o.released_sequence, r.status, r.workflow, p.status AS operation_status, p.capability, p.units, p.method, p.target, p.payload, l.operation_id AS lease_owner, l.generation, l.expires_at, l.state AS lease_state, b.run_id, b.effect_limit, b.spent, b.capabilities, b.exhausted_sequence FROM deliveries d JOIN outbox o ON o.operation_id = d.operation_id JOIN runs r ON r.run_id = o.run_id JOIN dispatch_attempts a ON a.effect_id = d.effect_id JOIN operations p ON p.operation_id = d.operation_id JOIN leases l ON l.resource_key = p.lease_key JOIN run_budgets b ON b.run_id = o.run_id WHERE d.effect_id = ? AND d.operation_id = ?", [attempt.effectId, attempt.intent.operationId]);
|
|
19
21
|
if (row === undefined)
|
|
20
22
|
return absent;
|
|
21
23
|
const workflow = text(row, "workflow");
|
|
22
24
|
return {
|
|
25
|
+
...(await dispatchCommandWait(connection, {
|
|
26
|
+
runId: attempt.intent.runId,
|
|
27
|
+
workflow,
|
|
28
|
+
operationId: attempt.intent.operationId,
|
|
29
|
+
})),
|
|
23
30
|
attempt: {
|
|
24
31
|
outcome: optionalText(row, "outcome"),
|
|
25
32
|
inputDigest: text(row, "input_digest"),
|
|
@@ -36,6 +43,9 @@ async function dispatchRead(connection, attempt) {
|
|
|
36
43
|
status: text(row, "operation_status"),
|
|
37
44
|
capability: text(row, "capability"),
|
|
38
45
|
units: integer(row, "units"),
|
|
46
|
+
method: text(row, "method"),
|
|
47
|
+
target: text(row, "target"),
|
|
48
|
+
payload: text(row, "payload"),
|
|
39
49
|
},
|
|
40
50
|
budget: storedBudget(budgetRow(row)),
|
|
41
51
|
lease: {
|
|
@@ -51,7 +61,10 @@ async function called(parts, call) {
|
|
|
51
61
|
const adapterCall = parts.delivery[name]?.bind(parts.delivery);
|
|
52
62
|
if (adapterCall === undefined)
|
|
53
63
|
return { kind: "unknown", reason: "stop-not-supported" };
|
|
54
|
-
|
|
64
|
+
const deadline = await parts.reader.connection((connection) => readCommandWaitDeadline(connection, intent));
|
|
65
|
+
return settlement(await parts.calls.call(intent.operationId, (signal) => adapterCall({ ...intent, ...deadline }, signal)), intent.capability === "command"
|
|
66
|
+
? commandLimits.resultBytes
|
|
67
|
+
: parts.effects.resultBytes);
|
|
55
68
|
}
|
|
56
69
|
const confirmations = ["stopped", "completed", "failed"];
|
|
57
70
|
async function stopRequested(parts, intent) {
|
|
@@ -123,5 +136,8 @@ export function protectedArguments(value) {
|
|
|
123
136
|
method: text(value, "method"),
|
|
124
137
|
target: text(value, "target"),
|
|
125
138
|
payload: text(value, "payload"),
|
|
139
|
+
...(typeof value["commandDeadline"] === "string"
|
|
140
|
+
? { commandDeadline: value["commandDeadline"] }
|
|
141
|
+
: {}),
|
|
126
142
|
};
|
|
127
143
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { operationPhase } from "../../operation-identity.js";
|
|
2
|
+
import { endedCommandWaitCheck } from "../../authority/command-waits.js";
|
|
1
3
|
import { isInstant } from "../../authority/instants.js";
|
|
2
4
|
import { promotions } from "../../authority/leases.js";
|
|
3
5
|
import { execute } from "../../authority/reducer.js";
|
|
@@ -45,7 +47,9 @@ function closure(state, operation) {
|
|
|
45
47
|
return ["run-ended"];
|
|
46
48
|
const exhausted = (state.effects.budgets[operation.runId]?.exhaustedSequence ?? null) !==
|
|
47
49
|
null;
|
|
48
|
-
return exhausted
|
|
50
|
+
return exhausted && operationPhase(operation.operationId) !== "command-wait"
|
|
51
|
+
? ["budget-exhausted"]
|
|
52
|
+
: [];
|
|
49
53
|
}
|
|
50
54
|
function unblocked(state, followUp) {
|
|
51
55
|
const steps = [];
|
|
@@ -95,6 +99,9 @@ const outcomes = {
|
|
|
95
99
|
}),
|
|
96
100
|
completed: (attempt) => stated({
|
|
97
101
|
outcome: "completed",
|
|
102
|
+
...(attempt.worker === "command"
|
|
103
|
+
? { commandOutput: attempt.result }
|
|
104
|
+
: {}),
|
|
98
105
|
result: attempt.result === null ? null : documentDigest(attempt.result),
|
|
99
106
|
reason: attempt.reason,
|
|
100
107
|
...identified(attempt),
|
|
@@ -155,7 +162,9 @@ function acceptedNow(reconciling) {
|
|
|
155
162
|
export function reconciliations(state, reconciling) {
|
|
156
163
|
const accepted = acceptedNow(reconciling);
|
|
157
164
|
const rejected = rejectedReports(reconciling.results);
|
|
158
|
-
const due = (operation) => state.runs[operation.runId]?.status !== "cancelled" &&
|
|
165
|
+
const due = (operation) => state.runs[operation.runId]?.status !== "cancelled" &&
|
|
166
|
+
!endedCommandWaitCheck(state.commandWaits ?? {}, operation.operationId) &&
|
|
167
|
+
live(operation);
|
|
159
168
|
const live = (operation) => (operation.status === "recovering" &&
|
|
160
169
|
!accepted.has(operation.operationId)) ||
|
|
161
170
|
(operation.status === "blocked" && rejected.has(operation.operationId));
|
|
@@ -8,6 +8,10 @@ export interface OperationView extends OperationRow {
|
|
|
8
8
|
}
|
|
9
9
|
export type StoredDisposition = Omit<Evidence, "sequence">;
|
|
10
10
|
export interface EffectQueries {
|
|
11
|
+
readonly workerTurns: (window: {
|
|
12
|
+
readonly after: string;
|
|
13
|
+
readonly through: string;
|
|
14
|
+
}) => Promise<readonly OperationView[]>;
|
|
11
15
|
readonly operation: (operationId: string) => Promise<OperationView | undefined>;
|
|
12
16
|
readonly operations: (runId: string) => Promise<readonly OperationView[]>;
|
|
13
17
|
readonly evidence: (runId: string) => Promise<readonly number[]>;
|
|
@@ -16,6 +20,7 @@ export interface EffectQueries {
|
|
|
16
20
|
readonly dueLeases: (instant: string) => Promise<readonly DueLease[]>;
|
|
17
21
|
readonly stops: (runId: string) => Promise<readonly string[]>;
|
|
18
22
|
readonly closure: (runId: string) => Promise<RunClosure>;
|
|
23
|
+
readonly settledAt: (runId: string) => Promise<number | null>;
|
|
19
24
|
}
|
|
20
25
|
export interface DueLease {
|
|
21
26
|
readonly runId: string;
|
|
@@ -3,6 +3,12 @@ import { integer, optionalInteger, optionalText, text, } from "../../storage/dom
|
|
|
3
3
|
import { budgetColumns, budgetRow, evidenceColumns, evidenceRow, operationColumns, operationRow, } from "../../storage/effect-rows.js";
|
|
4
4
|
import { storedBudget } from "../effect-restore.js";
|
|
5
5
|
import { stopping } from "./stop-turn.js";
|
|
6
|
+
async function settledAt(connection, runId) {
|
|
7
|
+
const rows = await connection.all("SELECT recorded_at FROM events WHERE sequence IN (SELECT settled_sequence FROM operations WHERE run_id = ? UNION ALL SELECT min(e.sequence) FROM events e JOIN stopped_operations s ON s.run_id = e.run_id AND s.operation_id = json_extract(e.payload, '$.operationId') WHERE e.run_id = ? AND (EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = s.operation_id AND d.outcome = 'sent') OR (SELECT d.outcome FROM deliveries d WHERE d.operation_id = s.operation_id ORDER BY d.staged_sequence DESC, d.rowid DESC LIMIT 1) NOT IN ('withheld', 'blocked', 'absent')) AND ((e.type = 'run.observed' AND json_extract(e.payload, '$.condition') = 'stopped') OR (e.type = 'operation.reconciled' AND json_extract(e.payload, '$.outcome') = 'stopped')) GROUP BY s.operation_id)", [runId, runId]);
|
|
8
|
+
if (rows.length === 0)
|
|
9
|
+
return null;
|
|
10
|
+
return rows.reduce((latest, row) => Math.max(latest, Date.parse(text(row, "recorded_at"))), -Infinity);
|
|
11
|
+
}
|
|
6
12
|
async function storedClosure(connection, scope) {
|
|
7
13
|
const { subjects, cancelledSequence } = await stopping(connection, scope.runId);
|
|
8
14
|
return runClosure(subjects, {
|
|
@@ -28,7 +34,9 @@ const viewColumns = operationColumns
|
|
|
28
34
|
.map((name) => `o.${name}`)
|
|
29
35
|
.join(", ");
|
|
30
36
|
const waitCause = "CASE WHEN o.status != 'waiting' THEN NULL WHEN r.status != 'running' THEN 'run-not-running' WHEN EXISTS (SELECT 1 FROM leases h WHERE h.resource_key = o.lease_key AND h.state != 'released') THEN 'resource' ELSE 'ready' END";
|
|
31
|
-
const
|
|
37
|
+
const viewSelection = `SELECT ${viewColumns}, l.generation AS lease_generation, ${waitCause} AS wait_cause`;
|
|
38
|
+
const viewJoins = "JOIN runs r ON r.run_id = o.run_id LEFT JOIN leases l ON l.resource_key = o.lease_key AND l.operation_id = o.operation_id AND l.state != 'released'";
|
|
39
|
+
const viewed = `${viewSelection} FROM operations o ${viewJoins}`;
|
|
32
40
|
function operationView(row) {
|
|
33
41
|
return {
|
|
34
42
|
...operationRow(row),
|
|
@@ -46,6 +54,11 @@ async function operations(connection, runId) {
|
|
|
46
54
|
const rows = await connection.all(`${viewed} WHERE o.run_id = ? ORDER BY o.requested_sequence`, [runId]);
|
|
47
55
|
return rows.map(operationView);
|
|
48
56
|
}
|
|
57
|
+
async function workerTurns(connection, window) {
|
|
58
|
+
const settled = await connection.all(`${viewSelection} FROM events e CROSS JOIN operations o ${viewJoins} WHERE o.settled_sequence = e.sequence AND o.capability = 'claude' AND julianday(e.recorded_at) > julianday(?) AND julianday(e.recorded_at) <= julianday(?)`, [window.after, window.through]);
|
|
59
|
+
const open = await connection.all(`${viewSelection} FROM operations o INDEXED BY operations_worker_open ${viewJoins} WHERE o.capability = 'claude' AND o.settled_sequence IS NULL AND o.status NOT IN ('refused', 'completed', 'failed', 'stopped', 'cancelled')`);
|
|
60
|
+
return [...settled, ...open].map(operationView);
|
|
61
|
+
}
|
|
49
62
|
async function evidence(connection, runId) {
|
|
50
63
|
const rows = await connection.all("SELECT e.sequence FROM effect_evidence e JOIN events v ON v.sequence = e.sequence WHERE e.run_id = ? AND (e.disposition IN ('rejected', 'denied', 'refused') OR (v.type = 'operation.reconciled' AND json_extract(v.payload, '$.outcome') = 'unknown')) ORDER BY e.sequence", [runId]);
|
|
51
64
|
return rows.map((row) => integer(row, "sequence"));
|
|
@@ -68,8 +81,10 @@ async function budget(connection, runId) {
|
|
|
68
81
|
}
|
|
69
82
|
export function effectQueries(read, settings) {
|
|
70
83
|
return {
|
|
84
|
+
workerTurns: (window) => read((connection) => workerTurns(connection, window)),
|
|
71
85
|
stops: (runId) => read((connection) => stops(connection, runId)),
|
|
72
86
|
closure: (runId) => read((connection) => storedClosure(connection, { runId, stopLimit: settings.stopLimit })),
|
|
87
|
+
settledAt: (runId) => read((connection) => settledAt(connection, runId)),
|
|
73
88
|
budget: (runId) => read((connection) => budget(connection, runId)),
|
|
74
89
|
dueLeases: (instant) => read((connection) => dueLeases(connection, instant)),
|
|
75
90
|
operation: (operationId) => read((connection) => operation(connection, operationId)),
|