@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,929 @@
|
|
|
1
|
+
// quickreviewd — the daemon entrypoint. Wires config → store → gate → adapter →
|
|
2
|
+
// webhook server + reconcile poll + dispatch pump + verdict watcher + deadline
|
|
3
|
+
// checker + status.json writer.
|
|
4
|
+
//
|
|
5
|
+
// Everything that touches GitHub goes through the MutationGate, which in
|
|
6
|
+
// dry-run records the intended call to state/dryrun/ instead of executing it.
|
|
7
|
+
// The session manager is behind SessionHooks: `createDaemon({ hooks })` swaps
|
|
8
|
+
// the real implementation in for the disk-logging stub without touching this
|
|
9
|
+
// file.
|
|
10
|
+
import { readFileSync } from "node:fs";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { AnomalyWakePolicy } from "./anomalies.js";
|
|
13
|
+
import { CompanionInbox } from "./companioninbox.js";
|
|
14
|
+
import { retryWithheldApproval } from "./ciretry.js";
|
|
15
|
+
import { resolveRoundStageBounds, DEFAULT_POSTING_RETRY_OFFSETS_MIN, DEFAULT_POSTING_RETRY_WINDOW_MIN, loadConfig, sandboxRoot, } from "./config.js";
|
|
16
|
+
import { dispatchOnce } from "./dispatch.js";
|
|
17
|
+
import { DaemonLoadMonitor, EVENT_LOOP_WAKE_KIND, eventLoopPolicy, } from "./eventloop.js";
|
|
18
|
+
import { MutationGate } from "@quickchatai/pi-quickreview/src/gate.js";
|
|
19
|
+
import { GitHubAdapter } from "./github.js";
|
|
20
|
+
import { appActorAlias, TokenMinter } from "@quickchatai/pi-quickreview/src/githubAuth.js";
|
|
21
|
+
import { REVIEW_SET_ASIDE_STALE_WINDOW_MS } from "./feedback.js";
|
|
22
|
+
import { enforceLedgerFreshness } from "./ledgercheck.js";
|
|
23
|
+
import { readLedgerCarry } from "@quickchatai/pi-quickreview/src/ledgercarry.js";
|
|
24
|
+
import { sweepExpiredLevers } from "./levers.js";
|
|
25
|
+
import { PingPongLedger, ThreadDecisionWatcher, buildWakeMessage, } from "./pingpong.js";
|
|
26
|
+
import { OutcomeCapture } from "./outcomes.js";
|
|
27
|
+
import { reconcileOnce } from "./reconcile.js";
|
|
28
|
+
import { RecheckWatcher, runBaseAdvance, runRecheck, recheckFingerprint, } from "./recheck.js";
|
|
29
|
+
import { applyEvent } from "./statemachine.js";
|
|
30
|
+
import { buildPipelineStatus, buildStatusSnapshot, StateStore, writeStatusJson } from "./state.js";
|
|
31
|
+
import { PiAuthWatch } from "@quickchatai/pi-quickreview/src/authwatch.js";
|
|
32
|
+
import { SessionCommandSupervisor } from "./session-command-supervisor.js";
|
|
33
|
+
import { readRoundProgress } from "./requiredpasses.js";
|
|
34
|
+
import { SingleFlight } from "./singleflight.js";
|
|
35
|
+
import { yieldToLoop } from "@quickchatai/pi-quickreview/src/yieldloop.js";
|
|
36
|
+
import { stubSessionHooks } from "./stubs.js";
|
|
37
|
+
import { VerdictWatcher } from "./verdicts.js";
|
|
38
|
+
import { applyInterpretation, createWebhookServer } from "./webhook.js";
|
|
39
|
+
import { wakeOrHold, withRepoFacts } from "./wakes.js";
|
|
40
|
+
import { prWorktreeRel } from "./worktrees.js";
|
|
41
|
+
import { PrConversation } from "./pr-conversation.js";
|
|
42
|
+
import { PostingOutbox, jobPath as postingJobPath, outboxProcesses, readPostingJob, } from "./posting-outbox.js";
|
|
43
|
+
/** The ping-pong wake's repo-fact appender lives with the wakes; re-exported
|
|
44
|
+
* for the callers that know it from here. */
|
|
45
|
+
export { withRepoFacts };
|
|
46
|
+
/** A per-PR runtime reader that cannot take the status write down with it. */
|
|
47
|
+
function runtimeReader(read) {
|
|
48
|
+
return (pr) => {
|
|
49
|
+
try {
|
|
50
|
+
return read(pr);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// Sub-poll cadences (seconds). The authoritative reconcile interval is
|
|
58
|
+
// config.daemon.poll_interval_s; these are cheap local ticks.
|
|
59
|
+
const DISPATCH_TICK_S = 15;
|
|
60
|
+
const VERDICT_SWEEP_S = 10;
|
|
61
|
+
const DEADLINE_TICK_S = 60;
|
|
62
|
+
const STATUS_TICK_S = 30;
|
|
63
|
+
const AUTHWATCH_TICK_S = 60;
|
|
64
|
+
/** A reconcile pass running this many poll intervals is abandoned (logged as
|
|
65
|
+
* the quiet anomaly `reconcile_pass_overdue`) and the next one starts. */
|
|
66
|
+
export const RECONCILE_OVERDUE_INTERVALS = 3;
|
|
67
|
+
function readWebhookSecret(cfg) {
|
|
68
|
+
return readFileSync(join(cfg.github.secrets_dir, "webhook_secret"), "utf8").trim();
|
|
69
|
+
}
|
|
70
|
+
/** The real adapter: token minter → mutation gate (dry-run aware) → adapter. */
|
|
71
|
+
function buildGitHubAdapter(cfg, stateDir) {
|
|
72
|
+
const minter = new TokenMinter(cfg.github.secrets_dir);
|
|
73
|
+
const gate = new MutationGate(cfg.dry_run, join(stateDir, "dryrun"), (intent) => github.executeMutation(intent));
|
|
74
|
+
// The gate's loud line (app-self-config executions) on stdout.
|
|
75
|
+
gate.setLog((msg, extra) => console.log(`[quickreviewd] ${msg}`, extra ?? ""));
|
|
76
|
+
const github = new GitHubAdapter(cfg, minter, gate);
|
|
77
|
+
return github;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Serve one author reply in a bot thread: claim it, then wake the PR's
|
|
81
|
+
* session (held while its round is in flight). The webhook interpretation
|
|
82
|
+
* guarantees a same-PR bot-owned root; the claim comes before the wake so a
|
|
83
|
+
* duplicate delivery cannot produce duplicate replies or resolutions.
|
|
84
|
+
*/
|
|
85
|
+
export async function serveAuthorReply(deps, reply) {
|
|
86
|
+
const { store, pingpong, log } = deps;
|
|
87
|
+
if (reply.in_reply_to_id === null)
|
|
88
|
+
return;
|
|
89
|
+
// Deploy-window drain: no ping-pong wake while draining — and the
|
|
90
|
+
// claim is deliberately not taken, so a redelivery after the lift
|
|
91
|
+
// can still service the reply. Belt-and-braces in practice: while
|
|
92
|
+
// draining the webhook drops the delivery before it reaches here.
|
|
93
|
+
if (store.drainState().draining) {
|
|
94
|
+
log(`pingpong: #${reply.pr} reply dropped — draining`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const event = {
|
|
98
|
+
pr: reply.pr,
|
|
99
|
+
comment_id: reply.comment_id,
|
|
100
|
+
in_reply_to_id: reply.in_reply_to_id,
|
|
101
|
+
body: reply.body,
|
|
102
|
+
author: reply.author,
|
|
103
|
+
};
|
|
104
|
+
// The repo facts for the replied thread's file — "" unless
|
|
105
|
+
// `[memory] delivery = "on"`, so the wake is otherwise byte-identical.
|
|
106
|
+
// The path rides the interpretation only, never the event: the wake's
|
|
107
|
+
// own text does not change. Read before the claim, so the claim is
|
|
108
|
+
// followed at once by its held wake — the claim refuses every
|
|
109
|
+
// redelivery, and the held row is what the stranded-wake sweep recovers.
|
|
110
|
+
let facts = "";
|
|
111
|
+
if (deps.repoFacts && reply.path) {
|
|
112
|
+
const before = store.getPr(reply.pr);
|
|
113
|
+
facts = await deps.repoFacts({
|
|
114
|
+
pr: reply.pr,
|
|
115
|
+
title: before?.title ?? "",
|
|
116
|
+
paths: [reply.path],
|
|
117
|
+
head_sha: before?.head_sha ?? null,
|
|
118
|
+
purpose: "pingpong",
|
|
119
|
+
});
|
|
120
|
+
if (typeof facts !== "string")
|
|
121
|
+
facts = "";
|
|
122
|
+
// That read can take the lesson budget (≤ 2 s): a drain the operator
|
|
123
|
+
// started meanwhile still stops the wake, the claim still not taken.
|
|
124
|
+
if (store.drainState().draining) {
|
|
125
|
+
log(`pingpong: #${reply.pr} reply dropped — draining`);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
let claimed = false;
|
|
130
|
+
const row = store.getPr(reply.pr);
|
|
131
|
+
// The PR's one main pi never gets a second instruction while its round
|
|
132
|
+
// is in flight — the wake is held and flushed at round end (rule 9).
|
|
133
|
+
const disposition = await wakeOrHold({ store, inject: deps.inject, log }, reply.pr, withRepoFacts(buildWakeMessage(event, {
|
|
134
|
+
head_sha: row?.head_sha,
|
|
135
|
+
worktree: join(deps.root, prWorktreeRel(reply.pr)),
|
|
136
|
+
}, pingpong.discipline(reply.in_reply_to_id)), facts), "author_reply",
|
|
137
|
+
// The message is already claimed: the wake is held before the
|
|
138
|
+
// injection is awaited and stays held if it fails, or no redelivery
|
|
139
|
+
// can ever answer it.
|
|
140
|
+
{
|
|
141
|
+
holdOnFailure: true,
|
|
142
|
+
claim: () => {
|
|
143
|
+
claimed = pingpong.claimAuthorMessage(event);
|
|
144
|
+
return claimed;
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
if (!claimed)
|
|
148
|
+
return;
|
|
149
|
+
if (disposition === "held")
|
|
150
|
+
log(`pingpong: #${reply.pr} reply held — round in flight, backlog or failed inject`);
|
|
151
|
+
}
|
|
152
|
+
export function createDaemon(deps = {}) {
|
|
153
|
+
const cfg = deps.cfg ?? loadConfig();
|
|
154
|
+
const root = deps.root ?? sandboxRoot();
|
|
155
|
+
const stateDir = join(root, "state");
|
|
156
|
+
const log = deps.log ??
|
|
157
|
+
((msg, extra) => console.log(`[quickreviewd] ${msg}`, extra ?? ""));
|
|
158
|
+
const store = deps.store ?? new StateStore(join(stateDir, "state.db"));
|
|
159
|
+
const hooks = deps.hooks ?? stubSessionHooks(root, log);
|
|
160
|
+
const roundStageBounds = resolveRoundStageBounds(cfg.daemon);
|
|
161
|
+
// Companion-inbox policy: every logAnomaly flows through the one
|
|
162
|
+
// severity map + dedup; WAKE classes write an inbox item, QUIET classes
|
|
163
|
+
// stay DB-only. Wired here so stub-wired daemons behave identically.
|
|
164
|
+
const writeInbox = deps.writeInbox ?? new CompanionInbox({ root, log }).writer();
|
|
165
|
+
const wakePolicy = new AnomalyWakePolicy({ writeInbox, log });
|
|
166
|
+
store.setAnomalySink((signal) => wakePolicy.onAnomaly(signal));
|
|
167
|
+
const gh = deps.adapter ?? buildGitHubAdapter(cfg, stateDir);
|
|
168
|
+
// The daemon measures its own event loop and the container's CPU
|
|
169
|
+
// throttling. A stall wakes through the one anomaly funnel (WAKE kind
|
|
170
|
+
// `daemon_event_loop_stalled`), rate-limited by the watch's cooldown.
|
|
171
|
+
const load = new DaemonLoadMonitor({
|
|
172
|
+
policy: eventLoopPolicy(cfg.daemon),
|
|
173
|
+
raise: (detail, message) => store.logAnomaly(EVENT_LOOP_WAKE_KIND, null, null, detail, message),
|
|
174
|
+
log,
|
|
175
|
+
...deps.eventLoop,
|
|
176
|
+
});
|
|
177
|
+
// The lazy announcer seam: a thin forwarder so the verdict watcher (built
|
|
178
|
+
// once, here) reaches whatever wire.ts assembles later — and swallows the
|
|
179
|
+
// gap before it exists. Absent `deps.announce` ⇒ undefined, i.e. no Slack.
|
|
180
|
+
const resolveAnnounce = deps.announce;
|
|
181
|
+
const announce = resolveAnnounce
|
|
182
|
+
? {
|
|
183
|
+
roundStarted: async (a) => void (await resolveAnnounce()?.roundStarted(a)),
|
|
184
|
+
verdict: async (a) => void (await resolveAnnounce()?.verdict(a)),
|
|
185
|
+
anomaly: async (a) => void (await resolveAnnounce()?.anomaly(a)),
|
|
186
|
+
superseded: async (a) => void (await resolveAnnounce()?.superseded(a)),
|
|
187
|
+
}
|
|
188
|
+
: undefined;
|
|
189
|
+
const verdictDir = join(root, "verdict");
|
|
190
|
+
const verdicts = new VerdictWatcher({
|
|
191
|
+
cfg,
|
|
192
|
+
store,
|
|
193
|
+
adapter: gh,
|
|
194
|
+
hooks,
|
|
195
|
+
writeInbox,
|
|
196
|
+
announce,
|
|
197
|
+
verdictDir,
|
|
198
|
+
root, // anchors the default pi-session dir for round usage measurement
|
|
199
|
+
...(deps.now ? { now: deps.now } : {}),
|
|
200
|
+
// The durable reasoning record — same dir the round prompts pin.
|
|
201
|
+
findingsDir: join(root, "state", "findings"),
|
|
202
|
+
// The lesson shadow ledger marks the round's posted findings.
|
|
203
|
+
...(deps.onFindingsRecorded ? { onFindingsRecorded: deps.onFindingsRecorded } : {}),
|
|
204
|
+
log,
|
|
205
|
+
});
|
|
206
|
+
const postingOutbox = deps.postingDelivery
|
|
207
|
+
? new PostingOutbox({
|
|
208
|
+
dir: join(stateDir, "posting-receipts"),
|
|
209
|
+
repo: cfg.github.repo,
|
|
210
|
+
dryRun: cfg.dry_run,
|
|
211
|
+
botLogins: [cfg.github.bot_login, `${cfg.github.app_slug}[bot]`],
|
|
212
|
+
adapter: deps.postingDelivery,
|
|
213
|
+
current: (job) => {
|
|
214
|
+
const pr = store.getPr(job.pr);
|
|
215
|
+
const round = store.roundsFor(job.pr).find((r) => r.round_no === job.round_no);
|
|
216
|
+
return (pr?.state === "reviewing" &&
|
|
217
|
+
pr.head_sha.toLowerCase() === job.head_sha.toLowerCase() &&
|
|
218
|
+
round?.status === "running" &&
|
|
219
|
+
round.posting_key === job.posting_key);
|
|
220
|
+
},
|
|
221
|
+
...(deps.now ? { now: deps.now } : {}),
|
|
222
|
+
...(deps.postingDelivery.createDeferredReview
|
|
223
|
+
? {
|
|
224
|
+
deferred: {
|
|
225
|
+
ledger: store,
|
|
226
|
+
offsetsMs: (cfg.daemon.posting_retry_offsets_min ?? DEFAULT_POSTING_RETRY_OFFSETS_MIN).map((m) => m * 60_000),
|
|
227
|
+
windowMs: (cfg.daemon.posting_retry_window_min ?? DEFAULT_POSTING_RETRY_WINDOW_MIN) *
|
|
228
|
+
60_000,
|
|
229
|
+
deliver: (pr, payload, key) => deps.postingDelivery.createDeferredReview(pr, payload, key),
|
|
230
|
+
// A new push does not end the debt (the review posts at its
|
|
231
|
+
// original commit_id); a cancelled round — an operator's `u`
|
|
232
|
+
// — does.
|
|
233
|
+
owed: (job) => {
|
|
234
|
+
const round = store.roundsFor(job.pr).find((r) => r.round_no === job.round_no);
|
|
235
|
+
return (store.getPr(job.pr)?.state !== "closed" &&
|
|
236
|
+
round?.status === "running" &&
|
|
237
|
+
round.posting_key === job.posting_key);
|
|
238
|
+
},
|
|
239
|
+
// The verdict watcher's posting proof now reads `exhausted`
|
|
240
|
+
// and fails the round loud on whichever path reaches it first
|
|
241
|
+
// (verdict sweep, stage limit, deadline): the FAILED_LOUD
|
|
242
|
+
// hold, its review_failed_loud wake and status.json. This
|
|
243
|
+
// row says why, at once.
|
|
244
|
+
onExhausted: (job, detail) => store.logAnomaly("posting_retry_exhausted", job.pr, job.round_no, `deferred review posting ${job.posting_key} was not delivered: ${detail}`),
|
|
245
|
+
},
|
|
246
|
+
}
|
|
247
|
+
: {}),
|
|
248
|
+
log: (message, job) => {
|
|
249
|
+
log(`#${job.pr} round ${job.round_no}: ${message}`);
|
|
250
|
+
store.logEvent("posting_delivery", job.pr, {
|
|
251
|
+
round_no: job.round_no,
|
|
252
|
+
posting_key: job.posting_key,
|
|
253
|
+
status: job.status,
|
|
254
|
+
attempts: job.attempts,
|
|
255
|
+
next_attempt_at: job.next_attempt_at,
|
|
256
|
+
detail: message,
|
|
257
|
+
});
|
|
258
|
+
},
|
|
259
|
+
})
|
|
260
|
+
: undefined;
|
|
261
|
+
const roundStages = new SessionCommandSupervisor({
|
|
262
|
+
cfg,
|
|
263
|
+
store,
|
|
264
|
+
hooks,
|
|
265
|
+
verdictDir,
|
|
266
|
+
progress: (pr) => readRoundProgress(root, pr),
|
|
267
|
+
onRoundFailure: (pr, roundNo, stage, detail) => verdicts.recoverInfrastructureFailure(pr, roundNo, stage, detail),
|
|
268
|
+
...(deps.now ? { now: deps.now } : {}),
|
|
269
|
+
});
|
|
270
|
+
const prConversation = new PrConversation({
|
|
271
|
+
store,
|
|
272
|
+
adapter: gh,
|
|
273
|
+
verdictDir,
|
|
274
|
+
botLogin: cfg.github.bot_login,
|
|
275
|
+
inject: (pr, message) => hooks.inject(pr, message),
|
|
276
|
+
...(deps.now ? { now: deps.now } : {}),
|
|
277
|
+
});
|
|
278
|
+
const pingpong = new PingPongLedger(store.db);
|
|
279
|
+
const threadDecisions = new ThreadDecisionWatcher({
|
|
280
|
+
adapter: gh,
|
|
281
|
+
store,
|
|
282
|
+
ledger: pingpong,
|
|
283
|
+
verdictDir,
|
|
284
|
+
log,
|
|
285
|
+
isDraining: () => store.drainState().draining,
|
|
286
|
+
botLogin: cfg.github.bot_login,
|
|
287
|
+
ownerActorAlias: appActorAlias(cfg.github.bot_login, cfg.github.app_slug),
|
|
288
|
+
// The author asked for a person on a review thread.
|
|
289
|
+
//
|
|
290
|
+
// There is no park to put them in: the state event is a deliberate no-op
|
|
291
|
+
// (`statemachine.ts`: "noted, never a handover — AI keeps working") and no
|
|
292
|
+
// reviewer is ever nominated on GitHub (rule 10). The signal is recorded,
|
|
293
|
+
// durably and visibly, and it is never a handover. `logAnomaly` is the one
|
|
294
|
+
// durable funnel; the kind is deliberately unlisted in `anomalies.ts`
|
|
295
|
+
// WAKE_KINDS, so it is quiet-tier — it lands in the DB, surfaces in the
|
|
296
|
+
// operator views and in the overseer's daily heartbeat, and never injects.
|
|
297
|
+
// An author asking for a person is worth a human's eyes; it is not a
|
|
298
|
+
// review that ran unsoundly now.
|
|
299
|
+
onHumanRequested: async (decision) => {
|
|
300
|
+
applyEvent(store, decision.pr, { type: "human_requested" }, {}, {
|
|
301
|
+
botLogin: cfg.github.bot_login,
|
|
302
|
+
reason: "pingpong:human-requested",
|
|
303
|
+
});
|
|
304
|
+
store.logAnomaly("human_requested", decision.pr, null, `the author asked for a person on thread ${decision.thread_id} (comment ${decision.comment_id})` +
|
|
305
|
+
`${decision.reason ? ` — ${decision.reason}` : ""}. No handover exists: the reviewer keeps driving.`);
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
// The repo-fact lessons a recheck nudge and a ping-pong wake
|
|
309
|
+
// carry for the paths they touch. Total — the hook is bounded by the lesson
|
|
310
|
+
// prefetch's budget, and a throw is "" — so neither wake is ever held or
|
|
311
|
+
// lost for it.
|
|
312
|
+
const repoFactsFor = async (q) => {
|
|
313
|
+
try {
|
|
314
|
+
const s = await deps.lessons?.repoFacts?.(q);
|
|
315
|
+
return typeof s === "string" ? s : "";
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
log(`lessons: #${q.pr} ${q.purpose} repo facts failed (ignored)`, err);
|
|
319
|
+
return "";
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
// The post-approval delta recheck. Three of its four triggers are
|
|
323
|
+
// wired below; the fourth — an author reply — is owned by ping-pong above and
|
|
324
|
+
// deliberately never reaches this path.
|
|
325
|
+
const recheckDeps = {
|
|
326
|
+
cfg,
|
|
327
|
+
store,
|
|
328
|
+
adapter: gh,
|
|
329
|
+
inject: (pr, message) => hooks.inject(pr, message),
|
|
330
|
+
...(deps.renderRecheckPrompt ? { renderPrompt: deps.renderRecheckPrompt } : {}),
|
|
331
|
+
...(deps.resolvedFilesInMerges ? { resolvedFilesInMerges: deps.resolvedFilesInMerges } : {}),
|
|
332
|
+
// The repo facts for the delta's files — "" unless
|
|
333
|
+
// `[memory] delivery = "on"`, so the nudge is otherwise byte-identical.
|
|
334
|
+
...(deps.lessons?.repoFacts
|
|
335
|
+
? { repoFacts: (q) => repoFactsFor(q) }
|
|
336
|
+
: {}),
|
|
337
|
+
log,
|
|
338
|
+
};
|
|
339
|
+
const rechecks = new RecheckWatcher({
|
|
340
|
+
cfg,
|
|
341
|
+
store,
|
|
342
|
+
verdictDir,
|
|
343
|
+
findingsDir: join(root, "state", "findings"),
|
|
344
|
+
log,
|
|
345
|
+
// Ledger freshness after a recheck uphold — same enforcement the
|
|
346
|
+
// VerdictWatcher runs at round end, keyed by head (no round in flight).
|
|
347
|
+
checkLedger: async (pr, headSha) => {
|
|
348
|
+
await enforceLedgerFreshness({
|
|
349
|
+
store,
|
|
350
|
+
ledgerPathFor: (n) => join(root, "state", "ledgers", `pr-${n}.md`),
|
|
351
|
+
inject: (n, message) => hooks.inject(n, message),
|
|
352
|
+
log,
|
|
353
|
+
}, { pr, roundNo: null, headSha });
|
|
354
|
+
},
|
|
355
|
+
});
|
|
356
|
+
// The withheld-approval retry — same `ci_completed` event, opposite
|
|
357
|
+
// direction: the recheck above asks whether a standing approval must fall,
|
|
358
|
+
// this asks whether a withheld one can finally be given.
|
|
359
|
+
const ciDeps = { cfg, store, adapter: gh, log };
|
|
360
|
+
const timers = [];
|
|
361
|
+
let server = null;
|
|
362
|
+
let stopping = false;
|
|
363
|
+
const onInterpretation = async (i, ctx) => {
|
|
364
|
+
const ingressGuard = async (what, fn) => {
|
|
365
|
+
if (!ctx?.guid)
|
|
366
|
+
return guard(what, fn);
|
|
367
|
+
try {
|
|
368
|
+
await fn();
|
|
369
|
+
}
|
|
370
|
+
catch (err) {
|
|
371
|
+
log(`${what} failed`, err);
|
|
372
|
+
store.logEvent("daemon_error", null, { what, error: String(err) });
|
|
373
|
+
throw err;
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
const requireRecheckHandoff = (req, outcome) => {
|
|
377
|
+
if (!ctx?.guid || outcome.action !== "noop" || outcome.reason !== "delivery-failed")
|
|
378
|
+
return;
|
|
379
|
+
const head = req.head_sha ?? store.getPr(req.pr)?.head_sha ?? "";
|
|
380
|
+
if (!store.recheckDelivery(req.pr, recheckFingerprint(req, head))) {
|
|
381
|
+
throw new Error(`recheck #${req.pr} failed before durable question handoff`);
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
const ingressRecheck = async (req) => {
|
|
385
|
+
requireRecheckHandoff(req, await runRecheck(recheckDeps, req));
|
|
386
|
+
};
|
|
387
|
+
await applyInterpretation({
|
|
388
|
+
cfg,
|
|
389
|
+
store,
|
|
390
|
+
deliveryGuid: ctx?.guid,
|
|
391
|
+
onPrTouched: async () => {
|
|
392
|
+
await pump();
|
|
393
|
+
},
|
|
394
|
+
onAuthorPrComment: async (comment) => {
|
|
395
|
+
await prConversation.accept(comment);
|
|
396
|
+
},
|
|
397
|
+
onAuthorReply: async (reply) => {
|
|
398
|
+
await serveAuthorReply({
|
|
399
|
+
store,
|
|
400
|
+
pingpong,
|
|
401
|
+
inject: (pr, message) => hooks.inject(pr, message),
|
|
402
|
+
root,
|
|
403
|
+
log,
|
|
404
|
+
...(deps.lessons?.repoFacts ? { repoFacts: repoFactsFor } : {}),
|
|
405
|
+
}, reply);
|
|
406
|
+
},
|
|
407
|
+
onClosed: async (pr) => {
|
|
408
|
+
await hooks.archiveAndClose(pr);
|
|
409
|
+
},
|
|
410
|
+
// A push after an approve: the recheck audits the new delta.
|
|
411
|
+
onSynchronize: async (sync) => {
|
|
412
|
+
await ingressGuard(`recheck #${sync.pr}`, () => ingressRecheck({ pr: sync.pr, trigger: "push", head_sha: sync.meta.head_sha }));
|
|
413
|
+
},
|
|
414
|
+
onCiCompleted: async (ci) => {
|
|
415
|
+
for (const pr of ci.prs) {
|
|
416
|
+
await ingressGuard(`recheck #${pr}`, () => ingressRecheck({
|
|
417
|
+
pr,
|
|
418
|
+
trigger: "ci",
|
|
419
|
+
head_sha: ci.head_sha,
|
|
420
|
+
ci: { conclusion: ci.conclusion },
|
|
421
|
+
}));
|
|
422
|
+
// The other side of the same event. A PR whose approval
|
|
423
|
+
// was withheld for red CI is re-queued the moment CI goes green at
|
|
424
|
+
// that head — without this the gate turns every infra flake into a
|
|
425
|
+
// permanently stuck PR.
|
|
426
|
+
await ingressGuard(`approval retry #${pr}`, async () => {
|
|
427
|
+
const outcome = await retryWithheldApproval(ciDeps, {
|
|
428
|
+
pr,
|
|
429
|
+
head_sha: ci.head_sha,
|
|
430
|
+
conclusion: ci.conclusion,
|
|
431
|
+
});
|
|
432
|
+
if (outcome.action === "requeued")
|
|
433
|
+
await pump();
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
},
|
|
437
|
+
onBaseAdvanced: async (advance) => {
|
|
438
|
+
await ingressGuard(`recheck base ${advance.branch}`, async () => {
|
|
439
|
+
const outcomes = await runBaseAdvance(recheckDeps, {
|
|
440
|
+
branch: advance.branch,
|
|
441
|
+
before: advance.before,
|
|
442
|
+
after: advance.after,
|
|
443
|
+
});
|
|
444
|
+
for (const [pr, outcome] of outcomes)
|
|
445
|
+
requireRecheckHandoff({ pr, trigger: "base_advance", base: advance }, outcome);
|
|
446
|
+
});
|
|
447
|
+
},
|
|
448
|
+
// Forward tuning-loop signals to the engine. A review set
|
|
449
|
+
// aside right after a head push is GitHub's own stale-review sweep,
|
|
450
|
+
// classified here (the store holds the push clock), not a human verdict.
|
|
451
|
+
onFeedbackSignal: async (e) => {
|
|
452
|
+
if (!deps.onFeedback)
|
|
453
|
+
return;
|
|
454
|
+
await ingressGuard(`feedback #${e.pr}`, async () => {
|
|
455
|
+
if (e.kind === "review_set_aside") {
|
|
456
|
+
const lastPush = store.lastEventAt("head_push", e.pr);
|
|
457
|
+
const stale = lastPush !== undefined &&
|
|
458
|
+
Date.now() - Date.parse(lastPush) < REVIEW_SET_ASIDE_STALE_WINDOW_MS;
|
|
459
|
+
await deps.onFeedback({ ...e, stale });
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
await deps.onFeedback(e);
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
},
|
|
466
|
+
}, i);
|
|
467
|
+
};
|
|
468
|
+
const guard = async (what, fn) => {
|
|
469
|
+
try {
|
|
470
|
+
await fn();
|
|
471
|
+
}
|
|
472
|
+
catch (err) {
|
|
473
|
+
log(`${what} failed`, err);
|
|
474
|
+
store.logEvent("daemon_error", null, { what, error: String(err) });
|
|
475
|
+
}
|
|
476
|
+
};
|
|
477
|
+
// Outcome capture: what became of every posted finding. It reads only
|
|
478
|
+
// (state.db, the base clone) and rides the reconcile pass.
|
|
479
|
+
const outcomes = new OutcomeCapture({
|
|
480
|
+
store,
|
|
481
|
+
botLogin: cfg.github.bot_login,
|
|
482
|
+
...(deps.outcomeGit ? { git: deps.outcomeGit } : {}),
|
|
483
|
+
...(deps.now ? { now: deps.now } : {}),
|
|
484
|
+
});
|
|
485
|
+
let firstReconcileSeen = false;
|
|
486
|
+
let firstHealthyReconcileAt = null;
|
|
487
|
+
// Deploy-window drain auto-lift: only the boot's first reconcile pass may
|
|
488
|
+
// lift the drain, and only when it completed healthily — reconcileOnce
|
|
489
|
+
// resolved and its per-step `report.errors` is empty. A failed first pass
|
|
490
|
+
// leaves the drain standing for the rest of this boot (a broken deploy must
|
|
491
|
+
// not resume work blind); clearing it then takes an explicit `drain off`.
|
|
492
|
+
// In a multi-deploy window each healthy boot lifts the drain, so the
|
|
493
|
+
// operator re-drains before each step. Two drains are never lifted here: a
|
|
494
|
+
// system's (with a reason) and the operator's HOLD (`qcr drain on --hold`,
|
|
495
|
+
// the cutover's), which only an explicit `drain off` lifts.
|
|
496
|
+
//
|
|
497
|
+
// One reconcile pass at a time: an overlapping pass would pay every step
|
|
498
|
+
// again. A tick that finds a pass running is skipped; an explicit call
|
|
499
|
+
// waits for it and then runs its own pass.
|
|
500
|
+
//
|
|
501
|
+
// The guard is bounded: it covers reconcileOnce and the drain lift only —
|
|
502
|
+
// the conversation sweep and the dispatch pump run after it is released,
|
|
503
|
+
// each behind its own lock — and a pass still running after
|
|
504
|
+
// RECONCILE_OVERDUE_INTERVALS poll intervals is abandoned, so one hung await
|
|
505
|
+
// can never stop every later pass (and with them the backstop and the
|
|
506
|
+
// undelivered-recheck sweep).
|
|
507
|
+
const reconcileFlight = new SingleFlight({
|
|
508
|
+
overdueMs: () => RECONCILE_OVERDUE_INTERVALS * cfg.daemon.poll_interval_s * 1000,
|
|
509
|
+
onOverdue: (ageMs) => {
|
|
510
|
+
const detail = `a reconcile pass has run ${Math.round(ageMs / 1000)} s ` +
|
|
511
|
+
`(over ${RECONCILE_OVERDUE_INTERVALS} poll intervals of ${cfg.daemon.poll_interval_s} s) ` +
|
|
512
|
+
`without settling — no longer waited for; the next pass starts beside it`;
|
|
513
|
+
log(`reconcile: ${detail}`);
|
|
514
|
+
store.logAnomaly("reconcile_pass_overdue", null, null, detail);
|
|
515
|
+
},
|
|
516
|
+
});
|
|
517
|
+
const reconcile = async () => {
|
|
518
|
+
if (!(await reconcileFlight.run(reconcilePass)))
|
|
519
|
+
return;
|
|
520
|
+
// Outside the single-flight: both have their own locks (PrConversation's
|
|
521
|
+
// `busy`, dispatch's per-store active pump), and a pump that hangs on a
|
|
522
|
+
// worktree fetch must not hold the next reconcile pass back.
|
|
523
|
+
await guard("reconcile", async () => {
|
|
524
|
+
await prConversation.sweep();
|
|
525
|
+
await pump();
|
|
526
|
+
});
|
|
527
|
+
};
|
|
528
|
+
const reconcileTick = () => {
|
|
529
|
+
if (reconcileFlight.running()) {
|
|
530
|
+
log("reconcile: the previous pass is still running — this tick skipped");
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
void reconcile();
|
|
534
|
+
};
|
|
535
|
+
/** The guarded part of a pass; true when it completed (the follow-ups run
|
|
536
|
+
* only then). */
|
|
537
|
+
const reconcilePass = async () => {
|
|
538
|
+
const bootFirstPass = !firstReconcileSeen;
|
|
539
|
+
firstReconcileSeen = true;
|
|
540
|
+
let completed = false;
|
|
541
|
+
await guard("reconcile", async () => {
|
|
542
|
+
const report = await reconcileOnce({
|
|
543
|
+
cfg,
|
|
544
|
+
store,
|
|
545
|
+
adapter: gh,
|
|
546
|
+
hooks,
|
|
547
|
+
log,
|
|
548
|
+
// Push-trigger backstop: same runRecheck the webhook's onSynchronize
|
|
549
|
+
// calls, so a dead/lost webhook never leaves a post-review push
|
|
550
|
+
// unexamined.
|
|
551
|
+
onHeadPush: async (pr, head_sha) => {
|
|
552
|
+
await guard(`recheck #${pr}`, () => runRecheck(recheckDeps, { pr, trigger: "push", head_sha }));
|
|
553
|
+
},
|
|
554
|
+
// Feedback backstop: merged-over-block for closes the webhook missed.
|
|
555
|
+
onMergedOverBlock: async (pr) => {
|
|
556
|
+
await guard(`feedback #${pr}`, async () => deps.onFeedback?.({ kind: "merged_over_block", pr }));
|
|
557
|
+
},
|
|
558
|
+
outcomes,
|
|
559
|
+
// The boot's first pass lifts a deploy drain; the undelivered-recheck
|
|
560
|
+
// sweep reads session transcripts and is not needed for that, so it
|
|
561
|
+
// starts on the next pass to keep the boot pass short.
|
|
562
|
+
receiptSweep: !bootFirstPass,
|
|
563
|
+
});
|
|
564
|
+
log(`reconcile: open=${report.open_prs} triggered=${report.triggered.length} ` +
|
|
565
|
+
`closed=${report.closed.length} captured=${report.captured_comments} ` +
|
|
566
|
+
`corrections=${report.corrections} errors=${report.errors.length}`);
|
|
567
|
+
if (report.errors.length === 0 && firstHealthyReconcileAt === null)
|
|
568
|
+
firstHealthyReconcileAt = deps.now ? deps.now() : new Date();
|
|
569
|
+
const standing = store.drainState();
|
|
570
|
+
if (bootFirstPass && standing.draining && standing.hold) {
|
|
571
|
+
// The operator's hold: the boot keeps it, and says so — a healthy
|
|
572
|
+
// first pass is exactly where a plain drain would have lifted.
|
|
573
|
+
if (report.errors.length === 0) {
|
|
574
|
+
store.logEvent("drain_hold_kept", null, {
|
|
575
|
+
dropped_deliveries: standing.drained_deliveries,
|
|
576
|
+
});
|
|
577
|
+
log(`drain_hold_kept — first reconcile pass healthy; the operator's drain HOLD stands, only an explicit drain off lifts it`);
|
|
578
|
+
}
|
|
579
|
+
else {
|
|
580
|
+
log("drain hold stands — first reconcile pass had errors; only an explicit drain off lifts it");
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
else if (bootFirstPass && standing.draining && standing.reason !== null) {
|
|
584
|
+
// A drain a system set for a reason (the worker crash-loop breaker,
|
|
585
|
+
// `worker_failures`) is not a deploy window: a restart does not clear what
|
|
586
|
+
// made it. Only an explicit `drain off` does.
|
|
587
|
+
log(`drain stands — held for ${standing.reason}; only an explicit drain off lifts it`);
|
|
588
|
+
}
|
|
589
|
+
else if (bootFirstPass && report.errors.length === 0 && standing.draining) {
|
|
590
|
+
// The operator's lift: this is the deploy flow's drain completing, so
|
|
591
|
+
// it clears whatever hold stands — a session's included.
|
|
592
|
+
const { dropped } = store.liftDrain("operator");
|
|
593
|
+
store.logEvent("drain_lifted", null, { dropped_deliveries: dropped });
|
|
594
|
+
log(`drain_lifted — first reconcile pass healthy; ${dropped} webhook delivery(ies) were dropped while draining`);
|
|
595
|
+
threadDecisions.requestSweep();
|
|
596
|
+
}
|
|
597
|
+
completed = true;
|
|
598
|
+
});
|
|
599
|
+
return completed;
|
|
600
|
+
};
|
|
601
|
+
const pump = async () => {
|
|
602
|
+
await guard("dispatch", async () => {
|
|
603
|
+
// Session levers that lapsed since the last tick leave the ledger here;
|
|
604
|
+
// the readers below already treat them as gone.
|
|
605
|
+
sweepExpiredLevers(store, (line) => log(line));
|
|
606
|
+
const orders = await dispatchOnce({
|
|
607
|
+
cfg,
|
|
608
|
+
store,
|
|
609
|
+
adapter: gh,
|
|
610
|
+
hooks,
|
|
611
|
+
renderPrompt: (order, memory) => (deps.renderPrompt ? deps.renderPrompt(order, memory) : JSON.stringify(order, null, 2)) +
|
|
612
|
+
prConversation.context(order.pr),
|
|
613
|
+
...(deps.memory ? { memory: deps.memory } : {}),
|
|
614
|
+
...(deps.lessons ? { lessons: deps.lessons } : {}),
|
|
615
|
+
...(deps.ecosystem ? { ecosystem: deps.ecosystem } : {}),
|
|
616
|
+
...(deps.heuristics ? { heuristics: deps.heuristics } : {}),
|
|
617
|
+
// Every round order re-hands the PR's ledger, read
|
|
618
|
+
// from ledger-pin's mirror — the same file the freshness check reads.
|
|
619
|
+
// Total: no file, an unreadable one or another PR's ⇒ no carry.
|
|
620
|
+
ledgerCarry: (n) => readLedgerCarry(join(root, "state", "ledgers", `pr-${n}.md`), n),
|
|
621
|
+
prepareWorktree: deps.prepareWorktree,
|
|
622
|
+
...(deps.prOwnedDelta ? { prOwnedDelta: deps.prOwnedDelta } : {}),
|
|
623
|
+
...(deps.pinReviewedHead ? { pinReviewedHead: deps.pinReviewedHead } : {}),
|
|
624
|
+
findingsDir: join(root, "state", "findings"),
|
|
625
|
+
postingReceiptDir: join(root, "state", "posting-receipts"),
|
|
626
|
+
listBaseMigrations: deps.listBaseMigrations,
|
|
627
|
+
...(deps.dependencySources ? { dependencySources: deps.dependencySources } : {}),
|
|
628
|
+
directiveAuthor: deps.directiveAuthor,
|
|
629
|
+
resolvedFilesInMerges: deps.resolvedFilesInMerges,
|
|
630
|
+
announce,
|
|
631
|
+
log,
|
|
632
|
+
...(deps.now ? { now: deps.now } : {}),
|
|
633
|
+
});
|
|
634
|
+
for (const o of orders)
|
|
635
|
+
log(`dispatched #${o.pr} round ${o.round_no} (${o.round_type}) lenses=${o.lenses.join(",")}`);
|
|
636
|
+
});
|
|
637
|
+
};
|
|
638
|
+
const retryDueReviewFailures = async () => {
|
|
639
|
+
// This transition only republishes ordinary queued debt; the one dispatch
|
|
640
|
+
// pump below remains the sole round and pi-command creator.
|
|
641
|
+
const automaticRetries = store.activateDueReviewFailureRetries(store.currentTimeIso());
|
|
642
|
+
if (automaticRetries.length > 0) {
|
|
643
|
+
for (const retry of automaticRetries) {
|
|
644
|
+
log(`automatic pre-fanout retry: #${retry.pr} round ${retry.target_round_no} epoch ${retry.retry_epoch} @ ${retry.target_head_sha.slice(0, 7)}`);
|
|
645
|
+
}
|
|
646
|
+
await pump();
|
|
647
|
+
}
|
|
648
|
+
return automaticRetries.length;
|
|
649
|
+
};
|
|
650
|
+
// Passive pi auth-failure watch: no smoke calls, just the session JSONLs pi
|
|
651
|
+
// already writes. A detection is a wake-grade anomaly
|
|
652
|
+
// (10-min dedup via the sink) and a status.json flag the TUI alerts on.
|
|
653
|
+
const piAuthWatch = deps.piSessionsDir ? new PiAuthWatch(deps.piSessionsDir) : undefined;
|
|
654
|
+
const authWatchTick = () => {
|
|
655
|
+
if (!piAuthWatch)
|
|
656
|
+
return;
|
|
657
|
+
try {
|
|
658
|
+
const hits = piAuthWatch.scan();
|
|
659
|
+
if (hits.length > 0) {
|
|
660
|
+
const files = hits.map((h) => h.file.split("/").pop()).join(", ");
|
|
661
|
+
store.logAnomaly("pi_auth_expired", null, null, `pi API auth failures (token expired) in ${hits.length} session file(s): ${files}`, [
|
|
662
|
+
"PI AUTH EXPIRED — sessions are failing API calls with token-expired errors.",
|
|
663
|
+
`Fresh hits in: ${files}`,
|
|
664
|
+
"Every round in flight will wedge until a human re-runs /login in the container (interactive OAuth — the daemon cannot do it).",
|
|
665
|
+
].join("\n"));
|
|
666
|
+
log(`authwatch: pi token-expired errors in ${hits.length} session file(s)`, files);
|
|
667
|
+
writeStatus();
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
catch (err) {
|
|
671
|
+
log("authwatch failed", err);
|
|
672
|
+
}
|
|
673
|
+
};
|
|
674
|
+
const writeStatus = () => {
|
|
675
|
+
// Fail-soft twice over: reading the OpenViking block can never abort the
|
|
676
|
+
// heartbeat (its own try/catch), and the write itself is guarded as before.
|
|
677
|
+
let openviking;
|
|
678
|
+
try {
|
|
679
|
+
openviking = deps.openvikingStatus?.();
|
|
680
|
+
}
|
|
681
|
+
catch (err) {
|
|
682
|
+
log("openviking status read failed (heartbeat continues)", err);
|
|
683
|
+
}
|
|
684
|
+
let memory;
|
|
685
|
+
try {
|
|
686
|
+
memory = deps.memoryStatus?.();
|
|
687
|
+
}
|
|
688
|
+
catch (err) {
|
|
689
|
+
log("memory health read failed (heartbeat continues)", err);
|
|
690
|
+
}
|
|
691
|
+
let daemonLoad;
|
|
692
|
+
try {
|
|
693
|
+
daemonLoad = load.status();
|
|
694
|
+
}
|
|
695
|
+
catch (err) {
|
|
696
|
+
log("event-loop watch read failed (heartbeat continues)", err);
|
|
697
|
+
}
|
|
698
|
+
let archive;
|
|
699
|
+
try {
|
|
700
|
+
archive = deps.archiveStatus?.();
|
|
701
|
+
}
|
|
702
|
+
catch (err) {
|
|
703
|
+
log("archive status read failed (heartbeat continues)", err);
|
|
704
|
+
}
|
|
705
|
+
let loginRefresh;
|
|
706
|
+
try {
|
|
707
|
+
loginRefresh = deps.loginRefreshStatus?.();
|
|
708
|
+
}
|
|
709
|
+
catch (err) {
|
|
710
|
+
log("login refresh status read failed (heartbeat continues)", err);
|
|
711
|
+
}
|
|
712
|
+
let permits;
|
|
713
|
+
try {
|
|
714
|
+
permits = deps.permitStatus?.();
|
|
715
|
+
}
|
|
716
|
+
catch (err) {
|
|
717
|
+
log("permit status read failed (heartbeat continues)", err);
|
|
718
|
+
}
|
|
719
|
+
try {
|
|
720
|
+
const snapshot = buildStatusSnapshot(store, cfg.dry_run, deps.digestHeadline?.(), undefined, cfg.daemon.max_concurrent_rounds, piAuthWatch?.status(), openviking, threadDecisions.status(), roundStages.health(), roundStageBounds, memory, daemonLoad, archive, loginRefresh, permits, deps.runtimeOf && runtimeReader(deps.runtimeOf));
|
|
721
|
+
if (postingOutbox)
|
|
722
|
+
for (const pr of snapshot.prs) {
|
|
723
|
+
if (!pr.current_round)
|
|
724
|
+
continue;
|
|
725
|
+
const job = readPostingJob(postingJobPath(join(stateDir, "posting-receipts"), pr.number, pr.current_round.round_no));
|
|
726
|
+
if (job && outboxProcesses(job, cfg.github.repo))
|
|
727
|
+
pr.current_round.posting_delivery = {
|
|
728
|
+
attempts: job.attempts,
|
|
729
|
+
next_attempt_at: job.next_attempt_at,
|
|
730
|
+
...(job.last_error ? { last_error: job.last_error } : {}),
|
|
731
|
+
...(job.deferred_at ? { deferred_since: job.deferred_at } : {}),
|
|
732
|
+
};
|
|
733
|
+
}
|
|
734
|
+
if (deps.runHost)
|
|
735
|
+
snapshot.run_host = deps.runHost;
|
|
736
|
+
writeStatusJson(stateDir, snapshot);
|
|
737
|
+
}
|
|
738
|
+
catch (err) {
|
|
739
|
+
log("status.json write failed", err);
|
|
740
|
+
}
|
|
741
|
+
};
|
|
742
|
+
const every = (seconds, fn) => {
|
|
743
|
+
const t = setInterval(fn, seconds * 1000);
|
|
744
|
+
t.unref?.();
|
|
745
|
+
timers.push(t);
|
|
746
|
+
};
|
|
747
|
+
return {
|
|
748
|
+
store,
|
|
749
|
+
cfg,
|
|
750
|
+
outcomes,
|
|
751
|
+
load,
|
|
752
|
+
firstHealthyReconcileAt: () => firstHealthyReconcileAt,
|
|
753
|
+
reconcile,
|
|
754
|
+
pump,
|
|
755
|
+
retryDueReviewFailures,
|
|
756
|
+
scanRoundStages: () => roundStages.scan(),
|
|
757
|
+
sweepVerdicts: () => verdicts.sweep(),
|
|
758
|
+
wakeThreadDecisions: () => threadDecisions.requestSweep(),
|
|
759
|
+
retryThreadDecision: (commentId) => threadDecisions.retryFailed(commentId),
|
|
760
|
+
async start() {
|
|
761
|
+
log(`starting — ${cfg.dry_run ? "DRY-RUN" : "LIVE"} — repo ${cfg.github.repo}`);
|
|
762
|
+
if (deps.runHost?.warning)
|
|
763
|
+
log(`WARNING: ${deps.runHost.warning}`);
|
|
764
|
+
store.logEvent("daemon_start", null, { dry_run: cfg.dry_run, port: cfg.server.port });
|
|
765
|
+
// First, so a boot that holds the loop is measured too.
|
|
766
|
+
load.start();
|
|
767
|
+
if (deps.listen !== false) {
|
|
768
|
+
const secret = deps.webhookSecret ?? readWebhookSecret(cfg);
|
|
769
|
+
server = createWebhookServer({
|
|
770
|
+
cfg,
|
|
771
|
+
store,
|
|
772
|
+
secret,
|
|
773
|
+
onInterpretation,
|
|
774
|
+
...(gh.listReviewCommentsFull
|
|
775
|
+
? { listReviewCommentsFull: (pr) => gh.listReviewCommentsFull(pr) }
|
|
776
|
+
: {}),
|
|
777
|
+
// Only the pipeline block — never the whole snapshot (every PR,
|
|
778
|
+
// every round) on each probe: `/health` is what a stalled loop is
|
|
779
|
+
// measured by, so it must cost almost nothing itself.
|
|
780
|
+
pipelineHealth: () => buildPipelineStatus(store, new Date(), roundStages.health()),
|
|
781
|
+
log,
|
|
782
|
+
});
|
|
783
|
+
// Loopback by default; in the container the daemon must bind 0.0.0.0
|
|
784
|
+
// (docker's published port targets the container's eth0, and the
|
|
785
|
+
// host-side binding is already 127.0.0.1-only).
|
|
786
|
+
const bindHost = process.env.QC_BIND_HOST ?? "127.0.0.1";
|
|
787
|
+
await new Promise((resolve) => server.listen(cfg.server.port, bindHost, resolve));
|
|
788
|
+
log(`webhook listening on ${bindHost}:${cfg.server.port}/webhook`);
|
|
789
|
+
}
|
|
790
|
+
verdicts.start();
|
|
791
|
+
// Independent of reconcile and round/session scheduling: a GitHub read
|
|
792
|
+
// outage must not prevent the delivery worker itself getting a turn.
|
|
793
|
+
if (postingOutbox) {
|
|
794
|
+
void guard("posting delivery", () => postingOutbox.tick());
|
|
795
|
+
every(15, () => void guard("posting delivery", () => postingOutbox.tick()));
|
|
796
|
+
}
|
|
797
|
+
threadDecisions.start();
|
|
798
|
+
rechecks.start();
|
|
799
|
+
writeStatus();
|
|
800
|
+
// Start the correctness scan without holding daemon startup. If it
|
|
801
|
+
// hangs, its attempt lease ages while status.json keeps advancing and
|
|
802
|
+
// the pipeline reports unhealthy rather than blocking the process.
|
|
803
|
+
void guard("round stage supervisor", async () => {
|
|
804
|
+
try {
|
|
805
|
+
await roundStages.scan();
|
|
806
|
+
}
|
|
807
|
+
finally {
|
|
808
|
+
writeStatus();
|
|
809
|
+
}
|
|
810
|
+
});
|
|
811
|
+
// onStart before the first reconcile: the sweep can nudge a recheck at a
|
|
812
|
+
// dead session immediately (boot after a deploy restart), and the
|
|
813
|
+
// respawn path needs the title resolver wired in onStart.
|
|
814
|
+
//
|
|
815
|
+
// Fatal, not guarded: onStart assembles the command watchers, the EOD
|
|
816
|
+
// timer and the Slack concierge, and refuses loudly on what must not
|
|
817
|
+
// run half-built (Slack auth.test, a malformed profile pack). Swallowing
|
|
818
|
+
// the throw would leave a daemon that reviews PRs while serving no
|
|
819
|
+
// overseer or operator command and running no sweep. The caller
|
|
820
|
+
// (wire.ts main) stops and exits non-zero; the container restart is the
|
|
821
|
+
// retry.
|
|
822
|
+
if (deps.onStart) {
|
|
823
|
+
// A real event-loop turn between the first status write and the
|
|
824
|
+
// assembly: each is tens of ms of synchronous work, and back to back
|
|
825
|
+
// (with any of onStart's calls answering without real I/O) they would
|
|
826
|
+
// be one uninterrupted span of the boot.
|
|
827
|
+
await yieldToLoop();
|
|
828
|
+
try {
|
|
829
|
+
await deps.onStart(this);
|
|
830
|
+
}
|
|
831
|
+
catch (err) {
|
|
832
|
+
log("onStart failed — refusing to run a half-assembled daemon", err);
|
|
833
|
+
store.logEvent("daemon_error", null, {
|
|
834
|
+
what: "onStart",
|
|
835
|
+
error: String(err),
|
|
836
|
+
fatal: true,
|
|
837
|
+
});
|
|
838
|
+
throw err;
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
// The periodic timers go in BEFORE the boot's first reconcile is
|
|
842
|
+
// awaited: that pass, and the dispatch pump it runs after, can hang on
|
|
843
|
+
// an await with no deadline of its own (a worktree fetch), and a boot
|
|
844
|
+
// left waiting there would install no later reconcile, no recovery scan
|
|
845
|
+
// and no status heartbeat. A tick that finds the boot pass still
|
|
846
|
+
// running is skipped like any other overlap.
|
|
847
|
+
every(cfg.daemon.poll_interval_s, reconcileTick);
|
|
848
|
+
every(DISPATCH_TICK_S, () => void pump());
|
|
849
|
+
every(VERDICT_SWEEP_S, () => void guard("verdict sweep", async () => {
|
|
850
|
+
await verdicts.sweep();
|
|
851
|
+
await threadDecisions.sweep();
|
|
852
|
+
await prConversation.sweep();
|
|
853
|
+
await rechecks.sweep();
|
|
854
|
+
}));
|
|
855
|
+
every(DEADLINE_TICK_S, () => {
|
|
856
|
+
void guard("round stage supervisor", async () => {
|
|
857
|
+
try {
|
|
858
|
+
await roundStages.scan();
|
|
859
|
+
}
|
|
860
|
+
finally {
|
|
861
|
+
writeStatus();
|
|
862
|
+
}
|
|
863
|
+
});
|
|
864
|
+
void guard("deadline check", async () => {
|
|
865
|
+
await verdicts.checkDeadlines();
|
|
866
|
+
// A safe pre-fanout exhaustion is a circuit breaker, not an inert
|
|
867
|
+
// operator park.
|
|
868
|
+
await retryDueReviewFailures();
|
|
869
|
+
// Zombie-round expiry: rounds stuck `overdue` past the
|
|
870
|
+
// horizon whose PR has since verdicted/closed become terminal
|
|
871
|
+
// `expired`. Rounds a rerun could still service are left standing.
|
|
872
|
+
if (cfg.daemon.expire_overdue_after_h > 0) {
|
|
873
|
+
const expired = store.expireOverdueRounds(cfg.daemon.expire_overdue_after_h);
|
|
874
|
+
if (expired.length > 0)
|
|
875
|
+
log(`expired ${expired.length} zombie round(s): ids ${expired.join(",")}`);
|
|
876
|
+
}
|
|
877
|
+
// Stranded rounds: the ones the sweep above deliberately leaves —
|
|
878
|
+
// overdue, but the PR is still open and still undecided, so "a rerun
|
|
879
|
+
// could service it". Nothing reruns an overdue round on its own, so
|
|
880
|
+
// past a week it is abandoned: terminalize it and say so. One anomaly
|
|
881
|
+
// per round, once, because the row stops being overdue the moment it
|
|
882
|
+
// is reported.
|
|
883
|
+
for (const r of store.expireStrandedRounds()) {
|
|
884
|
+
store.logAnomaly("round_stranded", r.pr, r.round_no, `round ${r.round_no} has sat overdue since ${r.deadline_at} with nothing to rescue it — closed as expired`, [
|
|
885
|
+
`STRANDED ROUND — PR #${r.pr} round ${r.round_no}`,
|
|
886
|
+
`Overdue since ${r.deadline_at}; its PR was still open and undecided, so the zombie sweep kept skipping it. Nothing reruns an overdue round, so it would have sat there indefinitely.`,
|
|
887
|
+
"The round row is now closed (expired). Its spend still counts. GitHub was NOT touched and the PR was NOT requeued — decide whether this PR still needs a review, and if so trigger one (commands/rerun-round).",
|
|
888
|
+
].join("\n"));
|
|
889
|
+
log(`stranded round closed: #${r.pr} round ${r.round_no} (overdue since ${r.deadline_at})`);
|
|
890
|
+
}
|
|
891
|
+
});
|
|
892
|
+
});
|
|
893
|
+
every(STATUS_TICK_S, writeStatus);
|
|
894
|
+
if (piAuthWatch)
|
|
895
|
+
every(AUTHWATCH_TICK_S, authWatchTick);
|
|
896
|
+
await reconcile();
|
|
897
|
+
},
|
|
898
|
+
async stop(reason) {
|
|
899
|
+
if (stopping)
|
|
900
|
+
return;
|
|
901
|
+
stopping = true;
|
|
902
|
+
log("stopping");
|
|
903
|
+
if (deps.onStop)
|
|
904
|
+
await guard("onStop", async () => deps.onStop(reason));
|
|
905
|
+
for (const t of timers)
|
|
906
|
+
clearInterval(t);
|
|
907
|
+
timers.length = 0;
|
|
908
|
+
load.stop();
|
|
909
|
+
wakePolicy.stop();
|
|
910
|
+
verdicts.stop();
|
|
911
|
+
threadDecisions.stop();
|
|
912
|
+
rechecks.stop();
|
|
913
|
+
if (server)
|
|
914
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
915
|
+
server = null;
|
|
916
|
+
writeStatus();
|
|
917
|
+
store.logEvent("daemon_stop", null, {});
|
|
918
|
+
if (!deps.store)
|
|
919
|
+
store.close();
|
|
920
|
+
},
|
|
921
|
+
};
|
|
922
|
+
}
|
|
923
|
+
// No process entrypoint here, deliberately. An entrypoint in this module
|
|
924
|
+
// would build a real MutationGate against the real config without installing
|
|
925
|
+
// the posting guards or the CI gate. `src/wire.ts` is the production assembly
|
|
926
|
+
// and the only entrypoint that builds a live gate; it installs the guards
|
|
927
|
+
// before it starts. This module stays the stub-wired, test-friendly core.
|
|
928
|
+
// Pinned by `tests/fences-gate.test.ts`.
|
|
929
|
+
//# sourceMappingURL=daemon.js.map
|