cloving 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +700 -331
- package/dist/src/agent-harness-shell.d.ts +13 -0
- package/dist/src/agent-harness-shell.js +93 -0
- package/dist/src/agent-harness-versions.d.ts +8 -0
- package/dist/src/agent-harness-versions.js +49 -0
- package/dist/src/agent-harnesses.d.ts +4 -0
- package/dist/src/agent-harnesses.js +13 -0
- package/dist/src/authority/command-wait-checks.d.ts +8 -0
- package/dist/src/authority/command-wait-checks.js +88 -0
- package/dist/src/authority/command-wait-results.d.ts +15 -0
- package/dist/src/authority/command-wait-results.js +73 -0
- package/dist/src/authority/command-wait-view.d.ts +21 -0
- package/dist/src/authority/command-wait-view.js +34 -0
- package/dist/src/authority/command-waits.d.ts +39 -0
- package/dist/src/authority/command-waits.js +97 -0
- package/dist/src/authority/commands.d.ts +1 -0
- package/dist/src/authority/commands.js +46 -5
- package/dist/src/authority/dispatch-decision.d.ts +8 -0
- package/dist/src/authority/dispatch-decision.js +26 -1
- package/dist/src/authority/effect-requests.js +6 -3
- package/dist/src/authority/effect-results.js +4 -2
- package/dist/src/authority/gate-reduction.d.ts +1 -0
- package/dist/src/authority/gate-reduction.js +18 -3
- package/dist/src/authority/gates.d.ts +2 -1
- package/dist/src/authority/gates.js +5 -1
- package/dist/src/authority/history-state.d.ts +2 -0
- package/dist/src/authority/history-state.js +13 -1
- package/dist/src/authority/instants.d.ts +1 -0
- package/dist/src/authority/instants.js +21 -0
- package/dist/src/authority/operations.js +1 -1
- package/dist/src/authority/reduction-state.d.ts +2 -0
- package/dist/src/authority/reduction-state.js +5 -0
- package/dist/src/authority/reduction.d.ts +1 -1
- package/dist/src/authority/reduction.js +30 -1
- package/dist/src/authority/status-input.d.ts +3 -1
- package/dist/src/authority/status.d.ts +3 -0
- package/dist/src/authority/status.js +28 -3
- package/dist/src/authority/stop-sequence.d.ts +1 -0
- package/dist/src/authority/stop-sequence.js +2 -1
- package/dist/src/authority/transitions.d.ts +7 -5
- package/dist/src/authority/transitions.js +13 -0
- package/dist/src/broker/actor/authority-delivery.js +1 -0
- package/dist/src/broker/actor/authority-queries.d.ts +9 -2
- package/dist/src/broker/actor/authority-queries.js +29 -5
- package/dist/src/broker/actor/authority-receipts.js +11 -1
- package/dist/src/broker/actor/authority-session.js +2 -2
- package/dist/src/broker/actor/authority-settings.js +4 -0
- package/dist/src/broker/actor/authority-upgrades.d.ts +19 -2
- package/dist/src/broker/actor/authority-upgrades.js +7 -2
- package/dist/src/broker/actor/delivery-intents.d.ts +2 -1
- package/dist/src/broker/actor/delivery-intents.js +6 -4
- package/dist/src/broker/actor/effect-delivery.d.ts +1 -1
- package/dist/src/broker/actor/effect-delivery.js +18 -2
- package/dist/src/broker/actor/effect-plan.js +11 -2
- package/dist/src/broker/actor/effect-queries.d.ts +5 -0
- package/dist/src/broker/actor/effect-queries.js +16 -1
- package/dist/src/broker/actor/effect-turn.js +2 -0
- package/dist/src/broker/actor/pin-check.js +1 -1
- package/dist/src/broker/actor/stop-plan.js +10 -4
- package/dist/src/broker/actor/stop-turn.d.ts +2 -0
- package/dist/src/broker/actor/stop-turn.js +24 -11
- package/dist/src/broker/actor/turn-draft.d.ts +1 -0
- package/dist/src/broker/actor/turn-draft.js +4 -0
- package/dist/src/broker/actor/turn-state.js +6 -2
- package/dist/src/broker/authority-admission.js +80 -7
- package/dist/src/broker/authority-restore.d.ts +2 -0
- package/dist/src/broker/authority-restore.js +36 -1
- package/dist/src/broker/command-wait-restore.d.ts +31 -0
- package/dist/src/broker/command-wait-restore.js +86 -0
- package/dist/src/broker/decision-restore.d.ts +1 -1
- package/dist/src/broker/decision-restore.js +5 -4
- package/dist/src/broker/effect-upgrade.d.ts +2 -0
- package/dist/src/broker/effect-upgrade.js +8 -2
- package/dist/src/broker/socket-address.d.ts +3 -1
- package/dist/src/broker/socket-address.js +2 -2
- package/dist/src/cli/arguments.d.ts +22 -11
- package/dist/src/cli/arguments.js +73 -104
- package/dist/src/cli/chat-stores.d.ts +2 -0
- package/dist/src/cli/chat-stores.js +113 -0
- package/dist/src/cli/client.d.ts +4 -1
- package/dist/src/cli/client.js +9 -3
- package/dist/src/cli/command-effects.d.ts +7 -0
- package/dist/src/cli/command-effects.js +39 -0
- package/dist/src/cli/command-requests.d.ts +17 -0
- package/dist/src/cli/command-requests.js +43 -0
- package/dist/src/cli/command-waits.d.ts +9 -0
- package/dist/src/cli/command-waits.js +51 -0
- package/dist/src/cli/commands.js +21 -41
- package/dist/src/cli/config-arguments.d.ts +11 -0
- package/dist/src/cli/config-arguments.js +59 -0
- package/dist/src/cli/config-command.d.ts +2 -0
- package/dist/src/cli/config-command.js +105 -0
- package/dist/src/cli/config-file.d.ts +3 -0
- package/dist/src/cli/config-file.js +52 -0
- package/dist/src/cli/config-lock.d.ts +7 -0
- package/dist/src/cli/config-lock.js +61 -0
- package/dist/src/cli/config-notice.d.ts +5 -0
- package/dist/src/cli/config-notice.js +46 -0
- package/dist/src/cli/doctor-github.d.ts +9 -0
- package/dist/src/cli/doctor-github.js +138 -0
- package/dist/src/cli/doctor-harness.d.ts +13 -0
- package/dist/src/cli/doctor-harness.js +242 -0
- package/dist/src/cli/doctor-local.d.ts +18 -0
- package/dist/src/cli/doctor-local.js +77 -0
- package/dist/src/cli/doctor-runtime.d.ts +15 -0
- package/dist/src/cli/doctor-runtime.js +176 -0
- package/dist/src/cli/doctor-service.d.ts +1 -0
- package/dist/src/cli/doctor-service.js +11 -0
- package/dist/src/cli/doctor-workflows.d.ts +6 -0
- package/dist/src/cli/doctor-workflows.js +50 -0
- package/dist/src/cli/doctor.d.ts +15 -0
- package/dist/src/cli/doctor.js +187 -0
- package/dist/src/cli/github-ci-progress.d.ts +8 -0
- package/dist/src/cli/github-ci-progress.js +83 -0
- package/dist/src/cli/github-retry.d.ts +6 -0
- package/dist/src/cli/github-retry.js +47 -0
- package/dist/src/cli/harness-probes.d.ts +24 -0
- package/dist/src/cli/harness-probes.js +183 -0
- package/dist/src/cli/harness-processes.d.ts +6 -0
- package/dist/src/cli/harness-processes.js +36 -0
- package/dist/src/cli/init-command.d.ts +9 -0
- package/dist/src/cli/init-command.js +52 -0
- package/dist/src/cli/init-prompt-command.d.ts +10 -0
- package/dist/src/cli/init-prompt-command.js +145 -0
- package/dist/src/cli/init-prompt.d.ts +35 -0
- package/dist/src/cli/init-prompt.js +74 -0
- package/dist/src/cli/init-selection.d.ts +13 -0
- package/dist/src/cli/init-selection.js +75 -0
- package/dist/src/cli/main.d.ts +9 -1
- package/dist/src/cli/main.js +69 -61
- package/dist/src/cli/mcp-server.d.ts +1 -0
- package/dist/src/cli/mcp-server.js +156 -0
- package/dist/src/cli/mcp-tools.d.ts +15 -0
- package/dist/src/cli/mcp-tools.js +80 -0
- package/dist/src/cli/phone-arguments.d.ts +14 -0
- package/dist/src/cli/phone-arguments.js +37 -0
- package/dist/src/cli/phone-client.d.ts +2 -0
- package/dist/src/cli/phone-client.js +32 -0
- package/dist/src/cli/phone-command.d.ts +13 -0
- package/dist/src/cli/phone-command.js +101 -0
- package/dist/src/cli/probe-command.d.ts +36 -0
- package/dist/src/cli/probe-command.js +59 -0
- package/dist/src/cli/project-settings.d.ts +4 -0
- package/dist/src/cli/project-settings.js +33 -0
- package/dist/src/cli/render.d.ts +2 -1
- package/dist/src/cli/render.js +57 -54
- package/dist/src/cli/report-ci-jobs.d.ts +23 -0
- package/dist/src/cli/report-ci-jobs.js +103 -0
- package/dist/src/cli/report-ci-usage.d.ts +9 -0
- package/dist/src/cli/report-ci-usage.js +185 -0
- package/dist/src/cli/report-ci.d.ts +13 -0
- package/dist/src/cli/report-ci.js +74 -0
- package/dist/src/cli/report-closures.d.ts +6 -0
- package/dist/src/cli/report-closures.js +97 -0
- package/dist/src/cli/report-flow.d.ts +7 -0
- package/dist/src/cli/report-flow.js +122 -0
- package/dist/src/cli/report-github-reader.d.ts +29 -0
- package/dist/src/cli/report-github-reader.js +157 -0
- package/dist/src/cli/report-github.d.ts +25 -0
- package/dist/src/cli/report-github.js +181 -0
- package/dist/src/cli/report-operator.d.ts +3 -0
- package/dist/src/cli/report-operator.js +40 -0
- package/dist/src/cli/report-ready.d.ts +3 -0
- package/dist/src/cli/report-ready.js +96 -0
- package/dist/src/cli/report-text.d.ts +9 -0
- package/dist/src/cli/report-text.js +33 -0
- package/dist/src/cli/report.d.ts +18 -0
- package/dist/src/cli/report.js +269 -0
- package/dist/src/cli/repository-arguments.d.ts +5 -0
- package/dist/src/cli/repository-arguments.js +34 -0
- package/dist/src/cli/runtime-arguments.d.ts +6 -1
- package/dist/src/cli/runtime-arguments.js +22 -2
- package/dist/src/cli/runtime-directory.d.ts +6 -2
- package/dist/src/cli/runtime-directory.js +72 -14
- package/dist/src/cli/schedule-arguments.d.ts +14 -0
- package/dist/src/cli/schedule-arguments.js +26 -0
- package/dist/src/cli/schedule-render.d.ts +22 -0
- package/dist/src/cli/schedule-render.js +73 -0
- package/dist/src/cli/terminal-text.d.ts +3 -0
- package/dist/src/cli/terminal-text.js +28 -0
- package/dist/src/cli/toolchain.d.ts +2 -0
- package/dist/src/cli/toolchain.js +22 -2
- package/dist/src/cli/usage-render.d.ts +6 -0
- package/dist/src/cli/usage-render.js +67 -1
- package/dist/src/cli/usage.d.ts +3 -3
- package/dist/src/cli/usage.js +119 -50
- package/dist/src/cli/watch-actions.d.ts +2 -0
- package/dist/src/cli/watch-actions.js +6 -6
- package/dist/src/cli/watch-board-view.d.ts +1 -1
- package/dist/src/cli/watch-board-view.js +27 -4
- package/dist/src/cli/watch-board.d.ts +4 -2
- package/dist/src/cli/watch-board.js +58 -35
- package/dist/src/cli/watch-card-forms.d.ts +1 -1
- package/dist/src/cli/watch-card-forms.js +13 -12
- package/dist/src/cli/watch-client.d.ts +1 -1
- package/dist/src/cli/watch-client.js +7 -11
- package/dist/src/cli/watch-header-view.d.ts +22 -0
- package/dist/src/cli/watch-header-view.js +104 -0
- package/dist/src/cli/watch-model.d.ts +4 -1
- package/dist/src/cli/watch-model.js +34 -15
- package/dist/src/cli/watch-page.js +57 -23
- package/dist/src/cli/watch-phases.d.ts +12 -3
- package/dist/src/cli/watch-phases.js +68 -11
- package/dist/src/cli/watch-phone-client.d.ts +1 -0
- package/dist/src/cli/watch-phone-client.js +84 -0
- package/dist/src/cli/watch-phone-view.d.ts +56 -0
- package/dist/src/cli/watch-phone-view.js +113 -0
- package/dist/src/cli/watch-phone.d.ts +5 -0
- package/dist/src/cli/watch-phone.js +53 -0
- package/dist/src/cli/watch-pr-board.js +1 -1
- package/dist/src/cli/watch-pr-command.d.ts +1 -0
- package/dist/src/cli/watch-pull-request.d.ts +3 -1
- package/dist/src/cli/watch-pull-request.js +22 -8
- package/dist/src/cli/watch-reads.d.ts +2 -0
- package/dist/src/cli/watch-reads.js +17 -16
- package/dist/src/cli/watch-render.d.ts +23 -1
- package/dist/src/cli/watch-run-input.d.ts +0 -1
- package/dist/src/cli/watch-run-input.js +0 -13
- package/dist/src/cli/watch-server.js +29 -11
- package/dist/src/cli/watch-turn.d.ts +4 -1
- package/dist/src/cli/watch-turn.js +37 -1
- package/dist/src/cli/watch-usage.js +5 -1
- package/dist/src/cli/watch-view.d.ts +4 -21
- package/dist/src/cli/watch-view.js +26 -118
- package/dist/src/cli.js +165 -28
- package/dist/src/command-settings.d.ts +16 -0
- package/dist/src/command-settings.js +42 -0
- package/dist/src/command-wait.d.ts +4 -0
- package/dist/src/command-wait.js +45 -0
- package/dist/src/configuration-change.d.ts +18 -0
- package/dist/src/configuration-change.js +76 -0
- package/dist/src/configuration-display.d.ts +21 -0
- package/dist/src/configuration-display.js +69 -0
- package/dist/src/configuration-schema.d.ts +58 -0
- package/dist/src/configuration-schema.js +163 -0
- package/dist/src/daemon/attachment-file.d.ts +6 -0
- package/dist/src/daemon/attachment-file.js +86 -0
- package/dist/src/daemon/attachments.d.ts +14 -0
- package/dist/src/daemon/attachments.js +17 -0
- package/dist/src/daemon/claude-recovery.d.ts +50 -0
- package/dist/src/daemon/claude-recovery.js +204 -0
- package/dist/src/daemon/claude-stream.d.ts +27 -0
- package/dist/src/daemon/claude-stream.js +63 -0
- package/dist/src/daemon/claude-turn.d.ts +18 -18
- package/dist/src/daemon/claude-turn.js +151 -105
- package/dist/src/daemon/claude-worker.d.ts +5 -4
- package/dist/src/daemon/claude-worker.js +149 -158
- package/dist/src/daemon/command-journal.d.ts +5 -0
- package/dist/src/daemon/command-journal.js +50 -0
- package/dist/src/daemon/command-process.d.ts +28 -0
- package/dist/src/daemon/command-process.js +164 -0
- package/dist/src/daemon/command-worker.d.ts +19 -0
- package/dist/src/daemon/command-worker.js +182 -0
- package/dist/src/daemon/cursor-stream.d.ts +4 -0
- package/dist/src/daemon/cursor-stream.js +154 -0
- package/dist/src/daemon/daemon-adapters.d.ts +60 -0
- package/dist/src/daemon/daemon-adapters.js +126 -0
- package/dist/src/daemon/daemon-loops.d.ts +16 -0
- package/dist/src/daemon/daemon-loops.js +41 -0
- package/dist/src/daemon/daemon.d.ts +2 -33
- package/dist/src/daemon/daemon.js +133 -131
- package/dist/src/daemon/declared-input.d.ts +3 -0
- package/dist/src/daemon/declared-input.js +9 -0
- package/dist/src/daemon/delivery-router.js +1 -1
- package/dist/src/daemon/gemini-stream.d.ts +4 -0
- package/dist/src/daemon/gemini-stream.js +129 -0
- package/dist/src/daemon/github-attach.d.ts +2 -0
- package/dist/src/daemon/github-attach.js +149 -0
- package/dist/src/daemon/github-ci-filters.d.ts +6 -0
- package/dist/src/daemon/github-ci-filters.js +138 -0
- package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
- package/dist/src/daemon/github-ci-rerun.js +92 -0
- package/dist/src/daemon/github-ci-workflows.d.ts +10 -0
- package/dist/src/daemon/github-ci-workflows.js +148 -0
- package/dist/src/daemon/github-ci.js +109 -10
- package/dist/src/daemon/github-issue-methods.d.ts +2 -0
- package/dist/src/daemon/github-issue-methods.js +37 -2
- package/dist/src/daemon/github-merge-call.d.ts +4 -1
- package/dist/src/daemon/github-merge-call.js +10 -3
- package/dist/src/daemon/github-merge.js +58 -26
- package/dist/src/daemon/github-methods.js +22 -2
- package/dist/src/daemon/github-operation.d.ts +5 -0
- package/dist/src/daemon/github-operation.js +6 -0
- package/dist/src/daemon/github-retry.js +8 -44
- package/dist/src/daemon/github-worker.d.ts +4 -0
- package/dist/src/daemon/github-worker.js +6 -0
- package/dist/src/daemon/issue-queue.d.ts +1 -0
- package/dist/src/daemon/issue-queue.js +16 -34
- package/dist/src/daemon/notify-events.d.ts +6 -0
- package/dist/src/daemon/notify-events.js +84 -0
- package/dist/src/daemon/notify-journal.js +1 -1
- package/dist/src/daemon/notify-message.d.ts +4 -1
- package/dist/src/daemon/notify-message.js +36 -0
- package/dist/src/daemon/notify.d.ts +1 -1
- package/dist/src/daemon/notify.js +7 -78
- package/dist/src/daemon/opencode-stream.d.ts +5 -0
- package/dist/src/daemon/opencode-stream.js +87 -0
- package/dist/src/daemon/operation-journal.d.ts +1 -0
- package/dist/src/daemon/queue-status.d.ts +10 -0
- package/dist/src/daemon/queue-status.js +51 -0
- package/dist/src/daemon/resume-index-lock.d.ts +13 -0
- package/dist/src/daemon/resume-index-lock.js +160 -0
- package/dist/src/daemon/resume-worktree.d.ts +7 -0
- package/dist/src/daemon/resume-worktree.js +29 -0
- package/dist/src/daemon/retry-worktree.d.ts +18 -0
- package/dist/src/daemon/retry-worktree.js +139 -0
- package/dist/src/daemon/retrying-turn.d.ts +2 -10
- package/dist/src/daemon/retrying-turn.js +145 -141
- package/dist/src/daemon/schedule-control.d.ts +26 -0
- package/dist/src/daemon/schedule-control.js +110 -0
- package/dist/src/daemon/schedule-journal.d.ts +6 -0
- package/dist/src/daemon/schedule-journal.js +120 -0
- package/dist/src/daemon/text-output.d.ts +18 -0
- package/dist/src/daemon/text-output.js +44 -0
- package/dist/src/daemon/ticket-registration.d.ts +7 -14
- package/dist/src/daemon/ticket-registration.js +93 -114
- package/dist/src/daemon/turn-attempt-journal.d.ts +38 -0
- package/dist/src/daemon/turn-attempt-journal.js +136 -0
- package/dist/src/daemon/turn-attempts.d.ts +47 -0
- package/dist/src/daemon/turn-attempts.js +166 -0
- package/dist/src/daemon/turn-command.d.ts +10 -0
- package/dist/src/daemon/turn-command.js +33 -0
- package/dist/src/daemon/turn-report.d.ts +25 -0
- package/dist/src/daemon/turn-report.js +118 -0
- package/dist/src/daemon/work-tree.d.ts +11 -1
- package/dist/src/daemon/work-tree.js +35 -12
- package/dist/src/daemon/worker-profile.d.ts +8 -0
- package/dist/src/daemon/worker-profile.js +40 -0
- package/dist/src/daemon/workflow-generations.d.ts +32 -0
- package/dist/src/daemon/workflow-generations.js +57 -0
- package/dist/src/daemon/workflow-replay.d.ts +16 -0
- package/dist/src/daemon/workflow-replay.js +58 -0
- package/dist/src/daemon/workflow-schedules.d.ts +30 -0
- package/dist/src/daemon/workflow-schedules.js +238 -0
- package/dist/src/daemon/worktree-processes.d.ts +9 -0
- package/dist/src/daemon/worktree-processes.js +151 -0
- package/dist/src/decision-wait.d.ts +1 -0
- package/dist/src/decision-wait.js +3 -0
- package/dist/src/delivery-backoff.d.ts +1 -0
- package/dist/src/delivery-backoff.js +3 -0
- package/dist/src/doctor-report.d.ts +22 -0
- package/dist/src/doctor-report.js +63 -0
- package/dist/src/execution-pin.d.ts +5 -0
- package/dist/src/execution-pin.js +67 -4
- package/dist/src/grok-result.d.ts +12 -0
- package/dist/src/grok-result.js +61 -0
- package/dist/src/harness-defaults.d.ts +35 -0
- package/dist/src/harness-defaults.js +121 -0
- package/dist/src/harness-start.d.ts +15 -0
- package/dist/src/harness-start.js +37 -0
- package/dist/src/host/command-wait.d.ts +38 -0
- package/dist/src/host/command-wait.js +115 -0
- package/dist/src/host/decision-resume.d.ts +35 -0
- package/dist/src/host/decision-resume.js +86 -0
- package/dist/src/host/gate-bridge.d.ts +48 -0
- package/dist/src/host/gate-bridge.js +124 -0
- package/dist/src/host/run-wait.d.ts +26 -0
- package/dist/src/host/run-wait.js +37 -0
- package/dist/src/host/start-delivery.d.ts +6 -8
- package/dist/src/host/start-delivery.js +13 -18
- package/dist/src/host/step-bridge-host.d.ts +8 -20
- package/dist/src/host/step-bridge-host.js +65 -58
- package/dist/src/merge-request.d.ts +19 -0
- package/dist/src/merge-request.js +32 -0
- package/dist/src/operation-identity.d.ts +1 -0
- package/dist/src/operation-identity.js +4 -0
- package/dist/src/phone/canonical-json.d.ts +1 -0
- package/dist/src/phone/canonical-json.js +16 -0
- package/dist/src/phone/phone-link.d.ts +7 -0
- package/dist/src/phone/phone-link.js +21 -0
- package/dist/src/phone/qr-data.d.ts +8 -0
- package/dist/src/phone/qr-data.js +133 -0
- package/dist/src/phone/qr-matrix.d.ts +6 -0
- package/dist/src/phone/qr-matrix.js +175 -0
- package/dist/src/phone/qr-penalty.d.ts +3 -0
- package/dist/src/phone/qr-penalty.js +67 -0
- package/dist/src/phone/qr-picture.d.ts +5 -0
- package/dist/src/phone/qr-picture.js +24 -0
- package/dist/src/private-config.schema.json +303 -0
- package/dist/src/project-config.schema.json +105 -0
- package/dist/src/project-settings.d.ts +19 -0
- package/dist/src/project-settings.js +133 -0
- package/dist/src/queue-spend.d.ts +4 -0
- package/dist/src/queue-spend.js +21 -0
- package/dist/src/relay/answer-check.d.ts +24 -0
- package/dist/src/relay/answer-check.js +145 -0
- package/dist/src/relay/answer-inbox.d.ts +15 -0
- package/dist/src/relay/answer-inbox.js +173 -0
- package/dist/src/relay/daemon-keys.d.ts +16 -0
- package/dist/src/relay/daemon-keys.js +75 -0
- package/dist/src/relay/decision-check.d.ts +3 -0
- package/dist/src/relay/decision-check.js +77 -0
- package/dist/src/relay/decision-close.d.ts +6 -0
- package/dist/src/relay/decision-close.js +72 -0
- package/dist/src/relay/decision-envelopes.d.ts +29 -0
- package/dist/src/relay/decision-envelopes.js +93 -0
- package/dist/src/relay/decision-watch.d.ts +14 -0
- package/dist/src/relay/decision-watch.js +68 -0
- package/dist/src/relay/envelope-post.d.ts +8 -0
- package/dist/src/relay/envelope-post.js +71 -0
- package/dist/src/relay/envelope.d.ts +28 -0
- package/dist/src/relay/envelope.js +53 -0
- package/dist/src/relay/hpke.d.ts +25 -0
- package/dist/src/relay/hpke.js +108 -0
- package/dist/src/relay/pairing-checks.d.ts +42 -0
- package/dist/src/relay/pairing-checks.js +172 -0
- package/dist/src/relay/pairing-follow.d.ts +8 -0
- package/dist/src/relay/pairing-follow.js +95 -0
- package/dist/src/relay/pairing-session.d.ts +29 -0
- package/dist/src/relay/pairing-session.js +87 -0
- package/dist/src/relay/phone-delivery.d.ts +51 -0
- package/dist/src/relay/phone-delivery.js +139 -0
- package/dist/src/relay/phone-devices.d.ts +36 -0
- package/dist/src/relay/phone-devices.js +46 -0
- package/dist/src/relay/phone-inbox.d.ts +18 -0
- package/dist/src/relay/phone-inbox.js +17 -0
- package/dist/src/relay/phone-operations.d.ts +18 -0
- package/dist/src/relay/phone-operations.js +121 -0
- package/dist/src/relay/phone-outbox.d.ts +21 -0
- package/dist/src/relay/phone-outbox.js +25 -0
- package/dist/src/relay/phone-socket.d.ts +6 -0
- package/dist/src/relay/phone-socket.js +63 -0
- package/dist/src/relay/relay-control.d.ts +7 -0
- package/dist/src/relay/relay-control.js +24 -0
- package/dist/src/relay/relay-files.d.ts +2 -0
- package/dist/src/relay/relay-files.js +23 -0
- package/dist/src/relay/relay-heartbeat.d.ts +17 -0
- package/dist/src/relay/relay-heartbeat.js +81 -0
- package/dist/src/relay/relay-http.d.ts +14 -0
- package/dist/src/relay/relay-http.js +63 -0
- package/dist/src/relay/relay-registration.d.ts +15 -0
- package/dist/src/relay/relay-registration.js +63 -0
- package/dist/src/relay/relay-service.d.ts +28 -0
- package/dist/src/relay/relay-service.js +218 -0
- package/dist/src/relay/relay-store.d.ts +48 -0
- package/dist/src/relay/relay-store.js +131 -0
- package/dist/src/relay/sealed-post.d.ts +25 -0
- package/dist/src/relay/sealed-post.js +52 -0
- package/dist/src/relay.d.ts +1 -0
- package/dist/src/relay.js +8 -0
- package/dist/src/report-ci.d.ts +164 -0
- package/dist/src/report-ci.js +32 -0
- package/dist/src/report-effects.d.ts +15 -0
- package/dist/src/report-effects.js +212 -0
- package/dist/src/report-flow-types.d.ts +38 -0
- package/dist/src/report-flow-types.js +7 -0
- package/dist/src/report-flow.d.ts +43 -0
- package/dist/src/report-flow.js +193 -0
- package/dist/src/report-operator.d.ts +67 -0
- package/dist/src/report-operator.js +25 -0
- package/dist/src/report-quality.d.ts +221 -0
- package/dist/src/report-quality.js +94 -0
- package/dist/src/report-ready.d.ts +23 -0
- package/dist/src/report-ready.js +117 -0
- package/dist/src/report-statistics.d.ts +51 -0
- package/dist/src/report-statistics.js +106 -0
- package/dist/src/report.d.ts +712 -0
- package/dist/src/report.js +234 -0
- package/dist/src/repository-identity.d.ts +4 -0
- package/dist/src/repository-identity.js +4 -0
- package/dist/src/review-subject.d.ts +41 -0
- package/dist/src/review-subject.js +91 -0
- package/dist/src/run-wait.d.ts +23 -0
- package/dist/src/run-wait.js +20 -0
- package/dist/src/schedule-progress.d.ts +33 -0
- package/dist/src/schedule-progress.js +45 -0
- package/dist/src/service/active-tickets.d.ts +4 -0
- package/dist/src/service/active-tickets.js +49 -0
- package/dist/src/service/command-effects.d.ts +4 -0
- package/dist/src/service/command-effects.js +16 -0
- package/dist/src/service/command-waits.d.ts +34 -0
- package/dist/src/service/command-waits.js +86 -0
- package/dist/src/service/decision-handler.d.ts +4 -0
- package/dist/src/service/decision-handler.js +39 -4
- package/dist/src/service/expiry.js +2 -0
- package/dist/src/service/gateway.js +21 -4
- package/dist/src/service/queue-spend.d.ts +6 -0
- package/dist/src/service/queue-spend.js +68 -0
- package/dist/src/service/registry.d.ts +16 -3
- package/dist/src/service/registry.js +34 -3
- package/dist/src/service/replies.d.ts +16 -1
- package/dist/src/service/replies.js +23 -0
- package/dist/src/service/run-handlers.js +35 -56
- package/dist/src/service/run-metadata.d.ts +22 -0
- package/dist/src/service/run-metadata.js +138 -0
- package/dist/src/service/run-waits.d.ts +3 -0
- package/dist/src/service/run-waits.js +41 -0
- package/dist/src/service/service.d.ts +22 -2
- package/dist/src/service/service.js +29 -13
- package/dist/src/service/submission-handler.d.ts +0 -1
- package/dist/src/service/submission-handler.js +22 -36
- package/dist/src/service/worker-port.d.ts +1 -0
- package/dist/src/service/worker-port.js +9 -1
- package/dist/src/service/worker-totals.d.ts +2 -0
- package/dist/src/service/worker-totals.js +9 -24
- package/dist/src/step-bridge.d.ts +43 -0
- package/dist/src/steps/command-wait.d.ts +12 -0
- package/dist/src/steps/command-wait.js +26 -0
- package/dist/src/steps/merge-by-person.d.ts +2 -0
- package/dist/src/steps/merge-by-person.js +18 -0
- package/dist/src/steps/merge-when-green.d.ts +2 -0
- package/dist/src/steps/merge-when-green.js +62 -0
- package/dist/src/steps/open-decision-wait.d.ts +2 -0
- package/dist/src/steps/open-decision-wait.js +8 -0
- package/dist/src/steps/review-by-agent.d.ts +5 -0
- package/dist/src/steps/review-by-agent.js +124 -0
- package/dist/src/steps/review-by-person.d.ts +4 -0
- package/dist/src/steps/review-by-person.js +19 -0
- package/dist/src/steps/review-subject.d.ts +2 -0
- package/dist/src/steps/review-subject.js +11 -0
- package/dist/src/steps/run-command.d.ts +2 -0
- package/dist/src/steps/run-command.js +15 -0
- package/dist/src/steps/sleep.d.ts +3 -0
- package/dist/src/steps/sleep.js +19 -0
- package/dist/src/steps/wait-for-command.d.ts +3 -0
- package/dist/src/steps/wait-for-command.js +17 -0
- package/dist/src/steps/wait-for-decision.d.ts +2 -0
- package/dist/src/steps/wait-for-decision.js +71 -0
- package/dist/src/steps/wait-for-run.d.ts +5 -0
- package/dist/src/steps/wait-for-run.js +9 -0
- package/dist/src/storage/command-wait-rows.d.ts +30 -0
- package/dist/src/storage/command-wait-rows.js +96 -0
- package/dist/src/storage/decision-snapshots.d.ts +9 -1
- package/dist/src/storage/decision-snapshots.js +22 -2
- package/dist/src/storage/domain-changes.d.ts +2 -0
- package/dist/src/storage/domain-changes.js +3 -0
- package/dist/src/storage/domain-schema.d.ts +13 -1
- package/dist/src/storage/domain-schema.js +31 -4
- package/dist/src/storage/effect-schema.d.ts +1 -0
- package/dist/src/storage/effect-schema.js +5 -0
- package/dist/src/submission.d.ts +4 -0
- package/dist/src/submission.js +6 -2
- package/dist/src/testing-requests.d.ts +15 -0
- package/dist/src/testing-requests.js +93 -0
- package/dist/src/testing.d.ts +23 -0
- package/dist/src/testing.js +211 -0
- package/dist/src/ticket-status-stream.d.ts +9 -0
- package/dist/src/ticket-status-stream.js +94 -0
- package/dist/src/token-prices.d.ts +12 -4
- package/dist/src/token-prices.js +15 -2
- package/dist/src/turn-profile.d.ts +1 -0
- package/dist/src/turn-profile.js +8 -1
- package/dist/src/worker-usage.d.ts +17 -0
- package/dist/src/worker-usage.js +60 -0
- package/dist/src/workflow-admission.d.ts +5 -0
- package/dist/src/workflow-candidate.d.ts +8 -2
- package/dist/src/workflow-candidate.js +59 -6
- package/dist/src/workflow-contracts.d.ts +1 -0
- package/dist/src/workflow-contracts.js +9 -2
- package/dist/src/workflow-declaration.d.ts +21 -3
- package/dist/src/workflow-declaration.js +77 -9
- package/dist/src/workflow-discovery.d.ts +3 -13
- package/dist/src/workflow-discovery.js +5 -14
- package/dist/src/workflow-refusals.js +3 -1
- package/dist/src/workflow-schedule.d.ts +22 -0
- package/dist/src/workflow-schedule.js +53 -0
- package/dist/src/workflows.d.ts +12 -2
- package/dist/src/workflows.js +9 -1
- package/dist/tools/admit-workflow.d.ts +1 -0
- package/dist/tools/admit-workflow.js +18 -5
- package/dist/tools/doctor-adoption.d.ts +1 -0
- package/dist/tools/doctor-adoption.js +11 -0
- package/dist/tools/project-configuration.d.ts +4 -0
- package/dist/tools/project-configuration.js +47 -0
- package/dist/tools/red-green-command.d.ts +1 -0
- package/dist/tools/red-green-command.js +174 -0
- package/dist/tools/red-green-process.d.ts +10 -0
- package/dist/tools/red-green-process.js +59 -0
- package/dist/tools/self-host-processes.d.ts +3 -0
- package/dist/tools/self-host-processes.js +63 -33
- package/dist/tools/self-host-project.d.ts +4 -0
- package/dist/tools/self-host-project.js +42 -60
- package/dist/tools/self-host-runtime.d.ts +16 -0
- package/dist/tools/self-host-runtime.js +60 -0
- package/dist/tools/self-host-workflows.d.ts +1 -0
- package/dist/tools/self-host-workflows.js +36 -1
- package/dist/tools/self-host.js +128 -71
- package/dist/tools/template-command.d.ts +1 -0
- package/dist/tools/template-command.js +160 -0
- package/dist/tools/template-copy.d.ts +11 -0
- package/dist/tools/template-copy.js +130 -0
- package/dist/tools/template-files.d.ts +17 -0
- package/dist/tools/template-files.js +74 -0
- package/dist/tools/workflow-bundles.js +1 -0
- package/dist/tools/workflow-candidate-counts.d.ts +6 -2
- package/dist/tools/workflow-candidate-counts.js +31 -16
- package/dist/tools/workflow-candidate-fields.d.ts +5 -0
- package/dist/tools/workflow-candidate-fields.js +24 -0
- package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
- package/dist/tools/workflow-candidate-helper-counts.js +129 -0
- package/dist/tools/workflow-candidate-program.d.ts +2 -0
- package/dist/tools/workflow-candidate-program.js +36 -8
- package/dist/tools/workflow-candidate-shape.d.ts +3 -0
- package/dist/tools/workflow-candidate-shape.js +90 -0
- package/dist/tools/workflow-candidate-source.js +92 -16
- package/dist/tools/workflow-candidate-syntax.d.ts +9 -3
- package/dist/tools/workflow-candidate-syntax.js +83 -109
- package/dist/tools/workflow-command.d.ts +1 -0
- package/dist/tools/workflow-command.js +142 -0
- package/dist/tools/workflow-folder-capture.d.ts +1 -0
- package/dist/tools/workflow-folder-capture.js +47 -2
- package/dist/tools/workflow-folders.d.ts +18 -3
- package/dist/tools/workflow-folders.js +60 -7
- package/dist/tools/workflow-test-hook.d.ts +7 -0
- package/dist/tools/workflow-test-hook.js +16 -0
- package/dist/tools/workflow-test-loader.d.ts +1 -0
- package/dist/tools/workflow-test-loader.js +10 -0
- package/package.json +60 -10
- package/templates/develop/README.md +90 -0
- package/templates/develop/develop/accept.ts +11 -0
- package/templates/develop/develop/flow-tests.ts +394 -0
- package/templates/develop/develop/local.ts +40 -0
- package/templates/develop/develop/option-tests.ts +174 -0
- package/templates/develop/develop/partial-choice.ts +29 -0
- package/templates/develop/develop/partial.ts +28 -0
- package/templates/develop/develop/pull.ts +156 -0
- package/templates/develop/develop/queue-partial.ts +39 -0
- package/templates/develop/develop/refusal-tests.ts +251 -0
- package/templates/develop/develop/report.ts +156 -0
- package/templates/develop/develop/round.ts +40 -0
- package/templates/develop/develop/scenarios.ts +87 -0
- package/templates/develop/develop/turn.ts +68 -0
- package/templates/develop/develop.declaration.json +24 -0
- package/templates/develop/develop.test.ts +287 -0
- package/templates/develop/develop.ts +30 -0
- package/templates/develop/template.json +153 -0
- package/templates/idea-to-issue/README.md +27 -0
- package/templates/idea-to-issue/idea-to-issue/effects.ts +52 -0
- package/templates/idea-to-issue/idea-to-issue/leave.ts +10 -0
- package/templates/idea-to-issue/idea-to-issue/next.ts +29 -0
- package/templates/idea-to-issue/idea-to-issue/post-person.ts +18 -0
- package/templates/idea-to-issue/idea-to-issue/post.ts +50 -0
- package/templates/idea-to-issue/idea-to-issue/queue.ts +27 -0
- package/templates/idea-to-issue/idea-to-issue/review.ts +42 -0
- package/templates/idea-to-issue/idea-to-issue/scenarios.ts +50 -0
- package/templates/idea-to-issue/idea-to-issue/turn.ts +40 -0
- package/templates/idea-to-issue/idea-to-issue.declaration.json +16 -0
- package/templates/idea-to-issue/idea-to-issue.test.ts +79 -0
- package/templates/idea-to-issue/idea-to-issue.ts +49 -0
- package/templates/idea-to-issue/template.json +81 -0
- package/templates/review-day/README.md +97 -0
- package/templates/review-day/review-day/critique.ts +58 -0
- package/templates/review-day/review-day/decision.ts +29 -0
- package/templates/review-day/review-day/facts.ts +69 -0
- package/templates/review-day/review-day/label.ts +29 -0
- package/templates/review-day/review-day/next.ts +28 -0
- package/templates/review-day/review-day/post.ts +27 -0
- package/templates/review-day/review-day/report.ts +98 -0
- package/templates/review-day/review-day/rules.ts +12 -0
- package/templates/review-day/review-day/scenarios.ts +76 -0
- package/templates/review-day/review-day/turn.ts +73 -0
- package/templates/review-day/review-day.declaration.json +16 -0
- package/templates/review-day/review-day.test.ts +362 -0
- package/templates/review-day/review-day.ts +37 -0
- package/templates/review-day/template.json +56 -0
- package/dist/src/chats/analysis-batches.d.ts +0 -42
- package/dist/src/chats/analysis-batches.js +0 -97
- package/dist/src/chats/analysis-checkpoint.d.ts +0 -29
- package/dist/src/chats/analysis-checkpoint.js +0 -31
- package/dist/src/chats/analysis-contract.d.ts +0 -80
- package/dist/src/chats/analysis-contract.js +0 -16
- package/dist/src/chats/analysis-data.d.ts +0 -3
- package/dist/src/chats/analysis-data.js +0 -85
- package/dist/src/chats/analysis-input.d.ts +0 -18
- package/dist/src/chats/analysis-input.js +0 -97
- package/dist/src/chats/analysis-links.d.ts +0 -2
- package/dist/src/chats/analysis-links.js +0 -25
- package/dist/src/chats/analysis-merge.d.ts +0 -16
- package/dist/src/chats/analysis-merge.js +0 -134
- package/dist/src/chats/analysis-prompt.d.ts +0 -18
- package/dist/src/chats/analysis-prompt.js +0 -42
- package/dist/src/chats/analysis-proposal.d.ts +0 -4
- package/dist/src/chats/analysis-proposal.js +0 -41
- package/dist/src/chats/analysis-provenance.d.ts +0 -4
- package/dist/src/chats/analysis-provenance.js +0 -99
- package/dist/src/chats/analysis-shape.d.ts +0 -4
- package/dist/src/chats/analysis-shape.js +0 -235
- package/dist/src/chats/analysis.d.ts +0 -3
- package/dist/src/chats/analysis.js +0 -42
- package/dist/src/chats/corpus-input.d.ts +0 -5
- package/dist/src/chats/corpus-input.js +0 -288
- package/dist/src/chats/destination.d.ts +0 -4
- package/dist/src/chats/destination.js +0 -96
- package/dist/src/chats/import.d.ts +0 -15
- package/dist/src/chats/import.js +0 -243
- package/dist/src/chats/input-file.d.ts +0 -3
- package/dist/src/chats/input-file.js +0 -32
- package/dist/src/chats/normalize.d.ts +0 -29
- package/dist/src/chats/normalize.js +0 -155
- package/dist/src/chats/previous-import.d.ts +0 -5
- package/dist/src/chats/previous-import.js +0 -34
- package/dist/src/chats/reader.d.ts +0 -21
- package/dist/src/chats/reader.js +0 -118
- package/dist/src/chats/redact-import.d.ts +0 -14
- package/dist/src/chats/redact-import.js +0 -141
- package/dist/src/chats/redaction.d.ts +0 -41
- package/dist/src/chats/redaction.js +0 -161
- package/dist/src/chats/reference-mapping.d.ts +0 -16
- package/dist/src/chats/reference-mapping.js +0 -153
- package/dist/src/chats/revision-input.d.ts +0 -3
- package/dist/src/chats/revision-input.js +0 -180
- package/dist/src/chats/revision.d.ts +0 -48
- package/dist/src/chats/revision.js +0 -94
- package/dist/src/chats/selection.d.ts +0 -25
- package/dist/src/chats/selection.js +0 -109
- package/dist/src/chats/source.d.ts +0 -23
- package/dist/src/chats/source.js +0 -135
- package/dist/src/chats/structure.d.ts +0 -57
- package/dist/src/chats/structure.js +0 -216
- package/dist/src/chats/workflow-generation-projection.d.ts +0 -8
- package/dist/src/chats/workflow-generation-projection.js +0 -75
- package/dist/src/chats/workflow-generation-source.d.ts +0 -25
- package/dist/src/chats/workflow-generation-source.js +0 -124
- package/dist/src/chats/workflow-generation-text.d.ts +0 -23
- package/dist/src/chats/workflow-generation-text.js +0 -74
- package/dist/src/chats/workflow-generation.d.ts +0 -69
- package/dist/src/chats/workflow-generation.js +0 -142
- package/dist/src/cli/watch-start-view.d.ts +0 -18
- package/dist/src/cli/watch-start-view.js +0 -77
- package/dist/src/daemon/analysis-launch.d.ts +0 -5
- package/dist/src/daemon/analysis-launch.js +0 -81
- package/dist/src/daemon/analysis-token.d.ts +0 -6
- package/dist/src/daemon/analysis-token.js +0 -88
- package/dist/src/daemon/analysis-worker.d.ts +0 -20
- package/dist/src/daemon/analysis-worker.js +0 -271
- package/dist/src/daemon/chats-batch-binding.d.ts +0 -23
- package/dist/src/daemon/chats-batch-binding.js +0 -99
- package/dist/src/daemon/chats-capture.d.ts +0 -18
- package/dist/src/daemon/chats-capture.js +0 -194
- package/dist/src/daemon/chats-checkpoints.d.ts +0 -41
- package/dist/src/daemon/chats-checkpoints.js +0 -186
- package/dist/src/daemon/chats-files.d.ts +0 -42
- package/dist/src/daemon/chats-files.js +0 -252
- package/dist/src/daemon/chats-follow-up.d.ts +0 -38
- package/dist/src/daemon/chats-follow-up.js +0 -180
- package/dist/src/daemon/chats-question.d.ts +0 -15
- package/dist/src/daemon/chats-question.js +0 -93
- package/dist/src/daemon/chats-worker.d.ts +0 -13
- package/dist/src/daemon/chats-worker.js +0 -201
- package/dist/src/steps/decision-gate.d.ts +0 -2
- package/dist/src/steps/decision-gate.js +0 -8
- package/dist/workflows/analyze-chats.d.ts +0 -15
- package/dist/workflows/analyze-chats.declaration.json +0 -22
- package/dist/workflows/analyze-chats.js +0 -250
- package/dist/workflows/develop-prd.d.ts +0 -7
- package/dist/workflows/develop-prd.js +0 -165
- package/dist/workflows/develop-ticket.d.ts +0 -9
- package/dist/workflows/develop-ticket.js +0 -207
- package/dist/workflows/issue-labels.d.ts +0 -16
- package/dist/workflows/issue-labels.js +0 -70
- package/dist/workflows/ticket-prompts.d.ts +0 -35
- package/dist/workflows/ticket-prompts.js +0 -143
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { component, element } from "./watch-element.js";
|
|
2
|
+
export function timeLeft(expiresAt, now) {
|
|
3
|
+
const seconds = Math.max(0, Math.ceil((Date.parse(expiresAt) - Date.parse(now)) / 1000));
|
|
4
|
+
return `${String(Math.floor(seconds / 60))}:${String(seconds % 60).padStart(2, "0")} left`;
|
|
5
|
+
}
|
|
6
|
+
export function refusalText(code) {
|
|
7
|
+
const texts = {
|
|
8
|
+
"pairing-mac-invalid": "The phone sent a request that does not agree with the QR code.",
|
|
9
|
+
"pairing-key-invalid": "The phone sent a key that is not valid.",
|
|
10
|
+
"pairing-request-invalid": "The phone sent a request that is not valid.",
|
|
11
|
+
"pairing-device-revoked": "This phone was removed. Connect it again as a new phone.",
|
|
12
|
+
"pairing-expired": "The connection request expired. Click Connect a phone again.",
|
|
13
|
+
"pairing-check-invalid": "The phone did not confirm the connection. Remove it and connect again.",
|
|
14
|
+
};
|
|
15
|
+
return texts[code] ?? `The connection did not work (${code}).`;
|
|
16
|
+
}
|
|
17
|
+
export function PhoneCode(props) {
|
|
18
|
+
const { size, path } = props.picture;
|
|
19
|
+
return element("svg", {
|
|
20
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
21
|
+
class: "phone-qr",
|
|
22
|
+
viewBox: `0 0 ${String(size)} ${String(size)}`,
|
|
23
|
+
role: "img",
|
|
24
|
+
"aria-label": "Pairing QR code",
|
|
25
|
+
"shape-rendering": "crispEdges",
|
|
26
|
+
children: [
|
|
27
|
+
element("rect", { width: size, height: size, fill: "#ffffff" }),
|
|
28
|
+
element("path", { d: path, fill: "#000000" }),
|
|
29
|
+
],
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
export function phoneButton(label, onClick) {
|
|
33
|
+
return element("button", { type: "button", onClick, children: label });
|
|
34
|
+
}
|
|
35
|
+
export function PhoneAsk(props) {
|
|
36
|
+
const { phone } = props;
|
|
37
|
+
const request = phone.request;
|
|
38
|
+
if (request === null)
|
|
39
|
+
return null;
|
|
40
|
+
if (phone.stage === "checking")
|
|
41
|
+
return element("p", { children: `Checking ${request.name}` });
|
|
42
|
+
return element("div", {
|
|
43
|
+
class: "phone-ask",
|
|
44
|
+
children: [
|
|
45
|
+
element("strong", {
|
|
46
|
+
children: `Connect "${request.name}" (${request.platform})? Code ${request.code}`,
|
|
47
|
+
}),
|
|
48
|
+
phoneButton("Accept", phone.onAccept),
|
|
49
|
+
phoneButton("Deny", phone.onDeny),
|
|
50
|
+
],
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export function PhoneList(props) {
|
|
54
|
+
const { phone } = props;
|
|
55
|
+
if (phone.devices.length === 0)
|
|
56
|
+
return null;
|
|
57
|
+
return element("ul", {
|
|
58
|
+
class: "phone-list",
|
|
59
|
+
children: phone.devices.map((device) => element("li", {
|
|
60
|
+
key: device.deviceId,
|
|
61
|
+
children: [
|
|
62
|
+
`${device.name} (${device.platform}) ${device.removedAt === null ? device.state : "removed"}`,
|
|
63
|
+
device.removedAt === null
|
|
64
|
+
? phoneButton("Remove", () => {
|
|
65
|
+
phone.onRemove(device.deviceId);
|
|
66
|
+
})
|
|
67
|
+
: null,
|
|
68
|
+
],
|
|
69
|
+
})),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
export function phoneNotices(phone) {
|
|
73
|
+
const lines = [
|
|
74
|
+
phone.reason === "registration-lost" ? "Connect your phones again." : null,
|
|
75
|
+
phone.connected === null ? null : `Connected: ${phone.connected}`,
|
|
76
|
+
phone.refusal === null ? null : refusalText(phone.refusal),
|
|
77
|
+
phone.message === "" ? null : phone.message,
|
|
78
|
+
];
|
|
79
|
+
return lines.map((line) => line === null ? null : element("p", { role: "status", children: line }));
|
|
80
|
+
}
|
|
81
|
+
export function PhonePanel(props) {
|
|
82
|
+
const { phone, now } = props;
|
|
83
|
+
const waiting = phone.request === null ? phone.pairing : null;
|
|
84
|
+
return element("section", {
|
|
85
|
+
class: waiting === null ? "phone" : "phone phone-pairing",
|
|
86
|
+
children: [
|
|
87
|
+
waiting === null
|
|
88
|
+
? null
|
|
89
|
+
: component(PhoneCode, { picture: waiting.picture }),
|
|
90
|
+
element("div", {
|
|
91
|
+
children: [
|
|
92
|
+
waiting === null
|
|
93
|
+
? null
|
|
94
|
+
: [
|
|
95
|
+
element("strong", { children: "Scan with your phone camera" }),
|
|
96
|
+
element("span", { children: timeLeft(waiting.expiresAt, now) }),
|
|
97
|
+
],
|
|
98
|
+
component(PhoneAsk, { phone }),
|
|
99
|
+
phone.pairing === null
|
|
100
|
+
? element("button", {
|
|
101
|
+
type: "button",
|
|
102
|
+
disabled: phone.busy,
|
|
103
|
+
onClick: phone.onPair,
|
|
104
|
+
children: "Connect a phone",
|
|
105
|
+
})
|
|
106
|
+
: phoneButton("Cancel", phone.onCancel),
|
|
107
|
+
phoneNotices(phone),
|
|
108
|
+
],
|
|
109
|
+
}),
|
|
110
|
+
component(PhoneList, { phone }),
|
|
111
|
+
],
|
|
112
|
+
});
|
|
113
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IncomingMessage } from "node:http";
|
|
2
|
+
import { type WatchActions } from "./watch-actions.ts";
|
|
3
|
+
export declare function isPhoneAction(path: string): boolean;
|
|
4
|
+
export declare function phoneAction(actions: WatchActions, request: IncomingMessage): Promise<string | null>;
|
|
5
|
+
export declare function phoneRead(runtimeDirectory: string): Promise<string>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { qrMatrix } from "../phone/qr-matrix.js";
|
|
2
|
+
import { qrPicture } from "../phone/qr-picture.js";
|
|
3
|
+
import { phoneRequest } from "./phone-client.js";
|
|
4
|
+
import { actionAllowed, actionBody, } from "./watch-actions.js";
|
|
5
|
+
const operations = {
|
|
6
|
+
"/actions/phone/pair": "phone-pair-start",
|
|
7
|
+
"/actions/phone/cancel": "phone-pair-cancel",
|
|
8
|
+
"/actions/phone/accept": "phone-pair-accept",
|
|
9
|
+
"/actions/phone/deny": "phone-pair-deny",
|
|
10
|
+
"/actions/phone/remove": "phone-remove",
|
|
11
|
+
};
|
|
12
|
+
export function isPhoneAction(path) {
|
|
13
|
+
return Object.hasOwn(operations, path);
|
|
14
|
+
}
|
|
15
|
+
function withPicture(result) {
|
|
16
|
+
const link = result["link"];
|
|
17
|
+
return typeof link === "string"
|
|
18
|
+
? { ...result, picture: qrPicture(qrMatrix(link).modules) }
|
|
19
|
+
: result;
|
|
20
|
+
}
|
|
21
|
+
export async function phoneAction(actions, request) {
|
|
22
|
+
const operation = operations[new URL(String(request.url), "http://localhost").pathname];
|
|
23
|
+
if (operation === undefined || !actionAllowed(actions, request))
|
|
24
|
+
return null;
|
|
25
|
+
const body = await actionBody(request);
|
|
26
|
+
if (typeof body !== "object" || body === null || Array.isArray(body))
|
|
27
|
+
return null;
|
|
28
|
+
const reply = await phoneRequest(actions.runtimeDirectory, {
|
|
29
|
+
operation,
|
|
30
|
+
parameters: { ...body },
|
|
31
|
+
});
|
|
32
|
+
if (reply === undefined)
|
|
33
|
+
return JSON.stringify({
|
|
34
|
+
error: {
|
|
35
|
+
code: "phone-relay-off",
|
|
36
|
+
detail: "The phone relay is off or not started.",
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
return JSON.stringify(reply.kind === "result"
|
|
40
|
+
? withPicture(reply.result)
|
|
41
|
+
: { error: reply.error });
|
|
42
|
+
}
|
|
43
|
+
export async function phoneRead(runtimeDirectory) {
|
|
44
|
+
const reply = await phoneRequest(runtimeDirectory, {
|
|
45
|
+
operation: "phone-state",
|
|
46
|
+
parameters: {},
|
|
47
|
+
});
|
|
48
|
+
if (reply === undefined)
|
|
49
|
+
return JSON.stringify({ relay: "off" });
|
|
50
|
+
return JSON.stringify(reply.kind === "result"
|
|
51
|
+
? { relay: "on", ...reply.result }
|
|
52
|
+
: { relay: "on", error: reply.error });
|
|
53
|
+
}
|
|
@@ -2,7 +2,7 @@ function observedCard(context, card) {
|
|
|
2
2
|
if (card.completionMark?.text !== "Needs attention")
|
|
3
3
|
return card;
|
|
4
4
|
const run = context.model.runs.find((run) => run.runId === card.runId);
|
|
5
|
-
if (run
|
|
5
|
+
if (run === undefined ||
|
|
6
6
|
run.state !== "completed" ||
|
|
7
7
|
run.outcome !== "blocked" ||
|
|
8
8
|
run.pullRequest === null)
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import type { CiRerunNotice } from "./github-ci-progress.ts";
|
|
1
2
|
import type { WatchRun } from "./watch-render.ts";
|
|
2
3
|
import { type PrRepository } from "./watch-pr-identity.ts";
|
|
3
4
|
export interface GithubRecords {
|
|
4
5
|
readonly started: unknown;
|
|
5
6
|
readonly result: unknown;
|
|
7
|
+
readonly ciReruns?: readonly CiRerunNotice[];
|
|
6
8
|
}
|
|
7
9
|
export declare function pullOf(inputs: {
|
|
8
10
|
readonly records: readonly GithubRecords[];
|
|
9
11
|
readonly repository: PrRepository | null;
|
|
10
|
-
}, runId: string): Pick<WatchRun, "pullRequest" | "reviews" | "mergeCommit" | "mergeProof">;
|
|
12
|
+
}, runId: string): Pick<WatchRun, "pullRequest" | "reviews" | "mergeCommit" | "mergeProof" | "ciReruns">;
|
|
@@ -23,6 +23,11 @@ function list(value) {
|
|
|
23
23
|
function count(value) {
|
|
24
24
|
return typeof value === "number" ? value : null;
|
|
25
25
|
}
|
|
26
|
+
function methodScope(method, operation) {
|
|
27
|
+
if (operation[3] === "pull-request")
|
|
28
|
+
return operation[4] === `github-${method}`;
|
|
29
|
+
return (method === "merge" && operation[3] === "merge" && operation[4] === "merge");
|
|
30
|
+
}
|
|
26
31
|
function attributed(started, operation) {
|
|
27
32
|
const stage = list(operation[5]);
|
|
28
33
|
const checked = operationIdentity({
|
|
@@ -37,8 +42,7 @@ function attributed(started, operation) {
|
|
|
37
42
|
});
|
|
38
43
|
return (checked.kind === "valid" &&
|
|
39
44
|
checked.value === JSON.stringify(operation) &&
|
|
40
|
-
|
|
41
|
-
operation[4] === `github-${text(started["method"])}` &&
|
|
45
|
+
methodScope(text(started["method"]), operation) &&
|
|
42
46
|
(started["runId"] === undefined || started["runId"] === operation[2]));
|
|
43
47
|
}
|
|
44
48
|
function githubOf(records) {
|
|
@@ -47,22 +51,28 @@ function githubOf(records) {
|
|
|
47
51
|
const result = record(records.result);
|
|
48
52
|
const completed = result["outcome"] === "completed";
|
|
49
53
|
return {
|
|
50
|
-
runId:
|
|
54
|
+
runId: started["runId"] === undefined || started["runId"] === operation[2]
|
|
55
|
+
? text(operation[2])
|
|
56
|
+
: "",
|
|
51
57
|
round: Number(operation[1]),
|
|
58
|
+
startedAt: Date.parse(text(started["startedAt"])) || 0,
|
|
52
59
|
method: text(started["method"]),
|
|
53
60
|
completed,
|
|
54
61
|
attributed: attributed(started, operation) && !Object.hasOwn(result, "reason"),
|
|
55
62
|
report: completed ? record(parsed(text(result["result"]))) : {},
|
|
56
63
|
};
|
|
57
64
|
}
|
|
58
|
-
function pullRequestOf(results) {
|
|
65
|
+
function pullRequestOf(results, repository) {
|
|
59
66
|
const opened = results
|
|
60
|
-
.filter((item) => item.method === "open-pr")
|
|
67
|
+
.filter((item) => item.method === "open-pr" && item.completed)
|
|
61
68
|
.map((item) => item.report)
|
|
62
69
|
.findLast((report) => text(report["url"]).startsWith("https://"));
|
|
63
70
|
if (opened === undefined)
|
|
64
71
|
return null;
|
|
65
|
-
|
|
72
|
+
const pull = { number: Number(opened["number"]), url: text(opened["url"]) };
|
|
73
|
+
return repository === null || prIdentity(repository, pull) !== null
|
|
74
|
+
? pull
|
|
75
|
+
: null;
|
|
66
76
|
}
|
|
67
77
|
function reviewsOf(results) {
|
|
68
78
|
return results
|
|
@@ -115,16 +125,20 @@ export function pullOf(inputs, runId) {
|
|
|
115
125
|
const results = inputs.records
|
|
116
126
|
.map(githubOf)
|
|
117
127
|
.filter((item) => item.runId === runId)
|
|
118
|
-
.toSorted((first, second) => first.round - second.round);
|
|
119
|
-
const pullRequest = pullRequestOf(results);
|
|
128
|
+
.toSorted((first, second) => first.round - second.round || first.startedAt - second.startedAt);
|
|
129
|
+
const pullRequest = pullRequestOf(results, inputs.repository);
|
|
120
130
|
const mergeProof = mergeProofOf(results, {
|
|
121
131
|
repository: inputs.repository,
|
|
122
132
|
pullRequest,
|
|
123
133
|
});
|
|
134
|
+
const ciReruns = inputs.records
|
|
135
|
+
.filter((item) => record(item.started)["runId"] === runId)
|
|
136
|
+
.flatMap((item) => item.ciReruns ?? []);
|
|
124
137
|
return {
|
|
125
138
|
pullRequest,
|
|
126
139
|
reviews: reviewsOf(results),
|
|
127
140
|
mergeCommit: mergeCommitOf(results),
|
|
141
|
+
...(ciReruns.length === 0 ? {} : { ciReruns }),
|
|
128
142
|
...(mergeProof === null ? {} : { mergeProof }),
|
|
129
143
|
};
|
|
130
144
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type PrRepository } from "./watch-pr-identity.ts";
|
|
2
|
+
import { type ShownSchedules } from "./schedule-render.ts";
|
|
2
3
|
import { type WorkflowStages } from "../workflow-declaration.ts";
|
|
3
4
|
import { type Fields } from "../protocol.ts";
|
|
4
5
|
import { type WorkflowRefusal } from "../workflow-refusals.ts";
|
|
@@ -16,6 +17,7 @@ interface ReadRun {
|
|
|
16
17
|
readonly events: readonly ReadEvent[];
|
|
17
18
|
}
|
|
18
19
|
export interface WatchRead {
|
|
20
|
+
readonly schedules?: ShownSchedules;
|
|
19
21
|
readonly queue?: Fields;
|
|
20
22
|
readonly service: string;
|
|
21
23
|
readonly workflows: readonly string[];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { establishedIssue } from "./watch-pr-identity.js";
|
|
2
|
+
import { shownSchedules } from "./schedule-render.js";
|
|
2
3
|
import { isWorkflowStages, } from "../workflow-declaration.js";
|
|
3
4
|
import { record } from "../protocol.js";
|
|
4
5
|
import { send } from "./client.js";
|
|
@@ -86,7 +87,6 @@ async function creationOf(reader, runId) {
|
|
|
86
87
|
function matchingCompletion(status, context) {
|
|
87
88
|
const issue = establishedIssue(context.repository, status["issueIdentity"]);
|
|
88
89
|
return (status.state === "completed" &&
|
|
89
|
-
status["workflowId"] === "develop-issue" &&
|
|
90
90
|
record(status["outcome"])?.["kind"] === "handoff_requested" &&
|
|
91
91
|
record(status["outcome"])?.["ticketStatus"] !== "partial" &&
|
|
92
92
|
record(status["outcome"])?.["issueUpdate"] !== "failed" &&
|
|
@@ -127,20 +127,17 @@ async function completionOf(reader, search) {
|
|
|
127
127
|
reader.completions.set(runId, { ...known, creation });
|
|
128
128
|
return { status: known.status, events: creation === null ? [] : [creation] };
|
|
129
129
|
}
|
|
130
|
-
function
|
|
131
|
-
const links = Object.fromEntries(["parentRunId", "chainId", "childRunIds"]
|
|
130
|
+
function refreshedStatus(run, status) {
|
|
131
|
+
const links = Object.fromEntries(["parentRunId", "chainId", "childRunIds", "commandWaits"]
|
|
132
132
|
.filter((name) => Object.hasOwn(status, name))
|
|
133
133
|
.map((name) => [name, status[name]]));
|
|
134
|
-
return {
|
|
135
|
-
...run,
|
|
136
|
-
status: { ...run.status, ...links },
|
|
137
|
-
};
|
|
134
|
+
return { ...run, status: { ...run.status, ...links } };
|
|
138
135
|
}
|
|
139
136
|
async function detailed(reader, summary) {
|
|
140
137
|
const { runId, latestSequence: sequence } = summary;
|
|
141
138
|
const known = reader.details.get(runId);
|
|
142
139
|
if (known !== undefined && known.sequence === sequence)
|
|
143
|
-
return
|
|
140
|
+
return refreshedStatus(known.value, summary);
|
|
144
141
|
const shown = await asked(reader, {
|
|
145
142
|
operation: "status",
|
|
146
143
|
parameters: { runId },
|
|
@@ -181,13 +178,14 @@ function stoppedIssues(runs, context) {
|
|
|
181
178
|
const stopped = runs
|
|
182
179
|
.map((run) => run.status)
|
|
183
180
|
.filter((status) => recentRun(status.latestAt, context.now) &&
|
|
184
|
-
status["workflowId"] === "develop-issue" &&
|
|
185
181
|
(["failed", "cancelled"].includes(status.state) ||
|
|
186
182
|
(status.state === "completed" &&
|
|
187
183
|
record(status["outcome"])?.["kind"] === "blocked")))
|
|
188
|
-
.toSorted((first, second) => Date.parse(second.latestAt ?? "") - Date.parse(first.latestAt ?? ""))
|
|
189
|
-
|
|
190
|
-
|
|
184
|
+
.toSorted((first, second) => Date.parse(second.latestAt ?? "") - Date.parse(first.latestAt ?? ""));
|
|
185
|
+
const retained = [
|
|
186
|
+
...Map.groupBy(stopped, (status) => status["workflowId"]).values(),
|
|
187
|
+
].flatMap((group) => group.slice(0, 20));
|
|
188
|
+
return new Set(retained.flatMap((status) => {
|
|
191
189
|
const issue = establishedIssue(context.repository, status["issueIdentity"]);
|
|
192
190
|
return status.state === "completed" && issue !== null
|
|
193
191
|
? [JSON.stringify(issue)]
|
|
@@ -213,9 +211,7 @@ async function service(reader, now) {
|
|
|
213
211
|
const issues = stoppedIssues(runs, { now, repository: reader.repository });
|
|
214
212
|
const older = issues.size === 0
|
|
215
213
|
? []
|
|
216
|
-
: summaries.filter((summary) => !recentRun(summary.latestAt, now) &&
|
|
217
|
-
summary["workflowId"] === "develop-issue" &&
|
|
218
|
-
summary.state === "completed");
|
|
214
|
+
: summaries.filter((summary) => !recentRun(summary.latestAt, now) && summary.state === "completed");
|
|
219
215
|
for (const summary of older) {
|
|
220
216
|
const candidate = await completionOf(reader, { summary, issues });
|
|
221
217
|
if (candidate !== null)
|
|
@@ -223,6 +219,9 @@ async function service(reader, now) {
|
|
|
223
219
|
}
|
|
224
220
|
return {
|
|
225
221
|
service: "up",
|
|
222
|
+
...("schedules" in status
|
|
223
|
+
? { schedules: shownSchedules(status["schedules"]) }
|
|
224
|
+
: {}),
|
|
226
225
|
...(record(status["queue"]) === undefined
|
|
227
226
|
? {}
|
|
228
227
|
: { queue: record(status["queue"]) ?? {} }),
|
|
@@ -247,11 +246,13 @@ async function singleRun(reader, runId) {
|
|
|
247
246
|
const status = statusOf(reply.result["run"]);
|
|
248
247
|
const known = reader.details.get(runId);
|
|
249
248
|
const value = known !== undefined && known.sequence === status.latestSequence
|
|
250
|
-
?
|
|
249
|
+
? refreshedStatus(known.value, status)
|
|
251
250
|
: await remember(reader, status);
|
|
251
|
+
const metadata = await asked(reader, { operation: "status", parameters: {} });
|
|
252
252
|
return {
|
|
253
253
|
...unavailable,
|
|
254
254
|
service: "up",
|
|
255
|
+
workflowStages: stageMetadata(metadata["workflowStages"]),
|
|
255
256
|
runs: [value],
|
|
256
257
|
decisions: await decisionsOf(reader),
|
|
257
258
|
};
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import type { ShownSchedule, ShownSchedules } from "./schedule-render.ts";
|
|
2
|
+
import type { CommandWaitView } from "../authority/command-wait-view.ts";
|
|
3
|
+
import type { CommandEffect } from "../command-settings.ts";
|
|
1
4
|
import type { CardForm } from "./watch-run-input.ts";
|
|
2
|
-
import type {
|
|
5
|
+
import type { CiRerunNotice } from "./github-ci-progress.ts";
|
|
6
|
+
import type { WorkerUsage, WorkerAttemptUsage } from "../worker-usage.ts";
|
|
3
7
|
import type { PrIdentity, PrObservation } from "./watch-pr-identity.ts";
|
|
4
8
|
import type { WorkflowRefusal } from "../workflow-refusals.ts";
|
|
5
9
|
import type { Fields } from "../protocol.ts";
|
|
@@ -9,6 +13,8 @@ export interface WatchItem {
|
|
|
9
13
|
readonly costUsd?: number;
|
|
10
14
|
}
|
|
11
15
|
export interface WatchTurn {
|
|
16
|
+
readonly attempts?: readonly WorkerAttemptUsage[];
|
|
17
|
+
readonly harness?: string;
|
|
12
18
|
readonly estimatedCostUsd: number | null;
|
|
13
19
|
readonly operationId: string;
|
|
14
20
|
readonly usage: WorkerUsage;
|
|
@@ -64,6 +70,13 @@ export interface WatchStep {
|
|
|
64
70
|
readonly startedAt: string | null;
|
|
65
71
|
}
|
|
66
72
|
export interface WatchCard {
|
|
73
|
+
readonly scheduled?: {
|
|
74
|
+
readonly slot: number;
|
|
75
|
+
};
|
|
76
|
+
readonly commandWaits?: readonly CommandWaitView[];
|
|
77
|
+
readonly spent?: number | null;
|
|
78
|
+
readonly limit?: number | null;
|
|
79
|
+
readonly awaitedRunId?: string | null;
|
|
67
80
|
readonly parentRunId?: string | null;
|
|
68
81
|
readonly chainId?: string;
|
|
69
82
|
readonly childRunIds?: readonly string[];
|
|
@@ -90,6 +103,7 @@ export interface WatchColumn {
|
|
|
90
103
|
readonly cards: readonly WatchCard[];
|
|
91
104
|
}
|
|
92
105
|
export interface WatchWorkflow {
|
|
106
|
+
readonly schedule?: ShownSchedule;
|
|
93
107
|
readonly workflowId: string;
|
|
94
108
|
readonly activeCount: number;
|
|
95
109
|
readonly waitingCount: number;
|
|
@@ -97,6 +111,13 @@ export interface WatchWorkflow {
|
|
|
97
111
|
readonly columns: readonly WatchColumn[];
|
|
98
112
|
}
|
|
99
113
|
export interface WatchRun {
|
|
114
|
+
readonly scheduled?: {
|
|
115
|
+
readonly slot: number;
|
|
116
|
+
};
|
|
117
|
+
readonly commandWaits?: readonly CommandWaitView[];
|
|
118
|
+
readonly awaitedRunId?: string | null;
|
|
119
|
+
readonly commandEffects?: readonly CommandEffect[];
|
|
120
|
+
readonly ciReruns?: readonly CiRerunNotice[];
|
|
100
121
|
readonly parentRunId?: string | null;
|
|
101
122
|
readonly chainId?: string;
|
|
102
123
|
readonly childRunIds?: readonly string[];
|
|
@@ -132,6 +153,7 @@ export interface WatchRun {
|
|
|
132
153
|
readonly mergeCommit: string | null;
|
|
133
154
|
}
|
|
134
155
|
export interface WatchModel {
|
|
156
|
+
readonly schedules?: ShownSchedules;
|
|
135
157
|
readonly queue?: Fields;
|
|
136
158
|
readonly workflowRefusals?: readonly WorkflowRefusal[];
|
|
137
159
|
readonly cardForms?: readonly CardForm[];
|
|
@@ -10,5 +10,4 @@ export interface CardForm {
|
|
|
10
10
|
readonly source: "ticket" | "prompt" | "input";
|
|
11
11
|
readonly fields: readonly CardField[];
|
|
12
12
|
}
|
|
13
|
-
export declare function builtinCardForms(): readonly CardForm[];
|
|
14
13
|
export declare function cardRunRequest(forms: readonly CardForm[], value: unknown): ServiceRequest | null;
|
|
@@ -1,17 +1,4 @@
|
|
|
1
1
|
import { record } from "../protocol.js";
|
|
2
|
-
export function builtinCardForms() {
|
|
3
|
-
const entries = [
|
|
4
|
-
["develop-issue", "ticket", "Issue number"],
|
|
5
|
-
["develop-ticket", "ticket", "Ticket ID"],
|
|
6
|
-
["develop-prd", "prompt", "Idea"],
|
|
7
|
-
["develop-prompt", "prompt", "Task"],
|
|
8
|
-
];
|
|
9
|
-
return entries.map(([workflowId, name, label]) => ({
|
|
10
|
-
workflowId,
|
|
11
|
-
source: name === "ticket" ? "ticket" : "prompt",
|
|
12
|
-
fields: [{ name, label, multiline: name === "prompt", optional: false }],
|
|
13
|
-
}));
|
|
14
|
-
}
|
|
15
2
|
function validFields(form, fields) {
|
|
16
3
|
if (Object.keys(fields).some((name) => !form.fields.some((field) => field.name === name)))
|
|
17
4
|
return false;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { watchAction, watchActions, watchHost, } from "./watch-actions.js";
|
|
2
2
|
import { observedBoard } from "./watch-pr-board.js";
|
|
3
|
+
import { isPhoneAction, phoneAction, phoneRead } from "./watch-phone.js";
|
|
3
4
|
import { watchPrObserver } from "./watch-pr-settings.js";
|
|
4
5
|
import { readdir, readFile, stat } from "node:fs/promises";
|
|
5
6
|
import { createServer, } from "node:http";
|
|
@@ -7,7 +8,8 @@ import { homedir } from "node:os";
|
|
|
7
8
|
import { dirname, join } from "node:path";
|
|
8
9
|
import { fileURLToPath } from "node:url";
|
|
9
10
|
import { watchReader } from "./watch-reads.js";
|
|
10
|
-
import {
|
|
11
|
+
import { ciRerunNotices } from "./github-ci-progress.js";
|
|
12
|
+
import { turnActivity, turnOf, watchModel, } from "./watch-model.js";
|
|
11
13
|
import { pageDocument } from "./watch-page.js";
|
|
12
14
|
import { watchStream } from "./watch-stream.js";
|
|
13
15
|
export const defaultWatchPort = 3663;
|
|
@@ -37,7 +39,7 @@ function parsed(text) {
|
|
|
37
39
|
return null;
|
|
38
40
|
}
|
|
39
41
|
}
|
|
40
|
-
const noStream = { size: 0,
|
|
42
|
+
const noStream = { size: 0, activity: [], activeAt: null };
|
|
41
43
|
async function streamed(watch, file) {
|
|
42
44
|
const found = await stat(file).catch(() => null);
|
|
43
45
|
if (found === null)
|
|
@@ -46,9 +48,9 @@ async function streamed(watch, file) {
|
|
|
46
48
|
const activeAt = found.mtime.toISOString();
|
|
47
49
|
if (known?.size === found.size)
|
|
48
50
|
return { ...known, activeAt };
|
|
49
|
-
const
|
|
50
|
-
watch.streams.set(file, { size: found.size,
|
|
51
|
-
return { size: found.size,
|
|
51
|
+
const activity = turnActivity((await readFile(file, "utf8").catch(() => "")).split("\n"));
|
|
52
|
+
watch.streams.set(file, { size: found.size, activity });
|
|
53
|
+
return { size: found.size, activity, activeAt };
|
|
52
54
|
}
|
|
53
55
|
async function stored(file) {
|
|
54
56
|
return parsed(await readFile(file, "utf8").catch(() => "null"));
|
|
@@ -65,7 +67,7 @@ async function turns(watch) {
|
|
|
65
67
|
key,
|
|
66
68
|
started,
|
|
67
69
|
result: await stored(join(journal, key, "result.json")),
|
|
68
|
-
|
|
70
|
+
activity: stream.activity,
|
|
69
71
|
activeAt: stream.activeAt,
|
|
70
72
|
}));
|
|
71
73
|
}
|
|
@@ -82,7 +84,11 @@ async function githubRecords(watch) {
|
|
|
82
84
|
if (started === null)
|
|
83
85
|
continue;
|
|
84
86
|
const result = await stored(join(journal, key, "result.json"));
|
|
85
|
-
watch.github.set(key, {
|
|
87
|
+
watch.github.set(key, {
|
|
88
|
+
started,
|
|
89
|
+
result,
|
|
90
|
+
ciReruns: await ciRerunNotices(join(journal, key)),
|
|
91
|
+
});
|
|
86
92
|
}
|
|
87
93
|
return keys.flatMap((key) => watch.github.get(key) ?? []);
|
|
88
94
|
}
|
|
@@ -121,6 +127,11 @@ async function fontReply(request) {
|
|
|
121
127
|
cache: "public, max-age=31536000, immutable",
|
|
122
128
|
};
|
|
123
129
|
}
|
|
130
|
+
function routedAction(path) {
|
|
131
|
+
if (isPhoneAction(path))
|
|
132
|
+
return phoneAction;
|
|
133
|
+
return path === "/actions/run" ? watchAction : null;
|
|
134
|
+
}
|
|
124
135
|
async function answered(watch, request) {
|
|
125
136
|
if (!watchHost(request))
|
|
126
137
|
return forbidden;
|
|
@@ -130,11 +141,12 @@ async function answered(watch, request) {
|
|
|
130
141
|
const url = new URL(String(request.url), "http://localhost");
|
|
131
142
|
if (request.method === "GET")
|
|
132
143
|
return readReply(watch, url);
|
|
133
|
-
if (request.method !== "POST" ||
|
|
134
|
-
|
|
135
|
-
|
|
144
|
+
if (request.method !== "POST" || watch.actions === null)
|
|
145
|
+
return notFound;
|
|
146
|
+
const act = routedAction(url.pathname);
|
|
147
|
+
if (act === null)
|
|
136
148
|
return notFound;
|
|
137
|
-
const body = await
|
|
149
|
+
const body = await act(watch.actions, request).catch(() => null);
|
|
138
150
|
return body === null
|
|
139
151
|
? forbidden
|
|
140
152
|
: { status: 200, type: "application/json", body };
|
|
@@ -153,6 +165,12 @@ async function readReply(watch, url) {
|
|
|
153
165
|
type: "text/javascript; charset=utf-8",
|
|
154
166
|
body: await readFile(libraryFile, "utf8"),
|
|
155
167
|
};
|
|
168
|
+
if (path === "/phone.json")
|
|
169
|
+
return {
|
|
170
|
+
status: 200,
|
|
171
|
+
type: "application/json",
|
|
172
|
+
body: await phoneRead(watch.settings.runtimeDirectory),
|
|
173
|
+
};
|
|
156
174
|
if (path !== "/data.json")
|
|
157
175
|
return notFound;
|
|
158
176
|
const runId = url.searchParams.get("runId");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Shown } from "./watch-element.ts";
|
|
2
|
-
import { type Copying, type WatchDecision, type WatchEvent, type WatchItem, type WatchTurn } from "./watch-render.ts";
|
|
2
|
+
import { type Copying, type WatchDecision, type WatchEvent, type WatchItem, type WatchRun, type WatchTurn } from "./watch-render.ts";
|
|
3
3
|
export declare function Item(props: {
|
|
4
4
|
readonly item: WatchItem;
|
|
5
5
|
}): Shown;
|
|
@@ -28,3 +28,6 @@ export declare function Decision(props: {
|
|
|
28
28
|
export declare function Events(props: {
|
|
29
29
|
readonly events: readonly WatchEvent[];
|
|
30
30
|
}): Shown;
|
|
31
|
+
export declare function PullRequest(props: {
|
|
32
|
+
readonly run: WatchRun;
|
|
33
|
+
}): Shown;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { priceText, usageText } from "./usage-render.js";
|
|
1
|
+
import { priceText, usageText, attemptText } from "./usage-render.js";
|
|
2
2
|
import { component, element } from "./watch-element.js";
|
|
3
3
|
import { clockTime, counted, groupActivity, turnTime, } from "./watch-render.js";
|
|
4
4
|
export function Item(props) {
|
|
@@ -43,10 +43,17 @@ export function Turn(props) {
|
|
|
43
43
|
children: heading.filter((part) => part !== "").join(" · "),
|
|
44
44
|
}),
|
|
45
45
|
element("p", { class: "meta", children: place }),
|
|
46
|
+
turn.harness === undefined
|
|
47
|
+
? null
|
|
48
|
+
: element("p", { class: "meta", children: `Harness: ${turn.harness}` }),
|
|
46
49
|
element("p", {
|
|
47
50
|
class: "turn-usage",
|
|
48
51
|
children: usageText(turn.usage),
|
|
49
52
|
}),
|
|
53
|
+
...(turn.attempts ?? []).map((attempt) => element("p", {
|
|
54
|
+
class: "turn-attempt",
|
|
55
|
+
children: attemptText(attempt),
|
|
56
|
+
})),
|
|
50
57
|
element("div", { class: "activity", children: activity }),
|
|
51
58
|
],
|
|
52
59
|
});
|
|
@@ -133,3 +140,32 @@ export function Events(props) {
|
|
|
133
140
|
],
|
|
134
141
|
});
|
|
135
142
|
}
|
|
143
|
+
export function PullRequest(props) {
|
|
144
|
+
const { pullRequest, reviews, mergeCommit } = props.run;
|
|
145
|
+
if (pullRequest === null)
|
|
146
|
+
return null;
|
|
147
|
+
const link = element("a", {
|
|
148
|
+
href: pullRequest.url,
|
|
149
|
+
children: `#${String(pullRequest.number)}`,
|
|
150
|
+
});
|
|
151
|
+
const scores = reviews.map((review) => element("li", {
|
|
152
|
+
children: `Round ${String(review.round)} · Review ${String(review.score)}/5 · commit ${review.commit.slice(0, 7)}`,
|
|
153
|
+
}));
|
|
154
|
+
const merge = mergeCommit === null
|
|
155
|
+
? null
|
|
156
|
+
: element("p", {
|
|
157
|
+
class: "meta",
|
|
158
|
+
children: [
|
|
159
|
+
"Merge commit ",
|
|
160
|
+
element("code", { children: mergeCommit }),
|
|
161
|
+
],
|
|
162
|
+
});
|
|
163
|
+
return element("section", {
|
|
164
|
+
class: "pull",
|
|
165
|
+
children: [
|
|
166
|
+
element("h3", { children: ["Pull request ", link] }),
|
|
167
|
+
element("ul", { class: "reviews", children: scores }),
|
|
168
|
+
merge,
|
|
169
|
+
],
|
|
170
|
+
});
|
|
171
|
+
}
|