@quickchatai/quickreview 0.0.0-stage → 1.1.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/LICENSE +23 -0
- package/README.md +385 -2
- package/THIRD-PARTY-NOTICES.md +134 -0
- package/agents/pass-abstraction.md +64 -0
- package/agents/pass-ask-human.md +134 -0
- package/agents/pass-backcompat.md +67 -0
- package/agents/pass-baseline.md +61 -0
- package/agents/pass-behaviour-delta.md +64 -0
- package/agents/pass-bounds.md +36 -0
- package/agents/pass-claims.md +31 -0
- package/agents/pass-concurrency.md +168 -0
- package/agents/pass-consistency.md +57 -0
- package/agents/pass-contracts.md +30 -0
- package/agents/pass-data-safety.md +54 -0
- package/agents/pass-deferred.md +35 -0
- package/agents/pass-delivery.md +37 -0
- package/agents/pass-duplication.md +60 -0
- package/agents/pass-intent.md +63 -0
- package/agents/pass-lint-conformance.md +46 -0
- package/agents/pass-maintainability.md +67 -0
- package/agents/pass-placement.md +68 -0
- package/agents/pass-prod-risk.md +24 -0
- package/agents/pass-rollout.md +32 -0
- package/agents/pass-roundtrip.md +46 -0
- package/agents/pass-security.md +31 -0
- package/agents/pass-simplicity.md +68 -0
- package/agents/pass-statelessness.md +27 -0
- package/agents/pass-style.md +37 -0
- package/agents/pass-sweep.md +57 -0
- package/agents/pass-tests.md +58 -0
- package/agents/pass-ui.md +23 -0
- package/agents/pass-validate.md +50 -0
- package/agents/pass-widened.md +46 -0
- package/agents/scan/pass-scan.md +86 -0
- package/bin/qcr.js +11 -0
- package/config.example.toml +1067 -0
- package/deploy/ansible/README.md +356 -0
- package/deploy/ansible/group_vars/all.yml +212 -0
- package/deploy/ansible/inventory.example.ini +25 -0
- package/deploy/ansible/playbook.yml +360 -0
- package/deploy/collect-secrets.sh +289 -0
- package/deploy/collect-slack-secrets.mjs +1190 -0
- package/deploy/github-app-manifest.json +31 -0
- package/deploy/manifest.schema.json +75 -0
- package/deploy/qcr-update.sh +803 -0
- package/deploy/reviewer/AGENTS.override.md +12 -0
- package/dist/extensions/cli/bash-guard-ambient.js +42 -0
- package/dist/extensions/cli/bash-guard-ambient.js.map +1 -0
- package/dist/extensions/cli/bash-guard.js +5 -0
- package/dist/extensions/cli/bash-guard.js.map +1 -0
- package/dist/extensions/cli/companion-guard.js +5 -0
- package/dist/extensions/cli/companion-guard.js.map +1 -0
- package/dist/extensions/cli/debug-round.js +8 -0
- package/dist/extensions/cli/debug-round.js.map +1 -0
- package/dist/extensions/cli/inject-bridge.js +5 -0
- package/dist/extensions/cli/inject-bridge.js.map +1 -0
- package/dist/extensions/cli/ledger-pin.js +5 -0
- package/dist/extensions/cli/ledger-pin.js.map +1 -0
- package/dist/extensions/cli/lens.js +13 -0
- package/dist/extensions/cli/lens.js.map +1 -0
- package/dist/extensions/cli/muted-theme.js +5 -0
- package/dist/extensions/cli/muted-theme.js.map +1 -0
- package/dist/extensions/cli/onboarding.js +5 -0
- package/dist/extensions/cli/onboarding.js.map +1 -0
- package/dist/extensions/cli/setup.js +5 -0
- package/dist/extensions/cli/setup.js.map +1 -0
- package/dist/extensions/cli/tui-view.js +5 -0
- package/dist/extensions/cli/tui-view.js.map +1 -0
- package/dist/extensions/companion-guard.js +361 -0
- package/dist/extensions/companion-guard.js.map +1 -0
- package/dist/extensions/debug-round.js +204 -0
- package/dist/extensions/debug-round.js.map +1 -0
- package/dist/extensions/inject-bridge.js +603 -0
- package/dist/extensions/inject-bridge.js.map +1 -0
- package/dist/extensions/muted-theme.js +12 -0
- package/dist/extensions/muted-theme.js.map +1 -0
- package/dist/extensions/onboarding.js +175 -0
- package/dist/extensions/onboarding.js.map +1 -0
- package/dist/extensions/setup-replay.js +269 -0
- package/dist/extensions/setup-replay.js.map +1 -0
- package/dist/extensions/setup-scan.js +998 -0
- package/dist/extensions/setup-scan.js.map +1 -0
- package/dist/extensions/setup-triage.js +175 -0
- package/dist/extensions/setup-triage.js.map +1 -0
- package/dist/extensions/setup.js +1160 -0
- package/dist/extensions/setup.js.map +1 -0
- package/dist/extensions/tui-view.js +389 -0
- package/dist/extensions/tui-view.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/client.js +376 -0
- package/dist/extensions/vendor/openviking-pi/client.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/config.js +189 -0
- package/dist/extensions/vendor/openviking-pi/config.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/index.js +421 -0
- package/dist/extensions/vendor/openviking-pi/index.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/lib/capture-adapter.mjs +86 -0
- package/dist/extensions/vendor/openviking-pi/lib/capture-adapter.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/lib/takeover-core.mjs +408 -0
- package/dist/extensions/vendor/openviking-pi/lib/takeover-core.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs +41 -0
- package/dist/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-hint.js +290 -0
- package/dist/extensions/vendor/openviking-pi/qcr-hint.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-honest.js +148 -0
- package/dist/extensions/vendor/openviking-pi/qcr-honest.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-hooks.js +68 -0
- package/dist/extensions/vendor/openviking-pi/qcr-hooks.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-leaf.js +77 -0
- package/dist/extensions/vendor/openviking-pi/qcr-leaf.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-lesson.js +216 -0
- package/dist/extensions/vendor/openviking-pi/qcr-lesson.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-namespaces.js +154 -0
- package/dist/extensions/vendor/openviking-pi/qcr-namespaces.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-recall.js +254 -0
- package/dist/extensions/vendor/openviking-pi/qcr-recall.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-shim.js +94 -0
- package/dist/extensions/vendor/openviking-pi/qcr-shim.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-write.js +333 -0
- package/dist/extensions/vendor/openviking-pi/qcr-write.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/recall.js +108 -0
- package/dist/extensions/vendor/openviking-pi/recall.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/capture-utils.mjs +529 -0
- package/dist/extensions/vendor/openviking-pi/shared/capture-utils.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/credentials.mjs +205 -0
- package/dist/extensions/vendor/openviking-pi/shared/credentials.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/pending-queue.mjs +442 -0
- package/dist/extensions/vendor/openviking-pi/shared/pending-queue.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/profile-inject.mjs +286 -0
- package/dist/extensions/vendor/openviking-pi/shared/profile-inject.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs +189 -0
- package/dist/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/recall-core.mjs +580 -0
- package/dist/extensions/vendor/openviking-pi/shared/recall-core.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/retryable.mjs +11 -0
- package/dist/extensions/vendor/openviking-pi/shared/retryable.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/session-model.mjs +63 -0
- package/dist/extensions/vendor/openviking-pi/shared/session-model.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/uri-guard.mjs +58 -0
- package/dist/extensions/vendor/openviking-pi/shared/uri-guard.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/workspace-peer.mjs +16 -0
- package/dist/extensions/vendor/openviking-pi/shared/workspace-peer.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/sync.js +127 -0
- package/dist/extensions/vendor/openviking-pi/sync.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/takeover.js +25 -0
- package/dist/extensions/vendor/openviking-pi/takeover.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/tools.js +417 -0
- package/dist/extensions/vendor/openviking-pi/tools.js.map +1 -0
- package/dist/src/anomalies.js +483 -0
- package/dist/src/anomalies.js.map +1 -0
- package/dist/src/answerworker.js +180 -0
- package/dist/src/answerworker.js.map +1 -0
- package/dist/src/appstamp.js +68 -0
- package/dist/src/appstamp.js.map +1 -0
- package/dist/src/archive/admission.js +3 -0
- package/dist/src/archive/admission.js.map +1 -0
- package/dist/src/archive/archivedb.js +474 -0
- package/dist/src/archive/archivedb.js.map +1 -0
- package/dist/src/archive/archiver.js +1770 -0
- package/dist/src/archive/archiver.js.map +1 -0
- package/dist/src/archive/archivewrite.js +198 -0
- package/dist/src/archive/archivewrite.js.map +1 -0
- package/dist/src/archive/bundle.js +266 -0
- package/dist/src/archive/bundle.js.map +1 -0
- package/dist/src/archive/dbmove.js +638 -0
- package/dist/src/archive/dbmove.js.map +1 -0
- package/dist/src/archive/duplicatecounts.js +80 -0
- package/dist/src/archive/duplicatecounts.js.map +1 -0
- package/dist/src/archive/eligibility.js +113 -0
- package/dist/src/archive/eligibility.js.map +1 -0
- package/dist/src/archive/extract.js +288 -0
- package/dist/src/archive/extract.js.map +1 -0
- package/dist/src/archive/fsutil.js +330 -0
- package/dist/src/archive/fsutil.js.map +1 -0
- package/dist/src/archive/gzfile.js +277 -0
- package/dist/src/archive/gzfile.js.map +1 -0
- package/dist/src/archive/kinds.js +22 -0
- package/dist/src/archive/kinds.js.map +1 -0
- package/dist/src/archive/livecheckpoint.js +178 -0
- package/dist/src/archive/livecheckpoint.js.map +1 -0
- package/dist/src/archive/liveretention.js +145 -0
- package/dist/src/archive/liveretention.js.map +1 -0
- package/dist/src/archive/manifest.js +284 -0
- package/dist/src/archive/manifest.js.map +1 -0
- package/dist/src/archive/overseer.js +283 -0
- package/dist/src/archive/overseer.js.map +1 -0
- package/dist/src/archive/piglobal.js +129 -0
- package/dist/src/archive/piglobal.js.map +1 -0
- package/dist/src/archive/plan.js +398 -0
- package/dist/src/archive/plan.js.map +1 -0
- package/dist/src/archive/prarchive.js +831 -0
- package/dist/src/archive/prarchive.js.map +1 -0
- package/dist/src/archive/prfiles.js +303 -0
- package/dist/src/archive/prfiles.js.map +1 -0
- package/dist/src/archive/report.js +169 -0
- package/dist/src/archive/report.js.map +1 -0
- package/dist/src/archive/restore.js +276 -0
- package/dist/src/archive/restore.js.map +1 -0
- package/dist/src/archive/rows.js +106 -0
- package/dist/src/archive/rows.js.map +1 -0
- package/dist/src/archive/seal.js +480 -0
- package/dist/src/archive/seal.js.map +1 -0
- package/dist/src/archive/status.js +528 -0
- package/dist/src/archive/status.js.map +1 -0
- package/dist/src/archive/storepass.js +409 -0
- package/dist/src/archive/storepass.js.map +1 -0
- package/dist/src/backfill.js +217 -0
- package/dist/src/backfill.js.map +1 -0
- package/dist/src/bench/cost.js +87 -0
- package/dist/src/bench/exec.js +76 -0
- package/dist/src/bench/values.js +14 -0
- package/dist/src/botcontrol.js +127 -0
- package/dist/src/botcontrol.js.map +1 -0
- package/dist/src/botworker.js +805 -0
- package/dist/src/botworker.js.map +1 -0
- package/dist/src/capture.js +234 -0
- package/dist/src/capture.js.map +1 -0
- package/dist/src/cases.js +1491 -0
- package/dist/src/cases.js.map +1 -0
- package/dist/src/channelfs.js +27 -0
- package/dist/src/channelfs.js.map +1 -0
- package/dist/src/checklist.js +312 -0
- package/dist/src/checklist.js.map +1 -0
- package/dist/src/ciretry.js +91 -0
- package/dist/src/ciretry.js.map +1 -0
- package/dist/src/cli.js +1916 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/cliops.js +333 -0
- package/dist/src/cliops.js.map +1 -0
- package/dist/src/clonedir.js +15 -0
- package/dist/src/clonedir.js.map +1 -0
- package/dist/src/commandeffects.js +43 -0
- package/dist/src/commandeffects.js.map +1 -0
- package/dist/src/commands.js +1312 -0
- package/dist/src/commands.js.map +1 -0
- package/dist/src/companioninbox.js +203 -0
- package/dist/src/companioninbox.js.map +1 -0
- package/dist/src/compare.js +673 -0
- package/dist/src/compare.js.map +1 -0
- package/dist/src/config.js +1027 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/configcheck.js +111 -0
- package/dist/src/configcheck.js.map +1 -0
- package/dist/src/coreext.js +43 -0
- package/dist/src/coreext.js.map +1 -0
- package/dist/src/daemon.js +929 -0
- package/dist/src/daemon.js.map +1 -0
- package/dist/src/debuground.js +731 -0
- package/dist/src/debuground.js.map +1 -0
- package/dist/src/debugroundpi.js +219 -0
- package/dist/src/debugroundpi.js.map +1 -0
- package/dist/src/diagnostics.js +14 -0
- package/dist/src/diagnostics.js.map +1 -0
- package/dist/src/digest.js +139 -0
- package/dist/src/digest.js.map +1 -0
- package/dist/src/dispatch.js +1726 -0
- package/dist/src/dispatch.js.map +1 -0
- package/dist/src/engine/answerguard.js +18 -0
- package/dist/src/engine/answerguard.js.map +1 -0
- package/dist/src/engine/botsdk.js +262 -0
- package/dist/src/engine/botsdk.js.map +1 -0
- package/dist/src/engine/caserunner-sdk.js +332 -0
- package/dist/src/engine/caserunner-sdk.js.map +1 -0
- package/dist/src/engine/debugpi.js +194 -0
- package/dist/src/engine/debugpi.js.map +1 -0
- package/dist/src/eod.js +473 -0
- package/dist/src/eod.js.map +1 -0
- package/dist/src/eodpinwatch.js +391 -0
- package/dist/src/eodpinwatch.js.map +1 -0
- package/dist/src/escalation.js +1009 -0
- package/dist/src/escalation.js.map +1 -0
- package/dist/src/eventloop.js +779 -0
- package/dist/src/eventloop.js.map +1 -0
- package/dist/src/execboundary.js +430 -0
- package/dist/src/execboundary.js.map +1 -0
- package/dist/src/feedback.js +915 -0
- package/dist/src/feedback.js.map +1 -0
- package/dist/src/findingscheck.js +200 -0
- package/dist/src/findingscheck.js.map +1 -0
- package/dist/src/fsdenied.js +26 -0
- package/dist/src/fsdenied.js.map +1 -0
- package/dist/src/ghread.js +181 -0
- package/dist/src/ghread.js.map +1 -0
- package/dist/src/github.js +1063 -0
- package/dist/src/github.js.map +1 -0
- package/dist/src/homes.js +103 -0
- package/dist/src/homes.js.map +1 -0
- package/dist/src/hostroute.js +24 -0
- package/dist/src/hostroute.js.map +1 -0
- package/dist/src/improvements.js +625 -0
- package/dist/src/improvements.js.map +1 -0
- package/dist/src/install.js +946 -0
- package/dist/src/install.js.map +1 -0
- package/dist/src/installkind.js +40 -0
- package/dist/src/installkind.js.map +1 -0
- package/dist/src/ipc/capability.js +286 -0
- package/dist/src/ipc/capability.js.map +1 -0
- package/dist/src/ipc/client.js +226 -0
- package/dist/src/ipc/client.js.map +1 -0
- package/dist/src/ipc/control.js +70 -0
- package/dist/src/ipc/control.js.map +1 -0
- package/dist/src/ipc/ghreadshim.js +77 -0
- package/dist/src/ipc/ghreadshim.js.map +1 -0
- package/dist/src/ipc/launcher.js +65 -0
- package/dist/src/ipc/launcher.js.map +1 -0
- package/dist/src/ipc/permits.js +293 -0
- package/dist/src/ipc/permits.js.map +1 -0
- package/dist/src/ipc/postshim.js +137 -0
- package/dist/src/ipc/postshim.js.map +1 -0
- package/dist/src/ipc/protocol.js +239 -0
- package/dist/src/ipc/protocol.js.map +1 -0
- package/dist/src/ipc/server.js +312 -0
- package/dist/src/ipc/server.js.map +1 -0
- package/dist/src/ipc/workerspec.js +148 -0
- package/dist/src/ipc/workerspec.js.map +1 -0
- package/dist/src/learner/learner.js +1272 -0
- package/dist/src/learner/learner.js.map +1 -0
- package/dist/src/learner/miner.js +948 -0
- package/dist/src/learner/miner.js.map +1 -0
- package/dist/src/learner/packet.js +216 -0
- package/dist/src/learner/packet.js.map +1 -0
- package/dist/src/learner/receipt.js +135 -0
- package/dist/src/learner/receipt.js.map +1 -0
- package/dist/src/learner/status.js +38 -0
- package/dist/src/learner/status.js.map +1 -0
- package/dist/src/ledgercheck.js +120 -0
- package/dist/src/ledgercheck.js.map +1 -0
- package/dist/src/lessonledger.js +451 -0
- package/dist/src/lessonledger.js.map +1 -0
- package/dist/src/lessonselect.js +639 -0
- package/dist/src/lessonselect.js.map +1 -0
- package/dist/src/lessonshadow.js +540 -0
- package/dist/src/lessonshadow.js.map +1 -0
- package/dist/src/levers.js +302 -0
- package/dist/src/levers.js.map +1 -0
- package/dist/src/live/projection.js +450 -0
- package/dist/src/live/projection.js.map +1 -0
- package/dist/src/live/publish.js +83 -0
- package/dist/src/live/publish.js.map +1 -0
- package/dist/src/live/read.js +60 -0
- package/dist/src/live/read.js.map +1 -0
- package/dist/src/livecli.js +288 -0
- package/dist/src/livecli.js.map +1 -0
- package/dist/src/loginhint.js +42 -0
- package/dist/src/loginhint.js.map +1 -0
- package/dist/src/loginrefresh/atomic.js +66 -0
- package/dist/src/loginrefresh/atomic.js.map +1 -0
- package/dist/src/loginrefresh/lock.js +93 -0
- package/dist/src/loginrefresh/lock.js.map +1 -0
- package/dist/src/loginrefresh/main.js +58 -0
- package/dist/src/loginrefresh/main.js.map +1 -0
- package/dist/src/loginrefresh/pirefresh.js +49 -0
- package/dist/src/loginrefresh/pirefresh.js.map +1 -0
- package/dist/src/loginrefresh/refresher.js +286 -0
- package/dist/src/loginrefresh/refresher.js.map +1 -0
- package/dist/src/loginrefresh/supervisor.js +253 -0
- package/dist/src/loginrefresh/supervisor.js.map +1 -0
- package/dist/src/loginrefresh/types.js +4 -0
- package/dist/src/loginrefresh/types.js.map +1 -0
- package/dist/src/memory/context.js +251 -0
- package/dist/src/memory/context.js.map +1 -0
- package/dist/src/memory/datafence.js +5 -0
- package/dist/src/memory/datafence.js.map +1 -0
- package/dist/src/memory/delivery.js +131 -0
- package/dist/src/memory/delivery.js.map +1 -0
- package/dist/src/memory/eventtags.js +81 -0
- package/dist/src/memory/eventtags.js.map +1 -0
- package/dist/src/memory/health.js +713 -0
- package/dist/src/memory/health.js.map +1 -0
- package/dist/src/memory/import.js +504 -0
- package/dist/src/memory/import.js.map +1 -0
- package/dist/src/memory/layout.js +252 -0
- package/dist/src/memory/layout.js.map +1 -0
- package/dist/src/memory/legacy-file.js +100 -0
- package/dist/src/memory/legacy-file.js.map +1 -0
- package/dist/src/memory/lessons.js +370 -0
- package/dist/src/memory/lessons.js.map +1 -0
- package/dist/src/memory/ovsession.js +449 -0
- package/dist/src/memory/ovsession.js.map +1 -0
- package/dist/src/memory/relayout.js +259 -0
- package/dist/src/memory/relayout.js.map +1 -0
- package/dist/src/memory/roundactivity.js +180 -0
- package/dist/src/memory/roundactivity.js.map +1 -0
- package/dist/src/memory/selection.js +690 -0
- package/dist/src/memory/selection.js.map +1 -0
- package/dist/src/memory/shadowstatus.js +69 -0
- package/dist/src/memory/shadowstatus.js.map +1 -0
- package/dist/src/memory/store.js +83 -0
- package/dist/src/memory/store.js.map +1 -0
- package/dist/src/memory/textidentity.js +8 -0
- package/dist/src/memory/textidentity.js.map +1 -0
- package/dist/src/metrics.js +773 -0
- package/dist/src/metrics.js.map +1 -0
- package/dist/src/missingconfig.js +8 -0
- package/dist/src/missingconfig.js.map +1 -0
- package/dist/src/npmverbs.js +226 -0
- package/dist/src/npmverbs.js.map +1 -0
- package/dist/src/onboard/choices.js +191 -0
- package/dist/src/onboard/choices.js.map +1 -0
- package/dist/src/onboard/engine.js +344 -0
- package/dist/src/onboard/engine.js.map +1 -0
- package/dist/src/onboard/launch.js +83 -0
- package/dist/src/onboard/launch.js.map +1 -0
- package/dist/src/onboard/steps/appslug.js +211 -0
- package/dist/src/onboard/steps/appslug.js.map +1 -0
- package/dist/src/onboard/steps/bringup.js +408 -0
- package/dist/src/onboard/steps/bringup.js.map +1 -0
- package/dist/src/onboard/steps/compose.js +343 -0
- package/dist/src/onboard/steps/compose.js.map +1 -0
- package/dist/src/onboard/steps/configdelivery.js +50 -0
- package/dist/src/onboard/steps/configdelivery.js.map +1 -0
- package/dist/src/onboard/steps/configfill.js +1148 -0
- package/dist/src/onboard/steps/configfill.js.map +1 -0
- package/dist/src/onboard/steps/deploysh.js +80 -0
- package/dist/src/onboard/steps/deploysh.js.map +1 -0
- package/dist/src/onboard/steps/embeddings.js +472 -0
- package/dist/src/onboard/steps/embeddings.js.map +1 -0
- package/dist/src/onboard/steps/escalation.js +571 -0
- package/dist/src/onboard/steps/escalation.js.map +1 -0
- package/dist/src/onboard/steps/githubapp.js +1092 -0
- package/dist/src/onboard/steps/githubapp.js.map +1 -0
- package/dist/src/onboard/steps/golive.js +506 -0
- package/dist/src/onboard/steps/golive.js.map +1 -0
- package/dist/src/onboard/steps/index.js +67 -0
- package/dist/src/onboard/steps/index.js.map +1 -0
- package/dist/src/onboard/steps/ingress.js +762 -0
- package/dist/src/onboard/steps/ingress.js.map +1 -0
- package/dist/src/onboard/steps/inventory.js +420 -0
- package/dist/src/onboard/steps/inventory.js.map +1 -0
- package/dist/src/onboard/steps/llmauth.js +893 -0
- package/dist/src/onboard/steps/llmauth.js.map +1 -0
- package/dist/src/onboard/steps/memory.js +1060 -0
- package/dist/src/onboard/steps/memory.js.map +1 -0
- package/dist/src/onboard/steps/memorykeys.js +43 -0
- package/dist/src/onboard/steps/memorykeys.js.map +1 -0
- package/dist/src/onboard/steps/preflight.js +172 -0
- package/dist/src/onboard/steps/preflight.js.map +1 -0
- package/dist/src/onboard/steps/proof.js +502 -0
- package/dist/src/onboard/steps/proof.js.map +1 -0
- package/dist/src/onboard/steps/ssh.js +300 -0
- package/dist/src/onboard/steps/ssh.js.map +1 -0
- package/dist/src/onboard/steps/topology.js +291 -0
- package/dist/src/onboard/steps/topology.js.map +1 -0
- package/dist/src/onboard/steps/transport.js +511 -0
- package/dist/src/onboard/steps/transport.js.map +1 -0
- package/dist/src/onboard/steps/verifyup.js +362 -0
- package/dist/src/onboard/steps/verifyup.js.map +1 -0
- package/dist/src/onboard/steps/vmdeploy.js +368 -0
- package/dist/src/onboard/steps/vmdeploy.js.map +1 -0
- package/dist/src/onboard/toml.js +53 -0
- package/dist/src/onboard/toml.js.map +1 -0
- package/dist/src/opencli.js +508 -0
- package/dist/src/opencli.js.map +1 -0
- package/dist/src/openpr.js +457 -0
- package/dist/src/openpr.js.map +1 -0
- package/dist/src/openviking/client.js +821 -0
- package/dist/src/openviking/client.js.map +1 -0
- package/dist/src/openviking/context.js +218 -0
- package/dist/src/openviking/context.js.map +1 -0
- package/dist/src/openviking/embedder.js +457 -0
- package/dist/src/openviking/embedder.js.map +1 -0
- package/dist/src/openviking/gapsink.js +38 -0
- package/dist/src/openviking/gapsink.js.map +1 -0
- package/dist/src/openviking/health.js +69 -0
- package/dist/src/openviking/health.js.map +1 -0
- package/dist/src/openviking/index.js +24 -0
- package/dist/src/openviking/index.js.map +1 -0
- package/dist/src/openviking/lessonfind.js +54 -0
- package/dist/src/openviking/lessonfind.js.map +1 -0
- package/dist/src/openviking/probe.js +89 -0
- package/dist/src/openviking/probe.js.map +1 -0
- package/dist/src/openviking/proc.js +95 -0
- package/dist/src/openviking/proc.js.map +1 -0
- package/dist/src/openviking/provisionreport.js +144 -0
- package/dist/src/openviking/provisionreport.js.map +1 -0
- package/dist/src/openviking/reembed.js +317 -0
- package/dist/src/openviking/reembed.js.map +1 -0
- package/dist/src/openviking/relayout.js +153 -0
- package/dist/src/openviking/relayout.js.map +1 -0
- package/dist/src/openviking/sidecar-main.js +39 -0
- package/dist/src/openviking/sidecar-main.js.map +1 -0
- package/dist/src/openviking/sidecar.js +79 -0
- package/dist/src/openviking/sidecar.js.map +1 -0
- package/dist/src/openviking/store.js +1758 -0
- package/dist/src/openviking/store.js.map +1 -0
- package/dist/src/openviking/supervisor.js +422 -0
- package/dist/src/openviking/supervisor.js.map +1 -0
- package/dist/src/openviking/types.js +5 -0
- package/dist/src/openviking/types.js.map +1 -0
- package/dist/src/operator-recovery.js +172 -0
- package/dist/src/operator-recovery.js.map +1 -0
- package/dist/src/operatormessage.js +44 -0
- package/dist/src/operatormessage.js.map +1 -0
- package/dist/src/outcomes.js +1361 -0
- package/dist/src/outcomes.js.map +1 -0
- package/dist/src/piauthcopy.js +5 -0
- package/dist/src/piauthcopy.js.map +1 -0
- package/dist/src/picli.js +45 -0
- package/dist/src/picli.js.map +1 -0
- package/dist/src/picwd.js +25 -0
- package/dist/src/picwd.js.map +1 -0
- package/dist/src/pilogin.js +35 -0
- package/dist/src/pilogin.js.map +1 -0
- package/dist/src/pingpong.js +1028 -0
- package/dist/src/pingpong.js.map +1 -0
- package/dist/src/posting-journal.js +441 -0
- package/dist/src/posting-journal.js.map +1 -0
- package/dist/src/posting-outbox.js +662 -0
- package/dist/src/posting-outbox.js.map +1 -0
- package/dist/src/posting-receipt.js +203 -0
- package/dist/src/posting-receipt.js.map +1 -0
- package/dist/src/posting.js +348 -0
- package/dist/src/posting.js.map +1 -0
- package/dist/src/postops.js +637 -0
- package/dist/src/postops.js.map +1 -0
- package/dist/src/pr-activity.js +11 -0
- package/dist/src/pr-activity.js.map +1 -0
- package/dist/src/pr-author.js +5 -0
- package/dist/src/pr-author.js.map +1 -0
- package/dist/src/pr-conversation.js +355 -0
- package/dist/src/pr-conversation.js.map +1 -0
- package/dist/src/pr-session-lifecycle.js +542 -0
- package/dist/src/pr-session-lifecycle.js.map +1 -0
- package/dist/src/preflight.js +341 -0
- package/dist/src/preflight.js.map +1 -0
- package/dist/src/priorresolve.js +275 -0
- package/dist/src/priorresolve.js.map +1 -0
- package/dist/src/qcrbin.js +180 -0
- package/dist/src/qcrbin.js.map +1 -0
- package/dist/src/recheck.js +1398 -0
- package/dist/src/recheck.js.map +1 -0
- package/dist/src/reconcile.js +820 -0
- package/dist/src/reconcile.js.map +1 -0
- package/dist/src/recordedfindings.js +15 -0
- package/dist/src/recordedfindings.js.map +1 -0
- package/dist/src/regression.js +546 -0
- package/dist/src/regression.js.map +1 -0
- package/dist/src/replay.js +598 -0
- package/dist/src/replay.js.map +1 -0
- package/dist/src/requiredpasses.js +113 -0
- package/dist/src/requiredpasses.js.map +1 -0
- package/dist/src/resumecheck.js +168 -0
- package/dist/src/resumecheck.js.map +1 -0
- package/dist/src/reviewcli.js +671 -0
- package/dist/src/reviewcli.js.map +1 -0
- package/dist/src/reviewcontext.js +22 -0
- package/dist/src/reviewcontext.js.map +1 -0
- package/dist/src/reviewdetach.js +574 -0
- package/dist/src/reviewdetach.js.map +1 -0
- package/dist/src/reviewhistory.js +284 -0
- package/dist/src/reviewhistory.js.map +1 -0
- package/dist/src/reviewhome.js +26 -0
- package/dist/src/reviewhome.js.map +1 -0
- package/dist/src/reviewmemory.js +110 -0
- package/dist/src/reviewmemory.js.map +1 -0
- package/dist/src/reviewrendercli.js +104 -0
- package/dist/src/reviewrendercli.js.map +1 -0
- package/dist/src/round-work.js +20 -0
- package/dist/src/round-work.js.map +1 -0
- package/dist/src/runhost.js +72 -0
- package/dist/src/runhost.js.map +1 -0
- package/dist/src/scanauth.js +25 -0
- package/dist/src/scanauth.js.map +1 -0
- package/dist/src/scanbox.js +846 -0
- package/dist/src/scanbox.js.map +1 -0
- package/dist/src/scancli.js +1074 -0
- package/dist/src/scancli.js.map +1 -0
- package/dist/src/scandriverlog.js +30 -0
- package/dist/src/scandriverlog.js.map +1 -0
- package/dist/src/session-bridge.js +75 -0
- package/dist/src/session-bridge.js.map +1 -0
- package/dist/src/session-command-payload.js +29 -0
- package/dist/src/session-command-payload.js.map +1 -0
- package/dist/src/session-command-supervisor.js +939 -0
- package/dist/src/session-command-supervisor.js.map +1 -0
- package/dist/src/sessionjsonl.js +85 -0
- package/dist/src/sessionjsonl.js.map +1 -0
- package/dist/src/sessions.js +541 -0
- package/dist/src/sessions.js.map +1 -0
- package/dist/src/setup/adapters.js +330 -0
- package/dist/src/setup/adapters.js.map +1 -0
- package/dist/src/setup/baselines.js +64 -0
- package/dist/src/setup/baselines.js.map +1 -0
- package/dist/src/setup/caserunner.js +554 -0
- package/dist/src/setup/caserunner.js.map +1 -0
- package/dist/src/setup/configcommit.js +358 -0
- package/dist/src/setup/configcommit.js.map +1 -0
- package/dist/src/setup/engine.js +672 -0
- package/dist/src/setup/engine.js.map +1 -0
- package/dist/src/setup/facts.js +593 -0
- package/dist/src/setup/facts.js.map +1 -0
- package/dist/src/setup/findings.js +948 -0
- package/dist/src/setup/findings.js.map +1 -0
- package/dist/src/setup/history.js +338 -0
- package/dist/src/setup/history.js.map +1 -0
- package/dist/src/setup/interview.js +185 -0
- package/dist/src/setup/interview.js.map +1 -0
- package/dist/src/setup/ledger.js +207 -0
- package/dist/src/setup/ledger.js.map +1 -0
- package/dist/src/setup/pins.js +43 -0
- package/dist/src/setup/pins.js.map +1 -0
- package/dist/src/setup/portrait.js +432 -0
- package/dist/src/setup/portrait.js.map +1 -0
- package/dist/src/setup/presentation.js +9 -0
- package/dist/src/setup/presentation.js.map +1 -0
- package/dist/src/setup/profile.js +417 -0
- package/dist/src/setup/profile.js.map +1 -0
- package/dist/src/setup/replay.js +240 -0
- package/dist/src/setup/replay.js.map +1 -0
- package/dist/src/setup/replaybuild.js +311 -0
- package/dist/src/setup/replaybuild.js.map +1 -0
- package/dist/src/setup/replayrun.js +806 -0
- package/dist/src/setup/replayrun.js.map +1 -0
- package/dist/src/setup/replaysource.js +169 -0
- package/dist/src/setup/replaysource.js.map +1 -0
- package/dist/src/setup/retune.js +333 -0
- package/dist/src/setup/retune.js.map +1 -0
- package/dist/src/setup/retunelog.js +51 -0
- package/dist/src/setup/retunelog.js.map +1 -0
- package/dist/src/setup/scan.js +725 -0
- package/dist/src/setup/scan.js.map +1 -0
- package/dist/src/setup/scanbuild.js +133 -0
- package/dist/src/setup/scanbuild.js.map +1 -0
- package/dist/src/setup/scanfacts.js +96 -0
- package/dist/src/setup/scanfacts.js.map +1 -0
- package/dist/src/setup/scanlease.js +251 -0
- package/dist/src/setup/scanlease.js.map +1 -0
- package/dist/src/setup/scanreport.js +289 -0
- package/dist/src/setup/scanreport.js.map +1 -0
- package/dist/src/setup/scanrun.js +1733 -0
- package/dist/src/setup/scanrun.js.map +1 -0
- package/dist/src/setup/scantree.js +257 -0
- package/dist/src/setup/scantree.js.map +1 -0
- package/dist/src/setup/stage2.js +617 -0
- package/dist/src/setup/stage2.js.map +1 -0
- package/dist/src/setup/stage2request.js +259 -0
- package/dist/src/setup/stage2request.js.map +1 -0
- package/dist/src/setup/survey.js +307 -0
- package/dist/src/setup/survey.js.map +1 -0
- package/dist/src/setup/surveyrun.js +549 -0
- package/dist/src/setup/surveyrun.js.map +1 -0
- package/dist/src/setup/textsniff.js +89 -0
- package/dist/src/setup/textsniff.js.map +1 -0
- package/dist/src/setup/trackersink.js +395 -0
- package/dist/src/setup/trackersink.js.map +1 -0
- package/dist/src/setup/triage.js +636 -0
- package/dist/src/setup/triage.js.map +1 -0
- package/dist/src/setup/tuning.js +585 -0
- package/dist/src/setup/tuning.js.map +1 -0
- package/dist/src/setup/unitcut.js +437 -0
- package/dist/src/setup/unitcut.js.map +1 -0
- package/dist/src/singleflight.js +72 -0
- package/dist/src/singleflight.js.map +1 -0
- package/dist/src/slack/announce.js +725 -0
- package/dist/src/slack/announce.js.map +1 -0
- package/dist/src/slack/api.js +227 -0
- package/dist/src/slack/api.js.map +1 -0
- package/dist/src/slack/messages.js +158 -0
- package/dist/src/slack/messages.js.map +1 -0
- package/dist/src/slack/origin.js +550 -0
- package/dist/src/slack/origin.js.map +1 -0
- package/dist/src/slack/policy.js +225 -0
- package/dist/src/slack/policy.js.map +1 -0
- package/dist/src/slack/reply.js +153 -0
- package/dist/src/slack/reply.js.map +1 -0
- package/dist/src/slack/router.js +189 -0
- package/dist/src/slack/router.js.map +1 -0
- package/dist/src/slack/socket.js +323 -0
- package/dist/src/slack/socket.js.map +1 -0
- package/dist/src/slack/types.js +11 -0
- package/dist/src/slack/types.js.map +1 -0
- package/dist/src/sqlitehint.js +30 -0
- package/dist/src/sqlitehint.js.map +1 -0
- package/dist/src/ssh-observation.js +25 -0
- package/dist/src/ssh-observation.js.map +1 -0
- package/dist/src/state.js +5869 -0
- package/dist/src/state.js.map +1 -0
- package/dist/src/statemachine.js +220 -0
- package/dist/src/statemachine.js.map +1 -0
- package/dist/src/stubs.js +52 -0
- package/dist/src/stubs.js.map +1 -0
- package/dist/src/takeover.js +506 -0
- package/dist/src/takeover.js.map +1 -0
- package/dist/src/takeoverpi.js +249 -0
- package/dist/src/takeoverpi.js.map +1 -0
- package/dist/src/terminal-failure.js +26 -0
- package/dist/src/terminal-failure.js.map +1 -0
- package/dist/src/thread-resolution-refusal.js +4 -0
- package/dist/src/thread-resolution-refusal.js.map +1 -0
- package/dist/src/tmux.js +126 -0
- package/dist/src/tmux.js.map +1 -0
- package/dist/src/trackerid.js +43 -0
- package/dist/src/trackerid.js.map +1 -0
- package/dist/src/transcriptindex.js +512 -0
- package/dist/src/transcriptindex.js.map +1 -0
- package/dist/src/tui/actions.js +404 -0
- package/dist/src/tui/actions.js.map +1 -0
- package/dist/src/tui/alerts.js +523 -0
- package/dist/src/tui/alerts.js.map +1 -0
- package/dist/src/tui/app.js +1835 -0
- package/dist/src/tui/app.js.map +1 -0
- package/dist/src/tui/archiveops.js +164 -0
- package/dist/src/tui/archiveops.js.map +1 -0
- package/dist/src/tui/autofile.js +191 -0
- package/dist/src/tui/autofile.js.map +1 -0
- package/dist/src/tui/board.js +1143 -0
- package/dist/src/tui/board.js.map +1 -0
- package/dist/src/tui/candidates.js +699 -0
- package/dist/src/tui/candidates.js.map +1 -0
- package/dist/src/tui/cellwidth.js +151 -0
- package/dist/src/tui/cellwidth.js.map +1 -0
- package/dist/src/tui/changelog-store.js +404 -0
- package/dist/src/tui/changelog-store.js.map +1 -0
- package/dist/src/tui/chord.js +26 -0
- package/dist/src/tui/chord.js.map +1 -0
- package/dist/src/tui/clipboard.js +81 -0
- package/dist/src/tui/clipboard.js.map +1 -0
- package/dist/src/tui/cmdbar.js +253 -0
- package/dist/src/tui/cmdbar.js.map +1 -0
- package/dist/src/tui/companion.js +1275 -0
- package/dist/src/tui/companion.js.map +1 -0
- package/dist/src/tui/companionplan.js +200 -0
- package/dist/src/tui/companionplan.js.map +1 -0
- package/dist/src/tui/companiontab.js +61 -0
- package/dist/src/tui/companiontab.js.map +1 -0
- package/dist/src/tui/confighome.js +105 -0
- package/dist/src/tui/confighome.js.map +1 -0
- package/dist/src/tui/connect.js +44 -0
- package/dist/src/tui/connect.js.map +1 -0
- package/dist/src/tui/deploy-ceremony.js +75 -0
- package/dist/src/tui/deploy-ceremony.js.map +1 -0
- package/dist/src/tui/deploy-drain.js +93 -0
- package/dist/src/tui/deploy-drain.js.map +1 -0
- package/dist/src/tui/deploy-process.js +234 -0
- package/dist/src/tui/deploy-process.js.map +1 -0
- package/dist/src/tui/deploytab.js +1263 -0
- package/dist/src/tui/deploytab.js.map +1 -0
- package/dist/src/tui/design.js +111 -0
- package/dist/src/tui/design.js.map +1 -0
- package/dist/src/tui/digesttab.js +148 -0
- package/dist/src/tui/digesttab.js.map +1 -0
- package/dist/src/tui/emptystate.js +32 -0
- package/dist/src/tui/emptystate.js.map +1 -0
- package/dist/src/tui/evidence.js +790 -0
- package/dist/src/tui/evidence.js.map +1 -0
- package/dist/src/tui/feed.js +415 -0
- package/dist/src/tui/feed.js.map +1 -0
- package/dist/src/tui/feedbacktab.js +907 -0
- package/dist/src/tui/feedbacktab.js.map +1 -0
- package/dist/src/tui/filters.js +72 -0
- package/dist/src/tui/filters.js.map +1 -0
- package/dist/src/tui/ghread.js +272 -0
- package/dist/src/tui/ghread.js.map +1 -0
- package/dist/src/tui/historypull.js +61 -0
- package/dist/src/tui/historypull.js.map +1 -0
- package/dist/src/tui/inboxpull.js +197 -0
- package/dist/src/tui/inboxpull.js.map +1 -0
- package/dist/src/tui/index.js +1425 -0
- package/dist/src/tui/index.js.map +1 -0
- package/dist/src/tui/issuesink.js +206 -0
- package/dist/src/tui/issuesink.js.map +1 -0
- package/dist/src/tui/jsonfile.js +32 -0
- package/dist/src/tui/jsonfile.js.map +1 -0
- package/dist/src/tui/keys.js +97 -0
- package/dist/src/tui/keys.js.map +1 -0
- package/dist/src/tui/layout.js +70 -0
- package/dist/src/tui/layout.js.map +1 -0
- package/dist/src/tui/learning.js +469 -0
- package/dist/src/tui/learning.js.map +1 -0
- package/dist/src/tui/lessonswitch.js +103 -0
- package/dist/src/tui/lessonswitch.js.map +1 -0
- package/dist/src/tui/livecontrol.js +167 -0
- package/dist/src/tui/livecontrol.js.map +1 -0
- package/dist/src/tui/memforward.js +310 -0
- package/dist/src/tui/memforward.js.map +1 -0
- package/dist/src/tui/memincident.js +287 -0
- package/dist/src/tui/memincident.js.map +1 -0
- package/dist/src/tui/memory.js +485 -0
- package/dist/src/tui/memory.js.map +1 -0
- package/dist/src/tui/memtab.js +513 -0
- package/dist/src/tui/memtab.js.map +1 -0
- package/dist/src/tui/metricstab.js +979 -0
- package/dist/src/tui/metricstab.js.map +1 -0
- package/dist/src/tui/model.js +104 -0
- package/dist/src/tui/model.js.map +1 -0
- package/dist/src/tui/mouse.js +83 -0
- package/dist/src/tui/mouse.js.map +1 -0
- package/dist/src/tui/msg.js +196 -0
- package/dist/src/tui/msg.js.map +1 -0
- package/dist/src/tui/nativecompanion.js +321 -0
- package/dist/src/tui/nativecompanion.js.map +1 -0
- package/dist/src/tui/openurl.js +17 -0
- package/dist/src/tui/openurl.js.map +1 -0
- package/dist/src/tui/paint.js +501 -0
- package/dist/src/tui/paint.js.map +1 -0
- package/dist/src/tui/panes.js +74 -0
- package/dist/src/tui/panes.js.map +1 -0
- package/dist/src/tui/pipane.js +166 -0
- package/dist/src/tui/pipane.js.map +1 -0
- package/dist/src/tui/poll-hooks.js +11 -0
- package/dist/src/tui/poll-hooks.js.map +1 -0
- package/dist/src/tui/poll.js +113 -0
- package/dist/src/tui/poll.js.map +1 -0
- package/dist/src/tui/proposals.js +715 -0
- package/dist/src/tui/proposals.js.map +1 -0
- package/dist/src/tui/prpause.js +132 -0
- package/dist/src/tui/prpause.js.map +1 -0
- package/dist/src/tui/reload.js +351 -0
- package/dist/src/tui/reload.js.map +1 -0
- package/dist/src/tui/remote.js +312 -0
- package/dist/src/tui/remote.js.map +1 -0
- package/dist/src/tui/rollover.js +767 -0
- package/dist/src/tui/rollover.js.map +1 -0
- package/dist/src/tui/scantab.js +1053 -0
- package/dist/src/tui/scantab.js.map +1 -0
- package/dist/src/tui/setupentry.js +81 -0
- package/dist/src/tui/setupentry.js.map +1 -0
- package/dist/src/tui/sidebar.js +602 -0
- package/dist/src/tui/sidebar.js.map +1 -0
- package/dist/src/tui/sshtriage.js +393 -0
- package/dist/src/tui/sshtriage.js.map +1 -0
- package/dist/src/tui/startup.js +172 -0
- package/dist/src/tui/startup.js.map +1 -0
- package/dist/src/tui/tabs.js +41 -0
- package/dist/src/tui/tabs.js.map +1 -0
- package/dist/src/tui/termmirror.js +217 -0
- package/dist/src/tui/termmirror.js.map +1 -0
- package/dist/src/tui/theme.js +95 -0
- package/dist/src/tui/theme.js.map +1 -0
- package/dist/src/tui/ticketstab.js +224 -0
- package/dist/src/tui/ticketstab.js.map +1 -0
- package/dist/src/tui/tmuxsocket.js +101 -0
- package/dist/src/tui/tmuxsocket.js.map +1 -0
- package/dist/src/tui/trackertickets.js +77 -0
- package/dist/src/tui/trackertickets.js.map +1 -0
- package/dist/src/tui/unwedge.js +245 -0
- package/dist/src/tui/unwedge.js.map +1 -0
- package/dist/src/tui/viewer.js +479 -0
- package/dist/src/tui/viewer.js.map +1 -0
- package/dist/src/tui/viewerinput.js +125 -0
- package/dist/src/tui/viewerinput.js.map +1 -0
- package/dist/src/updatenotice.js +143 -0
- package/dist/src/updatenotice.js.map +1 -0
- package/dist/src/usage.js +1007 -0
- package/dist/src/usage.js.map +1 -0
- package/dist/src/verdicts.js +3848 -0
- package/dist/src/verdicts.js.map +1 -0
- package/dist/src/version.js +58 -0
- package/dist/src/version.js.map +1 -0
- package/dist/src/wakes.js +411 -0
- package/dist/src/wakes.js.map +1 -0
- package/dist/src/webhook.js +725 -0
- package/dist/src/webhook.js.map +1 -0
- package/dist/src/webhookheal.js +238 -0
- package/dist/src/webhookheal.js.map +1 -0
- package/dist/src/wire.js +1801 -0
- package/dist/src/wire.js.map +1 -0
- package/dist/src/worker-session-host.js +531 -0
- package/dist/src/worker-session-host.js.map +1 -0
- package/dist/src/workerbreaker.js +112 -0
- package/dist/src/workerbreaker.js.map +1 -0
- package/dist/src/workercontrol.js +49 -0
- package/dist/src/workercontrol.js.map +1 -0
- package/dist/src/workerlease.js +351 -0
- package/dist/src/workerlease.js.map +1 -0
- package/dist/src/workerliveness.js +84 -0
- package/dist/src/workerliveness.js.map +1 -0
- package/dist/src/workerlog.js +65 -0
- package/dist/src/workerlog.js.map +1 -0
- package/dist/src/workerruntime.js +10 -0
- package/dist/src/workerruntime.js.map +1 -0
- package/dist/src/workersupervisor.js +1206 -0
- package/dist/src/workersupervisor.js.map +1 -0
- package/dist/src/workerusage.js +23 -0
- package/dist/src/workerusage.js.map +1 -0
- package/dist/src/workerworld.js +332 -0
- package/dist/src/workerworld.js.map +1 -0
- package/dist/src/worktrees.js +984 -0
- package/dist/src/worktrees.js.map +1 -0
- package/docker/Dockerfile +284 -0
- package/docker/Dockerfile.dockerignore +35 -0
- package/docker/README.md +221 -0
- package/docker/companion/Dockerfile +139 -0
- package/docker/companion/agents/evidence.md +34 -0
- package/docker/companion/agents/explore.md +26 -0
- package/docker/companion/agents/pass-survey.md +49 -0
- package/docker/companion/agents/study.md +26 -0
- package/docker/companion/entrypoint.sh +343 -0
- package/docker/companion/memory-health.mjs +269 -0
- package/docker/entrypoint.sh +782 -0
- package/docker/memory/Dockerfile +191 -0
- package/docker/memory/Dockerfile.dockerignore +20 -0
- package/docker/memory/README.md +60 -0
- package/docker/memory/entrypoint.sh +163 -0
- package/docker/setid/qcr-setid.c +109 -0
- package/docker/tunnel/Dockerfile.cloudflared +51 -0
- package/docker/tunnel/Dockerfile.ngrok +40 -0
- package/docker/tunnel/sidecar.mjs +411 -0
- package/docker/vm/tmux.conf +26 -0
- package/docker-compose.yml +348 -0
- package/extensions/cli/bash-guard-ambient.ts +71 -0
- package/extensions/cli/bash-guard.ts +12 -0
- package/extensions/cli/companion-guard.ts +8 -0
- package/extensions/cli/debug-round.ts +9 -0
- package/extensions/cli/inject-bridge.ts +8 -0
- package/extensions/cli/ledger-pin.ts +13 -0
- package/extensions/cli/lens.ts +22 -0
- package/extensions/cli/muted-theme.ts +9 -0
- package/extensions/cli/onboarding.ts +8 -0
- package/extensions/cli/setup.ts +8 -0
- package/extensions/cli/tui-view.ts +8 -0
- package/extensions/companion-guard.ts +411 -0
- package/extensions/debug-round.ts +281 -0
- package/extensions/inject-bridge.ts +630 -0
- package/extensions/inline-bash.ts +102 -0
- package/extensions/muted-theme.json +68 -0
- package/extensions/muted-theme.ts +23 -0
- package/extensions/onboarding.ts +233 -0
- package/extensions/setup-replay.ts +336 -0
- package/extensions/setup-scan.ts +1236 -0
- package/extensions/setup-triage.ts +190 -0
- package/extensions/setup.ts +1428 -0
- package/extensions/tui-view.ts +489 -0
- package/extensions/vendor/openviking-pi/LICENSE +201 -0
- package/extensions/vendor/openviking-pi/NOTICE +68 -0
- package/extensions/vendor/openviking-pi/README.md +550 -0
- package/extensions/vendor/openviking-pi/client.ts +588 -0
- package/extensions/vendor/openviking-pi/config.json +28 -0
- package/extensions/vendor/openviking-pi/config.ts +271 -0
- package/extensions/vendor/openviking-pi/index.ts +523 -0
- package/extensions/vendor/openviking-pi/lib/capture-adapter.d.mts +10 -0
- package/extensions/vendor/openviking-pi/lib/capture-adapter.mjs +88 -0
- package/extensions/vendor/openviking-pi/lib/takeover-core.d.mts +80 -0
- package/extensions/vendor/openviking-pi/lib/takeover-core.mjs +406 -0
- package/extensions/vendor/openviking-pi/lib/uri-guard-adapter.d.mts +1 -0
- package/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs +42 -0
- package/extensions/vendor/openviking-pi/patches/0000-vendoring-and-build-conformance.patch +726 -0
- package/extensions/vendor/openviking-pi/patches/0001-remove-session-before-compact-handler.patch +101 -0
- package/extensions/vendor/openviking-pi/patches/0002-no-ambient-work-in-subagent-leaves.patch +202 -0
- package/extensions/vendor/openviking-pi/patches/0003-never-auto-create-openviking-sessions.patch +120 -0
- package/extensions/vendor/openviking-pi/patches/0004-viking-write-durable-batch-write.patch +521 -0
- package/extensions/vendor/openviking-pi/patches/0005-second-memory-namespace.patch +786 -0
- package/extensions/vendor/openviking-pi/patches/0006-writes-that-stick-and-honest-errors.patch +996 -0
- package/extensions/vendor/openviking-pi/patches/0007-bounded-recall-no-commit.patch +794 -0
- package/extensions/vendor/openviking-pi/patches/0008-pr-derived-recall.patch +379 -0
- package/extensions/vendor/openviking-pi/patches/0009-pr-session-tools-in-round-areas.patch +375 -0
- package/extensions/vendor/openviking-pi/patches/0010-typed-lessons.patch +448 -0
- package/extensions/vendor/openviking-pi/patches/0011-review-session-memory-boundary.patch +382 -0
- package/extensions/vendor/openviking-pi/patches/0012-typecheck-against-the-real-pi.patch +129 -0
- package/extensions/vendor/openviking-pi/patches/0013-createopenviking-factory.patch +1168 -0
- package/extensions/vendor/openviking-pi/qcr-hint.ts +313 -0
- package/extensions/vendor/openviking-pi/qcr-honest.ts +183 -0
- package/extensions/vendor/openviking-pi/qcr-hooks.ts +87 -0
- package/extensions/vendor/openviking-pi/qcr-leaf.ts +78 -0
- package/extensions/vendor/openviking-pi/qcr-lesson.ts +231 -0
- package/extensions/vendor/openviking-pi/qcr-namespaces.ts +198 -0
- package/extensions/vendor/openviking-pi/qcr-recall.ts +288 -0
- package/extensions/vendor/openviking-pi/qcr-shim.ts +142 -0
- package/extensions/vendor/openviking-pi/qcr-write.ts +427 -0
- package/extensions/vendor/openviking-pi/recall.ts +149 -0
- package/extensions/vendor/openviking-pi/shared/capture-utils.d.mts +9 -0
- package/extensions/vendor/openviking-pi/shared/capture-utils.mjs +515 -0
- package/extensions/vendor/openviking-pi/shared/credentials.d.mts +14 -0
- package/extensions/vendor/openviking-pi/shared/credentials.mjs +228 -0
- package/extensions/vendor/openviking-pi/shared/pending-queue.d.mts +19 -0
- package/extensions/vendor/openviking-pi/shared/pending-queue.mjs +458 -0
- package/extensions/vendor/openviking-pi/shared/profile-inject.d.mts +17 -0
- package/extensions/vendor/openviking-pi/shared/profile-inject.mjs +294 -0
- package/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs +195 -0
- package/extensions/vendor/openviking-pi/shared/recall-core.d.mts +13 -0
- package/extensions/vendor/openviking-pi/shared/recall-core.mjs +609 -0
- package/extensions/vendor/openviking-pi/shared/retryable.mjs +9 -0
- package/extensions/vendor/openviking-pi/shared/session-model.d.mts +3 -0
- package/extensions/vendor/openviking-pi/shared/session-model.mjs +57 -0
- package/extensions/vendor/openviking-pi/shared/uri-guard.mjs +56 -0
- package/extensions/vendor/openviking-pi/shared/workspace-peer.d.mts +5 -0
- package/extensions/vendor/openviking-pi/shared/workspace-peer.mjs +16 -0
- package/extensions/vendor/openviking-pi/sync.ts +163 -0
- package/extensions/vendor/openviking-pi/takeover.ts +36 -0
- package/extensions/vendor/openviking-pi/tools.ts +479 -0
- package/extensions/vendor/openviking-pi/upstream.json +48 -0
- package/package.json +138 -4
- package/profiles/default/README.md +21 -0
- package/profiles/default/addenda/.gitkeep +0 -0
- package/profiles/default/profile.toml +17 -0
- package/profiles/example-django/README.md +21 -0
- package/profiles/example-django/addenda/10-migration-discipline.md +13 -0
- package/profiles/example-django/addenda/20-new-column-nullability.md +12 -0
- package/profiles/example-django/addenda/30-test-doctrine.md +12 -0
- package/profiles/example-django/addenda/40-orm-usage.md +19 -0
- package/profiles/example-django/addenda/50-declared-shape.md +10 -0
- package/profiles/example-django/addenda/60-config-placement.md +14 -0
- package/profiles/example-django/heuristics.toml +24 -0
- package/profiles/example-django/profile.toml +9 -0
- package/profiles/fast/README.md +24 -0
- package/profiles/fast/profile.toml +59 -0
- package/profiles/minimal/README.md +17 -0
- package/profiles/minimal/addenda/.gitkeep +0 -0
- package/profiles/minimal/profile.toml +8 -0
- package/profiles/snappy/README.md +24 -0
- package/profiles/snappy/addenda/10-race-as-question.md +6 -0
- package/profiles/snappy/profile.toml +46 -0
- package/prompts/companion-day-open.md +46 -0
- package/prompts/companion-first-run.md +104 -0
- package/prompts/companion.md +821 -0
- package/prompts/conversation-system.md +117 -0
- package/prompts/eod-sweep.md +120 -0
- package/prompts/onboarding.md +74 -0
- package/prompts/pass-common.md +52 -0
- package/prompts/pass-quality-common.md +22 -0
- package/prompts/round-first.md +874 -0
- package/prompts/round-follow-up.md +991 -0
- package/prompts/round-re-review.md +889 -0
- package/prompts/round-recheck.md +196 -0
- package/prompts/round-staleness.md +856 -0
- package/schemas/review-result.v1.json +391 -0
- package/schemas/scan-result.v1.json +421 -0
- package/schemas/version.v1.json +57 -0
- package/scripts/approve-pr.sh +16 -0
- package/scripts/build-stamp.mjs +67 -0
- package/scripts/commit-verdict.sh +155 -0
- package/scripts/companion-e2e.sh +250 -0
- package/scripts/companion-memory-forward.mjs +1966 -0
- package/scripts/config-fingerprint.sh +28 -0
- package/scripts/deploy-manifest.mjs +141 -0
- package/scripts/deploy.sh +1435 -0
- package/scripts/directory-lock.mjs +193 -0
- package/scripts/heartbeat-fresh.mjs +54 -0
- package/scripts/install-locator.sh +328 -0
- package/scripts/install-wrapper.sh +76 -0
- package/scripts/memory-search-check.mjs +98 -0
- package/scripts/mint-token.sh +212 -0
- package/scripts/openviking-embedder.py +392 -0
- package/scripts/openviking-ov-conf.mjs +161 -0
- package/scripts/openviking-provision.mjs +1122 -0
- package/scripts/openviking-reembed.mjs +1154 -0
- package/scripts/post-review.sh +16 -0
- package/scripts/pr-checks.sh +256 -0
- package/scripts/pr-context.py +174 -0
- package/scripts/pr-context.sh +63 -0
- package/scripts/pr-self.sh +144 -0
- package/scripts/pr-threads.sh +145 -0
- package/scripts/qcr +15 -0
- package/scripts/qcr-host.sh +769 -0
- package/scripts/render-review.sh +24 -0
- package/scripts/reply-thread.sh +16 -0
- package/scripts/required-passes.py +112 -0
- package/scripts/smoke-companion.sh +211 -0
- package/scripts/tui-deploy-runner.mjs +61 -0
- package/scripts/verify-dist.mjs +201 -0
- package/scripts/vm-ghcr-login.sh +188 -0
- package/seeds/agents/pass-baseline.md +61 -0
- package/seeds/agents/pass-contracts.md +30 -0
- package/seeds/agents/pass-data-safety.md +54 -0
- package/seeds/agents/pass-delivery.md +37 -0
- package/seeds/agents/pass-prod-risk.md +24 -0
- package/seeds/agents/pass-security.md +31 -0
- package/seeds/agents/pass-statelessness.md +27 -0
- package/seeds/agents/pass-ui.md +23 -0
- package/seeds/agents/pass-validate.md +50 -0
- package/seeds/prompts/conversation-system.md +117 -0
- package/seeds/prompts/eod-sweep.md +120 -0
- package/seeds/prompts/pass-common.md +52 -0
- package/skills/companion/adjudicate/SKILL.md +247 -0
- package/skills/companion/evidence/SKILL.md +150 -0
- package/skills/companion/land/SKILL.md +200 -0
- package/skills/companion/replay/SKILL.md +138 -0
- package/skills/companion/setup/SKILL.md +167 -0
- package/skills/companion/survey/SKILL.md +160 -0
- package/skills/selfimprove/README.md +34 -0
- package/skills/selfimprove/SKILL.md +127 -0
- package/skills/selfimprove/agents/openai.yaml +2 -0
- package/skills/selfimprove/commands/selfimprove.md +6 -0
- package/skills/selfimprove/references/fix-loop.md +49 -0
- package/skills/selfimprove/references/ledger.md +20 -0
- package/skills/selfimprove/references/setup.md +40 -0
- package/src/anomalies.ts +566 -0
- package/src/answerworker.ts +251 -0
- package/src/appstamp.ts +65 -0
- package/src/archive/admission.ts +3 -0
- package/src/archive/archivedb.ts +548 -0
- package/src/archive/archiver.ts +1963 -0
- package/src/archive/archivewrite.ts +279 -0
- package/src/archive/bundle.ts +333 -0
- package/src/archive/dbmove.ts +911 -0
- package/src/archive/duplicatecounts.ts +98 -0
- package/src/archive/eligibility.ts +181 -0
- package/src/archive/extract.ts +342 -0
- package/src/archive/fsutil.ts +415 -0
- package/src/archive/gzfile.ts +370 -0
- package/src/archive/kinds.ts +21 -0
- package/src/archive/livecheckpoint.ts +217 -0
- package/src/archive/liveretention.ts +180 -0
- package/src/archive/manifest.ts +519 -0
- package/src/archive/overseer.ts +336 -0
- package/src/archive/piglobal.ts +174 -0
- package/src/archive/plan.ts +612 -0
- package/src/archive/prarchive.ts +984 -0
- package/src/archive/prfiles.ts +406 -0
- package/src/archive/report.ts +252 -0
- package/src/archive/restore.ts +330 -0
- package/src/archive/rows.ts +187 -0
- package/src/archive/seal.ts +630 -0
- package/src/archive/status.ts +719 -0
- package/src/archive/storepass.ts +581 -0
- package/src/backfill.ts +362 -0
- package/src/bench/cost.ts +113 -0
- package/src/bench/exec.ts +90 -0
- package/src/bench/values.ts +13 -0
- package/src/botcontrol.ts +176 -0
- package/src/botworker.ts +953 -0
- package/src/capture.ts +321 -0
- package/src/cases.ts +1789 -0
- package/src/channelfs.ts +26 -0
- package/src/checklist.ts +506 -0
- package/src/ciretry.ts +141 -0
- package/src/cli.ts +2271 -0
- package/src/cliops.ts +384 -0
- package/src/clonedir.ts +15 -0
- package/src/commandeffects.ts +57 -0
- package/src/commands.ts +1678 -0
- package/src/companioninbox.ts +239 -0
- package/src/compare.ts +957 -0
- package/src/config.ts +2050 -0
- package/src/configcheck.ts +133 -0
- package/src/coreext.ts +47 -0
- package/src/daemon.ts +1302 -0
- package/src/debuground.ts +927 -0
- package/src/debugroundpi.ts +262 -0
- package/src/diagnostics.ts +14 -0
- package/src/digest.ts +183 -0
- package/src/dispatch.ts +2250 -0
- package/src/engine/answerguard.ts +27 -0
- package/src/engine/botsdk.ts +336 -0
- package/src/engine/caserunner-sdk.ts +423 -0
- package/src/engine/debugpi.ts +235 -0
- package/src/eod.ts +669 -0
- package/src/eodpinwatch.ts +556 -0
- package/src/escalation.ts +1253 -0
- package/src/eventloop.ts +1045 -0
- package/src/execboundary.ts +633 -0
- package/src/feedback.ts +1162 -0
- package/src/findingscheck.ts +298 -0
- package/src/fsdenied.ts +24 -0
- package/src/ghread.ts +242 -0
- package/src/github.ts +1497 -0
- package/src/homes.ts +175 -0
- package/src/hostroute.ts +53 -0
- package/src/improvements.ts +787 -0
- package/src/install.ts +1103 -0
- package/src/installkind.ts +50 -0
- package/src/ipc/capability.ts +333 -0
- package/src/ipc/client.ts +269 -0
- package/src/ipc/control.ts +90 -0
- package/src/ipc/ghreadshim.ts +94 -0
- package/src/ipc/launcher.ts +65 -0
- package/src/ipc/permits.ts +362 -0
- package/src/ipc/postshim.ts +164 -0
- package/src/ipc/protocol.ts +342 -0
- package/src/ipc/server.ts +371 -0
- package/src/ipc/workerspec.ts +218 -0
- package/src/learner/learner.ts +1655 -0
- package/src/learner/miner.ts +1290 -0
- package/src/learner/packet.ts +340 -0
- package/src/learner/receipt.ts +168 -0
- package/src/learner/status.ts +107 -0
- package/src/ledgercheck.ts +157 -0
- package/src/lessonledger.ts +703 -0
- package/src/lessonselect.ts +888 -0
- package/src/lessonshadow.ts +810 -0
- package/src/levers.ts +393 -0
- package/src/live/projection.ts +491 -0
- package/src/live/publish.ts +92 -0
- package/src/live/read.ts +86 -0
- package/src/livecli.ts +336 -0
- package/src/loginhint.ts +56 -0
- package/src/loginrefresh/atomic.ts +76 -0
- package/src/loginrefresh/lock.ts +104 -0
- package/src/loginrefresh/main.ts +59 -0
- package/src/loginrefresh/pirefresh.ts +57 -0
- package/src/loginrefresh/refresher.ts +326 -0
- package/src/loginrefresh/supervisor.ts +273 -0
- package/src/loginrefresh/types.ts +35 -0
- package/src/memory/context.ts +385 -0
- package/src/memory/datafence.ts +9 -0
- package/src/memory/delivery.ts +171 -0
- package/src/memory/eventtags.ts +80 -0
- package/src/memory/health.ts +953 -0
- package/src/memory/import.ts +664 -0
- package/src/memory/layout.ts +261 -0
- package/src/memory/legacy-file.ts +104 -0
- package/src/memory/lessons.ts +447 -0
- package/src/memory/ovsession.ts +601 -0
- package/src/memory/relayout.ts +335 -0
- package/src/memory/roundactivity.ts +209 -0
- package/src/memory/selection.ts +989 -0
- package/src/memory/shadowstatus.ts +125 -0
- package/src/memory/store.ts +275 -0
- package/src/memory/textidentity.ts +8 -0
- package/src/metrics.ts +1056 -0
- package/src/missingconfig.ts +7 -0
- package/src/npmverbs.ts +264 -0
- package/src/onboard/choices.ts +222 -0
- package/src/onboard/engine.ts +518 -0
- package/src/onboard/launch.ts +115 -0
- package/src/onboard/steps/appslug.ts +265 -0
- package/src/onboard/steps/bringup.ts +482 -0
- package/src/onboard/steps/compose.ts +459 -0
- package/src/onboard/steps/configdelivery.ts +58 -0
- package/src/onboard/steps/configfill.ts +1352 -0
- package/src/onboard/steps/deploysh.ts +105 -0
- package/src/onboard/steps/embeddings.ts +550 -0
- package/src/onboard/steps/escalation.ts +640 -0
- package/src/onboard/steps/githubapp.ts +1414 -0
- package/src/onboard/steps/golive.ts +577 -0
- package/src/onboard/steps/index.ts +71 -0
- package/src/onboard/steps/ingress.ts +907 -0
- package/src/onboard/steps/inventory.ts +526 -0
- package/src/onboard/steps/llmauth.ts +1095 -0
- package/src/onboard/steps/memory.ts +1290 -0
- package/src/onboard/steps/memorykeys.ts +85 -0
- package/src/onboard/steps/preflight.ts +191 -0
- package/src/onboard/steps/proof.ts +624 -0
- package/src/onboard/steps/ssh.ts +377 -0
- package/src/onboard/steps/topology.ts +337 -0
- package/src/onboard/steps/transport.ts +665 -0
- package/src/onboard/steps/verifyup.ts +448 -0
- package/src/onboard/steps/vmdeploy.ts +442 -0
- package/src/onboard/toml.ts +50 -0
- package/src/opencli.ts +591 -0
- package/src/openpr.ts +568 -0
- package/src/openviking/client.ts +1131 -0
- package/src/openviking/context.ts +263 -0
- package/src/openviking/embedder.ts +516 -0
- package/src/openviking/gapsink.ts +63 -0
- package/src/openviking/health.ts +83 -0
- package/src/openviking/index.ts +119 -0
- package/src/openviking/lessonfind.ts +92 -0
- package/src/openviking/probe.ts +129 -0
- package/src/openviking/proc.ts +110 -0
- package/src/openviking/provisionreport.ts +160 -0
- package/src/openviking/reembed.ts +412 -0
- package/src/openviking/relayout.ts +177 -0
- package/src/openviking/sidecar-main.ts +38 -0
- package/src/openviking/sidecar.ts +106 -0
- package/src/openviking/store.ts +2025 -0
- package/src/openviking/supervisor.ts +474 -0
- package/src/openviking/types.ts +174 -0
- package/src/operator-recovery.ts +237 -0
- package/src/operatormessage.ts +52 -0
- package/src/outcomes.ts +1670 -0
- package/src/piauthcopy.ts +12 -0
- package/src/picli.ts +49 -0
- package/src/picwd.ts +25 -0
- package/src/pilogin.ts +37 -0
- package/src/pingpong.ts +1339 -0
- package/src/posting-journal.ts +549 -0
- package/src/posting-outbox.ts +802 -0
- package/src/posting-receipt.ts +324 -0
- package/src/posting.ts +603 -0
- package/src/postops.ts +832 -0
- package/src/pr-activity.ts +20 -0
- package/src/pr-author.ts +6 -0
- package/src/pr-conversation.ts +432 -0
- package/src/pr-session-lifecycle.ts +631 -0
- package/src/preflight.ts +391 -0
- package/src/priorresolve.ts +343 -0
- package/src/qcrbin.ts +186 -0
- package/src/recheck.ts +1775 -0
- package/src/reconcile.ts +1030 -0
- package/src/recordedfindings.ts +27 -0
- package/src/regression.ts +833 -0
- package/src/replay.ts +816 -0
- package/src/requiredpasses.ts +148 -0
- package/src/resumecheck.ts +246 -0
- package/src/reviewcli.ts +787 -0
- package/src/reviewcontext.ts +35 -0
- package/src/reviewdetach.ts +734 -0
- package/src/reviewhistory.ts +427 -0
- package/src/reviewhome.ts +36 -0
- package/src/reviewmemory.ts +133 -0
- package/src/reviewrendercli.ts +139 -0
- package/src/round-work.ts +42 -0
- package/src/runhost.ts +108 -0
- package/src/scanauth.ts +36 -0
- package/src/scanbox.ts +1081 -0
- package/src/scancli.ts +1296 -0
- package/src/scandriverlog.ts +32 -0
- package/src/session-bridge.ts +139 -0
- package/src/session-command-payload.ts +35 -0
- package/src/session-command-supervisor.ts +1142 -0
- package/src/sessionjsonl.ts +88 -0
- package/src/sessions.ts +659 -0
- package/src/setup/adapters.ts +335 -0
- package/src/setup/baselines.ts +110 -0
- package/src/setup/caserunner.ts +611 -0
- package/src/setup/configcommit.ts +443 -0
- package/src/setup/engine.ts +1001 -0
- package/src/setup/facts.ts +627 -0
- package/src/setup/findings.ts +1264 -0
- package/src/setup/history.ts +443 -0
- package/src/setup/interview.ts +243 -0
- package/src/setup/ledger.ts +324 -0
- package/src/setup/pins.ts +66 -0
- package/src/setup/portrait.ts +635 -0
- package/src/setup/presentation.ts +18 -0
- package/src/setup/profile.ts +508 -0
- package/src/setup/replay.ts +370 -0
- package/src/setup/replaybuild.ts +392 -0
- package/src/setup/replayrun.ts +1096 -0
- package/src/setup/replaysource.ts +198 -0
- package/src/setup/retune.ts +415 -0
- package/src/setup/retunelog.ts +95 -0
- package/src/setup/scan.ts +1033 -0
- package/src/setup/scanbuild.ts +168 -0
- package/src/setup/scanfacts.ts +107 -0
- package/src/setup/scanlease.ts +297 -0
- package/src/setup/scanreport.ts +373 -0
- package/src/setup/scanrun.ts +2268 -0
- package/src/setup/scantree.ts +259 -0
- package/src/setup/stage2.ts +926 -0
- package/src/setup/stage2request.ts +347 -0
- package/src/setup/survey.ts +458 -0
- package/src/setup/surveyrun.ts +758 -0
- package/src/setup/textsniff.ts +95 -0
- package/src/setup/trackersink.ts +433 -0
- package/src/setup/triage.ts +768 -0
- package/src/setup/tuning.ts +766 -0
- package/src/setup/unitcut.ts +523 -0
- package/src/singleflight.ts +86 -0
- package/src/slack/announce.ts +911 -0
- package/src/slack/api.ts +303 -0
- package/src/slack/messages.ts +288 -0
- package/src/slack/origin.ts +599 -0
- package/src/slack/policy.ts +354 -0
- package/src/slack/reply.ts +201 -0
- package/src/slack/router.ts +285 -0
- package/src/slack/socket.ts +384 -0
- package/src/slack/types.ts +108 -0
- package/src/sqlitehint.ts +32 -0
- package/src/ssh-observation.ts +30 -0
- package/src/state.ts +8243 -0
- package/src/statemachine.ts +369 -0
- package/src/stubs.ts +68 -0
- package/src/takeover.ts +634 -0
- package/src/takeoverpi.ts +293 -0
- package/src/terminal-failure.ts +41 -0
- package/src/thread-resolution-refusal.ts +2 -0
- package/src/tmux.ts +153 -0
- package/src/trackerid.ts +41 -0
- package/src/transcriptindex.ts +665 -0
- package/src/tui/actions.ts +484 -0
- package/src/tui/alerts.ts +666 -0
- package/src/tui/app.ts +1979 -0
- package/src/tui/archiveops.ts +192 -0
- package/src/tui/autofile.ts +233 -0
- package/src/tui/board.ts +1432 -0
- package/src/tui/candidates.ts +889 -0
- package/src/tui/cellwidth.ts +148 -0
- package/src/tui/changelog-store.ts +503 -0
- package/src/tui/chord.ts +25 -0
- package/src/tui/clipboard.ts +92 -0
- package/src/tui/cmdbar.ts +296 -0
- package/src/tui/companion.ts +1427 -0
- package/src/tui/companionplan.ts +247 -0
- package/src/tui/companiontab.ts +83 -0
- package/src/tui/confighome.ts +155 -0
- package/src/tui/connect.ts +68 -0
- package/src/tui/deploy-ceremony.ts +104 -0
- package/src/tui/deploy-drain.ts +129 -0
- package/src/tui/deploy-process.ts +265 -0
- package/src/tui/deploytab.ts +1523 -0
- package/src/tui/design.ts +125 -0
- package/src/tui/digesttab.ts +214 -0
- package/src/tui/emptystate.ts +39 -0
- package/src/tui/evidence.ts +999 -0
- package/src/tui/feed.ts +604 -0
- package/src/tui/feedbacktab.ts +1077 -0
- package/src/tui/filters.ts +90 -0
- package/src/tui/ghread.ts +321 -0
- package/src/tui/historypull.ts +81 -0
- package/src/tui/inboxpull.ts +236 -0
- package/src/tui/index.ts +1565 -0
- package/src/tui/issuesink.ts +238 -0
- package/src/tui/jsonfile.ts +42 -0
- package/src/tui/keys.ts +109 -0
- package/src/tui/layout.ts +108 -0
- package/src/tui/learning.ts +627 -0
- package/src/tui/lessonswitch.ts +118 -0
- package/src/tui/livecontrol.ts +228 -0
- package/src/tui/memforward.ts +443 -0
- package/src/tui/memincident.ts +363 -0
- package/src/tui/memory.ts +620 -0
- package/src/tui/memtab.ts +606 -0
- package/src/tui/metricstab.ts +1177 -0
- package/src/tui/model.ts +131 -0
- package/src/tui/mouse.ts +98 -0
- package/src/tui/msg.ts +268 -0
- package/src/tui/nativecompanion.ts +417 -0
- package/src/tui/openurl.ts +21 -0
- package/src/tui/paint.ts +511 -0
- package/src/tui/panes.ts +98 -0
- package/src/tui/pipane.ts +219 -0
- package/src/tui/poll-hooks.ts +12 -0
- package/src/tui/poll.ts +147 -0
- package/src/tui/proposals.ts +838 -0
- package/src/tui/prpause.ts +150 -0
- package/src/tui/reload.ts +436 -0
- package/src/tui/remote.ts +413 -0
- package/src/tui/rollover.ts +969 -0
- package/src/tui/scantab.ts +1290 -0
- package/src/tui/setupentry.ts +93 -0
- package/src/tui/sidebar.ts +749 -0
- package/src/tui/sshtriage.ts +510 -0
- package/src/tui/startup.ts +231 -0
- package/src/tui/tabs.ts +45 -0
- package/src/tui/termmirror.ts +224 -0
- package/src/tui/theme.ts +95 -0
- package/src/tui/ticketstab.ts +310 -0
- package/src/tui/tmuxsocket.ts +129 -0
- package/src/tui/trackertickets.ts +84 -0
- package/src/tui/unwedge.ts +286 -0
- package/src/tui/viewer.ts +575 -0
- package/src/tui/viewerinput.ts +173 -0
- package/src/updatenotice.ts +178 -0
- package/src/usage.ts +1154 -0
- package/src/verdicts.ts +4689 -0
- package/src/version.ts +80 -0
- package/src/wakes.ts +476 -0
- package/src/webhook.ts +942 -0
- package/src/webhookheal.ts +276 -0
- package/src/wire.ts +2153 -0
- package/src/worker-session-host.ts +602 -0
- package/src/workerbreaker.ts +156 -0
- package/src/workercontrol.ts +104 -0
- package/src/workerlease.ts +441 -0
- package/src/workerliveness.ts +103 -0
- package/src/workerlog.ts +79 -0
- package/src/workerruntime.ts +30 -0
- package/src/workersupervisor.ts +1538 -0
- package/src/workerusage.ts +42 -0
- package/src/workerworld.ts +427 -0
- package/src/worktrees.ts +1138 -0
- package/tests/fixtures/regression-cases.json +795 -0
- package/tests/fixtures/seed-manifest.json +19 -0
|
@@ -0,0 +1,805 @@
|
|
|
1
|
+
// The bot's per-round worker: one Node process that serves ONE round
|
|
2
|
+
// of one PR and exits.
|
|
3
|
+
//
|
|
4
|
+
// node dist/src/botworker.js --command <id> --mode round|answer
|
|
5
|
+
//
|
|
6
|
+
// `--mode answer` (rule 9's second exception) serves an operator's message
|
|
7
|
+
// to an idle PR instead of a round: the same handshake, login and resume under the
|
|
8
|
+
// same session id, then ONE user turn marked with operator provenance, and the
|
|
9
|
+
// reply goes back in the `done` event. Its tools are the read-only repo tools and
|
|
10
|
+
// the memory lookups (src/engine/botsdk.ts `answer`), no lens tool, no verdict,
|
|
11
|
+
// and no wave, wake or permit: the daemon's own wakes stay held for the round.
|
|
12
|
+
// Only a message the operator marked may-post also gets bash, for the post
|
|
13
|
+
// scripts, and the capability they read; the daemon refuses any other post in any
|
|
14
|
+
// case. It compacts before it exits like a round, and the daemon bounds it by
|
|
15
|
+
// `[daemon] answer_timeout_s` and `answer_cap_usd`. The numbered round below is the
|
|
16
|
+
// round mode's; an answer runs 1 to 3, the one turn, then 6 and 7.
|
|
17
|
+
//
|
|
18
|
+
// The daemon starts it with the command's capability on an inherited fd
|
|
19
|
+
// (QCR_IPC_CAP_FD, src/ipc/capability.ts), the socket path, the command id and
|
|
20
|
+
// the generation in env (QCR_IPC_*), and a small allowlisted env of its own. It
|
|
21
|
+
// holds no GitHub credential (rule 3: the bot mints per command, and every post
|
|
22
|
+
// goes to the daemon's one gate over the socket) and it never opens state.db:
|
|
23
|
+
// what it needs to know arrives through `worker.spec`, what it records goes
|
|
24
|
+
// back as events, and the held wakes come through `wakes.take`
|
|
25
|
+
// (src/ipc/workerspec.ts). tests/botworker-fence.test.ts holds the last claim
|
|
26
|
+
// by walking the import closure.
|
|
27
|
+
//
|
|
28
|
+
// A round, in order:
|
|
29
|
+
// 1. connect, ask for the spec, and verify the payload against the sha256 the
|
|
30
|
+
// daemon recorded at dispatch;
|
|
31
|
+
// 2. borrow the login: a refresh-blanked copy read once from the agent dir the
|
|
32
|
+
// login refresher owns, refused when the token would expire inside
|
|
33
|
+
// this worker's wall-clock cap. The worker never refreshes it;
|
|
34
|
+
// 3. open the PR's session: resume the newest JSONL under its session dir
|
|
35
|
+
// under the SAME id (the provider's cache key), or start one at birth;
|
|
36
|
+
// 4. start the planned discovery wave (the engine, rule 9), then send the
|
|
37
|
+
// round order. A JSONL that already holds this command's marker means an
|
|
38
|
+
// earlier worker took the order: this worker continues instead of sending
|
|
39
|
+
// it again (marker idempotency, as the inject bridge's receipt works);
|
|
40
|
+
// 5. deliver the wakes held while the round ran, in arrival order;
|
|
41
|
+
// 6. compact (ledger-pin pins the review ledger through pi's own compact());
|
|
42
|
+
// 7. report usage and done, and exit.
|
|
43
|
+
//
|
|
44
|
+
// Throughout, the daemon may push the operator's controls (src/botcontrol.ts):
|
|
45
|
+
// a steer lands in the turn in flight, a follow-up behind the run, an abort stops the
|
|
46
|
+
// session and the passes it started and ends the round with the aborted exit code.
|
|
47
|
+
// Each is acked once over `control.ack`. The turns a control starts are waited for
|
|
48
|
+
// before the wakes and again before the compaction.
|
|
49
|
+
//
|
|
50
|
+
// Exit codes: 0 the round was served (a verdict may or may not have been
|
|
51
|
+
// written: `done` says), 1 a turn failed (timeout, cap, stream, refused
|
|
52
|
+
// login), 2 bad usage, 3 the handshake or the
|
|
53
|
+
// payload could not be trusted, 4 the login was refused up front, 5 the session
|
|
54
|
+
// could not be opened, 6 the operator aborted the round, 75 the daemon went away, 76 the daemon fenced this
|
|
55
|
+
// worker (a stale generation or an inactive command), 143 terminated.
|
|
56
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
57
|
+
import { homedir } from "node:os";
|
|
58
|
+
import { join } from "node:path";
|
|
59
|
+
import { EventCostMeter } from "./bench/cost.js";
|
|
60
|
+
import { CONTEXT_PACK_FILE } from "@quickchatai/pi-quickreview/src/contextpack.js";
|
|
61
|
+
import { AuthError, classifyAuthFailure, engineCredentials, } from "@quickchatai/pi-quickreview/src/engine/auth.js";
|
|
62
|
+
import { agentDirSettings } from "@quickchatai/pi-quickreview/src/engine/agentdir.js";
|
|
63
|
+
import { COMMIT_VERDICT_RE } from "./engine/answerguard.js";
|
|
64
|
+
import { NO_LENS, botSdkRuntime } from "./engine/botsdk.js";
|
|
65
|
+
import { engineLensTools, } from "@quickchatai/pi-quickreview/src/engine/lens/engine-tools.js";
|
|
66
|
+
import { planLaunch, } from "@quickchatai/pi-quickreview/src/engine/lens/launch-plan.js";
|
|
67
|
+
import { engineLensSection } from "@quickchatai/pi-quickreview/src/engine/lens/section.js";
|
|
68
|
+
import { LensWave, launchWave, } from "@quickchatai/pi-quickreview/src/engine/lens/wave.js";
|
|
69
|
+
import { stopLiveSessions } from "@quickchatai/pi-quickreview/src/engine/livesessions.js";
|
|
70
|
+
import { LENS_LEDGER_FILE, LENS_SESSIONS_DIR, } from "@quickchatai/pi-quickreview/src/engine/openable.js";
|
|
71
|
+
import { PiHost, headerId, } from "@quickchatai/pi-quickreview/src/engine/pisdk.js";
|
|
72
|
+
import { engineLensConfig } from "@quickchatai/pi-quickreview/src/engine/reviewsdk.js";
|
|
73
|
+
import { credentialPaths, loginSourceDirs, } from "@quickchatai/pi-quickreview/src/engine/toolfence.js";
|
|
74
|
+
import { TOOL_UMASK, checkToolUid, toolIdsOf, } from "@quickchatai/pi-quickreview/src/engine/tooluid.js";
|
|
75
|
+
import { connectFromEnv } from "./ipc/client.js";
|
|
76
|
+
import { brokerPermits } from "./ipc/permits.js";
|
|
77
|
+
import { IpcError } from "./ipc/protocol.js";
|
|
78
|
+
import { WAKES_ACK_OP, WAKES_TAKE_OP, WORKER_MODES, WORKER_SPEC_OP, parseWakesTaken, parseWorkerSpec, lensDirOf, roundPassesDir, } from "./ipc/workerspec.js";
|
|
79
|
+
import { WorkerControls, ackSender } from "./botcontrol.js";
|
|
80
|
+
import { MAX_REPLY_CHARS, operatorMayPost } from "./operatormessage.js";
|
|
81
|
+
import { sessionCommandMarker } from "@quickchatai/pi-quickreview/src/session-command.js";
|
|
82
|
+
import { verifiedPayload } from "./session-command-payload.js";
|
|
83
|
+
import { newestSessionFile } from "./sessionjsonl.js";
|
|
84
|
+
export const EXIT = {
|
|
85
|
+
ok: 0,
|
|
86
|
+
failed: 1,
|
|
87
|
+
usage: 2,
|
|
88
|
+
handshake: 3,
|
|
89
|
+
auth: 4,
|
|
90
|
+
session: 5,
|
|
91
|
+
aborted: 6,
|
|
92
|
+
lost: 75,
|
|
93
|
+
fenced: 76,
|
|
94
|
+
terminated: 143,
|
|
95
|
+
};
|
|
96
|
+
/** The most rounds of `wakes.take` one worker serves: wakes that arrive while it
|
|
97
|
+
* delivers are served too, but a flood cannot keep a round open for ever. */
|
|
98
|
+
const MAX_WAKE_PASSES = 20;
|
|
99
|
+
/** How long the round waits for the wave's rows to settle once it has ended
|
|
100
|
+
* them (each ends its session and writes its ledger line). */
|
|
101
|
+
const WAVE_SETTLE_MS = 15_000;
|
|
102
|
+
const DEFAULT_HEARTBEAT_MS = 15_000;
|
|
103
|
+
/** A turn is never given less than this, so a nearly spent cap still runs it. */
|
|
104
|
+
const MIN_TURN_MS = 1_000;
|
|
105
|
+
/** The names of the worker's own env the main session's bash needs for the post
|
|
106
|
+
* shims (src/ipc/postshim.ts). Never given to a lens pass. */
|
|
107
|
+
const IPC_ENV = [
|
|
108
|
+
"QCR_IPC_SOCKET",
|
|
109
|
+
"QCR_IPC_CAP_FD",
|
|
110
|
+
"QCR_IPC_COMMAND_ID",
|
|
111
|
+
"QCR_IPC_GENERATION",
|
|
112
|
+
];
|
|
113
|
+
/** The names of a round's identity in the session env. An answer has no round, so
|
|
114
|
+
* the model's bash (and the post scripts it may run) carries none of them: a post
|
|
115
|
+
* would claim a round and the daemon would refuse it. */
|
|
116
|
+
const ROUND_ONLY_ENV = ["QCR_ROUND_NO", "QCR_EXPECTED_HEAD", "QCR_POSTING_KEY"];
|
|
117
|
+
export function parseWorkerArgs(argv) {
|
|
118
|
+
let command;
|
|
119
|
+
let mode;
|
|
120
|
+
for (let i = 0; i < argv.length; i++) {
|
|
121
|
+
const a = argv[i];
|
|
122
|
+
if (a === "--command")
|
|
123
|
+
command = argv[++i];
|
|
124
|
+
else if (a === "--mode")
|
|
125
|
+
mode = argv[++i];
|
|
126
|
+
else
|
|
127
|
+
return { error: `unknown argument ${JSON.stringify(a)}` };
|
|
128
|
+
}
|
|
129
|
+
if (!command)
|
|
130
|
+
return { error: "--command <id> is required" };
|
|
131
|
+
if (!mode || !WORKER_MODES.includes(mode))
|
|
132
|
+
return { error: "--mode must be round or answer" };
|
|
133
|
+
return { command, mode: mode };
|
|
134
|
+
}
|
|
135
|
+
/** A user turn's closing marker, in the inject bridge's own spelling. */
|
|
136
|
+
function withMarker(text, marker) {
|
|
137
|
+
return `${text}${text.endsWith("\n") ? "\n" : "\n\n"}${marker}`;
|
|
138
|
+
}
|
|
139
|
+
export const wakeMarker = (batchId) => `<!-- qcr-wake:${batchId} -->`;
|
|
140
|
+
/** What a continuing worker tells the session. */
|
|
141
|
+
export function continuationText(marker) {
|
|
142
|
+
return [
|
|
143
|
+
"The worker that was running this round stopped before the round finished; this conversation is intact. Carry on from where it stopped.",
|
|
144
|
+
"",
|
|
145
|
+
"Before you repeat a step, check what the round already produced: files you wrote, lens results you read, a review that was posted. Never post the same review twice (the post scripts tell you when it is already posted). A planned lens whose result you did not read ran in the worker that is gone: run `lens_wave` over the round's task directory again for it.",
|
|
146
|
+
"",
|
|
147
|
+
`The round order is the message above that carries ${marker}.`,
|
|
148
|
+
].join("\n");
|
|
149
|
+
}
|
|
150
|
+
/** What a continuing answer worker tells the session. */
|
|
151
|
+
export function answerContinuationText(marker) {
|
|
152
|
+
return [
|
|
153
|
+
"The worker that was answering the operator's message stopped before it finished; this conversation is intact. Finish the answer.",
|
|
154
|
+
"",
|
|
155
|
+
"Before you repeat a step, check what is already done: a review or reply you posted stays posted (the post scripts tell you when it is). Never post the same thing twice.",
|
|
156
|
+
"",
|
|
157
|
+
`The operator's message is the one above that carries ${marker}.`,
|
|
158
|
+
].join("\n");
|
|
159
|
+
}
|
|
160
|
+
/** Does the session JSONL already hold `marker`? An unreadable file holds none. */
|
|
161
|
+
export function jsonlHasMarker(file, marker) {
|
|
162
|
+
try {
|
|
163
|
+
return readFileSync(file, "utf8").includes(marker);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const POST_RE = /(?:^|[\s/;&|(])(post-review|approve-pr|reply-thread)\.sh(?:\s|$)/;
|
|
170
|
+
/** What the daemon wants to know of the session's work: a verdict committed, a
|
|
171
|
+
* post made, and whether the model's last answer was the provider's failure.
|
|
172
|
+
* Observed off the session's events, the way the supervisor reads a round's
|
|
173
|
+
* progress, never off files. */
|
|
174
|
+
class RoundWatch {
|
|
175
|
+
report;
|
|
176
|
+
verdictWritten = false;
|
|
177
|
+
posted = 0;
|
|
178
|
+
/** The provider's error on the newest assistant message, if that is how it ended. */
|
|
179
|
+
lastError;
|
|
180
|
+
/** The text of the newest assistant message that did not end in a tool call:
|
|
181
|
+
* what the model said last, which is an answer's reply. */
|
|
182
|
+
replyText;
|
|
183
|
+
commands = new Map();
|
|
184
|
+
constructor(report) {
|
|
185
|
+
this.report = report;
|
|
186
|
+
}
|
|
187
|
+
hear(event) {
|
|
188
|
+
if (event["type"] === "message_end") {
|
|
189
|
+
const message = event["message"];
|
|
190
|
+
if (message?.role === "assistant") {
|
|
191
|
+
const full = event["message"];
|
|
192
|
+
if (full.stopReason !== "toolUse" && full.stopReason !== "error")
|
|
193
|
+
this.replyText = textOf(full.content);
|
|
194
|
+
}
|
|
195
|
+
if (message?.role === "assistant")
|
|
196
|
+
this.lastError =
|
|
197
|
+
message.stopReason === "error"
|
|
198
|
+
? (typeof message.errorMessage === "string"
|
|
199
|
+
? message.errorMessage
|
|
200
|
+
: "the provider returned an error").slice(0, 300)
|
|
201
|
+
: undefined;
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const id = event["toolCallId"];
|
|
205
|
+
if (typeof id !== "string")
|
|
206
|
+
return;
|
|
207
|
+
if (event["type"] === "tool_execution_start" && event["toolName"] === "bash") {
|
|
208
|
+
const command = event["args"]?.command;
|
|
209
|
+
if (typeof command === "string")
|
|
210
|
+
this.commands.set(id, command);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (event["type"] !== "tool_execution_end")
|
|
214
|
+
return;
|
|
215
|
+
const command = this.commands.get(id);
|
|
216
|
+
this.commands.delete(id);
|
|
217
|
+
if (command === undefined || event["isError"] !== false)
|
|
218
|
+
return;
|
|
219
|
+
if (COMMIT_VERDICT_RE.test(command)) {
|
|
220
|
+
this.verdictWritten = true;
|
|
221
|
+
this.report("verdict_written", {});
|
|
222
|
+
}
|
|
223
|
+
const post = POST_RE.exec(command);
|
|
224
|
+
if (post) {
|
|
225
|
+
this.posted++;
|
|
226
|
+
this.report("posted", { script: `${post[1]}.sh` });
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/** The text blocks of an assistant message's content, joined. */
|
|
231
|
+
function textOf(content) {
|
|
232
|
+
if (typeof content === "string")
|
|
233
|
+
return content;
|
|
234
|
+
if (!Array.isArray(content))
|
|
235
|
+
return "";
|
|
236
|
+
return content
|
|
237
|
+
.flatMap((b) => typeof b === "object" &&
|
|
238
|
+
b !== null &&
|
|
239
|
+
b.type === "text" &&
|
|
240
|
+
typeof b.text === "string"
|
|
241
|
+
? [b.text]
|
|
242
|
+
: [])
|
|
243
|
+
.join("\n")
|
|
244
|
+
.trim();
|
|
245
|
+
}
|
|
246
|
+
/** `: <the file's last line>` for a failure's reason, or nothing. */
|
|
247
|
+
function lastLineOf(file) {
|
|
248
|
+
try {
|
|
249
|
+
const line = readFileSync(file, "utf8").trimEnd().split("\n").at(-1)?.trim();
|
|
250
|
+
return line ? `: ${line.slice(0, 300)}` : "";
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return "";
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
class Stop extends Error {
|
|
257
|
+
exit;
|
|
258
|
+
reason;
|
|
259
|
+
constructor(exit, reason) {
|
|
260
|
+
super(reason);
|
|
261
|
+
this.exit = exit;
|
|
262
|
+
this.reason = reason;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/** Serve one round. Resolves to the exit code; a failed round is a returned
|
|
266
|
+
* code and a `failed` event, never a throw. */
|
|
267
|
+
export async function runBotWorker(args, deps) {
|
|
268
|
+
const log = deps.log ?? (() => { });
|
|
269
|
+
const now = deps.now ?? Date.now;
|
|
270
|
+
const env = deps.env;
|
|
271
|
+
const answering = args.mode === "answer";
|
|
272
|
+
if (env["QCR_IPC_COMMAND_ID"] !== args.command) {
|
|
273
|
+
log("botworker: --command is not the command id the daemon put in env");
|
|
274
|
+
return EXIT.usage;
|
|
275
|
+
}
|
|
276
|
+
let client;
|
|
277
|
+
try {
|
|
278
|
+
client = await (deps.connect ?? (() => connectFromEnv("worker", env)))();
|
|
279
|
+
}
|
|
280
|
+
catch (e) {
|
|
281
|
+
log(`botworker: could not reach the daemon: ${errText(e)}`);
|
|
282
|
+
return EXIT.lost;
|
|
283
|
+
}
|
|
284
|
+
let broken = false;
|
|
285
|
+
const report = (kind, body) => {
|
|
286
|
+
if (broken)
|
|
287
|
+
return;
|
|
288
|
+
try {
|
|
289
|
+
client.event(kind, body);
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
broken = true;
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
// A daemon that restarts takes the socket with it: there is nobody left
|
|
296
|
+
// to post for this worker, so it stops spending. The same for a daemon that
|
|
297
|
+
// fences it (a newer generation, a command that is no longer active).
|
|
298
|
+
let stopCode;
|
|
299
|
+
let stopReason = "stopped";
|
|
300
|
+
let stopped = Promise.resolve();
|
|
301
|
+
let session;
|
|
302
|
+
const stopNow = (code, why) => {
|
|
303
|
+
if (stopCode !== undefined)
|
|
304
|
+
return stopped;
|
|
305
|
+
stopCode = code;
|
|
306
|
+
stopReason = why;
|
|
307
|
+
log(`botworker: stopping (${why})`);
|
|
308
|
+
stopped = (session?.abort() ?? Promise.resolve())
|
|
309
|
+
.catch(() => { })
|
|
310
|
+
.then(() => stopLiveSessions(5_000))
|
|
311
|
+
.catch(() => { });
|
|
312
|
+
return stopped;
|
|
313
|
+
};
|
|
314
|
+
const checkpoint = () => {
|
|
315
|
+
if (stopCode !== undefined)
|
|
316
|
+
throw new Stop(stopCode, stopReason);
|
|
317
|
+
};
|
|
318
|
+
client.onClose((e) => void stopNow(EXIT.lost, `the daemon connection ended: ${e.message}`));
|
|
319
|
+
client.onError((e) => {
|
|
320
|
+
if (e.code === "stale_generation" || e.code === "command_inactive" || e.code === "unauthorized")
|
|
321
|
+
void stopNow(EXIT.fenced, `the daemon fenced this worker: ${e.code}`);
|
|
322
|
+
});
|
|
323
|
+
// The operator's controls. They are taken from the moment the daemon
|
|
324
|
+
// connects: one that arrives before the session is open is refused, not lost.
|
|
325
|
+
let turnLimits = () => ({});
|
|
326
|
+
const controls = new WorkerControls({
|
|
327
|
+
session: () => session,
|
|
328
|
+
limits: () => turnLimits(),
|
|
329
|
+
abort: () => stopNow(EXIT.aborted, "the round was aborted by the operator"),
|
|
330
|
+
ack: ackSender((op, body) => client.request(op, body)),
|
|
331
|
+
log,
|
|
332
|
+
});
|
|
333
|
+
client.onControl((kind, body) => controls.receive(kind, body));
|
|
334
|
+
let host;
|
|
335
|
+
let beat;
|
|
336
|
+
let endWave = async () => { };
|
|
337
|
+
const started = now();
|
|
338
|
+
try {
|
|
339
|
+
const spec = await handshake(client, args);
|
|
340
|
+
const deadline = started + spec.wall_clock_ms;
|
|
341
|
+
const remaining = () => Math.max(MIN_TURN_MS, deadline - now());
|
|
342
|
+
// The payload is what the daemon dispatched, byte for byte, or nothing runs.
|
|
343
|
+
const verified = verifiedPayload({ payload_path: spec.payload_path, payload_sha256: spec.payload_sha256 }, "the command's payload");
|
|
344
|
+
if (!verified.ok)
|
|
345
|
+
throw new Stop(EXIT.handshake, verified.why);
|
|
346
|
+
// An answer posts only when the operator marked the message: the daemon's word
|
|
347
|
+
// (the spec) and the sealed payload both have to say so.
|
|
348
|
+
const mayPost = answering && spec.may_post === true && operatorMayPost(verified.payload.toString("utf8"));
|
|
349
|
+
// The login: borrowed, blanked, and checked against this worker's own cap.
|
|
350
|
+
let auth;
|
|
351
|
+
try {
|
|
352
|
+
auth = engineCredentials({ srcDir: spec.agent_dir, needMs: spec.wall_clock_ms, now });
|
|
353
|
+
}
|
|
354
|
+
catch (e) {
|
|
355
|
+
if (e instanceof AuthError)
|
|
356
|
+
throw new Stop(EXIT.auth, e.message);
|
|
357
|
+
throw e;
|
|
358
|
+
}
|
|
359
|
+
checkpoint();
|
|
360
|
+
// The host, the lens tools and the session. The model's tools run as the
|
|
361
|
+
// tool uid wherever the image asks for it.
|
|
362
|
+
const wave = new LensWave();
|
|
363
|
+
let lensUsd = 0;
|
|
364
|
+
let lensRuns = 0;
|
|
365
|
+
const marker = sessionCommandMarker(spec.command_id, spec.payload_sha256);
|
|
366
|
+
let opened;
|
|
367
|
+
try {
|
|
368
|
+
checkToolUid(env, { what: "the bot worker", instead: "", isolated: true });
|
|
369
|
+
const ids = toolIdsOf(env);
|
|
370
|
+
host = await (deps.makeHost ?? PiHost.create)({
|
|
371
|
+
agentDir: spec.agent_dir,
|
|
372
|
+
ownsProcess: true,
|
|
373
|
+
homeDir: homedir(),
|
|
374
|
+
...(ids !== null && !("refused" in ids) ? { toolUid: ids } : {}),
|
|
375
|
+
fenceDirs: [...loginSourceDirs(env), ...credentialPaths(env, spec.env)],
|
|
376
|
+
credentials: auth.credentials,
|
|
377
|
+
settings: agentDirSettings(spec.agent_dir),
|
|
378
|
+
});
|
|
379
|
+
// The lens cap is the daemon's, over every worker: a pass asks the broker.
|
|
380
|
+
const permits = brokerPermits(client, (m) => log(`botworker: ${m}`));
|
|
381
|
+
opened = await openSession(host, spec, env, wave, marker, deps, log, permits, (run) => {
|
|
382
|
+
lensUsd += run.result.usage.cost;
|
|
383
|
+
lensRuns++;
|
|
384
|
+
}, answering ? { mayPost } : undefined);
|
|
385
|
+
}
|
|
386
|
+
catch (e) {
|
|
387
|
+
throw new Stop(EXIT.session, `could not open the session: ${errText(e)}`);
|
|
388
|
+
}
|
|
389
|
+
const { tools, resumed, continuing } = opened;
|
|
390
|
+
const live = opened.session;
|
|
391
|
+
session = live;
|
|
392
|
+
checkpoint();
|
|
393
|
+
const watch = new RoundWatch(report);
|
|
394
|
+
let accepted = false;
|
|
395
|
+
live.subscribe((event) => {
|
|
396
|
+
if (!accepted && event["type"] === "agent_start") {
|
|
397
|
+
accepted = true;
|
|
398
|
+
report("accepted", { command_id: spec.command_id, continued: continuing });
|
|
399
|
+
}
|
|
400
|
+
watch.hear(event);
|
|
401
|
+
});
|
|
402
|
+
report("ready", {
|
|
403
|
+
session_id: live.id,
|
|
404
|
+
session_file: opened.file ?? null,
|
|
405
|
+
resumed,
|
|
406
|
+
continued: continuing,
|
|
407
|
+
});
|
|
408
|
+
beat = setInterval(() => report("progress", {
|
|
409
|
+
stage: "heartbeat",
|
|
410
|
+
turns: live.stats().turns,
|
|
411
|
+
busy: live.stats().busy,
|
|
412
|
+
}), spec.heartbeat_ms ?? DEFAULT_HEARTBEAT_MS);
|
|
413
|
+
beat.unref();
|
|
414
|
+
turnLimits = () => ({
|
|
415
|
+
timeoutMs: remaining(),
|
|
416
|
+
...(spec.cap_usd !== undefined
|
|
417
|
+
? { capUsd: Math.max(0, spec.cap_usd - live.stats().spentUsd) }
|
|
418
|
+
: {}),
|
|
419
|
+
});
|
|
420
|
+
// What the round has cost, priced the way the transcript is (src/bench/cost.ts):
|
|
421
|
+
// the session's assistant messages and the passes its lens tools reported, each
|
|
422
|
+
// run once, and, at the end, the lens ledger's warm-ups. The daemon's est_usd
|
|
423
|
+
// takes it in place of measuring the transcript.
|
|
424
|
+
const meter = new EventCostMeter();
|
|
425
|
+
live.subscribe((event) => {
|
|
426
|
+
const type = event["type"];
|
|
427
|
+
if (type === "message_end" ||
|
|
428
|
+
type === "tool_execution_update" ||
|
|
429
|
+
type === "tool_execution_end")
|
|
430
|
+
meter.add(JSON.stringify(event));
|
|
431
|
+
}, { updates: true });
|
|
432
|
+
const usage = () => report("usage", {
|
|
433
|
+
total_usd: meter.totalUsd,
|
|
434
|
+
lens_usd: lensUsd,
|
|
435
|
+
lens_runs: lensRuns,
|
|
436
|
+
turns: live.stats().turns,
|
|
437
|
+
});
|
|
438
|
+
const settle = (r, what) => {
|
|
439
|
+
usage();
|
|
440
|
+
checkpoint();
|
|
441
|
+
if (r.timedOut)
|
|
442
|
+
throw new Stop(EXIT.failed, `${what}: the wall-clock cap ran out`);
|
|
443
|
+
if (r.capped)
|
|
444
|
+
throw new Stop(EXIT.failed, `${what}: the dollar cap was reached`);
|
|
445
|
+
if (r.streamError)
|
|
446
|
+
throw new Stop(EXIT.failed, `${what}: output stream failed: ${r.streamError.slice(0, 300)}`);
|
|
447
|
+
// A provider failure ends the turn as an assistant message, not as a throw.
|
|
448
|
+
if (watch.lastError !== undefined) {
|
|
449
|
+
const refused = classifyAuthFailure(watch.lastError);
|
|
450
|
+
throw new Stop(EXIT.failed, refused
|
|
451
|
+
? `${what}: the provider refused the login: ${refused.message}`
|
|
452
|
+
: `${what}: the provider failed the turn: ${watch.lastError}`);
|
|
453
|
+
}
|
|
454
|
+
if (r.code !== 0)
|
|
455
|
+
throw new Stop(EXIT.failed, `${what}: the turn failed${lastLineOf(spec.stderr_file)}`);
|
|
456
|
+
};
|
|
457
|
+
const deliver = async (text, what) => {
|
|
458
|
+
const d = await live.followUp(text, turnLimits());
|
|
459
|
+
if (d.status === "queued") {
|
|
460
|
+
// An operator's turn is in flight, and this message runs behind it: its
|
|
461
|
+
// result is the session's last once nothing is queued.
|
|
462
|
+
await controls.drain();
|
|
463
|
+
const last = live.stats().last;
|
|
464
|
+
if (last === null)
|
|
465
|
+
throw new Stop(EXIT.failed, `${what}: the message was not run (queued)`);
|
|
466
|
+
settle(last, what);
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
if (d.status !== "handled")
|
|
470
|
+
throw new Stop(EXIT.failed, `${what}: the message was not run (${d.status})`);
|
|
471
|
+
settle(d.result, what);
|
|
472
|
+
};
|
|
473
|
+
// The turns an operator's control started: settled before the round goes on.
|
|
474
|
+
let controlsChecked = 0;
|
|
475
|
+
const settleControls = async (close) => {
|
|
476
|
+
await (close ? controls.drainAndClose() : controls.drain());
|
|
477
|
+
checkpoint();
|
|
478
|
+
const taken = controls.counts.steer + controls.counts.follow_up;
|
|
479
|
+
const last = live.stats().last;
|
|
480
|
+
if (last !== null && taken > controlsChecked)
|
|
481
|
+
settle(last, "the operator's message");
|
|
482
|
+
controlsChecked = taken;
|
|
483
|
+
};
|
|
484
|
+
// The round's turn. The engine starts the planned wave first, so the lenses
|
|
485
|
+
// are in flight while the session reads. A continuation does not: the rows ran
|
|
486
|
+
// in the worker that is gone, and the session is told so. An answer is one
|
|
487
|
+
// turn: the operator's message, no wave and no wakes (the daemon's own wakes
|
|
488
|
+
// stay held for the round).
|
|
489
|
+
let wakesDelivered = 0;
|
|
490
|
+
if (answering) {
|
|
491
|
+
const message = verified.payload.toString("utf8");
|
|
492
|
+
if (continuing) {
|
|
493
|
+
report("progress", { stage: "continuing" });
|
|
494
|
+
await deliver(answerContinuationText(marker), "the continuation");
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
report("progress", { stage: "message_sent" });
|
|
498
|
+
settle(await live.prompt(withMarker(message, marker), turnLimits()), "the answer");
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
else {
|
|
502
|
+
if (continuing) {
|
|
503
|
+
report("progress", { stage: "continuing" });
|
|
504
|
+
await deliver(continuationText(marker), "the continuation");
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
const planned = plannedWave(spec, env);
|
|
508
|
+
if (planned.note)
|
|
509
|
+
log(`botworker: ${planned.note}`);
|
|
510
|
+
const section = engineLensSection(planned.dir, spec.planned_wave && planned.units.length
|
|
511
|
+
? { dir: planned.dir, agents: planned.units.map((u) => u.agent) }
|
|
512
|
+
: null);
|
|
513
|
+
if (spec.planned_wave && planned.units.length) {
|
|
514
|
+
const stop = new AbortController();
|
|
515
|
+
if (tools === undefined)
|
|
516
|
+
throw new Stop(EXIT.session, "a round opens with its lens tools");
|
|
517
|
+
const rows = launchWave(wave, tools.runner, planned.units, stop.signal);
|
|
518
|
+
report("progress", { stage: "wave_started", rows: rows.length });
|
|
519
|
+
endWave = async () => {
|
|
520
|
+
stop.abort();
|
|
521
|
+
let timer;
|
|
522
|
+
await Promise.race([
|
|
523
|
+
Promise.allSettled(rows.map((row) => row.done)),
|
|
524
|
+
new Promise((resolve) => (timer = setTimeout(resolve, WAVE_SETTLE_MS))),
|
|
525
|
+
]);
|
|
526
|
+
clearTimeout(timer);
|
|
527
|
+
endWave = async () => { };
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
const order = verified.payload.toString("utf8");
|
|
531
|
+
report("progress", { stage: "round_order_sent" });
|
|
532
|
+
settle(await live.prompt(withMarker(`${order.trimEnd()}\n\n${section}`, marker), turnLimits()), "the round");
|
|
533
|
+
}
|
|
534
|
+
// Whatever the operator steered or followed up with runs to its end first.
|
|
535
|
+
await settleControls(false);
|
|
536
|
+
// The turns are over: a wave row nobody joined is not wanted any more.
|
|
537
|
+
await endWave();
|
|
538
|
+
// The wakes held while the round ran, in arrival order.
|
|
539
|
+
for (let pass = 0; pass < MAX_WAKE_PASSES; pass++) {
|
|
540
|
+
let batches;
|
|
541
|
+
try {
|
|
542
|
+
batches = parseWakesTaken(await client.request(WAKES_TAKE_OP, {})).batches;
|
|
543
|
+
}
|
|
544
|
+
catch (e) {
|
|
545
|
+
if (e instanceof IpcError && e.code === "unknown_op")
|
|
546
|
+
break;
|
|
547
|
+
throw e;
|
|
548
|
+
}
|
|
549
|
+
if (batches.length === 0)
|
|
550
|
+
break;
|
|
551
|
+
for (const batch of batches) {
|
|
552
|
+
const mark = wakeMarker(batch.id);
|
|
553
|
+
const file = live.sessionFile;
|
|
554
|
+
// A batch an earlier worker delivered and died before acking is acked, not sent again.
|
|
555
|
+
if (!(file !== null && jsonlHasMarker(file, mark)))
|
|
556
|
+
await deliver(withMarker(batch.message, mark), `wake ${batch.id}`);
|
|
557
|
+
await client.request(WAKES_ACK_OP, { id: batch.id });
|
|
558
|
+
wakesDelivered++;
|
|
559
|
+
}
|
|
560
|
+
report("progress", { stage: "wakes_delivered", delivered: wakesDelivered });
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
// Nothing is steered into a round that is closing; an abort still is.
|
|
564
|
+
await settleControls(true);
|
|
565
|
+
// Compaction through ledger-pin: pi's own compact() fires the session's
|
|
566
|
+
// session_before_compact. An optimisation, so a failure is reported and not fatal.
|
|
567
|
+
let compacted = "skipped";
|
|
568
|
+
if (spec.compact !== false && live.compact) {
|
|
569
|
+
report("progress", { stage: "compacting" });
|
|
570
|
+
const outcome = await live.compact();
|
|
571
|
+
compacted = outcome.status;
|
|
572
|
+
report("compacted", outcome);
|
|
573
|
+
}
|
|
574
|
+
checkpoint();
|
|
575
|
+
if (!answering)
|
|
576
|
+
foldLensLedger(meter, lensLedgerOf(spec));
|
|
577
|
+
usage();
|
|
578
|
+
report("done", {
|
|
579
|
+
mode: args.mode,
|
|
580
|
+
...(answering
|
|
581
|
+
? {
|
|
582
|
+
// What the model said last, for the operator: the daemon writes it to the
|
|
583
|
+
// command's result file.
|
|
584
|
+
reply: (watch.replyText ?? "").slice(0, MAX_REPLY_CHARS),
|
|
585
|
+
may_post: mayPost,
|
|
586
|
+
}
|
|
587
|
+
: {}),
|
|
588
|
+
session_id: live.id,
|
|
589
|
+
resumed,
|
|
590
|
+
continued: continuing,
|
|
591
|
+
verdict_written: watch.verdictWritten,
|
|
592
|
+
posted: watch.posted,
|
|
593
|
+
wakes_delivered: wakesDelivered,
|
|
594
|
+
controls: { ...controls.counts },
|
|
595
|
+
compacted,
|
|
596
|
+
turns: live.stats().turns,
|
|
597
|
+
total_usd: meter.totalUsd,
|
|
598
|
+
lens_usd: lensUsd,
|
|
599
|
+
elapsed_ms: now() - started,
|
|
600
|
+
});
|
|
601
|
+
return EXIT.ok;
|
|
602
|
+
}
|
|
603
|
+
catch (e) {
|
|
604
|
+
// A dropped connection fails whatever request was in flight; the cause is the
|
|
605
|
+
// stop code, not the request's error (the supervisor reads lost/fenced from it).
|
|
606
|
+
const stop = e instanceof Stop
|
|
607
|
+
? e
|
|
608
|
+
: stopCode !== undefined
|
|
609
|
+
? new Stop(stopCode, stopReason)
|
|
610
|
+
: new Stop(EXIT.failed, errText(e));
|
|
611
|
+
log(`botworker: ${stop.reason}`);
|
|
612
|
+
report("failed", { code: stop.exit, reason: stop.reason });
|
|
613
|
+
return stop.exit;
|
|
614
|
+
}
|
|
615
|
+
finally {
|
|
616
|
+
if (beat !== undefined)
|
|
617
|
+
clearInterval(beat);
|
|
618
|
+
await endWave().catch(() => { });
|
|
619
|
+
await session?.dispose().catch(() => { });
|
|
620
|
+
host?.dispose();
|
|
621
|
+
await controls.flush().catch(() => { });
|
|
622
|
+
await client.drain().catch(() => { });
|
|
623
|
+
client.close();
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
const errText = (e) => (e instanceof Error ? e.message : String(e)).slice(0, 500);
|
|
627
|
+
/** The hello is the daemon's; the spec is its answer to who this command is. */
|
|
628
|
+
async function handshake(client, args) {
|
|
629
|
+
let spec;
|
|
630
|
+
try {
|
|
631
|
+
spec = parseWorkerSpec(await client.request(WORKER_SPEC_OP, {}));
|
|
632
|
+
}
|
|
633
|
+
catch (e) {
|
|
634
|
+
throw new Stop(EXIT.handshake, `no usable spec from the daemon: ${errText(e)}`);
|
|
635
|
+
}
|
|
636
|
+
if (spec.command_id !== args.command || spec.mode !== args.mode)
|
|
637
|
+
throw new Stop(EXIT.handshake, "the spec is for another command or mode");
|
|
638
|
+
if (spec.pr !== client.pr)
|
|
639
|
+
throw new Stop(EXIT.handshake, "the spec is for another PR");
|
|
640
|
+
if (Object.keys(spec.env).some((k) => k.startsWith("QCR_IPC_")))
|
|
641
|
+
throw new Stop(EXIT.handshake, "the spec's env names the IPC variables, which are the worker's");
|
|
642
|
+
return spec;
|
|
643
|
+
}
|
|
644
|
+
/** The planned discovery wave's task files: the round's own pass dir. */
|
|
645
|
+
function plannedWave(spec, env) {
|
|
646
|
+
const passes = roundPassesDir(spec, spec.round_no ?? 0);
|
|
647
|
+
const dir = join(passes, "tasks");
|
|
648
|
+
if (!existsSync(dir))
|
|
649
|
+
return { dir, units: [] };
|
|
650
|
+
const plan = planLaunch({ dirs: [passes] }, { QCR_SANDBOX_ROOT: spec.root, QCR_PR: String(spec.pr), PATH: env["PATH"] });
|
|
651
|
+
return plan.ok
|
|
652
|
+
? { dir, units: plan.units }
|
|
653
|
+
: { dir, units: [], note: `engine wave not planned: ${plan.error}`.slice(0, 300) };
|
|
654
|
+
}
|
|
655
|
+
/** The main session's spec: the daemon's env, plus the IPC names the post shims
|
|
656
|
+
* read from the model's bash. A lens pass never gets those. */
|
|
657
|
+
function sessionSpecOf(spec, env, answer) {
|
|
658
|
+
const ipc = {};
|
|
659
|
+
// An answer that may not post is given no way to reach the daemon at all.
|
|
660
|
+
if (!answer || answer.mayPost)
|
|
661
|
+
for (const name of IPC_ENV) {
|
|
662
|
+
const value = env[name];
|
|
663
|
+
if (value !== undefined)
|
|
664
|
+
ipc[name] = value;
|
|
665
|
+
}
|
|
666
|
+
const own = { ...spec.env };
|
|
667
|
+
if (answer)
|
|
668
|
+
for (const name of ROUND_ONLY_ENV)
|
|
669
|
+
delete own[name];
|
|
670
|
+
return {
|
|
671
|
+
cwd: spec.cwd,
|
|
672
|
+
env: { ...own, ...ipc },
|
|
673
|
+
model: spec.model,
|
|
674
|
+
systemPromptFile: spec.system_prompt_file,
|
|
675
|
+
name: spec.session,
|
|
676
|
+
eventsFile: spec.events_file,
|
|
677
|
+
stderrFile: spec.stderr_file,
|
|
678
|
+
limits: {
|
|
679
|
+
timeoutMs: spec.wall_clock_ms,
|
|
680
|
+
...(spec.cap_usd !== undefined ? { capUsd: spec.cap_usd } : {}),
|
|
681
|
+
},
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
const lensLedgerOf = (spec) => join(lensDirOf(spec), LENS_LEDGER_FILE);
|
|
685
|
+
/** The ledger's lines priced into `meter`: a run a tool result already reported
|
|
686
|
+
* adds nothing, a cache warm-up (which only the ledger records) is added. */
|
|
687
|
+
function foldLensLedger(meter, file) {
|
|
688
|
+
try {
|
|
689
|
+
for (const line of readFileSync(file, "utf8").split("\n"))
|
|
690
|
+
meter.add(line);
|
|
691
|
+
}
|
|
692
|
+
catch {
|
|
693
|
+
// no ledger: the round ran no pass
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
/** Open the PR's session: the engine's lens tools over this round's own ledger
|
|
697
|
+
* and JSONLs, the bot runtime over them, and then resume the newest JSONL
|
|
698
|
+
* under the PR's session dir (same id) or, with none, a session born there. */
|
|
699
|
+
async function openSession(host, spec, env, wave, marker, deps, log, permitPort, tap, answer) {
|
|
700
|
+
if (answer)
|
|
701
|
+
return openAnswerSession(host, spec, env, marker, deps, log, answer);
|
|
702
|
+
const round = spec.round_no ?? 0;
|
|
703
|
+
const lensDir = lensDirOf(spec);
|
|
704
|
+
const lensSpec = {
|
|
705
|
+
...sessionSpecOf(spec, {}),
|
|
706
|
+
env: { ...spec.env, PI_CODING_AGENT_DIR: spec.agent_dir },
|
|
707
|
+
};
|
|
708
|
+
const base = {
|
|
709
|
+
...engineLensConfig(host, lensSpec),
|
|
710
|
+
warn: (m) => console.error(`[lens] ${m}`),
|
|
711
|
+
};
|
|
712
|
+
// The round's context pack sits beside its task files, not beside the ledger.
|
|
713
|
+
const packFile = join(roundPassesDir(spec, round), CONTEXT_PACK_FILE);
|
|
714
|
+
const pack = existsSync(packFile) ? readFileSync(packFile, "utf8") : "";
|
|
715
|
+
const tools = engineLensTools({
|
|
716
|
+
...base,
|
|
717
|
+
permitPort,
|
|
718
|
+
ledgerPath: lensLedgerOf(spec),
|
|
719
|
+
sessionsDir: join(lensDir, LENS_SESSIONS_DIR),
|
|
720
|
+
...(base.cache && pack ? { cache: { ...base.cache, pack } } : {}),
|
|
721
|
+
}, wave, tap);
|
|
722
|
+
const runtime = botSdkRuntime(host, {
|
|
723
|
+
lens: tools,
|
|
724
|
+
processEnv: env,
|
|
725
|
+
...(spec.round_no !== null
|
|
726
|
+
? { live: { root: spec.root, key: spec.session, round: spec.round_no } }
|
|
727
|
+
: {}),
|
|
728
|
+
warn: (m) => log(`botworker: ${m}`),
|
|
729
|
+
...(deps.openViking ? { openViking: deps.openViking } : {}),
|
|
730
|
+
});
|
|
731
|
+
const sessionSpec = sessionSpecOf(spec, env);
|
|
732
|
+
const file = newestSessionFile(spec.session_dir);
|
|
733
|
+
if (file === undefined) {
|
|
734
|
+
const born = await runtime.create({ ...sessionSpec, sessionDir: spec.session_dir });
|
|
735
|
+
return { session: born, tools, resumed: false, file: undefined, continuing: false };
|
|
736
|
+
}
|
|
737
|
+
const id = headerId(file);
|
|
738
|
+
const resumed = await runtime.resume(file, sessionSpec);
|
|
739
|
+
if (id !== null && resumed.id !== id) {
|
|
740
|
+
await resumed.dispose();
|
|
741
|
+
throw new Error(`the resumed session id ${resumed.id} is not the JSONL's ${id}`);
|
|
742
|
+
}
|
|
743
|
+
return { session: resumed, tools, resumed: true, file, continuing: jsonlHasMarker(file, marker) };
|
|
744
|
+
}
|
|
745
|
+
/** An answer worker's session: the PR's newest JSONL resumed under its own id (an
|
|
746
|
+
* answer never births one), with the read-only tool set and no lens tool. */
|
|
747
|
+
async function openAnswerSession(host, spec, env, marker, deps, log, answer) {
|
|
748
|
+
const file = newestSessionFile(spec.session_dir);
|
|
749
|
+
if (file === undefined)
|
|
750
|
+
throw new Error(`#${spec.pr} has no session to resume: an answer never births one`);
|
|
751
|
+
const liveRound = spec.round_no ?? spec.live_round;
|
|
752
|
+
const runtime = botSdkRuntime(host, {
|
|
753
|
+
lens: NO_LENS,
|
|
754
|
+
answer,
|
|
755
|
+
processEnv: env,
|
|
756
|
+
...(liveRound !== undefined
|
|
757
|
+
? { live: { root: spec.root, key: spec.session, round: liveRound } }
|
|
758
|
+
: {}),
|
|
759
|
+
warn: (m) => log(`botworker: ${m}`),
|
|
760
|
+
...(deps.openViking ? { openViking: deps.openViking } : {}),
|
|
761
|
+
});
|
|
762
|
+
const id = headerId(file);
|
|
763
|
+
const resumed = await runtime.resume(file, sessionSpecOf(spec, env, answer));
|
|
764
|
+
if (id !== null && resumed.id !== id) {
|
|
765
|
+
await resumed.dispose();
|
|
766
|
+
throw new Error(`the resumed session id ${resumed.id} is not the JSONL's ${id}`);
|
|
767
|
+
}
|
|
768
|
+
return {
|
|
769
|
+
session: resumed,
|
|
770
|
+
tools: undefined,
|
|
771
|
+
resumed: true,
|
|
772
|
+
file,
|
|
773
|
+
continuing: jsonlHasMarker(file, marker),
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
async function main() {
|
|
777
|
+
const parsed = parseWorkerArgs(process.argv.slice(2));
|
|
778
|
+
if ("error" in parsed) {
|
|
779
|
+
process.stderr.write(`botworker: ${parsed.error}\n`);
|
|
780
|
+
process.exit(EXIT.usage);
|
|
781
|
+
}
|
|
782
|
+
// Under the tool uid the run uid and the tool uid share one
|
|
783
|
+
// gid: what this worker's file tools write (a verdict staged, a review body)
|
|
784
|
+
// the model's bash may rewrite (commit-verdict.sh, render-review.sh), and the
|
|
785
|
+
// reverse, so both write group-writable files. The daemon keeps its own umask:
|
|
786
|
+
// the files it writes for a session to read (the recall hints) stay its own.
|
|
787
|
+
const ids = toolIdsOf(process.env);
|
|
788
|
+
if (ids !== null && !("refused" in ids))
|
|
789
|
+
process.umask(TOOL_UMASK);
|
|
790
|
+
// The supervisor's TERM is the hard stop (the process exit); this stops the
|
|
791
|
+
// sessions first so a turn in flight is aborted and its JSONL closed.
|
|
792
|
+
for (const sig of ["SIGTERM", "SIGINT"])
|
|
793
|
+
process.on(sig, () => {
|
|
794
|
+
void stopLiveSessions(3_000).finally(() => process.exit(EXIT.terminated));
|
|
795
|
+
});
|
|
796
|
+
const code = await runBotWorker(parsed, {
|
|
797
|
+
env: process.env,
|
|
798
|
+
log: (line) => process.stderr.write(`${line}\n`),
|
|
799
|
+
});
|
|
800
|
+
process.exit(code);
|
|
801
|
+
}
|
|
802
|
+
// Run only as the entry point, not when a test imports runBotWorker.
|
|
803
|
+
if (process.argv[1]?.endsWith("botworker.js"))
|
|
804
|
+
void main();
|
|
805
|
+
//# sourceMappingURL=botworker.js.map
|