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,17 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { commandWaitDisplay } from "./command-waits.js";
|
|
2
|
+
import { scheduleMetadata, scheduledMetadata, metadataOf, outcomeOf, ticketMetadataPage, workflowMetadata, } from "./run-metadata.js";
|
|
2
3
|
import { linksOf } from "../authority/handoff-chain.js";
|
|
3
4
|
import { runView, unresolvedEffects, } from "../authority/status.js";
|
|
4
5
|
import { record } from "../protocol.js";
|
|
5
6
|
import { committed, failed, invalidRequest, isIdentifier, publicReceipt, rejection, result, wholeNumber, } from "./replies.js";
|
|
6
7
|
import { usageTotals } from "./worker-totals.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
8
|
+
import { commandFields } from "./command-effects.js";
|
|
9
|
+
import { decidedOf, feedbackOf } from "./decision-handler.js";
|
|
10
|
+
import { queueOverview } from "./active-tickets.js";
|
|
9
11
|
import { queueRunStatuses } from "./queue-runs.js";
|
|
10
12
|
async function snapshot(context) {
|
|
11
13
|
const { authority } = context;
|
|
12
14
|
const state = await authority.state();
|
|
13
15
|
const sequences = await authority.queries.sequences();
|
|
14
16
|
return {
|
|
17
|
+
now: context.clock(),
|
|
15
18
|
links: await authority.queries.runLinks(),
|
|
16
19
|
state,
|
|
17
20
|
operations: await authority.operations(),
|
|
@@ -44,6 +47,7 @@ async function effectInput(context, runId) {
|
|
|
44
47
|
const budget = await effects.budget(runId);
|
|
45
48
|
const stored = await effects.operations(runId);
|
|
46
49
|
return {
|
|
50
|
+
commandOperations: stored.filter((operation) => operation.capability === "command"),
|
|
47
51
|
budget: budget ? { limit: budget.limit, spent: budget.spent } : null,
|
|
48
52
|
effects: stored.map((operation) => ({
|
|
49
53
|
operationId: operation.operationId,
|
|
@@ -62,8 +66,16 @@ async function viewOf(context, scope) {
|
|
|
62
66
|
if (run === undefined)
|
|
63
67
|
return undefined;
|
|
64
68
|
const details = state.details[run.runId];
|
|
69
|
+
const workflowId = scope.snapshot.workflowIds[run.runId] ?? run.workflow;
|
|
70
|
+
const effects = await effectInput(context, run.runId);
|
|
65
71
|
const input = {
|
|
66
|
-
...
|
|
72
|
+
...effects,
|
|
73
|
+
commandWaits: await commandWaitDisplay({
|
|
74
|
+
authority: context.authority,
|
|
75
|
+
runId: run.runId,
|
|
76
|
+
waits: state.commandWaits,
|
|
77
|
+
now: scope.snapshot.now,
|
|
78
|
+
}),
|
|
67
79
|
closure: run.status === "cancelled"
|
|
68
80
|
? await context.authority.effects.closure(run.runId)
|
|
69
81
|
: null,
|
|
@@ -81,9 +93,14 @@ async function viewOf(context, scope) {
|
|
|
81
93
|
};
|
|
82
94
|
return {
|
|
83
95
|
...runView(input),
|
|
96
|
+
...(await scheduledMetadata(context, {
|
|
97
|
+
runId: run.runId,
|
|
98
|
+
workflowId,
|
|
99
|
+
})),
|
|
100
|
+
commandOperations: effects.commandOperations,
|
|
84
101
|
...linksOf({ runId: run.runId, ...scope.snapshot.links[run.runId] }),
|
|
85
102
|
input: await submittedInput(context, details?.submission),
|
|
86
|
-
workflowId
|
|
103
|
+
workflowId,
|
|
87
104
|
latestAt: times[run.runId] ?? null,
|
|
88
105
|
unresolvedEffects: unresolvedEffects(input),
|
|
89
106
|
feedback: await feedbackOf(context, { state, runId: run.runId }),
|
|
@@ -92,15 +109,18 @@ async function viewOf(context, scope) {
|
|
|
92
109
|
function summary(view) {
|
|
93
110
|
return {
|
|
94
111
|
runId: view.runId,
|
|
112
|
+
...(view.scheduled === undefined ? {} : { scheduled: view.scheduled }),
|
|
95
113
|
...linksOf(view),
|
|
96
114
|
input: view.input,
|
|
97
115
|
workflowId: view.workflowId,
|
|
98
116
|
state: view.state,
|
|
99
117
|
condition: view.condition,
|
|
118
|
+
awaitedRunId: view.awaitedRunId,
|
|
100
119
|
revision: view.revision,
|
|
101
120
|
latestSequence: view.latestSequence,
|
|
102
121
|
latestAt: view.latestAt,
|
|
103
122
|
pendingDecisions: view.pendingDecisions,
|
|
123
|
+
commandWaits: view.commandWaits,
|
|
104
124
|
};
|
|
105
125
|
}
|
|
106
126
|
function full(view) {
|
|
@@ -122,57 +142,6 @@ function full(view) {
|
|
|
122
142
|
feedback: view.feedback,
|
|
123
143
|
};
|
|
124
144
|
}
|
|
125
|
-
async function outcomeOf(context, view) {
|
|
126
|
-
if (view.state !== "completed")
|
|
127
|
-
return null;
|
|
128
|
-
const event = await context.authority.queries.latestCompletion({
|
|
129
|
-
runId: view.runId,
|
|
130
|
-
atOrBefore: view.latestSequence,
|
|
131
|
-
});
|
|
132
|
-
const payload = event?.payload ?? {};
|
|
133
|
-
const kind = payload["outcome"];
|
|
134
|
-
if (kind === undefined)
|
|
135
|
-
return null;
|
|
136
|
-
const { ticketStatus, promotionId, outcomeReason, issueUpdate } = payload;
|
|
137
|
-
return {
|
|
138
|
-
kind,
|
|
139
|
-
reason: outcomeReason ?? null,
|
|
140
|
-
...(promotionId === undefined ? {} : { promotionId }),
|
|
141
|
-
...(ticketStatus === undefined ? {} : { ticketStatus }),
|
|
142
|
-
...(issueUpdate === "failed" ? { issueUpdate } : {}),
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
function titleOf(input, workflowId) {
|
|
146
|
-
const ticket = input?.["ticket"];
|
|
147
|
-
if (typeof ticket !== "string")
|
|
148
|
-
return null;
|
|
149
|
-
const fallback = `Cloving task ${String(input?.["cycleId"])}`;
|
|
150
|
-
const lines = ticket.split("\n");
|
|
151
|
-
if (workflowId === "develop-prompt") {
|
|
152
|
-
const first = lines.find((line) => /\S/.test(line));
|
|
153
|
-
return first === undefined
|
|
154
|
-
? fallback
|
|
155
|
-
: first.replace(/^# /, "").trim().slice(0, 200);
|
|
156
|
-
}
|
|
157
|
-
const first = lines[0] ?? "";
|
|
158
|
-
return first.startsWith("# ")
|
|
159
|
-
? first.slice(2).trim().slice(0, 200)
|
|
160
|
-
: fallback;
|
|
161
|
-
}
|
|
162
|
-
async function metadataOf(context, source) {
|
|
163
|
-
const document = source.digest
|
|
164
|
-
? await context.authority.queries.document(source.digest)
|
|
165
|
-
: undefined;
|
|
166
|
-
const input = record(JSON.parse(document ?? "null"));
|
|
167
|
-
const ticketId = input?.["ticketId"];
|
|
168
|
-
return {
|
|
169
|
-
ticketId: typeof ticketId === "string" && ticketId !== "" ? ticketId : null,
|
|
170
|
-
title: titleOf(input, source.workflowId),
|
|
171
|
-
...(source.workflowId === "develop-issue"
|
|
172
|
-
? { issueIdentity: issueIdentity(input?.["ticket"]) }
|
|
173
|
-
: {}),
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
145
|
async function submittedInput(context, digest) {
|
|
177
146
|
const document = digest
|
|
178
147
|
? await context.authority.queries.document(digest)
|
|
@@ -191,6 +160,7 @@ async function listed(context, page) {
|
|
|
191
160
|
const runs = views.filter((view) => view !== undefined).map(summary);
|
|
192
161
|
return result("run-list", {
|
|
193
162
|
...(await queueOverview(context)),
|
|
163
|
+
...(await scheduleMetadata(context)),
|
|
194
164
|
workflows: context.registry.workflowIds,
|
|
195
165
|
workflowRefusals: context.workflowRefusals ?? [],
|
|
196
166
|
...(Object.keys(context.registry.workflowStages).length === 0
|
|
@@ -211,12 +181,16 @@ function listParameters(parameters) {
|
|
|
211
181
|
return { after, limit };
|
|
212
182
|
}
|
|
213
183
|
export async function status(context, parameters) {
|
|
184
|
+
if (parameters["metadata"] === "workflows")
|
|
185
|
+
return workflowMetadata(context, parameters["runIds"]);
|
|
214
186
|
if (parameters["runIds"] !== undefined)
|
|
215
187
|
return queueRunStatuses(context, parameters["runIds"]);
|
|
216
188
|
const { runId } = parameters;
|
|
217
189
|
const page = listParameters(parameters);
|
|
218
190
|
if (page === undefined)
|
|
219
191
|
return invalidRequest("The status request is not valid.");
|
|
192
|
+
if (parameters["metadata"] === "tickets")
|
|
193
|
+
return ticketMetadataPage(context, page);
|
|
220
194
|
const current = await snapshot(context);
|
|
221
195
|
if (runId === undefined)
|
|
222
196
|
return listed(context, { snapshot: current, ...page });
|
|
@@ -228,7 +202,12 @@ export async function status(context, parameters) {
|
|
|
228
202
|
return result("run-status", {
|
|
229
203
|
run: {
|
|
230
204
|
...full({ ...view, ...totals }),
|
|
205
|
+
...(await commandFields(context, view.commandOperations)),
|
|
231
206
|
outcome: await outcomeOf(context, view),
|
|
207
|
+
decisions: await decidedOf(context, {
|
|
208
|
+
state: current.state,
|
|
209
|
+
runId: view.runId,
|
|
210
|
+
}),
|
|
232
211
|
...(await metadataOf(context, {
|
|
233
212
|
workflowId: view.workflowId,
|
|
234
213
|
digest: current.state.details[view.runId]?.input,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Fields } from "../protocol.ts";
|
|
2
|
+
import type { RunView } from "../authority/status.ts";
|
|
3
|
+
import { type ServiceContext } from "./replies.ts";
|
|
4
|
+
export declare function workflowMetadata(context: ServiceContext, runIds: unknown): Promise<import("../protocol.ts").Reply>;
|
|
5
|
+
export declare function ticketMetadataPage(context: ServiceContext, page: {
|
|
6
|
+
readonly after: string;
|
|
7
|
+
readonly limit: number;
|
|
8
|
+
}): Promise<import("../protocol.ts").Reply>;
|
|
9
|
+
export declare function outcomeOf(context: ServiceContext, view: Pick<RunView, "state" | "runId" | "latestSequence">): Promise<Fields | null>;
|
|
10
|
+
export declare function metadataOf(context: ServiceContext, source: {
|
|
11
|
+
readonly workflowId: string;
|
|
12
|
+
readonly digest: string | null | undefined;
|
|
13
|
+
}): Promise<Fields>;
|
|
14
|
+
export declare function scheduleMetadata(context: ServiceContext): Promise<Fields>;
|
|
15
|
+
export declare function scheduledMetadata(context: ServiceContext, run: {
|
|
16
|
+
readonly runId: string;
|
|
17
|
+
readonly workflowId: string;
|
|
18
|
+
}): Promise<{
|
|
19
|
+
readonly scheduled?: {
|
|
20
|
+
readonly slot: number;
|
|
21
|
+
};
|
|
22
|
+
}>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { issueIdentity } from "../issue-identity.js";
|
|
2
|
+
import { record } from "../protocol.js";
|
|
3
|
+
import { invalidRequest, isIdentifier, result, } from "./replies.js";
|
|
4
|
+
export async function workflowMetadata(context, runIds) {
|
|
5
|
+
if (!Array.isArray(runIds) ||
|
|
6
|
+
runIds.length === 0 ||
|
|
7
|
+
runIds.length > 500 ||
|
|
8
|
+
!runIds.every(isIdentifier) ||
|
|
9
|
+
new Set(runIds).size !== runIds.length)
|
|
10
|
+
return invalidRequest("Workflow metadata needs one to 500 distinct run IDs.");
|
|
11
|
+
const identities = await context.authority.queries.workflowIds(runIds);
|
|
12
|
+
return result("run-workflow-metadata", {
|
|
13
|
+
runs: runIds.map((runId) => ({
|
|
14
|
+
runId,
|
|
15
|
+
workflowId: identities[runId] ?? null,
|
|
16
|
+
})),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export async function ticketMetadataPage(context, page) {
|
|
20
|
+
const state = await context.authority.state();
|
|
21
|
+
const identifiers = Object.keys(state.runs)
|
|
22
|
+
.sort()
|
|
23
|
+
.filter((runId) => runId > page.after);
|
|
24
|
+
const shown = identifiers.slice(0, page.limit);
|
|
25
|
+
const runs = [];
|
|
26
|
+
for (const runId of shown) {
|
|
27
|
+
const digest = state.details[runId]?.input;
|
|
28
|
+
const document = digest
|
|
29
|
+
? await context.authority.queries.document(digest)
|
|
30
|
+
: "{}";
|
|
31
|
+
const input = record(JSON.parse(document ?? "null"));
|
|
32
|
+
if (input === undefined)
|
|
33
|
+
throw new Error("report-ticket-metadata-unavailable");
|
|
34
|
+
runs.push({ runId, ticketId: ticketIdOf(input) });
|
|
35
|
+
}
|
|
36
|
+
return result("run-ticket-metadata", {
|
|
37
|
+
runs,
|
|
38
|
+
next: identifiers.length > shown.length ? shown.at(-1) : null,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export async function outcomeOf(context, view) {
|
|
42
|
+
if (view.state !== "completed")
|
|
43
|
+
return null;
|
|
44
|
+
const event = await context.authority.queries.latestCompletion({
|
|
45
|
+
runId: view.runId,
|
|
46
|
+
atOrBefore: view.latestSequence,
|
|
47
|
+
});
|
|
48
|
+
const payload = event?.payload ?? {};
|
|
49
|
+
const kind = payload["outcome"];
|
|
50
|
+
if (kind === undefined)
|
|
51
|
+
return null;
|
|
52
|
+
const { ticketStatus, promotionId, outcomeReason, issueUpdate } = payload;
|
|
53
|
+
return {
|
|
54
|
+
kind,
|
|
55
|
+
reason: outcomeReason ?? null,
|
|
56
|
+
...(promotionId === undefined ? {} : { promotionId }),
|
|
57
|
+
...(ticketStatus === undefined ? {} : { ticketStatus }),
|
|
58
|
+
...(issueUpdate === "failed" ? { issueUpdate } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function ticketOf(input) {
|
|
62
|
+
const declared = record(record(input?.["input"])?.["ticket"]);
|
|
63
|
+
const id = declared === undefined ? input?.["ticketId"] : declared["id"];
|
|
64
|
+
const text = declared === undefined ? input?.["ticket"] : declared["text"];
|
|
65
|
+
return {
|
|
66
|
+
id: typeof id === "string" ? id : undefined,
|
|
67
|
+
text: typeof text === "string" ? text : undefined,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function titleOf(input, workflowId) {
|
|
71
|
+
const ticket = ticketOf(input).text;
|
|
72
|
+
if (ticket === undefined)
|
|
73
|
+
return null;
|
|
74
|
+
const fallback = `Cloving task ${String(input?.["cycleId"])}`;
|
|
75
|
+
const lines = ticket.split("\n");
|
|
76
|
+
if (workflowId === "develop-prompt" && !Object.hasOwn(input ?? {}, "input")) {
|
|
77
|
+
const first = lines.find((line) => /\S/.test(line));
|
|
78
|
+
return first === undefined
|
|
79
|
+
? fallback
|
|
80
|
+
: first.replace(/^# /, "").trim().slice(0, 200);
|
|
81
|
+
}
|
|
82
|
+
const first = lines[0] ?? "";
|
|
83
|
+
return first.startsWith("# ")
|
|
84
|
+
? first.slice(2).trim().slice(0, 200)
|
|
85
|
+
: fallback;
|
|
86
|
+
}
|
|
87
|
+
export async function metadataOf(context, source) {
|
|
88
|
+
const document = source.digest
|
|
89
|
+
? await context.authority.queries.document(source.digest)
|
|
90
|
+
: undefined;
|
|
91
|
+
const input = record(JSON.parse(document ?? "null"));
|
|
92
|
+
return {
|
|
93
|
+
ticketId: ticketIdOf(input),
|
|
94
|
+
title: titleOf(input, source.workflowId),
|
|
95
|
+
...(ticketOf(input).text === undefined
|
|
96
|
+
? {}
|
|
97
|
+
: { issueIdentity: issueIdentity(ticketOf(input).text) }),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function ticketIdOf(input) {
|
|
101
|
+
const ticketId = ticketOf(input).id;
|
|
102
|
+
return ticketId === undefined || ticketId === "" ? null : ticketId;
|
|
103
|
+
}
|
|
104
|
+
export async function scheduleMetadata(context) {
|
|
105
|
+
if (context.schedule === undefined)
|
|
106
|
+
return {};
|
|
107
|
+
const reply = await context.schedule({ action: "list" });
|
|
108
|
+
if (reply.kind !== "result" || !Array.isArray(reply.result["schedules"]))
|
|
109
|
+
return { schedules: { status: "unavailable" } };
|
|
110
|
+
const schedules = reply.result["schedules"];
|
|
111
|
+
if (schedules.length === 0)
|
|
112
|
+
return {};
|
|
113
|
+
return {
|
|
114
|
+
schedules: schedules.map((value) => {
|
|
115
|
+
const schedule = record(value) ?? {};
|
|
116
|
+
return Object.fromEntries([
|
|
117
|
+
"workflowId",
|
|
118
|
+
"everySeconds",
|
|
119
|
+
"state",
|
|
120
|
+
"failuresInRow",
|
|
121
|
+
"nextAt",
|
|
122
|
+
"stoppedAt",
|
|
123
|
+
].map((name) => [name, schedule[name]]));
|
|
124
|
+
}),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export async function scheduledMetadata(context, run) {
|
|
128
|
+
const commandId = (await context.authority.queries.run(run.runId))
|
|
129
|
+
?.admissionCommandId;
|
|
130
|
+
const prefix = `schedule:${run.workflowId}:`;
|
|
131
|
+
if (typeof commandId !== "string" || !commandId.startsWith(prefix))
|
|
132
|
+
return {};
|
|
133
|
+
const suffix = commandId.slice(prefix.length);
|
|
134
|
+
const slot = Number(suffix);
|
|
135
|
+
return /^(0|[1-9][0-9]*)$/.test(suffix) && Number.isSafeInteger(slot)
|
|
136
|
+
? { scheduled: { slot } }
|
|
137
|
+
: {};
|
|
138
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
function outcomeOf(event, status) {
|
|
2
|
+
if (event === undefined)
|
|
3
|
+
return null;
|
|
4
|
+
return {
|
|
5
|
+
kind: event.payload["outcome"] ?? status,
|
|
6
|
+
reason: event.payload["outcomeReason"] ?? null,
|
|
7
|
+
promotionId: event.payload["promotionId"] ?? null,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
async function settled(authority, run) {
|
|
11
|
+
if (run.status !== "cancelled")
|
|
12
|
+
return ["completed", "failed"].includes(run.status);
|
|
13
|
+
const closure = await authority.effects.closure(run.runId);
|
|
14
|
+
return (!closure.open &&
|
|
15
|
+
closure.closure === "cancelled" &&
|
|
16
|
+
closure.unresolved.length === 0);
|
|
17
|
+
}
|
|
18
|
+
export async function runWaitTarget(authority, runId) {
|
|
19
|
+
const run = await authority.queries.run(runId);
|
|
20
|
+
const origin = (await authority.queries.runOrigins())[runId];
|
|
21
|
+
if (run === undefined || origin === undefined)
|
|
22
|
+
return undefined;
|
|
23
|
+
const terminal = await settled(authority, run);
|
|
24
|
+
const event = terminal
|
|
25
|
+
? await authority.queries.latestCompletion({
|
|
26
|
+
runId,
|
|
27
|
+
atOrBefore: run.sequence,
|
|
28
|
+
terminal: true,
|
|
29
|
+
})
|
|
30
|
+
: undefined;
|
|
31
|
+
const endedAt = event === undefined ? null : Date.parse(event.recordedAt);
|
|
32
|
+
const stoppedAt = run.status === "cancelled" && terminal
|
|
33
|
+
? await authority.effects.settledAt(runId)
|
|
34
|
+
: null;
|
|
35
|
+
return {
|
|
36
|
+
parentRunId: origin.parentRunId,
|
|
37
|
+
status: run.status,
|
|
38
|
+
endedAt: endedAt === null ? null : Math.max(endedAt, stoppedAt ?? endedAt),
|
|
39
|
+
outcome: outcomeOf(event, run.status),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { type Authority, type AuthorityTiming, type Delivery, type EffectSettings, type Refusal } from "../broker/actor/authority.ts";
|
|
2
2
|
import { type WorkflowRefusal } from "../workflow-refusals.ts";
|
|
3
|
-
import { type WorkflowRegistration } from "./registry.ts";
|
|
3
|
+
import { type Registry, type WorkflowRegistration, type WorkflowBundleStore } from "./registry.ts";
|
|
4
|
+
import { type ServiceContext } from "./replies.ts";
|
|
4
5
|
import { type WorkerPort } from "./worker-port.ts";
|
|
6
|
+
import type { RunWaitTarget } from "../run-wait.ts";
|
|
7
|
+
import type { CommandEffects } from "../command-settings.ts";
|
|
8
|
+
import { type CommandWaitPort } from "./command-waits.ts";
|
|
5
9
|
export type { WorkflowRegistration } from "./registry.ts";
|
|
6
10
|
export type { EffectReply, EffectReport, EffectRequest, WorkerPort, } from "./worker-port.ts";
|
|
7
11
|
export interface ServiceTiming {
|
|
@@ -24,22 +28,38 @@ export interface ServiceHost {
|
|
|
24
28
|
readonly reports?: () => readonly unknown[];
|
|
25
29
|
}
|
|
26
30
|
export interface HostPorts {
|
|
31
|
+
readonly commandWait: CommandWaitPort;
|
|
32
|
+
readonly runWait?: {
|
|
33
|
+
readonly target: (runId: string) => Promise<RunWaitTarget | undefined>;
|
|
34
|
+
readonly observe: WorkerPort["observe"];
|
|
35
|
+
};
|
|
27
36
|
readonly state: Authority["state"];
|
|
28
37
|
readonly submit: WorkerPort["submit"];
|
|
29
38
|
readonly input: (runId: string) => Promise<string | undefined>;
|
|
30
39
|
readonly document: (digest: string) => Promise<string | undefined>;
|
|
31
|
-
readonly
|
|
40
|
+
readonly workflow: {
|
|
41
|
+
readonly id: (runId: string) => Promise<string | undefined>;
|
|
42
|
+
readonly manifest: Authority["queries"]["manifest"];
|
|
43
|
+
readonly available: (runId: string, workflowId?: string) => Promise<boolean>;
|
|
44
|
+
};
|
|
32
45
|
readonly requestEffect: WorkerPort["requestEffect"];
|
|
33
46
|
readonly operation: Authority["effects"]["operation"];
|
|
47
|
+
readonly operations: Authority["effects"]["operations"];
|
|
34
48
|
readonly reportEffect: WorkerPort["reportEffect"];
|
|
35
49
|
readonly openGate: WorkerPort["openGate"];
|
|
36
50
|
readonly registerWait: WorkerPort["registerWait"];
|
|
37
51
|
}
|
|
38
52
|
export interface ServiceOptions {
|
|
53
|
+
readonly schedule?: NonNullable<ServiceContext["schedule"]>;
|
|
54
|
+
readonly queueDailySpendLimitUsd?: number;
|
|
55
|
+
readonly workerHarness?: ServiceContext["workerHarness"];
|
|
56
|
+
readonly commandEffects?: CommandEffects;
|
|
39
57
|
readonly stateDirectory: string;
|
|
40
58
|
readonly runtimeDirectory: string;
|
|
41
59
|
readonly workflows: readonly WorkflowRegistration[];
|
|
42
60
|
readonly retainedWorkflows?: readonly WorkflowRegistration[];
|
|
61
|
+
readonly workflowBundles?: WorkflowBundleStore;
|
|
62
|
+
readonly retainedWorkflow?: Registry["available"];
|
|
43
63
|
readonly workflowRefusals?: readonly WorkflowRefusal[];
|
|
44
64
|
readonly delivery: Delivery;
|
|
45
65
|
readonly host?: (ports: HostPorts) => Promise<ServiceHost>;
|
|
@@ -2,18 +2,20 @@ import { lstat, rm } from "node:fs/promises";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { authorityTiming, openAuthority, } from "../broker/actor/authority.js";
|
|
4
4
|
import { socketAddress } from "../broker/socket-address.js";
|
|
5
|
-
import {
|
|
5
|
+
import {} from "../workflow-refusals.js";
|
|
6
6
|
import { changeSignal } from "./changes.js";
|
|
7
7
|
import { decision, questions } from "./decision-handler.js";
|
|
8
8
|
import { events } from "./event-handler.js";
|
|
9
9
|
import { expiryScan } from "./expiry.js";
|
|
10
10
|
import { commandGateway, workerCommandBound } from "./gateway.js";
|
|
11
11
|
import { workflowRegistry, } from "./registry.js";
|
|
12
|
-
import { failed } from "./replies.js";
|
|
12
|
+
import { errorMessage, failed, queryMetadata, scheduleRequest, } from "./replies.js";
|
|
13
13
|
import { runCommand, status } from "./run-handlers.js";
|
|
14
14
|
import { submissionHandler } from "./submission-handler.js";
|
|
15
15
|
import { connectionLimits, listen, reachable } from "./transport.js";
|
|
16
16
|
import { workerPort } from "./worker-port.js";
|
|
17
|
+
import { runWaitTarget } from "./run-waits.js";
|
|
18
|
+
import { commandWaitPort } from "./command-waits.js";
|
|
17
19
|
export const serviceTiming = {
|
|
18
20
|
authority: authorityTiming,
|
|
19
21
|
expiryScanMilliseconds: 1_000,
|
|
@@ -58,6 +60,7 @@ function dispatcher(context) {
|
|
|
58
60
|
const run = submissionHandler(context);
|
|
59
61
|
const operations = new Map([
|
|
60
62
|
["run", (request) => run(request.parameters)],
|
|
63
|
+
["schedule", (request) => scheduleRequest(context, request.parameters)],
|
|
61
64
|
["status", (request) => status(context, request.parameters)],
|
|
62
65
|
["questions", (request) => questions(context, request.parameters)],
|
|
63
66
|
["decision", (request) => decision(context, request.parameters)],
|
|
@@ -88,7 +91,7 @@ async function started(authority, setup) {
|
|
|
88
91
|
handle: dispatcher({
|
|
89
92
|
authority,
|
|
90
93
|
registry,
|
|
91
|
-
|
|
94
|
+
...queryMetadata(options),
|
|
92
95
|
gateway,
|
|
93
96
|
clock,
|
|
94
97
|
changed: changes.next,
|
|
@@ -135,7 +138,7 @@ export async function startService(options) {
|
|
|
135
138
|
if (typeof path !== "string")
|
|
136
139
|
return path;
|
|
137
140
|
const timing = options.timing ?? serviceTiming;
|
|
138
|
-
const registry = workflowRegistry(options.workflows, options
|
|
141
|
+
const registry = workflowRegistry(options.workflows, options);
|
|
139
142
|
const opening = await openAuthority(options.stateDirectory, {
|
|
140
143
|
delivery: options.delivery,
|
|
141
144
|
timing: timing.authority,
|
|
@@ -148,7 +151,7 @@ export async function startService(options) {
|
|
|
148
151
|
const { authority } = opening;
|
|
149
152
|
const gateway = serviceGateway(authority, { options, registry });
|
|
150
153
|
const worker = workerPort({ gateway, authority });
|
|
151
|
-
const host = await hosted(options, hostPorts(authority, worker));
|
|
154
|
+
const host = await hosted(options, hostPorts(authority, { worker, registry, gateway }));
|
|
152
155
|
if (host.kind === "refused") {
|
|
153
156
|
await authority.close();
|
|
154
157
|
return host;
|
|
@@ -168,8 +171,8 @@ export async function startService(options) {
|
|
|
168
171
|
};
|
|
169
172
|
}
|
|
170
173
|
catch (error) {
|
|
171
|
-
const unclosed = await released(authority, host.host).then(() => "", (failure) => `; the close failed: ${
|
|
172
|
-
return refused("transport-failure", `${
|
|
174
|
+
const unclosed = await released(authority, host.host).then(() => "", (failure) => `; the close failed: ${errorMessage(failure)}`);
|
|
175
|
+
return refused("transport-failure", `${errorMessage(error)}${unclosed}`);
|
|
173
176
|
}
|
|
174
177
|
}
|
|
175
178
|
function serviceGateway(authority, parts) {
|
|
@@ -182,8 +185,14 @@ function serviceGateway(authority, parts) {
|
|
|
182
185
|
pendingWorkerCommands: limits.pendingWorkerCommands,
|
|
183
186
|
});
|
|
184
187
|
}
|
|
185
|
-
function hostPorts(authority,
|
|
188
|
+
function hostPorts(authority, parts) {
|
|
189
|
+
const { worker, registry } = parts;
|
|
186
190
|
return {
|
|
191
|
+
commandWait: commandWaitPort({ authority, gateway: parts.gateway }),
|
|
192
|
+
runWait: {
|
|
193
|
+
target: (runId) => runWaitTarget(authority, runId),
|
|
194
|
+
observe: worker.observe,
|
|
195
|
+
},
|
|
187
196
|
state: authority.state,
|
|
188
197
|
submit: worker.submit,
|
|
189
198
|
input: async (runId) => {
|
|
@@ -198,17 +207,24 @@ function hostPorts(authority, worker) {
|
|
|
198
207
|
openGate: worker.openGate,
|
|
199
208
|
registerWait: worker.registerWait,
|
|
200
209
|
operation: authority.effects.operation,
|
|
201
|
-
|
|
210
|
+
operations: authority.effects.operations,
|
|
211
|
+
workflow: {
|
|
212
|
+
id: async (runId) => (await authority.queries.workflowIds())[runId],
|
|
213
|
+
manifest: authority.queries.manifest,
|
|
214
|
+
available: async (runId, workflowId) => {
|
|
215
|
+
const manifest = await authority.queries.manifest(runId);
|
|
216
|
+
return (manifest !== undefined &&
|
|
217
|
+
(workflowId === undefined || manifest.workflowId === workflowId) &&
|
|
218
|
+
(await registry.available(manifest)) !== undefined);
|
|
219
|
+
},
|
|
220
|
+
},
|
|
202
221
|
};
|
|
203
222
|
}
|
|
204
|
-
function message(error) {
|
|
205
|
-
return String(Reflect.get(Object(error), "message"));
|
|
206
|
-
}
|
|
207
223
|
async function hosted(options, ports) {
|
|
208
224
|
try {
|
|
209
225
|
return { kind: "started", host: await options.host?.(ports) };
|
|
210
226
|
}
|
|
211
227
|
catch (error) {
|
|
212
|
-
return refused("host-unavailable",
|
|
228
|
+
return refused("host-unavailable", errorMessage(error));
|
|
213
229
|
}
|
|
214
230
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type Fields, type Reply } from "../protocol.ts";
|
|
2
2
|
import { type ServiceContext } from "./replies.ts";
|
|
3
3
|
export declare function runIdentity(commandId: string): string;
|
|
4
|
-
export declare function queueOverview(context: ServiceContext): Promise<Fields>;
|
|
5
4
|
export declare function submissionHandler(context: ServiceContext): (parameters: Fields) => Promise<Reply>;
|
|
@@ -5,7 +5,9 @@ import { setTimeout as delay } from "node:timers/promises";
|
|
|
5
5
|
import { isCommandId, isIdentifier as isWorkflowIdentifier, } from "../authority/commands.js";
|
|
6
6
|
import { documentDigest } from "../broker/decision-restore.js";
|
|
7
7
|
import { record } from "../protocol.js";
|
|
8
|
-
import { checkResolution, checkSubmission, normalizedRequest, } from "../submission.js";
|
|
8
|
+
import { checkResolution, checkSubmission, hasTicketField, normalizedRequest, } from "../submission.js";
|
|
9
|
+
import { activeWorkflow } from "./active-tickets.js";
|
|
10
|
+
import { queueSpend } from "./queue-spend.js";
|
|
9
11
|
import { committed, failed, invalidRequest, publicReceipt, rejection, result, } from "./replies.js";
|
|
10
12
|
export function runIdentity(commandId) {
|
|
11
13
|
return `run-${createHash("sha256").update(commandId).digest("hex").slice(0, 32)}`;
|
|
@@ -124,6 +126,9 @@ async function admit(context, admission) {
|
|
|
124
126
|
const { input } = resolution;
|
|
125
127
|
if (Buffer.byteLength(input) > context.documentBytes)
|
|
126
128
|
return unresolved(context, { kind: "failure", commandId });
|
|
129
|
+
const held = await spendRefusal(context, admission);
|
|
130
|
+
if (held !== undefined)
|
|
131
|
+
return held;
|
|
127
132
|
const receipt = await context.gateway.execute({
|
|
128
133
|
principal: "operator",
|
|
129
134
|
command: {
|
|
@@ -154,16 +159,28 @@ async function admit(context, admission) {
|
|
|
154
159
|
replayed: receipt.kind === "duplicate",
|
|
155
160
|
});
|
|
156
161
|
}
|
|
162
|
+
async function spendRefusal(context, admission) {
|
|
163
|
+
if (admission.workflow.manifest.queue !== true)
|
|
164
|
+
return undefined;
|
|
165
|
+
const spend = record((await queueSpend(context))["spend"]);
|
|
166
|
+
return spend?.["holding"] === true
|
|
167
|
+
? failed("queue-spend-limit", {
|
|
168
|
+
commandId: admission.commandId,
|
|
169
|
+
detail: "Queue holding for spend limit.",
|
|
170
|
+
})
|
|
171
|
+
: undefined;
|
|
172
|
+
}
|
|
157
173
|
function admissionRefusal(workflow, request) {
|
|
158
|
-
const {
|
|
159
|
-
|
|
174
|
+
const { commandId, submission, activeTickets } = request;
|
|
175
|
+
const tickets = hasTicketField(workflow.submission);
|
|
176
|
+
if (tickets &&
|
|
160
177
|
typeof submission["ticket"] === "string" &&
|
|
161
178
|
activeTickets.some((input) => input["ticketId"] === submission["ticket"]))
|
|
162
179
|
return failed("ticket-active", {
|
|
163
180
|
commandId,
|
|
164
181
|
detail: "An active run already works on this ticket.",
|
|
165
182
|
});
|
|
166
|
-
if (
|
|
183
|
+
if (tickets && submission["ticket"] !== "next")
|
|
167
184
|
return undefined;
|
|
168
185
|
return capacityRefusal(workflow, request);
|
|
169
186
|
}
|
|
@@ -228,43 +245,12 @@ async function submitted(context, parameters) {
|
|
|
228
245
|
activeTickets,
|
|
229
246
|
});
|
|
230
247
|
}
|
|
231
|
-
async function activeWorkflow(context, workflowId) {
|
|
232
|
-
const workflows = await context.authority.queries.workflowIds();
|
|
233
|
-
const state = await context.authority.state();
|
|
234
|
-
const runs = Object.values(state.runs).filter((run) => workflows[run.runId] === workflowId &&
|
|
235
|
-
!["completed", "failed", "cancelled"].includes(run.status));
|
|
236
|
-
return Promise.all(runs.map(async (run) => {
|
|
237
|
-
const digest = state.details[run.runId]?.input;
|
|
238
|
-
const text = digest
|
|
239
|
-
? await context.authority.queries.document(digest)
|
|
240
|
-
: undefined;
|
|
241
|
-
return record(JSON.parse(text ?? "null")) ?? {};
|
|
242
|
-
}));
|
|
243
|
-
}
|
|
244
|
-
export async function queueOverview(context) {
|
|
245
|
-
const workflow = context.registry.byId("develop-issue");
|
|
246
|
-
if (workflow?.admission === undefined)
|
|
247
|
-
return {};
|
|
248
|
-
const active = await activeWorkflow(context, "develop-issue");
|
|
249
|
-
return {
|
|
250
|
-
queue: {
|
|
251
|
-
lanes: workflow.admission === "when-idle" ? 1 : workflow.admission,
|
|
252
|
-
busy: active.length,
|
|
253
|
-
skipped: [
|
|
254
|
-
...active.flatMap((input) => typeof input["ticketId"] === "string"
|
|
255
|
-
? [{ ticketId: input["ticketId"], reason: "ticket-active" }]
|
|
256
|
-
: []),
|
|
257
|
-
...(workflow.resolver.skippedTickets?.() ?? []),
|
|
258
|
-
],
|
|
259
|
-
},
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
248
|
export function submissionHandler(context) {
|
|
263
249
|
const pending = new Map();
|
|
264
250
|
return (parameters) => {
|
|
265
251
|
const keys = [`command:${String(parameters["commandId"])}`];
|
|
266
252
|
const workflowId = String(parameters["workflowId"]);
|
|
267
|
-
if (workflowId
|
|
253
|
+
if (hasTicketField(context.registry.byId(workflowId)?.submission) ||
|
|
268
254
|
context.registry.byId(workflowId)?.admission !== undefined)
|
|
269
255
|
keys.push(`workflow:${workflowId}`);
|
|
270
256
|
const next = () => submitted(context, parameters);
|