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,29 +0,0 @@
|
|
|
1
|
-
export interface Omissions {
|
|
2
|
-
metadataRecords: number;
|
|
3
|
-
thinkingBlocks: number;
|
|
4
|
-
}
|
|
5
|
-
interface MessageFields {
|
|
6
|
-
readonly sourceId: string;
|
|
7
|
-
readonly role: "user" | "assistant";
|
|
8
|
-
readonly timestamp: string | null;
|
|
9
|
-
readonly sessionId: string | null;
|
|
10
|
-
readonly text: string;
|
|
11
|
-
readonly blocks: readonly Record<string, unknown>[];
|
|
12
|
-
}
|
|
13
|
-
export type MessageRecord = MessageFields & ({
|
|
14
|
-
readonly schemaVersion: 1;
|
|
15
|
-
} | {
|
|
16
|
-
readonly schemaVersion: 2;
|
|
17
|
-
readonly uuid: string | null;
|
|
18
|
-
readonly isSidechain: boolean | null;
|
|
19
|
-
readonly parentUuid?: string | null;
|
|
20
|
-
});
|
|
21
|
-
export interface NormalizedTranscript {
|
|
22
|
-
readonly status: "included" | "unsupported";
|
|
23
|
-
readonly reason: string;
|
|
24
|
-
readonly records: readonly MessageRecord[];
|
|
25
|
-
readonly omissions: Omissions;
|
|
26
|
-
}
|
|
27
|
-
export declare function parsePreservedJson(text: string): unknown;
|
|
28
|
-
export declare function normalizeTranscript(text: string, digest: string): NormalizedTranscript;
|
|
29
|
-
export {};
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
function object(value) {
|
|
2
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3
|
-
}
|
|
4
|
-
function supportedBlock(block) {
|
|
5
|
-
const type = block["type"];
|
|
6
|
-
if (type === "text" && typeof block["text"] === "string")
|
|
7
|
-
return { type, text: block["text"] };
|
|
8
|
-
if (type === "tool_use" &&
|
|
9
|
-
typeof block["id"] === "string" &&
|
|
10
|
-
typeof block["name"] === "string" &&
|
|
11
|
-
Object.hasOwn(block, "input")) {
|
|
12
|
-
return {
|
|
13
|
-
type,
|
|
14
|
-
id: block["id"],
|
|
15
|
-
name: block["name"],
|
|
16
|
-
input: block["input"],
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
if (type === "tool_result")
|
|
20
|
-
return toolResult(block);
|
|
21
|
-
throw new Error("unsupported-block");
|
|
22
|
-
}
|
|
23
|
-
function toolResult(block) {
|
|
24
|
-
if (typeof block["tool_use_id"] !== "string" ||
|
|
25
|
-
!Object.hasOwn(block, "content"))
|
|
26
|
-
throw new Error("unsupported-block");
|
|
27
|
-
if (Object.hasOwn(block, "is_error") &&
|
|
28
|
-
typeof block["is_error"] !== "boolean")
|
|
29
|
-
throw new Error("unsupported-block");
|
|
30
|
-
return {
|
|
31
|
-
type: "tool_result",
|
|
32
|
-
tool_use_id: block["tool_use_id"],
|
|
33
|
-
content: block["content"],
|
|
34
|
-
...(Object.hasOwn(block, "is_error")
|
|
35
|
-
? { is_error: block["is_error"] }
|
|
36
|
-
: {}),
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
function optionalText(value) {
|
|
40
|
-
if (value === undefined || value === null)
|
|
41
|
-
return null;
|
|
42
|
-
if (typeof value !== "string")
|
|
43
|
-
throw new Error("unsupported-message");
|
|
44
|
-
return value;
|
|
45
|
-
}
|
|
46
|
-
function rawJsonApi(value) {
|
|
47
|
-
return "rawJSON" in value && typeof value.rawJSON === "function";
|
|
48
|
-
}
|
|
49
|
-
function preserveJson(...argumentsList) {
|
|
50
|
-
const [, value, context] = argumentsList;
|
|
51
|
-
if (typeof value !== "number")
|
|
52
|
-
return value;
|
|
53
|
-
if (!object(context) || typeof context["source"] !== "string")
|
|
54
|
-
throw new Error("unsupported-record");
|
|
55
|
-
if (JSON.stringify(value) === context["source"])
|
|
56
|
-
return value;
|
|
57
|
-
if (!rawJsonApi(JSON))
|
|
58
|
-
throw new Error("unsupported-record");
|
|
59
|
-
return JSON.rawJSON(context["source"]);
|
|
60
|
-
}
|
|
61
|
-
export function parsePreservedJson(text) {
|
|
62
|
-
return JSON.parse(text, preserveJson);
|
|
63
|
-
}
|
|
64
|
-
function blocks(content, omissions) {
|
|
65
|
-
if (typeof content === "string")
|
|
66
|
-
return [{ position: 0, type: "text", text: content }];
|
|
67
|
-
if (!Array.isArray(content))
|
|
68
|
-
throw new Error("unsupported-message");
|
|
69
|
-
return content.flatMap((block, position) => {
|
|
70
|
-
if (!object(block))
|
|
71
|
-
throw new Error("unsupported-block");
|
|
72
|
-
if (block["type"] === "thinking") {
|
|
73
|
-
omissions.thinkingBlocks++;
|
|
74
|
-
return [];
|
|
75
|
-
}
|
|
76
|
-
return [{ ...supportedBlock(block), position }];
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
function identity(value) {
|
|
80
|
-
const uuid = value["uuid"];
|
|
81
|
-
const parent = value["parentUuid"];
|
|
82
|
-
const sidechain = value["isSidechain"];
|
|
83
|
-
return {
|
|
84
|
-
uuid: typeof uuid === "string" && uuid !== "" ? uuid : null,
|
|
85
|
-
isSidechain: typeof sidechain === "boolean" ? sidechain : null,
|
|
86
|
-
...(parent === null || (typeof parent === "string" && parent !== "")
|
|
87
|
-
? { parentUuid: parent }
|
|
88
|
-
: {}),
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
function message(value, context) {
|
|
92
|
-
if (!object(value) || typeof value["type"] !== "string")
|
|
93
|
-
throw new Error("unsupported-record");
|
|
94
|
-
if (value["type"] !== "user" &&
|
|
95
|
-
value["type"] !== "assistant" &&
|
|
96
|
-
Object.hasOwn(value, "message"))
|
|
97
|
-
throw new Error("unsupported-message");
|
|
98
|
-
if (value["type"] !== "user" && value["type"] !== "assistant") {
|
|
99
|
-
context.omissions.metadataRecords++;
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
const envelope = value["message"];
|
|
103
|
-
if (!object(envelope) || envelope["role"] !== value["type"])
|
|
104
|
-
throw new Error("unsupported-message");
|
|
105
|
-
const normalized = blocks(envelope["content"], context.omissions);
|
|
106
|
-
return {
|
|
107
|
-
schemaVersion: 2,
|
|
108
|
-
...identity(value),
|
|
109
|
-
sourceId: context.sourceId,
|
|
110
|
-
role: value["type"],
|
|
111
|
-
timestamp: optionalText(value["timestamp"]),
|
|
112
|
-
sessionId: optionalText(value["sessionId"]),
|
|
113
|
-
text: normalized
|
|
114
|
-
.filter((block) => block["type"] === "text")
|
|
115
|
-
.map((block) => block["text"])
|
|
116
|
-
.join("\n"),
|
|
117
|
-
blocks: normalized,
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
export function normalizeTranscript(text, digest) {
|
|
121
|
-
const omissions = { metadataRecords: 0, thinkingBlocks: 0 };
|
|
122
|
-
const records = [];
|
|
123
|
-
if (text === "")
|
|
124
|
-
return { status: "unsupported", reason: "empty-file", records, omissions };
|
|
125
|
-
let offset = 0;
|
|
126
|
-
const lines = text.split("\n");
|
|
127
|
-
if (lines.at(-1) === "")
|
|
128
|
-
lines.pop();
|
|
129
|
-
try {
|
|
130
|
-
for (const line of lines) {
|
|
131
|
-
const parsed = parsePreservedJson(line);
|
|
132
|
-
const record = message(parsed, {
|
|
133
|
-
sourceId: `${digest}:${String(offset)}`,
|
|
134
|
-
omissions,
|
|
135
|
-
});
|
|
136
|
-
if (record !== null)
|
|
137
|
-
records.push(record);
|
|
138
|
-
offset += new TextEncoder().encode(line).length + 1;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
catch (error) {
|
|
142
|
-
let reason = "unsupported-record";
|
|
143
|
-
if (error instanceof Error)
|
|
144
|
-
reason = error.message;
|
|
145
|
-
if (error instanceof SyntaxError)
|
|
146
|
-
reason = "invalid-json";
|
|
147
|
-
return {
|
|
148
|
-
status: "unsupported",
|
|
149
|
-
reason,
|
|
150
|
-
records: [],
|
|
151
|
-
omissions,
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
return { status: "included", reason: "supported", records, omissions };
|
|
155
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { lstat } from "node:fs/promises";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import { validateDestination } from "./destination.js";
|
|
4
|
-
import { readInput } from "./input-file.js";
|
|
5
|
-
import { parseEvidenceCoverage, nextEvidenceRevision, } from "./revision-input.js";
|
|
6
|
-
async function optionalRevision(path) {
|
|
7
|
-
try {
|
|
8
|
-
await lstat(path);
|
|
9
|
-
}
|
|
10
|
-
catch (error) {
|
|
11
|
-
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
12
|
-
return;
|
|
13
|
-
throw error;
|
|
14
|
-
}
|
|
15
|
-
return readInput(path);
|
|
16
|
-
}
|
|
17
|
-
export async function readPreviousImport(runtime, importId) {
|
|
18
|
-
if (process.platform !== "darwin")
|
|
19
|
-
throw new Error("platform-unsupported");
|
|
20
|
-
try {
|
|
21
|
-
if (!/^[a-f\d]{8}-[a-f\d]{4}-4[a-f\d]{3}-[89ab][a-f\d]{3}-[a-f\d]{12}$/.test(importId))
|
|
22
|
-
throw new Error("invalid-import");
|
|
23
|
-
const directory = join(runtime, "chats", importId);
|
|
24
|
-
await validateDestination(directory);
|
|
25
|
-
if (!(await lstat(directory)).isDirectory())
|
|
26
|
-
throw new Error("invalid-import");
|
|
27
|
-
const entries = parseEvidenceCoverage(await readInput(join(directory, "coverage.json")), importId);
|
|
28
|
-
const evidenceRevision = nextEvidenceRevision(await optionalRevision(join(directory, "revision.json")), importId);
|
|
29
|
-
return { importId, entries, evidenceRevision };
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
throw new Error("previous-import-refused");
|
|
33
|
-
}
|
|
34
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { type ScanSource } from "./source.ts";
|
|
2
|
-
import { type MessageRecord, type Omissions } from "./normalize.ts";
|
|
3
|
-
export declare const transcriptLimit = 10485760;
|
|
4
|
-
export interface SelectedTranscript {
|
|
5
|
-
readonly path: string;
|
|
6
|
-
readonly status: "included" | "unreadable" | "unsupported" | "too-large";
|
|
7
|
-
readonly reason: string;
|
|
8
|
-
readonly digest: string | null;
|
|
9
|
-
readonly byteSize?: number;
|
|
10
|
-
readonly recordCount: number;
|
|
11
|
-
readonly omissions: Omissions;
|
|
12
|
-
}
|
|
13
|
-
export interface ReadTranscript {
|
|
14
|
-
readonly coverage: SelectedTranscript;
|
|
15
|
-
readonly records: readonly MessageRecord[];
|
|
16
|
-
readonly prefixDigest?: string;
|
|
17
|
-
}
|
|
18
|
-
export declare function readTranscript(path: string, options?: {
|
|
19
|
-
readonly inspection?: ScanSource;
|
|
20
|
-
readonly prefixBytes?: number;
|
|
21
|
-
}): Promise<ReadTranscript>;
|
package/dist/src/chats/reader.js
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import { constants } from "node:fs";
|
|
3
|
-
import { lstat, open } from "node:fs/promises";
|
|
4
|
-
import { sourceFailure, verifyScanSource, verifyOpenSource, } from "./source.js";
|
|
5
|
-
import { normalizeTranscript, } from "./normalize.js";
|
|
6
|
-
export const transcriptLimit = 10_485_760;
|
|
7
|
-
function refused(path, reason) {
|
|
8
|
-
const status = reason === "source-unreadable" ? "unreadable" : "unsupported";
|
|
9
|
-
return {
|
|
10
|
-
coverage: {
|
|
11
|
-
path,
|
|
12
|
-
status: reason === "file-too-large" ? "too-large" : status,
|
|
13
|
-
reason,
|
|
14
|
-
digest: null,
|
|
15
|
-
recordCount: 0,
|
|
16
|
-
omissions: { metadataRecords: 0, thinkingBlocks: 0 },
|
|
17
|
-
},
|
|
18
|
-
records: [],
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
async function boundedBytes(handle) {
|
|
22
|
-
const stats = await handle.stat();
|
|
23
|
-
if (!stats.isFile())
|
|
24
|
-
return "nonregular-file";
|
|
25
|
-
if (stats.size > transcriptLimit)
|
|
26
|
-
return "file-too-large";
|
|
27
|
-
const chunks = [];
|
|
28
|
-
let total = 0;
|
|
29
|
-
while (total <= transcriptLimit) {
|
|
30
|
-
const buffer = Buffer.alloc(Math.min(65_536, transcriptLimit + 1 - total));
|
|
31
|
-
const { bytesRead } = await handle.read(buffer, 0, buffer.length, total);
|
|
32
|
-
if (bytesRead === 0)
|
|
33
|
-
break;
|
|
34
|
-
total += bytesRead;
|
|
35
|
-
chunks.push(buffer.subarray(0, bytesRead));
|
|
36
|
-
}
|
|
37
|
-
if (total > transcriptLimit || (await handle.stat()).size > transcriptLimit)
|
|
38
|
-
return "file-too-large";
|
|
39
|
-
return Buffer.concat(chunks, total);
|
|
40
|
-
}
|
|
41
|
-
function normalizeBytes(path, options) {
|
|
42
|
-
const { bytes } = options;
|
|
43
|
-
const digest = `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
|
|
44
|
-
let text;
|
|
45
|
-
try {
|
|
46
|
-
text = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes);
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
const result = refused(path, "invalid-utf8");
|
|
50
|
-
return { ...result, coverage: { ...result.coverage, digest } };
|
|
51
|
-
}
|
|
52
|
-
const result = normalizeTranscript(text, digest);
|
|
53
|
-
return {
|
|
54
|
-
coverage: {
|
|
55
|
-
path,
|
|
56
|
-
status: result.status,
|
|
57
|
-
reason: result.reason,
|
|
58
|
-
digest,
|
|
59
|
-
...(result.status === "included" ? { byteSize: bytes.length } : {}),
|
|
60
|
-
recordCount: result.records.length,
|
|
61
|
-
omissions: result.omissions,
|
|
62
|
-
},
|
|
63
|
-
records: result.records,
|
|
64
|
-
...(options.prefixBytes !== undefined &&
|
|
65
|
-
options.prefixBytes >= 0 &&
|
|
66
|
-
options.prefixBytes < bytes.length
|
|
67
|
-
? {
|
|
68
|
-
prefixDigest: `sha256:${createHash("sha256").update(bytes.subarray(0, options.prefixBytes)).digest("hex")}`,
|
|
69
|
-
}
|
|
70
|
-
: {}),
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
async function readSourceBytes(path, inspection) {
|
|
74
|
-
const handle = await open(path, constants.O_RDONLY |
|
|
75
|
-
constants.O_NONBLOCK |
|
|
76
|
-
(inspection === undefined ? constants.O_NOFOLLOW : 0x20000000));
|
|
77
|
-
try {
|
|
78
|
-
if (inspection !== undefined) {
|
|
79
|
-
verifyOpenSource(inspection, await handle.stat());
|
|
80
|
-
await verifyScanSource(inspection);
|
|
81
|
-
}
|
|
82
|
-
return await boundedBytes(handle);
|
|
83
|
-
}
|
|
84
|
-
finally {
|
|
85
|
-
await handle.close();
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
export async function readTranscript(path, options = {}) {
|
|
89
|
-
const { inspection } = options;
|
|
90
|
-
try {
|
|
91
|
-
if (inspection !== undefined)
|
|
92
|
-
await verifyScanSource(inspection);
|
|
93
|
-
const stats = await lstat(path);
|
|
94
|
-
if (stats.isSymbolicLink())
|
|
95
|
-
return refused(path, "symbolic-link");
|
|
96
|
-
if (!stats.isFile())
|
|
97
|
-
return refused(path, "nonregular-file");
|
|
98
|
-
const bytes = await readSourceBytes(path, inspection);
|
|
99
|
-
const result = typeof bytes === "string"
|
|
100
|
-
? refused(path, bytes)
|
|
101
|
-
: normalizeBytes(path, { bytes, ...options });
|
|
102
|
-
return scannedResult(result, inspection);
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
return readFailure(path, { error, inspection });
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
function scannedResult(result, inspection) {
|
|
109
|
-
if (inspection === undefined || result.coverage.status !== "too-large")
|
|
110
|
-
return result;
|
|
111
|
-
return { ...result, coverage: { ...result.coverage, status: "unsupported" } };
|
|
112
|
-
}
|
|
113
|
-
function readFailure(path, data) {
|
|
114
|
-
const { error, inspection } = data;
|
|
115
|
-
if (error instanceof Error && "code" in error && error.code === "ELOOP")
|
|
116
|
-
return refused(path, "symbolic-link");
|
|
117
|
-
return refused(path, inspection === undefined ? "source-unreadable" : sourceFailure(error));
|
|
118
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { type RedactionSettings } from "./redaction.ts";
|
|
2
|
-
export interface RedactImportRequest {
|
|
3
|
-
readonly importId: string;
|
|
4
|
-
readonly workingDirectory: string;
|
|
5
|
-
readonly runtimeDirectory: string | undefined;
|
|
6
|
-
readonly settings: RedactionSettings;
|
|
7
|
-
}
|
|
8
|
-
export declare function redactImport(request: RedactImportRequest): Promise<{
|
|
9
|
-
code: string;
|
|
10
|
-
importId: string;
|
|
11
|
-
recordCount: number;
|
|
12
|
-
counts: import("./redaction.ts").RedactionCounts;
|
|
13
|
-
totalCount: number;
|
|
14
|
-
}>;
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { openInput, readInput } from "./input-file.js";
|
|
2
|
-
import { lstat, rm } from "node:fs/promises";
|
|
3
|
-
import { join, resolve } from "node:path";
|
|
4
|
-
import { createPrivateFile, validateDestination } from "./destination.js";
|
|
5
|
-
import { parseCorpusRecord, validateCoverage } from "./corpus-input.js";
|
|
6
|
-
import { emptyCounts, redactRecord, categories, } from "./redaction.js";
|
|
7
|
-
async function absent(path) {
|
|
8
|
-
try {
|
|
9
|
-
await lstat(path);
|
|
10
|
-
}
|
|
11
|
-
catch (error) {
|
|
12
|
-
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
13
|
-
return;
|
|
14
|
-
throw error;
|
|
15
|
-
}
|
|
16
|
-
throw new Error("outputs-exist");
|
|
17
|
-
}
|
|
18
|
-
async function* corpusLines(handle) {
|
|
19
|
-
const buffer = Buffer.alloc(65_536);
|
|
20
|
-
const decoder = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
|
|
21
|
-
let pending = "";
|
|
22
|
-
let bytesRead = -1;
|
|
23
|
-
while (bytesRead !== 0) {
|
|
24
|
-
({ bytesRead } = await handle.read({ buffer, position: null }));
|
|
25
|
-
pending += decoder.decode(buffer.subarray(0, bytesRead), {
|
|
26
|
-
stream: bytesRead !== 0,
|
|
27
|
-
});
|
|
28
|
-
let start = 0;
|
|
29
|
-
let end = pending.indexOf("\n");
|
|
30
|
-
while (end !== -1) {
|
|
31
|
-
yield pending.slice(start, end);
|
|
32
|
-
start = end + 1;
|
|
33
|
-
end = pending.indexOf("\n", start);
|
|
34
|
-
}
|
|
35
|
-
pending = pending.slice(start);
|
|
36
|
-
}
|
|
37
|
-
if (pending !== "")
|
|
38
|
-
yield pending;
|
|
39
|
-
}
|
|
40
|
-
async function redactCorpus(handles, settings) {
|
|
41
|
-
const counts = emptyCounts();
|
|
42
|
-
let recordCount = 0;
|
|
43
|
-
for await (const line of corpusLines(handles.input)) {
|
|
44
|
-
const result = redactRecord(parseCorpusRecord(line), settings);
|
|
45
|
-
for (const category of categories)
|
|
46
|
-
counts[category] += result.counts[category];
|
|
47
|
-
await handles.output.writeFile(JSON.stringify(result.record) + "\n");
|
|
48
|
-
recordCount++;
|
|
49
|
-
}
|
|
50
|
-
return {
|
|
51
|
-
counts,
|
|
52
|
-
recordCount,
|
|
53
|
-
totalCount: Object.values(counts).reduce((sum, count) => sum + count, 0),
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
async function writeRedactedCorpus(directory, settings) {
|
|
57
|
-
const path = join(directory, "redacted.jsonl");
|
|
58
|
-
let created = false;
|
|
59
|
-
try {
|
|
60
|
-
const input = await openInput(join(directory, "corpus.jsonl"));
|
|
61
|
-
try {
|
|
62
|
-
const output = await createPrivateFile(path);
|
|
63
|
-
created = true;
|
|
64
|
-
try {
|
|
65
|
-
return await redactCorpus({ input, output }, settings);
|
|
66
|
-
}
|
|
67
|
-
finally {
|
|
68
|
-
await output.close();
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
finally {
|
|
72
|
-
await input.close();
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
catch (error) {
|
|
76
|
-
if (created) {
|
|
77
|
-
await validateDestination(directory);
|
|
78
|
-
await rm(path, { force: true });
|
|
79
|
-
}
|
|
80
|
-
throw error;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
async function writeManifest(directory, manifest) {
|
|
84
|
-
const path = join(directory, "redaction.json");
|
|
85
|
-
let created = false;
|
|
86
|
-
try {
|
|
87
|
-
const handle = await createPrivateFile(path);
|
|
88
|
-
created = true;
|
|
89
|
-
try {
|
|
90
|
-
await handle.writeFile(JSON.stringify(manifest) + "\n");
|
|
91
|
-
}
|
|
92
|
-
finally {
|
|
93
|
-
await handle.close();
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
if (created) {
|
|
98
|
-
await validateDestination(directory);
|
|
99
|
-
await rm(path, { force: true });
|
|
100
|
-
}
|
|
101
|
-
throw error;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
export async function redactImport(request) {
|
|
105
|
-
const empty = {
|
|
106
|
-
importId: request.importId,
|
|
107
|
-
recordCount: 0,
|
|
108
|
-
counts: emptyCounts(),
|
|
109
|
-
totalCount: 0,
|
|
110
|
-
};
|
|
111
|
-
if (process.platform !== "darwin")
|
|
112
|
-
return { ...empty, code: "platform-unsupported" };
|
|
113
|
-
if (request.runtimeDirectory === undefined)
|
|
114
|
-
return { ...empty, code: "runtime-directory-unknown" };
|
|
115
|
-
try {
|
|
116
|
-
if (!/^[a-f\d]{8}-[a-f\d]{4}-4[a-f\d]{3}-[89ab][a-f\d]{3}-[a-f\d]{12}$/.test(request.importId))
|
|
117
|
-
throw new Error("invalid-import");
|
|
118
|
-
const directory = resolve(request.workingDirectory, request.runtimeDirectory, "chats", request.importId);
|
|
119
|
-
await validateDestination(directory);
|
|
120
|
-
if (!(await lstat(directory)).isDirectory())
|
|
121
|
-
throw new Error("invalid-import");
|
|
122
|
-
await absent(join(directory, "redacted.jsonl"));
|
|
123
|
-
await absent(join(directory, "redaction.json"));
|
|
124
|
-
validateCoverage(await readInput(join(directory, "coverage.json")), request.importId);
|
|
125
|
-
const summary = await writeRedactedCorpus(directory, request.settings);
|
|
126
|
-
await writeManifest(directory, {
|
|
127
|
-
schemaVersion: 1,
|
|
128
|
-
importId: request.importId,
|
|
129
|
-
ruleVersion: 1,
|
|
130
|
-
...summary,
|
|
131
|
-
});
|
|
132
|
-
return {
|
|
133
|
-
code: "redaction-complete",
|
|
134
|
-
importId: request.importId,
|
|
135
|
-
...summary,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
catch {
|
|
139
|
-
return { ...empty, code: "redaction-failed" };
|
|
140
|
-
}
|
|
141
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import type { MessageRecord } from "./normalize.ts";
|
|
2
|
-
export interface RedactionSettings {
|
|
3
|
-
readonly home: string | null;
|
|
4
|
-
readonly privateTexts: readonly string[];
|
|
5
|
-
}
|
|
6
|
-
export declare const replacements: {
|
|
7
|
-
readonly privateKey: "[PRIVATE_KEY]";
|
|
8
|
-
readonly credentialUrl: "[CREDENTIAL_URL]";
|
|
9
|
-
readonly homePath: "[HOME_PATH]";
|
|
10
|
-
readonly token: "[TOKEN]";
|
|
11
|
-
readonly email: "[EMAIL]";
|
|
12
|
-
readonly privateText: "[PRIVATE_TEXT]";
|
|
13
|
-
};
|
|
14
|
-
export declare const categories: readonly ["privateKey", "credentialUrl", "homePath", "token", "email", "privateText"];
|
|
15
|
-
export type Category = keyof typeof replacements;
|
|
16
|
-
export type RedactionCounts = Record<Category, number>;
|
|
17
|
-
export declare function emptyCounts(): RedactionCounts;
|
|
18
|
-
export declare function redactRecord(record: MessageRecord, settings: RedactionSettings): {
|
|
19
|
-
record: {
|
|
20
|
-
text: string;
|
|
21
|
-
blocks: Record<string, unknown>[];
|
|
22
|
-
sourceId: string;
|
|
23
|
-
role: "user" | "assistant";
|
|
24
|
-
timestamp: string | null;
|
|
25
|
-
sessionId: string | null;
|
|
26
|
-
schemaVersion: 1;
|
|
27
|
-
} | {
|
|
28
|
-
text: string;
|
|
29
|
-
blocks: Record<string, unknown>[];
|
|
30
|
-
sourceId: string;
|
|
31
|
-
role: "user" | "assistant";
|
|
32
|
-
timestamp: string | null;
|
|
33
|
-
sessionId: string | null;
|
|
34
|
-
schemaVersion: 2;
|
|
35
|
-
uuid: string | null;
|
|
36
|
-
isSidechain: boolean | null;
|
|
37
|
-
parentUuid?: string | null;
|
|
38
|
-
};
|
|
39
|
-
counts: RedactionCounts;
|
|
40
|
-
totalCount: number;
|
|
41
|
-
};
|