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,186 +0,0 @@
|
|
|
1
|
-
import { boundAnalysisBatch, previousCheckpoint, } from "./chats-batch-binding.js";
|
|
2
|
-
import { createHash } from "node:crypto";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { batchAnalysisCheckpoint, } from "../chats/analysis-checkpoint.js";
|
|
5
|
-
import { analysisEvidence, analysisDocumentBytes, } from "../chats/analysis-input.js";
|
|
6
|
-
import { mergeAnalysisBatch } from "../chats/analysis-merge.js";
|
|
7
|
-
import { prepareAnalysisBatch, } from "../chats/analysis-batches.js";
|
|
8
|
-
import { analysisProposal, checkpointProposal, } from "../chats/analysis-proposal.js";
|
|
9
|
-
import { readCapturedAnalysisSnapshot, } from "./chats-capture.js";
|
|
10
|
-
import { boundedAnalysisFile, matchingPrivateFile, inspectAnalysisFiles, saveAnalysisFiles, } from "./chats-files.js";
|
|
11
|
-
export async function finalizeAnalysis(directory, input) {
|
|
12
|
-
const { capture, batch, snapshot } = await boundAnalysisBatch(directory, input);
|
|
13
|
-
const inspected = await saveAnalysisCheckpoint(directory, {
|
|
14
|
-
...batch,
|
|
15
|
-
capture,
|
|
16
|
-
candidate: input.candidate,
|
|
17
|
-
mode: "reconcile",
|
|
18
|
-
});
|
|
19
|
-
if (inspected.kind === "refused")
|
|
20
|
-
return inspected;
|
|
21
|
-
if (!("checkpoint" in inspected)) {
|
|
22
|
-
if (input.mode === "reconcile")
|
|
23
|
-
return { kind: "absent" };
|
|
24
|
-
return saveAnalysisCheckpoint(directory, {
|
|
25
|
-
...batch,
|
|
26
|
-
capture,
|
|
27
|
-
candidate: input.candidate,
|
|
28
|
-
mode: "deliver",
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
return commitAnalysisBatch(directory, {
|
|
32
|
-
input,
|
|
33
|
-
batch: { ...batch, capture, candidate: input.candidate, mode: input.mode },
|
|
34
|
-
snapshot,
|
|
35
|
-
inspected,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
async function commitAnalysisBatch(directory, prepared) {
|
|
39
|
-
const { input, batch, snapshot, inspected } = prepared;
|
|
40
|
-
const output = {
|
|
41
|
-
cycleId: input.cycleId,
|
|
42
|
-
analysis: JSON.stringify(inspected.checkpoint.result) + "\n",
|
|
43
|
-
proposal: analysisProposal(inspected.checkpoint.result),
|
|
44
|
-
...(input.draft === undefined ? {} : { draft: input.draft }),
|
|
45
|
-
};
|
|
46
|
-
const complete = inspected.checkpoint.status === "complete";
|
|
47
|
-
const legacy = complete
|
|
48
|
-
? await inspectAnalysisFiles(directory, output)
|
|
49
|
-
: "present";
|
|
50
|
-
if (input.mode === "reconcile" &&
|
|
51
|
-
(inspected.kind === "absent" || legacy === "absent"))
|
|
52
|
-
return { kind: "absent" };
|
|
53
|
-
const saved = await saveAnalysisCheckpoint(directory, {
|
|
54
|
-
...batch,
|
|
55
|
-
mode: input.mode,
|
|
56
|
-
});
|
|
57
|
-
if (saved.kind !== "committed")
|
|
58
|
-
return saved;
|
|
59
|
-
if (complete && input.mode === "deliver")
|
|
60
|
-
await saveAnalysisFiles(directory, output);
|
|
61
|
-
const next = complete
|
|
62
|
-
? undefined
|
|
63
|
-
: prepareAnalysisBatch(snapshot, {
|
|
64
|
-
nextRecordIndex: saved.checkpoint.nextRecordIndex,
|
|
65
|
-
completedBatchCount: saved.checkpoint.completedBatchCount,
|
|
66
|
-
previousResult: saved.checkpoint.result,
|
|
67
|
-
});
|
|
68
|
-
return { ...saved, next };
|
|
69
|
-
}
|
|
70
|
-
export async function saveAnalysisCheckpoint(directory, input) {
|
|
71
|
-
const { capture, candidate } = input;
|
|
72
|
-
const snapshot = await readCapturedAnalysisSnapshot(directory, capture);
|
|
73
|
-
const folder = join(directory, `capture-${capture.key}`);
|
|
74
|
-
const previous = await previousCheckpoint(folder, { ...input, snapshot });
|
|
75
|
-
if (!Number.isSafeInteger(input.nextRecordIndex) ||
|
|
76
|
-
input.nextRecordIndex <= previous.nextRecordIndex ||
|
|
77
|
-
input.nextRecordIndex > capture.totalRecords ||
|
|
78
|
-
previous.status === "complete")
|
|
79
|
-
throw new Error("analysis-input-refused");
|
|
80
|
-
const merged = mergeAnalysisBatch({
|
|
81
|
-
previousResult: previous.result,
|
|
82
|
-
candidate,
|
|
83
|
-
evidence: analysisEvidence(snapshot),
|
|
84
|
-
nextRecordIndex: input.nextRecordIndex,
|
|
85
|
-
});
|
|
86
|
-
if (!merged.accepted && !merged.codes.includes("analysis-merge-conflict"))
|
|
87
|
-
return { kind: "refused", codes: merged.codes };
|
|
88
|
-
if (!merged.accepted &&
|
|
89
|
-
(await retainConflict(folder, { ...input, previous })) === "absent")
|
|
90
|
-
return { kind: "absent" };
|
|
91
|
-
if (!merged.accepted)
|
|
92
|
-
return { kind: "refused", codes: merged.codes };
|
|
93
|
-
const checkpoint = batchAnalysisCheckpoint(capture, {
|
|
94
|
-
...input,
|
|
95
|
-
result: merged.result,
|
|
96
|
-
});
|
|
97
|
-
return persistCheckpoint(folder, { ...input, checkpoint });
|
|
98
|
-
}
|
|
99
|
-
async function bindBatch(folder, input) {
|
|
100
|
-
const { capture, batchIndex, nextRecordIndex, candidate, mode } = input;
|
|
101
|
-
const text = JSON.stringify({
|
|
102
|
-
schemaVersion: 1,
|
|
103
|
-
runId: capture.runId,
|
|
104
|
-
importId: capture.importId,
|
|
105
|
-
capturedDigest: capture.digest,
|
|
106
|
-
batchIndex,
|
|
107
|
-
nextRecordIndex,
|
|
108
|
-
candidateDigest: createHash("sha256")
|
|
109
|
-
.update(JSON.stringify(candidate))
|
|
110
|
-
.digest("hex"),
|
|
111
|
-
}) + "\n";
|
|
112
|
-
const path = join(folder, `batch-claim-${String(batchIndex)}.json`);
|
|
113
|
-
if (mode === "deliver")
|
|
114
|
-
await matchingPrivateFile(path, text);
|
|
115
|
-
else
|
|
116
|
-
await inspectMatchingPrivateFile(path, text);
|
|
117
|
-
}
|
|
118
|
-
async function persistCheckpoint(folder, input) {
|
|
119
|
-
const { checkpoint, mode } = input;
|
|
120
|
-
const output = {
|
|
121
|
-
cycleId: `checkpoint-${String(checkpoint.completedBatchCount)}`,
|
|
122
|
-
analysis: JSON.stringify(checkpoint) + "\n",
|
|
123
|
-
proposal: checkpointProposal(checkpoint),
|
|
124
|
-
};
|
|
125
|
-
const state = await inspectAnalysisFiles(folder, output);
|
|
126
|
-
await bindBatch(folder, input);
|
|
127
|
-
if (mode === "deliver")
|
|
128
|
-
await saveAnalysisFiles(folder, output);
|
|
129
|
-
return {
|
|
130
|
-
kind: mode === "reconcile" && state === "absent"
|
|
131
|
-
? "absent"
|
|
132
|
-
: "committed",
|
|
133
|
-
checkpoint,
|
|
134
|
-
receipt: createHash("sha256").update(output.analysis).digest("hex"),
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
async function retainConflict(folder, input) {
|
|
138
|
-
const { capture, candidate, mode, batchIndex, nextRecordIndex, previous } = input;
|
|
139
|
-
const incomingText = JSON.stringify(candidate) + "\n";
|
|
140
|
-
if (Buffer.byteLength(incomingText) > analysisDocumentBytes)
|
|
141
|
-
throw new Error("analysis-output-failed");
|
|
142
|
-
const incomingFile = `conflict-${String(batchIndex)}-incoming.json`;
|
|
143
|
-
const text = JSON.stringify({
|
|
144
|
-
schemaVersion: 1,
|
|
145
|
-
runId: capture.runId,
|
|
146
|
-
importId: capture.importId,
|
|
147
|
-
capturedDigest: capture.digest,
|
|
148
|
-
batchIndex,
|
|
149
|
-
nextRecordIndex,
|
|
150
|
-
accepted: {
|
|
151
|
-
file: `analysis-checkpoint-${String(previous.completedBatchCount)}.json`,
|
|
152
|
-
digest: createHash("sha256")
|
|
153
|
-
.update(JSON.stringify(previous) + "\n")
|
|
154
|
-
.digest("hex"),
|
|
155
|
-
},
|
|
156
|
-
incoming: {
|
|
157
|
-
file: incomingFile,
|
|
158
|
-
digest: createHash("sha256").update(incomingText).digest("hex"),
|
|
159
|
-
},
|
|
160
|
-
}) + "\n";
|
|
161
|
-
const path = join(folder, `conflict-${String(batchIndex)}.json`);
|
|
162
|
-
const incomingPath = join(folder, incomingFile);
|
|
163
|
-
await bindBatch(folder, input);
|
|
164
|
-
if (mode === "reconcile") {
|
|
165
|
-
const variant = await inspectMatchingPrivateFile(incomingPath, incomingText);
|
|
166
|
-
const envelope = await inspectMatchingPrivateFile(path, text);
|
|
167
|
-
return variant === "absent" || envelope === "absent"
|
|
168
|
-
? "absent"
|
|
169
|
-
: "retained";
|
|
170
|
-
}
|
|
171
|
-
await matchingPrivateFile(incomingPath, incomingText);
|
|
172
|
-
await matchingPrivateFile(path, text);
|
|
173
|
-
return "retained";
|
|
174
|
-
}
|
|
175
|
-
async function inspectMatchingPrivateFile(path, expected) {
|
|
176
|
-
const text = await boundedAnalysisFile(path, { permissions: 0o600 }).catch((error) => {
|
|
177
|
-
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
178
|
-
return undefined;
|
|
179
|
-
throw error;
|
|
180
|
-
});
|
|
181
|
-
if (text === undefined)
|
|
182
|
-
return "absent";
|
|
183
|
-
if (text !== expected)
|
|
184
|
-
throw new Error("analysis-output-failed");
|
|
185
|
-
return "retained";
|
|
186
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { type AnalysisSnapshot } from "../chats/analysis-input.ts";
|
|
2
|
-
export declare function readAnalysisCorpus(path: string, options?: {
|
|
3
|
-
readonly output?: string;
|
|
4
|
-
readonly permissions?: number;
|
|
5
|
-
}): Promise<string>;
|
|
6
|
-
export declare function analysisDirectory(runtime: string, importId: string): Promise<string>;
|
|
7
|
-
export declare function boundedAnalysisFile(path: string, options?: {
|
|
8
|
-
readonly permissions?: number;
|
|
9
|
-
}): Promise<string>;
|
|
10
|
-
export declare function readAnalysisSnapshot(directory: string, input: {
|
|
11
|
-
readonly importId: string;
|
|
12
|
-
readonly permissions?: number;
|
|
13
|
-
}): Promise<AnalysisSnapshot>;
|
|
14
|
-
export declare function matchingPrivateFile(path: string, text: string): Promise<void>;
|
|
15
|
-
export interface AnalysisOutput {
|
|
16
|
-
readonly cycleId: string;
|
|
17
|
-
readonly analysis: string;
|
|
18
|
-
readonly proposal: string;
|
|
19
|
-
readonly draft?: AnalysisDraftInput;
|
|
20
|
-
}
|
|
21
|
-
export declare function inspectAnalysisFiles(directory: string, output: AnalysisOutput): Promise<"complete" | "absent">;
|
|
22
|
-
export declare function saveAnalysisFiles(directory: string, output: AnalysisOutput): Promise<void>;
|
|
23
|
-
export interface AnalysisDraftInput {
|
|
24
|
-
readonly runId: string;
|
|
25
|
-
readonly cycleId: string;
|
|
26
|
-
readonly operationId: string;
|
|
27
|
-
readonly inputDigest: string;
|
|
28
|
-
readonly snapshotDigest: string;
|
|
29
|
-
readonly reply: string;
|
|
30
|
-
readonly batch?: unknown;
|
|
31
|
-
}
|
|
32
|
-
interface AnalysisDraftMetadata {
|
|
33
|
-
readonly candidateDigest: string;
|
|
34
|
-
readonly expiresAt: string;
|
|
35
|
-
}
|
|
36
|
-
export declare function inspectAnalysisDraft(directory: string, input: AnalysisDraftInput): Promise<AnalysisDraftMetadata | undefined>;
|
|
37
|
-
export declare function inspectAnalysisDraftRecord(directory: string, input: AnalysisDraftInput): Promise<AnalysisDraftMetadata | undefined>;
|
|
38
|
-
export declare function saveAnalysisDraft(directory: string, saving: {
|
|
39
|
-
readonly input: AnalysisDraftInput;
|
|
40
|
-
readonly now: () => string;
|
|
41
|
-
}): Promise<AnalysisDraftMetadata>;
|
|
42
|
-
export {};
|
|
@@ -1,252 +0,0 @@
|
|
|
1
|
-
import { lstat } from "node:fs/promises";
|
|
2
|
-
import { createHash } from "node:crypto";
|
|
3
|
-
import { dirname, join, resolve } from "node:path";
|
|
4
|
-
import { record } from "../protocol.js";
|
|
5
|
-
import { openInput } from "../chats/input-file.js";
|
|
6
|
-
import { createPrivateFile, validateDestination, } from "../chats/destination.js";
|
|
7
|
-
import { analysisDocumentBytes, } from "../chats/analysis-input.js";
|
|
8
|
-
import { analysisCaptureBytes } from "../chats/analysis-batches.js";
|
|
9
|
-
export async function readAnalysisCorpus(path, options = {}) {
|
|
10
|
-
const handle = await openInput(path);
|
|
11
|
-
let output;
|
|
12
|
-
try {
|
|
13
|
-
if (options.permissions !== undefined &&
|
|
14
|
-
((await handle.stat()).mode & 0o777) !== options.permissions)
|
|
15
|
-
throw new Error("analysis-output-failed");
|
|
16
|
-
if (options.output !== undefined)
|
|
17
|
-
output = await createPrivateFile(options.output);
|
|
18
|
-
const decoder = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
|
|
19
|
-
const buffer = Buffer.alloc(65_536);
|
|
20
|
-
const chunks = [];
|
|
21
|
-
let size = 0;
|
|
22
|
-
for (;;) {
|
|
23
|
-
const { bytesRead } = await handle.read({
|
|
24
|
-
buffer,
|
|
25
|
-
length: Math.min(buffer.length, analysisCaptureBytes + 1 - size),
|
|
26
|
-
});
|
|
27
|
-
if (bytesRead === 0)
|
|
28
|
-
break;
|
|
29
|
-
size += bytesRead;
|
|
30
|
-
if (size > analysisCaptureBytes)
|
|
31
|
-
throw new Error("analysis-too-large");
|
|
32
|
-
if (output !== undefined)
|
|
33
|
-
await output.writeFile(buffer.subarray(0, bytesRead));
|
|
34
|
-
chunks.push(decoder.decode(buffer.subarray(0, bytesRead), { stream: true }));
|
|
35
|
-
}
|
|
36
|
-
chunks.push(decoder.decode());
|
|
37
|
-
return chunks.join("");
|
|
38
|
-
}
|
|
39
|
-
finally {
|
|
40
|
-
try {
|
|
41
|
-
await handle.close();
|
|
42
|
-
}
|
|
43
|
-
finally {
|
|
44
|
-
await output?.close();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
export async function analysisDirectory(runtime, importId) {
|
|
49
|
-
if (process.platform !== "darwin")
|
|
50
|
-
throw new Error("platform-unsupported");
|
|
51
|
-
const directory = resolve(runtime, "chats", importId);
|
|
52
|
-
await checkedDirectory(directory);
|
|
53
|
-
return directory;
|
|
54
|
-
}
|
|
55
|
-
async function checkedDirectory(directory) {
|
|
56
|
-
try {
|
|
57
|
-
if (!(await lstat(directory)).isDirectory())
|
|
58
|
-
throw new Error("analysis-input-refused");
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
if (Reflect.get(Object(error), "code") !== "ENOENT")
|
|
62
|
-
throw error;
|
|
63
|
-
const parent = dirname(directory);
|
|
64
|
-
if (parent === directory)
|
|
65
|
-
throw error;
|
|
66
|
-
await checkedDirectory(parent);
|
|
67
|
-
throw error;
|
|
68
|
-
}
|
|
69
|
-
await validateDestination(directory);
|
|
70
|
-
}
|
|
71
|
-
export async function boundedAnalysisFile(path, options = {}) {
|
|
72
|
-
const handle = await openInput(path);
|
|
73
|
-
try {
|
|
74
|
-
if (options.permissions !== undefined &&
|
|
75
|
-
((await handle.stat()).mode & 0o777) !== options.permissions)
|
|
76
|
-
throw new Error("analysis-output-failed");
|
|
77
|
-
const buffer = Buffer.alloc(analysisDocumentBytes + 1);
|
|
78
|
-
let size = 0;
|
|
79
|
-
while (size < buffer.length) {
|
|
80
|
-
const { bytesRead } = await handle.read(buffer, size, buffer.length - size, null);
|
|
81
|
-
if (bytesRead === 0)
|
|
82
|
-
break;
|
|
83
|
-
size += bytesRead;
|
|
84
|
-
}
|
|
85
|
-
if (size > analysisDocumentBytes)
|
|
86
|
-
throw new Error("analysis-too-large");
|
|
87
|
-
return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(buffer.subarray(0, size));
|
|
88
|
-
}
|
|
89
|
-
finally {
|
|
90
|
-
await handle.close();
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
export async function readAnalysisSnapshot(directory, input) {
|
|
94
|
-
const { importId, ...options } = input;
|
|
95
|
-
const required = async (name) => {
|
|
96
|
-
try {
|
|
97
|
-
return name === "redacted.jsonl"
|
|
98
|
-
? await readAnalysisCorpus(join(directory, name), options)
|
|
99
|
-
: await boundedAnalysisFile(join(directory, name), options);
|
|
100
|
-
}
|
|
101
|
-
catch (error) {
|
|
102
|
-
if (Reflect.get(Object(error), "code") === "ENOENT")
|
|
103
|
-
throw new Error("redaction-required", { cause: error });
|
|
104
|
-
throw error;
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
return {
|
|
108
|
-
importId,
|
|
109
|
-
redaction: await required("redaction.json"),
|
|
110
|
-
corpus: await required("redacted.jsonl"),
|
|
111
|
-
structure: await boundedAnalysisFile(join(directory, "structure.json"), options),
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
export async function matchingPrivateFile(path, text) {
|
|
115
|
-
try {
|
|
116
|
-
const existing = await boundedAnalysisFile(path, { permissions: 0o600 });
|
|
117
|
-
if (existing !== text)
|
|
118
|
-
throw new Error("analysis-output-failed");
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
catch (error) {
|
|
122
|
-
if (Reflect.get(Object(error), "code") !== "ENOENT")
|
|
123
|
-
throw error;
|
|
124
|
-
}
|
|
125
|
-
const handle = await createPrivateFile(path);
|
|
126
|
-
try {
|
|
127
|
-
await handle.writeFile(text);
|
|
128
|
-
}
|
|
129
|
-
finally {
|
|
130
|
-
await handle.close();
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
async function requireAbsent(directory, names) {
|
|
134
|
-
for (const name of names) {
|
|
135
|
-
const exists = await lstat(join(directory, name)).catch((error) => {
|
|
136
|
-
if (error instanceof Error &&
|
|
137
|
-
"code" in error &&
|
|
138
|
-
error.code === "ENOENT")
|
|
139
|
-
return undefined;
|
|
140
|
-
throw error;
|
|
141
|
-
});
|
|
142
|
-
if (exists !== undefined)
|
|
143
|
-
throw new Error("analysis-output-failed");
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
function outputClaim(directory, output) {
|
|
147
|
-
return {
|
|
148
|
-
path: join(directory, `${"draft" in output ? "final-claim" : "claim"}-${output.cycleId}.json`),
|
|
149
|
-
text: JSON.stringify({
|
|
150
|
-
schemaVersion: 1,
|
|
151
|
-
kind: "reply" in output ? "draft" : "final",
|
|
152
|
-
digest: createHash("sha256")
|
|
153
|
-
.update(JSON.stringify(output))
|
|
154
|
-
.digest("hex"),
|
|
155
|
-
}) + "\n",
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
async function inspectOutputClaim(claim) {
|
|
159
|
-
const text = await boundedAnalysisFile(claim.path, {
|
|
160
|
-
permissions: 0o600,
|
|
161
|
-
}).catch((error) => {
|
|
162
|
-
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
163
|
-
return undefined;
|
|
164
|
-
throw error;
|
|
165
|
-
});
|
|
166
|
-
if (text !== undefined && text !== claim.text)
|
|
167
|
-
throw new Error("analysis-output-failed");
|
|
168
|
-
}
|
|
169
|
-
export async function inspectAnalysisFiles(directory, output) {
|
|
170
|
-
if (Buffer.byteLength(JSON.stringify(output)) > analysisDocumentBytes)
|
|
171
|
-
throw new Error("analysis-too-large");
|
|
172
|
-
await inspectOutputClaim(outputClaim(directory, output));
|
|
173
|
-
if (output.draft === undefined)
|
|
174
|
-
await requireAbsent(directory, [`draft-${output.cycleId}.json`]);
|
|
175
|
-
else if ((await inspectAnalysisDraftRecord(directory, output.draft)) === undefined)
|
|
176
|
-
throw new Error("analysis-output-failed");
|
|
177
|
-
const proposal = join(directory, `proposal-${output.cycleId}.txt`);
|
|
178
|
-
const analysis = join(directory, `analysis-${output.cycleId}.json`);
|
|
179
|
-
const marker = await boundedAnalysisFile(analysis, {
|
|
180
|
-
permissions: 0o600,
|
|
181
|
-
}).catch((error) => {
|
|
182
|
-
if (Reflect.get(Object(error), "code") === "ENOENT")
|
|
183
|
-
return undefined;
|
|
184
|
-
throw error;
|
|
185
|
-
});
|
|
186
|
-
if (marker === undefined)
|
|
187
|
-
return "absent";
|
|
188
|
-
if (marker !== output.analysis ||
|
|
189
|
-
(await boundedAnalysisFile(proposal, { permissions: 0o600 })) !==
|
|
190
|
-
output.proposal)
|
|
191
|
-
throw new Error("analysis-output-failed");
|
|
192
|
-
return "complete";
|
|
193
|
-
}
|
|
194
|
-
export async function saveAnalysisFiles(directory, output) {
|
|
195
|
-
if ((await inspectAnalysisFiles(directory, output)) === "complete")
|
|
196
|
-
return;
|
|
197
|
-
const claim = outputClaim(directory, output);
|
|
198
|
-
await matchingPrivateFile(claim.path, claim.text);
|
|
199
|
-
const proposal = join(directory, `proposal-${output.cycleId}.txt`);
|
|
200
|
-
const analysis = join(directory, `analysis-${output.cycleId}.json`);
|
|
201
|
-
await matchingPrivateFile(proposal, output.proposal);
|
|
202
|
-
await matchingPrivateFile(analysis, output.analysis);
|
|
203
|
-
}
|
|
204
|
-
function draftRecord(input, expiresAt) {
|
|
205
|
-
return {
|
|
206
|
-
schemaVersion: 1,
|
|
207
|
-
...input,
|
|
208
|
-
candidateDigest: createHash("sha256").update(input.reply).digest("hex"),
|
|
209
|
-
expiresAt,
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
export async function inspectAnalysisDraft(directory, input) {
|
|
213
|
-
await requireAbsent(directory, [
|
|
214
|
-
`analysis-${input.cycleId}.json`,
|
|
215
|
-
`proposal-${input.cycleId}.txt`,
|
|
216
|
-
]);
|
|
217
|
-
return inspectAnalysisDraftRecord(directory, input);
|
|
218
|
-
}
|
|
219
|
-
export async function inspectAnalysisDraftRecord(directory, input) {
|
|
220
|
-
await inspectOutputClaim(outputClaim(directory, input));
|
|
221
|
-
const text = await boundedAnalysisFile(join(directory, `draft-${input.cycleId}.json`), { permissions: 0o600 }).catch((error) => {
|
|
222
|
-
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
223
|
-
return undefined;
|
|
224
|
-
throw error;
|
|
225
|
-
});
|
|
226
|
-
if (text === undefined)
|
|
227
|
-
return undefined;
|
|
228
|
-
const expiresAt = record(JSON.parse(text))?.["expiresAt"];
|
|
229
|
-
if (typeof expiresAt !== "string" ||
|
|
230
|
-
!Number.isFinite(Date.parse(expiresAt)) ||
|
|
231
|
-
new Date(expiresAt).toISOString() !== expiresAt)
|
|
232
|
-
throw new Error("analysis-output-failed");
|
|
233
|
-
const expected = draftRecord(input, expiresAt);
|
|
234
|
-
if (text !== JSON.stringify(expected) + "\n")
|
|
235
|
-
throw new Error("analysis-output-failed");
|
|
236
|
-
return { candidateDigest: expected.candidateDigest, expiresAt };
|
|
237
|
-
}
|
|
238
|
-
export async function saveAnalysisDraft(directory, saving) {
|
|
239
|
-
const { input, now } = saving;
|
|
240
|
-
const existing = await inspectAnalysisDraft(directory, input);
|
|
241
|
-
if (existing !== undefined)
|
|
242
|
-
return existing;
|
|
243
|
-
const claim = outputClaim(directory, input);
|
|
244
|
-
await matchingPrivateFile(claim.path, claim.text);
|
|
245
|
-
const expiresAt = new Date(Date.parse(now()) + 86_400_000).toISOString();
|
|
246
|
-
const draft = draftRecord(input, expiresAt);
|
|
247
|
-
const text = JSON.stringify(draft) + "\n";
|
|
248
|
-
if (Buffer.byteLength(text) > analysisDocumentBytes)
|
|
249
|
-
throw new Error("analysis-output-failed");
|
|
250
|
-
await matchingPrivateFile(join(directory, `draft-${input.cycleId}.json`), text);
|
|
251
|
-
return { candidateDigest: draft.candidateDigest, expiresAt };
|
|
252
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { AdapterOutcome, DeliveryIntent } from "../broker/actor/delivery-intents.ts";
|
|
2
|
-
import { type Fields } from "../protocol.ts";
|
|
3
|
-
import { type AnalysisSnapshot } from "../chats/analysis-input.ts";
|
|
4
|
-
import type { AnalysisQuestion } from "../chats/analysis-contract.ts";
|
|
5
|
-
import { analysisBatchData } from "../chats/analysis-batches.ts";
|
|
6
|
-
import { type AnalysisDraftInput } from "./chats-files.ts";
|
|
7
|
-
export type ChatsResult = ReturnType<typeof analysisBatchData> | ({
|
|
8
|
-
readonly kind: "analysis_batch";
|
|
9
|
-
} & ReturnType<typeof analysisBatchData>) | {
|
|
10
|
-
readonly kind: "analysis_partial";
|
|
11
|
-
readonly reason: string;
|
|
12
|
-
} | {
|
|
13
|
-
readonly kind: "analysis_draft";
|
|
14
|
-
readonly cycleId: string;
|
|
15
|
-
readonly candidateDigest: string;
|
|
16
|
-
readonly expiresAt: string;
|
|
17
|
-
readonly question: AnalysisQuestion;
|
|
18
|
-
} | {
|
|
19
|
-
readonly kind: "handoff_requested";
|
|
20
|
-
readonly cycleId: string;
|
|
21
|
-
readonly promotionId: string;
|
|
22
|
-
};
|
|
23
|
-
interface FollowUpSave {
|
|
24
|
-
readonly intent: DeliveryIntent;
|
|
25
|
-
readonly payload: Fields;
|
|
26
|
-
readonly mode: "deliver" | "reconcile";
|
|
27
|
-
readonly input: {
|
|
28
|
-
readonly cycleId: string;
|
|
29
|
-
readonly snapshot: AnalysisSnapshot;
|
|
30
|
-
readonly candidate: unknown;
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
export declare function storedAnalysisDraft(directory: string, call: FollowUpSave): Promise<AnalysisDraftInput | undefined>;
|
|
34
|
-
export declare function saveFollowUp(runtime: string, call: FollowUpSave): Promise<AdapterOutcome>;
|
|
35
|
-
export declare function saveAcceptedAnalysis(runtime: string, call: FollowUpSave & {
|
|
36
|
-
readonly draft?: AnalysisDraftInput;
|
|
37
|
-
}): Promise<AdapterOutcome>;
|
|
38
|
-
export {};
|