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
|
@@ -6,3 +6,10 @@ export async function decisionGate(request) {
|
|
|
6
6
|
return { kind: "unavailable", reason: "cloving-host-unavailable" };
|
|
7
7
|
return await bridge.gate(request);
|
|
8
8
|
}
|
|
9
|
+
export async function openDecisionWait(request) {
|
|
10
|
+
"use step";
|
|
11
|
+
const bridge = Reflect.get(globalThis, Symbol.for(stepBridgeKey));
|
|
12
|
+
if (!isStepBridge(bridge) || bridge.waitForDecision === undefined)
|
|
13
|
+
throw new Error("cloving-host-unavailable");
|
|
14
|
+
return await bridge.waitForDecision(request);
|
|
15
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { isStepBridge, stepBridgeKey, } from "../step-bridge.js";
|
|
2
|
+
export async function handoff(request) {
|
|
3
|
+
"use step";
|
|
4
|
+
const bridge = Reflect.get(globalThis, Symbol.for(stepBridgeKey));
|
|
5
|
+
if (!isStepBridge(bridge) || bridge.handoff === undefined)
|
|
6
|
+
throw new Error("cloving-host-unavailable");
|
|
7
|
+
const result = await bridge.handoff(request);
|
|
8
|
+
if (result.kind !== "completed")
|
|
9
|
+
throw new Error(result.reason ?? result.kind);
|
|
10
|
+
if (result.result === null)
|
|
11
|
+
throw new Error("handoff-result-missing");
|
|
12
|
+
return result.result;
|
|
13
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { mergeRequest, } from "../merge-request.js";
|
|
2
|
+
import { mergeWhenGreen } from "./merge-when-green.js";
|
|
3
|
+
import { waitForDecision } from "./wait-for-decision.js";
|
|
4
|
+
export async function mergeByPerson(request) {
|
|
5
|
+
const { pull, check, round } = mergeRequest(request);
|
|
6
|
+
const decision = await waitForDecision({
|
|
7
|
+
gateId: `merge:${String(pull.number)}:${pull.commit}`,
|
|
8
|
+
kind: "approval",
|
|
9
|
+
prompt: `Merge pull request #${String(pull.number)} (${pull.url}) at commit ${pull.commit} ${check === null ? "with no local check" : `after the local check ${check}`}.`,
|
|
10
|
+
});
|
|
11
|
+
if (decision.decision !== "approved")
|
|
12
|
+
return {
|
|
13
|
+
merged: false,
|
|
14
|
+
reason: "not-approved",
|
|
15
|
+
output: decision.answer ?? "",
|
|
16
|
+
};
|
|
17
|
+
return await mergeWhenGreen({ pull, check, round });
|
|
18
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { mergeRequest, } from "../merge-request.js";
|
|
2
|
+
import { record } from "../protocol.js";
|
|
3
|
+
import { protectedEffect } from "./protected-effect.js";
|
|
4
|
+
const repairReasons = [
|
|
5
|
+
"check-failed",
|
|
6
|
+
"merge-conflict",
|
|
7
|
+
"ci-failed",
|
|
8
|
+
"ci-pending",
|
|
9
|
+
];
|
|
10
|
+
export async function mergeWhenGreen(request) {
|
|
11
|
+
const { pull, check, round } = mergeRequest(request);
|
|
12
|
+
const effect = await protectedEffect({
|
|
13
|
+
capability: "github",
|
|
14
|
+
method: "merge",
|
|
15
|
+
target: pull.target,
|
|
16
|
+
payload: JSON.stringify({
|
|
17
|
+
number: pull.number,
|
|
18
|
+
commit: pull.commit,
|
|
19
|
+
check,
|
|
20
|
+
}),
|
|
21
|
+
scope: {
|
|
22
|
+
phase: "merge",
|
|
23
|
+
operation: "merge",
|
|
24
|
+
round,
|
|
25
|
+
key: `${String(pull.number)}:${pull.commit}`,
|
|
26
|
+
},
|
|
27
|
+
units: 1,
|
|
28
|
+
});
|
|
29
|
+
return mergeOutcome(effect, pull);
|
|
30
|
+
}
|
|
31
|
+
function mergeOutcome(effect, pull) {
|
|
32
|
+
if (effect.kind !== "completed")
|
|
33
|
+
return notMerged(effect);
|
|
34
|
+
const result = parsedResult(effect.result);
|
|
35
|
+
const reason = repairReasons.find((name) => name === result["reason"]);
|
|
36
|
+
if (reason !== undefined && typeof result["output"] === "string")
|
|
37
|
+
return { merged: false, reason, output: result["output"] };
|
|
38
|
+
if (result["reason"] !== undefined ||
|
|
39
|
+
result["number"] !== pull.number ||
|
|
40
|
+
result["commit"] !== pull.commit ||
|
|
41
|
+
typeof result["merged"] !== "string")
|
|
42
|
+
throw new Error("invalid-merge-result");
|
|
43
|
+
return { merged: true, reason: null, output: "" };
|
|
44
|
+
}
|
|
45
|
+
function notMerged(effect) {
|
|
46
|
+
if (effect.kind === "failed" && effect.reason === "check-not-configured")
|
|
47
|
+
return { merged: false, reason: "check-not-configured", output: "" };
|
|
48
|
+
throw new Error(effect.reason ?? effect.kind);
|
|
49
|
+
}
|
|
50
|
+
function parsedResult(text) {
|
|
51
|
+
let parsed;
|
|
52
|
+
try {
|
|
53
|
+
parsed = JSON.parse(text ?? "null");
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new Error("invalid-merge-result");
|
|
57
|
+
}
|
|
58
|
+
const result = record(parsed);
|
|
59
|
+
if (result === undefined)
|
|
60
|
+
throw new Error("invalid-merge-result");
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { record } from "../protocol.js";
|
|
2
|
+
import { protectedEffect } from "./protected-effect.js";
|
|
3
|
+
import { snapshotReviewSubject } from "./review-subject.js";
|
|
4
|
+
export async function reviewByAgent(request) {
|
|
5
|
+
const reviewer = selectedReviewer(request.reviewer);
|
|
6
|
+
const subject = { ...request.subject };
|
|
7
|
+
const snapshot = await snapshotReviewSubject(subject);
|
|
8
|
+
const effect = await protectedEffect({
|
|
9
|
+
...reviewEffect({ subject, snapshot, reviewer }),
|
|
10
|
+
scope: {
|
|
11
|
+
phase: "review",
|
|
12
|
+
operation: reviewer.kind === "greptile" ? "greptile" : `turn:${reviewer.profile}`,
|
|
13
|
+
round: 1,
|
|
14
|
+
key: snapshot.subjectDigest,
|
|
15
|
+
},
|
|
16
|
+
units: 1,
|
|
17
|
+
});
|
|
18
|
+
if (effect.kind !== "completed")
|
|
19
|
+
throw new Error(effect.reason ?? effect.kind);
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse(effect.result ?? "null");
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
throw new Error("invalid-review-result");
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
...(reviewer.kind === "turn"
|
|
29
|
+
? turnResult(parsed)
|
|
30
|
+
: greptileFeedback(parsed, subject)),
|
|
31
|
+
commit: snapshot.commit,
|
|
32
|
+
subjectDigest: snapshot.subjectDigest,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function selectedReviewer(value) {
|
|
36
|
+
const reviewer = record(value);
|
|
37
|
+
if (reviewer?.["kind"] === "greptile")
|
|
38
|
+
return { kind: "greptile" };
|
|
39
|
+
if (reviewer?.["kind"] === "turn" &&
|
|
40
|
+
typeof reviewer["profile"] === "string" &&
|
|
41
|
+
/^[A-Za-z0-9_-]{1,119}$/.test(reviewer["profile"]))
|
|
42
|
+
return { kind: "turn", profile: reviewer["profile"] };
|
|
43
|
+
throw new Error("invalid-reviewer");
|
|
44
|
+
}
|
|
45
|
+
function reviewEffect(input) {
|
|
46
|
+
const { subject, snapshot, reviewer } = input;
|
|
47
|
+
if (reviewer.kind === "turn")
|
|
48
|
+
return {
|
|
49
|
+
capability: "claude",
|
|
50
|
+
method: `run-turn:${reviewer.profile}`,
|
|
51
|
+
target: "draft" in subject ? snapshot.subjectDigest : subject.target,
|
|
52
|
+
payload: `Review only this immutable subject. Do not change it. For a commit, inspect that exact commit, not the current branch head.\n${snapshot.prompt}\nEnd your report with exactly one of these lines:\nReview verdict: accept\nReview verdict: change`,
|
|
53
|
+
};
|
|
54
|
+
if ("draft" in subject ||
|
|
55
|
+
!Number.isSafeInteger(subject.number) ||
|
|
56
|
+
Number(subject.number) < 1)
|
|
57
|
+
throw new Error("invalid-greptile-subject");
|
|
58
|
+
return {
|
|
59
|
+
capability: "github",
|
|
60
|
+
method: "wait-review",
|
|
61
|
+
target: subject.target,
|
|
62
|
+
payload: JSON.stringify({ number: subject.number, commit: subject.commit }),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function turnResult(parsed) {
|
|
66
|
+
const result = record(parsed);
|
|
67
|
+
if (result &&
|
|
68
|
+
(result["reviewVerdict"] === null || result["reviewVerdict"] === undefined))
|
|
69
|
+
return {
|
|
70
|
+
accepted: false,
|
|
71
|
+
feedback: "The review turn has no verdict line.",
|
|
72
|
+
};
|
|
73
|
+
if (!result ||
|
|
74
|
+
typeof result["summary"] !== "string" ||
|
|
75
|
+
(result["reviewVerdict"] !== "accept" &&
|
|
76
|
+
result["reviewVerdict"] !== "change"))
|
|
77
|
+
throw new Error("invalid-review-result");
|
|
78
|
+
return {
|
|
79
|
+
accepted: result["reviewVerdict"] === "accept",
|
|
80
|
+
feedback: result["summary"],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function greptileFeedback(parsed, subject) {
|
|
84
|
+
if ("draft" in subject)
|
|
85
|
+
throw new Error("invalid-greptile-subject");
|
|
86
|
+
const result = greptileResult(parsed, subject);
|
|
87
|
+
return {
|
|
88
|
+
accepted: result.score === 5,
|
|
89
|
+
feedback: [result.summary, ...result.findings].filter(Boolean).join("\n\n"),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function greptileResult(parsed, subject) {
|
|
93
|
+
const result = record(parsed);
|
|
94
|
+
if (!result)
|
|
95
|
+
throw new Error("invalid-review-result");
|
|
96
|
+
const score = result["score"];
|
|
97
|
+
const summary = result["summary"];
|
|
98
|
+
const findings = result["findings"];
|
|
99
|
+
if (result["number"] !== subject.number ||
|
|
100
|
+
result["commit"] !== subject.commit ||
|
|
101
|
+
typeof score !== "number" ||
|
|
102
|
+
!Number.isInteger(score) ||
|
|
103
|
+
score < 0 ||
|
|
104
|
+
score > 5 ||
|
|
105
|
+
typeof summary !== "string" ||
|
|
106
|
+
!Array.isArray(findings))
|
|
107
|
+
throw new Error("invalid-review-result");
|
|
108
|
+
return {
|
|
109
|
+
score,
|
|
110
|
+
summary,
|
|
111
|
+
findings: findings.map((value) => {
|
|
112
|
+
const finding = record(value);
|
|
113
|
+
if (!finding)
|
|
114
|
+
throw new Error("invalid-review-result");
|
|
115
|
+
const { path, line, body } = finding;
|
|
116
|
+
if (typeof path !== "string" ||
|
|
117
|
+
typeof body !== "string" ||
|
|
118
|
+
!(line === null ||
|
|
119
|
+
(typeof line === "number" && Number.isSafeInteger(line) && line > 0)))
|
|
120
|
+
throw new Error("invalid-review-result");
|
|
121
|
+
return `${path}${line === null ? "" : `:${String(line)}`}\n${body}`;
|
|
122
|
+
}),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { snapshotReviewSubject } from "./review-subject.js";
|
|
2
|
+
import { waitForDecision } from "./wait-for-decision.js";
|
|
3
|
+
export async function reviewByPerson(request) {
|
|
4
|
+
const snapshot = await snapshotReviewSubject(request.subject);
|
|
5
|
+
const decision = await waitForDecision({
|
|
6
|
+
gateId: `review:${snapshot.subjectDigest}`,
|
|
7
|
+
kind: "approval",
|
|
8
|
+
prompt: `Review this subject:\n${snapshot.prompt}`,
|
|
9
|
+
});
|
|
10
|
+
return {
|
|
11
|
+
accepted: decision.decision === "approved",
|
|
12
|
+
feedback: decision.answer ?? "",
|
|
13
|
+
commit: snapshot.commit,
|
|
14
|
+
subjectDigest: snapshot.subjectDigest,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { operationDigest } from "../broker/operation-digest.js";
|
|
2
|
+
import { reviewSubjectText, } from "../review-subject.js";
|
|
3
|
+
export async function snapshotReviewSubject(subject) {
|
|
4
|
+
"use step";
|
|
5
|
+
const prompt = reviewSubjectText(subject);
|
|
6
|
+
return Promise.resolve({
|
|
7
|
+
commit: "draft" in subject ? null : subject.commit,
|
|
8
|
+
subjectDigest: `sha256:${operationDigest(prompt)}`,
|
|
9
|
+
prompt,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { isStepBridge, stepBridgeKey, } from "../step-bridge.js";
|
|
2
|
+
export async function runCommand(request) {
|
|
3
|
+
"use step";
|
|
4
|
+
const bridge = Reflect.get(globalThis, Symbol.for(stepBridgeKey));
|
|
5
|
+
if (!isStepBridge(bridge))
|
|
6
|
+
return { kind: "unavailable", reason: "cloving-host-unavailable" };
|
|
7
|
+
return await bridge.effect({
|
|
8
|
+
scope: request.scope,
|
|
9
|
+
capability: "command",
|
|
10
|
+
method: `run:${request.name}`,
|
|
11
|
+
target: request.name,
|
|
12
|
+
payload: JSON.stringify(request.input),
|
|
13
|
+
units: 1,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { sleep as sdkSleep } from "workflow";
|
|
2
|
+
export async function sleep(request) {
|
|
3
|
+
await sdkSleep(sleepSeconds(request) * 1000);
|
|
4
|
+
}
|
|
5
|
+
function sleepSeconds(request) {
|
|
6
|
+
if (typeof request !== "object" ||
|
|
7
|
+
request === null ||
|
|
8
|
+
Reflect.ownKeys(request).length !== 1)
|
|
9
|
+
throw new Error("invalid-sleep-seconds");
|
|
10
|
+
const field = Object.getOwnPropertyDescriptor(request, "seconds") ?? {};
|
|
11
|
+
const seconds = field.value;
|
|
12
|
+
if (field.enumerable !== true ||
|
|
13
|
+
typeof seconds !== "number" ||
|
|
14
|
+
!Number.isInteger(seconds) ||
|
|
15
|
+
seconds < 1 ||
|
|
16
|
+
seconds > 86400)
|
|
17
|
+
throw new Error("invalid-sleep-seconds");
|
|
18
|
+
return seconds;
|
|
19
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
53
|
+
import { createHook } from "workflow";
|
|
54
|
+
import { openDecisionWait } from "./decision-gate.js";
|
|
55
|
+
export async function waitForDecision(request) {
|
|
56
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
57
|
+
try {
|
|
58
|
+
const wait = await openDecisionWait(request);
|
|
59
|
+
if ("decision" in wait)
|
|
60
|
+
return wait;
|
|
61
|
+
const hook = __addDisposableResource(env_1, createHook({ token: wait.token }), false);
|
|
62
|
+
return await hook;
|
|
63
|
+
}
|
|
64
|
+
catch (e_1) {
|
|
65
|
+
env_1.error = e_1;
|
|
66
|
+
env_1.hasError = true;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
__disposeResources(env_1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { isStepBridge, stepBridgeKey, } from "../step-bridge.js";
|
|
2
|
+
export async function waitForRun(request) {
|
|
3
|
+
"use step";
|
|
4
|
+
const bridge = Reflect.get(globalThis, Symbol.for(stepBridgeKey));
|
|
5
|
+
if (!isStepBridge(bridge) || bridge.waitForRun === undefined)
|
|
6
|
+
throw new Error("cloving-host-unavailable");
|
|
7
|
+
return await bridge.waitForRun(request);
|
|
8
|
+
}
|
|
9
|
+
waitForRun.maxRetries = 86401;
|
|
@@ -12,6 +12,7 @@ export interface DecidedSnapshot extends DomainSnapshot, DecisionRows {
|
|
|
12
12
|
export interface CurrentSnapshot extends DecidedSnapshot {
|
|
13
13
|
readonly effects: EffectRows;
|
|
14
14
|
}
|
|
15
|
+
export declare function loadOperationSnapshot(connection: SqlConnection): Promise<Pick<ProjectionSnapshot, "outbox" | "deliveries">>;
|
|
15
16
|
export declare function loadProjections(connection: SqlConnection): Promise<ProjectionSnapshot>;
|
|
16
17
|
export declare function loadDecided(connection: SqlConnection): Promise<DecidedSnapshot>;
|
|
17
18
|
export declare function loadCurrent(connection: SqlConnection): Promise<CurrentSnapshot>;
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { loadDecisions, loadDocuments, } from "./decision-rows.js";
|
|
2
|
-
import { latestSequence, loadAttempts, loadSnapshot, projectionRows, text, } from "./domain-rows.js";
|
|
2
|
+
import { latestSequence, loadAttempts, loadSnapshot, outboxRow, projectionRows, text, } from "./domain-rows.js";
|
|
3
3
|
import { loadEffects } from "./effect-rows.js";
|
|
4
|
+
export async function loadOperationSnapshot(connection) {
|
|
5
|
+
return {
|
|
6
|
+
outbox: (await connection.all("SELECT operation_id, kind, run_id, created_sequence, released_sequence FROM outbox ORDER BY created_sequence, rowid")).map(outboxRow),
|
|
7
|
+
deliveries: await loadAttempts(connection),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
4
10
|
export async function loadProjections(connection) {
|
|
5
11
|
return {
|
|
6
12
|
...(await projectionRows(connection)),
|
package/dist/src/submission.d.ts
CHANGED
|
@@ -5,6 +5,9 @@ export type SubmissionField = {
|
|
|
5
5
|
} | {
|
|
6
6
|
readonly type: "boolean";
|
|
7
7
|
readonly optional?: boolean;
|
|
8
|
+
} | {
|
|
9
|
+
readonly type: "ticket";
|
|
10
|
+
readonly optional?: boolean;
|
|
8
11
|
} | {
|
|
9
12
|
readonly type: "integer";
|
|
10
13
|
readonly optional?: boolean;
|
|
@@ -15,6 +18,7 @@ export interface SubmissionContract {
|
|
|
15
18
|
readonly maximumBytes: number;
|
|
16
19
|
readonly fields: Readonly<Record<string, "string" | SubmissionField>>;
|
|
17
20
|
}
|
|
21
|
+
export declare function hasTicketField(contract: SubmissionContract | undefined): boolean;
|
|
18
22
|
export type SubmissionCheck = {
|
|
19
23
|
readonly kind: "valid";
|
|
20
24
|
readonly normalized: string;
|
package/dist/src/submission.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { record } from "./protocol.js";
|
|
2
|
+
export function hasTicketField(contract) {
|
|
3
|
+
const rule = contract?.fields["ticket"];
|
|
4
|
+
return rule !== undefined && rule !== "string" && rule.type === "ticket";
|
|
5
|
+
}
|
|
2
6
|
function rejected(code, detail) {
|
|
3
7
|
return { kind: "rejected", code, detail };
|
|
4
8
|
}
|
|
@@ -14,11 +18,11 @@ function invalidField(contract, submission) {
|
|
|
14
18
|
return Object.entries(contract.fields).find(([key, rule]) => {
|
|
15
19
|
if (rule !== "string" && rule.optional && !Object.hasOwn(submission, key))
|
|
16
20
|
return false;
|
|
17
|
-
return !validValue(rule, submission[key]);
|
|
21
|
+
return !validValue(rule === "string" ? { type: "string" } : rule, submission[key]);
|
|
18
22
|
})?.[0];
|
|
19
23
|
}
|
|
20
24
|
function validValue(rule, value) {
|
|
21
|
-
if (rule === "string" || rule.type === "
|
|
25
|
+
if (rule.type === "string" || rule.type === "ticket")
|
|
22
26
|
return typeof value === "string" && value.trim().length > 0;
|
|
23
27
|
if (rule.type === "boolean")
|
|
24
28
|
return typeof value === "boolean";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type HandoffValue, type ProtectedResult, type GateResult, type DecisionResult, type RunWaitOutcome, type ProtectedRequest, type GateRequest, type HandoffRequest, type RunWaitRequest } from "./step-bridge.ts";
|
|
2
|
+
export interface StepScenario {
|
|
3
|
+
readonly turn?: ProtectedResult;
|
|
4
|
+
readonly effects?: Readonly<Record<string, readonly ProtectedResult[]>>;
|
|
5
|
+
readonly gate?: GateResult;
|
|
6
|
+
readonly waits?: readonly RunWaitOutcome[];
|
|
7
|
+
readonly decisions?: readonly DecisionResult[];
|
|
8
|
+
readonly effectLimit?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface WorkflowScenario extends StepScenario {
|
|
11
|
+
readonly workflow: string;
|
|
12
|
+
readonly exportName: string;
|
|
13
|
+
readonly input: HandoffValue;
|
|
14
|
+
readonly decision?: HandoffValue;
|
|
15
|
+
}
|
|
16
|
+
export type ScenarioRequest = readonly ["effect", ProtectedRequest] | readonly ["gate", GateRequest] | readonly ["waitForDecision", GateRequest] | readonly ["handoff", HandoffRequest] | readonly ["waitForRun", RunWaitRequest] | readonly ["sleep", {
|
|
17
|
+
readonly seconds: number;
|
|
18
|
+
}];
|
|
19
|
+
export interface ScenarioResult {
|
|
20
|
+
readonly spent?: number;
|
|
21
|
+
readonly outcome: unknown;
|
|
22
|
+
readonly requests: readonly ScenarioRequest[];
|
|
23
|
+
}
|
|
24
|
+
export declare function fakeStepBridge(scenario: StepScenario): {
|
|
25
|
+
requests: ScenarioRequest[];
|
|
26
|
+
readonly spent: number;
|
|
27
|
+
[Symbol.dispose](): void;
|
|
28
|
+
};
|
|
29
|
+
export declare function runScenario(scenario: WorkflowScenario): Promise<ScenarioResult>;
|