@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,767 @@
|
|
|
1
|
+
// Daily rollover — a fresh companion conversation per ops day, with the five
|
|
2
|
+
// carry items handed over as the first message.
|
|
3
|
+
//
|
|
4
|
+
// Rollover fires on the first TUI start of a new day
|
|
5
|
+
// (ops timezone), never mid-use; the sequence is the rotateOverseer pattern from
|
|
6
|
+
// src/sessions.ts — archive the run date-stamped, kill the tmux session,
|
|
7
|
+
// respawn — and the opening context carries: yesterday's EOD digest, the
|
|
8
|
+
// compacted summary of yesterday's conversation, yesterday's conversation
|
|
9
|
+
// tail, unresolved alerts, and the live board snapshot (plus the alert knobs
|
|
10
|
+
// in force, so the companion's tiering matches the config it is judged by).
|
|
11
|
+
//
|
|
12
|
+
// Everything the container owns goes through the DockerRunner seam (the pihome
|
|
13
|
+
// volume is only reachable via `docker exec`); everything the host owns is a
|
|
14
|
+
// plain path, so the tests need neither docker nor pi.
|
|
15
|
+
//
|
|
16
|
+
// The day-open text is delivered as an inject file, not a pi CLI flag:
|
|
17
|
+
// `extensions/inject-bridge.ts` drains its directory on `session_start`
|
|
18
|
+
// (VERIFY-ON-PIN: the drain-then-watch behaviour depends only on our own code,
|
|
19
|
+
// but `pi.sendUserMessage` and the `session_start` event name are pi's), so
|
|
20
|
+
// writing the file before spawning pi is race-free. The alternative — a pi CLI
|
|
21
|
+
// initial-message flag — is undocumented for 0.84.1; if one turns up it is a
|
|
22
|
+
// drop-in replacement for writeDayOpen().
|
|
23
|
+
import { stripModelDocs } from "@quickchatai/pi-quickreview/src/promptdoc.js";
|
|
24
|
+
import { isNoTmuxServer } from "../tmux.js";
|
|
25
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync, } from "node:fs";
|
|
26
|
+
import { dirname, join } from "node:path";
|
|
27
|
+
import { zoneDateString } from "../eod.js";
|
|
28
|
+
import { parseAlert, readPolicyState } from "./alerts.js";
|
|
29
|
+
import { CONTAINER, companionSessionDir, dockerFailureLine as execReason, } from "./companion.js";
|
|
30
|
+
function errText(err) {
|
|
31
|
+
return err instanceof Error ? err.message : String(err);
|
|
32
|
+
}
|
|
33
|
+
/** Bounds for the compacted summary and the raw tail — the opening message is
|
|
34
|
+
* a briefing, not a transcript. */
|
|
35
|
+
export const SUMMARY_MAX_CHARS = 4000;
|
|
36
|
+
export const TAIL_MAX_CHARS = 2000;
|
|
37
|
+
export const TURN_MAX_CHARS = 400;
|
|
38
|
+
export const HEAD_TURNS = 6;
|
|
39
|
+
export const TAIL_TURNS = 12;
|
|
40
|
+
/**
|
|
41
|
+
* The rollover state, with "there is no state" and "the state is unreadable"
|
|
42
|
+
* kept apart.
|
|
43
|
+
*
|
|
44
|
+
* This is the read that gates the rollover itself, so collapsing it defeats
|
|
45
|
+
* it: an unparseable `rollover.json` read as absent would look exactly like a
|
|
46
|
+
* fresh installation, `decideRollover` would say `first-run`, and the run
|
|
47
|
+
* would record today's date over it and never retry. Worse,
|
|
48
|
+
* `interviewDue(marker, undefined)` is true, so a torn state file could
|
|
49
|
+
* re-fire the first-run interview at a months-old install.
|
|
50
|
+
*
|
|
51
|
+
* A structurally invalid payload (no usable `last_open_date`) is unreadable,
|
|
52
|
+
* not absent — the file is there, we simply cannot understand it.
|
|
53
|
+
*/
|
|
54
|
+
export function readRolloverStateFile(path) {
|
|
55
|
+
let text;
|
|
56
|
+
try {
|
|
57
|
+
text = readFileSync(path, "utf8");
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
const code = err?.code;
|
|
61
|
+
if (code === "ENOENT")
|
|
62
|
+
return { state: "absent" };
|
|
63
|
+
return { state: "unreadable", reason: code ?? errText(err) };
|
|
64
|
+
}
|
|
65
|
+
let parsed;
|
|
66
|
+
try {
|
|
67
|
+
parsed = JSON.parse(text);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
return { state: "unreadable", reason: errText(err) };
|
|
71
|
+
}
|
|
72
|
+
// `null`, a number, an array: valid JSON, still not a state row. Without
|
|
73
|
+
// this the property read below throws past the catch above.
|
|
74
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
75
|
+
return { state: "unreadable", reason: "not a JSON object" };
|
|
76
|
+
}
|
|
77
|
+
const raw = parsed;
|
|
78
|
+
if (typeof raw.last_open_date !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(raw.last_open_date)) {
|
|
79
|
+
return { state: "unreadable", reason: "no usable last_open_date" };
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
state: "state",
|
|
83
|
+
value: {
|
|
84
|
+
last_open_date: raw.last_open_date,
|
|
85
|
+
updated_at: String(raw.updated_at ?? ""),
|
|
86
|
+
last_archive: raw.last_archive,
|
|
87
|
+
...(typeof raw.first_run_interviewed === "string"
|
|
88
|
+
? { first_run_interviewed: raw.first_run_interviewed }
|
|
89
|
+
: {}),
|
|
90
|
+
...(typeof raw.first_run_owed === "string" ? { first_run_owed: raw.first_run_owed } : {}),
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/** Absent or unreadable ⇒ undefined. For read-back and display only: anything
|
|
95
|
+
* that decides from the state must use `readRolloverStateFile` — see there. */
|
|
96
|
+
export function readRolloverState(path) {
|
|
97
|
+
const r = readRolloverStateFile(path);
|
|
98
|
+
return r.state === "state" ? r.value : undefined;
|
|
99
|
+
}
|
|
100
|
+
export function writeRolloverState(path, state) {
|
|
101
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
102
|
+
const tmp = `${path}.tmp`;
|
|
103
|
+
writeFileSync(tmp, `${JSON.stringify(state, null, 2)}\n`);
|
|
104
|
+
renameSync(tmp, path);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Today's calendar date in the operations timezone (`cfg.ops.timezone`;
|
|
108
|
+
* the TUI threads it through — the UTC default only covers callers
|
|
109
|
+
* with no config in hand). `QCR_FAKE_TODAY=YYYY-MM-DD` overrides it — the
|
|
110
|
+
* only way to exercise a rollover without waiting for midnight (the smoke
|
|
111
|
+
* script uses exactly this).
|
|
112
|
+
*/
|
|
113
|
+
export function todayDate(now, env = process.env, timeZone = "UTC") {
|
|
114
|
+
const fake = env.QCR_FAKE_TODAY?.trim();
|
|
115
|
+
if (fake && /^\d{4}-\d{2}-\d{2}$/.test(fake))
|
|
116
|
+
return fake;
|
|
117
|
+
return zoneDateString(now, timeZone);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Pure decision: string compare is correct for ISO dates, and a clock that
|
|
121
|
+
* went backwards (previous > today) is treated as same-day, never a rotate.
|
|
122
|
+
*
|
|
123
|
+
* It takes the read, not a `RolloverState | undefined`, on purpose: handed the
|
|
124
|
+
* collapsed value it cannot tell a fresh installation from a torn state file,
|
|
125
|
+
* and those two want opposite behaviour (record today vs. touch nothing).
|
|
126
|
+
*/
|
|
127
|
+
export function decideRollover(today, read) {
|
|
128
|
+
if (read.state === "unreadable")
|
|
129
|
+
return { kind: "unknown", today, reason: read.reason };
|
|
130
|
+
if (read.state === "absent")
|
|
131
|
+
return { kind: "first-run", today };
|
|
132
|
+
if (read.value.last_open_date >= today)
|
|
133
|
+
return { kind: "same-day", today };
|
|
134
|
+
return { kind: "rollover", today, previous: read.value.last_open_date };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Extract the user/assistant text turns from a pi session .jsonl.
|
|
138
|
+
*
|
|
139
|
+
* VERIFY-ON-PIN: the on-disk session-file schema is not documented for 0.84.1.
|
|
140
|
+
* Three shapes are accepted (`{role,content}`, `{type:"message",message:{…}}`,
|
|
141
|
+
* `{entry:{role,content}}`) and content may be a string or an array of
|
|
142
|
+
* `{type:"text",text}` parts. An unrecognised line is skipped, so a schema
|
|
143
|
+
* drift degrades the summary rather than breaking the rollover.
|
|
144
|
+
*/
|
|
145
|
+
export function parseConversation(jsonl) {
|
|
146
|
+
const turns = [];
|
|
147
|
+
for (const line of jsonl.split("\n")) {
|
|
148
|
+
if (line.trim() === "")
|
|
149
|
+
continue;
|
|
150
|
+
let obj;
|
|
151
|
+
try {
|
|
152
|
+
obj = JSON.parse(line);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const node = unwrap(obj);
|
|
158
|
+
if (!node)
|
|
159
|
+
continue;
|
|
160
|
+
const role = node.role;
|
|
161
|
+
if (role !== "user" && role !== "assistant")
|
|
162
|
+
continue;
|
|
163
|
+
const text = contentText(node.content).trim();
|
|
164
|
+
if (text === "")
|
|
165
|
+
continue;
|
|
166
|
+
turns.push({ role, text });
|
|
167
|
+
}
|
|
168
|
+
return turns;
|
|
169
|
+
}
|
|
170
|
+
function unwrap(obj) {
|
|
171
|
+
if (typeof obj !== "object" || obj === null || Array.isArray(obj))
|
|
172
|
+
return undefined;
|
|
173
|
+
const v = obj;
|
|
174
|
+
for (const inner of [v, v.message, v.entry]) {
|
|
175
|
+
if (typeof inner === "object" && inner !== null && !Array.isArray(inner)) {
|
|
176
|
+
const cand = inner;
|
|
177
|
+
if (typeof cand.role === "string")
|
|
178
|
+
return cand;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
function contentText(content) {
|
|
184
|
+
if (typeof content === "string")
|
|
185
|
+
return content;
|
|
186
|
+
if (!Array.isArray(content))
|
|
187
|
+
return "";
|
|
188
|
+
const parts = [];
|
|
189
|
+
for (const part of content) {
|
|
190
|
+
if (typeof part === "string")
|
|
191
|
+
parts.push(part);
|
|
192
|
+
else if (typeof part === "object" && part !== null) {
|
|
193
|
+
const p = part;
|
|
194
|
+
if (typeof p.text === "string")
|
|
195
|
+
parts.push(p.text);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return parts.join("\n");
|
|
199
|
+
}
|
|
200
|
+
function oneLine(text, max = TURN_MAX_CHARS) {
|
|
201
|
+
const flat = text.replace(/\s+/g, " ").trim();
|
|
202
|
+
return flat.length <= max ? flat : `${flat.slice(0, max - 1)}…`;
|
|
203
|
+
}
|
|
204
|
+
/** The user-turn role label: the configured owner name, or the
|
|
205
|
+
* neutral role when none is configured. */
|
|
206
|
+
function ownerLabel(ownerName) {
|
|
207
|
+
return ownerName?.trim() || "the operator";
|
|
208
|
+
}
|
|
209
|
+
/** Renders turns in chronological order within a character budget. `keep`
|
|
210
|
+
* says which end survives when the budget runs out: an opening keeps its
|
|
211
|
+
* oldest turns, an ending its newest. */
|
|
212
|
+
function renderTurns(turns, budget, ownerName, keep = "oldest") {
|
|
213
|
+
const ordered = keep === "oldest" ? turns : [...turns].reverse();
|
|
214
|
+
const lines = [];
|
|
215
|
+
let used = 0;
|
|
216
|
+
for (const t of ordered) {
|
|
217
|
+
const line = `- **${t.role === "user" ? ownerLabel(ownerName) : "you"}**: ${oneLine(t.text)}`;
|
|
218
|
+
if (used + line.length > budget)
|
|
219
|
+
break;
|
|
220
|
+
lines.push(line);
|
|
221
|
+
used += line.length + 1;
|
|
222
|
+
}
|
|
223
|
+
if (keep === "newest")
|
|
224
|
+
lines.reverse();
|
|
225
|
+
return lines.join("\n");
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Deterministic compaction — no LLM in this path (the daemon's rule applies to
|
|
229
|
+
* the TUI too). Head + tail sectioning with a hard character budget: the
|
|
230
|
+
* opening of the day tells the companion how yesterday started, how it ended,
|
|
231
|
+
* and how much it is not being shown.
|
|
232
|
+
*/
|
|
233
|
+
export function compactConversation(turns, budget = SUMMARY_MAX_CHARS, ownerName) {
|
|
234
|
+
if (turns.length === 0)
|
|
235
|
+
return "";
|
|
236
|
+
const head = turns.slice(0, HEAD_TURNS);
|
|
237
|
+
const tail = turns.length > HEAD_TURNS ? turns.slice(Math.max(HEAD_TURNS, turns.length - TAIL_TURNS)) : [];
|
|
238
|
+
const skipped = turns.length - head.length - tail.length;
|
|
239
|
+
const half = Math.floor((budget - 200) / 2);
|
|
240
|
+
const sections = [
|
|
241
|
+
`Yesterday: ${turns.length} turns (${turns.filter((t) => t.role === "user").length} from ${ownerLabel(ownerName)}).`,
|
|
242
|
+
];
|
|
243
|
+
sections.push(`**How it opened**\n${renderTurns(head, half, ownerName)}`);
|
|
244
|
+
if (skipped > 0)
|
|
245
|
+
sections.push(`…${skipped} turn${skipped === 1 ? "" : "s"} elided…`);
|
|
246
|
+
if (tail.length > 0)
|
|
247
|
+
sections.push(`**How it ended**\n${renderTurns(tail, half, ownerName, "newest")}`);
|
|
248
|
+
const out = sections.join("\n\n");
|
|
249
|
+
return out.length <= budget ? out : `${out.slice(0, budget - 1)}…`;
|
|
250
|
+
}
|
|
251
|
+
/** The raw last few turns, verbatim-ish and bounded — the carry item that is
|
|
252
|
+
* deliberately not summarised. */
|
|
253
|
+
export function conversationTail(turns, budget = TAIL_MAX_CHARS) {
|
|
254
|
+
if (turns.length === 0)
|
|
255
|
+
return "";
|
|
256
|
+
return renderTurns(turns.slice(-6), budget, undefined, "newest");
|
|
257
|
+
}
|
|
258
|
+
// ---- the other carry items --------------------------------------------------
|
|
259
|
+
export function readSnapshot(feedDir) {
|
|
260
|
+
try {
|
|
261
|
+
return JSON.parse(readFileSync(join(feedDir, "snapshot.json"), "utf8"));
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
return undefined;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/** One paragraph of board state: counts by state, rounds, mode, spend. */
|
|
268
|
+
export function snapshotSummary(snap) {
|
|
269
|
+
if (!snap)
|
|
270
|
+
return "";
|
|
271
|
+
const byState = new Map();
|
|
272
|
+
for (const p of snap.prs)
|
|
273
|
+
byState.set(p.state, (byState.get(p.state) ?? 0) + 1);
|
|
274
|
+
const states = [...byState.entries()]
|
|
275
|
+
.sort((a, b) => (a[0] < b[0] ? -1 : 1))
|
|
276
|
+
.map(([s, n]) => `${n} ${s}`);
|
|
277
|
+
const lines = [
|
|
278
|
+
`${snap.prs.length} tracked PR${snap.prs.length === 1 ? "" : "s"}${states.length > 0 ? ` (${states.join(", ")})` : ""}; ` +
|
|
279
|
+
`${snap.running_rounds} round${snap.running_rounds === 1 ? "" : "s"} running; mode ${snap.dry_run ? "dry-run" : "LIVE"}; ` +
|
|
280
|
+
`spend $${snap.total_spend_usd.toFixed(2)} total${snap.today_spend_usd !== undefined ? ` / $${snap.today_spend_usd.toFixed(2)} today` : ""}.`,
|
|
281
|
+
`Snapshot written ${snap.written_at}.`,
|
|
282
|
+
];
|
|
283
|
+
const notable = snap.prs
|
|
284
|
+
.filter((p) => p.state !== "closed")
|
|
285
|
+
.slice(0, 8)
|
|
286
|
+
.map((p) => `- #${p.number} ${p.state}${p.last_verdict ? ` (${p.last_verdict})` : ""}${p.paused ? " [paused]" : ""} — ${oneLine(p.title ?? "", 70)}`);
|
|
287
|
+
return [...lines, ...notable].join("\n");
|
|
288
|
+
}
|
|
289
|
+
/** Digest headline: the feed snapshot carries the daemon's own copy; a local
|
|
290
|
+
* digest/ dir is the offline fallback. Neither → degraded to "—". */
|
|
291
|
+
export function digestLine(snap, localHeadline) {
|
|
292
|
+
return (snap?.digest_headline ?? "").trim() || (localHeadline ?? "").trim();
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Alerts that are still open at the moment of rollover: anything sitting
|
|
296
|
+
* unconsumed in the alerts dir, plus every `alert`-tier cause the policy state
|
|
297
|
+
* saw on a previous day (a cause that fired yesterday evening and was never
|
|
298
|
+
* spoken to is exactly the thing a fresh conversation would otherwise forget).
|
|
299
|
+
*/
|
|
300
|
+
export function openAlerts(alertsDir, policyStatePath, today) {
|
|
301
|
+
const lines = [];
|
|
302
|
+
if (existsSync(alertsDir)) {
|
|
303
|
+
for (const f of readdirSync(alertsDir)
|
|
304
|
+
.filter((n) => n.endsWith(".json") && !n.startsWith("."))
|
|
305
|
+
.sort()) {
|
|
306
|
+
let parsed;
|
|
307
|
+
try {
|
|
308
|
+
parsed = parseAlert(readFileSync(join(alertsDir, f), "utf8"), f);
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (parsed.ok)
|
|
314
|
+
lines.push(`- [${parsed.alert.tier}] ${parsed.alert.title}${parsed.alert.pr !== null ? ` (PR #${parsed.alert.pr})` : ""} — cause \`${parsed.alert.cause}\` (unread)`);
|
|
315
|
+
else
|
|
316
|
+
lines.push(`- [malformed] ${f}: ${parsed.error}`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
const policy = readPolicyState(policyStatePath);
|
|
320
|
+
if (policy && policy.day !== today) {
|
|
321
|
+
for (const [cause, mem] of Object.entries(policy.causes)) {
|
|
322
|
+
if (mem.lastTier !== "alert")
|
|
323
|
+
continue;
|
|
324
|
+
lines.push(`- [alert] cause \`${cause}\` last raised ${policy.day}${mem.folds > 0 ? ` (+${mem.folds} folded repeats)` : ""} — carried over`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return lines.join("\n");
|
|
328
|
+
}
|
|
329
|
+
/** The knobs the companion's tiering is judged against, verbatim from config. */
|
|
330
|
+
export function alertKnobs(cfg) {
|
|
331
|
+
return [
|
|
332
|
+
`- overdue grace: ${cfg.overdue_grace_min} min`,
|
|
333
|
+
`- stale daemon: ${cfg.stale_alert_s} s`,
|
|
334
|
+
`- awaiting age: ${cfg.awaiting_age_h} h`,
|
|
335
|
+
`- per-cause cooldown: ${cfg.cooldown_min} min`,
|
|
336
|
+
].join("\n");
|
|
337
|
+
}
|
|
338
|
+
const PLACEHOLDERS = [
|
|
339
|
+
"date",
|
|
340
|
+
"digest",
|
|
341
|
+
"yesterday_summary",
|
|
342
|
+
"yesterday_tail",
|
|
343
|
+
"open_alerts",
|
|
344
|
+
"snapshot_summary",
|
|
345
|
+
"alert_knobs",
|
|
346
|
+
];
|
|
347
|
+
/** Fill a companion template: the model docs stripped, each `{{key}}` in
|
|
348
|
+
* `keys` replaced by its trimmed source, and an empty source rendered as `—`
|
|
349
|
+
* — a missing item is stated, never silent. */
|
|
350
|
+
function renderTemplate(template, keys, sources) {
|
|
351
|
+
let out = stripModelDocs(template);
|
|
352
|
+
for (const key of keys) {
|
|
353
|
+
const value = (sources[key] ?? "").trim();
|
|
354
|
+
out = out.replaceAll(`{{${key}}}`, value === "" ? "—" : value);
|
|
355
|
+
}
|
|
356
|
+
return out;
|
|
357
|
+
}
|
|
358
|
+
/** Fill prompts/companion-day-open.md. An empty source renders as `—`, per the
|
|
359
|
+
* template's own header — a missing carry item is stated, never silent. */
|
|
360
|
+
export function renderDayOpen(template, sources) {
|
|
361
|
+
return renderTemplate(template, PLACEHOLDERS, sources);
|
|
362
|
+
}
|
|
363
|
+
/** The inject file the bridge will deliver as the first user message. */
|
|
364
|
+
export function dayOpenFileName(date) {
|
|
365
|
+
return `${date}-day-open.md`;
|
|
366
|
+
}
|
|
367
|
+
export function readFirstRunMarker(path) {
|
|
368
|
+
try {
|
|
369
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
370
|
+
if (typeof raw.completed_at !== "string" || raw.completed_at.trim() === "")
|
|
371
|
+
return undefined;
|
|
372
|
+
return { completed_at: raw.completed_at };
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
return undefined;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Should the first-run interview fire on this start? Pure decision:
|
|
380
|
+
*
|
|
381
|
+
* * a delivered interview never fires again (the state records it);
|
|
382
|
+
* * no rollover state has ever existed ⇒ first run, interview due — the
|
|
383
|
+
* fallback that makes the feature work before/without the wizard;
|
|
384
|
+
* * an interview found due but not delivered stays due (`first_run_owed`);
|
|
385
|
+
* * otherwise the wizard's marker decides — its presence on an installation
|
|
386
|
+
* whose state carries no interview means onboarding finished and the
|
|
387
|
+
* greeting is owed.
|
|
388
|
+
*
|
|
389
|
+
* An existing installation (state present, no marker, nothing owed) never
|
|
390
|
+
* gets one.
|
|
391
|
+
*/
|
|
392
|
+
export function interviewDue(marker, state) {
|
|
393
|
+
if (state?.first_run_interviewed)
|
|
394
|
+
return false;
|
|
395
|
+
if (state === undefined)
|
|
396
|
+
return true;
|
|
397
|
+
if (state.first_run_owed)
|
|
398
|
+
return true;
|
|
399
|
+
return marker !== undefined;
|
|
400
|
+
}
|
|
401
|
+
const FIRST_RUN_PLACEHOLDERS = ["date", "owner", "snapshot_summary"];
|
|
402
|
+
/** Fill prompts/companion-first-run.md — same `—`-for-empty discipline as the
|
|
403
|
+
* day-open (the owner label is pre-defaulted, so only the snapshot can be empty). */
|
|
404
|
+
export function renderFirstRun(template, sources) {
|
|
405
|
+
return renderTemplate(template, FIRST_RUN_PLACEHOLDERS, sources);
|
|
406
|
+
}
|
|
407
|
+
export function firstRunFileName(date) {
|
|
408
|
+
return `${date}-first-run.md`;
|
|
409
|
+
}
|
|
410
|
+
// ---- the sequence -----------------------------------------------------------
|
|
411
|
+
/**
|
|
412
|
+
* The in-container listing of the newest conversation in `dir`: its path on
|
|
413
|
+
* stdout, nothing when there is none — exit 0 either way — and a non-zero
|
|
414
|
+
* exit with the cause on stderr when the dir cannot be listed. A dir that is
|
|
415
|
+
* not there is a volume that never held a conversation; one that is there
|
|
416
|
+
* but unreadable is not the same answer, and `ls`'s own status decides, not
|
|
417
|
+
* the status of a `head` after it.
|
|
418
|
+
*/
|
|
419
|
+
export function newestSessionScript(dir) {
|
|
420
|
+
return (`d='${dir}'; [ -e "$d" ] || exit 0; ` +
|
|
421
|
+
`[ -d "$d" ] && [ -r "$d" ] && [ -x "$d" ] || { echo "cannot list $d" >&2; exit 1; }; ` +
|
|
422
|
+
`set -- "$d"/*.jsonl; [ -e "$1" ] || exit 0; ` +
|
|
423
|
+
`out=$(ls -1t -- "$@") || exit 1; printf '%s\n' "$out" | head -1`);
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* The rollover itself. Call it after the container is up and before
|
|
427
|
+
* spawnPi; it returns a report and, on a rollover, leaves the tmux session
|
|
428
|
+
* killed so the caller's spawnPi() births a fresh conversation that opens on
|
|
429
|
+
* the day-open message.
|
|
430
|
+
*/
|
|
431
|
+
export class CompanionRollover {
|
|
432
|
+
cfg;
|
|
433
|
+
docker;
|
|
434
|
+
opts;
|
|
435
|
+
now;
|
|
436
|
+
env;
|
|
437
|
+
timeZone;
|
|
438
|
+
constructor(cfg, docker, opts) {
|
|
439
|
+
this.cfg = cfg;
|
|
440
|
+
this.docker = docker;
|
|
441
|
+
this.opts = opts;
|
|
442
|
+
this.now = opts.now ?? (() => new Date());
|
|
443
|
+
this.env = opts.env ?? process.env;
|
|
444
|
+
this.timeZone = opts.timeZone ?? "UTC";
|
|
445
|
+
}
|
|
446
|
+
today() {
|
|
447
|
+
return todayDate(this.now(), this.env, this.timeZone);
|
|
448
|
+
}
|
|
449
|
+
/** In-container session dir — the one pi is given (`companionSessionDir`). */
|
|
450
|
+
sessionDir() {
|
|
451
|
+
return companionSessionDir(this.cfg.session);
|
|
452
|
+
}
|
|
453
|
+
archiveDir(date) {
|
|
454
|
+
return `${CONTAINER.piHome}/archive/${this.cfg.session}/${date}`;
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* The newest conversation file on the pihome volume.
|
|
458
|
+
*
|
|
459
|
+
* Three answers, never two: `found`, `none` (the exec ran and the volume
|
|
460
|
+
* holds no conversation) and `unreadable` (the exec itself failed — an exec
|
|
461
|
+
* immediately after a container recreate can lose that race, see
|
|
462
|
+
* `companion.ts`). Folding the third into the second would archive nothing,
|
|
463
|
+
* compact zero turns and hand the companion "nothing happened yesterday" as
|
|
464
|
+
* its opening context, then record the day so it never retried.
|
|
465
|
+
*
|
|
466
|
+
* The script keeps that line inside the container too: a session dir that
|
|
467
|
+
* is not there (a fresh volume) or holds no conversation is `none`, but one
|
|
468
|
+
* that cannot be listed, or a listing that fails, exits non-zero — the
|
|
469
|
+
* listing's status is its own, never a pipeline tail's.
|
|
470
|
+
*/
|
|
471
|
+
async newestSessionFile() {
|
|
472
|
+
const res = await this.docker([
|
|
473
|
+
"exec",
|
|
474
|
+
this.cfg.container_name,
|
|
475
|
+
"sh",
|
|
476
|
+
"-c",
|
|
477
|
+
newestSessionScript(this.sessionDir()),
|
|
478
|
+
]);
|
|
479
|
+
if (!res.ok)
|
|
480
|
+
return { state: "unreadable", reason: execReason(res) };
|
|
481
|
+
const file = res.stdout.trim();
|
|
482
|
+
return file === "" ? { state: "none" } : { state: "found", file };
|
|
483
|
+
}
|
|
484
|
+
/** Archive it date-stamped (rotateOverseer pattern): the copy's
|
|
485
|
+
* in-container path, or why the copy failed. Copy, never move: if anything
|
|
486
|
+
* below fails, the original conversation is still where pi left it. */
|
|
487
|
+
async archive(file, date) {
|
|
488
|
+
const dest = `${this.archiveDir(date)}/session.jsonl`;
|
|
489
|
+
const res = await this.docker([
|
|
490
|
+
"exec",
|
|
491
|
+
this.cfg.container_name,
|
|
492
|
+
"sh",
|
|
493
|
+
"-c",
|
|
494
|
+
`mkdir -p '${this.archiveDir(date)}' && cp '${file}' '${dest}'`,
|
|
495
|
+
]);
|
|
496
|
+
return res.ok ? { ok: true, dest } : { ok: false, reason: execReason(res) };
|
|
497
|
+
}
|
|
498
|
+
/** Read a bounded tail of the conversation file through the docker seam.
|
|
499
|
+
* A failed exec is `unreadable`, never `""` — an empty conversation and a
|
|
500
|
+
* conversation we could not fetch produce very different day-opens, and
|
|
501
|
+
* only one of them is true. */
|
|
502
|
+
async readConversation(file) {
|
|
503
|
+
if (file === "")
|
|
504
|
+
return { state: "read", text: "" };
|
|
505
|
+
const res = await this.docker([
|
|
506
|
+
"exec",
|
|
507
|
+
this.cfg.container_name,
|
|
508
|
+
"sh",
|
|
509
|
+
"-c",
|
|
510
|
+
`tail -c 400000 '${file}'`,
|
|
511
|
+
]);
|
|
512
|
+
return res.ok
|
|
513
|
+
? { state: "read", text: res.stdout }
|
|
514
|
+
: { state: "unreadable", reason: execReason(res) };
|
|
515
|
+
}
|
|
516
|
+
/** Stop the old session. No session (or no tmux server) to kill is the
|
|
517
|
+
* state we want, so it counts as `killed`; any other failure is `failed` —
|
|
518
|
+
* the session may still be live, and `spawnPi` would adopt it (the
|
|
519
|
+
* loss-vs-absence rule, applied to the kill). */
|
|
520
|
+
async killSession() {
|
|
521
|
+
const res = await this.docker([
|
|
522
|
+
"exec",
|
|
523
|
+
this.cfg.container_name,
|
|
524
|
+
"tmux",
|
|
525
|
+
"kill-session",
|
|
526
|
+
"-t",
|
|
527
|
+
this.cfg.session,
|
|
528
|
+
]);
|
|
529
|
+
// No such session, or no tmux server at all (a freshly started container),
|
|
530
|
+
// means nothing is running; any other connect error does not.
|
|
531
|
+
if (res.ok ||
|
|
532
|
+
/can't find session|session not found/i.test(res.stderr) ||
|
|
533
|
+
isNoTmuxServer(res.stderr))
|
|
534
|
+
return { state: "killed" };
|
|
535
|
+
return { state: "failed", reason: execReason(res) };
|
|
536
|
+
}
|
|
537
|
+
/** tmp+rename into the inject dir — the bridge must never drain a torn file. */
|
|
538
|
+
writeInject(name, text) {
|
|
539
|
+
mkdirSync(this.opts.injectDir, { recursive: true });
|
|
540
|
+
const target = join(this.opts.injectDir, name);
|
|
541
|
+
const tmp = join(this.opts.injectDir, `.${name}.tmp`);
|
|
542
|
+
writeFileSync(tmp, text);
|
|
543
|
+
renameSync(tmp, target);
|
|
544
|
+
return target;
|
|
545
|
+
}
|
|
546
|
+
/** Write the day-open message where inject-bridge will drain it. */
|
|
547
|
+
writeDayOpen(text, date) {
|
|
548
|
+
return this.writeInject(dayOpenFileName(date), text);
|
|
549
|
+
}
|
|
550
|
+
/** Assemble the opening context from the five carry items + the knobs. */
|
|
551
|
+
buildDayOpen(date, turns) {
|
|
552
|
+
const snap = readSnapshot(this.cfg.feed_dir);
|
|
553
|
+
const template = readFileSync(this.opts.templatePath, "utf8");
|
|
554
|
+
return renderDayOpen(template, {
|
|
555
|
+
date,
|
|
556
|
+
digest: digestLine(snap, this.opts.localDigestHeadline?.()),
|
|
557
|
+
yesterday_summary: compactConversation(turns, undefined, this.opts.ownerName),
|
|
558
|
+
yesterday_tail: conversationTail(turns),
|
|
559
|
+
open_alerts: openAlerts(this.cfg.alerts_dir, this.opts.policyStatePath, date),
|
|
560
|
+
snapshot_summary: snapshotSummary(snap),
|
|
561
|
+
alert_knobs: alertKnobs(this.cfg),
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
/** `prior` is the state `run()` already read, passed in rather than re-read:
|
|
565
|
+
* a second read could come back unreadable, and a collapsed
|
|
566
|
+
* `undefined` here silently drops `first_run_interviewed` — the exact
|
|
567
|
+
* re-arming the comment below exists to prevent. */
|
|
568
|
+
record(date, archive, prior) {
|
|
569
|
+
// Preserve the interview mark across rewrites: dropping it on a later
|
|
570
|
+
// rollover would re-arm a marker-keyed interview forever.
|
|
571
|
+
const written = {
|
|
572
|
+
last_open_date: date,
|
|
573
|
+
updated_at: this.now().toISOString(),
|
|
574
|
+
...(archive ? { last_archive: archive } : {}),
|
|
575
|
+
...(prior?.first_run_interviewed
|
|
576
|
+
? { first_run_interviewed: prior.first_run_interviewed }
|
|
577
|
+
: {}),
|
|
578
|
+
...(prior?.first_run_owed ? { first_run_owed: prior.first_run_owed } : {}),
|
|
579
|
+
};
|
|
580
|
+
writeRolloverState(this.opts.statePath, written);
|
|
581
|
+
// Returned so `maybeInterview` can add its mark to the row we know we
|
|
582
|
+
// wrote, instead of re-reading the file it was just handed.
|
|
583
|
+
return written;
|
|
584
|
+
}
|
|
585
|
+
/** Assemble the first-run interview from its template. */
|
|
586
|
+
buildInterview(date) {
|
|
587
|
+
const template = readFileSync(this.opts.firstRunTemplatePath, "utf8");
|
|
588
|
+
return renderFirstRun(template, {
|
|
589
|
+
date,
|
|
590
|
+
owner: ownerLabel(this.opts.ownerName),
|
|
591
|
+
snapshot_summary: snapshotSummary(readSnapshot(this.cfg.feed_dir)),
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* Deliver the first-run interview if it is due — at most once per
|
|
596
|
+
* installation, recorded in the rollover state. `prior` is the state as it
|
|
597
|
+
* stood before this run touched it (the no-state-ever fallback must see the
|
|
598
|
+
* original absence, not the row `record()` just created). `current` is the
|
|
599
|
+
* row as it now stands — what `record()` just wrote, or `prior` when this
|
|
600
|
+
* run wrote nothing. Nothing here ever blocks a start: a missing/broken
|
|
601
|
+
* template degrades to a step note.
|
|
602
|
+
*/
|
|
603
|
+
maybeInterview(today, prior, current, steps) {
|
|
604
|
+
if (!this.opts.firstRunTemplatePath)
|
|
605
|
+
return {};
|
|
606
|
+
const marker = this.opts.firstRunMarkerPath
|
|
607
|
+
? readFirstRunMarker(this.opts.firstRunMarkerPath)
|
|
608
|
+
: undefined;
|
|
609
|
+
if (!interviewDue(marker, prior))
|
|
610
|
+
return {};
|
|
611
|
+
// `current`, never a re-read: a re-read that came back unreadable would
|
|
612
|
+
// collapse to a fabricated row — `last_open_date: today` stamped over a
|
|
613
|
+
// day we could not see, `last_archive` dropped. `current` is undefined
|
|
614
|
+
// only when the state was genuinely absent and this run wrote nothing, in
|
|
615
|
+
// which case today is the row's true date.
|
|
616
|
+
const state = current ?? {
|
|
617
|
+
last_open_date: today,
|
|
618
|
+
updated_at: this.now().toISOString(),
|
|
619
|
+
};
|
|
620
|
+
let interview;
|
|
621
|
+
try {
|
|
622
|
+
interview = this.buildInterview(today);
|
|
623
|
+
}
|
|
624
|
+
catch {
|
|
625
|
+
// Still owed: the no-state fallback that found it due is gone once the
|
|
626
|
+
// state exists, so the obligation is written down for the next start.
|
|
627
|
+
if (!state.first_run_owed)
|
|
628
|
+
writeRolloverState(this.opts.statePath, { ...state, first_run_owed: today });
|
|
629
|
+
steps.push("first-run interview template unreadable — skipped (system unaffected); still owed, retried on the next start");
|
|
630
|
+
return {};
|
|
631
|
+
}
|
|
632
|
+
const interviewFile = this.writeInject(firstRunFileName(today), interview);
|
|
633
|
+
steps.push(`queued first-run interview → ${interviewFile}`);
|
|
634
|
+
// Mark it delivered so it fires exactly once; later starts run the normal
|
|
635
|
+
// day-open. An abandoned interview resumes in conversation, never here.
|
|
636
|
+
const { first_run_owed: _owed, ...delivered } = state;
|
|
637
|
+
writeRolloverState(this.opts.statePath, { ...delivered, first_run_interviewed: today });
|
|
638
|
+
return { interviewFile, interview };
|
|
639
|
+
}
|
|
640
|
+
/**
|
|
641
|
+
* first-run → record the date, touch nothing;
|
|
642
|
+
* same-day → nothing at all;
|
|
643
|
+
* rollover → archive → compact → assemble → kill → (caller respawns);
|
|
644
|
+
* …and on any of the three, deliver the first-run interview when it
|
|
645
|
+
* is due (fresh installation, or the wizard's marker with no interview on
|
|
646
|
+
* record) — exactly once, ever.
|
|
647
|
+
*/
|
|
648
|
+
async run() {
|
|
649
|
+
const today = this.today();
|
|
650
|
+
const read = readRolloverStateFile(this.opts.statePath);
|
|
651
|
+
const prior = read.state === "state" ? read.value : undefined;
|
|
652
|
+
// The row as it now stands: `prior` until `record()` replaces it.
|
|
653
|
+
let current = prior;
|
|
654
|
+
const verdict = decideRollover(today, read);
|
|
655
|
+
const steps = [];
|
|
656
|
+
let archivedTo;
|
|
657
|
+
let dayOpenFile;
|
|
658
|
+
let dayOpen;
|
|
659
|
+
const warnings = [];
|
|
660
|
+
// An unreadable state file gates everything below it: read as `first-run`
|
|
661
|
+
// it would record today's date over it and the rollover would never
|
|
662
|
+
// retry. We return before `maybeInterview` too:
|
|
663
|
+
// `interviewDue(marker, undefined)` is true, so continuing could re-fire
|
|
664
|
+
// the first-run interview at an install that had it months ago.
|
|
665
|
+
if (verdict.kind === "unknown") {
|
|
666
|
+
const deferred = `rollover state ${this.opts.statePath} exists but cannot be read (${verdict.reason}) — nothing rolled over, recorded or queued; retrying on the next start`;
|
|
667
|
+
steps.push(deferred);
|
|
668
|
+
return { verdict, steps, deferred };
|
|
669
|
+
}
|
|
670
|
+
if (verdict.kind === "first-run") {
|
|
671
|
+
current = this.record(today, undefined, prior);
|
|
672
|
+
steps.push(`first run — companion day set to ${today}`);
|
|
673
|
+
}
|
|
674
|
+
else if (verdict.kind === "rollover") {
|
|
675
|
+
const lookup = await this.newestSessionFile();
|
|
676
|
+
// A lost exec is not an empty volume. Standing down leaves the
|
|
677
|
+
// day unrecorded, so the next start runs the whole rollover again; the
|
|
678
|
+
// cost is one more day on yesterday's conversation, against handing the
|
|
679
|
+
// companion a fabricated "nothing happened yesterday" that can never be
|
|
680
|
+
// retried. The deferral is loud in the step log and the caller notices.
|
|
681
|
+
if (lookup.state === "unreadable") {
|
|
682
|
+
const deferred = `could not list the previous conversation (${lookup.reason}) — day NOT rolled over; retrying on the next start`;
|
|
683
|
+
steps.push(deferred);
|
|
684
|
+
return { verdict, steps, deferred, ...this.maybeInterview(today, prior, current, steps) };
|
|
685
|
+
}
|
|
686
|
+
const file = lookup.state === "found" ? lookup.file : "";
|
|
687
|
+
steps.push(file === "" ? "no previous conversation found" : `found conversation ${file}`);
|
|
688
|
+
// A failed copy is not a deferral: the conversation is still on the
|
|
689
|
+
// volume and the day-open below is still assembled from the real turns,
|
|
690
|
+
// so nothing fabricated is published. It is only the dated archive that
|
|
691
|
+
// is missing — and going quiet about that is how it would stay missing,
|
|
692
|
+
// so the cause reaches the operator's notice line (`warnings`).
|
|
693
|
+
if (file !== "") {
|
|
694
|
+
const copy = await this.archive(file, verdict.previous);
|
|
695
|
+
if (copy.ok) {
|
|
696
|
+
archivedTo = copy.dest;
|
|
697
|
+
steps.push(`archived → ${archivedTo}`);
|
|
698
|
+
}
|
|
699
|
+
else {
|
|
700
|
+
const warning = `archive FAILED — ${file} is unarchived (it remains on the volume): ${copy.reason}`;
|
|
701
|
+
steps.push(warning);
|
|
702
|
+
warnings.push(warning);
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
const convo = await this.readConversation(file);
|
|
706
|
+
if (convo.state === "unreadable") {
|
|
707
|
+
const deferred = `could not read ${file} (${convo.reason}) — day NOT rolled over; retrying on the next start`;
|
|
708
|
+
steps.push(deferred);
|
|
709
|
+
return {
|
|
710
|
+
verdict,
|
|
711
|
+
steps,
|
|
712
|
+
archivedTo,
|
|
713
|
+
deferred,
|
|
714
|
+
...this.maybeInterview(today, prior, current, steps),
|
|
715
|
+
...(warnings.length ? { warnings } : {}),
|
|
716
|
+
};
|
|
717
|
+
}
|
|
718
|
+
const turns = parseConversation(convo.text);
|
|
719
|
+
steps.push(`compacted ${turns.length} turn${turns.length === 1 ? "" : "s"}`);
|
|
720
|
+
dayOpen = this.buildDayOpen(today, turns);
|
|
721
|
+
steps.push(`assembled opening context (${dayOpen.length} chars)`);
|
|
722
|
+
// The verdict was read before the awaits above. A second TUI starting
|
|
723
|
+
// the same morning may have rolled the day over meanwhile and spawned
|
|
724
|
+
// the fresh conversation; killing now would end THAT one. Its record
|
|
725
|
+
// says so — stand down and leave the day to it. This narrows the race,
|
|
726
|
+
// it does not close it: there is no cross-process lock, so a start
|
|
727
|
+
// whose re-read lands before the other's record can still kill the
|
|
728
|
+
// conversation the other start just spawned.
|
|
729
|
+
const now = readRolloverStateFile(this.opts.statePath);
|
|
730
|
+
if (now.state === "state" && now.value.last_open_date >= today) {
|
|
731
|
+
const stoodDown = `another start already rolled the day over to ${now.value.last_open_date} — nothing killed or queued`;
|
|
732
|
+
steps.push(stoodDown);
|
|
733
|
+
return { verdict, steps, archivedTo, stoodDown, ...(warnings.length ? { warnings } : {}) };
|
|
734
|
+
}
|
|
735
|
+
const kill = await this.killSession();
|
|
736
|
+
if (kill.state === "failed") {
|
|
737
|
+
// Yesterday's conversation may still be running: a day-open queued now
|
|
738
|
+
// would land in it, and a recorded day would never retry the rotation.
|
|
739
|
+
const deferred = `could not stop the companion session ${this.cfg.session} (${kill.reason}) — day NOT rolled over; retrying on the next start`;
|
|
740
|
+
steps.push(deferred);
|
|
741
|
+
return {
|
|
742
|
+
verdict,
|
|
743
|
+
steps,
|
|
744
|
+
archivedTo,
|
|
745
|
+
deferred,
|
|
746
|
+
...this.maybeInterview(today, prior, current, steps),
|
|
747
|
+
...(warnings.length ? { warnings } : {}),
|
|
748
|
+
};
|
|
749
|
+
}
|
|
750
|
+
steps.push(`killed tmux session ${this.cfg.session}`);
|
|
751
|
+
dayOpenFile = this.writeDayOpen(dayOpen, today);
|
|
752
|
+
steps.push(`queued day-open message → ${dayOpenFile}`);
|
|
753
|
+
current = this.record(today, archivedTo, prior);
|
|
754
|
+
}
|
|
755
|
+
const interview = this.maybeInterview(today, prior, current, steps);
|
|
756
|
+
return {
|
|
757
|
+
verdict,
|
|
758
|
+
steps,
|
|
759
|
+
archivedTo,
|
|
760
|
+
dayOpenFile,
|
|
761
|
+
dayOpen,
|
|
762
|
+
...interview,
|
|
763
|
+
...(warnings.length ? { warnings } : {}),
|
|
764
|
+
};
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
//# sourceMappingURL=rollover.js.map
|