cloving 1.1.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 +584 -144
- package/assets/watch-fonts/fira-code-OFL.md +93 -0
- package/assets/watch-fonts/fira-code-latin-400-normal.woff2 +0 -0
- package/assets/watch-fonts/fira-code-latin-500-normal.woff2 +0 -0
- package/assets/watch-fonts/heebo-OFL.md +93 -0
- package/assets/watch-fonts/heebo-latin-500-normal.woff2 +0 -0
- package/assets/watch-fonts/heebo-latin-700-normal.woff2 +0 -0
- package/assets/watch-fonts/heebo-latin-800-normal.woff2 +0 -0
- package/assets/watch-fonts/manifest.json +112 -0
- package/assets/watch-fonts/space-grotesk-OFL.md +93 -0
- package/assets/watch-fonts/space-grotesk-latin-400-normal.woff2 +0 -0
- package/assets/watch-fonts/space-grotesk-latin-500-normal.woff2 +0 -0
- package/assets/watch-fonts/space-grotesk-latin-600-normal.woff2 +0 -0
- package/assets/watch-fonts/space-grotesk-latin-700-normal.woff2 +0 -0
- 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 +2 -0
- package/dist/src/authority/commands.js +49 -8
- package/dist/src/authority/dispatch-decision.d.ts +1 -0
- package/dist/src/authority/dispatch-decision.js +7 -4
- package/dist/src/authority/events.js +2 -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/handoff-chain.d.ts +24 -0
- package/dist/src/authority/handoff-chain.js +46 -0
- package/dist/src/authority/operations.js +1 -1
- package/dist/src/authority/reconciliation.d.ts +1 -0
- package/dist/src/authority/reconciliation.js +18 -11
- 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 +9 -0
- package/dist/src/broker/actor/authority-delivery.js +1 -0
- package/dist/src/broker/actor/authority-queries.d.ts +11 -1
- package/dist/src/broker/actor/authority-queries.js +67 -3
- 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 +3 -1
- package/dist/src/broker/actor/delivery-intents.js +4 -4
- package/dist/src/broker/actor/effect-delivery.js +13 -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 +26 -5
- 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 +3 -1
- package/dist/src/cli/render.js +102 -39
- 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 +74 -45
- 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 +12 -1
- package/dist/src/cli/watch-board-view.js +64 -12
- package/dist/src/cli/watch-board.d.ts +7 -1
- package/dist/src/cli/watch-board.js +61 -16
- 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 +12 -3
- 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.d.ts +10 -4
- package/dist/src/cli/watch-model.js +49 -59
- package/dist/src/cli/watch-page.js +67 -14
- package/dist/src/cli/watch-phases.js +3 -3
- 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-command.d.ts +5 -2
- package/dist/src/cli/watch-pr-command.js +41 -4
- package/dist/src/cli/watch-pr-identity.d.ts +14 -2
- package/dist/src/cli/watch-pr-identity.js +25 -0
- package/dist/src/cli/watch-pr-observer.d.ts +1 -0
- package/dist/src/cli/watch-pr-observer.js +48 -6
- package/dist/src/cli/watch-pull-request.d.ts +12 -0
- package/dist/src/cli/watch-pull-request.js +134 -0
- package/dist/src/cli/watch-reads.d.ts +7 -1
- package/dist/src/cli/watch-reads.js +42 -20
- package/dist/src/cli/watch-render.d.ts +23 -2
- package/dist/src/cli/watch-render.js +2 -1
- package/dist/src/cli/watch-server.js +56 -7
- package/dist/src/cli/watch-turn.d.ts +4 -1
- package/dist/src/cli/watch-turn.js +38 -2
- package/dist/src/cli/watch-usage.js +5 -1
- package/dist/src/cli/watch-view.d.ts +10 -17
- package/dist/src/cli/watch-view.js +33 -77
- 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 +20 -5
- package/dist/src/daemon/claude-turn.js +116 -53
- package/dist/src/daemon/claude-worker.d.ts +3 -5
- package/dist/src/daemon/claude-worker.js +64 -80
- 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 +3 -30
- package/dist/src/daemon/daemon.js +132 -110
- 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 +7 -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-calls.d.ts +4 -0
- package/dist/src/daemon/github-calls.js +16 -7
- 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.d.ts +6 -0
- package/dist/src/daemon/github-ci.js +251 -0
- package/dist/src/daemon/github-merge-call.d.ts +16 -0
- package/dist/src/daemon/github-merge-call.js +73 -0
- package/dist/src/daemon/github-merge.d.ts +3 -5
- package/dist/src/daemon/github-merge.js +59 -98
- package/dist/src/daemon/github-methods.d.ts +28 -0
- package/dist/src/daemon/github-methods.js +90 -16
- package/dist/src/daemon/github-operation.d.ts +3 -0
- package/dist/src/daemon/github-retry.d.ts +6 -0
- package/dist/src/daemon/github-retry.js +13 -0
- package/dist/src/daemon/github-ticket-status.js +27 -1
- package/dist/src/daemon/github-worker.js +2 -1
- package/dist/src/daemon/handoff-worker.d.ts +10 -0
- package/dist/src/daemon/handoff-worker.js +232 -0
- package/dist/src/daemon/issue-queue.d.ts +2 -0
- package/dist/src/daemon/issue-queue.js +92 -63
- package/dist/src/daemon/notify-journal.d.ts +18 -0
- package/dist/src/daemon/notify-journal.js +108 -0
- package/dist/src/daemon/notify-message.js +2 -1
- package/dist/src/daemon/notify.js +177 -37
- 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 +5 -0
- package/dist/src/daemon/retrying-turn.js +145 -21
- 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-dependency-waits.d.ts +18 -0
- package/dist/src/daemon/ticket-dependency-waits.js +60 -0
- package/dist/src/daemon/ticket-registration.d.ts +10 -8
- package/dist/src/daemon/ticket-registration.js +146 -47
- package/dist/src/daemon/ticket-source.d.ts +4 -1
- package/dist/src/daemon/ticket-source.js +8 -2
- 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-visibility.d.ts +2 -0
- package/dist/src/decision-visibility.js +10 -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 +9 -0
- package/dist/src/execution-pin.js +86 -2
- 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 +3 -2
- package/dist/src/host/start-delivery.js +11 -4
- package/dist/src/host/step-bridge-host.d.ts +6 -19
- package/dist/src/host/step-bridge-host.js +57 -55
- package/dist/src/host/world-reconciliation.d.ts +1 -0
- package/dist/src/host/world-reconciliation.js +3 -0
- package/dist/src/host/world-runs.js +5 -0
- package/dist/src/issue-identity.d.ts +6 -0
- package/dist/src/issue-identity.js +23 -0
- 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/queue-runs.d.ts +3 -0
- package/dist/src/service/queue-runs.js +39 -0
- package/dist/src/service/registry.d.ts +22 -3
- package/dist/src/service/registry.js +51 -8
- package/dist/src/service/replies.d.ts +10 -0
- package/dist/src/service/replies.js +12 -0
- package/dist/src/service/run-handlers.js +45 -54
- 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 +21 -2
- package/dist/src/service/service.js +23 -5
- package/dist/src/service/submission-handler.js +70 -19
- package/dist/src/service/worker-port.d.ts +1 -0
- package/dist/src/service/worker-totals.js +10 -1
- package/dist/src/step-bridge.d.ts +32 -0
- package/dist/src/steps/decision-gate.d.ts +2 -1
- package/dist/src/steps/decision-gate.js +7 -0
- package/dist/src/steps/handoff.d.ts +2 -0
- package/dist/src/steps/handoff.js +13 -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-dependencies.d.ts +1 -0
- package/dist/src/ticket-dependencies.js +15 -0
- package/dist/src/ticket-status-stream.d.ts +9 -0
- package/dist/src/ticket-status-stream.js +94 -0
- package/dist/src/ticket-status.js +7 -4
- package/dist/src/token-prices.d.ts +14 -4
- package/dist/src/token-prices.js +56 -11
- package/dist/src/turn-profile.d.ts +1 -0
- package/dist/src/turn-profile.js +8 -1
- package/dist/src/worker-usage.d.ts +25 -0
- package/dist/src/worker-usage.js +58 -1
- package/dist/src/workflow-admission.d.ts +6 -0
- package/dist/src/workflow-candidate.d.ts +7 -2
- package/dist/src/workflow-candidate.js +48 -5
- package/dist/src/workflow-contracts.d.ts +2 -0
- package/dist/src/workflow-contracts.js +8 -3
- package/dist/src/workflow-declaration.d.ts +31 -2
- package/dist/src/workflow-declaration.js +140 -16
- package/dist/src/workflow-discovery.d.ts +19 -0
- package/dist/src/workflow-discovery.js +36 -0
- package/dist/src/workflow-refusals.d.ts +6 -0
- package/dist/src/workflow-refusals.js +42 -0
- package/dist/src/workflow-schedule.d.ts +22 -0
- package/dist/src/workflow-schedule.js +53 -0
- package/dist/src/workflows.d.ts +12 -1
- package/dist/src/workflows.js +9 -0
- package/dist/tools/admit-workflow.d.ts +14 -0
- package/dist/tools/admit-workflow.js +107 -0
- 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 +21 -0
- package/dist/tools/self-host-project.js +224 -0
- 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 +106 -135
- package/dist/tools/workflow-bundle-dependencies.d.ts +5 -0
- package/dist/tools/workflow-bundle-dependencies.js +93 -0
- package/dist/tools/workflow-bundles.d.ts +20 -0
- package/dist/tools/workflow-bundles.js +173 -0
- package/dist/tools/workflow-candidate-counts.d.ts +12 -0
- package/dist/tools/workflow-candidate-counts.js +266 -0
- 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 +13 -0
- package/dist/tools/workflow-candidate-program.js +106 -0
- package/dist/tools/workflow-candidate-source.d.ts +6 -0
- package/dist/tools/workflow-candidate-source.js +169 -0
- package/dist/tools/workflow-candidate-syntax.d.ts +21 -0
- package/dist/tools/workflow-candidate-syntax.js +263 -0
- 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 +18 -0
- package/dist/tools/workflow-folder-capture.js +261 -0
- package/dist/tools/workflow-folders.d.ts +49 -0
- package/dist/tools/workflow-folders.js +203 -0
- package/dist/tools/workflow-source-effects.d.ts +10 -0
- package/dist/tools/workflow-source-effects.js +213 -0
- 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-prd.js +71 -3
- package/dist/workflows/develop-ticket.js +6 -1
- package/dist/workflows/ticket-prompts.js +17 -3
- package/package.json +66 -6
- 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 -24
- package/dist/src/chats/analysis-batches.js +0 -83
- 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 -12
- package/dist/src/chats/analysis-input.js +0 -83
- package/dist/src/chats/analysis-links.d.ts +0 -2
- package/dist/src/chats/analysis-links.js +0 -25
- package/dist/src/chats/analysis-prompt.d.ts +0 -10
- package/dist/src/chats/analysis-prompt.js +0 -16
- package/dist/src/chats/analysis-proposal.d.ts +0 -2
- package/dist/src/chats/analysis-proposal.js +0 -32
- 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 -3
- package/dist/src/chats/analysis-shape.js +0 -228
- 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/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/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 -22
- package/dist/src/daemon/analysis-worker.js +0 -219
- package/dist/src/daemon/chats-files.d.ts +0 -15
- package/dist/src/daemon/chats-files.js +0 -113
- package/dist/src/daemon/chats-worker.d.ts +0 -12
- package/dist/src/daemon/chats-worker.js +0 -200
- package/dist/workflows/analyze-chats.d.ts +0 -10
- package/dist/workflows/analyze-chats.declaration.json +0 -9
- package/dist/workflows/analyze-chats.js +0 -73
|
@@ -1,6 +1,8 @@
|
|
|
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";
|
|
5
|
+
import { type RunLinks, type RunOrigins } from "../../authority/handoff-chain.ts";
|
|
4
6
|
export interface CommandRecord {
|
|
5
7
|
readonly commandId: string;
|
|
6
8
|
readonly sequence: number;
|
|
@@ -28,14 +30,22 @@ export interface Sequences {
|
|
|
28
30
|
export interface CompletionCursor {
|
|
29
31
|
readonly runId: string;
|
|
30
32
|
readonly atOrBefore: number;
|
|
33
|
+
readonly terminal?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface RunRecord extends RunState {
|
|
36
|
+
readonly sequence: number;
|
|
31
37
|
}
|
|
32
38
|
export interface AuthorityQueries {
|
|
39
|
+
readonly run: (runId: string) => Promise<RunRecord | undefined>;
|
|
40
|
+
readonly manifest: (runId: string) => Promise<ExecutionManifest | undefined>;
|
|
33
41
|
readonly document: (digest: string) => Promise<string | undefined>;
|
|
34
42
|
readonly receipt: (commandId: string) => Promise<CommandRecord | undefined>;
|
|
35
43
|
readonly eventsAfter: (cursor: EventCursor) => Promise<EventPage>;
|
|
36
44
|
readonly latestCompletion: (cursor: CompletionCursor) => Promise<PublishedEvent | undefined>;
|
|
37
45
|
readonly sequences: () => Promise<Sequences>;
|
|
38
46
|
readonly workflowIds: () => Promise<Readonly<Record<string, string>>>;
|
|
47
|
+
readonly runOrigins: () => Promise<RunOrigins>;
|
|
48
|
+
readonly runLinks: () => Promise<Readonly<Record<string, RunLinks>>>;
|
|
39
49
|
}
|
|
40
50
|
export type Read = <Value>(query: (connection: SqlConnection) => Promise<Value>) => Promise<Value>;
|
|
41
51
|
export declare function guardedRead(access: {
|
|
@@ -1,8 +1,27 @@
|
|
|
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, 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";
|
|
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
|
+
}
|
|
15
|
+
async function runOrigins(connection, cursor) {
|
|
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]);
|
|
17
|
+
return Object.fromEntries(rows.map((row) => [
|
|
18
|
+
text(row, "run_id"),
|
|
19
|
+
{
|
|
20
|
+
parentRunId: optionalText(row, "parent_run_id"),
|
|
21
|
+
chainId: text(row, "chain_id"),
|
|
22
|
+
},
|
|
23
|
+
]));
|
|
24
|
+
}
|
|
6
25
|
async function receipt(connection, commandId) {
|
|
7
26
|
const row = await connection.get("SELECT c.request, c.sequence, e.run_id, e.recorded_at FROM commands c JOIN events e ON e.sequence = c.sequence WHERE c.command_id = ?", [commandId]);
|
|
8
27
|
if (row === undefined)
|
|
@@ -51,7 +70,10 @@ function publishedEvents(rows) {
|
|
|
51
70
|
}));
|
|
52
71
|
}
|
|
53
72
|
async function latestCompletion(connection, cursor) {
|
|
54
|
-
const
|
|
73
|
+
const types = cursor.terminal === true
|
|
74
|
+
? "type IN ('run.completed', 'run.failed', 'run.cancelled')"
|
|
75
|
+
: "type = 'run.completed'";
|
|
76
|
+
const row = await connection.get(`SELECT sequence, type, run_id, command_id, recorded_at, payload FROM events WHERE run_id = ? AND ${types} AND sequence <= ? ORDER BY sequence DESC LIMIT 1`, [cursor.runId, cursor.atOrBefore]);
|
|
55
77
|
return row === undefined ? undefined : publishedEvents([row])[0];
|
|
56
78
|
}
|
|
57
79
|
async function sequences(connection) {
|
|
@@ -66,6 +88,28 @@ async function workflowIds(connection) {
|
|
|
66
88
|
const rows = await connection.all("SELECT d.run_id, json_extract(s.body, '$.workflowId') AS workflow_id FROM run_details d JOIN documents s ON s.digest = d.submission WHERE json_valid(s.body) AND json_type(s.body, '$.workflowId') = 'text'");
|
|
67
89
|
return Object.fromEntries(rows.map((row) => [text(row, "run_id"), text(row, "workflow_id")]));
|
|
68
90
|
}
|
|
91
|
+
function cachedOrigins(read) {
|
|
92
|
+
let sequence = 0;
|
|
93
|
+
let origins = {};
|
|
94
|
+
let pending = Promise.resolve();
|
|
95
|
+
return () => {
|
|
96
|
+
const result = pending.then(() => read(async (connection) => {
|
|
97
|
+
const through = await latestSequence(connection);
|
|
98
|
+
if (through === sequence)
|
|
99
|
+
return origins;
|
|
100
|
+
const added = await runOrigins(connection, {
|
|
101
|
+
after: sequence,
|
|
102
|
+
through,
|
|
103
|
+
});
|
|
104
|
+
if (Object.keys(added).length > 0)
|
|
105
|
+
origins = { ...origins, ...added };
|
|
106
|
+
sequence = through;
|
|
107
|
+
return origins;
|
|
108
|
+
}));
|
|
109
|
+
pending = result.then(() => undefined, () => undefined);
|
|
110
|
+
return result;
|
|
111
|
+
};
|
|
112
|
+
}
|
|
69
113
|
export function guardedRead(access) {
|
|
70
114
|
const { reader, ready } = access;
|
|
71
115
|
return async (query) => {
|
|
@@ -74,12 +118,32 @@ export function guardedRead(access) {
|
|
|
74
118
|
};
|
|
75
119
|
}
|
|
76
120
|
export function authorityQueries(read) {
|
|
121
|
+
const origins = cachedOrigins(read);
|
|
122
|
+
let linkedOrigins;
|
|
123
|
+
let links = {};
|
|
124
|
+
const currentLinks = async () => {
|
|
125
|
+
const current = await origins();
|
|
126
|
+
if (current !== linkedOrigins) {
|
|
127
|
+
links = runLinks(current);
|
|
128
|
+
linkedOrigins = current;
|
|
129
|
+
}
|
|
130
|
+
return links;
|
|
131
|
+
};
|
|
77
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
|
+
}),
|
|
78
140
|
document: (digest) => read((connection) => documentBody(connection, digest)),
|
|
79
141
|
receipt: (commandId) => read((connection) => receipt(connection, commandId)),
|
|
80
142
|
eventsAfter: (cursor) => read((connection) => eventsAfter(connection, cursor)),
|
|
81
143
|
latestCompletion: (cursor) => read((connection) => latestCompletion(connection, cursor)),
|
|
82
144
|
sequences: () => read(sequences),
|
|
83
145
|
workflowIds: () => read(workflowIds),
|
|
146
|
+
runOrigins: origins,
|
|
147
|
+
runLinks: currentLinks,
|
|
84
148
|
};
|
|
85
149
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { integer, text } from "../../storage/domain-rows.js";
|
|
2
2
|
import { intentKind } from "../authority-restore.js";
|
|
3
|
+
import { commandLimits } from "../../command-settings.js";
|
|
3
4
|
export const unserializable = {
|
|
4
5
|
kind: "rejected",
|
|
5
6
|
reason: "invalid-command",
|
|
@@ -16,7 +17,16 @@ export const tooLarge = {
|
|
|
16
17
|
detail: `A request has at most ${String(maximumRequestBytes)} bytes.`,
|
|
17
18
|
};
|
|
18
19
|
export function oversized(request) {
|
|
19
|
-
|
|
20
|
+
const command = request["command"];
|
|
21
|
+
const report = typeof command === "object" &&
|
|
22
|
+
command !== null &&
|
|
23
|
+
!Array.isArray(command) &&
|
|
24
|
+
command["kind"] === "report-effect" &&
|
|
25
|
+
command["worker"] === "command";
|
|
26
|
+
const limit = report
|
|
27
|
+
? maximumRequestBytes + commandLimits.stdoutBytes * 6
|
|
28
|
+
: maximumRequestBytes;
|
|
29
|
+
return Buffer.byteLength(JSON.stringify(request)) > limit;
|
|
20
30
|
}
|
|
21
31
|
export function failed(error) {
|
|
22
32
|
const name = String(Reflect.get(Object(error), "name"));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { eligibleIntents, } from "../../authority/reducer.js";
|
|
2
|
-
import { loadProjections, } from "../../storage/decision-snapshots.js";
|
|
2
|
+
import { loadOperationSnapshot, loadProjections, } from "../../storage/decision-snapshots.js";
|
|
3
3
|
import { loadEvents } from "../../storage/domain-rows.js";
|
|
4
4
|
import { pinnedResumption } from "../authority-admission.js";
|
|
5
5
|
import { currentState, intentKind, storedDefinitions, storedEvents, } from "../authority-restore.js";
|
|
@@ -40,7 +40,7 @@ export function authoritySession(parts) {
|
|
|
40
40
|
return storedEvents(await parts.reader.connection(loadEvents));
|
|
41
41
|
},
|
|
42
42
|
eligibleIntents: async () => eligible(await projected(session)),
|
|
43
|
-
operations: async () => operationRecords(await
|
|
43
|
+
operations: async () => operationRecords(await read(loadOperationSnapshot)),
|
|
44
44
|
resumePinned: async (runId, manifest) => {
|
|
45
45
|
const snapshot = await projected(session);
|
|
46
46
|
return pinnedResumption(currentState(snapshot), {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { recoveryBound } from "../../authority/commands.js";
|
|
2
2
|
import { lineLogger } from "./authority-logger.js";
|
|
3
|
+
import { commandLimits } from "../../command-settings.js";
|
|
3
4
|
export const authorityTiming = {
|
|
4
5
|
leaseMilliseconds: 2_000,
|
|
5
6
|
renewalMilliseconds: 500,
|
|
@@ -50,6 +51,9 @@ export function librarySettings(timing, log) {
|
|
|
50
51
|
return {
|
|
51
52
|
tableNamePrefix: "solid_",
|
|
52
53
|
maxAttempts: 1,
|
|
54
|
+
maxActivationDurationMilliseconds: 50,
|
|
55
|
+
maxPayloadBytes: 900_000 + commandLimits.stdoutBytes * 6,
|
|
56
|
+
maxResultBytes: 900_000 + commandLimits.stdoutBytes * 6,
|
|
53
57
|
logger: lineLogger(log ?? standardError),
|
|
54
58
|
leaseDurationMilliseconds: timing.leaseMilliseconds,
|
|
55
59
|
leaseRenewalIntervalMilliseconds: timing.renewalMilliseconds,
|
|
@@ -18,6 +18,7 @@ export interface DeliveryIntent extends EffectIntent, Partial<DeliveryDecision>,
|
|
|
18
18
|
readonly workflow: string;
|
|
19
19
|
readonly inputDigest: string;
|
|
20
20
|
readonly purpose: Purpose;
|
|
21
|
+
readonly commandDeadline?: string;
|
|
21
22
|
}
|
|
22
23
|
export type ProtectedIntent = DeliveryIntent & EffectArguments;
|
|
23
24
|
export type Undigested = Omit<DeliveryIntent, "inputDigest" | "purpose">;
|
|
@@ -51,9 +52,10 @@ export interface Delivery {
|
|
|
51
52
|
readonly worker?: string;
|
|
52
53
|
} | AdapterOutcome>;
|
|
53
54
|
readonly reconcile: (intent: DeliveryIntent, signal: AbortSignal) => Promise<AdapterOutcome>;
|
|
55
|
+
readonly retry?: Delivery["reconcile"];
|
|
54
56
|
readonly stop?: (intent: DeliveryIntent, signal: AbortSignal) => Promise<AdapterOutcome>;
|
|
55
57
|
}
|
|
56
|
-
export type AvailableManifest = (pinned: ExecutionManifest) => ExecutionManifest | undefined
|
|
58
|
+
export type AvailableManifest = (pinned: ExecutionManifest) => ExecutionManifest | undefined | Promise<ExecutionManifest | undefined>;
|
|
57
59
|
export declare function intentDigest(intent: Undigested): string;
|
|
58
60
|
export declare function deliveryIntent(intent: Undigested): DeliveryIntent;
|
|
59
61
|
export declare function protectedIntent(state: AuthorityState, attempt: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import {
|
|
2
|
+
import { delivers, isSettled } from "../../authority/gates.js";
|
|
3
3
|
import { eligibleIntents, } from "../../authority/reducer.js";
|
|
4
|
-
import {
|
|
4
|
+
import { gateDelivery } from "../../authority/reduction.js";
|
|
5
5
|
export function intentDigest(intent) {
|
|
6
6
|
const base = [intent.kind, intent.runId, intent.operationId, intent.workflow];
|
|
7
7
|
const bound = intent.gateId === undefined
|
|
@@ -37,7 +37,7 @@ export function protectedIntent(state, attempt) {
|
|
|
37
37
|
})));
|
|
38
38
|
}
|
|
39
39
|
export function gateDecision(gate) {
|
|
40
|
-
if (gate === undefined || gate.kind === "untyped" || !
|
|
40
|
+
if (gate === undefined || gate.kind === "untyped" || !delivers(gate))
|
|
41
41
|
return null;
|
|
42
42
|
return {
|
|
43
43
|
gateId: gate.gateId,
|
|
@@ -51,7 +51,7 @@ function workflowOf(state, runId) {
|
|
|
51
51
|
function decisionOf(state, intent) {
|
|
52
52
|
return gateDecision(Object.values(state.gates).find((gate) => gate.runId === intent.runId &&
|
|
53
53
|
isSettled(gate) &&
|
|
54
|
-
|
|
54
|
+
gateDelivery(gate).operationId === intent.operationId));
|
|
55
55
|
}
|
|
56
56
|
export function observingIntent(state, attempt) {
|
|
57
57
|
const { intent, purpose } = attempt;
|
|
@@ -4,6 +4,7 @@ import { budgetRow } from "../../storage/effect-rows.js";
|
|
|
4
4
|
import { effectInputDigest, storedBudget } from "../effect-restore.js";
|
|
5
5
|
import { settlement } from "./adapter-outcomes.js";
|
|
6
6
|
import { pinned } from "./pin-check.js";
|
|
7
|
+
import { commandLimits } from "../../command-settings.js";
|
|
7
8
|
const absent = {
|
|
8
9
|
attempt: undefined,
|
|
9
10
|
released: false,
|
|
@@ -51,7 +52,9 @@ async function called(parts, call) {
|
|
|
51
52
|
const adapterCall = parts.delivery[name]?.bind(parts.delivery);
|
|
52
53
|
if (adapterCall === undefined)
|
|
53
54
|
return { kind: "unknown", reason: "stop-not-supported" };
|
|
54
|
-
return settlement(await parts.calls.call(intent.operationId, (signal) => adapterCall(intent, signal)),
|
|
55
|
+
return settlement(await parts.calls.call(intent.operationId, (signal) => adapterCall(intent, signal)), intent.capability === "command"
|
|
56
|
+
? commandLimits.resultBytes
|
|
57
|
+
: parts.effects.resultBytes);
|
|
55
58
|
}
|
|
56
59
|
const confirmations = ["stopped", "completed", "failed"];
|
|
57
60
|
async function stopRequested(parts, intent) {
|
|
@@ -69,9 +72,16 @@ function decided(parts, attempt) {
|
|
|
69
72
|
}), {
|
|
70
73
|
intent: { ...intent, computedDigest: effectInputDigest(intent) },
|
|
71
74
|
now,
|
|
75
|
+
...(attempt.mode === undefined ? {} : { mode: attempt.mode }),
|
|
72
76
|
}));
|
|
73
77
|
}
|
|
74
78
|
const withheld = { kind: "withheld" };
|
|
79
|
+
async function retryEffect(parts, attempt) {
|
|
80
|
+
const retry = await decided(parts, { ...attempt, mode: "retry" });
|
|
81
|
+
return retry === "send"
|
|
82
|
+
? called(parts, { intent: attempt.intent, name: "retry" })
|
|
83
|
+
: attempt.known;
|
|
84
|
+
}
|
|
75
85
|
function unsent(decision) {
|
|
76
86
|
return decision === "stale" ? withheld : { kind: decision };
|
|
77
87
|
}
|
|
@@ -83,6 +93,8 @@ async function attempted(parts, attempt) {
|
|
|
83
93
|
if (intent.purpose === "stop")
|
|
84
94
|
return stopRequested(parts, intent);
|
|
85
95
|
const known = await called(parts, { intent, name: "reconcile" });
|
|
96
|
+
if (known.kind === "unknown" && parts.delivery.retry !== undefined)
|
|
97
|
+
return retryEffect(parts, { ...attempt, known });
|
|
86
98
|
if (known.kind !== "absent" || intent.purpose === "reconcile")
|
|
87
99
|
return known;
|
|
88
100
|
if (first !== "send")
|
|
@@ -16,6 +16,7 @@ export interface EffectQueries {
|
|
|
16
16
|
readonly dueLeases: (instant: string) => Promise<readonly DueLease[]>;
|
|
17
17
|
readonly stops: (runId: string) => Promise<readonly string[]>;
|
|
18
18
|
readonly closure: (runId: string) => Promise<RunClosure>;
|
|
19
|
+
readonly settledAt: (runId: string) => Promise<number | null>;
|
|
19
20
|
}
|
|
20
21
|
export interface DueLease {
|
|
21
22
|
readonly runId: string;
|
|
@@ -3,6 +3,12 @@ import { integer, optionalInteger, optionalText, text, } from "../../storage/dom
|
|
|
3
3
|
import { budgetColumns, budgetRow, evidenceColumns, evidenceRow, operationColumns, operationRow, } from "../../storage/effect-rows.js";
|
|
4
4
|
import { storedBudget } from "../effect-restore.js";
|
|
5
5
|
import { stopping } from "./stop-turn.js";
|
|
6
|
+
async function settledAt(connection, runId) {
|
|
7
|
+
const rows = await connection.all("SELECT recorded_at FROM events WHERE sequence IN (SELECT settled_sequence FROM operations WHERE run_id = ? UNION ALL SELECT min(e.sequence) FROM events e JOIN stopped_operations s ON s.run_id = e.run_id AND s.operation_id = json_extract(e.payload, '$.operationId') WHERE e.run_id = ? AND (EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = s.operation_id AND d.outcome = 'sent') OR (SELECT d.outcome FROM deliveries d WHERE d.operation_id = s.operation_id ORDER BY d.staged_sequence DESC, d.rowid DESC LIMIT 1) NOT IN ('withheld', 'blocked', 'absent')) AND ((e.type = 'run.observed' AND json_extract(e.payload, '$.condition') = 'stopped') OR (e.type = 'operation.reconciled' AND json_extract(e.payload, '$.outcome') = 'stopped')) GROUP BY s.operation_id)", [runId, runId]);
|
|
8
|
+
if (rows.length === 0)
|
|
9
|
+
return null;
|
|
10
|
+
return rows.reduce((latest, row) => Math.max(latest, Date.parse(text(row, "recorded_at"))), -Infinity);
|
|
11
|
+
}
|
|
6
12
|
async function storedClosure(connection, scope) {
|
|
7
13
|
const { subjects, cancelledSequence } = await stopping(connection, scope.runId);
|
|
8
14
|
return runClosure(subjects, {
|
|
@@ -70,6 +76,7 @@ export function effectQueries(read, settings) {
|
|
|
70
76
|
return {
|
|
71
77
|
stops: (runId) => read((connection) => stops(connection, runId)),
|
|
72
78
|
closure: (runId) => read((connection) => storedClosure(connection, { runId, stopLimit: settings.stopLimit })),
|
|
79
|
+
settledAt: (runId) => read((connection) => settledAt(connection, runId)),
|
|
73
80
|
budget: (runId) => read((connection) => budget(connection, runId)),
|
|
74
81
|
dueLeases: (instant) => read((connection) => dueLeases(connection, instant)),
|
|
75
82
|
operation: (operationId) => read((connection) => operation(connection, operationId)),
|
|
@@ -7,6 +7,6 @@ export async function pinned(connection, check) {
|
|
|
7
7
|
const stored = readExecutionManifest(JSON.parse(text(await connection.get("SELECT manifest FROM definitions WHERE pin = ?", [
|
|
8
8
|
workflow,
|
|
9
9
|
]), "manifest")));
|
|
10
|
-
const current = available(stored);
|
|
10
|
+
const current = await available(stored);
|
|
11
11
|
return (current !== undefined && resumePinned(stored, current).kind === "admitted");
|
|
12
12
|
}
|
|
@@ -15,7 +15,7 @@ function present(state, planning) {
|
|
|
15
15
|
stopped: subject.stopped || state.effects.stops[subject.operationId] !== undefined,
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
-
const kinds = ["start-run", "continue-run"];
|
|
18
|
+
const kinds = ["start-run", "continue-run", "resume-hook"];
|
|
19
19
|
function intentOf(state, attempt) {
|
|
20
20
|
const { runId, operationId, purpose } = attempt;
|
|
21
21
|
const kind = kinds.find((candidate) => candidate === attempt.kind);
|
|
@@ -76,7 +76,7 @@ export async function adoptionTurn(connection) {
|
|
|
76
76
|
return latest;
|
|
77
77
|
}
|
|
78
78
|
export async function recoverableIntents(connection) {
|
|
79
|
-
const rows = await connection.all("SELECT o.operation_id, o.kind, o.run_id, r.workflow FROM outbox o JOIN runs r ON r.run_id = o.run_id WHERE o.released_sequence IS NULL AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = o.operation_id AND d.outcome IS NULL) AND ((o.kind = 'start-run' AND r.status = 'queued') OR (o.kind
|
|
79
|
+
const rows = await connection.all("SELECT o.operation_id, o.kind, o.run_id, r.workflow FROM outbox o JOIN runs r ON r.run_id = o.run_id WHERE o.released_sequence IS NULL AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = o.operation_id AND d.outcome IS NULL) AND ((o.kind = 'start-run' AND r.status = 'queued') OR (o.kind IN ('continue-run', 'resume-hook') AND r.status = 'running') OR (o.kind = 'protected-effect' AND r.status = 'running' AND EXISTS (SELECT 1 FROM operations p WHERE p.operation_id = o.operation_id AND p.status = 'dispatch-pending'))) ORDER BY o.created_sequence, o.rowid LIMIT ?", [recoveryBatch]);
|
|
80
80
|
const intents = [];
|
|
81
81
|
for (const row of rows) {
|
|
82
82
|
const intent = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { parseCommand } from "../authority/commands.js";
|
|
2
|
-
import { readExecutionManifest, resumePinned } from "../execution-pin.js";
|
|
2
|
+
import { executionCapabilities, readExecutionManifest, resumePinned, } from "../execution-pin.js";
|
|
3
3
|
import { effectInputDigest } from "./effect-restore.js";
|
|
4
4
|
import { workflowPin } from "./workflow-pin.js";
|
|
5
5
|
const admissible = { kind: "admissible", definitions: new Map() };
|
|
@@ -15,7 +15,7 @@ const admission = (command, context) => {
|
|
|
15
15
|
const pin = workflowPin(stored);
|
|
16
16
|
if (command.workflow !== pin)
|
|
17
17
|
return { kind: "rejected", reason: "workflow-pin-mismatch" };
|
|
18
|
-
const capabilities =
|
|
18
|
+
const capabilities = executionCapabilities(stored);
|
|
19
19
|
if ((command.capabilities ?? capabilities) !== capabilities)
|
|
20
20
|
return { kind: "rejected", reason: "capability-pin-mismatch" };
|
|
21
21
|
return { kind: "admissible", definitions: new Map([[pin, stored]]) };
|
|
@@ -33,6 +33,25 @@ const resumption = (command, context) => {
|
|
|
33
33
|
? resumed
|
|
34
34
|
: admissible;
|
|
35
35
|
};
|
|
36
|
+
const commandEffect = (command, context) => {
|
|
37
|
+
const pin = context.state.runs[command.runId]?.workflow ?? "";
|
|
38
|
+
const names = context.definitions.get(pin)?.commands ?? [];
|
|
39
|
+
const method = String(command.method);
|
|
40
|
+
if (!method.startsWith("run:") || !names.includes(method.slice(4)))
|
|
41
|
+
return { kind: "rejected", reason: "command-not-declared" };
|
|
42
|
+
return unpinned(command, context);
|
|
43
|
+
};
|
|
44
|
+
const handoffEffect = (command, context) => {
|
|
45
|
+
if (command.capability !== "handoff")
|
|
46
|
+
return unpinned(command, context);
|
|
47
|
+
const pin = context.state.runs[command.runId]?.workflow ?? "";
|
|
48
|
+
const declaration = context.definitions.get(pin);
|
|
49
|
+
if (!declaration?.handoffs?.includes(String(command.target)))
|
|
50
|
+
return { kind: "rejected", reason: "handoff-not-declared" };
|
|
51
|
+
if (command.units !== 1 || command.method !== "run")
|
|
52
|
+
return { kind: "rejected", reason: "invalid-handoff-request" };
|
|
53
|
+
return unpinned(command, context);
|
|
54
|
+
};
|
|
36
55
|
const effectRequest = (command, context) => {
|
|
37
56
|
const computed = effectInputDigest({
|
|
38
57
|
capability: String(command.capability),
|
|
@@ -40,9 +59,11 @@ const effectRequest = (command, context) => {
|
|
|
40
59
|
target: String(command.target),
|
|
41
60
|
payload: String(command.payload),
|
|
42
61
|
});
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
62
|
+
if (computed !== command.inputDigest)
|
|
63
|
+
return { kind: "rejected", reason: "input-digest-mismatch" };
|
|
64
|
+
return command.capability === "command"
|
|
65
|
+
? commandEffect(command, context)
|
|
66
|
+
: handoffEffect(command, context);
|
|
46
67
|
};
|
|
47
68
|
const rules = {
|
|
48
69
|
"request-effect": effectRequest,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { delivers, gateKey } from "../authority/gates.js";
|
|
3
|
+
import { gateDelivery } from "../authority/reduction.js";
|
|
4
4
|
const kinds = ["question", "approval", "untyped"];
|
|
5
|
-
const waits = ["registered", "pending"];
|
|
5
|
+
const waits = ["registered", "pending", "hook"];
|
|
6
6
|
export function documentDigest(body) {
|
|
7
7
|
return `sha256:${createHash("sha256").update(body).digest("hex")}`;
|
|
8
8
|
}
|
|
@@ -22,7 +22,7 @@ export function gateRecord(gate) {
|
|
|
22
22
|
answer: gate.outcome?.answer ?? null,
|
|
23
23
|
decidedSequence: gate.outcome?.sequence ?? null,
|
|
24
24
|
openedSequence: gate.openedSequence,
|
|
25
|
-
continuation:
|
|
25
|
+
continuation: delivers(gate) ? gateDelivery(gate).operationId : null,
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
const unobserved = {
|
|
@@ -6,4 +6,6 @@ export type SocketAddress = {
|
|
|
6
6
|
readonly reason: "runtime-path-too-long";
|
|
7
7
|
readonly detail: string;
|
|
8
8
|
};
|
|
9
|
-
export declare function socketAddress(path: string
|
|
9
|
+
export declare function socketAddress(path: string, options?: {
|
|
10
|
+
readonly directory: string;
|
|
11
|
+
}): SocketAddress;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { relative } from "node:path";
|
|
2
2
|
const maximumBytes = 103;
|
|
3
|
-
export function socketAddress(path) {
|
|
4
|
-
const [shortest] = [path, relative(
|
|
3
|
+
export function socketAddress(path, options = { directory: process.cwd() }) {
|
|
4
|
+
const [shortest] = [path, relative(options.directory, path)]
|
|
5
5
|
.filter((candidate) => candidate.length > 0)
|
|
6
6
|
.sort((left, right) => Buffer.byteLength(left) - Buffer.byteLength(right));
|
|
7
7
|
if (shortest === undefined || Buffer.byteLength(shortest) > maximumBytes)
|
|
@@ -1,23 +1,21 @@
|
|
|
1
|
+
import { type ConfigInvocation } from "./config-arguments.ts";
|
|
2
|
+
import { type PhoneInvocation } from "./phone-arguments.ts";
|
|
1
3
|
import { type RuntimeInvocation } from "./runtime-arguments.ts";
|
|
2
4
|
export type Invocation = {
|
|
5
|
+
readonly repository?: string;
|
|
6
|
+
} & (PhoneInvocation | ConfigInvocation | {
|
|
7
|
+
readonly kind: "config-help";
|
|
8
|
+
} | {
|
|
3
9
|
readonly kind: "help";
|
|
4
10
|
} | {
|
|
5
11
|
readonly kind: "version";
|
|
6
12
|
} | {
|
|
7
|
-
readonly kind: "
|
|
8
|
-
} | {
|
|
9
|
-
readonly kind: "chats-redact-help";
|
|
13
|
+
readonly kind: "doctor-help";
|
|
10
14
|
} | {
|
|
11
|
-
readonly kind: "
|
|
12
|
-
readonly
|
|
13
|
-
} | {
|
|
14
|
-
readonly kind: "chats-import-help";
|
|
15
|
+
readonly kind: "doctor";
|
|
16
|
+
readonly json: boolean;
|
|
15
17
|
} | {
|
|
16
|
-
readonly kind: "
|
|
17
|
-
readonly paths: readonly string[];
|
|
18
|
-
readonly roots?: readonly string[];
|
|
19
|
-
readonly excludeProjects?: readonly string[];
|
|
20
|
-
readonly previousImportId?: string;
|
|
18
|
+
readonly kind: "validate-help";
|
|
21
19
|
} | {
|
|
22
20
|
readonly kind: "validate";
|
|
23
21
|
readonly manifest: string;
|
|
@@ -27,5 +25,5 @@ export type Invocation = {
|
|
|
27
25
|
readonly kind: "usage-error";
|
|
28
26
|
readonly code: string;
|
|
29
27
|
readonly json: boolean;
|
|
30
|
-
};
|
|
28
|
+
});
|
|
31
29
|
export declare function parseInvocation(given: readonly string[]): Invocation;
|