@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,247 @@
|
|
|
1
|
+
// The companion the host wrapper runs for a containerised TUI.
|
|
2
|
+
//
|
|
3
|
+
// `qcr tui` in a container has no docker.sock. So the wrapper (scripts/qcr-host.sh,
|
|
4
|
+
// plain sh on the host) starts the companion container itself, and a second
|
|
5
|
+
// container runs the TUI. The wrapper does not know the companion's mounts: the
|
|
6
|
+
// image does, in `CompanionLifecycle`. `qcr companion plan` prints them as text
|
|
7
|
+
// lines the wrapper reads, so the sh side holds no copy of the mount list that
|
|
8
|
+
// could drift from the one tests pin:
|
|
9
|
+
//
|
|
10
|
+
// name <container> the companion container's name
|
|
11
|
+
// plan <hash> fingerprint of the run argv; the container carries it
|
|
12
|
+
// as a label, and a different one means a recreate
|
|
13
|
+
// (mount drift, a new image, a new flag)
|
|
14
|
+
// mkdir <path> a host dir to create as the caller before docker runs
|
|
15
|
+
// (docker would invent it root-owned)
|
|
16
|
+
// tui-mount <path> a host dir the TUI container mounts at its own path
|
|
17
|
+
// tui-volume <v>:<dst> a named volume the TUI container mounts (the tmux socket)
|
|
18
|
+
// tui-env <NAME=value> an env var for the TUI container
|
|
19
|
+
// run <arg> one argument of `docker run`, in order
|
|
20
|
+
//
|
|
21
|
+
// Every path is the host's own, and the TUI container mounts what it shares
|
|
22
|
+
// with the companion at the same path, so the config both derive from the same
|
|
23
|
+
// env resolves identically on either side.
|
|
24
|
+
//
|
|
25
|
+
// The companion's ssh access (rule 8: full ssh) is
|
|
26
|
+
// the three sources the wrapper found on the host and named in `HOST_SSH_ENV`
|
|
27
|
+
// (agent socket, ssh config, known_hosts), mounted read-only by the plan. What
|
|
28
|
+
// the plan never contains: ~/.ssh whole, a private key, docker.sock.
|
|
29
|
+
import { createHash } from "node:crypto";
|
|
30
|
+
import { dirname, isAbsolute, join } from "node:path";
|
|
31
|
+
import { COMPANION_DEFAULTS, type CompanionConfig } from "../config.js";
|
|
32
|
+
import { operatorStateHome } from "../install.js";
|
|
33
|
+
import {
|
|
34
|
+
CompanionLifecycle,
|
|
35
|
+
CONTAINER,
|
|
36
|
+
HOST_SSH_ENV,
|
|
37
|
+
companionInjectDir,
|
|
38
|
+
tmuxVolume,
|
|
39
|
+
type CompanionFs,
|
|
40
|
+
type DockerRunner,
|
|
41
|
+
} from "./companion.js";
|
|
42
|
+
|
|
43
|
+
/** The host's own paths, handed to both containers by the wrapper. */
|
|
44
|
+
export const HOST_ENV_NAMES = [
|
|
45
|
+
"QCR_HOST_HOME",
|
|
46
|
+
"QCR_HOST_XDG_CONFIG_HOME",
|
|
47
|
+
"QCR_HOST_XDG_STATE_HOME",
|
|
48
|
+
] as const;
|
|
49
|
+
|
|
50
|
+
/** The wrapper-run companion has a name and a pi home of its own, so it never
|
|
51
|
+
* adopts, recreates or shares a login with a clone-route companion on the same
|
|
52
|
+
* machine (the owner's dev TUI, `qcr companion up`). */
|
|
53
|
+
export const LAPTOP_COMPANION = {
|
|
54
|
+
container_name: "qcr-tui-companion",
|
|
55
|
+
pihome_volume: "qcr-companion-pihome",
|
|
56
|
+
} as const;
|
|
57
|
+
|
|
58
|
+
function absolute(name: string, value: string | undefined): string {
|
|
59
|
+
const v = (value ?? "").trim();
|
|
60
|
+
if (v === "" || !isAbsolute(v) || /[\n\r]/.test(v))
|
|
61
|
+
throw new Error(`${name} must be an absolute path on one line (got ${JSON.stringify(value)})`);
|
|
62
|
+
return v;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The install env both containers derive their paths from: the host's HOME and
|
|
67
|
+
* XDG dirs, with the config home at `<xdg config>/qcr` (so `profiles/` is the
|
|
68
|
+
* ruled `~/.config/qcr/profiles`) and the state home beside the host's
|
|
69
|
+
* other qcr state. Never the container's own HOME. `QCR_CONFIG` passes through:
|
|
70
|
+
* it names the config the TUI reads, and the companion's mirror is a copy of it.
|
|
71
|
+
*/
|
|
72
|
+
export function laptopInstallEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
|
|
73
|
+
const home = absolute("QCR_HOST_HOME", env["QCR_HOST_HOME"]);
|
|
74
|
+
const xdgConfig = (env["QCR_HOST_XDG_CONFIG_HOME"] ?? "").trim() || join(home, ".config");
|
|
75
|
+
const xdgState = (env["QCR_HOST_XDG_STATE_HOME"] ?? "").trim() || join(home, ".local", "state");
|
|
76
|
+
absolute("QCR_HOST_XDG_CONFIG_HOME", xdgConfig);
|
|
77
|
+
absolute("QCR_HOST_XDG_STATE_HOME", xdgState);
|
|
78
|
+
return {
|
|
79
|
+
HOME: home,
|
|
80
|
+
XDG_CONFIG_HOME: xdgConfig,
|
|
81
|
+
XDG_STATE_HOME: xdgState,
|
|
82
|
+
QCR_CONFIG_HOME: join(xdgConfig, "qcr"),
|
|
83
|
+
QCR_STATE_HOME: join(xdgState, "qcr", "home"),
|
|
84
|
+
...(env["QCR_INSTALL"] ? { QCR_INSTALL: env["QCR_INSTALL"] } : {}),
|
|
85
|
+
...(env["QCR_CONFIG"] ? { QCR_CONFIG: env["QCR_CONFIG"] } : {}),
|
|
86
|
+
// The host's ssh sources the wrapper found (rule 8), for the plan's mounts.
|
|
87
|
+
...Object.fromEntries(
|
|
88
|
+
Object.values(HOST_SSH_ENV)
|
|
89
|
+
.filter((name) => (env[name] ?? "").trim() !== "")
|
|
90
|
+
.map((name) => [name, env[name]]),
|
|
91
|
+
),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The `[companion]` section of the wrapper-run companion: the channels
|
|
97
|
+
* (`feed`, `alerts`, `evidence`, the workspace the inject dir lives in) are
|
|
98
|
+
* host dirs under the operator state home, which no container mounts whole.
|
|
99
|
+
* No tracker and no reviewed repo: under-equipped, never broken.
|
|
100
|
+
*/
|
|
101
|
+
export function laptopCompanionConfig(
|
|
102
|
+
env: NodeJS.ProcessEnv,
|
|
103
|
+
base: CompanionConfig = COMPANION_DEFAULTS,
|
|
104
|
+
): CompanionConfig {
|
|
105
|
+
const ops = join(operatorStateHome(laptopInstallEnv(env)), "companion");
|
|
106
|
+
return {
|
|
107
|
+
...base,
|
|
108
|
+
...LAPTOP_COMPANION,
|
|
109
|
+
image: (env["QCR_IMAGE"] ?? "").trim() || base.image,
|
|
110
|
+
repo_dir: join(ops, "workspace"),
|
|
111
|
+
tracker_dir: "",
|
|
112
|
+
tracker_docs_dir: "",
|
|
113
|
+
reviewed_repo_dir: "",
|
|
114
|
+
evidence_dir: join(ops, "evidence"),
|
|
115
|
+
feed_dir: join(ops, "feed"),
|
|
116
|
+
alerts_dir: join(ops, "alerts"),
|
|
117
|
+
build_context: "",
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// No file of the host is visible to the planner, and none is asked about: a
|
|
122
|
+
// present-or-not decision (the reviewed repo) is already made by the config.
|
|
123
|
+
const NO_HOST_FILES: CompanionFs = {
|
|
124
|
+
exists: () => false,
|
|
125
|
+
read: () => undefined,
|
|
126
|
+
mode: () => undefined,
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
/** The lifecycle of the wrapper-run companion, for a process that has none of
|
|
130
|
+
* the host's files (the planner, or the TUI container). */
|
|
131
|
+
export function laptopLifecycle(
|
|
132
|
+
env: NodeJS.ProcessEnv,
|
|
133
|
+
docker: DockerRunner,
|
|
134
|
+
base?: CompanionConfig,
|
|
135
|
+
/** The planner passes none (no host file is visible to it); the TUI passes
|
|
136
|
+
* the real one, so `syncConfigMirror` finds the config the wrapper mounted. */
|
|
137
|
+
fs: CompanionFs = NO_HOST_FILES,
|
|
138
|
+
): CompanionLifecycle {
|
|
139
|
+
return new CompanionLifecycle(
|
|
140
|
+
laptopCompanionConfig(env, base),
|
|
141
|
+
docker,
|
|
142
|
+
laptopInstallEnv(env),
|
|
143
|
+
() => {},
|
|
144
|
+
fs,
|
|
145
|
+
() => "",
|
|
146
|
+
"tmux-socket",
|
|
147
|
+
).withoutMemory();
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export interface CompanionPlan {
|
|
151
|
+
name: string;
|
|
152
|
+
hash: string;
|
|
153
|
+
mkdirs: string[];
|
|
154
|
+
tuiMounts: string[];
|
|
155
|
+
/** `<volume>:<destination>` */
|
|
156
|
+
tuiVolumes: string[];
|
|
157
|
+
tuiEnv: string[];
|
|
158
|
+
run: string[];
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const noDocker: DockerRunner = async () => ({
|
|
162
|
+
ok: false,
|
|
163
|
+
stdout: "",
|
|
164
|
+
stderr: "the planner runs no docker",
|
|
165
|
+
code: null,
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
/** What the wrapper needs to run the companion and to mount its shared dirs
|
|
169
|
+
* into the TUI container. Pure over `env`. */
|
|
170
|
+
export function companionPlan(env: NodeJS.ProcessEnv): CompanionPlan {
|
|
171
|
+
const lc = laptopLifecycle(env, noDocker);
|
|
172
|
+
const homes = lc.hostHomes();
|
|
173
|
+
const cfg = lc.cfg;
|
|
174
|
+
const inject = dirname(companionInjectDir(cfg));
|
|
175
|
+
const mkdirs = [
|
|
176
|
+
cfg.repo_dir,
|
|
177
|
+
inject,
|
|
178
|
+
cfg.feed_dir,
|
|
179
|
+
cfg.alerts_dir,
|
|
180
|
+
cfg.evidence_dir,
|
|
181
|
+
homes.profiles,
|
|
182
|
+
homes.portrait,
|
|
183
|
+
homes.configMirror,
|
|
184
|
+
homes.state,
|
|
185
|
+
homes.github,
|
|
186
|
+
];
|
|
187
|
+
// What the TUI reads or writes of the companion's files, at the host's paths.
|
|
188
|
+
const tuiMounts = [
|
|
189
|
+
cfg.feed_dir,
|
|
190
|
+
cfg.alerts_dir,
|
|
191
|
+
cfg.evidence_dir,
|
|
192
|
+
inject,
|
|
193
|
+
homes.configMirror,
|
|
194
|
+
homes.state,
|
|
195
|
+
homes.github,
|
|
196
|
+
];
|
|
197
|
+
const run = lc.runArgv();
|
|
198
|
+
// The agent socket's path moves with every login, so the hash names that the
|
|
199
|
+
// companion has one, not where: a TUI started from another shell adopts the
|
|
200
|
+
// running companion. A dead socket fails `docker start`, and the wrapper
|
|
201
|
+
// recreates the container then.
|
|
202
|
+
const agent = lc.sshSources().agent;
|
|
203
|
+
const hashed = run.map((a) =>
|
|
204
|
+
agent !== undefined && a.startsWith(`${agent}:`) ? `<ssh-agent>${a.slice(agent.length)}` : a,
|
|
205
|
+
);
|
|
206
|
+
const hash = createHash("sha256").update(hashed.join("\n")).digest("hex").slice(0, 16);
|
|
207
|
+
// After `run --detach`: the label is read back by the wrapper to tell a
|
|
208
|
+
// current container from a drifted one.
|
|
209
|
+
run.splice(2, 0, "--label", `qcr.plan=${hash}`);
|
|
210
|
+
const installEnv = laptopInstallEnv(env);
|
|
211
|
+
const tuiEnv = [
|
|
212
|
+
...HOST_ENV_NAMES.map((n) => `${n}=${env[n] ?? ""}`).filter((l) => !l.endsWith("=")),
|
|
213
|
+
`QCR_STATE_HOME=${installEnv.QCR_STATE_HOME ?? ""}`,
|
|
214
|
+
...(installEnv["QCR_INSTALL"] ? [`QCR_INSTALL=${installEnv["QCR_INSTALL"]}`] : []),
|
|
215
|
+
`QCR_IMAGE=${cfg.image}`,
|
|
216
|
+
];
|
|
217
|
+
return {
|
|
218
|
+
name: cfg.container_name,
|
|
219
|
+
hash,
|
|
220
|
+
mkdirs: unique(mkdirs),
|
|
221
|
+
tuiMounts: unique(tuiMounts),
|
|
222
|
+
tuiVolumes: [`${tmuxVolume(cfg)}:${CONTAINER.tmuxDir}`],
|
|
223
|
+
tuiEnv,
|
|
224
|
+
run,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function unique(xs: string[]): string[] {
|
|
229
|
+
return [...new Set(xs)];
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** The plan as the lines the wrapper reads. A value with a newline would split
|
|
233
|
+
* a line, so it is refused rather than escaped. */
|
|
234
|
+
export function renderPlan(plan: CompanionPlan): string {
|
|
235
|
+
const lines: Array<[string, string]> = [
|
|
236
|
+
["name", plan.name],
|
|
237
|
+
["plan", plan.hash],
|
|
238
|
+
...plan.mkdirs.map((p): [string, string] => ["mkdir", p]),
|
|
239
|
+
...plan.tuiMounts.map((p): [string, string] => ["tui-mount", p]),
|
|
240
|
+
...plan.tuiVolumes.map((v): [string, string] => ["tui-volume", v]),
|
|
241
|
+
...plan.tuiEnv.map((e): [string, string] => ["tui-env", e]),
|
|
242
|
+
...plan.run.map((a): [string, string] => ["run", a]),
|
|
243
|
+
];
|
|
244
|
+
for (const [kind, value] of lines)
|
|
245
|
+
if (/[\n\r]/.test(value)) throw new Error(`plan: a ${kind} value holds a newline`);
|
|
246
|
+
return lines.map(([k, v]) => `${k} ${v}`).join("\n") + "\n";
|
|
247
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Companion startup healing.
|
|
2
|
+
//
|
|
3
|
+
// The companion's startup can fail and later heal, so asking for it while it
|
|
4
|
+
// is down must re-run the startup rather than shrug. The conversation itself
|
|
5
|
+
// lives in the permanent sidebar column (src/tui/sidebar.ts), so once the
|
|
6
|
+
// retry succeeds there is nothing to open — the column is already on screen
|
|
7
|
+
// and the only thing left to do is give it the keyboard.
|
|
8
|
+
import type { App } from "./app.js";
|
|
9
|
+
|
|
10
|
+
export interface CompanionTabDeps {
|
|
11
|
+
/** Live view of the companion's state — startup may fail and later heal. */
|
|
12
|
+
available: () => boolean;
|
|
13
|
+
/** The real startup error when unavailable (never a mislabel). */
|
|
14
|
+
failure?: () => string | undefined;
|
|
15
|
+
/** Re-runs the full startup (build image if missing, up, rollover, spawn). */
|
|
16
|
+
retry?: () => Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The companion's start, wherever it is asked for — the boot bring-up and
|
|
21
|
+
* the operator's later retry. The feed / alert / tui-actions channels are
|
|
22
|
+
* wired after the first start that leaves the companion up, whichever path
|
|
23
|
+
* that was, so a companion healed by retry gets its view feed, alerts and
|
|
24
|
+
* action channel too. Wired at most once — every wiring chains pollers.
|
|
25
|
+
*
|
|
26
|
+
* A start asked for while another is still in flight joins it rather than
|
|
27
|
+
* starting again: two overlapping starts each run the day rollover, and the
|
|
28
|
+
* later one kills the conversation the earlier one just spawned.
|
|
29
|
+
*/
|
|
30
|
+
export function companionStarter(deps: {
|
|
31
|
+
start: () => Promise<void>;
|
|
32
|
+
up: () => boolean;
|
|
33
|
+
wire: () => Promise<void>;
|
|
34
|
+
}): () => Promise<void> {
|
|
35
|
+
let wired = false;
|
|
36
|
+
let inFlight: Promise<void> | undefined;
|
|
37
|
+
const once = async (): Promise<void> => {
|
|
38
|
+
await deps.start();
|
|
39
|
+
if (wired || !deps.up()) return;
|
|
40
|
+
wired = true;
|
|
41
|
+
await deps.wire();
|
|
42
|
+
};
|
|
43
|
+
return () => {
|
|
44
|
+
inFlight ??= once().finally(() => {
|
|
45
|
+
inFlight = undefined;
|
|
46
|
+
});
|
|
47
|
+
return inFlight;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function installCompanionTabHooks(app: App, deps: CompanionTabDeps): void {
|
|
52
|
+
let retrying = false;
|
|
53
|
+
const notRunning = (theApp: App): void =>
|
|
54
|
+
theApp.notice(`companion not running: ${deps.failure?.() ?? "not started"}`);
|
|
55
|
+
|
|
56
|
+
app.hooks.companionEnsure = async (theApp) => {
|
|
57
|
+
if (deps.available()) {
|
|
58
|
+
theApp.focusCompanion();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// No retry wired, or one already in flight: say what is actually wrong.
|
|
62
|
+
// "not started" is the last resort — a mislabel here points the operator
|
|
63
|
+
// at a cause (such as a --no-companion flag) that is not the real one.
|
|
64
|
+
if (retrying || !deps.retry) {
|
|
65
|
+
notRunning(theApp);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
retrying = true;
|
|
69
|
+
theApp.notice("companion starting…");
|
|
70
|
+
theApp.repaint();
|
|
71
|
+
try {
|
|
72
|
+
await deps.retry();
|
|
73
|
+
} finally {
|
|
74
|
+
retrying = false;
|
|
75
|
+
}
|
|
76
|
+
theApp.repaint();
|
|
77
|
+
if (!deps.available()) {
|
|
78
|
+
notRunning(theApp);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
theApp.focusCompanion();
|
|
82
|
+
};
|
|
83
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// The deploy tab's config-home half: `deploy.sh release <version>` ships the
|
|
2
|
+
// install's config home — config.toml and the profiles/ beside it — to the VM,
|
|
3
|
+
// and the tab says whether the VM runs the one this machine would ship.
|
|
4
|
+
// Both ends are fingerprinted by the same script (`scripts/config-fingerprint.sh`,
|
|
5
|
+
// over `scripts/install-locator.sh`), locally and inside the container; this
|
|
6
|
+
// module only reads and compares the two answers. Pure — shared by the tab's
|
|
7
|
+
// render and the companion feed, so the two can never say different things.
|
|
8
|
+
// The tab also says which post-scan re-tune a pending profile change is, from
|
|
9
|
+
// the setup re-tune log (`setup/retunelog.js`, a type-only leaf of the
|
|
10
|
+
// single-shepherd fence).
|
|
11
|
+
import { retuneLine, type RetuneRecord, type RetunesRead } from "../setup/retunelog.js";
|
|
12
|
+
|
|
13
|
+
/** `scripts/config-fingerprint.sh` output: what a config home ships, as the
|
|
14
|
+
* config file's hash and one hash over every file under its profiles/. */
|
|
15
|
+
export interface ConfigFingerprint {
|
|
16
|
+
config: string;
|
|
17
|
+
profiles: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** One end's config home: its fingerprint; `"none"` when that end has no
|
|
21
|
+
* shippable home (the PC: only a checkout config, so deploy.sh refuses; the
|
|
22
|
+
* VM: nothing was ever shipped, it reads its checkout config); or
|
|
23
|
+
* `"unparseable"` when the script answered something else. */
|
|
24
|
+
export type ConfigRead = ConfigFingerprint | "none" | "unparseable";
|
|
25
|
+
|
|
26
|
+
export function parseConfigFingerprint(stdout: string): ConfigRead {
|
|
27
|
+
const text = stdout.trim();
|
|
28
|
+
if (text === "none") return "none";
|
|
29
|
+
const m = /^config=([0-9a-f]{64}) profiles=([0-9a-f]{64})$/.exec(text);
|
|
30
|
+
return m ? { config: m[1]!, profiles: m[2]! } : "unparseable";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Does the VM run the config home this machine would ship? Honest-unknown both
|
|
35
|
+
* ways: an end that was not read, or read as garbage, makes the
|
|
36
|
+
* answer `unknown` — never "matches" (that would hide an undeployed profile)
|
|
37
|
+
* and never "changed" (that would invent one).
|
|
38
|
+
*/
|
|
39
|
+
export type ConfigDrift =
|
|
40
|
+
| { kind: "unknown"; why: string }
|
|
41
|
+
| { kind: "no-home" }
|
|
42
|
+
| { kind: "never-shipped" }
|
|
43
|
+
| { kind: "same" }
|
|
44
|
+
| { kind: "changed"; config: boolean; profiles: boolean };
|
|
45
|
+
|
|
46
|
+
export function configDrift(local?: ConfigRead, deployed?: ConfigRead): ConfigDrift {
|
|
47
|
+
if (local === undefined)
|
|
48
|
+
return { kind: "unknown", why: "the local config home could not be fingerprinted" };
|
|
49
|
+
if (local === "unparseable")
|
|
50
|
+
return { kind: "unknown", why: "the local config home's fingerprint was unreadable" };
|
|
51
|
+
if (local === "none") return { kind: "no-home" };
|
|
52
|
+
if (deployed === undefined)
|
|
53
|
+
return { kind: "unknown", why: "the VM's config home could not be read (ssh/docker failed)" };
|
|
54
|
+
if (deployed === "unparseable")
|
|
55
|
+
return { kind: "unknown", why: "the VM's config home fingerprint was unreadable" };
|
|
56
|
+
if (deployed === "none") return { kind: "never-shipped" };
|
|
57
|
+
const config = local.config !== deployed.config;
|
|
58
|
+
const profiles = local.profiles !== deployed.profiles;
|
|
59
|
+
return config || profiles ? { kind: "changed", config, profiles } : { kind: "same" };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** The one sentence for a drift — painted in the tab and published to the
|
|
63
|
+
* companion, so the two can never say different things. */
|
|
64
|
+
export function configDriftText(d: ConfigDrift): string {
|
|
65
|
+
switch (d.kind) {
|
|
66
|
+
case "unknown":
|
|
67
|
+
return `unknown — ${d.why}; r retries`;
|
|
68
|
+
case "no-home":
|
|
69
|
+
return "no config home on this machine — deploy refuses until there is one (`qcr install migrate` moves a checkout config.toml there)";
|
|
70
|
+
case "never-shipped":
|
|
71
|
+
return "config home not deployed — the VM still reads its checkout config (the next sync ships the home)";
|
|
72
|
+
case "same":
|
|
73
|
+
return "config home deployed — the VM runs this config and these profiles";
|
|
74
|
+
case "changed":
|
|
75
|
+
return d.profiles && d.config
|
|
76
|
+
? "config.toml and profile changed, not deployed"
|
|
77
|
+
: d.profiles
|
|
78
|
+
? "profile changed, not deployed"
|
|
79
|
+
: "config.toml changed, not deployed";
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ---- the re-tunes a deploy would ship -----------------------------------------
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Which post-scan re-tunes (`<state home>/setup/retunes.json`, written by the
|
|
87
|
+
* companion's `setup_retune`) the VM does not run yet. The config drift is the
|
|
88
|
+
* authority on whether the profile is behind; the re-tune log only says which
|
|
89
|
+
* change that is, so it is consulted only while the profile is (or may be)
|
|
90
|
+
* behind:
|
|
91
|
+
*
|
|
92
|
+
* - drift `same`, `no-home`, or only config.toml changed → none: the VM runs
|
|
93
|
+
* these profiles (or nothing could ship them);
|
|
94
|
+
* - `never-shipped` → every logged re-tune that wrote a file is pending;
|
|
95
|
+
* - profiles `changed` → those written after the VM's last deploy (the
|
|
96
|
+
* BUILD_SHA marker's time, written on this machine by deploy.sh); with no
|
|
97
|
+
* readable deploy time, the latest re-tune, as unknown;
|
|
98
|
+
* - drift `unknown` → the re-tunes since the last deploy, as unknown (with
|
|
99
|
+
* no readable deploy time either, the latest re-tune, as unknown).
|
|
100
|
+
*
|
|
101
|
+
* An unreadable log is unknown with its reason, never "no re-tunes".
|
|
102
|
+
*/
|
|
103
|
+
export type PendingRetunes =
|
|
104
|
+
| { state: "none" }
|
|
105
|
+
| { state: "pending"; retunes: RetuneRecord[] }
|
|
106
|
+
| { state: "unknown"; why: string; retunes: RetuneRecord[] };
|
|
107
|
+
|
|
108
|
+
export function pendingRetunes(
|
|
109
|
+
log: RetunesRead | undefined,
|
|
110
|
+
drift: ConfigDrift,
|
|
111
|
+
deployedAt: string | undefined,
|
|
112
|
+
): PendingRetunes {
|
|
113
|
+
if (drift.kind === "same" || drift.kind === "no-home") return { state: "none" };
|
|
114
|
+
if (drift.kind === "changed" && !drift.profiles) return { state: "none" };
|
|
115
|
+
if (log === undefined || log.state === "absent") return { state: "none" };
|
|
116
|
+
if (log.state === "unreadable") return { state: "unknown", why: log.error, retunes: [] };
|
|
117
|
+
const written = log.retunes.filter((r) => r.files.length > 0);
|
|
118
|
+
if (written.length === 0) return { state: "none" };
|
|
119
|
+
if (drift.kind === "never-shipped") return { state: "pending", retunes: written };
|
|
120
|
+
// Compared as instants, never as strings: the BUILD_SHA marker is written
|
|
121
|
+
// to the second (`…:32Z`) and a re-tune to the millisecond (`…:32.123Z`),
|
|
122
|
+
// so a string compare reads a re-tune in the deploy's own second as shipped.
|
|
123
|
+
const deployed = deployedAt === undefined ? Number.NaN : Date.parse(deployedAt);
|
|
124
|
+
const known = Number.isFinite(deployed);
|
|
125
|
+
const since = known ? written.filter((r) => !(Date.parse(r.at) < deployed)) : [];
|
|
126
|
+
if (!known) {
|
|
127
|
+
const why =
|
|
128
|
+
drift.kind === "unknown"
|
|
129
|
+
? `${drift.why}; when the VM was last deployed is unknown`
|
|
130
|
+
: "when the VM was last deployed is unknown";
|
|
131
|
+
return { state: "unknown", why, retunes: written.slice(-1) };
|
|
132
|
+
}
|
|
133
|
+
if (drift.kind === "unknown") {
|
|
134
|
+
return since.length === 0
|
|
135
|
+
? { state: "none" }
|
|
136
|
+
: { state: "unknown", why: drift.why, retunes: since };
|
|
137
|
+
}
|
|
138
|
+
return since.length === 0 ? { state: "none" } : { state: "pending", retunes: since };
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** The deploy tab's lines for the pending re-tunes (plain text; the tab inks
|
|
142
|
+
* them). Each re-tune, then each change with its reason. */
|
|
143
|
+
export function pendingRetuneLines(p: PendingRetunes): string[] {
|
|
144
|
+
if (p.state === "none") return [];
|
|
145
|
+
const head =
|
|
146
|
+
p.state === "pending"
|
|
147
|
+
? `${p.retunes.length} post-scan re-tune${p.retunes.length === 1 ? "" : "s"} not deployed — a release ships ${p.retunes.length === 1 ? "it" : "them"}:`
|
|
148
|
+
: `whether these re-tunes are deployed is unknown — ${p.why}`;
|
|
149
|
+
const out = [head];
|
|
150
|
+
for (const r of p.retunes) {
|
|
151
|
+
out.push(` ${retuneLine(r)}`);
|
|
152
|
+
for (const c of r.changes) out.push(` ${c.input}: ${c.from} → ${c.to} — ${c.why}`);
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// VM ssh bootstrap — the GCP metadata key (~/.ssh/google_compute_engine)
|
|
2
|
+
// is passphrase-protected, and every TUI ssh runs BatchMode (fail-fast, no
|
|
3
|
+
// prompts). The passphrase therefore gets entered exactly once, here, on the
|
|
4
|
+
// operator's real terminal: `ssh <host> true` births the ControlMaster socket
|
|
5
|
+
// the ssh config then shares for 4h (ControlPersist), and every poll/digest
|
|
6
|
+
// ssh rides it.
|
|
7
|
+
//
|
|
8
|
+
// This is only reached from the board (key s), never from the startup path:
|
|
9
|
+
// nothing external may gate the first frame, so startup runs the
|
|
10
|
+
// non-interactive triage in `sshtriage.ts` instead and reports the cause and
|
|
11
|
+
// the exact remedy; pressing `s` is the operator asking for this prompt.
|
|
12
|
+
import { spawnSync } from "node:child_process";
|
|
13
|
+
import type { TuiConfig } from "../config.js";
|
|
14
|
+
import { transportOf } from "./remote.js";
|
|
15
|
+
|
|
16
|
+
export function masterCheckArgv(cfg: TuiConfig): string[] {
|
|
17
|
+
return ["-O", "check", cfg.ssh_host];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function masterConnectArgv(cfg: TuiConfig): string[] {
|
|
21
|
+
return ["-o", "ConnectTimeout=15", cfg.ssh_host, "true"];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface ConnectResult {
|
|
25
|
+
/** `"local"`: `[tui] target = "local"` — there is no master to
|
|
26
|
+
* establish and no ssh process is ever spawned; the call is a silent no-op. */
|
|
27
|
+
kind: "alive" | "connected" | "failed" | "local";
|
|
28
|
+
detail?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Synchronous ssh — interactive runs inherit the terminal so OpenSSH's own
|
|
32
|
+
* passphrase prompt appears natively. Injectable; tests never spawn. */
|
|
33
|
+
export type SyncSsh = (
|
|
34
|
+
argv: string[],
|
|
35
|
+
interactive: boolean,
|
|
36
|
+
) => { status: number | null; stderr: string };
|
|
37
|
+
|
|
38
|
+
export const realSyncSsh: SyncSsh = (argv, interactive) => {
|
|
39
|
+
const r = interactive
|
|
40
|
+
? spawnSync("ssh", argv, { stdio: "inherit" })
|
|
41
|
+
: spawnSync("ssh", argv, { stdio: ["ignore", "ignore", "pipe"], timeout: 10_000 });
|
|
42
|
+
return { status: r.status, stderr: String(r.stderr ?? "") };
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export function ensureSshMaster(
|
|
46
|
+
cfg: TuiConfig,
|
|
47
|
+
ssh: SyncSsh = realSyncSsh,
|
|
48
|
+
say: (line: string) => void = console.log,
|
|
49
|
+
): ConnectResult {
|
|
50
|
+
// The laptop topology has no ssh anywhere. Guarded here (not only
|
|
51
|
+
// at the call sites) so the board's `s` reconnect hook and any future caller
|
|
52
|
+
// inherit the guarantee: in local mode this function spawns nothing.
|
|
53
|
+
if (transportOf(cfg) === "local") return { kind: "local" };
|
|
54
|
+
if (ssh(masterCheckArgv(cfg), false).status === 0) return { kind: "alive" };
|
|
55
|
+
say(
|
|
56
|
+
`connecting to ${cfg.ssh_host} — enter the GCP key passphrase if asked (once; the connection is shared for 4h)`,
|
|
57
|
+
);
|
|
58
|
+
const r = ssh(masterConnectArgv(cfg), true);
|
|
59
|
+
if (r.status === 0) {
|
|
60
|
+
say(`connected — ssh master to ${cfg.ssh_host} established`);
|
|
61
|
+
return { kind: "connected" };
|
|
62
|
+
}
|
|
63
|
+
const detail = r.stderr.trim() || `ssh exit ${String(r.status)}`;
|
|
64
|
+
say(
|
|
65
|
+
`ssh to ${cfg.ssh_host} failed: ${detail} — the board will show unreachable (press s to retry)`,
|
|
66
|
+
);
|
|
67
|
+
return { kind: "failed", detail };
|
|
68
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// Durable ownership journal for the TUI's deploy ceremony. Hot reload re-execs
|
|
2
|
+
// the TUI unconditionally, so drain ownership cannot live only in a closure:
|
|
3
|
+
// losing it would leave the daemon drained with no visible continuation.
|
|
4
|
+
import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { dirname } from "node:path";
|
|
6
|
+
|
|
7
|
+
/** Every phase the journal may hold — the type and the reader's check both
|
|
8
|
+
* come from this one list, so a phase the TUI can write is one it can read. */
|
|
9
|
+
export const DURABLE_DEPLOY_PHASES = [
|
|
10
|
+
"engaging-drain",
|
|
11
|
+
"abort-requested",
|
|
12
|
+
"waiting-rounds",
|
|
13
|
+
"syncing",
|
|
14
|
+
"awaiting-lift",
|
|
15
|
+
"deploy-failed",
|
|
16
|
+
"drain-failed",
|
|
17
|
+
"lifting-after-abort",
|
|
18
|
+
] as const;
|
|
19
|
+
|
|
20
|
+
export type DurableDeployPhase = (typeof DURABLE_DEPLOY_PHASES)[number];
|
|
21
|
+
|
|
22
|
+
export interface DeployCeremonyRecord {
|
|
23
|
+
version: 1;
|
|
24
|
+
phase: DurableDeployPhase;
|
|
25
|
+
/** The release version the ceremony ships; the detached runner is started
|
|
26
|
+
* with it, so a reload mid-ceremony still knows what it was shipping. */
|
|
27
|
+
target_version?: string;
|
|
28
|
+
/** Snapshot that proved the pre-deploy drain. Auto-lift must be observed on
|
|
29
|
+
* a strictly newer daemon generation, never inferred from this one. */
|
|
30
|
+
pre_deploy_snapshot_at?: string;
|
|
31
|
+
/** True only after a fresh status snapshot visibly showed the drain ON. */
|
|
32
|
+
drain_observed?: boolean;
|
|
33
|
+
/** First fresh undrained snapshot seen after the command receipt. A second
|
|
34
|
+
* newer one proves an external drain-off even if ON was never observed. */
|
|
35
|
+
first_undrained_snapshot_at?: string;
|
|
36
|
+
/** Stable local detached-process identity; survives mandatory TUI re-exec. */
|
|
37
|
+
deploy_run_id?: string;
|
|
38
|
+
updated_at: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface DeployCeremonyStore {
|
|
42
|
+
read(): DeployCeremonyRecord | undefined;
|
|
43
|
+
write(record: DeployCeremonyRecord): void;
|
|
44
|
+
clear(): void;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function valid(value: unknown): value is DeployCeremonyRecord {
|
|
48
|
+
if (!value || typeof value !== "object") return false;
|
|
49
|
+
const v = value as Record<string, unknown>;
|
|
50
|
+
return (
|
|
51
|
+
v.version === 1 &&
|
|
52
|
+
typeof v.phase === "string" &&
|
|
53
|
+
(DURABLE_DEPLOY_PHASES as readonly string[]).includes(v.phase) &&
|
|
54
|
+
(v.target_version === undefined || typeof v.target_version === "string") &&
|
|
55
|
+
(v.pre_deploy_snapshot_at === undefined || typeof v.pre_deploy_snapshot_at === "string") &&
|
|
56
|
+
(v.drain_observed === undefined || typeof v.drain_observed === "boolean") &&
|
|
57
|
+
(v.first_undrained_snapshot_at === undefined ||
|
|
58
|
+
typeof v.first_undrained_snapshot_at === "string") &&
|
|
59
|
+
(v.deploy_run_id === undefined || typeof v.deploy_run_id === "string") &&
|
|
60
|
+
typeof v.updated_at === "string"
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export class MemoryDeployCeremonyStore implements DeployCeremonyStore {
|
|
65
|
+
private record: DeployCeremonyRecord | undefined;
|
|
66
|
+
read(): DeployCeremonyRecord | undefined {
|
|
67
|
+
return this.record;
|
|
68
|
+
}
|
|
69
|
+
write(record: DeployCeremonyRecord): void {
|
|
70
|
+
this.record = { ...record };
|
|
71
|
+
}
|
|
72
|
+
clear(): void {
|
|
73
|
+
this.record = undefined;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export class FileDeployCeremonyStore implements DeployCeremonyStore {
|
|
78
|
+
constructor(private readonly path: string) {}
|
|
79
|
+
|
|
80
|
+
read(): DeployCeremonyRecord | undefined {
|
|
81
|
+
try {
|
|
82
|
+
const value: unknown = JSON.parse(readFileSync(this.path, "utf8"));
|
|
83
|
+
return valid(value) ? value : undefined;
|
|
84
|
+
} catch {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
write(record: DeployCeremonyRecord): void {
|
|
90
|
+
mkdirSync(dirname(this.path), { recursive: true });
|
|
91
|
+
const tmp = `${this.path}.tmp-${process.pid}`;
|
|
92
|
+
writeFileSync(tmp, `${JSON.stringify(record, null, 2)}\n`, { mode: 0o600 });
|
|
93
|
+
renameSync(tmp, this.path);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
clear(): void {
|
|
97
|
+
try {
|
|
98
|
+
rmSync(this.path, { force: true });
|
|
99
|
+
} catch {
|
|
100
|
+
// A journal cleanup failure cannot change daemon state. A stale journal
|
|
101
|
+
// is safer than forgetting a drain and is re-evaluated on next boot.
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|