@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,191 @@
|
|
|
1
|
+
# The memory sidecar image: OpenViking, its venv, llama-cpp-python and the
|
|
2
|
+
# pinned GGUF, run by the same supervisors the daemon uses in-container.
|
|
3
|
+
#
|
|
4
|
+
# docker build -f docker/memory/Dockerfile -t qcr-memory .
|
|
5
|
+
#
|
|
6
|
+
# The build context is the repo root, narrowed by
|
|
7
|
+
# docker/memory/Dockerfile.dockerignore (BuildKit reads it in preference to the
|
|
8
|
+
# root .dockerignore).
|
|
9
|
+
#
|
|
10
|
+
# WHAT IT IS. The daemon's `[openviking] endpoint = "local"` (the default, and
|
|
11
|
+
# every live daemon today) supervises the server and the local embedder as its
|
|
12
|
+
# own children, in its own container. With `endpoint = "remote"` the daemon
|
|
13
|
+
# only probes a server somebody else runs, and THIS image is that somebody:
|
|
14
|
+
# entrypoint.sh renders ov.conf, runs the embedder migration's `prepare`, and
|
|
15
|
+
# provisions the users, then execs src/openviking/sidecar-main.ts, which
|
|
16
|
+
# supervises the server and the embedder and drives the re-embed.
|
|
17
|
+
#
|
|
18
|
+
# The four OpenViking pins of the version-pinning rule move here intact (the vendored
|
|
19
|
+
# extension's base commit rides the repo, not an image). The ARG defaults below
|
|
20
|
+
# are a MIRROR of config.toml [openviking] and deploy/ansible/group_vars/
|
|
21
|
+
# all.yml: tests/memory-image.test.ts fails the moment one drifts, the same
|
|
22
|
+
# discipline as the release image's pins (tests/release-image.test.ts). Bump a
|
|
23
|
+
# pin deliberately - config.toml + group_vars + this Dockerfile together, never
|
|
24
|
+
# one alone - and never change the embedder under a live store without the
|
|
25
|
+
# re-embed migration (docs/memory-embeddings.md).
|
|
26
|
+
ARG NODE_MAJOR=26
|
|
27
|
+
|
|
28
|
+
# ---- build ---------------------------------------------------------------------
|
|
29
|
+
# Compiles the TypeScript; the sidecar ships dist/, the review core's
|
|
30
|
+
# compiled package (the config parser's review half is the core's), and the
|
|
31
|
+
# one runtime package their import closure reaches (smol-toml -
|
|
32
|
+
# tests/memory-image.test.ts holds the closure to the COPY lines below).
|
|
33
|
+
FROM node:${NODE_MAJOR}-bookworm AS build
|
|
34
|
+
WORKDIR /src
|
|
35
|
+
COPY package.json package-lock.json ./
|
|
36
|
+
# A workspace's manifest must be in place before `npm ci`, which links it.
|
|
37
|
+
COPY packages/pi-plugin/package.json packages/pi-plugin/package.json
|
|
38
|
+
RUN npm ci --no-audit --no-fund
|
|
39
|
+
COPY tsconfig.json ./
|
|
40
|
+
COPY scripts/verify-dist.mjs scripts/verify-dist.mjs
|
|
41
|
+
COPY packages packages
|
|
42
|
+
COPY src src
|
|
43
|
+
COPY extensions extensions
|
|
44
|
+
RUN npx tsc -b && node scripts/verify-dist.mjs
|
|
45
|
+
|
|
46
|
+
# ---- memory --------------------------------------------------------------------
|
|
47
|
+
FROM ubuntu:24.04 AS memory
|
|
48
|
+
|
|
49
|
+
# ---- pinned versions (mirror of config.toml + group_vars; see header) -----------
|
|
50
|
+
ARG TZ=Europe/Warsaw
|
|
51
|
+
ARG NODE_MAJOR
|
|
52
|
+
ARG OPENVIKING_VERSION=0.4.15
|
|
53
|
+
ARG LLAMA_CPP_PYTHON_VERSION=0.3.35
|
|
54
|
+
ARG OPENVIKING_VENV=/opt/openviking/venv
|
|
55
|
+
ARG LOCAL_EMBEDDER_MODEL=bge-small-en-v1.5-f16
|
|
56
|
+
ARG LOCAL_EMBEDDER_DIR=/opt/openviking/models
|
|
57
|
+
ARG LOCAL_EMBEDDER_URL=https://huggingface.co/CompendiumLabs/bge-small-en-v1.5-gguf/resolve/d32f8c040ea3b516330eeb75b72bcc2d3a780ab7/bge-small-en-v1.5-f16.gguf
|
|
58
|
+
ARG LOCAL_EMBEDDER_SHA256=f0b2fef971e8366438bfd2d9aefea1b0115919389448806d290237f638bae999
|
|
59
|
+
ARG OPENVIKING_PORT=1933
|
|
60
|
+
# set by buildx per platform: the llama build below targets it, never the build host
|
|
61
|
+
ARG TARGETARCH
|
|
62
|
+
|
|
63
|
+
ENV DEBIAN_FRONTEND=noninteractive \
|
|
64
|
+
TZ=${TZ}
|
|
65
|
+
|
|
66
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
67
|
+
ca-certificates curl tzdata \
|
|
68
|
+
build-essential python3 \
|
|
69
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
70
|
+
|
|
71
|
+
# Node (NodeSource): the supervisors and the boot scripts are node.
|
|
72
|
+
RUN curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | bash - \
|
|
73
|
+
&& apt-get install -y --no-install-recommends nodejs \
|
|
74
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
75
|
+
|
|
76
|
+
# OpenViking - the context store, in its own venv so its ~90 Python deps never
|
|
77
|
+
# collide with anything system-side.
|
|
78
|
+
#
|
|
79
|
+
# llama-cpp-python is installed FIRST and deliberately: it is NOT an openviking
|
|
80
|
+
# dependency but an undeclared optional extra, and without it the default local
|
|
81
|
+
# dense embedder raises EmbeddingConfigurationError at startup - the official
|
|
82
|
+
# image cannot boot (verified against a running 0.4.15). It is also the
|
|
83
|
+
# runtime of the local English embedder (the model layer below). Do not "clean
|
|
84
|
+
# it up".
|
|
85
|
+
#
|
|
86
|
+
# Both versions come from the ARG mirror above (== config.toml [openviking] ==
|
|
87
|
+
# group_vars); a literal here would be exactly the drift the pin prevents. The
|
|
88
|
+
# layer hard-fails unless the INSTALLED distribution reports the pinned version
|
|
89
|
+
# and the server entry point exists.
|
|
90
|
+
#
|
|
91
|
+
# llama-cpp-python compiles llama.cpp from source, and by default for the BUILD
|
|
92
|
+
# host's CPU (-march=native). CI's runners have AVX-512; the VM's Xeon does not,
|
|
93
|
+
# so a native build dies of SIGILL on the VM (the 1.0.2 cutover). The build is
|
|
94
|
+
# therefore portable: on amd64 the AVX2 level (AVX, AVX2, FMA, F16C) and nothing
|
|
95
|
+
# newer, on arm64 the architecture's baseline. The layer then refuses a library
|
|
96
|
+
# that carries AVX-512, VNNI or AMX instructions, because CI's own smoke runs on
|
|
97
|
+
# a CPU that has them and could never see the crash.
|
|
98
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
99
|
+
python3-venv python3-dev cmake \
|
|
100
|
+
&& python3 -m venv "${OPENVIKING_VENV}" \
|
|
101
|
+
&& "${OPENVIKING_VENV}/bin/pip" install --no-cache-dir --upgrade pip \
|
|
102
|
+
&& arch="${TARGETARCH:-$(dpkg --print-architecture)}" \
|
|
103
|
+
&& case "$arch" in \
|
|
104
|
+
amd64) llama_cmake="-DGGML_NATIVE=OFF -DGGML_AVX=ON -DGGML_AVX2=ON -DGGML_FMA=ON -DGGML_F16C=ON -DGGML_AVX_VNNI=OFF -DGGML_AVX512=OFF -DGGML_AVX512_VBMI=OFF -DGGML_AVX512_VNNI=OFF -DGGML_AVX512_BF16=OFF -DGGML_AMX_TILE=OFF -DGGML_AMX_INT8=OFF -DGGML_AMX_BF16=OFF" ;; \
|
|
105
|
+
*) llama_cmake="-DGGML_NATIVE=OFF" ;; \
|
|
106
|
+
esac \
|
|
107
|
+
&& CMAKE_ARGS="$llama_cmake" "${OPENVIKING_VENV}/bin/pip" install --no-cache-dir --no-binary llama-cpp-python "llama-cpp-python==${LLAMA_CPP_PYTHON_VERSION}" \
|
|
108
|
+
&& if [ "$arch" = amd64 ]; then \
|
|
109
|
+
libs="$(find "${OPENVIKING_VENV}" -path '*llama_cpp*' -name '*.so*' -type f)" \
|
|
110
|
+
&& [ -n "$libs" ] \
|
|
111
|
+
&& for so in $libs; do \
|
|
112
|
+
if objdump -d --no-show-raw-insn "$so" | grep -qE '%zmm|vpdpbusd|vpdpwssd|tdpb|tileloadd'; then \
|
|
113
|
+
echo "FATAL: $so carries AVX-512/VNNI/AMX instructions: the VM cannot run it (SIGILL)" >&2; exit 1; \
|
|
114
|
+
fi; \
|
|
115
|
+
done; \
|
|
116
|
+
fi \
|
|
117
|
+
&& "${OPENVIKING_VENV}/bin/pip" install --no-cache-dir "openviking==${OPENVIKING_VERSION}" \
|
|
118
|
+
&& "${OPENVIKING_VENV}/bin/python" -c "import importlib.metadata as m, sys; v=m.version('openviking'); sys.exit(0 if v=='${OPENVIKING_VERSION}' else 'openviking version %s != ${OPENVIKING_VERSION}' % v)" \
|
|
119
|
+
&& "${OPENVIKING_VENV}/bin/python" -c "import importlib.metadata as m, sys; v=m.version('llama-cpp-python'); sys.exit(0 if v=='${LLAMA_CPP_PYTHON_VERSION}' else 'llama-cpp-python %s != ${LLAMA_CPP_PYTHON_VERSION}' % v)" \
|
|
120
|
+
&& "${OPENVIKING_VENV}/bin/python" -c "import llama_cpp" \
|
|
121
|
+
&& test -x "${OPENVIKING_VENV}/bin/openviking-server" \
|
|
122
|
+
&& rm -rf /var/lib/apt/lists/* \
|
|
123
|
+
|| { echo "FATAL: openviking==${OPENVIKING_VERSION} / llama-cpp-python==${LLAMA_CPP_PYTHON_VERSION} failed verification" >&2; exit 1; }
|
|
124
|
+
|
|
125
|
+
# The LOCAL ENGLISH EMBEDDER's model file - pinned by URL AND sha256 (the ARG
|
|
126
|
+
# mirror above == config.toml [openviking] local_embedder_* == group_vars
|
|
127
|
+
# openviking_local_embedder_*). Downloaded HERE, at build time, so the running
|
|
128
|
+
# container never fetches a model (the sidecar boots offline); the layer
|
|
129
|
+
# hard-fails unless the bytes hash to the pin, and scripts/openviking-embedder.py
|
|
130
|
+
# re-checks the hash at every start. Carried whatever the configured provider.
|
|
131
|
+
RUN mkdir -p "${LOCAL_EMBEDDER_DIR}" \
|
|
132
|
+
&& curl -fsSL --retry 3 -o "${LOCAL_EMBEDDER_DIR}/${LOCAL_EMBEDDER_MODEL}.gguf" "${LOCAL_EMBEDDER_URL}" \
|
|
133
|
+
&& echo "${LOCAL_EMBEDDER_SHA256} ${LOCAL_EMBEDDER_DIR}/${LOCAL_EMBEDDER_MODEL}.gguf" | sha256sum -c - \
|
|
134
|
+
&& chmod 0444 "${LOCAL_EMBEDDER_DIR}/${LOCAL_EMBEDDER_MODEL}.gguf" \
|
|
135
|
+
|| { echo "FATAL: the local embedder model ${LOCAL_EMBEDDER_MODEL} failed to download or does not match its pinned sha256" >&2; exit 1; }
|
|
136
|
+
# ...and the image TELLS its entrypoint which file it carries, so the boot
|
|
137
|
+
# renders from the image's pin, whatever ARGs it was built with.
|
|
138
|
+
ENV QCR_OPENVIKING_LOCAL_EMBEDDER_MODEL=${LOCAL_EMBEDDER_MODEL} \
|
|
139
|
+
QCR_OPENVIKING_LOCAL_EMBEDDER_DIR=${LOCAL_EMBEDDER_DIR} \
|
|
140
|
+
QCR_OPENVIKING_LOCAL_EMBEDDER_SHA256=${LOCAL_EMBEDDER_SHA256} \
|
|
141
|
+
QCR_OPENVIKING_VENV=${OPENVIKING_VENV} \
|
|
142
|
+
QCR_OPENVIKING_PORT=${OPENVIKING_PORT}
|
|
143
|
+
|
|
144
|
+
# The pins this image carries, as labels the VM's updater and the deploy
|
|
145
|
+
# preflight read without running it (mirrors: config.toml [openviking] ==
|
|
146
|
+
# group_vars openviking_* == the ARGs above).
|
|
147
|
+
LABEL qcr.openviking="${OPENVIKING_VERSION}" \
|
|
148
|
+
qcr.llama-cpp-python="${LLAMA_CPP_PYTHON_VERSION}" \
|
|
149
|
+
qcr.embedder-file="${LOCAL_EMBEDDER_DIR}/${LOCAL_EMBEDDER_MODEL}.gguf" \
|
|
150
|
+
qcr.embedder-sha256="${LOCAL_EMBEDDER_SHA256}"
|
|
151
|
+
|
|
152
|
+
# The app: root-owned, never written at run time. dist/ is the supervisors and
|
|
153
|
+
# the config parser; scripts/ is the boot provisioning, the migration and the
|
|
154
|
+
# embedder service; smol-toml is the one package config.ts reaches.
|
|
155
|
+
WORKDIR /opt/qcr
|
|
156
|
+
COPY package.json ./
|
|
157
|
+
COPY --from=build /src/dist ./dist
|
|
158
|
+
COPY --from=build /src/node_modules/smol-toml ./node_modules/smol-toml
|
|
159
|
+
# The review core's package, where an install puts it: its manifest (the
|
|
160
|
+
# export map) and its compiled tree.
|
|
161
|
+
COPY --from=build /src/packages/pi-plugin/package.json ./node_modules/@quickchatai/pi-quickreview/package.json
|
|
162
|
+
COPY --from=build /src/packages/pi-plugin/dist ./node_modules/@quickchatai/pi-quickreview/dist
|
|
163
|
+
COPY scripts ./scripts
|
|
164
|
+
COPY config.example.toml ./config.example.toml
|
|
165
|
+
COPY docker/memory/entrypoint.sh /usr/local/bin/entrypoint.sh
|
|
166
|
+
RUN chmod -R a+rX,go-w /opt/qcr && chmod 0755 /usr/local/bin/entrypoint.sh
|
|
167
|
+
|
|
168
|
+
# The container user. 1001 is the uid the daemon-era stores were
|
|
169
|
+
# written under, so one opens here without a chown. --non-unique because 24.04
|
|
170
|
+
# already ships an `ubuntu` user at 1000; HOME is set EXPLICITLY.
|
|
171
|
+
ARG REVIEW_UID=1001
|
|
172
|
+
RUN useradd --create-home --non-unique --uid ${REVIEW_UID} review
|
|
173
|
+
# The state mount point, owned by the container user: Docker seeds a fresh
|
|
174
|
+
# named volume from the image directory it is mounted over - a mount point the
|
|
175
|
+
# image lacks would be root-owned and unwritable.
|
|
176
|
+
RUN install -d -o review -g review /opt/quickreview/state /opt/quickreview/state/openviking
|
|
177
|
+
# Any uid: the compose stack runs this container as the operator's own uid (so
|
|
178
|
+
# the 0600 key files in the secrets mount stay readable), which owns neither
|
|
179
|
+
# the store nor HOME. World-writable and sticky, like the release image's.
|
|
180
|
+
RUN chmod 1777 /opt/quickreview/state /opt/quickreview/state/openviking /home/review
|
|
181
|
+
ENV HOME=/home/review \
|
|
182
|
+
QCR_APP_ROOT=/opt/qcr
|
|
183
|
+
|
|
184
|
+
USER review
|
|
185
|
+
WORKDIR /opt/quickreview/state/openviking
|
|
186
|
+
# The port is the container network's, never published to a host.
|
|
187
|
+
EXPOSE ${OPENVIKING_PORT}
|
|
188
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=120s --retries=3 \
|
|
189
|
+
CMD curl -fsS "http://127.0.0.1:${QCR_OPENVIKING_PORT:-1933}/health" >/dev/null || exit 1
|
|
190
|
+
|
|
191
|
+
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# The memory sidecar's build context (docker/memory/Dockerfile). BuildKit reads
|
|
2
|
+
# this file in preference to the root .dockerignore. Admits only what the image
|
|
3
|
+
# copies; everything else in the checkout stays out.
|
|
4
|
+
*
|
|
5
|
+
!package.json
|
|
6
|
+
!package-lock.json
|
|
7
|
+
!tsconfig.json
|
|
8
|
+
!packages
|
|
9
|
+
!src
|
|
10
|
+
!extensions
|
|
11
|
+
!scripts
|
|
12
|
+
!config.example.toml
|
|
13
|
+
!docker/memory/entrypoint.sh
|
|
14
|
+
**/node_modules
|
|
15
|
+
**/.git
|
|
16
|
+
# A package's build output and its packed data are built in the image.
|
|
17
|
+
packages/*/dist
|
|
18
|
+
packages/*/assets
|
|
19
|
+
# Agent instruction files, never in an image.
|
|
20
|
+
**/CLAUDE.md
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Memory sidecar image
|
|
2
|
+
|
|
3
|
+
OpenViking, its venv, llama-cpp-python and the pinned GGUF in a container of
|
|
4
|
+
their own. The daemon keeps `[openviking] endpoint = "local"` (supervising the
|
|
5
|
+
same pair in-container) until the VM flips; this image is what
|
|
6
|
+
`endpoint = "remote"` points at, and what `qcr memory on` runs on a laptop.
|
|
7
|
+
|
|
8
|
+
```sh
|
|
9
|
+
docker build -f docker/memory/Dockerfile -t qcr-memory . # from the repo root
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## What it does at boot
|
|
13
|
+
|
|
14
|
+
`entrypoint.sh` renders, migrates and provisions the memory store, then
|
|
15
|
+
execs `src/openviking/sidecar-main.ts`:
|
|
16
|
+
|
|
17
|
+
1. renders `ov.conf` (`scripts/openviking-ov-conf.mjs`; `tests/memory-image.test.ts` runs it);
|
|
18
|
+
2. `openviking-reembed.mjs prepare`: a store built under another embedder has
|
|
19
|
+
its vector collection moved ASIDE (never deleted) and is journalled for
|
|
20
|
+
re-embedding;
|
|
21
|
+
3. `openviking-provision.mjs`: creates missing users, never rotates a key;
|
|
22
|
+
4. supervises the server and the local embedder (the daemon's own classes, so
|
|
23
|
+
the start gate, restart ladder and logs are the same) and drives the
|
|
24
|
+
re-embed once `/ready` passes.
|
|
25
|
+
|
|
26
|
+
The GGUF is in the image, so the sidecar boots offline under the local embedder.
|
|
27
|
+
|
|
28
|
+
## On the VM
|
|
29
|
+
|
|
30
|
+
`deploy/ansible/playbook.yml` runs it as a second container, `quickreview-memory`,
|
|
31
|
+
beside `quickreview-sandbox` when `openviking_endpoint: "remote"` (group_vars,
|
|
32
|
+
mirrored by `[openviking] endpoint`; `scripts/deploy.sh` refuses them apart and
|
|
33
|
+
plans/verifies both containers). The playbook builds this image from the
|
|
34
|
+
shipped tree with BuildKit, puts both containers on the `quickreview-memory`
|
|
35
|
+
network, and gives the sidecar its own store directory
|
|
36
|
+
(`/opt/quickreview/memory-state`): copied once from the daemon's, verified by
|
|
37
|
+
checksum, never wiped, with the daemon's directory left as the rollback's store.
|
|
38
|
+
`[openviking] endpoint = "local"` (both places) is the rollback.
|
|
39
|
+
|
|
40
|
+
## Wiring it to a daemon (by hand)
|
|
41
|
+
|
|
42
|
+
The daemon's config.toml and the sidecar's are the same file (mount the config
|
|
43
|
+
home read-only into both). On the daemon side:
|
|
44
|
+
|
|
45
|
+
```toml
|
|
46
|
+
[openviking]
|
|
47
|
+
endpoint = "remote"
|
|
48
|
+
host = "quickreview-memory" # the sidecar's name on the container network
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Mount into the sidecar: the config home (read-only), the secrets dir
|
|
52
|
+
(read-only, holding `openviking_root_key` and `openviking_reviewer_key`), and
|
|
53
|
+
the OpenViking state at `/opt/quickreview/state/openviking` (a COPY of the
|
|
54
|
+
daemon's store, never the daemon's own directory while a daemon may still
|
|
55
|
+
write it; the image's user is uid 1001 like the daemon's). Never publish port
|
|
56
|
+
1933 to a host.
|
|
57
|
+
|
|
58
|
+
The re-embed journal, `provision.json` and `ov.conf` live in that state
|
|
59
|
+
directory. The daemon no longer runs the re-embed driver under `remote`; the
|
|
60
|
+
sidecar does.
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Memory sidecar entrypoint (docker/memory/Dockerfile).
|
|
3
|
+
#
|
|
4
|
+
# The memory image's boot, for a container whose only
|
|
5
|
+
# job is OpenViking: render ov.conf, run the embedder migration's `prepare`,
|
|
6
|
+
# provision the users, then exec the process supervisor. The knobs and their
|
|
7
|
+
# defaults are QCR_OPENVIKING_* (config.toml [openviking]); tests/memory-image.test.ts
|
|
8
|
+
# holds them to it, and the invariants below.
|
|
9
|
+
#
|
|
10
|
+
# Invariants:
|
|
11
|
+
# * never an interactive wizard (no `openviking-server init`), never a vlm;
|
|
12
|
+
# * the root key comes from the read-only secrets mount, never a literal;
|
|
13
|
+
# * degrade, never block: a step that fails says so and the sidecar still
|
|
14
|
+
# comes up (memory then degrades, exactly as in the daemon's container);
|
|
15
|
+
# * NEVER WIPE A STORE. `prepare` moves a mismatched vector collection
|
|
16
|
+
# ASIDE; the re-embed driver rebuilds it once the server is ready.
|
|
17
|
+
set -euo pipefail
|
|
18
|
+
|
|
19
|
+
APP="${QCR_APP_ROOT:-/opt/qcr}"
|
|
20
|
+
SECRETS="${QCR_SECRETS:-/opt/quickreview/secrets}"
|
|
21
|
+
|
|
22
|
+
# The same config.toml the daemon reads; mounted read-only at the config home.
|
|
23
|
+
export QCR_CONFIG="${QCR_CONFIG:-/opt/quickreview/config-home/${QCR_CONFIG_NAME:-config.toml}}"
|
|
24
|
+
|
|
25
|
+
OV_HOME="${QCR_OPENVIKING_HOME:-/opt/quickreview/state/openviking}"
|
|
26
|
+
OV_PORT="${QCR_OPENVIKING_PORT:-1933}"
|
|
27
|
+
# The server binds the container network's interfaces; the port is never
|
|
28
|
+
# published, and api_key mode confines every key.
|
|
29
|
+
OV_BIND_HOST="${QCR_OPENVIKING_BIND_HOST:-0.0.0.0}"
|
|
30
|
+
OV_WORKERS="${QCR_OPENVIKING_WORKERS:-1}"
|
|
31
|
+
OV_QUEUE_CONCURRENCY="${QCR_OPENVIKING_QUEUE_CONCURRENCY:-2}"
|
|
32
|
+
OV_AUTH_MODE="${QCR_OPENVIKING_AUTH_MODE:-api_key}"
|
|
33
|
+
OV_EMBEDDING_PROVIDER="${QCR_OPENVIKING_EMBEDDING_PROVIDER:-local}"
|
|
34
|
+
OV_EMBEDDING_MODEL="${QCR_OPENVIKING_EMBEDDING_MODEL:-bge-small-en-v1.5-f16}"
|
|
35
|
+
OV_EMBEDDING_DIMENSION="${QCR_OPENVIKING_EMBEDDING_DIMENSION:-384}"
|
|
36
|
+
OV_EMBEDDING_KEY_FILE="${QCR_OPENVIKING_EMBEDDING_KEY_FILE:-openai_embeddings_api_key}"
|
|
37
|
+
# The local embedder's pin: the image's own (Dockerfile ENV); the literals only
|
|
38
|
+
# cover an image that does not export them.
|
|
39
|
+
OV_LOCAL_EMBEDDER_MODEL="${QCR_OPENVIKING_LOCAL_EMBEDDER_MODEL:-bge-small-en-v1.5-f16}"
|
|
40
|
+
OV_LOCAL_EMBEDDER_DIMENSION="${QCR_OPENVIKING_LOCAL_EMBEDDER_DIMENSION:-384}"
|
|
41
|
+
OV_LOCAL_EMBEDDER_DIR="${QCR_OPENVIKING_LOCAL_EMBEDDER_DIR:-/opt/openviking/models}"
|
|
42
|
+
OV_LOCAL_EMBEDDER_SHA256="${QCR_OPENVIKING_LOCAL_EMBEDDER_SHA256:-f0b2fef971e8366438bfd2d9aefea1b0115919389448806d290237f638bae999}"
|
|
43
|
+
OV_LOCAL_EMBEDDER_PORT="${QCR_OPENVIKING_LOCAL_EMBEDDER_PORT:-1934}"
|
|
44
|
+
OV_LOCAL_EMBEDDER_THREADS="${QCR_OPENVIKING_LOCAL_EMBEDDER_THREADS:-1}"
|
|
45
|
+
OV_ROOT_KEY_FILE="${QCR_OPENVIKING_ROOT_KEY_FILE:-openviking_root_key}"
|
|
46
|
+
OV_REVIEWER_KEY_FILE="${QCR_OPENVIKING_REVIEWER_KEY_FILE:-openviking_reviewer_key}"
|
|
47
|
+
OV_PROVISION_USERS="${QCR_OPENVIKING_PROVISION_USERS:-reviewer,companion}"
|
|
48
|
+
OV_VENV="${QCR_OPENVIKING_VENV:-/opt/openviking/venv}"
|
|
49
|
+
|
|
50
|
+
# ~/.openviking is a SYMLINK onto the state volume, so memories, the vector db
|
|
51
|
+
# and ov.conf survive an image rebuild. The old daemon image used the same idiom.
|
|
52
|
+
mkdir -p "$OV_HOME/workspace" || echo "openviking: could not create $OV_HOME/workspace" >&2
|
|
53
|
+
BOOT_OK=1
|
|
54
|
+
# config.toml's [github] secrets_dir names a host path; the loader resolves it to
|
|
55
|
+
# the mount instead, as the daemon's container does.
|
|
56
|
+
export QCR_SECRETS_MOUNT="$SECRETS"
|
|
57
|
+
# Memory switched off in config.toml: the sidecar only idles, so no step below
|
|
58
|
+
# renders, migrates or provisions. An unreadable config counts as enabled (degrade,
|
|
59
|
+
# never block).
|
|
60
|
+
OV_ENABLED="$(node --input-type=module -e \
|
|
61
|
+
'const m = await import(process.argv[1]); process.stdout.write(m.loadConfig().openviking.enabled ? "1" : "0")' \
|
|
62
|
+
"$APP/dist/src/config.js" 2>/dev/null || echo 1)"
|
|
63
|
+
# The credential file names: the environment wins (the VM's run spec passes it),
|
|
64
|
+
# else the same config.toml [openviking] the supervisor loads, else the knob
|
|
65
|
+
# defaults above.
|
|
66
|
+
ov_config_value() {
|
|
67
|
+
node --input-type=module -e \
|
|
68
|
+
'const m = await import(process.argv[1]); process.stdout.write(String(m.loadConfig().openviking[process.argv[2]] ?? ""))' \
|
|
69
|
+
"$APP/dist/src/config.js" "$1" 2>/dev/null || true
|
|
70
|
+
}
|
|
71
|
+
if [[ -z "${QCR_OPENVIKING_ROOT_KEY_FILE:-}" ]]; then
|
|
72
|
+
OV_ROOT_KEY_FILE="$(ov_config_value root_key_file)"
|
|
73
|
+
OV_ROOT_KEY_FILE="${OV_ROOT_KEY_FILE:-openviking_root_key}"
|
|
74
|
+
fi
|
|
75
|
+
if [[ -z "${QCR_OPENVIKING_REVIEWER_KEY_FILE:-}" ]]; then
|
|
76
|
+
OV_REVIEWER_KEY_FILE="$(ov_config_value reviewer_key_file)"
|
|
77
|
+
OV_REVIEWER_KEY_FILE="${OV_REVIEWER_KEY_FILE:-openviking_reviewer_key}"
|
|
78
|
+
fi
|
|
79
|
+
if [[ "$OV_ENABLED" == 0 ]]; then
|
|
80
|
+
BOOT_OK=0
|
|
81
|
+
echo "openviking: memory is disabled in config.toml; boot steps skipped" >&2
|
|
82
|
+
fi
|
|
83
|
+
if [[ "$BOOT_OK" == 1 && -e "$HOME/.openviking" && ! -L "$HOME/.openviking" ]]; then
|
|
84
|
+
if cp -a "$HOME/.openviking/." "$OV_HOME/" && rm -rf "$HOME/.openviking"; then
|
|
85
|
+
:
|
|
86
|
+
else
|
|
87
|
+
BOOT_OK=0
|
|
88
|
+
echo "openviking: migration failed; original memory retained, boot steps skipped" >&2
|
|
89
|
+
fi
|
|
90
|
+
fi
|
|
91
|
+
if [[ "$BOOT_OK" == 1 ]] && ! { [[ -L "$HOME/.openviking" ]] || ln -sfn "$OV_HOME" "$HOME/.openviking"; }; then
|
|
92
|
+
BOOT_OK=0
|
|
93
|
+
echo "openviking: state link failed; boot steps skipped" >&2
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
if [[ "$BOOT_OK" == 1 ]]; then
|
|
97
|
+
|
|
98
|
+
# ov.conf is RENDERED on every boot (scripts/openviking-ov-conf.mjs), so a knob change ships with a
|
|
99
|
+
# restart. The `||` is deliberate: a memory engine that cannot be configured
|
|
100
|
+
# must not stop the container from coming up.
|
|
101
|
+
OPENVIKING_CONF="$OV_HOME/ov.conf" QCR_SECRETS="$SECRETS" QCR_OV_HOST="$OV_BIND_HOST" \
|
|
102
|
+
QCR_OV_PORT="$OV_PORT" QCR_OV_WORKERS="$OV_WORKERS" \
|
|
103
|
+
QCR_OV_QUEUE_CONCURRENCY="$OV_QUEUE_CONCURRENCY" \
|
|
104
|
+
QCR_OV_AUTH_MODE="$OV_AUTH_MODE" \
|
|
105
|
+
QCR_OV_EMBEDDING_PROVIDER="$OV_EMBEDDING_PROVIDER" \
|
|
106
|
+
QCR_OV_EMBEDDING_MODEL="$OV_EMBEDDING_MODEL" \
|
|
107
|
+
QCR_OV_EMBEDDING_DIMENSION="$OV_EMBEDDING_DIMENSION" \
|
|
108
|
+
QCR_OV_EMBEDDING_KEY_FILE="$OV_EMBEDDING_KEY_FILE" \
|
|
109
|
+
QCR_OV_LOCAL_EMBEDDER_MODEL="$OV_LOCAL_EMBEDDER_MODEL" \
|
|
110
|
+
QCR_OV_LOCAL_EMBEDDER_DIMENSION="$OV_LOCAL_EMBEDDER_DIMENSION" \
|
|
111
|
+
QCR_OV_LOCAL_EMBEDDER_PORT="$OV_LOCAL_EMBEDDER_PORT" \
|
|
112
|
+
QCR_OV_ROOT_KEY_FILE="$OV_ROOT_KEY_FILE" \
|
|
113
|
+
node "$APP/scripts/openviking-ov-conf.mjs" \
|
|
114
|
+
|| echo "openviking: ov.conf render FAILED - the sidecar starts, memory degrades" >&2
|
|
115
|
+
|
|
116
|
+
# Embedder migration check - BEFORE any server starts. A store whose vector
|
|
117
|
+
# collection was built under a different embedder than ov.conf now names holds
|
|
118
|
+
# vectors the new embedder cannot read, and the server refuses to start on it.
|
|
119
|
+
# `prepare` moves that collection ASIDE (never deletes - the old vectors are
|
|
120
|
+
# the rollback) and journals every provisioned namespace as pending in
|
|
121
|
+
# reembed.json; the re-embed driver in sidecar-main rebuilds reviewer memory
|
|
122
|
+
# through the server's reindex API once /ready passes, and any other namespace
|
|
123
|
+
# is its key holder's (docs/memory-embeddings.md). On a matching store this is
|
|
124
|
+
# a no-op in milliseconds, every boot. Exit 0 by contract, `||` as belt.
|
|
125
|
+
node "$APP/scripts/openviking-reembed.mjs" prepare \
|
|
126
|
+
--home "$OV_HOME" --config "$OV_HOME/ov.conf" \
|
|
127
|
+
--users "$OV_PROVISION_USERS" --user reviewer \
|
|
128
|
+
|| echo "openviking: embedder migration check did not complete - the server may refuse to start on a mismatched store until an operator looks (docs/memory-embeddings.md)" >&2
|
|
129
|
+
|
|
130
|
+
# Boot provisioning - idempotent: it CREATES a missing user, LEAVES an existing
|
|
131
|
+
# one exactly as it is, never rotates a key. It starts the server (and, under
|
|
132
|
+
# the local embedder, the loopback service) in the foreground, briefly, and
|
|
133
|
+
# stops them again - the long-lived pair is sidecar-main's.
|
|
134
|
+
OV_EMBEDDER_ARGS=()
|
|
135
|
+
if [[ "$OV_EMBEDDING_PROVIDER" == "local" ]]; then
|
|
136
|
+
OV_EMBEDDER_ARGS=(
|
|
137
|
+
--embedder-python "$OV_VENV/bin/python"
|
|
138
|
+
--embedder-script "$APP/scripts/openviking-embedder.py"
|
|
139
|
+
--embedder-model "$OV_LOCAL_EMBEDDER_MODEL"
|
|
140
|
+
--embedder-file "$OV_LOCAL_EMBEDDER_DIR/$OV_LOCAL_EMBEDDER_MODEL.gguf"
|
|
141
|
+
--embedder-sha256 "$OV_LOCAL_EMBEDDER_SHA256"
|
|
142
|
+
--embedder-port "$OV_LOCAL_EMBEDDER_PORT"
|
|
143
|
+
--embedder-threads "$OV_LOCAL_EMBEDDER_THREADS"
|
|
144
|
+
)
|
|
145
|
+
fi
|
|
146
|
+
node "$APP/scripts/openviking-provision.mjs" \
|
|
147
|
+
--base "http://127.0.0.1:$OV_PORT" \
|
|
148
|
+
--users "$OV_PROVISION_USERS" \
|
|
149
|
+
--root-key-file "$SECRETS/$OV_ROOT_KEY_FILE" \
|
|
150
|
+
--reviewer-key-file "$SECRETS/$OV_REVIEWER_KEY_FILE" \
|
|
151
|
+
--start-server \
|
|
152
|
+
--bin "$OV_VENV/bin/openviking-server" \
|
|
153
|
+
--config "$OV_HOME/ov.conf" \
|
|
154
|
+
--host 127.0.0.1 --port "$OV_PORT" \
|
|
155
|
+
"${OV_EMBEDDER_ARGS[@]}" \
|
|
156
|
+
|| echo "openviking: boot provisioning did not complete - the sidecar starts and memory degrades until it does" >&2
|
|
157
|
+
|
|
158
|
+
fi
|
|
159
|
+
|
|
160
|
+
# PID 1 is the supervisor: it owns the server, the embedder and the re-embed
|
|
161
|
+
# driver, and stops them on SIGTERM.
|
|
162
|
+
export QCR_OPENVIKING_BIND_HOST="$OV_BIND_HOST"
|
|
163
|
+
exec node "$APP/dist/src/openviking/sidecar-main.js"
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* qcr-setid: the always-on bot's way to run the model's tools as the tool uid
|
|
3
|
+
*.
|
|
4
|
+
*
|
|
5
|
+
* The bot runs as its own uid, not root, so a `docker exec` into it lands as
|
|
6
|
+
* that uid, and docker gives a non-root uid no ambient capabilities. This
|
|
7
|
+
* binary carries CAP_SETUID and CAP_SETGID as FILE capabilities, and only the
|
|
8
|
+
* gate group may run it (docker/Dockerfile). It is not setpriv: it can switch
|
|
9
|
+
* to exactly ONE identity, the tool uid and tool gid compiled in below, and
|
|
10
|
+
* nothing else. A copy of setpriv with the same capabilities would let
|
|
11
|
+
* whatever runs as the bot's uid become root (`--reuid=0`), and root inside the
|
|
12
|
+
* container owns the operator channel's seal and the image's own files.
|
|
13
|
+
*
|
|
14
|
+
* It takes setpriv's argv as the engine spells it (src/engine/tooluid.ts
|
|
15
|
+
* setprivSwitches), so the engine is the same whichever binary it starts:
|
|
16
|
+
*
|
|
17
|
+
* qcr-setid --reuid=<TOOL_UID> --regid=<TOOL_GID> --clear-groups \
|
|
18
|
+
* --inh-caps=-all --ambient-caps=-all --no-new-privs -- <program> [args...]
|
|
19
|
+
*
|
|
20
|
+
* Every switch is required and every one must say exactly that; any other uid,
|
|
21
|
+
* gid or switch is a refusal (exit 126) before anything changes. Then: no
|
|
22
|
+
* supplementary groups, all three gids and uids the tool's, every capability
|
|
23
|
+
* set emptied (a non-root process keeps a file capability across setuid, so it
|
|
24
|
+
* is dropped by hand), no_new_privs, and the program exec'd.
|
|
25
|
+
*/
|
|
26
|
+
#define _GNU_SOURCE
|
|
27
|
+
#include <errno.h>
|
|
28
|
+
#include <grp.h>
|
|
29
|
+
#include <linux/capability.h>
|
|
30
|
+
#include <stdio.h>
|
|
31
|
+
#include <stdlib.h>
|
|
32
|
+
#include <string.h>
|
|
33
|
+
#include <sys/prctl.h>
|
|
34
|
+
#include <sys/syscall.h>
|
|
35
|
+
#include <unistd.h>
|
|
36
|
+
|
|
37
|
+
#ifndef TOOL_UID
|
|
38
|
+
#error "build with -DTOOL_UID=<the tool uid>"
|
|
39
|
+
#endif
|
|
40
|
+
#ifndef TOOL_GID
|
|
41
|
+
#error "build with -DTOOL_GID=<the tool gid>"
|
|
42
|
+
#endif
|
|
43
|
+
#if TOOL_UID == 0 || TOOL_GID == 0
|
|
44
|
+
#error "the tool uid and gid must not be root's"
|
|
45
|
+
#endif
|
|
46
|
+
|
|
47
|
+
#define STR_(x) #x
|
|
48
|
+
#define STR(x) STR_(x)
|
|
49
|
+
|
|
50
|
+
static int refuse(const char *why) {
|
|
51
|
+
fprintf(stderr, "qcr-setid: refused: %s\n", why);
|
|
52
|
+
return 126;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static int fail(const char *what) {
|
|
56
|
+
fprintf(stderr, "qcr-setid: %s: %s\n", what, strerror(errno));
|
|
57
|
+
return 126;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
int main(int argc, char **argv) {
|
|
61
|
+
static const char *const want[] = {
|
|
62
|
+
"--reuid=" STR(TOOL_UID), "--regid=" STR(TOOL_GID), "--clear-groups",
|
|
63
|
+
"--inh-caps=-all", "--ambient-caps=-all", "--no-new-privs",
|
|
64
|
+
};
|
|
65
|
+
const int nwant = (int)(sizeof want / sizeof want[0]);
|
|
66
|
+
int seen[sizeof want / sizeof want[0]] = {0};
|
|
67
|
+
int i = 1;
|
|
68
|
+
for (; i < argc && strcmp(argv[i], "--") != 0; i++) {
|
|
69
|
+
int k = 0;
|
|
70
|
+
while (k < nwant && strcmp(argv[i], want[k]) != 0) k++;
|
|
71
|
+
if (k == nwant) return refuse("a switch other than the tool identity's (only uid " STR(TOOL_UID) ", gid " STR(TOOL_GID) ")");
|
|
72
|
+
if (seen[k]++) return refuse("a switch given twice");
|
|
73
|
+
}
|
|
74
|
+
for (int k = 0; k < nwant; k++)
|
|
75
|
+
if (!seen[k]) return refuse("a required switch is missing");
|
|
76
|
+
if (i >= argc - 1) return refuse("no program after --");
|
|
77
|
+
char **prog = argv + i + 1;
|
|
78
|
+
|
|
79
|
+
if (setgroups(0, NULL) != 0) return fail("setgroups");
|
|
80
|
+
if (setresgid(TOOL_GID, TOOL_GID, TOOL_GID) != 0) return fail("setresgid");
|
|
81
|
+
if (setresuid(TOOL_UID, TOOL_UID, TOOL_UID) != 0) return fail("setresuid");
|
|
82
|
+
|
|
83
|
+
if (prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_CLEAR_ALL, 0, 0, 0) != 0 && errno != EINVAL)
|
|
84
|
+
return fail("clear the ambient capabilities");
|
|
85
|
+
struct __user_cap_header_struct hdr = {_LINUX_CAPABILITY_VERSION_3, 0};
|
|
86
|
+
struct __user_cap_data_struct none[_LINUX_CAPABILITY_U32S_3];
|
|
87
|
+
memset(none, 0, sizeof none);
|
|
88
|
+
if (syscall(SYS_capset, &hdr, none) != 0) return fail("drop the capabilities");
|
|
89
|
+
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) != 0) return fail("no_new_privs");
|
|
90
|
+
|
|
91
|
+
/* Prove the switch before handing over: an identity or a capability left
|
|
92
|
+
* behind is a refusal, never a program run with it. */
|
|
93
|
+
uid_t ru, eu, su;
|
|
94
|
+
gid_t rg, eg, sg;
|
|
95
|
+
struct __user_cap_data_struct now[_LINUX_CAPABILITY_U32S_3];
|
|
96
|
+
if (getresuid(&ru, &eu, &su) != 0 || getresgid(&rg, &eg, &sg) != 0)
|
|
97
|
+
return fail("read back the ids");
|
|
98
|
+
if (ru != TOOL_UID || eu != TOOL_UID || su != TOOL_UID || rg != TOOL_GID ||
|
|
99
|
+
eg != TOOL_GID || sg != TOOL_GID)
|
|
100
|
+
return refuse("the ids did not switch");
|
|
101
|
+
if (getgroups(0, NULL) != 0) return refuse("supplementary groups are left");
|
|
102
|
+
if (syscall(SYS_capget, &hdr, now) != 0) return fail("read back the capabilities");
|
|
103
|
+
for (int k = 0; k < _LINUX_CAPABILITY_U32S_3; k++)
|
|
104
|
+
if (now[k].effective || now[k].permitted || now[k].inheritable)
|
|
105
|
+
return refuse("a capability is left");
|
|
106
|
+
|
|
107
|
+
execvp(prog[0], prog);
|
|
108
|
+
return fail(prog[0]);
|
|
109
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# The cloudflared tunnel sidecar — the OFFICIAL cloudflared image
|
|
2
|
+
# behind the thin wrapper in sidecar.mjs.
|
|
3
|
+
#
|
|
4
|
+
# The client binary is copied verbatim out of `cloudflare/cloudflared` (the
|
|
5
|
+
# vendor's own published image, pinned by tag): we run THEIR build, not a
|
|
6
|
+
# rebuild of it. The official image is distroless — no shell, no node — so the
|
|
7
|
+
# wrapper cannot live inside it; this two-stage image is the smallest thing
|
|
8
|
+
# that gives the wrapper a runtime while keeping the client byte-identical to
|
|
9
|
+
# upstream's.
|
|
10
|
+
#
|
|
11
|
+
# The COPY path and the pin are both verified AT BUILD TIME (`cloudflared
|
|
12
|
+
# --version` must print the pinned version): if upstream ever moves the binary
|
|
13
|
+
# or the tag resolves to something else, the build fails loudly here instead of
|
|
14
|
+
# the sidecar silently never starting. Same discipline as the memory image's
|
|
15
|
+
# "failed verification" check.
|
|
16
|
+
#
|
|
17
|
+
# Bumping the pin is a deliberate act (tests/tunnel-sidecar.test.ts refuses a
|
|
18
|
+
# floating `latest` and holds the compose file to this ARG default):
|
|
19
|
+
# docker compose --profile quick-tunnel build --no-cache
|
|
20
|
+
ARG NODE_MAJOR=26
|
|
21
|
+
ARG CLOUDFLARED_VERSION=2026.8.1
|
|
22
|
+
|
|
23
|
+
FROM cloudflare/cloudflared:${CLOUDFLARED_VERSION} AS client
|
|
24
|
+
|
|
25
|
+
# glibc base on purpose: the vendor binaries are built for it, and a musl base
|
|
26
|
+
# is one silent-startup-failure class we do not need on an operator's laptop.
|
|
27
|
+
FROM node:${NODE_MAJOR}-bookworm-slim
|
|
28
|
+
ARG CLOUDFLARED_VERSION
|
|
29
|
+
|
|
30
|
+
COPY --from=client /usr/local/bin/cloudflared /usr/local/bin/cloudflared
|
|
31
|
+
RUN cloudflared --version \
|
|
32
|
+
&& cloudflared --version | grep -qF "${CLOUDFLARED_VERSION}" \
|
|
33
|
+
|| { echo "cloudflared failed verification: not the pinned ${CLOUDFLARED_VERSION}" >&2; exit 1; }
|
|
34
|
+
|
|
35
|
+
COPY sidecar.mjs /usr/local/lib/qcr/sidecar.mjs
|
|
36
|
+
|
|
37
|
+
# The shared hostname directory is created HERE so a fresh named volume
|
|
38
|
+
# inherits its ownership and mode instead of arriving root-owned and empty.
|
|
39
|
+
RUN mkdir -p /ingress
|
|
40
|
+
|
|
41
|
+
# Runs as root INSIDE ITS OWN CONTAINER on purpose: it must write the shared
|
|
42
|
+
# hostname volume whichever container created it, and (for the named-tunnel
|
|
43
|
+
# variant) read a 0600 credential owned by the host operator through the
|
|
44
|
+
# read-only secrets mount. The container holds nothing else — no repo, no
|
|
45
|
+
# state, no GitHub credential.
|
|
46
|
+
ENV QCR_TUNNEL_KIND=quick \
|
|
47
|
+
QCR_TUNNEL_UPSTREAM=http://daemon:8787 \
|
|
48
|
+
QCR_TUNNEL_HOSTNAME_FILE=/ingress/hostname \
|
|
49
|
+
QCR_TUNNEL_SECRETS_DIR=/opt/quickreview/secrets
|
|
50
|
+
|
|
51
|
+
ENTRYPOINT ["node", "/usr/local/lib/qcr/sidecar.mjs"]
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# The ngrok tunnel sidecar — the OFFICIAL ngrok image behind the
|
|
2
|
+
# same thin wrapper as the cloudflared variant (sidecar.mjs).
|
|
3
|
+
#
|
|
4
|
+
# Symmetric with Dockerfile.cloudflared in every way that matters: the vendor's
|
|
5
|
+
# own binary copied verbatim out of their published image, the pin verified at
|
|
6
|
+
# build time, the wrapper writing the same hostname-file contract the daemon's
|
|
7
|
+
# watcher reads (src/webhookheal.ts). The difference is only what the operator
|
|
8
|
+
# trades: an ngrok account and its free-tier caps, for a hostname that does not
|
|
9
|
+
# rotate (a reserved domain, passed as QCR_TUNNEL_DOMAIN).
|
|
10
|
+
#
|
|
11
|
+
# The authtoken is NEVER an argv: the wrapper reads
|
|
12
|
+
# <secrets>/ngrok_authtoken from the read-only secrets mount and hands it to
|
|
13
|
+
# the client as NGROK_AUTHTOKEN in its environment.
|
|
14
|
+
#
|
|
15
|
+
# docker compose --profile ngrok build --no-cache
|
|
16
|
+
ARG NODE_MAJOR=26
|
|
17
|
+
ARG NGROK_VERSION=3.31.0
|
|
18
|
+
|
|
19
|
+
FROM ngrok/ngrok:${NGROK_VERSION}-alpine AS client
|
|
20
|
+
|
|
21
|
+
FROM node:${NODE_MAJOR}-bookworm-slim
|
|
22
|
+
ARG NGROK_VERSION
|
|
23
|
+
|
|
24
|
+
COPY --from=client /bin/ngrok /usr/local/bin/ngrok
|
|
25
|
+
RUN ngrok version \
|
|
26
|
+
&& ngrok version | grep -qF "${NGROK_VERSION}" \
|
|
27
|
+
|| { echo "ngrok failed verification: not the pinned ${NGROK_VERSION}" >&2; exit 1; }
|
|
28
|
+
|
|
29
|
+
COPY sidecar.mjs /usr/local/lib/qcr/sidecar.mjs
|
|
30
|
+
|
|
31
|
+
# See Dockerfile.cloudflared for why the dir is pre-created and why this runs
|
|
32
|
+
# as root inside its own container.
|
|
33
|
+
RUN mkdir -p /ingress
|
|
34
|
+
|
|
35
|
+
ENV QCR_TUNNEL_KIND=ngrok \
|
|
36
|
+
QCR_TUNNEL_UPSTREAM=http://daemon:8787 \
|
|
37
|
+
QCR_TUNNEL_HOSTNAME_FILE=/ingress/hostname \
|
|
38
|
+
QCR_TUNNEL_SECRETS_DIR=/opt/quickreview/secrets
|
|
39
|
+
|
|
40
|
+
ENTRYPOINT ["node", "/usr/local/lib/qcr/sidecar.mjs"]
|