cloving 1.2.0 → 1.3.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 +525 -185
- package/dist/src/agent-harness-shell.d.ts +12 -0
- package/dist/src/agent-harness-shell.js +90 -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/commands.d.ts +1 -0
- package/dist/src/authority/commands.js +24 -4
- 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/operations.js +1 -1
- package/dist/src/authority/reduction.d.ts +1 -1
- package/dist/src/authority/reduction.js +6 -1
- package/dist/src/authority/status-input.d.ts +1 -1
- package/dist/src/authority/status.d.ts +1 -0
- package/dist/src/authority/status.js +27 -3
- package/dist/src/authority/transitions.d.ts +5 -5
- package/dist/src/authority/transitions.js +6 -0
- package/dist/src/broker/actor/authority-delivery.js +1 -0
- package/dist/src/broker/actor/authority-queries.d.ts +7 -1
- package/dist/src/broker/actor/authority-queries.js +17 -2
- 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/delivery-intents.d.ts +2 -1
- package/dist/src/broker/actor/delivery-intents.js +4 -4
- package/dist/src/broker/actor/effect-delivery.js +4 -1
- package/dist/src/broker/actor/effect-queries.d.ts +1 -0
- package/dist/src/broker/actor/effect-queries.js +7 -0
- package/dist/src/broker/actor/pin-check.js +1 -1
- package/dist/src/broker/actor/stop-plan.js +1 -1
- package/dist/src/broker/actor/turn-state.js +1 -1
- package/dist/src/broker/authority-admission.js +22 -9
- package/dist/src/broker/authority-restore.js +1 -0
- package/dist/src/broker/decision-restore.js +4 -4
- 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 +11 -13
- package/dist/src/cli/arguments.js +37 -107
- package/dist/src/cli/command-effects.d.ts +7 -0
- package/dist/src/cli/command-effects.js +39 -0
- package/dist/src/cli/commands.js +11 -4
- 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 +50 -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 +3 -0
- package/dist/src/cli/doctor-workflows.js +45 -0
- package/dist/src/cli/doctor.d.ts +15 -0
- package/dist/src/cli/doctor.js +190 -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 +22 -0
- package/dist/src/cli/harness-probes.js +183 -0
- package/dist/src/cli/main.d.ts +7 -1
- package/dist/src/cli/main.js +39 -61
- 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 +44 -28
- package/dist/src/cli/report-github.d.ts +18 -0
- package/dist/src/cli/report-github.js +200 -0
- package/dist/src/cli/report.d.ts +17 -0
- package/dist/src/cli/report.js +192 -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 +4 -0
- package/dist/src/cli/runtime-arguments.js +15 -0
- package/dist/src/cli/runtime-directory.d.ts +6 -2
- package/dist/src/cli/runtime-directory.js +72 -14
- 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 +5 -0
- package/dist/src/cli/usage-render.js +40 -1
- package/dist/src/cli/usage.d.ts +3 -3
- package/dist/src/cli/usage.js +70 -44
- package/dist/src/cli/watch-actions.d.ts +2 -0
- package/dist/src/cli/watch-actions.js +4 -4
- package/dist/src/cli/watch-board-view.d.ts +1 -1
- package/dist/src/cli/watch-board-view.js +8 -2
- package/dist/src/cli/watch-board.js +23 -10
- package/dist/src/cli/watch-card-forms.js +2 -2
- package/dist/src/cli/watch-client.d.ts +1 -1
- package/dist/src/cli/watch-client.js +7 -2
- package/dist/src/cli/watch-header-view.d.ts +27 -0
- package/dist/src/cli/watch-header-view.js +116 -0
- package/dist/src/cli/watch-model.js +17 -4
- package/dist/src/cli/watch-page.js +48 -12
- 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-pull-request.d.ts +3 -1
- package/dist/src/cli/watch-pull-request.js +4 -0
- package/dist/src/cli/watch-render.d.ts +9 -1
- package/dist/src/cli/watch-server.js +23 -5
- 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 +6 -20
- package/dist/src/cli/watch-view.js +14 -106
- package/dist/src/cli.js +106 -23
- package/dist/src/command-settings.d.ts +16 -0
- package/dist/src/command-settings.js +42 -0
- package/dist/src/configuration-change.d.ts +11 -0
- package/dist/src/configuration-change.js +62 -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 +49 -0
- package/dist/src/configuration-schema.js +159 -0
- package/dist/src/daemon/claude-turn.d.ts +19 -5
- package/dist/src/daemon/claude-turn.js +116 -53
- package/dist/src/daemon/claude-worker.d.ts +3 -3
- package/dist/src/daemon/claude-worker.js +65 -76
- 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 +58 -0
- package/dist/src/daemon/daemon-adapters.js +102 -0
- package/dist/src/daemon/daemon-loops.d.ts +14 -0
- package/dist/src/daemon/daemon-loops.js +39 -0
- package/dist/src/daemon/daemon.d.ts +2 -33
- package/dist/src/daemon/daemon.js +126 -132
- 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-ci-rerun.d.ts +26 -0
- package/dist/src/daemon/github-ci-rerun.js +92 -0
- package/dist/src/daemon/github-ci.js +89 -8
- package/dist/src/daemon/github-merge-call.d.ts +2 -0
- package/dist/src/daemon/github-merge.js +7 -3
- package/dist/src/daemon/github-methods.js +10 -0
- package/dist/src/daemon/github-operation.d.ts +1 -0
- package/dist/src/daemon/github-retry.js +8 -44
- package/dist/src/daemon/issue-queue.d.ts +1 -0
- package/dist/src/daemon/issue-queue.js +3 -26
- package/dist/src/daemon/notify.js +2 -1
- package/dist/src/daemon/opencode-stream.d.ts +5 -0
- package/dist/src/daemon/opencode-stream.js +87 -0
- package/dist/src/daemon/queue-status.d.ts +4 -0
- package/dist/src/daemon/queue-status.js +38 -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 -0
- package/dist/src/daemon/retrying-turn.js +108 -30
- package/dist/src/daemon/schedule-journal.d.ts +19 -0
- package/dist/src/daemon/schedule-journal.js +57 -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 +5 -7
- package/dist/src/daemon/ticket-registration.js +85 -40
- 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 +18 -0
- package/dist/src/daemon/turn-report.js +79 -0
- package/dist/src/daemon/work-tree.d.ts +2 -1
- package/dist/src/daemon/work-tree.js +15 -12
- 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 +27 -0
- package/dist/src/daemon/workflow-schedules.js +185 -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 +24 -0
- package/dist/src/doctor-report.js +70 -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/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 +1 -1
- package/dist/src/host/start-delivery.js +10 -3
- package/dist/src/host/step-bridge-host.d.ts +6 -20
- package/dist/src/host/step-bridge-host.js +44 -58
- package/dist/src/merge-request.d.ts +19 -0
- package/dist/src/merge-request.js +32 -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 +263 -0
- package/dist/src/project-config.schema.json +65 -0
- package/dist/src/project-settings.d.ts +19 -0
- package/dist/src/project-settings.js +131 -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 +25 -0
- package/dist/src/relay/relay-service.js +216 -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-statistics.d.ts +50 -0
- package/dist/src/report-statistics.js +70 -0
- package/dist/src/report.d.ts +171 -0
- package/dist/src/report.js +119 -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/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/decision-handler.d.ts +4 -0
- package/dist/src/service/decision-handler.js +39 -4
- package/dist/src/service/gateway.js +18 -3
- package/dist/src/service/registry.d.ts +16 -3
- package/dist/src/service/registry.js +34 -3
- package/dist/src/service/replies.d.ts +9 -1
- package/dist/src/service/replies.js +12 -0
- package/dist/src/service/run-handlers.js +14 -55
- package/dist/src/service/run-metadata.d.ts +8 -0
- package/dist/src/service/run-metadata.js +53 -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 +18 -2
- package/dist/src/service/service.js +23 -7
- package/dist/src/service/submission-handler.d.ts +0 -1
- package/dist/src/service/submission-handler.js +6 -34
- package/dist/src/service/worker-port.d.ts +1 -0
- package/dist/src/service/worker-totals.js +8 -23
- package/dist/src/step-bridge.d.ts +23 -0
- package/dist/src/steps/decision-gate.d.ts +2 -1
- package/dist/src/steps/decision-gate.js +7 -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/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 +16 -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-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/decision-snapshots.d.ts +1 -0
- package/dist/src/storage/decision-snapshots.js +7 -1
- package/dist/src/submission.d.ts +4 -0
- package/dist/src/submission.js +6 -2
- package/dist/src/testing.d.ts +29 -0
- package/dist/src/testing.js +264 -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 +16 -0
- package/dist/src/worker-usage.js +57 -0
- package/dist/src/workflow-admission.d.ts +5 -0
- package/dist/src/workflow-candidate.d.ts +7 -2
- package/dist/src/workflow-candidate.js +47 -5
- package/dist/src/workflow-declaration.d.ts +21 -3
- package/dist/src/workflow-declaration.js +77 -9
- package/dist/src/workflow-discovery.d.ts +2 -1
- package/dist/src/workflow-discovery.js +4 -1
- package/dist/src/workflow-refusals.js +3 -0
- package/dist/src/workflow-schedule.d.ts +22 -0
- package/dist/src/workflow-schedule.js +53 -0
- package/dist/src/workflows.d.ts +11 -1
- package/dist/src/workflows.js +8 -0
- 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/self-host-processes.d.ts +1 -0
- package/dist/tools/self-host-processes.js +33 -22
- package/dist/tools/self-host-project.d.ts +4 -0
- package/dist/tools/self-host-project.js +61 -14
- 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 +86 -61
- 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-source.js +77 -15
- package/dist/tools/workflow-candidate-syntax.d.ts +8 -2
- package/dist/tools/workflow-candidate-syntax.js +70 -26
- package/dist/tools/workflow-command.d.ts +1 -0
- package/dist/tools/workflow-command.js +143 -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 +17 -1
- package/dist/tools/workflow-folders.js +59 -6
- 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/dist/workflows/develop-ticket.js +1 -1
- package/dist/workflows/ticket-prompts.js +5 -1
- package/package.json +46 -4
- package/templates/develop/README.md +78 -0
- package/templates/develop/develop/accept.ts +11 -0
- package/templates/develop/develop/flow-tests.ts +357 -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 +152 -0
- package/templates/develop/develop/queue-partial.ts +39 -0
- package/templates/develop/develop/refusal-tests.ts +174 -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 +67 -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/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/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/workflows/analyze-chats.d.ts +0 -15
- package/dist/workflows/analyze-chats.declaration.json +0 -22
- package/dist/workflows/analyze-chats.js +0 -250
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const shellTurnScript = "\nset +m\nbuiltin unset GH_TOKEN GITHUB_TOKEN GH_ENTERPRISE_TOKEN GITHUB_ENTERPRISE_TOKEN || exit\nbuiltin export GH_CONFIG_DIR=\"$1\" || exit\nshift\nif [ -n \"${ZSH_VERSION-}\" ] && (( ${+aliases[$1]} )); then\n alias_command=\"${aliases[$1]}\"\n builtin unalias -- \"$1\"\n shift\n eval -- \"$alias_command\"' \"$@\"'\nelif [ -n \"${BASH_VERSION-}\" ] && alias_value=$(builtin alias -- \"$1\" 2>/dev/null); then\n eval -- \"alias_command=${alias_value#*=}\"\n builtin unalias -- \"$1\"\n shift\n eval -- \"$alias_command\"' \"$@\"'\nelse\n \"$@\"\nfi\n";
|
|
2
|
+
export declare const shellDiscoveryScript = "\nset +m\nif [ -z \"${ZSH_VERSION-}\" ] && [ -z \"${BASH_VERSION-}\" ]; then exit 64; fi\nprintf '__CLOVING_HARNESS_START_-1__\\n%s\\n\\n__CLOVING_HARNESS_END_-1__\\n' \"${BASH_VERSION:+bash}\"\nindex=0\nfor name in \"$@\"; do\n printf '__CLOVING_HARNESS_START_%s__\\n' \"$index\"\n if [ -n \"${ZSH_VERSION-}\" ]; then\n kind=$(whence -w -- \"$name\" 2>/dev/null) || kind=\n printf '%s\\n' \"${kind##*: }\"\n file=$(whence -p -- \"$name\" 2>/dev/null) || file=\n else\n kind=$(builtin type -t -- \"$name\" 2>/dev/null) || kind=\n printf '%s\\n' \"$kind\"\n file=$(builtin type -P -- \"$name\" 2>/dev/null) || file=\n fi\n case \"$file\" in /*|\"\") ;; *) file=\"$PWD/$file\" ;; esac\n printf '%s\\n' \"$file\"\n printf '\\n__CLOVING_HARNESS_END_%s__\\n' \"$index\"\n index=$((index + 1))\ndone\nexit 0\n";
|
|
3
|
+
export declare const shellProbeScript = "\nset +m\nprintf '__CLOVING_HARNESS_START_0__\\n'\nif [ \"$2\" = file ]; then\n command -- \"$1\" --version\nelif [ -n \"${ZSH_VERSION-}\" ] && (( ${+aliases[$1]} )); then\n alias_command=\"${aliases[$1]}\"\n builtin unalias -- \"$1\"\n eval -- \"$alias_command\"' --version'\nelif [ -n \"${BASH_VERSION-}\" ] && alias_value=$(builtin alias -- \"$1\" 2>/dev/null); then\n eval -- \"alias_command=${alias_value#*=}\"\n builtin unalias -- \"$1\"\n eval -- \"$alias_command\"' --version'\nelif [ -n \"${ZSH_VERSION-}\" ] || [ -n \"${BASH_VERSION-}\" ]; then\n \"$1\" --version\nelse\n exit 64\nfi\nprobe_status=$?\nprintf '\\n__CLOVING_HARNESS_END_0__\\n'\nexit \"$probe_status\"\n";
|
|
4
|
+
export declare function shellBlock(output: string, index: number): string | null;
|
|
5
|
+
export interface ShellEntry {
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly kind: "file" | "shell";
|
|
8
|
+
readonly path: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function shellEntries(output: string, names: readonly string[]): ShellEntry[] | null;
|
|
11
|
+
export type ShellMode = "login" | "interactive";
|
|
12
|
+
export declare function shellArguments(mode: ShellMode): string[];
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
export const shellTurnScript = `
|
|
2
|
+
set +m
|
|
3
|
+
builtin unset GH_TOKEN GITHUB_TOKEN GH_ENTERPRISE_TOKEN GITHUB_ENTERPRISE_TOKEN || exit
|
|
4
|
+
builtin export GH_CONFIG_DIR="$1" || exit
|
|
5
|
+
shift
|
|
6
|
+
if [ -n "\${ZSH_VERSION-}" ] && (( \${+aliases[$1]} )); then
|
|
7
|
+
alias_command="\${aliases[$1]}"
|
|
8
|
+
builtin unalias -- "$1"
|
|
9
|
+
shift
|
|
10
|
+
eval -- "$alias_command"' "$@"'
|
|
11
|
+
elif [ -n "\${BASH_VERSION-}" ] && alias_value=$(builtin alias -- "$1" 2>/dev/null); then
|
|
12
|
+
eval -- "alias_command=\${alias_value#*=}"
|
|
13
|
+
builtin unalias -- "$1"
|
|
14
|
+
shift
|
|
15
|
+
eval -- "$alias_command"' "$@"'
|
|
16
|
+
else
|
|
17
|
+
"$@"
|
|
18
|
+
fi
|
|
19
|
+
`;
|
|
20
|
+
export const shellDiscoveryScript = `
|
|
21
|
+
set +m
|
|
22
|
+
if [ -z "\${ZSH_VERSION-}" ] && [ -z "\${BASH_VERSION-}" ]; then exit 64; fi
|
|
23
|
+
printf '__CLOVING_HARNESS_START_-1__\\n%s\\n\\n__CLOVING_HARNESS_END_-1__\\n' "\${BASH_VERSION:+bash}"
|
|
24
|
+
index=0
|
|
25
|
+
for name in "$@"; do
|
|
26
|
+
printf '__CLOVING_HARNESS_START_%s__\\n' "$index"
|
|
27
|
+
if [ -n "\${ZSH_VERSION-}" ]; then
|
|
28
|
+
kind=$(whence -w -- "$name" 2>/dev/null) || kind=
|
|
29
|
+
printf '%s\\n' "\${kind##*: }"
|
|
30
|
+
file=$(whence -p -- "$name" 2>/dev/null) || file=
|
|
31
|
+
else
|
|
32
|
+
kind=$(builtin type -t -- "$name" 2>/dev/null) || kind=
|
|
33
|
+
printf '%s\\n' "$kind"
|
|
34
|
+
file=$(builtin type -P -- "$name" 2>/dev/null) || file=
|
|
35
|
+
fi
|
|
36
|
+
case "$file" in /*|"") ;; *) file="$PWD/$file" ;; esac
|
|
37
|
+
printf '%s\\n' "$file"
|
|
38
|
+
printf '\\n__CLOVING_HARNESS_END_%s__\\n' "$index"
|
|
39
|
+
index=$((index + 1))
|
|
40
|
+
done
|
|
41
|
+
exit 0
|
|
42
|
+
`;
|
|
43
|
+
export const shellProbeScript = `
|
|
44
|
+
set +m
|
|
45
|
+
printf '__CLOVING_HARNESS_START_0__\\n'
|
|
46
|
+
if [ "$2" = file ]; then
|
|
47
|
+
command -- "$1" --version
|
|
48
|
+
elif [ -n "\${ZSH_VERSION-}" ] && (( \${+aliases[$1]} )); then
|
|
49
|
+
alias_command="\${aliases[$1]}"
|
|
50
|
+
builtin unalias -- "$1"
|
|
51
|
+
eval -- "$alias_command"' --version'
|
|
52
|
+
elif [ -n "\${BASH_VERSION-}" ] && alias_value=$(builtin alias -- "$1" 2>/dev/null); then
|
|
53
|
+
eval -- "alias_command=\${alias_value#*=}"
|
|
54
|
+
builtin unalias -- "$1"
|
|
55
|
+
eval -- "$alias_command"' --version'
|
|
56
|
+
elif [ -n "\${ZSH_VERSION-}" ] || [ -n "\${BASH_VERSION-}" ]; then
|
|
57
|
+
"$1" --version
|
|
58
|
+
else
|
|
59
|
+
exit 64
|
|
60
|
+
fi
|
|
61
|
+
probe_status=$?
|
|
62
|
+
printf '\\n__CLOVING_HARNESS_END_0__\\n'
|
|
63
|
+
exit "$probe_status"
|
|
64
|
+
`;
|
|
65
|
+
export function shellBlock(output, index) {
|
|
66
|
+
const start = `__CLOVING_HARNESS_START_${String(index)}__\n`;
|
|
67
|
+
const end = `\n__CLOVING_HARNESS_END_${String(index)}__\n`;
|
|
68
|
+
const began = output.indexOf(start);
|
|
69
|
+
if (began < 0)
|
|
70
|
+
return null;
|
|
71
|
+
const finished = output.indexOf(end, began + start.length);
|
|
72
|
+
return finished < 0 ? null : output.slice(began + start.length, finished);
|
|
73
|
+
}
|
|
74
|
+
export function shellEntries(output, names) {
|
|
75
|
+
const blocks = names.map((_, index) => shellBlock(output, index));
|
|
76
|
+
if (blocks.some((block) => block === null))
|
|
77
|
+
return null;
|
|
78
|
+
return names.flatMap((name, index) => {
|
|
79
|
+
const [kind, path] = (blocks[index] ?? "").split("\n");
|
|
80
|
+
const entries = [];
|
|
81
|
+
if (path)
|
|
82
|
+
entries.push({ name, kind: "file", path });
|
|
83
|
+
if (kind === "function" || kind === "alias")
|
|
84
|
+
entries.push({ name, kind: "shell", path: name });
|
|
85
|
+
return entries;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
export function shellArguments(mode) {
|
|
89
|
+
return [...(mode === "login" ? ["-l"] : []), "-i", "+m", "-c"];
|
|
90
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface KnownHarness {
|
|
2
|
+
readonly name: string;
|
|
3
|
+
readonly versionOption: string;
|
|
4
|
+
readonly versionPattern: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const knownHarnesses: readonly KnownHarness[];
|
|
7
|
+
export declare function harnessDefinition(name: string): KnownHarness;
|
|
8
|
+
export declare function harnessVersion(output: string, pattern: string): string | null;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const semanticVersion = String.raw `\d+\.\d+\.\d+(?:[-+][\w.+-]+)?`;
|
|
2
|
+
const fallbackVersion = String.raw `\d+\.\d+`;
|
|
3
|
+
export const knownHarnesses = [
|
|
4
|
+
{
|
|
5
|
+
name: "claude",
|
|
6
|
+
versionOption: "--version",
|
|
7
|
+
versionPattern: `^${semanticVersion} \\(Claude Code\\)$`,
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
name: "codex",
|
|
11
|
+
versionOption: "--version",
|
|
12
|
+
versionPattern: `^codex-cli ${semanticVersion}$`,
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "gemini",
|
|
16
|
+
versionOption: "--version",
|
|
17
|
+
versionPattern: `^${semanticVersion}$`,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: "opencode",
|
|
21
|
+
versionOption: "--version",
|
|
22
|
+
versionPattern: `^(?:opencode v)?${semanticVersion}$`,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: "grok",
|
|
26
|
+
versionOption: "--version",
|
|
27
|
+
versionPattern: `^${semanticVersion}$`,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "cursor-agent",
|
|
31
|
+
versionOption: "--version",
|
|
32
|
+
versionPattern: String.raw `^\d{4}\.\d{2}\.\d{2}-[\w.-]+$`,
|
|
33
|
+
},
|
|
34
|
+
{ name: "pi", versionOption: "--version", versionPattern: fallbackVersion },
|
|
35
|
+
{ name: "amp", versionOption: "--version", versionPattern: fallbackVersion },
|
|
36
|
+
];
|
|
37
|
+
export function harnessDefinition(name) {
|
|
38
|
+
return (knownHarnesses.find((entry) => entry.name === name) ?? {
|
|
39
|
+
name,
|
|
40
|
+
versionOption: "--version",
|
|
41
|
+
versionPattern: fallbackVersion,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export function harnessVersion(output, pattern) {
|
|
45
|
+
const line = output.split(/\r?\n/, 1)[0] ?? "";
|
|
46
|
+
if (/\b(?:error|unavailable|not found)\b/i.test(line))
|
|
47
|
+
return null;
|
|
48
|
+
return new RegExp(pattern).test(line) ? line : null;
|
|
49
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type HarnessOptions } from "./cli/harness-probes.ts";
|
|
2
|
+
export type { HarnessEntry, HarnessDiscovery, HarnessOptions, } from "./cli/harness-probes.ts";
|
|
3
|
+
export declare function discoverHarnesses(options?: HarnessOptions): Promise<import("./cli/harness-probes.ts").HarnessDiscovery>;
|
|
4
|
+
export declare function probeHarness(target: string, options?: HarnessOptions): Promise<import("./cli/harness-probes.ts").HarnessDiscovery>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createProbeRunner } from "./cli/probe-command.js";
|
|
3
|
+
import { discoverHarnesses as discover, probeHarness as probe, } from "./cli/harness-probes.js";
|
|
4
|
+
const runner = createProbeRunner({
|
|
5
|
+
spawn: (input) => spawn(input.executable, input.arguments, input.options),
|
|
6
|
+
kill: (identifier, signal) => process.kill(identifier, signal),
|
|
7
|
+
});
|
|
8
|
+
export function discoverHarnesses(options = {}) {
|
|
9
|
+
return discover({ ...options, probe: runner });
|
|
10
|
+
}
|
|
11
|
+
export function probeHarness(target, options = {}) {
|
|
12
|
+
return probe(target, { ...options, probe: runner });
|
|
13
|
+
}
|
|
@@ -3,6 +3,7 @@ export declare const commandEvents: Readonly<Record<string, EventType>>;
|
|
|
3
3
|
export declare function parseCommand(value: unknown): AuthorityCommand | null;
|
|
4
4
|
export declare const recoveryBound = 10;
|
|
5
5
|
export declare function isCapabilityList(value: unknown): value is string;
|
|
6
|
+
export declare function isDeviceActor(value: unknown): value is string;
|
|
6
7
|
export declare function isIdentifier(value: unknown): value is string;
|
|
7
8
|
export declare function isRecordKey(value: unknown): value is string;
|
|
8
9
|
export declare function isCommandId(value: unknown): value is string;
|
|
@@ -25,9 +25,14 @@ export const commandEvents = {
|
|
|
25
25
|
"expire-lease": "lease.expired",
|
|
26
26
|
"report-effect": "effect.reported",
|
|
27
27
|
"record-outcome": "operation.reconciled",
|
|
28
|
+
"record-schedule-skip": "schedule.skipped",
|
|
28
29
|
};
|
|
29
30
|
const revised = { required: ["expectedRevision"] };
|
|
30
31
|
const shapes = {
|
|
32
|
+
"record-schedule-skip": {
|
|
33
|
+
required: ["workflowId", "slot"],
|
|
34
|
+
validators: { slot: positive },
|
|
35
|
+
},
|
|
31
36
|
"admit-run": {
|
|
32
37
|
required: ["workflow"],
|
|
33
38
|
optional: [
|
|
@@ -48,14 +53,16 @@ const shapes = {
|
|
|
48
53
|
"mark-started": revised,
|
|
49
54
|
"open-gate": {
|
|
50
55
|
required: ["gateId", "expectedRevision"],
|
|
51
|
-
optional: ["gateKind", "subject", "prompt", "expiresAt"],
|
|
56
|
+
optional: ["gateKind", "subject", "prompt", "expiresAt", "waitMode"],
|
|
57
|
+
validators: { waitMode: (value) => value === "hook" },
|
|
52
58
|
groups: [["gateKind", "subject", "prompt"]],
|
|
53
|
-
consistent: (fields) => fields["expiresAt"] === undefined
|
|
59
|
+
consistent: (fields) => (fields["expiresAt"] === undefined && fields["waitMode"] === undefined) ||
|
|
60
|
+
fields["gateKind"] !== undefined,
|
|
54
61
|
},
|
|
55
62
|
"register-wait": { required: ["gateId"] },
|
|
56
63
|
"decide-gate": {
|
|
57
64
|
required: ["gateId", "decision", "expectedRevision"],
|
|
58
|
-
optional: ["generation", "subject", "answer"],
|
|
65
|
+
optional: ["generation", "subject", "answer", "actor"],
|
|
59
66
|
groups: [["generation", "subject"]],
|
|
60
67
|
consistent: (fields) => {
|
|
61
68
|
const typed = fields["generation"] !== undefined;
|
|
@@ -97,7 +104,14 @@ const shapes = {
|
|
|
97
104
|
"cancel-run": revised,
|
|
98
105
|
"report-observation": {
|
|
99
106
|
required: ["condition", "reason"],
|
|
100
|
-
optional: [
|
|
107
|
+
optional: [
|
|
108
|
+
"evidence",
|
|
109
|
+
"retryAt",
|
|
110
|
+
"attempt",
|
|
111
|
+
"limit",
|
|
112
|
+
"operationId",
|
|
113
|
+
"expectedObservation",
|
|
114
|
+
],
|
|
101
115
|
groups: [["attempt", "limit"]],
|
|
102
116
|
},
|
|
103
117
|
"record-dispatch": { required: ["operationId", "receipt"] },
|
|
@@ -150,6 +164,7 @@ const reportedOutcomes = ["completed", "failed", "stopped"];
|
|
|
150
164
|
const outcomes = [...reportedOutcomes, "accepted", "not-started", "unknown"];
|
|
151
165
|
const conditions = [
|
|
152
166
|
"working",
|
|
167
|
+
"waiting-run",
|
|
153
168
|
"quota-wait",
|
|
154
169
|
"infrastructure-failure",
|
|
155
170
|
"code-failure",
|
|
@@ -250,6 +265,7 @@ export function isCapabilityList(value) {
|
|
|
250
265
|
}
|
|
251
266
|
const validators = {
|
|
252
267
|
expectedRevision: positive,
|
|
268
|
+
expectedObservation: whole,
|
|
253
269
|
generation: positive,
|
|
254
270
|
attempt: positive,
|
|
255
271
|
limit: positive,
|
|
@@ -274,7 +290,11 @@ const validators = {
|
|
|
274
290
|
condition: (value) => typeof value === "string" && conditions.includes(value),
|
|
275
291
|
expiresAt: isInstant,
|
|
276
292
|
retryAt: isInstant,
|
|
293
|
+
actor: isDeviceActor,
|
|
277
294
|
};
|
|
295
|
+
export function isDeviceActor(value) {
|
|
296
|
+
return (typeof value === "string" && /^device:[A-Za-z0-9_-]{1,64}$/.test(value));
|
|
297
|
+
}
|
|
278
298
|
export function isIdentifier(value) {
|
|
279
299
|
return typeof value === "string" && identifier.test(value);
|
|
280
300
|
}
|
|
@@ -2,6 +2,7 @@ import { type SettledGate } from "./gates.ts";
|
|
|
2
2
|
import { type Recorded, type Reduction } from "./reduction-state.ts";
|
|
3
3
|
import { type AuthorityState, type EffectIntent } from "./transitions.ts";
|
|
4
4
|
export declare function gateContinuation(gate: SettledGate): EffectIntent;
|
|
5
|
+
export declare function gateDelivery(gate: SettledGate): EffectIntent;
|
|
5
6
|
export declare function opened(state: AuthorityState, recorded: Recorded): Reduction;
|
|
6
7
|
export declare function decided(state: AuthorityState, recorded: Recorded): Reduction;
|
|
7
8
|
export declare function expired(state: AuthorityState, recorded: Recorded): Reduction;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { delivers, decisionRefusal, expiryRefusal, gateKey, openedGate, reusable, settled, } from "./gates.js";
|
|
2
2
|
import { applied, identity, invalid, text, } from "./reduction-state.js";
|
|
3
3
|
import { terminal, transition, } from "./transitions.js";
|
|
4
4
|
export function gateContinuation(gate) {
|
|
@@ -14,8 +14,23 @@ export function gateContinuation(gate) {
|
|
|
14
14
|
}),
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
|
+
export function gateDelivery(gate) {
|
|
18
|
+
if (gate.wait !== "hook")
|
|
19
|
+
return gateContinuation(gate);
|
|
20
|
+
return {
|
|
21
|
+
kind: "resume-hook",
|
|
22
|
+
runId: gate.runId,
|
|
23
|
+
operationId: identity({
|
|
24
|
+
run: gate.runId,
|
|
25
|
+
phase: "gate",
|
|
26
|
+
round: gate.outcome.sequence,
|
|
27
|
+
operation: "resume-hook",
|
|
28
|
+
key: gate.gateId,
|
|
29
|
+
}),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
17
32
|
function continuations(gate) {
|
|
18
|
-
return
|
|
33
|
+
return delivers(gate) ? [gateDelivery(gate)] : [];
|
|
19
34
|
}
|
|
20
35
|
export function opened(state, recorded) {
|
|
21
36
|
const { event, run } = recorded;
|
|
@@ -98,7 +113,7 @@ export function registered(state, recorded) {
|
|
|
98
113
|
const gate = gateOf(state, event);
|
|
99
114
|
if (gate === undefined)
|
|
100
115
|
return invalid("unknown-gate");
|
|
101
|
-
if (gate.wait
|
|
116
|
+
if (gate.wait !== "pending")
|
|
102
117
|
return invalid("wait-already-registered");
|
|
103
118
|
const next = { ...gate, wait: "registered" };
|
|
104
119
|
return applied(state, {
|
|
@@ -14,7 +14,7 @@ export interface GateState {
|
|
|
14
14
|
readonly expiresAt: string | null;
|
|
15
15
|
readonly generation: number;
|
|
16
16
|
readonly revision: number;
|
|
17
|
-
readonly wait: "registered" | "pending";
|
|
17
|
+
readonly wait: "registered" | "pending" | "hook";
|
|
18
18
|
readonly outcome: GateOutcome | null;
|
|
19
19
|
readonly openedSequence: number;
|
|
20
20
|
}
|
|
@@ -45,4 +45,5 @@ export type ContinuingGate = GateState & {
|
|
|
45
45
|
};
|
|
46
46
|
};
|
|
47
47
|
export declare function continues(gate: GateState): gate is ContinuingGate;
|
|
48
|
+
export declare function delivers(gate: GateState): gate is ContinuingGate;
|
|
48
49
|
export {};
|
|
@@ -22,6 +22,7 @@ export function gateKey(runId, gateId) {
|
|
|
22
22
|
export function openedGate(opening) {
|
|
23
23
|
const { payload } = opening;
|
|
24
24
|
const kind = kinds[payload["gateKind"] ?? ""] ?? "untyped";
|
|
25
|
+
const wait = kind === "untyped" ? "registered" : "pending";
|
|
25
26
|
return {
|
|
26
27
|
runId: opening.runId,
|
|
27
28
|
gateId: payload["gateId"] ?? "",
|
|
@@ -32,7 +33,7 @@ export function openedGate(opening) {
|
|
|
32
33
|
expiresAt: payload["expiresAt"] ?? null,
|
|
33
34
|
generation: opening.generation,
|
|
34
35
|
revision: 1,
|
|
35
|
-
wait:
|
|
36
|
+
wait: payload["waitMode"] === "hook" ? "hook" : wait,
|
|
36
37
|
outcome: null,
|
|
37
38
|
openedSequence: opening.sequence,
|
|
38
39
|
};
|
|
@@ -75,3 +76,6 @@ export function continues(gate) {
|
|
|
75
76
|
isSettled(gate) &&
|
|
76
77
|
gate.outcome.decision !== null);
|
|
77
78
|
}
|
|
79
|
+
export function delivers(gate) {
|
|
80
|
+
return (gate.wait !== "pending" && isSettled(gate) && gate.outcome.decision !== null);
|
|
81
|
+
}
|
|
@@ -24,7 +24,7 @@ const finalStatuses = [
|
|
|
24
24
|
"stopped",
|
|
25
25
|
"cancelled",
|
|
26
26
|
];
|
|
27
|
-
export const runOperations = ["start-run", "continue-run"];
|
|
27
|
+
export const runOperations = ["start-run", "continue-run", "resume-hook"];
|
|
28
28
|
export function namesRunIntent(operationId, runId) {
|
|
29
29
|
const scope = operationScope(operationId);
|
|
30
30
|
return scope?.run === runId && runOperations.includes(scope.operation);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Reduction } from "./reduction-state.ts";
|
|
2
2
|
import { type AuthorityEvent, type AuthorityState } from "./transitions.ts";
|
|
3
|
-
export { gateContinuation } from "./gate-reduction.ts";
|
|
3
|
+
export { gateContinuation, gateDelivery } from "./gate-reduction.ts";
|
|
4
4
|
export type { Reduction } from "./reduction-state.ts";
|
|
5
5
|
export declare function startOperation(runId: string): string;
|
|
6
6
|
export declare function reduce(state: AuthorityState, event: AuthorityEvent): Reduction;
|
|
@@ -7,7 +7,7 @@ import { decided, expired, opened, registered } from "./gate-reduction.js";
|
|
|
7
7
|
import { expired as leaseExpired, granted } from "./leases.js";
|
|
8
8
|
import { applied, identity, invalid, text, } from "./reduction-state.js";
|
|
9
9
|
import { transition, } from "./transitions.js";
|
|
10
|
-
export { gateContinuation } from "./gate-reduction.js";
|
|
10
|
+
export { gateContinuation, gateDelivery } from "./gate-reduction.js";
|
|
11
11
|
function moved(type) {
|
|
12
12
|
return (state, recorded) => {
|
|
13
13
|
const result = transition(recorded.run, {
|
|
@@ -36,6 +36,10 @@ function closed(type) {
|
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
38
|
function observation(state, recorded) {
|
|
39
|
+
const expected = recorded.event.payload["expectedObservation"];
|
|
40
|
+
if (expected !== undefined &&
|
|
41
|
+
expected !== String(recorded.details.observation?.sequence ?? 0))
|
|
42
|
+
return invalid("stale-observation");
|
|
39
43
|
return applied(state, {
|
|
40
44
|
...recorded,
|
|
41
45
|
observed: observed(recorded.details, recorded.event),
|
|
@@ -75,6 +79,7 @@ function effect(rule) {
|
|
|
75
79
|
};
|
|
76
80
|
}
|
|
77
81
|
const handlers = {
|
|
82
|
+
"schedule.skipped": applied,
|
|
78
83
|
"effect.requested": effect(requested),
|
|
79
84
|
"lease.granted": effect(granted),
|
|
80
85
|
"lease.expired": effect(leaseExpired),
|
|
@@ -4,7 +4,7 @@ import type { RunClosure } from "./stop-sequence.ts";
|
|
|
4
4
|
import type { RunState } from "./transitions.ts";
|
|
5
5
|
export interface OperationSummary {
|
|
6
6
|
readonly operationId: string;
|
|
7
|
-
readonly kind: "start-run" | "continue-run" | "protected-effect";
|
|
7
|
+
readonly kind: "start-run" | "continue-run" | "resume-hook" | "protected-effect";
|
|
8
8
|
readonly releasedSequence: number | null;
|
|
9
9
|
readonly outcomes: readonly (string | null)[];
|
|
10
10
|
}
|
|
@@ -9,6 +9,7 @@ export interface RunView {
|
|
|
9
9
|
readonly workflow: string;
|
|
10
10
|
readonly state: RunStatus;
|
|
11
11
|
readonly condition: string;
|
|
12
|
+
readonly awaitedRunId: string | null;
|
|
12
13
|
readonly revision: number;
|
|
13
14
|
readonly latestSequence: number;
|
|
14
15
|
readonly pendingDecisions: readonly string[];
|
|
@@ -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
|
|
@@ -254,3 +273,8 @@ export function runView(input) {
|
|
|
254
273
|
humanInputCanHelp: assessment.humanInputCanHelp,
|
|
255
274
|
};
|
|
256
275
|
}
|
|
276
|
+
function awaitedRun(assessment, observation) {
|
|
277
|
+
return assessment.condition === "waiting-run"
|
|
278
|
+
? (observation?.evidence ?? null)
|
|
279
|
+
: null;
|
|
280
|
+
}
|
|
@@ -11,7 +11,7 @@ export interface RunState {
|
|
|
11
11
|
readonly gates: readonly string[];
|
|
12
12
|
}
|
|
13
13
|
export interface EffectIntent {
|
|
14
|
-
readonly kind: "start-run" | "continue-run" | "protected-effect";
|
|
14
|
+
readonly kind: "start-run" | "continue-run" | "resume-hook" | "protected-effect";
|
|
15
15
|
readonly runId: string;
|
|
16
16
|
readonly operationId: string;
|
|
17
17
|
}
|
|
@@ -28,7 +28,7 @@ export interface AuthorityState {
|
|
|
28
28
|
readonly questions: number;
|
|
29
29
|
readonly effects: EffectState;
|
|
30
30
|
}
|
|
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"];
|
|
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", "schedule.skipped"];
|
|
32
32
|
export type EventType = (typeof eventTypes)[number];
|
|
33
33
|
export interface AuthorityEvent {
|
|
34
34
|
readonly sequence: number;
|
|
@@ -39,8 +39,8 @@ export interface AuthorityEvent {
|
|
|
39
39
|
readonly request: string;
|
|
40
40
|
readonly payload: Readonly<Record<string, string>>;
|
|
41
41
|
}
|
|
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"];
|
|
42
|
+
export declare const numberFields: readonly ["expectedRevision", "expectedObservation", "generation", "attempt", "limit", "effectLimit", "units", "recoveryLimit", "leaseGeneration", "sourceGeneration", "capacity", "slot"];
|
|
43
|
+
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"];
|
|
44
44
|
export type NumberField = (typeof numberFields)[number];
|
|
45
45
|
export type TextField = (typeof textFields)[number];
|
|
46
46
|
export type AuthorityCommand = {
|
|
@@ -48,7 +48,7 @@ export type AuthorityCommand = {
|
|
|
48
48
|
readonly commandId: string;
|
|
49
49
|
readonly runId: string;
|
|
50
50
|
} & 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">;
|
|
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" | "schedule.skipped">;
|
|
52
52
|
export declare const terminal: readonly RunStatus[];
|
|
53
53
|
export type Transition = {
|
|
54
54
|
readonly kind: "moved";
|
|
@@ -17,9 +17,11 @@ export const eventTypes = [
|
|
|
17
17
|
"lease.expired",
|
|
18
18
|
"effect.reported",
|
|
19
19
|
"operation.reconciled",
|
|
20
|
+
"schedule.skipped",
|
|
20
21
|
];
|
|
21
22
|
export const numberFields = [
|
|
22
23
|
"expectedRevision",
|
|
24
|
+
"expectedObservation",
|
|
23
25
|
"generation",
|
|
24
26
|
"attempt",
|
|
25
27
|
"limit",
|
|
@@ -29,16 +31,19 @@ export const numberFields = [
|
|
|
29
31
|
"leaseGeneration",
|
|
30
32
|
"sourceGeneration",
|
|
31
33
|
"capacity",
|
|
34
|
+
"slot",
|
|
32
35
|
];
|
|
33
36
|
export const textFields = [
|
|
34
37
|
"parentRunId",
|
|
35
38
|
"chainId",
|
|
36
39
|
"workflow",
|
|
40
|
+
"workflowId",
|
|
37
41
|
"submission",
|
|
38
42
|
"input",
|
|
39
43
|
"resolver",
|
|
40
44
|
"gateId",
|
|
41
45
|
"gateKind",
|
|
46
|
+
"waitMode",
|
|
42
47
|
"subject",
|
|
43
48
|
"prompt",
|
|
44
49
|
"expiresAt",
|
|
@@ -66,6 +71,7 @@ export const textFields = [
|
|
|
66
71
|
"ticketStatus",
|
|
67
72
|
"issueUpdate",
|
|
68
73
|
"result",
|
|
74
|
+
"actor",
|
|
69
75
|
];
|
|
70
76
|
export const terminal = [
|
|
71
77
|
"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,7 +32,12 @@ export interface CompletionCursor {
|
|
|
31
32
|
readonly atOrBefore: number;
|
|
32
33
|
readonly terminal?: boolean;
|
|
33
34
|
}
|
|
35
|
+
export interface RunRecord extends RunState {
|
|
36
|
+
readonly sequence: number;
|
|
37
|
+
}
|
|
34
38
|
export interface AuthorityQueries {
|
|
39
|
+
readonly run: (runId: string) => Promise<RunRecord | undefined>;
|
|
40
|
+
readonly manifest: (runId: string) => Promise<ExecutionManifest | undefined>;
|
|
35
41
|
readonly document: (digest: string) => Promise<string | undefined>;
|
|
36
42
|
readonly receipt: (commandId: string) => Promise<CommandRecord | undefined>;
|
|
37
43
|
readonly eventsAfter: (cursor: EventCursor) => Promise<EventPage>;
|
|
@@ -1,9 +1,17 @@
|
|
|
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 run_id, status, revision, workflow, paused_from, gates, sequence FROM runs WHERE run_id = ?", [runId]);
|
|
10
|
+
if (row === undefined)
|
|
11
|
+
return undefined;
|
|
12
|
+
const record = runRow(row);
|
|
13
|
+
return { ...storedRun(record), sequence: record.sequence };
|
|
14
|
+
}
|
|
7
15
|
async function runOrigins(connection, cursor) {
|
|
8
16
|
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
17
|
return Object.fromEntries(rows.map((row) => [
|
|
@@ -122,6 +130,13 @@ export function authorityQueries(read) {
|
|
|
122
130
|
return links;
|
|
123
131
|
};
|
|
124
132
|
return {
|
|
133
|
+
run: (runId) => read((connection) => run(connection, runId)),
|
|
134
|
+
manifest: (runId) => read(async (connection) => {
|
|
135
|
+
const row = await connection.get("SELECT d.manifest FROM runs r JOIN definitions d ON d.pin = r.workflow WHERE r.run_id = ?", [runId]);
|
|
136
|
+
return row === undefined
|
|
137
|
+
? undefined
|
|
138
|
+
: readExecutionManifest(JSON.parse(text(row, "manifest")));
|
|
139
|
+
}),
|
|
125
140
|
document: (digest) => read((connection) => documentBody(connection, digest)),
|
|
126
141
|
receipt: (commandId) => read((connection) => receipt(connection, commandId)),
|
|
127
142
|
eventsAfter: (cursor) => read((connection) => eventsAfter(connection, cursor)),
|