@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,1001 @@
|
|
|
1
|
+
// SetupEngine — the deterministic half of setup & scan. The onboarding
|
|
2
|
+
// engine's pattern (src/onboard/engine.ts): a state machine with every outside
|
|
3
|
+
// effect behind an injected port, fully drivable from tests, and a thin pi
|
|
4
|
+
// tool belt over it (extensions/setup.ts, loaded by the companion). The
|
|
5
|
+
// companion judges — which units a repo has, what a finding means — and these
|
|
6
|
+
// tools act: what they do with its answers is deterministic, validated, and
|
|
7
|
+
// persisted here.
|
|
8
|
+
//
|
|
9
|
+
// Behaviours: the deterministic repo facts and the unit cut, the survey
|
|
10
|
+
// (preview, start, status, stop; the run itself is surveyrun.ts, its rules
|
|
11
|
+
// survey.ts), the review history themes (history.ts), the repo portrait
|
|
12
|
+
// (portrait.ts — facts assembled here, the companion's narrative stored in the
|
|
13
|
+
// config home), the interview's tuning (tuning.ts — the priority table
|
|
14
|
+
// applied to the repo profile, validated with the daemon's own loaders; pin
|
|
15
|
+
// proposals handed to the operator) and the post-scan re-tune (retune.ts —
|
|
16
|
+
// the same profile path, every change with its reason, logged for the deploy
|
|
17
|
+
// tab). The scan's own records and triage live beside it (scanrun.ts,
|
|
18
|
+
// findings.ts, triage.ts) over the same ports: the tracker sink is
|
|
19
|
+
// trackersink.ts's. The GitHub reader port is declared and injected, but no
|
|
20
|
+
// engine behaviour calls it yet (the PR replay builds its own reader).
|
|
21
|
+
//
|
|
22
|
+
// Persistence: `<state home>/setup/unit-cut.json`, tmp+rename atomic through
|
|
23
|
+
// the state port. It holds the saved cut (the one survey and scan reuse), the
|
|
24
|
+
// previous saved cut (so a re-cut can be compared and undone), and at most one
|
|
25
|
+
// draft (the companion's proposal as the operator adjusts it). A saved cut is
|
|
26
|
+
// never touched by a propose or an adjust — only `save` replaces it. An
|
|
27
|
+
// unreadable file is reported and refuses every write: it may hold the
|
|
28
|
+
// operator's saved cut, and silently starting fresh over it would lose that.
|
|
29
|
+
import { isSampleable } from "./survey.js";
|
|
30
|
+
import type { MemoryStore } from "../memory/store.js";
|
|
31
|
+
import { isSweepSkipped } from "@quickchatai/pi-quickreview/src/heuristics.js";
|
|
32
|
+
import {
|
|
33
|
+
repoFacts,
|
|
34
|
+
unitCandidates,
|
|
35
|
+
vendoredRoots,
|
|
36
|
+
type RepoFacts,
|
|
37
|
+
type UnitCandidate,
|
|
38
|
+
} from "./facts.js";
|
|
39
|
+
import {
|
|
40
|
+
SurveyRunner,
|
|
41
|
+
type SurveyInputs,
|
|
42
|
+
type SurveyPreview,
|
|
43
|
+
type SurveyRun,
|
|
44
|
+
type SurveyStatus,
|
|
45
|
+
} from "./surveyrun.js";
|
|
46
|
+
import {
|
|
47
|
+
historyPage,
|
|
48
|
+
historyThemesState,
|
|
49
|
+
readDigest,
|
|
50
|
+
saveHistoryThemes,
|
|
51
|
+
summarize,
|
|
52
|
+
type HistorySection,
|
|
53
|
+
type HistorySummary,
|
|
54
|
+
type HistoryThemesFile,
|
|
55
|
+
type SaveThemesResult,
|
|
56
|
+
} from "./history.js";
|
|
57
|
+
import {
|
|
58
|
+
readPortrait,
|
|
59
|
+
saveFacts,
|
|
60
|
+
storeNarrative,
|
|
61
|
+
type AssembleResult,
|
|
62
|
+
type PortraitFacts,
|
|
63
|
+
type PortraitView,
|
|
64
|
+
type StoreNarrativeResult,
|
|
65
|
+
} from "./portrait.js";
|
|
66
|
+
import type { ProfileHome } from "./profile.js";
|
|
67
|
+
import { retune, type RetuneInput, type RetuneResult } from "./retune.js";
|
|
68
|
+
import { scanFacts } from "./scanfacts.js";
|
|
69
|
+
import {
|
|
70
|
+
profileApply,
|
|
71
|
+
profileStatus,
|
|
72
|
+
profileValidate,
|
|
73
|
+
proposePins,
|
|
74
|
+
type ApplyInput,
|
|
75
|
+
type ApplyResult,
|
|
76
|
+
type PinProposeResult,
|
|
77
|
+
type ProfileStatus,
|
|
78
|
+
} from "./tuning.js";
|
|
79
|
+
import type { ProfileCheck } from "./profile.js";
|
|
80
|
+
import {
|
|
81
|
+
DEFAULT_CASE_BUDGET,
|
|
82
|
+
applyOps,
|
|
83
|
+
assign,
|
|
84
|
+
checkCut,
|
|
85
|
+
normalizeCut,
|
|
86
|
+
splitUnit,
|
|
87
|
+
type CaseBudget,
|
|
88
|
+
type CasePlan,
|
|
89
|
+
type UnitCut,
|
|
90
|
+
} from "./unitcut.js";
|
|
91
|
+
|
|
92
|
+
// ---- ports -------------------------------------------------------------------
|
|
93
|
+
|
|
94
|
+
/** The reviewed checkout, read-only (the companion mounts it `:ro`). Every
|
|
95
|
+
* method is total: an unreadable checkout answers null, never throws. */
|
|
96
|
+
export interface RepoReader {
|
|
97
|
+
/** Where the checkout is, for messages. */
|
|
98
|
+
readonly location: string;
|
|
99
|
+
/** Repo-relative paths of every tracked file, or null when there is no
|
|
100
|
+
* readable checkout. */
|
|
101
|
+
listFiles(): string[] | null;
|
|
102
|
+
/** A file's text, or null (missing, binary, over the reader's size cap). */
|
|
103
|
+
read(rel: string): string | null;
|
|
104
|
+
/** A file's line count (0 for an empty file), or null when unreadable. */
|
|
105
|
+
lines(rel: string): number | null;
|
|
106
|
+
/** The checked-out commit, or null when it cannot be read. */
|
|
107
|
+
head(): string | null;
|
|
108
|
+
/** Commits touching each file over the recent history — the survey's
|
|
109
|
+
* "most-changed" sample. Optional and total: absent or null when
|
|
110
|
+
* the history cannot be read, which only empties that one reason. */
|
|
111
|
+
changeCounts?(): Record<string, number> | null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** The filesystem rooted at the install's state home — PC-only, never shipped.
|
|
115
|
+
* Paths are relative to that root; the implementation refuses any that would
|
|
116
|
+
* leave it. The same shape roots the config home (`SetupPorts.config`). */
|
|
117
|
+
export interface StateFs {
|
|
118
|
+
readonly location: string;
|
|
119
|
+
/** The file's text, or null when it does not exist. Throws only when it
|
|
120
|
+
* exists and cannot be read — the caller reports that, never overwrites. */
|
|
121
|
+
read(rel: string): string | null;
|
|
122
|
+
/** tmp+rename atomic write; creates parent directories. */
|
|
123
|
+
write(rel: string, text: string): void;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** One case: a unit (or part of one) handed to background pi subagents inside
|
|
127
|
+
* the companion. */
|
|
128
|
+
export interface CaseSpec {
|
|
129
|
+
id: string;
|
|
130
|
+
unit: string;
|
|
131
|
+
agent: string;
|
|
132
|
+
files: string[];
|
|
133
|
+
prompt: string;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** How a case ended: the lens's final answer and what it cost (null when
|
|
137
|
+
* the runner could not tell), or why there is none. A failed or aborted case
|
|
138
|
+
* may still have spent money: `cost_usd` on a failure is what it spent before
|
|
139
|
+
* it ended (0 when it never started, null or absent when the runner cannot
|
|
140
|
+
* tell) — a caller holding a budget counts it. */
|
|
141
|
+
export type CaseOutcome =
|
|
142
|
+
| {
|
|
143
|
+
ok: true;
|
|
144
|
+
output: string;
|
|
145
|
+
cost_usd: number | null;
|
|
146
|
+
/** The files the case's file-read tool calls opened (`read`, and
|
|
147
|
+
* `grep` given a `path`), in call order, each resolved to the absolute
|
|
148
|
+
* path the call opened (against the case's working directory, which is
|
|
149
|
+
* not the scanned tree) — `[]` when it read nothing. Absent when the
|
|
150
|
+
* runner cannot tell, which is unknown, never "read nothing". The scan
|
|
151
|
+
* judges a lens that read none of its focus files as no reading at all. */
|
|
152
|
+
reads?: string[];
|
|
153
|
+
/** Where the runner kept the case's event stream, relative to its
|
|
154
|
+
* transcript directory; absent when it kept none. */
|
|
155
|
+
transcript?: string;
|
|
156
|
+
}
|
|
157
|
+
| { ok: false; reason: string; cost_usd?: number | null; transcript?: string };
|
|
158
|
+
|
|
159
|
+
/** Runs cases as background subagents (survey, scan). The
|
|
160
|
+
* engine decides what runs when and how many at once; the runner runs one
|
|
161
|
+
* case to its end. Resolves for every outcome — a failed or aborted case is
|
|
162
|
+
* `{ok:false}`, never a rejection. `onCost`, when given, hears the case's
|
|
163
|
+
* running cost each time the runner learns more of it, so a caller with a
|
|
164
|
+
* hard cap can abort a case mid-flight rather than after the fact. */
|
|
165
|
+
export interface CaseRunner {
|
|
166
|
+
run(
|
|
167
|
+
spec: CaseSpec,
|
|
168
|
+
signal: AbortSignal,
|
|
169
|
+
onCost?: (spentSoFar: number) => void,
|
|
170
|
+
): Promise<CaseOutcome>;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export interface TrackerTicket {
|
|
174
|
+
title: string;
|
|
175
|
+
body: string;
|
|
176
|
+
/** The effort the ticket belongs in (the companion picks the one that fits). */
|
|
177
|
+
effort: string;
|
|
178
|
+
/** Stamped on the ticket, so a finding is never filed twice. */
|
|
179
|
+
fingerprint: string;
|
|
180
|
+
/** Fingerprints the finding carried before a match — a ticket stamped with
|
|
181
|
+
* one of them is the same finding's. */
|
|
182
|
+
aliases?: string[];
|
|
183
|
+
/** The tracker's `Category:` — `bug` when absent. */
|
|
184
|
+
category?: "bug" | "enhancement";
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Filed or closed: the sink's reference, and `existing` when nothing new was
|
|
188
|
+
* written — a ticket already stamped with the fingerprint, or one already
|
|
189
|
+
* closed. */
|
|
190
|
+
export type SinkResult =
|
|
191
|
+
{ ok: true; ref: string; existing?: boolean } | { ok: false; reason: string };
|
|
192
|
+
|
|
193
|
+
/** Where a promoted finding goes (trackersink.ts): the issue
|
|
194
|
+
* tracker, or one markdown file per finding in the state home when the
|
|
195
|
+
* install has none. `kind` is recorded on the finding, so a close goes back
|
|
196
|
+
* to the sink that filed it. `close` closes only a ticket this sink filed. */
|
|
197
|
+
export interface TrackerSink {
|
|
198
|
+
readonly kind: string;
|
|
199
|
+
file(ticket: TrackerTicket): Promise<SinkResult>;
|
|
200
|
+
close(ref: string, note: string): Promise<SinkResult>;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export type GitHubRead = { ok: true; data: unknown } | { ok: false; reason: string };
|
|
204
|
+
|
|
205
|
+
/** GitHub, read-only: the interface has no method that could write — a GET of
|
|
206
|
+
* a REST path under the API root, and nothing else. */
|
|
207
|
+
export interface GitHubReader {
|
|
208
|
+
get(path: string): Promise<GitHubRead>;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export interface SetupPorts {
|
|
212
|
+
repo: RepoReader;
|
|
213
|
+
state: StateFs;
|
|
214
|
+
/** The install's config home, where the operator-facing results live (the
|
|
215
|
+
* portrait narrative). Absent or null when this assembly has none
|
|
216
|
+
* — every write there then answers a refusal naming why. In the companion
|
|
217
|
+
* only some of it is mounted: code writes only under a mounted directory
|
|
218
|
+
* (`portrait/`), never at the root. */
|
|
219
|
+
config?: StateFs | null;
|
|
220
|
+
/** Where the repo profile is read, checked and written: the app
|
|
221
|
+
* checkout (for the generic examples a profile extends) and the install
|
|
222
|
+
* environment whose config home holds `profiles/`. Real paths, because the
|
|
223
|
+
* check is the daemon's own loaders, which read disk. Absent or null when
|
|
224
|
+
* this assembly has none — every profile tool then refuses, naming why. */
|
|
225
|
+
profiles?: ProfileHome | null;
|
|
226
|
+
clock: () => Date;
|
|
227
|
+
/** The one memory seam. Null when this assembly has no memory — every
|
|
228
|
+
* memory write then answers a refusal naming why. */
|
|
229
|
+
memory: MemoryStore | null;
|
|
230
|
+
cases: CaseRunner;
|
|
231
|
+
tracker?: TrackerSink;
|
|
232
|
+
github?: GitHubReader;
|
|
233
|
+
log?: (line: string) => void;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export interface SetupOptions {
|
|
237
|
+
/** How much one case of the unit view and the survey may read (the scan
|
|
238
|
+
* sizes its own cases from `[scan]`). */
|
|
239
|
+
caseBudget?: CaseBudget;
|
|
240
|
+
/** Survey cases in flight at once (the companion passes its subagent cap). */
|
|
241
|
+
surveyConcurrency?: number;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// ---- the persisted file ------------------------------------------------------
|
|
245
|
+
|
|
246
|
+
export const UNIT_CUT_FILE = "setup/unit-cut.json";
|
|
247
|
+
export const UNIT_CUT_VERSION = 1;
|
|
248
|
+
|
|
249
|
+
export interface SavedCut extends UnitCut {
|
|
250
|
+
saved_at: string;
|
|
251
|
+
/** The commit the cut was checked against, when readable. */
|
|
252
|
+
head: string | null;
|
|
253
|
+
/** How many files the cut covered at save — a later listing that differs is
|
|
254
|
+
* how a stale cut shows itself. */
|
|
255
|
+
files: number;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
export interface DraftCut extends UnitCut {
|
|
259
|
+
updated_at: string;
|
|
260
|
+
/** `candidates` = the deterministic guess taken as-is; `companion` = a
|
|
261
|
+
* proposal the companion wrote; `adjusted` = either, after operator edits. */
|
|
262
|
+
source: "candidates" | "companion" | "adjusted";
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export interface UnitCutFile {
|
|
266
|
+
version: number;
|
|
267
|
+
saved: SavedCut | null;
|
|
268
|
+
previous: SavedCut | null;
|
|
269
|
+
draft: DraftCut | null;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// ---- results -----------------------------------------------------------------
|
|
273
|
+
|
|
274
|
+
export type Refusal = { ok: false; errors: string[] };
|
|
275
|
+
|
|
276
|
+
export interface UnitSummary {
|
|
277
|
+
name: string;
|
|
278
|
+
kind: string;
|
|
279
|
+
roots: string[];
|
|
280
|
+
note: string;
|
|
281
|
+
files: number | null;
|
|
282
|
+
/** Files a pass would actually read (lockfiles, binaries, prose skipped). */
|
|
283
|
+
reviewable: number | null;
|
|
284
|
+
lines: number | null;
|
|
285
|
+
/** One per case; a unit that fits is one case under its own name. */
|
|
286
|
+
cases: Array<{ id: string; files: number; lines: number; over_budget: boolean }> | null;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export interface CutView {
|
|
290
|
+
units: UnitSummary[];
|
|
291
|
+
ignored: string[];
|
|
292
|
+
ignored_files: number | null;
|
|
293
|
+
unassigned: string[] | null;
|
|
294
|
+
/** Structural refusals — should never appear on a stored cut; shown if a
|
|
295
|
+
* hand-edited file carries one. */
|
|
296
|
+
errors: string[];
|
|
297
|
+
/** What save would refuse for (a draft may carry these; a saved cut that
|
|
298
|
+
* shows one has gone stale against the repo). */
|
|
299
|
+
blocking_save: string[];
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
export interface CutStatus {
|
|
303
|
+
ok: boolean;
|
|
304
|
+
/** Why the file or the repo could not be read — the rest is then partial. */
|
|
305
|
+
problems: string[];
|
|
306
|
+
/** The cut file exists but could not be read: `saved`/`draft` are then
|
|
307
|
+
* unknown, not absent. */
|
|
308
|
+
cut_file_unreadable: boolean;
|
|
309
|
+
saved: (CutView & { saved_at: string; head: string | null; files_at_save: number }) | null;
|
|
310
|
+
draft: (CutView & { updated_at: string; source: DraftCut["source"] }) | null;
|
|
311
|
+
has_previous: boolean;
|
|
312
|
+
repo_files: number | null;
|
|
313
|
+
head: string | null;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
export type FactsResult = { ok: true; head: string | null; facts: RepoFacts } | Refusal;
|
|
317
|
+
|
|
318
|
+
/** Why a stored cut is not one this version can read, or null when it is (or
|
|
319
|
+
* is absent). Structure only — the partition itself is `checkCut`'s. */
|
|
320
|
+
function cutShapeError(cut: unknown): string | null {
|
|
321
|
+
if (cut === null) return null;
|
|
322
|
+
if (typeof cut !== "object") return "is not an object";
|
|
323
|
+
const c = cut as { units?: unknown; ignored?: unknown };
|
|
324
|
+
const strings = (v: unknown): boolean =>
|
|
325
|
+
Array.isArray(v) && v.every((x) => typeof x === "string");
|
|
326
|
+
if (!Array.isArray(c.units)) return "has no `units` array";
|
|
327
|
+
for (const [i, u] of c.units.entries()) {
|
|
328
|
+
const unit = (u ?? {}) as { name?: unknown; roots?: unknown; kind?: unknown; note?: unknown };
|
|
329
|
+
if (
|
|
330
|
+
typeof unit.name !== "string" ||
|
|
331
|
+
!strings(unit.roots) ||
|
|
332
|
+
typeof unit.kind !== "string" ||
|
|
333
|
+
typeof unit.note !== "string"
|
|
334
|
+
) {
|
|
335
|
+
return `units[${i}] is not {name, roots, kind, note}`;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
if (!strings(c.ignored)) return "has no `ignored` array of paths";
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// ---- engine ------------------------------------------------------------------
|
|
343
|
+
|
|
344
|
+
/** The cut setup offers when none is saved: the candidates as units, the
|
|
345
|
+
* vendored roots ignored. */
|
|
346
|
+
function candidateCut(candidates: readonly UnitCandidate[], files: readonly string[]): UnitCut {
|
|
347
|
+
return {
|
|
348
|
+
units: candidates.map((c) => ({ name: c.name, roots: c.roots, kind: c.kind, note: c.reason })),
|
|
349
|
+
ignored: vendoredRoots(files),
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
export class SetupEngine {
|
|
354
|
+
private readonly budget: CaseBudget;
|
|
355
|
+
private readonly surveyRun: SurveyRunner;
|
|
356
|
+
|
|
357
|
+
constructor(
|
|
358
|
+
private readonly ports: SetupPorts,
|
|
359
|
+
opts: SetupOptions = {},
|
|
360
|
+
) {
|
|
361
|
+
this.budget = opts.caseBudget ?? DEFAULT_CASE_BUDGET;
|
|
362
|
+
this.surveyRun = new SurveyRunner(ports, () => this.surveyInputs(), {
|
|
363
|
+
repoRoot: ports.repo.location,
|
|
364
|
+
...(opts.surveyConcurrency !== undefined ? { concurrency: opts.surveyConcurrency } : {}),
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
private files(): string[] | null {
|
|
369
|
+
const listed = this.ports.repo.listFiles();
|
|
370
|
+
return listed === null ? null : [...listed].sort();
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
private noRepo(): Refusal {
|
|
374
|
+
return {
|
|
375
|
+
ok: false,
|
|
376
|
+
errors: [
|
|
377
|
+
`no readable checkout at ${this.ports.repo.location} — is the reviewed repo mounted?`,
|
|
378
|
+
],
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/** The deterministic repo facts. Recomputed on every call — they are cheap
|
|
383
|
+
* and a cache would be one more thing to go stale. */
|
|
384
|
+
facts(): FactsResult {
|
|
385
|
+
const files = this.files();
|
|
386
|
+
if (files === null) return this.noRepo();
|
|
387
|
+
return {
|
|
388
|
+
ok: true,
|
|
389
|
+
head: this.ports.repo.head(),
|
|
390
|
+
facts: repoFacts(files, (p) => this.ports.repo.read(p)),
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// -- the file --
|
|
395
|
+
|
|
396
|
+
private load(): { file: UnitCutFile; error: string | null } {
|
|
397
|
+
const empty: UnitCutFile = {
|
|
398
|
+
version: UNIT_CUT_VERSION,
|
|
399
|
+
saved: null,
|
|
400
|
+
previous: null,
|
|
401
|
+
draft: null,
|
|
402
|
+
};
|
|
403
|
+
let text: string | null;
|
|
404
|
+
try {
|
|
405
|
+
text = this.ports.state.read(UNIT_CUT_FILE);
|
|
406
|
+
} catch (err) {
|
|
407
|
+
return {
|
|
408
|
+
file: empty,
|
|
409
|
+
error: `${UNIT_CUT_FILE} in ${this.ports.state.location} cannot be read: ${String(err)}`,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
if (text === null) return { file: empty, error: null };
|
|
413
|
+
try {
|
|
414
|
+
const raw = JSON.parse(text) as Partial<UnitCutFile>;
|
|
415
|
+
if (typeof raw !== "object" || raw === null || raw.version !== UNIT_CUT_VERSION) {
|
|
416
|
+
throw new Error(
|
|
417
|
+
`unknown version ${JSON.stringify((raw as { version?: unknown } | null)?.version)}`,
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
const file: UnitCutFile = {
|
|
421
|
+
version: UNIT_CUT_VERSION,
|
|
422
|
+
saved: raw.saved ?? null,
|
|
423
|
+
previous: raw.previous ?? null,
|
|
424
|
+
draft: raw.draft ?? null,
|
|
425
|
+
};
|
|
426
|
+
// A hand-edited file must be reported, never crash a view: every later
|
|
427
|
+
// reader (assign, splitUnit) takes the shape on trust.
|
|
428
|
+
for (const key of ["saved", "previous", "draft"] as const) {
|
|
429
|
+
const bad = cutShapeError(file[key]);
|
|
430
|
+
if (bad !== null) throw new Error(`\`${key}\` ${bad}`);
|
|
431
|
+
}
|
|
432
|
+
return { file, error: null };
|
|
433
|
+
} catch (err) {
|
|
434
|
+
return {
|
|
435
|
+
file: empty,
|
|
436
|
+
error:
|
|
437
|
+
`${UNIT_CUT_FILE} in ${this.ports.state.location} is not a unit cut this version reads (${String(err)}) — ` +
|
|
438
|
+
"nothing will overwrite it; move it aside to start over",
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
private store(file: UnitCutFile): void {
|
|
444
|
+
this.ports.state.write(UNIT_CUT_FILE, `${JSON.stringify(file, null, 2)}\n`);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/** Load for a write: an unreadable file refuses rather than being replaced. */
|
|
448
|
+
private loadForWrite(): { file: UnitCutFile } | Refusal {
|
|
449
|
+
const { file, error } = this.load();
|
|
450
|
+
return error === null ? { file } : { ok: false, errors: [error] };
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// -- views --
|
|
454
|
+
|
|
455
|
+
/** A unit's case plans over its reviewable (not sweep-skipped) files. */
|
|
456
|
+
private unitCases(
|
|
457
|
+
name: string,
|
|
458
|
+
owned: readonly string[],
|
|
459
|
+
lines: (p: string) => number,
|
|
460
|
+
): CasePlan[] {
|
|
461
|
+
return splitUnit(
|
|
462
|
+
name,
|
|
463
|
+
owned.filter((f) => !isSweepSkipped(f)),
|
|
464
|
+
lines,
|
|
465
|
+
this.budget,
|
|
466
|
+
);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
private view(cut: UnitCut, files: readonly string[], lines: (p: string) => number): CutView {
|
|
470
|
+
const { errors, blocking_save } = checkCut(cut, files);
|
|
471
|
+
// A cut with structural errors (a hand-edited file) still gets a
|
|
472
|
+
// best-effort view, with the errors beside it.
|
|
473
|
+
const a = assign(cut, files);
|
|
474
|
+
const sizeErrors: string[] = [];
|
|
475
|
+
const units: UnitSummary[] = cut.units.map((u) => {
|
|
476
|
+
const owned = a.byUnit.get(u.name) ?? [];
|
|
477
|
+
const reviewable = owned.filter((f) => !isSweepSkipped(f));
|
|
478
|
+
let cases: CasePlan[] = [];
|
|
479
|
+
let unavailable = false;
|
|
480
|
+
try {
|
|
481
|
+
cases = this.unitCases(u.name, owned, lines);
|
|
482
|
+
} catch (err) {
|
|
483
|
+
unavailable = true;
|
|
484
|
+
sizeErrors.push(String(err));
|
|
485
|
+
}
|
|
486
|
+
return {
|
|
487
|
+
name: u.name,
|
|
488
|
+
kind: u.kind,
|
|
489
|
+
roots: u.roots,
|
|
490
|
+
note: u.note,
|
|
491
|
+
files: owned.length,
|
|
492
|
+
reviewable: reviewable.length,
|
|
493
|
+
lines: unavailable ? null : cases.reduce((n, c) => n + c.lines, 0),
|
|
494
|
+
cases: unavailable
|
|
495
|
+
? null
|
|
496
|
+
: cases.map((c) => ({
|
|
497
|
+
id: c.id,
|
|
498
|
+
files: c.files.length,
|
|
499
|
+
lines: c.lines,
|
|
500
|
+
over_budget: c.over_budget,
|
|
501
|
+
})),
|
|
502
|
+
};
|
|
503
|
+
});
|
|
504
|
+
return {
|
|
505
|
+
units,
|
|
506
|
+
ignored: cut.ignored,
|
|
507
|
+
ignored_files: a.ignored.length,
|
|
508
|
+
unassigned: a.unassigned,
|
|
509
|
+
errors: [...errors, ...sizeErrors],
|
|
510
|
+
blocking_save,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
private lineCounter(): (p: string) => number {
|
|
515
|
+
const cache = new Map<string, number>();
|
|
516
|
+
return (p) => {
|
|
517
|
+
let n = cache.get(p);
|
|
518
|
+
if (n === undefined) {
|
|
519
|
+
const measured = this.ports.repo.lines(p);
|
|
520
|
+
if (measured === null)
|
|
521
|
+
throw new Error(
|
|
522
|
+
`line count UNKNOWN for ${p} — unreadable, binary or too large; no case or price can be inferred`,
|
|
523
|
+
);
|
|
524
|
+
n = measured;
|
|
525
|
+
cache.set(p, n);
|
|
526
|
+
}
|
|
527
|
+
return n;
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/** The saved cut and the draft, each re-checked against the repo as it is
|
|
532
|
+
* now — so a saved cut the repo has outgrown (a new top-level directory no
|
|
533
|
+
* unit claims) shows up here instead of being silently skipped later. */
|
|
534
|
+
status(): CutStatus {
|
|
535
|
+
const { file, error } = this.load();
|
|
536
|
+
const problems = error === null ? [] : [error];
|
|
537
|
+
const files = this.files();
|
|
538
|
+
if (files === null) problems.push(this.noRepo().errors[0]!);
|
|
539
|
+
const head = files === null ? null : this.ports.repo.head();
|
|
540
|
+
const lines = this.lineCounter();
|
|
541
|
+
const see = (cut: UnitCut): CutView =>
|
|
542
|
+
files === null
|
|
543
|
+
? {
|
|
544
|
+
units: cut.units.map((u) => ({
|
|
545
|
+
...u,
|
|
546
|
+
files: null,
|
|
547
|
+
reviewable: null,
|
|
548
|
+
lines: null,
|
|
549
|
+
cases: null,
|
|
550
|
+
})),
|
|
551
|
+
ignored: cut.ignored,
|
|
552
|
+
ignored_files: null,
|
|
553
|
+
unassigned: null,
|
|
554
|
+
errors: [],
|
|
555
|
+
blocking_save: [],
|
|
556
|
+
}
|
|
557
|
+
: this.view(cut, files, lines);
|
|
558
|
+
return {
|
|
559
|
+
ok: problems.length === 0,
|
|
560
|
+
problems,
|
|
561
|
+
cut_file_unreadable: error !== null,
|
|
562
|
+
saved: file.saved
|
|
563
|
+
? {
|
|
564
|
+
...see(file.saved),
|
|
565
|
+
saved_at: file.saved.saved_at,
|
|
566
|
+
head: file.saved.head,
|
|
567
|
+
files_at_save: file.saved.files,
|
|
568
|
+
}
|
|
569
|
+
: null,
|
|
570
|
+
draft: file.draft
|
|
571
|
+
? { ...see(file.draft), updated_at: file.draft.updated_at, source: file.draft.source }
|
|
572
|
+
: null,
|
|
573
|
+
has_previous: file.previous !== null,
|
|
574
|
+
repo_files: files?.length ?? null,
|
|
575
|
+
head,
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
// -- the three verbs --
|
|
580
|
+
|
|
581
|
+
/**
|
|
582
|
+
* Store a proposal as the draft, replacing any earlier draft (never the
|
|
583
|
+
* saved cut). `raw` is the companion's proposal — `{units, ignored?}` — or
|
|
584
|
+
* undefined to take the deterministic candidates as they are (vendored
|
|
585
|
+
* trees ignored). Refused when it is structurally wrong; save-blocking
|
|
586
|
+
* conditions are allowed in a draft and reported.
|
|
587
|
+
*/
|
|
588
|
+
propose(raw?: unknown): { ok: true; draft: CutView } | Refusal {
|
|
589
|
+
const files = this.files();
|
|
590
|
+
if (files === null) return this.noRepo();
|
|
591
|
+
const loaded = this.loadForWrite();
|
|
592
|
+
if ("ok" in loaded) return loaded;
|
|
593
|
+
let cut: UnitCut;
|
|
594
|
+
let source: DraftCut["source"];
|
|
595
|
+
if (raw === undefined || raw === null || (typeof raw === "object" && !("units" in raw))) {
|
|
596
|
+
cut = candidateCut(unitCandidates(files), files);
|
|
597
|
+
source = "candidates";
|
|
598
|
+
} else {
|
|
599
|
+
const n = normalizeCut(raw);
|
|
600
|
+
if (!n.ok) return n;
|
|
601
|
+
cut = n.cut;
|
|
602
|
+
source = "companion";
|
|
603
|
+
}
|
|
604
|
+
const problems = checkCut(cut, files);
|
|
605
|
+
if (problems.errors.length > 0) return { ok: false, errors: problems.errors };
|
|
606
|
+
loaded.file.draft = { ...cut, updated_at: this.ports.clock().toISOString(), source };
|
|
607
|
+
this.store(loaded.file);
|
|
608
|
+
return { ok: true, draft: this.view(cut, files, this.lineCounter()) };
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* Apply the operator's corrections to the draft — starting one from the
|
|
613
|
+
* saved cut when there is no draft — all-or-nothing: a refused op, or a
|
|
614
|
+
* result that is structurally wrong, leaves the stored draft as it was.
|
|
615
|
+
*/
|
|
616
|
+
adjust(ops: unknown): { ok: true; draft: CutView } | Refusal {
|
|
617
|
+
if (!Array.isArray(ops) || ops.length === 0) {
|
|
618
|
+
return { ok: false, errors: ["`ops` must be a non-empty array of adjust operations"] };
|
|
619
|
+
}
|
|
620
|
+
const files = this.files();
|
|
621
|
+
if (files === null) return this.noRepo();
|
|
622
|
+
const loaded = this.loadForWrite();
|
|
623
|
+
if ("ok" in loaded) return loaded;
|
|
624
|
+
const base = loaded.file.draft ?? loaded.file.saved;
|
|
625
|
+
if (!base)
|
|
626
|
+
return { ok: false, errors: ["there is no unit cut to adjust yet — propose one first"] };
|
|
627
|
+
const applied = applyOps({ units: base.units, ignored: base.ignored }, ops);
|
|
628
|
+
if (!applied.ok) return applied;
|
|
629
|
+
const problems = checkCut(applied.cut, files);
|
|
630
|
+
if (problems.errors.length > 0) return { ok: false, errors: problems.errors };
|
|
631
|
+
loaded.file.draft = {
|
|
632
|
+
...applied.cut,
|
|
633
|
+
updated_at: this.ports.clock().toISOString(),
|
|
634
|
+
source: "adjusted",
|
|
635
|
+
};
|
|
636
|
+
this.store(loaded.file);
|
|
637
|
+
return { ok: true, draft: this.view(applied.cut, files, this.lineCounter()) };
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/**
|
|
641
|
+
* Promote the draft to the unit cut. Refused unless it is a complete
|
|
642
|
+
* partition of the repo as it is now — every file in exactly one unit or
|
|
643
|
+
* deliberately ignored, no unit left empty. The cut it replaces is kept as
|
|
644
|
+
* `previous`.
|
|
645
|
+
*/
|
|
646
|
+
save(): { ok: true; saved: CutView } | Refusal {
|
|
647
|
+
const files = this.files();
|
|
648
|
+
if (files === null) return this.noRepo();
|
|
649
|
+
const loaded = this.loadForWrite();
|
|
650
|
+
if ("ok" in loaded) return loaded;
|
|
651
|
+
const draft = loaded.file.draft;
|
|
652
|
+
if (!draft) {
|
|
653
|
+
return {
|
|
654
|
+
ok: false,
|
|
655
|
+
errors: [
|
|
656
|
+
loaded.file.saved
|
|
657
|
+
? "no draft to save — the saved cut is already in use; adjust it to start a draft"
|
|
658
|
+
: "no draft to save — propose a unit cut first",
|
|
659
|
+
],
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
const cut: UnitCut = { units: draft.units, ignored: draft.ignored };
|
|
663
|
+
const problems = checkCut(cut, files);
|
|
664
|
+
if (problems.errors.length > 0 || problems.blocking_save.length > 0) {
|
|
665
|
+
return { ok: false, errors: [...problems.errors, ...problems.blocking_save] };
|
|
666
|
+
}
|
|
667
|
+
loaded.file.previous = loaded.file.saved;
|
|
668
|
+
loaded.file.saved = {
|
|
669
|
+
...cut,
|
|
670
|
+
saved_at: this.ports.clock().toISOString(),
|
|
671
|
+
head: this.ports.repo.head(),
|
|
672
|
+
files: files.length,
|
|
673
|
+
};
|
|
674
|
+
loaded.file.draft = null;
|
|
675
|
+
this.store(loaded.file);
|
|
676
|
+
return { ok: true, saved: this.view(cut, files, this.lineCounter()) };
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
// -- reuse --
|
|
680
|
+
|
|
681
|
+
/** The saved cut, for every later survey and scan; null when none is saved
|
|
682
|
+
* (or the file cannot be read — `status()` says which). */
|
|
683
|
+
savedCut(): SavedCut | null {
|
|
684
|
+
return this.load().file.saved;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
/**
|
|
688
|
+
* The saved cut as cases: every unit's reviewable files (optionally only
|
|
689
|
+
* those `include` keeps — a scan's stage 1 drops tests and migrations),
|
|
690
|
+
* split to fit the case budget, each case under its unit's name. Refused
|
|
691
|
+
* when there is no saved cut: a survey or scan never runs on a guess.
|
|
692
|
+
*/
|
|
693
|
+
cases(
|
|
694
|
+
include: (path: string) => boolean = () => true,
|
|
695
|
+
): { ok: true; cases: CasePlan[] } | Refusal {
|
|
696
|
+
const files = this.files();
|
|
697
|
+
if (files === null) return this.noRepo();
|
|
698
|
+
const { file, error } = this.load();
|
|
699
|
+
if (error !== null) return { ok: false, errors: [error] };
|
|
700
|
+
if (!file.saved)
|
|
701
|
+
return { ok: false, errors: ["no saved unit cut — propose, adjust and save one first"] };
|
|
702
|
+
const a = assign(file.saved, files);
|
|
703
|
+
const lines = this.lineCounter();
|
|
704
|
+
const cases: CasePlan[] = [];
|
|
705
|
+
try {
|
|
706
|
+
for (const u of file.saved.units) {
|
|
707
|
+
cases.push(...this.unitCases(u.name, (a.byUnit.get(u.name) ?? []).filter(include), lines));
|
|
708
|
+
}
|
|
709
|
+
} catch (err) {
|
|
710
|
+
return { ok: false, errors: [String(err)] };
|
|
711
|
+
}
|
|
712
|
+
return { ok: true, cases };
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
// -- review history (src/setup/history.ts) --
|
|
716
|
+
|
|
717
|
+
/** The digest in the state home: its summary, one page of one half, and the
|
|
718
|
+
* themes saved from it so far. `digest: "absent"` is the normal state
|
|
719
|
+
* before the TUI has pulled one — never an error. */
|
|
720
|
+
history(page: { section: HistorySection; offset?: number; limit?: number } | null = null): {
|
|
721
|
+
digest: "absent" | "unreadable" | "ok";
|
|
722
|
+
problems: string[];
|
|
723
|
+
summary: HistorySummary | null;
|
|
724
|
+
page: { section: HistorySection; total: number; offset: number; lines: string[] } | null;
|
|
725
|
+
themes: HistoryThemesFile | null;
|
|
726
|
+
/** The saved themes file exists but cannot be read — UNKNOWN, never "no
|
|
727
|
+
* themes saved yet". */
|
|
728
|
+
themes_error: string | null;
|
|
729
|
+
} {
|
|
730
|
+
const read = readDigest(this.ports.state);
|
|
731
|
+
const saved = historyThemesState(this.ports.state);
|
|
732
|
+
const themes = saved.state === "ok" ? saved.file : null;
|
|
733
|
+
const themes_error = saved.state === "unreadable" ? saved.error : null;
|
|
734
|
+
if (read.state !== "ok") {
|
|
735
|
+
return {
|
|
736
|
+
digest: read.state,
|
|
737
|
+
problems: read.state === "unreadable" ? [read.error] : [],
|
|
738
|
+
summary: null,
|
|
739
|
+
page: null,
|
|
740
|
+
themes,
|
|
741
|
+
themes_error,
|
|
742
|
+
};
|
|
743
|
+
}
|
|
744
|
+
return {
|
|
745
|
+
digest: "ok",
|
|
746
|
+
problems: [],
|
|
747
|
+
summary: summarize(read.digest),
|
|
748
|
+
page: page
|
|
749
|
+
? {
|
|
750
|
+
section: page.section,
|
|
751
|
+
...historyPage(read.digest, page.section, page.offset ?? 0, page.limit ?? 50),
|
|
752
|
+
}
|
|
753
|
+
: null,
|
|
754
|
+
themes,
|
|
755
|
+
themes_error,
|
|
756
|
+
};
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
/** Save the companion's themes — the only part of the history that goes on
|
|
760
|
+
* to memory and the portrait. One save at a time: two overlapping saves
|
|
761
|
+
* would each read the same earlier entries to replace and both write their
|
|
762
|
+
* own, leaving two sets live while the file holds one. */
|
|
763
|
+
saveHistoryThemes(raw: unknown): Promise<SaveThemesResult> {
|
|
764
|
+
const run = this.historySaves.then(() =>
|
|
765
|
+
saveHistoryThemes(
|
|
766
|
+
{ state: this.ports.state, memory: this.ports.memory, clock: this.ports.clock },
|
|
767
|
+
raw,
|
|
768
|
+
),
|
|
769
|
+
);
|
|
770
|
+
this.historySaves = run.catch(() => undefined);
|
|
771
|
+
return run;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
private historySaves: Promise<unknown> = Promise.resolve();
|
|
775
|
+
|
|
776
|
+
// -- the survey (the run itself is surveyrun.ts) --
|
|
777
|
+
|
|
778
|
+
/** What a survey reads, over the saved cut and the facts as they are now. */
|
|
779
|
+
private surveyInputs(): SurveyInputs {
|
|
780
|
+
const files = this.files();
|
|
781
|
+
if (files === null) return this.noRepo();
|
|
782
|
+
const { file, error } = this.load();
|
|
783
|
+
if (error !== null) return { ok: false, errors: [error] };
|
|
784
|
+
if (!file.saved)
|
|
785
|
+
return {
|
|
786
|
+
ok: false,
|
|
787
|
+
errors: [
|
|
788
|
+
"no saved unit cut — the survey reads by unit; propose, adjust and save one first",
|
|
789
|
+
],
|
|
790
|
+
};
|
|
791
|
+
const facts = repoFacts(files, (p) => this.ports.repo.read(p));
|
|
792
|
+
const lines = this.lineCounter();
|
|
793
|
+
const assigned = assign(file.saved, files);
|
|
794
|
+
const candidates = new Set([
|
|
795
|
+
...facts.agent_files,
|
|
796
|
+
...facts.guides,
|
|
797
|
+
...[...assigned.byUnit.values()].flat().filter(isSampleable),
|
|
798
|
+
]);
|
|
799
|
+
try {
|
|
800
|
+
for (const path of candidates) if (!assigned.ignored.includes(path)) lines(path);
|
|
801
|
+
} catch (err) {
|
|
802
|
+
return { ok: false, errors: [String(err)] };
|
|
803
|
+
}
|
|
804
|
+
let changes: Record<string, number> | null = null;
|
|
805
|
+
try {
|
|
806
|
+
changes = this.ports.repo.changeCounts?.() ?? null;
|
|
807
|
+
} catch {
|
|
808
|
+
changes = null;
|
|
809
|
+
}
|
|
810
|
+
return {
|
|
811
|
+
ok: true,
|
|
812
|
+
head: this.ports.repo.head(),
|
|
813
|
+
input: {
|
|
814
|
+
cut: file.saved,
|
|
815
|
+
files,
|
|
816
|
+
agentFiles: facts.agent_files,
|
|
817
|
+
guides: facts.guides,
|
|
818
|
+
linesOf: lines,
|
|
819
|
+
changes,
|
|
820
|
+
budget: this.budget,
|
|
821
|
+
},
|
|
822
|
+
};
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/** The survey's cases, sample and price now, and the key a start quotes. */
|
|
826
|
+
surveyPreview(): Promise<{ ok: true; preview: SurveyPreview } | Refusal> {
|
|
827
|
+
return this.surveyRun.preview();
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
/** Start the previewed survey in the background (see surveyrun.ts for
|
|
831
|
+
* every refusal). Returns as soon as the run is recorded. */
|
|
832
|
+
surveyStart(args: {
|
|
833
|
+
key?: unknown;
|
|
834
|
+
resurvey?: unknown;
|
|
835
|
+
}): Promise<{ ok: true; run: SurveyRun } | Refusal> {
|
|
836
|
+
return this.surveyRun.start(args);
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
surveyStatus(): SurveyStatus {
|
|
840
|
+
return this.surveyRun.status();
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
surveyStop(): { ok: true; id: string } | Refusal {
|
|
844
|
+
return this.surveyRun.stop();
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
/** Resolves when no survey is running. */
|
|
848
|
+
surveyIdle(): Promise<void> {
|
|
849
|
+
return this.surveyRun.idle();
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
// -- the repo portrait (src/setup/portrait.ts) --
|
|
853
|
+
|
|
854
|
+
/** The portrait facts as they are now, from what is already on disk: the
|
|
855
|
+
* repo facts, the saved cut (the candidates, flagged, when none is saved),
|
|
856
|
+
* the saved history themes, the last completed survey and what the scans
|
|
857
|
+
* found. */
|
|
858
|
+
private portraitFacts(): { ok: true; facts: PortraitFacts } | Refusal {
|
|
859
|
+
const files = this.files();
|
|
860
|
+
if (files === null) return this.noRepo();
|
|
861
|
+
const repo = repoFacts(files, (p) => this.ports.repo.read(p));
|
|
862
|
+
const problems: string[] = [];
|
|
863
|
+
const { file, error } = this.load();
|
|
864
|
+
if (error !== null) problems.push(error);
|
|
865
|
+
const cut: UnitCut = file.saved ?? candidateCut(repo.unit_candidates, files);
|
|
866
|
+
const view = this.view(cut, files, this.lineCounter());
|
|
867
|
+
problems.push(...view.errors, ...view.blocking_save);
|
|
868
|
+
const unassigned = view.unassigned?.length;
|
|
869
|
+
if (unassigned !== undefined && unassigned > 0)
|
|
870
|
+
problems.push(`${unassigned} file(s) are unassigned by the saved unit cut`);
|
|
871
|
+
const themes = historyThemesState(this.ports.state);
|
|
872
|
+
if (themes.state === "unreadable") problems.push(themes.error);
|
|
873
|
+
const survey = this.surveyRun.status();
|
|
874
|
+
problems.push(...survey.problems);
|
|
875
|
+
const done = survey.last_complete;
|
|
876
|
+
// What the scans found, from the state home's scan records.
|
|
877
|
+
const scanned = scanFacts(this.ports.state);
|
|
878
|
+
problems.push(...scanned.problems);
|
|
879
|
+
return {
|
|
880
|
+
ok: true,
|
|
881
|
+
facts: {
|
|
882
|
+
head: this.ports.repo.head(),
|
|
883
|
+
stack: {
|
|
884
|
+
files: repo.files,
|
|
885
|
+
languages: repo.languages,
|
|
886
|
+
manifests: repo.manifests,
|
|
887
|
+
frameworks: repo.frameworks,
|
|
888
|
+
},
|
|
889
|
+
units: {
|
|
890
|
+
source: file.saved ? "saved" : "candidates",
|
|
891
|
+
saved_at: file.saved?.saved_at ?? null,
|
|
892
|
+
units: view.units.map((u) => ({
|
|
893
|
+
name: u.name,
|
|
894
|
+
kind: u.kind,
|
|
895
|
+
roots: u.roots,
|
|
896
|
+
note: u.note,
|
|
897
|
+
files: u.files,
|
|
898
|
+
reviewable: u.reviewable,
|
|
899
|
+
lines: u.lines,
|
|
900
|
+
cases: u.cases?.length ?? null,
|
|
901
|
+
})),
|
|
902
|
+
ignored: cut.ignored,
|
|
903
|
+
},
|
|
904
|
+
conventions: {
|
|
905
|
+
guides: repo.guides,
|
|
906
|
+
style_guides: repo.style_guides,
|
|
907
|
+
agent_files: repo.agent_files,
|
|
908
|
+
},
|
|
909
|
+
enforced: { ci: repo.ci, linters: repo.linters },
|
|
910
|
+
history:
|
|
911
|
+
themes.state === "ok"
|
|
912
|
+
? {
|
|
913
|
+
state: "ok",
|
|
914
|
+
saved_at: themes.file.saved_at,
|
|
915
|
+
digest_generated_at: themes.file.digest_generated_at,
|
|
916
|
+
themes: themes.file.themes,
|
|
917
|
+
}
|
|
918
|
+
: { state: themes.state, saved_at: null, digest_generated_at: null, themes: [] },
|
|
919
|
+
survey: done
|
|
920
|
+
? { id: done.id, finished_at: done.finished_at, head: done.head, notes: done.notes }
|
|
921
|
+
: null,
|
|
922
|
+
scan: scanned.scan,
|
|
923
|
+
problems,
|
|
924
|
+
},
|
|
925
|
+
};
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
/** Assemble the portrait facts and store them in the state home, keeping
|
|
929
|
+
* the version a new shape replaces (portrait.ts `saveFacts`). */
|
|
930
|
+
portraitAssemble(): AssembleResult {
|
|
931
|
+
const r = this.portraitFacts();
|
|
932
|
+
if (!r.ok) return r;
|
|
933
|
+
return saveFacts(this.ports.state, r.facts, this.ports.clock());
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
/** The stored portrait — facts, narrative, whether the narrative predates
|
|
937
|
+
* the facts — and, when asked, what changed since the kept versions. */
|
|
938
|
+
portrait(opts: { diff?: boolean } = {}): PortraitView {
|
|
939
|
+
return readPortrait(this.portraitDeps(), opts);
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
/** Store the companion's narrative against the facts key it read. */
|
|
943
|
+
storePortraitNarrative(raw: { facts_key?: unknown; narrative?: unknown }): StoreNarrativeResult {
|
|
944
|
+
return storeNarrative(this.portraitDeps(), raw);
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
private portraitDeps(): { state: StateFs; config: StateFs | null; clock: () => Date } {
|
|
948
|
+
return { state: this.ports.state, config: this.ports.config ?? null, clock: this.ports.clock };
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
// -- the interview's tuning (src/setup/tuning.ts) --
|
|
952
|
+
|
|
953
|
+
private tuningDeps(): Parameters<typeof profileStatus>[0] {
|
|
954
|
+
return {
|
|
955
|
+
state: this.ports.state,
|
|
956
|
+
profiles: this.ports.profiles ?? null,
|
|
957
|
+
memory: this.ports.memory,
|
|
958
|
+
clock: this.ports.clock,
|
|
959
|
+
};
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
/** Which profile the install uses, whether it loads, whether setup is
|
|
963
|
+
* owed (the companion's nudge), the answers so far and the commits asked. */
|
|
964
|
+
profileStatus(): ProfileStatus | Refusal {
|
|
965
|
+
return profileStatus(this.tuningDeps());
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
/** The daemon's own check of a profile as it is on disk — a direct edit's
|
|
969
|
+
* safety net. */
|
|
970
|
+
profileValidate(name?: unknown): { profile: string; check: ProfileCheck } | Refusal {
|
|
971
|
+
return profileValidate(this.tuningDeps(), name);
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
/** The interview's answers → the profile: previewed with a diff, or
|
|
975
|
+
* written (validated first, committed on the operator's machine). */
|
|
976
|
+
profileApply(input: ApplyInput): ApplyResult | Refusal {
|
|
977
|
+
return profileApply(this.tuningDeps(), input);
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
/** After a scan (src/setup/retune.ts): the companion's profile
|
|
981
|
+
* changes, each with its reason, previewed or written through the same
|
|
982
|
+
* path as the interview's — a write logs the report and refreshes the
|
|
983
|
+
* portrait facts. It reaches PR reviews only on the operator's deploy. */
|
|
984
|
+
retune(input: RetuneInput): RetuneResult | Refusal {
|
|
985
|
+
return retune(
|
|
986
|
+
{
|
|
987
|
+
...this.tuningDeps(),
|
|
988
|
+
refreshPortrait: () => {
|
|
989
|
+
const r = this.portraitAssemble();
|
|
990
|
+
return r.ok ? { ok: true, key: r.current.key } : r;
|
|
991
|
+
},
|
|
992
|
+
},
|
|
993
|
+
input,
|
|
994
|
+
);
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
/** Propose memory entries to pin; the operator decides in the TUI. */
|
|
998
|
+
proposePins(entries: unknown): Promise<PinProposeResult | Refusal> {
|
|
999
|
+
return proposePins(this.tuningDeps(), entries);
|
|
1000
|
+
}
|
|
1001
|
+
}
|