cloving 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +525 -185
- package/dist/src/agent-harness-shell.d.ts +12 -0
- package/dist/src/agent-harness-shell.js +90 -0
- package/dist/src/agent-harness-versions.d.ts +8 -0
- package/dist/src/agent-harness-versions.js +49 -0
- package/dist/src/agent-harnesses.d.ts +4 -0
- package/dist/src/agent-harnesses.js +13 -0
- package/dist/src/authority/commands.d.ts +1 -0
- package/dist/src/authority/commands.js +24 -4
- package/dist/src/authority/gate-reduction.d.ts +1 -0
- package/dist/src/authority/gate-reduction.js +18 -3
- package/dist/src/authority/gates.d.ts +2 -1
- package/dist/src/authority/gates.js +5 -1
- package/dist/src/authority/operations.js +1 -1
- package/dist/src/authority/reduction.d.ts +1 -1
- package/dist/src/authority/reduction.js +6 -1
- package/dist/src/authority/status-input.d.ts +1 -1
- package/dist/src/authority/status.d.ts +1 -0
- package/dist/src/authority/status.js +27 -3
- package/dist/src/authority/transitions.d.ts +5 -5
- package/dist/src/authority/transitions.js +6 -0
- package/dist/src/broker/actor/authority-delivery.js +1 -0
- package/dist/src/broker/actor/authority-queries.d.ts +7 -1
- package/dist/src/broker/actor/authority-queries.js +17 -2
- package/dist/src/broker/actor/authority-receipts.js +11 -1
- package/dist/src/broker/actor/authority-session.js +2 -2
- package/dist/src/broker/actor/authority-settings.js +4 -0
- package/dist/src/broker/actor/delivery-intents.d.ts +2 -1
- package/dist/src/broker/actor/delivery-intents.js +4 -4
- package/dist/src/broker/actor/effect-delivery.js +4 -1
- package/dist/src/broker/actor/effect-queries.d.ts +1 -0
- package/dist/src/broker/actor/effect-queries.js +7 -0
- package/dist/src/broker/actor/pin-check.js +1 -1
- package/dist/src/broker/actor/stop-plan.js +1 -1
- package/dist/src/broker/actor/turn-state.js +1 -1
- package/dist/src/broker/authority-admission.js +22 -9
- package/dist/src/broker/authority-restore.js +1 -0
- package/dist/src/broker/decision-restore.js +4 -4
- package/dist/src/broker/socket-address.d.ts +3 -1
- package/dist/src/broker/socket-address.js +2 -2
- package/dist/src/cli/arguments.d.ts +11 -13
- package/dist/src/cli/arguments.js +37 -107
- package/dist/src/cli/command-effects.d.ts +7 -0
- package/dist/src/cli/command-effects.js +39 -0
- package/dist/src/cli/commands.js +11 -4
- package/dist/src/cli/config-arguments.d.ts +11 -0
- package/dist/src/cli/config-arguments.js +59 -0
- package/dist/src/cli/config-command.d.ts +2 -0
- package/dist/src/cli/config-command.js +105 -0
- package/dist/src/cli/config-file.d.ts +3 -0
- package/dist/src/cli/config-file.js +50 -0
- package/dist/src/cli/config-lock.d.ts +7 -0
- package/dist/src/cli/config-lock.js +61 -0
- package/dist/src/cli/config-notice.d.ts +5 -0
- package/dist/src/cli/config-notice.js +46 -0
- package/dist/src/cli/doctor-github.d.ts +9 -0
- package/dist/src/cli/doctor-github.js +138 -0
- package/dist/src/cli/doctor-harness.d.ts +13 -0
- package/dist/src/cli/doctor-harness.js +242 -0
- package/dist/src/cli/doctor-local.d.ts +18 -0
- package/dist/src/cli/doctor-local.js +77 -0
- package/dist/src/cli/doctor-runtime.d.ts +15 -0
- package/dist/src/cli/doctor-runtime.js +176 -0
- package/dist/src/cli/doctor-service.d.ts +1 -0
- package/dist/src/cli/doctor-service.js +11 -0
- package/dist/src/cli/doctor-workflows.d.ts +3 -0
- package/dist/src/cli/doctor-workflows.js +45 -0
- package/dist/src/cli/doctor.d.ts +15 -0
- package/dist/src/cli/doctor.js +190 -0
- package/dist/src/cli/github-ci-progress.d.ts +8 -0
- package/dist/src/cli/github-ci-progress.js +83 -0
- package/dist/src/cli/github-retry.d.ts +6 -0
- package/dist/src/cli/github-retry.js +47 -0
- package/dist/src/cli/harness-probes.d.ts +22 -0
- package/dist/src/cli/harness-probes.js +183 -0
- package/dist/src/cli/main.d.ts +7 -1
- package/dist/src/cli/main.js +39 -61
- package/dist/src/cli/phone-arguments.d.ts +14 -0
- package/dist/src/cli/phone-arguments.js +37 -0
- package/dist/src/cli/phone-client.d.ts +2 -0
- package/dist/src/cli/phone-client.js +32 -0
- package/dist/src/cli/phone-command.d.ts +13 -0
- package/dist/src/cli/phone-command.js +101 -0
- package/dist/src/cli/probe-command.d.ts +36 -0
- package/dist/src/cli/probe-command.js +59 -0
- package/dist/src/cli/project-settings.d.ts +4 -0
- package/dist/src/cli/project-settings.js +33 -0
- package/dist/src/cli/render.d.ts +2 -1
- package/dist/src/cli/render.js +44 -28
- package/dist/src/cli/report-github.d.ts +18 -0
- package/dist/src/cli/report-github.js +200 -0
- package/dist/src/cli/report.d.ts +17 -0
- package/dist/src/cli/report.js +192 -0
- package/dist/src/cli/repository-arguments.d.ts +5 -0
- package/dist/src/cli/repository-arguments.js +34 -0
- package/dist/src/cli/runtime-arguments.d.ts +4 -0
- package/dist/src/cli/runtime-arguments.js +15 -0
- package/dist/src/cli/runtime-directory.d.ts +6 -2
- package/dist/src/cli/runtime-directory.js +72 -14
- package/dist/src/cli/toolchain.d.ts +2 -0
- package/dist/src/cli/toolchain.js +22 -2
- package/dist/src/cli/usage-render.d.ts +5 -0
- package/dist/src/cli/usage-render.js +40 -1
- package/dist/src/cli/usage.d.ts +3 -3
- package/dist/src/cli/usage.js +70 -44
- package/dist/src/cli/watch-actions.d.ts +2 -0
- package/dist/src/cli/watch-actions.js +4 -4
- package/dist/src/cli/watch-board-view.d.ts +1 -1
- package/dist/src/cli/watch-board-view.js +8 -2
- package/dist/src/cli/watch-board.js +23 -10
- package/dist/src/cli/watch-card-forms.js +2 -2
- package/dist/src/cli/watch-client.d.ts +1 -1
- package/dist/src/cli/watch-client.js +7 -2
- package/dist/src/cli/watch-header-view.d.ts +27 -0
- package/dist/src/cli/watch-header-view.js +116 -0
- package/dist/src/cli/watch-model.js +17 -4
- package/dist/src/cli/watch-page.js +48 -12
- package/dist/src/cli/watch-phone-client.d.ts +1 -0
- package/dist/src/cli/watch-phone-client.js +84 -0
- package/dist/src/cli/watch-phone-view.d.ts +56 -0
- package/dist/src/cli/watch-phone-view.js +113 -0
- package/dist/src/cli/watch-phone.d.ts +5 -0
- package/dist/src/cli/watch-phone.js +53 -0
- package/dist/src/cli/watch-pull-request.d.ts +3 -1
- package/dist/src/cli/watch-pull-request.js +4 -0
- package/dist/src/cli/watch-render.d.ts +9 -1
- package/dist/src/cli/watch-server.js +23 -5
- package/dist/src/cli/watch-turn.d.ts +4 -1
- package/dist/src/cli/watch-turn.js +37 -1
- package/dist/src/cli/watch-usage.js +5 -1
- package/dist/src/cli/watch-view.d.ts +6 -20
- package/dist/src/cli/watch-view.js +14 -106
- package/dist/src/cli.js +106 -23
- package/dist/src/command-settings.d.ts +16 -0
- package/dist/src/command-settings.js +42 -0
- package/dist/src/configuration-change.d.ts +11 -0
- package/dist/src/configuration-change.js +62 -0
- package/dist/src/configuration-display.d.ts +21 -0
- package/dist/src/configuration-display.js +69 -0
- package/dist/src/configuration-schema.d.ts +49 -0
- package/dist/src/configuration-schema.js +159 -0
- package/dist/src/daemon/claude-turn.d.ts +19 -5
- package/dist/src/daemon/claude-turn.js +116 -53
- package/dist/src/daemon/claude-worker.d.ts +3 -3
- package/dist/src/daemon/claude-worker.js +65 -76
- package/dist/src/daemon/command-journal.d.ts +5 -0
- package/dist/src/daemon/command-journal.js +50 -0
- package/dist/src/daemon/command-process.d.ts +28 -0
- package/dist/src/daemon/command-process.js +164 -0
- package/dist/src/daemon/command-worker.d.ts +19 -0
- package/dist/src/daemon/command-worker.js +182 -0
- package/dist/src/daemon/cursor-stream.d.ts +4 -0
- package/dist/src/daemon/cursor-stream.js +154 -0
- package/dist/src/daemon/daemon-adapters.d.ts +58 -0
- package/dist/src/daemon/daemon-adapters.js +102 -0
- package/dist/src/daemon/daemon-loops.d.ts +14 -0
- package/dist/src/daemon/daemon-loops.js +39 -0
- package/dist/src/daemon/daemon.d.ts +2 -33
- package/dist/src/daemon/daemon.js +126 -132
- package/dist/src/daemon/declared-input.d.ts +3 -0
- package/dist/src/daemon/declared-input.js +9 -0
- package/dist/src/daemon/delivery-router.js +1 -1
- package/dist/src/daemon/gemini-stream.d.ts +4 -0
- package/dist/src/daemon/gemini-stream.js +129 -0
- package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
- package/dist/src/daemon/github-ci-rerun.js +92 -0
- package/dist/src/daemon/github-ci.js +89 -8
- package/dist/src/daemon/github-merge-call.d.ts +2 -0
- package/dist/src/daemon/github-merge.js +7 -3
- package/dist/src/daemon/github-methods.js +10 -0
- package/dist/src/daemon/github-operation.d.ts +1 -0
- package/dist/src/daemon/github-retry.js +8 -44
- package/dist/src/daemon/issue-queue.d.ts +1 -0
- package/dist/src/daemon/issue-queue.js +3 -26
- package/dist/src/daemon/notify.js +2 -1
- package/dist/src/daemon/opencode-stream.d.ts +5 -0
- package/dist/src/daemon/opencode-stream.js +87 -0
- package/dist/src/daemon/queue-status.d.ts +4 -0
- package/dist/src/daemon/queue-status.js +38 -0
- package/dist/src/daemon/retry-worktree.d.ts +18 -0
- package/dist/src/daemon/retry-worktree.js +139 -0
- package/dist/src/daemon/retrying-turn.d.ts +2 -0
- package/dist/src/daemon/retrying-turn.js +108 -30
- package/dist/src/daemon/schedule-journal.d.ts +19 -0
- package/dist/src/daemon/schedule-journal.js +57 -0
- package/dist/src/daemon/text-output.d.ts +18 -0
- package/dist/src/daemon/text-output.js +44 -0
- package/dist/src/daemon/ticket-registration.d.ts +5 -7
- package/dist/src/daemon/ticket-registration.js +85 -40
- package/dist/src/daemon/turn-command.d.ts +10 -0
- package/dist/src/daemon/turn-command.js +33 -0
- package/dist/src/daemon/turn-report.d.ts +18 -0
- package/dist/src/daemon/turn-report.js +79 -0
- package/dist/src/daemon/work-tree.d.ts +2 -1
- package/dist/src/daemon/work-tree.js +15 -12
- package/dist/src/daemon/workflow-generations.d.ts +32 -0
- package/dist/src/daemon/workflow-generations.js +57 -0
- package/dist/src/daemon/workflow-replay.d.ts +16 -0
- package/dist/src/daemon/workflow-replay.js +58 -0
- package/dist/src/daemon/workflow-schedules.d.ts +27 -0
- package/dist/src/daemon/workflow-schedules.js +185 -0
- package/dist/src/decision-wait.d.ts +1 -0
- package/dist/src/decision-wait.js +3 -0
- package/dist/src/delivery-backoff.d.ts +1 -0
- package/dist/src/delivery-backoff.js +3 -0
- package/dist/src/doctor-report.d.ts +24 -0
- package/dist/src/doctor-report.js +70 -0
- package/dist/src/execution-pin.d.ts +5 -0
- package/dist/src/execution-pin.js +67 -4
- package/dist/src/grok-result.d.ts +12 -0
- package/dist/src/grok-result.js +61 -0
- package/dist/src/harness-defaults.d.ts +35 -0
- package/dist/src/harness-defaults.js +121 -0
- package/dist/src/host/decision-resume.d.ts +35 -0
- package/dist/src/host/decision-resume.js +86 -0
- package/dist/src/host/gate-bridge.d.ts +48 -0
- package/dist/src/host/gate-bridge.js +124 -0
- package/dist/src/host/run-wait.d.ts +26 -0
- package/dist/src/host/run-wait.js +37 -0
- package/dist/src/host/start-delivery.d.ts +1 -1
- package/dist/src/host/start-delivery.js +10 -3
- package/dist/src/host/step-bridge-host.d.ts +6 -20
- package/dist/src/host/step-bridge-host.js +44 -58
- package/dist/src/merge-request.d.ts +19 -0
- package/dist/src/merge-request.js +32 -0
- package/dist/src/phone/canonical-json.d.ts +1 -0
- package/dist/src/phone/canonical-json.js +16 -0
- package/dist/src/phone/phone-link.d.ts +7 -0
- package/dist/src/phone/phone-link.js +21 -0
- package/dist/src/phone/qr-data.d.ts +8 -0
- package/dist/src/phone/qr-data.js +133 -0
- package/dist/src/phone/qr-matrix.d.ts +6 -0
- package/dist/src/phone/qr-matrix.js +175 -0
- package/dist/src/phone/qr-penalty.d.ts +3 -0
- package/dist/src/phone/qr-penalty.js +67 -0
- package/dist/src/phone/qr-picture.d.ts +5 -0
- package/dist/src/phone/qr-picture.js +24 -0
- package/dist/src/private-config.schema.json +263 -0
- package/dist/src/project-config.schema.json +65 -0
- package/dist/src/project-settings.d.ts +19 -0
- package/dist/src/project-settings.js +131 -0
- package/dist/src/relay/answer-check.d.ts +24 -0
- package/dist/src/relay/answer-check.js +145 -0
- package/dist/src/relay/answer-inbox.d.ts +15 -0
- package/dist/src/relay/answer-inbox.js +173 -0
- package/dist/src/relay/daemon-keys.d.ts +16 -0
- package/dist/src/relay/daemon-keys.js +75 -0
- package/dist/src/relay/decision-check.d.ts +3 -0
- package/dist/src/relay/decision-check.js +77 -0
- package/dist/src/relay/decision-close.d.ts +6 -0
- package/dist/src/relay/decision-close.js +72 -0
- package/dist/src/relay/decision-envelopes.d.ts +29 -0
- package/dist/src/relay/decision-envelopes.js +93 -0
- package/dist/src/relay/decision-watch.d.ts +14 -0
- package/dist/src/relay/decision-watch.js +68 -0
- package/dist/src/relay/envelope-post.d.ts +8 -0
- package/dist/src/relay/envelope-post.js +71 -0
- package/dist/src/relay/envelope.d.ts +28 -0
- package/dist/src/relay/envelope.js +53 -0
- package/dist/src/relay/hpke.d.ts +25 -0
- package/dist/src/relay/hpke.js +108 -0
- package/dist/src/relay/pairing-checks.d.ts +42 -0
- package/dist/src/relay/pairing-checks.js +172 -0
- package/dist/src/relay/pairing-follow.d.ts +8 -0
- package/dist/src/relay/pairing-follow.js +95 -0
- package/dist/src/relay/pairing-session.d.ts +29 -0
- package/dist/src/relay/pairing-session.js +87 -0
- package/dist/src/relay/phone-delivery.d.ts +51 -0
- package/dist/src/relay/phone-delivery.js +139 -0
- package/dist/src/relay/phone-devices.d.ts +36 -0
- package/dist/src/relay/phone-devices.js +46 -0
- package/dist/src/relay/phone-inbox.d.ts +18 -0
- package/dist/src/relay/phone-inbox.js +17 -0
- package/dist/src/relay/phone-operations.d.ts +18 -0
- package/dist/src/relay/phone-operations.js +121 -0
- package/dist/src/relay/phone-outbox.d.ts +21 -0
- package/dist/src/relay/phone-outbox.js +25 -0
- package/dist/src/relay/phone-socket.d.ts +6 -0
- package/dist/src/relay/phone-socket.js +63 -0
- package/dist/src/relay/relay-control.d.ts +7 -0
- package/dist/src/relay/relay-control.js +24 -0
- package/dist/src/relay/relay-files.d.ts +2 -0
- package/dist/src/relay/relay-files.js +23 -0
- package/dist/src/relay/relay-heartbeat.d.ts +17 -0
- package/dist/src/relay/relay-heartbeat.js +81 -0
- package/dist/src/relay/relay-http.d.ts +14 -0
- package/dist/src/relay/relay-http.js +63 -0
- package/dist/src/relay/relay-registration.d.ts +15 -0
- package/dist/src/relay/relay-registration.js +63 -0
- package/dist/src/relay/relay-service.d.ts +25 -0
- package/dist/src/relay/relay-service.js +216 -0
- package/dist/src/relay/relay-store.d.ts +48 -0
- package/dist/src/relay/relay-store.js +131 -0
- package/dist/src/relay/sealed-post.d.ts +25 -0
- package/dist/src/relay/sealed-post.js +52 -0
- package/dist/src/relay.d.ts +1 -0
- package/dist/src/relay.js +8 -0
- package/dist/src/report-statistics.d.ts +50 -0
- package/dist/src/report-statistics.js +70 -0
- package/dist/src/report.d.ts +171 -0
- package/dist/src/report.js +119 -0
- package/dist/src/repository-identity.d.ts +4 -0
- package/dist/src/repository-identity.js +4 -0
- package/dist/src/review-subject.d.ts +41 -0
- package/dist/src/review-subject.js +91 -0
- package/dist/src/run-wait.d.ts +23 -0
- package/dist/src/run-wait.js +20 -0
- package/dist/src/service/active-tickets.d.ts +4 -0
- package/dist/src/service/active-tickets.js +49 -0
- package/dist/src/service/command-effects.d.ts +4 -0
- package/dist/src/service/command-effects.js +16 -0
- package/dist/src/service/decision-handler.d.ts +4 -0
- package/dist/src/service/decision-handler.js +39 -4
- package/dist/src/service/gateway.js +18 -3
- package/dist/src/service/registry.d.ts +16 -3
- package/dist/src/service/registry.js +34 -3
- package/dist/src/service/replies.d.ts +9 -1
- package/dist/src/service/replies.js +12 -0
- package/dist/src/service/run-handlers.js +14 -55
- package/dist/src/service/run-metadata.d.ts +8 -0
- package/dist/src/service/run-metadata.js +53 -0
- package/dist/src/service/run-waits.d.ts +3 -0
- package/dist/src/service/run-waits.js +41 -0
- package/dist/src/service/service.d.ts +18 -2
- package/dist/src/service/service.js +23 -7
- package/dist/src/service/submission-handler.d.ts +0 -1
- package/dist/src/service/submission-handler.js +6 -34
- package/dist/src/service/worker-port.d.ts +1 -0
- package/dist/src/service/worker-totals.js +8 -23
- package/dist/src/step-bridge.d.ts +23 -0
- package/dist/src/steps/decision-gate.d.ts +2 -1
- package/dist/src/steps/decision-gate.js +7 -0
- package/dist/src/steps/merge-by-person.d.ts +2 -0
- package/dist/src/steps/merge-by-person.js +18 -0
- package/dist/src/steps/merge-when-green.d.ts +2 -0
- package/dist/src/steps/merge-when-green.js +62 -0
- package/dist/src/steps/review-by-agent.d.ts +5 -0
- package/dist/src/steps/review-by-agent.js +124 -0
- package/dist/src/steps/review-by-person.d.ts +4 -0
- package/dist/src/steps/review-by-person.js +16 -0
- package/dist/src/steps/review-subject.d.ts +2 -0
- package/dist/src/steps/review-subject.js +11 -0
- package/dist/src/steps/run-command.d.ts +2 -0
- package/dist/src/steps/run-command.js +15 -0
- package/dist/src/steps/sleep.d.ts +3 -0
- package/dist/src/steps/sleep.js +19 -0
- package/dist/src/steps/wait-for-decision.d.ts +2 -0
- package/dist/src/steps/wait-for-decision.js +71 -0
- package/dist/src/steps/wait-for-run.d.ts +5 -0
- package/dist/src/steps/wait-for-run.js +9 -0
- package/dist/src/storage/decision-snapshots.d.ts +1 -0
- package/dist/src/storage/decision-snapshots.js +7 -1
- package/dist/src/submission.d.ts +4 -0
- package/dist/src/submission.js +6 -2
- package/dist/src/testing.d.ts +29 -0
- package/dist/src/testing.js +264 -0
- package/dist/src/ticket-status-stream.d.ts +9 -0
- package/dist/src/ticket-status-stream.js +94 -0
- package/dist/src/token-prices.d.ts +12 -4
- package/dist/src/token-prices.js +15 -2
- package/dist/src/turn-profile.d.ts +1 -0
- package/dist/src/turn-profile.js +8 -1
- package/dist/src/worker-usage.d.ts +16 -0
- package/dist/src/worker-usage.js +57 -0
- package/dist/src/workflow-admission.d.ts +5 -0
- package/dist/src/workflow-candidate.d.ts +7 -2
- package/dist/src/workflow-candidate.js +47 -5
- package/dist/src/workflow-declaration.d.ts +21 -3
- package/dist/src/workflow-declaration.js +77 -9
- package/dist/src/workflow-discovery.d.ts +2 -1
- package/dist/src/workflow-discovery.js +4 -1
- package/dist/src/workflow-refusals.js +3 -0
- package/dist/src/workflow-schedule.d.ts +22 -0
- package/dist/src/workflow-schedule.js +53 -0
- package/dist/src/workflows.d.ts +11 -1
- package/dist/src/workflows.js +8 -0
- package/dist/tools/admit-workflow.d.ts +1 -0
- package/dist/tools/admit-workflow.js +18 -5
- package/dist/tools/doctor-adoption.d.ts +1 -0
- package/dist/tools/doctor-adoption.js +11 -0
- package/dist/tools/project-configuration.d.ts +4 -0
- package/dist/tools/project-configuration.js +47 -0
- package/dist/tools/self-host-processes.d.ts +1 -0
- package/dist/tools/self-host-processes.js +33 -22
- package/dist/tools/self-host-project.d.ts +4 -0
- package/dist/tools/self-host-project.js +61 -14
- package/dist/tools/self-host-runtime.d.ts +16 -0
- package/dist/tools/self-host-runtime.js +60 -0
- package/dist/tools/self-host-workflows.d.ts +1 -0
- package/dist/tools/self-host-workflows.js +36 -1
- package/dist/tools/self-host.js +86 -61
- package/dist/tools/workflow-candidate-counts.d.ts +6 -2
- package/dist/tools/workflow-candidate-counts.js +31 -16
- package/dist/tools/workflow-candidate-fields.d.ts +5 -0
- package/dist/tools/workflow-candidate-fields.js +24 -0
- package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
- package/dist/tools/workflow-candidate-helper-counts.js +129 -0
- package/dist/tools/workflow-candidate-program.d.ts +2 -0
- package/dist/tools/workflow-candidate-program.js +36 -8
- package/dist/tools/workflow-candidate-source.js +77 -15
- package/dist/tools/workflow-candidate-syntax.d.ts +8 -2
- package/dist/tools/workflow-candidate-syntax.js +70 -26
- package/dist/tools/workflow-command.d.ts +1 -0
- package/dist/tools/workflow-command.js +143 -0
- package/dist/tools/workflow-folder-capture.d.ts +1 -0
- package/dist/tools/workflow-folder-capture.js +47 -2
- package/dist/tools/workflow-folders.d.ts +17 -1
- package/dist/tools/workflow-folders.js +59 -6
- package/dist/tools/workflow-test-hook.d.ts +7 -0
- package/dist/tools/workflow-test-hook.js +16 -0
- package/dist/tools/workflow-test-loader.d.ts +1 -0
- package/dist/tools/workflow-test-loader.js +10 -0
- package/dist/workflows/develop-ticket.js +1 -1
- package/dist/workflows/ticket-prompts.js +5 -1
- package/package.json +46 -4
- package/templates/develop/README.md +78 -0
- package/templates/develop/develop/accept.ts +11 -0
- package/templates/develop/develop/flow-tests.ts +357 -0
- package/templates/develop/develop/local.ts +40 -0
- package/templates/develop/develop/option-tests.ts +174 -0
- package/templates/develop/develop/partial-choice.ts +29 -0
- package/templates/develop/develop/partial.ts +28 -0
- package/templates/develop/develop/pull.ts +152 -0
- package/templates/develop/develop/queue-partial.ts +39 -0
- package/templates/develop/develop/refusal-tests.ts +174 -0
- package/templates/develop/develop/report.ts +156 -0
- package/templates/develop/develop/round.ts +40 -0
- package/templates/develop/develop/scenarios.ts +87 -0
- package/templates/develop/develop/turn.ts +67 -0
- package/templates/develop/develop.declaration.json +24 -0
- package/templates/develop/develop.test.ts +287 -0
- package/templates/develop/develop.ts +30 -0
- package/templates/develop/template.json +153 -0
- package/dist/src/chats/analysis-batches.d.ts +0 -42
- package/dist/src/chats/analysis-batches.js +0 -97
- package/dist/src/chats/analysis-checkpoint.d.ts +0 -29
- package/dist/src/chats/analysis-checkpoint.js +0 -31
- package/dist/src/chats/analysis-contract.d.ts +0 -80
- package/dist/src/chats/analysis-contract.js +0 -16
- package/dist/src/chats/analysis-data.d.ts +0 -3
- package/dist/src/chats/analysis-data.js +0 -85
- package/dist/src/chats/analysis-input.d.ts +0 -18
- package/dist/src/chats/analysis-input.js +0 -97
- package/dist/src/chats/analysis-links.d.ts +0 -2
- package/dist/src/chats/analysis-links.js +0 -25
- package/dist/src/chats/analysis-merge.d.ts +0 -16
- package/dist/src/chats/analysis-merge.js +0 -134
- package/dist/src/chats/analysis-prompt.d.ts +0 -18
- package/dist/src/chats/analysis-prompt.js +0 -42
- package/dist/src/chats/analysis-proposal.d.ts +0 -4
- package/dist/src/chats/analysis-proposal.js +0 -41
- package/dist/src/chats/analysis-provenance.d.ts +0 -4
- package/dist/src/chats/analysis-provenance.js +0 -99
- package/dist/src/chats/analysis-shape.d.ts +0 -4
- package/dist/src/chats/analysis-shape.js +0 -235
- package/dist/src/chats/analysis.d.ts +0 -3
- package/dist/src/chats/analysis.js +0 -42
- package/dist/src/chats/corpus-input.d.ts +0 -5
- package/dist/src/chats/corpus-input.js +0 -288
- package/dist/src/chats/destination.d.ts +0 -4
- package/dist/src/chats/destination.js +0 -96
- package/dist/src/chats/import.d.ts +0 -15
- package/dist/src/chats/import.js +0 -243
- package/dist/src/chats/input-file.d.ts +0 -3
- package/dist/src/chats/input-file.js +0 -32
- package/dist/src/chats/normalize.d.ts +0 -29
- package/dist/src/chats/normalize.js +0 -155
- package/dist/src/chats/previous-import.d.ts +0 -5
- package/dist/src/chats/previous-import.js +0 -34
- package/dist/src/chats/reader.d.ts +0 -21
- package/dist/src/chats/reader.js +0 -118
- package/dist/src/chats/redact-import.d.ts +0 -14
- package/dist/src/chats/redact-import.js +0 -141
- package/dist/src/chats/redaction.d.ts +0 -41
- package/dist/src/chats/redaction.js +0 -161
- package/dist/src/chats/reference-mapping.d.ts +0 -16
- package/dist/src/chats/reference-mapping.js +0 -153
- package/dist/src/chats/revision-input.d.ts +0 -3
- package/dist/src/chats/revision-input.js +0 -180
- package/dist/src/chats/revision.d.ts +0 -48
- package/dist/src/chats/revision.js +0 -94
- package/dist/src/chats/selection.d.ts +0 -25
- package/dist/src/chats/selection.js +0 -109
- package/dist/src/chats/source.d.ts +0 -23
- package/dist/src/chats/source.js +0 -135
- package/dist/src/chats/structure.d.ts +0 -57
- package/dist/src/chats/structure.js +0 -216
- package/dist/src/chats/workflow-generation-projection.d.ts +0 -8
- package/dist/src/chats/workflow-generation-projection.js +0 -75
- package/dist/src/chats/workflow-generation-source.d.ts +0 -25
- package/dist/src/chats/workflow-generation-source.js +0 -124
- package/dist/src/chats/workflow-generation-text.d.ts +0 -23
- package/dist/src/chats/workflow-generation-text.js +0 -74
- package/dist/src/chats/workflow-generation.d.ts +0 -69
- package/dist/src/chats/workflow-generation.js +0 -142
- package/dist/src/daemon/analysis-launch.d.ts +0 -5
- package/dist/src/daemon/analysis-launch.js +0 -81
- package/dist/src/daemon/analysis-token.d.ts +0 -6
- package/dist/src/daemon/analysis-token.js +0 -88
- package/dist/src/daemon/analysis-worker.d.ts +0 -20
- package/dist/src/daemon/analysis-worker.js +0 -271
- package/dist/src/daemon/chats-batch-binding.d.ts +0 -23
- package/dist/src/daemon/chats-batch-binding.js +0 -99
- package/dist/src/daemon/chats-capture.d.ts +0 -18
- package/dist/src/daemon/chats-capture.js +0 -194
- package/dist/src/daemon/chats-checkpoints.d.ts +0 -41
- package/dist/src/daemon/chats-checkpoints.js +0 -186
- package/dist/src/daemon/chats-files.d.ts +0 -42
- package/dist/src/daemon/chats-files.js +0 -252
- package/dist/src/daemon/chats-follow-up.d.ts +0 -38
- package/dist/src/daemon/chats-follow-up.js +0 -180
- package/dist/src/daemon/chats-question.d.ts +0 -15
- package/dist/src/daemon/chats-question.js +0 -93
- package/dist/src/daemon/chats-worker.d.ts +0 -13
- package/dist/src/daemon/chats-worker.js +0 -201
- package/dist/workflows/analyze-chats.d.ts +0 -15
- package/dist/workflows/analyze-chats.declaration.json +0 -22
- package/dist/workflows/analyze-chats.js +0 -250
|
@@ -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">;
|
|
@@ -54,7 +55,7 @@ export interface Delivery {
|
|
|
54
55
|
readonly retry?: Delivery["reconcile"];
|
|
55
56
|
readonly stop?: (intent: DeliveryIntent, signal: AbortSignal) => Promise<AdapterOutcome>;
|
|
56
57
|
}
|
|
57
|
-
export type AvailableManifest = (pinned: ExecutionManifest) => ExecutionManifest | undefined
|
|
58
|
+
export type AvailableManifest = (pinned: ExecutionManifest) => ExecutionManifest | undefined | Promise<ExecutionManifest | undefined>;
|
|
58
59
|
export declare function intentDigest(intent: Undigested): string;
|
|
59
60
|
export declare function deliveryIntent(intent: Undigested): DeliveryIntent;
|
|
60
61
|
export declare function protectedIntent(state: AuthorityState, attempt: {
|
|
@@ -1,7 +1,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) {
|
|
@@ -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 = {
|
|
@@ -33,15 +33,15 @@ const resumption = (command, context) => {
|
|
|
33
33
|
? resumed
|
|
34
34
|
: admissible;
|
|
35
35
|
};
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
45
|
if (command.capability !== "handoff")
|
|
46
46
|
return unpinned(command, context);
|
|
47
47
|
const pin = context.state.runs[command.runId]?.workflow ?? "";
|
|
@@ -52,6 +52,19 @@ const effectRequest = (command, context) => {
|
|
|
52
52
|
return { kind: "rejected", reason: "invalid-handoff-request" };
|
|
53
53
|
return unpinned(command, context);
|
|
54
54
|
};
|
|
55
|
+
const effectRequest = (command, context) => {
|
|
56
|
+
const computed = effectInputDigest({
|
|
57
|
+
capability: String(command.capability),
|
|
58
|
+
method: String(command.method),
|
|
59
|
+
target: String(command.target),
|
|
60
|
+
payload: String(command.payload),
|
|
61
|
+
});
|
|
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);
|
|
67
|
+
};
|
|
55
68
|
const rules = {
|
|
56
69
|
"request-effect": effectRequest,
|
|
57
70
|
"admit-run": admission,
|
|
@@ -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;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { parseArgs } from "node:util";
|
|
2
|
+
import { configInvocation } from "./config-arguments.js";
|
|
3
|
+
import { repositoryArguments } from "./repository-arguments.js";
|
|
4
|
+
import { phoneInvocation } from "./phone-arguments.js";
|
|
2
5
|
import { isRuntimeCommand, runtimeInvocation, } from "./runtime-arguments.js";
|
|
3
6
|
const errorCodes = {
|
|
4
7
|
ERR_PARSE_ARGS_UNKNOWN_OPTION: "unknown-option",
|
|
@@ -21,6 +24,8 @@ const options = {
|
|
|
21
24
|
limit: { type: "string" },
|
|
22
25
|
after: { type: "string" },
|
|
23
26
|
follow: { type: "boolean" },
|
|
27
|
+
since: { type: "string" },
|
|
28
|
+
repository: { type: "string" },
|
|
24
29
|
};
|
|
25
30
|
const textOptions = ["--prompt", "--text"];
|
|
26
31
|
function knownFlag(token) {
|
|
@@ -48,10 +53,27 @@ function textValues(argumentsList) {
|
|
|
48
53
|
return option === undefined ? joined : [...joined, option];
|
|
49
54
|
}
|
|
50
55
|
export function parseInvocation(given) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
56
|
+
const selected = repositoryArguments(given, options);
|
|
57
|
+
if (typeof selected === "string")
|
|
58
|
+
return {
|
|
59
|
+
kind: "usage-error",
|
|
60
|
+
code: selected,
|
|
61
|
+
json: given.includes("--json"),
|
|
62
|
+
};
|
|
63
|
+
const invocation = selectedInvocation(selected.argumentsList);
|
|
64
|
+
return selected.repository === undefined
|
|
65
|
+
? invocation
|
|
66
|
+
: { ...invocation, repository: selected.repository };
|
|
67
|
+
}
|
|
68
|
+
function selectedInvocation(given) {
|
|
69
|
+
if (given[0] === "config") {
|
|
70
|
+
const outcome = configInvocation(given.slice(1));
|
|
71
|
+
return typeof outcome === "string"
|
|
72
|
+
? { kind: "usage-error", code: outcome, json: given.includes("--json") }
|
|
73
|
+
: outcome;
|
|
74
|
+
}
|
|
75
|
+
if (given[0] === "phone")
|
|
76
|
+
return phoneInvocation(given.slice(1));
|
|
55
77
|
const argumentsList = textValues(given);
|
|
56
78
|
const json = given.includes("--json");
|
|
57
79
|
const parsed = parsedArguments(argumentsList);
|
|
@@ -61,6 +83,8 @@ export function parseInvocation(given) {
|
|
|
61
83
|
const [command, ...remaining] = positionals;
|
|
62
84
|
if (command === undefined)
|
|
63
85
|
return topLevel(values);
|
|
86
|
+
if (command === "doctor")
|
|
87
|
+
return doctorInvocation(values, remaining);
|
|
64
88
|
if (command === "workflows" && remaining[0] === "validate")
|
|
65
89
|
return validation(values, remaining.slice(1));
|
|
66
90
|
const outcome = runtimeInvocation({
|
|
@@ -72,109 +96,13 @@ export function parseInvocation(given) {
|
|
|
72
96
|
return { kind: "usage-error", code: outcome, json };
|
|
73
97
|
return outcome;
|
|
74
98
|
}
|
|
75
|
-
function
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
return { kind: "
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
!/^[a-f\d]{8}-[a-f\d]{4}-4[a-f\d]{3}-[89ab][a-f\d]{3}-[a-f\d]{12}$/.test(importId))
|
|
83
|
-
return { kind: "usage-error", code: "invalid-import-id", json: false };
|
|
84
|
-
return { kind: "chats-redact", importId };
|
|
85
|
-
}
|
|
86
|
-
function chatsImport(argumentsList) {
|
|
87
|
-
const error = (code) => ({
|
|
88
|
-
kind: "usage-error",
|
|
89
|
-
code,
|
|
90
|
-
json: false,
|
|
91
|
-
});
|
|
92
|
-
if (argumentsList.length === 1 &&
|
|
93
|
-
["--help", "-h"].includes(String(argumentsList[0])))
|
|
94
|
-
return { kind: "chats-import-help" };
|
|
95
|
-
const state = {
|
|
96
|
-
paths: [],
|
|
97
|
-
roots: [],
|
|
98
|
-
excludeProjects: [],
|
|
99
|
-
literal: false,
|
|
100
|
-
option: undefined,
|
|
101
|
-
previousImportId: undefined,
|
|
102
|
-
};
|
|
103
|
-
for (const argument of argumentsList) {
|
|
104
|
-
const failure = importArgument(state, argument);
|
|
105
|
-
if (failure !== undefined)
|
|
106
|
-
return error(failure);
|
|
107
|
-
}
|
|
108
|
-
if (state.option !== undefined)
|
|
109
|
-
return error("missing-value");
|
|
110
|
-
if (state.excludeProjects.length > 0 && state.roots.length === 0)
|
|
111
|
-
return error("roots-required");
|
|
112
|
-
if (state.paths.length + state.roots.length === 0)
|
|
113
|
-
return error("missing-argument");
|
|
114
|
-
return importInvocation(state);
|
|
115
|
-
}
|
|
116
|
-
function importInvocation(state) {
|
|
117
|
-
const previous = state.previousImportId === undefined
|
|
118
|
-
? {}
|
|
119
|
-
: { previousImportId: state.previousImportId };
|
|
120
|
-
return state.roots.length === 0
|
|
121
|
-
? { kind: "chats-import", paths: state.paths, ...previous }
|
|
122
|
-
: {
|
|
123
|
-
kind: "chats-import",
|
|
124
|
-
paths: state.paths,
|
|
125
|
-
...previous,
|
|
126
|
-
roots: state.roots,
|
|
127
|
-
excludeProjects: state.excludeProjects,
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
function importArgument(state, argument) {
|
|
131
|
-
if (state.option !== undefined)
|
|
132
|
-
return importValue(state, argument);
|
|
133
|
-
if (argument === "")
|
|
134
|
-
return "missing-argument";
|
|
135
|
-
if (state.literal) {
|
|
136
|
-
state.paths.push(argument);
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
if (argument === "--previous-import" && state.previousImportId !== undefined)
|
|
140
|
-
return "repeated-previous-import";
|
|
141
|
-
if (["--root", "--exclude-project", "--previous-import"].includes(argument)) {
|
|
142
|
-
state.option = argument;
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
if (argument === "--") {
|
|
146
|
-
state.literal = true;
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
if (argument.startsWith("-"))
|
|
150
|
-
return "unexpected-option";
|
|
151
|
-
state.paths.push(argument);
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
function importValue(state, argument) {
|
|
155
|
-
if (argument === "" || argument.startsWith("-"))
|
|
156
|
-
return "missing-value";
|
|
157
|
-
const option = state.option;
|
|
158
|
-
state.option = undefined;
|
|
159
|
-
if (option === "--root") {
|
|
160
|
-
state.roots.push(argument);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
if (option === "--exclude-project" && !validProjectName(argument))
|
|
164
|
-
return "invalid-exclusion";
|
|
165
|
-
if (option === "--exclude-project") {
|
|
166
|
-
state.excludeProjects.push(argument);
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
if (!/^[a-f\d]{8}-[a-f\d]{4}-4[a-f\d]{3}-[89ab][a-f\d]{3}-[a-f\d]{12}$/.test(argument))
|
|
170
|
-
return "invalid-import-id";
|
|
171
|
-
state.previousImportId = argument;
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
function validProjectName(name) {
|
|
175
|
-
return (name !== "." &&
|
|
176
|
-
name !== ".." &&
|
|
177
|
-
!["/", "\\", "\0", "*", "?", "[", "]"].some((character) => name.includes(character)));
|
|
99
|
+
function doctorInvocation(values, remaining) {
|
|
100
|
+
const json = values.json === true;
|
|
101
|
+
if (unexpected(values, ["help", "json"]))
|
|
102
|
+
return { kind: "usage-error", code: "unexpected-option", json };
|
|
103
|
+
if (remaining.length > 0)
|
|
104
|
+
return { kind: "usage-error", code: "unexpected-argument", json };
|
|
105
|
+
return values.help ? { kind: "doctor-help" } : { kind: "doctor", json };
|
|
178
106
|
}
|
|
179
107
|
function parsedArguments(argumentsList) {
|
|
180
108
|
try {
|
|
@@ -206,6 +134,8 @@ function knownCommand(positionals) {
|
|
|
206
134
|
return true;
|
|
207
135
|
if (command === "workflows")
|
|
208
136
|
return subcommand === "validate";
|
|
137
|
+
if (command === "doctor")
|
|
138
|
+
return true;
|
|
209
139
|
return isRuntimeCommand(command);
|
|
210
140
|
}
|
|
211
141
|
function givenOptions(tokens) {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CommandEffect } from "../command-settings.ts";
|
|
2
|
+
import { type Shown } from "./watch-element.ts";
|
|
3
|
+
export declare function shownCommands(value: unknown): readonly CommandEffect[];
|
|
4
|
+
export declare function commandText(effect: CommandEffect): string;
|
|
5
|
+
export declare function Commands(props: {
|
|
6
|
+
readonly effects: readonly CommandEffect[];
|
|
7
|
+
}): Shown;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { record } from "../protocol.js";
|
|
2
|
+
import { element } from "./watch-element.js";
|
|
3
|
+
export function shownCommands(value) {
|
|
4
|
+
if (!Array.isArray(value))
|
|
5
|
+
return [];
|
|
6
|
+
return value.flatMap((entry) => {
|
|
7
|
+
const fields = record(entry);
|
|
8
|
+
if (typeof fields?.["operationId"] !== "string" ||
|
|
9
|
+
typeof fields["name"] !== "string" ||
|
|
10
|
+
typeof fields["state"] !== "string")
|
|
11
|
+
return [];
|
|
12
|
+
return [
|
|
13
|
+
{
|
|
14
|
+
operationId: fields["operationId"],
|
|
15
|
+
name: fields["name"],
|
|
16
|
+
state: fields["state"],
|
|
17
|
+
exitCode: typeof fields["exitCode"] === "number" ? fields["exitCode"] : null,
|
|
18
|
+
durationMilliseconds: typeof fields["durationMilliseconds"] === "number"
|
|
19
|
+
? fields["durationMilliseconds"]
|
|
20
|
+
: null,
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export function commandText(effect) {
|
|
26
|
+
const duration = effect.durationMilliseconds === null
|
|
27
|
+
? "duration unknown"
|
|
28
|
+
: `${String(effect.durationMilliseconds)} ms`;
|
|
29
|
+
return `Command ${effect.name} · ${effect.state} · exit ${effect.exitCode === null ? "unknown" : String(effect.exitCode)} · ${duration}`;
|
|
30
|
+
}
|
|
31
|
+
export function Commands(props) {
|
|
32
|
+
return props.effects.map((effect) => element("section", {
|
|
33
|
+
class: "command-effect code-window",
|
|
34
|
+
children: element("h3", {
|
|
35
|
+
class: "code-head",
|
|
36
|
+
children: commandText(effect),
|
|
37
|
+
}),
|
|
38
|
+
}));
|
|
39
|
+
}
|
package/dist/src/cli/commands.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { reportCommand } from "./report.js";
|
|
2
|
+
import { withCiReruns } from "./github-ci-progress.js";
|
|
1
3
|
import { readFile } from "node:fs/promises";
|
|
2
4
|
import { resolve } from "node:path";
|
|
3
5
|
import { record, } from "../protocol.js";
|
|
@@ -45,8 +47,11 @@ function presented(environment, outcome) {
|
|
|
45
47
|
return 0;
|
|
46
48
|
}
|
|
47
49
|
async function requested(environment, exchange) {
|
|
50
|
+
const reply = await send(environment.runtimeDirectory, exchange.request);
|
|
48
51
|
return presented(environment, {
|
|
49
|
-
reply:
|
|
52
|
+
reply: exchange.request.operation === "status"
|
|
53
|
+
? await withCiReruns(environment.runtimeDirectory, reply)
|
|
54
|
+
: reply,
|
|
50
55
|
format: exchange.format,
|
|
51
56
|
});
|
|
52
57
|
}
|
|
@@ -138,7 +143,7 @@ async function status(environment, invocation) {
|
|
|
138
143
|
if (!json && runId === null)
|
|
139
144
|
await summarized(environment);
|
|
140
145
|
if (!json && runId === null && limit === null && after === null) {
|
|
141
|
-
const reply = await listRuns(environment.runtimeDirectory);
|
|
146
|
+
const reply = await withCiReruns(environment.runtimeDirectory, await listRuns(environment.runtimeDirectory));
|
|
142
147
|
return presented(environment, {
|
|
143
148
|
format: { json },
|
|
144
149
|
reply: reply.kind === "result"
|
|
@@ -227,14 +232,16 @@ export function runtimeCommand(invocation, environment) {
|
|
|
227
232
|
if (runtimeDirectory === undefined)
|
|
228
233
|
return Promise.resolve(failed(environment, {
|
|
229
234
|
error: {
|
|
230
|
-
code: "
|
|
231
|
-
detail: "
|
|
235
|
+
code: "repository-unknown",
|
|
236
|
+
detail: "Change to the service repository, use --repository <directory>, or set CLOVING_RUNTIME_DIR.",
|
|
232
237
|
},
|
|
233
238
|
format: { json: invocation.json },
|
|
234
239
|
}));
|
|
235
240
|
return located(invocation, { ...environment, runtimeDirectory });
|
|
236
241
|
}
|
|
237
242
|
function located(invocation, environment) {
|
|
243
|
+
if (invocation.kind === "report")
|
|
244
|
+
return reportCommand(invocation, environment);
|
|
238
245
|
if (invocation.kind === "run")
|
|
239
246
|
return run(environment, invocation);
|
|
240
247
|
if (invocation.kind === "status")
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ConfigInvocation {
|
|
2
|
+
readonly kind: "config";
|
|
3
|
+
readonly action: "list" | "get" | "set" | "unset";
|
|
4
|
+
readonly field?: string;
|
|
5
|
+
readonly value?: string;
|
|
6
|
+
readonly private: boolean;
|
|
7
|
+
readonly json: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function configInvocation(argumentsList: readonly string[]): ConfigInvocation | {
|
|
10
|
+
readonly kind: "config-help";
|
|
11
|
+
} | string;
|