@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.
Files changed (1443) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +385 -2
  3. package/THIRD-PARTY-NOTICES.md +134 -0
  4. package/agents/pass-abstraction.md +64 -0
  5. package/agents/pass-ask-human.md +134 -0
  6. package/agents/pass-backcompat.md +67 -0
  7. package/agents/pass-baseline.md +61 -0
  8. package/agents/pass-behaviour-delta.md +64 -0
  9. package/agents/pass-bounds.md +36 -0
  10. package/agents/pass-claims.md +31 -0
  11. package/agents/pass-concurrency.md +168 -0
  12. package/agents/pass-consistency.md +57 -0
  13. package/agents/pass-contracts.md +30 -0
  14. package/agents/pass-data-safety.md +54 -0
  15. package/agents/pass-deferred.md +35 -0
  16. package/agents/pass-delivery.md +37 -0
  17. package/agents/pass-duplication.md +60 -0
  18. package/agents/pass-intent.md +63 -0
  19. package/agents/pass-lint-conformance.md +46 -0
  20. package/agents/pass-maintainability.md +67 -0
  21. package/agents/pass-placement.md +68 -0
  22. package/agents/pass-prod-risk.md +24 -0
  23. package/agents/pass-rollout.md +32 -0
  24. package/agents/pass-roundtrip.md +46 -0
  25. package/agents/pass-security.md +31 -0
  26. package/agents/pass-simplicity.md +68 -0
  27. package/agents/pass-statelessness.md +27 -0
  28. package/agents/pass-style.md +37 -0
  29. package/agents/pass-sweep.md +57 -0
  30. package/agents/pass-tests.md +58 -0
  31. package/agents/pass-ui.md +23 -0
  32. package/agents/pass-validate.md +50 -0
  33. package/agents/pass-widened.md +46 -0
  34. package/agents/scan/pass-scan.md +86 -0
  35. package/bin/qcr.js +11 -0
  36. package/config.example.toml +1067 -0
  37. package/deploy/ansible/README.md +356 -0
  38. package/deploy/ansible/group_vars/all.yml +212 -0
  39. package/deploy/ansible/inventory.example.ini +25 -0
  40. package/deploy/ansible/playbook.yml +360 -0
  41. package/deploy/collect-secrets.sh +289 -0
  42. package/deploy/collect-slack-secrets.mjs +1190 -0
  43. package/deploy/github-app-manifest.json +31 -0
  44. package/deploy/manifest.schema.json +75 -0
  45. package/deploy/qcr-update.sh +803 -0
  46. package/deploy/reviewer/AGENTS.override.md +12 -0
  47. package/dist/extensions/cli/bash-guard-ambient.js +42 -0
  48. package/dist/extensions/cli/bash-guard-ambient.js.map +1 -0
  49. package/dist/extensions/cli/bash-guard.js +5 -0
  50. package/dist/extensions/cli/bash-guard.js.map +1 -0
  51. package/dist/extensions/cli/companion-guard.js +5 -0
  52. package/dist/extensions/cli/companion-guard.js.map +1 -0
  53. package/dist/extensions/cli/debug-round.js +8 -0
  54. package/dist/extensions/cli/debug-round.js.map +1 -0
  55. package/dist/extensions/cli/inject-bridge.js +5 -0
  56. package/dist/extensions/cli/inject-bridge.js.map +1 -0
  57. package/dist/extensions/cli/ledger-pin.js +5 -0
  58. package/dist/extensions/cli/ledger-pin.js.map +1 -0
  59. package/dist/extensions/cli/lens.js +13 -0
  60. package/dist/extensions/cli/lens.js.map +1 -0
  61. package/dist/extensions/cli/muted-theme.js +5 -0
  62. package/dist/extensions/cli/muted-theme.js.map +1 -0
  63. package/dist/extensions/cli/onboarding.js +5 -0
  64. package/dist/extensions/cli/onboarding.js.map +1 -0
  65. package/dist/extensions/cli/setup.js +5 -0
  66. package/dist/extensions/cli/setup.js.map +1 -0
  67. package/dist/extensions/cli/tui-view.js +5 -0
  68. package/dist/extensions/cli/tui-view.js.map +1 -0
  69. package/dist/extensions/companion-guard.js +361 -0
  70. package/dist/extensions/companion-guard.js.map +1 -0
  71. package/dist/extensions/debug-round.js +204 -0
  72. package/dist/extensions/debug-round.js.map +1 -0
  73. package/dist/extensions/inject-bridge.js +603 -0
  74. package/dist/extensions/inject-bridge.js.map +1 -0
  75. package/dist/extensions/muted-theme.js +12 -0
  76. package/dist/extensions/muted-theme.js.map +1 -0
  77. package/dist/extensions/onboarding.js +175 -0
  78. package/dist/extensions/onboarding.js.map +1 -0
  79. package/dist/extensions/setup-replay.js +269 -0
  80. package/dist/extensions/setup-replay.js.map +1 -0
  81. package/dist/extensions/setup-scan.js +998 -0
  82. package/dist/extensions/setup-scan.js.map +1 -0
  83. package/dist/extensions/setup-triage.js +175 -0
  84. package/dist/extensions/setup-triage.js.map +1 -0
  85. package/dist/extensions/setup.js +1160 -0
  86. package/dist/extensions/setup.js.map +1 -0
  87. package/dist/extensions/tui-view.js +389 -0
  88. package/dist/extensions/tui-view.js.map +1 -0
  89. package/dist/extensions/vendor/openviking-pi/client.js +376 -0
  90. package/dist/extensions/vendor/openviking-pi/client.js.map +1 -0
  91. package/dist/extensions/vendor/openviking-pi/config.js +189 -0
  92. package/dist/extensions/vendor/openviking-pi/config.js.map +1 -0
  93. package/dist/extensions/vendor/openviking-pi/index.js +421 -0
  94. package/dist/extensions/vendor/openviking-pi/index.js.map +1 -0
  95. package/dist/extensions/vendor/openviking-pi/lib/capture-adapter.mjs +86 -0
  96. package/dist/extensions/vendor/openviking-pi/lib/capture-adapter.mjs.map +1 -0
  97. package/dist/extensions/vendor/openviking-pi/lib/takeover-core.mjs +408 -0
  98. package/dist/extensions/vendor/openviking-pi/lib/takeover-core.mjs.map +1 -0
  99. package/dist/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs +41 -0
  100. package/dist/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs.map +1 -0
  101. package/dist/extensions/vendor/openviking-pi/qcr-hint.js +290 -0
  102. package/dist/extensions/vendor/openviking-pi/qcr-hint.js.map +1 -0
  103. package/dist/extensions/vendor/openviking-pi/qcr-honest.js +148 -0
  104. package/dist/extensions/vendor/openviking-pi/qcr-honest.js.map +1 -0
  105. package/dist/extensions/vendor/openviking-pi/qcr-hooks.js +68 -0
  106. package/dist/extensions/vendor/openviking-pi/qcr-hooks.js.map +1 -0
  107. package/dist/extensions/vendor/openviking-pi/qcr-leaf.js +77 -0
  108. package/dist/extensions/vendor/openviking-pi/qcr-leaf.js.map +1 -0
  109. package/dist/extensions/vendor/openviking-pi/qcr-lesson.js +216 -0
  110. package/dist/extensions/vendor/openviking-pi/qcr-lesson.js.map +1 -0
  111. package/dist/extensions/vendor/openviking-pi/qcr-namespaces.js +154 -0
  112. package/dist/extensions/vendor/openviking-pi/qcr-namespaces.js.map +1 -0
  113. package/dist/extensions/vendor/openviking-pi/qcr-recall.js +254 -0
  114. package/dist/extensions/vendor/openviking-pi/qcr-recall.js.map +1 -0
  115. package/dist/extensions/vendor/openviking-pi/qcr-shim.js +94 -0
  116. package/dist/extensions/vendor/openviking-pi/qcr-shim.js.map +1 -0
  117. package/dist/extensions/vendor/openviking-pi/qcr-write.js +333 -0
  118. package/dist/extensions/vendor/openviking-pi/qcr-write.js.map +1 -0
  119. package/dist/extensions/vendor/openviking-pi/recall.js +108 -0
  120. package/dist/extensions/vendor/openviking-pi/recall.js.map +1 -0
  121. package/dist/extensions/vendor/openviking-pi/shared/capture-utils.mjs +529 -0
  122. package/dist/extensions/vendor/openviking-pi/shared/capture-utils.mjs.map +1 -0
  123. package/dist/extensions/vendor/openviking-pi/shared/credentials.mjs +205 -0
  124. package/dist/extensions/vendor/openviking-pi/shared/credentials.mjs.map +1 -0
  125. package/dist/extensions/vendor/openviking-pi/shared/pending-queue.mjs +442 -0
  126. package/dist/extensions/vendor/openviking-pi/shared/pending-queue.mjs.map +1 -0
  127. package/dist/extensions/vendor/openviking-pi/shared/profile-inject.mjs +286 -0
  128. package/dist/extensions/vendor/openviking-pi/shared/profile-inject.mjs.map +1 -0
  129. package/dist/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs +189 -0
  130. package/dist/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs.map +1 -0
  131. package/dist/extensions/vendor/openviking-pi/shared/recall-core.mjs +580 -0
  132. package/dist/extensions/vendor/openviking-pi/shared/recall-core.mjs.map +1 -0
  133. package/dist/extensions/vendor/openviking-pi/shared/retryable.mjs +11 -0
  134. package/dist/extensions/vendor/openviking-pi/shared/retryable.mjs.map +1 -0
  135. package/dist/extensions/vendor/openviking-pi/shared/session-model.mjs +63 -0
  136. package/dist/extensions/vendor/openviking-pi/shared/session-model.mjs.map +1 -0
  137. package/dist/extensions/vendor/openviking-pi/shared/uri-guard.mjs +58 -0
  138. package/dist/extensions/vendor/openviking-pi/shared/uri-guard.mjs.map +1 -0
  139. package/dist/extensions/vendor/openviking-pi/shared/workspace-peer.mjs +16 -0
  140. package/dist/extensions/vendor/openviking-pi/shared/workspace-peer.mjs.map +1 -0
  141. package/dist/extensions/vendor/openviking-pi/sync.js +127 -0
  142. package/dist/extensions/vendor/openviking-pi/sync.js.map +1 -0
  143. package/dist/extensions/vendor/openviking-pi/takeover.js +25 -0
  144. package/dist/extensions/vendor/openviking-pi/takeover.js.map +1 -0
  145. package/dist/extensions/vendor/openviking-pi/tools.js +417 -0
  146. package/dist/extensions/vendor/openviking-pi/tools.js.map +1 -0
  147. package/dist/src/anomalies.js +483 -0
  148. package/dist/src/anomalies.js.map +1 -0
  149. package/dist/src/answerworker.js +180 -0
  150. package/dist/src/answerworker.js.map +1 -0
  151. package/dist/src/appstamp.js +68 -0
  152. package/dist/src/appstamp.js.map +1 -0
  153. package/dist/src/archive/admission.js +3 -0
  154. package/dist/src/archive/admission.js.map +1 -0
  155. package/dist/src/archive/archivedb.js +474 -0
  156. package/dist/src/archive/archivedb.js.map +1 -0
  157. package/dist/src/archive/archiver.js +1770 -0
  158. package/dist/src/archive/archiver.js.map +1 -0
  159. package/dist/src/archive/archivewrite.js +198 -0
  160. package/dist/src/archive/archivewrite.js.map +1 -0
  161. package/dist/src/archive/bundle.js +266 -0
  162. package/dist/src/archive/bundle.js.map +1 -0
  163. package/dist/src/archive/dbmove.js +638 -0
  164. package/dist/src/archive/dbmove.js.map +1 -0
  165. package/dist/src/archive/duplicatecounts.js +80 -0
  166. package/dist/src/archive/duplicatecounts.js.map +1 -0
  167. package/dist/src/archive/eligibility.js +113 -0
  168. package/dist/src/archive/eligibility.js.map +1 -0
  169. package/dist/src/archive/extract.js +288 -0
  170. package/dist/src/archive/extract.js.map +1 -0
  171. package/dist/src/archive/fsutil.js +330 -0
  172. package/dist/src/archive/fsutil.js.map +1 -0
  173. package/dist/src/archive/gzfile.js +277 -0
  174. package/dist/src/archive/gzfile.js.map +1 -0
  175. package/dist/src/archive/kinds.js +22 -0
  176. package/dist/src/archive/kinds.js.map +1 -0
  177. package/dist/src/archive/livecheckpoint.js +178 -0
  178. package/dist/src/archive/livecheckpoint.js.map +1 -0
  179. package/dist/src/archive/liveretention.js +145 -0
  180. package/dist/src/archive/liveretention.js.map +1 -0
  181. package/dist/src/archive/manifest.js +284 -0
  182. package/dist/src/archive/manifest.js.map +1 -0
  183. package/dist/src/archive/overseer.js +283 -0
  184. package/dist/src/archive/overseer.js.map +1 -0
  185. package/dist/src/archive/piglobal.js +129 -0
  186. package/dist/src/archive/piglobal.js.map +1 -0
  187. package/dist/src/archive/plan.js +398 -0
  188. package/dist/src/archive/plan.js.map +1 -0
  189. package/dist/src/archive/prarchive.js +831 -0
  190. package/dist/src/archive/prarchive.js.map +1 -0
  191. package/dist/src/archive/prfiles.js +303 -0
  192. package/dist/src/archive/prfiles.js.map +1 -0
  193. package/dist/src/archive/report.js +169 -0
  194. package/dist/src/archive/report.js.map +1 -0
  195. package/dist/src/archive/restore.js +276 -0
  196. package/dist/src/archive/restore.js.map +1 -0
  197. package/dist/src/archive/rows.js +106 -0
  198. package/dist/src/archive/rows.js.map +1 -0
  199. package/dist/src/archive/seal.js +480 -0
  200. package/dist/src/archive/seal.js.map +1 -0
  201. package/dist/src/archive/status.js +528 -0
  202. package/dist/src/archive/status.js.map +1 -0
  203. package/dist/src/archive/storepass.js +409 -0
  204. package/dist/src/archive/storepass.js.map +1 -0
  205. package/dist/src/backfill.js +217 -0
  206. package/dist/src/backfill.js.map +1 -0
  207. package/dist/src/bench/cost.js +87 -0
  208. package/dist/src/bench/exec.js +76 -0
  209. package/dist/src/bench/values.js +14 -0
  210. package/dist/src/botcontrol.js +127 -0
  211. package/dist/src/botcontrol.js.map +1 -0
  212. package/dist/src/botworker.js +805 -0
  213. package/dist/src/botworker.js.map +1 -0
  214. package/dist/src/capture.js +234 -0
  215. package/dist/src/capture.js.map +1 -0
  216. package/dist/src/cases.js +1491 -0
  217. package/dist/src/cases.js.map +1 -0
  218. package/dist/src/channelfs.js +27 -0
  219. package/dist/src/channelfs.js.map +1 -0
  220. package/dist/src/checklist.js +312 -0
  221. package/dist/src/checklist.js.map +1 -0
  222. package/dist/src/ciretry.js +91 -0
  223. package/dist/src/ciretry.js.map +1 -0
  224. package/dist/src/cli.js +1916 -0
  225. package/dist/src/cli.js.map +1 -0
  226. package/dist/src/cliops.js +333 -0
  227. package/dist/src/cliops.js.map +1 -0
  228. package/dist/src/clonedir.js +15 -0
  229. package/dist/src/clonedir.js.map +1 -0
  230. package/dist/src/commandeffects.js +43 -0
  231. package/dist/src/commandeffects.js.map +1 -0
  232. package/dist/src/commands.js +1312 -0
  233. package/dist/src/commands.js.map +1 -0
  234. package/dist/src/companioninbox.js +203 -0
  235. package/dist/src/companioninbox.js.map +1 -0
  236. package/dist/src/compare.js +673 -0
  237. package/dist/src/compare.js.map +1 -0
  238. package/dist/src/config.js +1027 -0
  239. package/dist/src/config.js.map +1 -0
  240. package/dist/src/configcheck.js +111 -0
  241. package/dist/src/configcheck.js.map +1 -0
  242. package/dist/src/coreext.js +43 -0
  243. package/dist/src/coreext.js.map +1 -0
  244. package/dist/src/daemon.js +929 -0
  245. package/dist/src/daemon.js.map +1 -0
  246. package/dist/src/debuground.js +731 -0
  247. package/dist/src/debuground.js.map +1 -0
  248. package/dist/src/debugroundpi.js +219 -0
  249. package/dist/src/debugroundpi.js.map +1 -0
  250. package/dist/src/diagnostics.js +14 -0
  251. package/dist/src/diagnostics.js.map +1 -0
  252. package/dist/src/digest.js +139 -0
  253. package/dist/src/digest.js.map +1 -0
  254. package/dist/src/dispatch.js +1726 -0
  255. package/dist/src/dispatch.js.map +1 -0
  256. package/dist/src/engine/answerguard.js +18 -0
  257. package/dist/src/engine/answerguard.js.map +1 -0
  258. package/dist/src/engine/botsdk.js +262 -0
  259. package/dist/src/engine/botsdk.js.map +1 -0
  260. package/dist/src/engine/caserunner-sdk.js +332 -0
  261. package/dist/src/engine/caserunner-sdk.js.map +1 -0
  262. package/dist/src/engine/debugpi.js +194 -0
  263. package/dist/src/engine/debugpi.js.map +1 -0
  264. package/dist/src/eod.js +473 -0
  265. package/dist/src/eod.js.map +1 -0
  266. package/dist/src/eodpinwatch.js +391 -0
  267. package/dist/src/eodpinwatch.js.map +1 -0
  268. package/dist/src/escalation.js +1009 -0
  269. package/dist/src/escalation.js.map +1 -0
  270. package/dist/src/eventloop.js +779 -0
  271. package/dist/src/eventloop.js.map +1 -0
  272. package/dist/src/execboundary.js +430 -0
  273. package/dist/src/execboundary.js.map +1 -0
  274. package/dist/src/feedback.js +915 -0
  275. package/dist/src/feedback.js.map +1 -0
  276. package/dist/src/findingscheck.js +200 -0
  277. package/dist/src/findingscheck.js.map +1 -0
  278. package/dist/src/fsdenied.js +26 -0
  279. package/dist/src/fsdenied.js.map +1 -0
  280. package/dist/src/ghread.js +181 -0
  281. package/dist/src/ghread.js.map +1 -0
  282. package/dist/src/github.js +1063 -0
  283. package/dist/src/github.js.map +1 -0
  284. package/dist/src/homes.js +103 -0
  285. package/dist/src/homes.js.map +1 -0
  286. package/dist/src/hostroute.js +24 -0
  287. package/dist/src/hostroute.js.map +1 -0
  288. package/dist/src/improvements.js +625 -0
  289. package/dist/src/improvements.js.map +1 -0
  290. package/dist/src/install.js +946 -0
  291. package/dist/src/install.js.map +1 -0
  292. package/dist/src/installkind.js +40 -0
  293. package/dist/src/installkind.js.map +1 -0
  294. package/dist/src/ipc/capability.js +286 -0
  295. package/dist/src/ipc/capability.js.map +1 -0
  296. package/dist/src/ipc/client.js +226 -0
  297. package/dist/src/ipc/client.js.map +1 -0
  298. package/dist/src/ipc/control.js +70 -0
  299. package/dist/src/ipc/control.js.map +1 -0
  300. package/dist/src/ipc/ghreadshim.js +77 -0
  301. package/dist/src/ipc/ghreadshim.js.map +1 -0
  302. package/dist/src/ipc/launcher.js +65 -0
  303. package/dist/src/ipc/launcher.js.map +1 -0
  304. package/dist/src/ipc/permits.js +293 -0
  305. package/dist/src/ipc/permits.js.map +1 -0
  306. package/dist/src/ipc/postshim.js +137 -0
  307. package/dist/src/ipc/postshim.js.map +1 -0
  308. package/dist/src/ipc/protocol.js +239 -0
  309. package/dist/src/ipc/protocol.js.map +1 -0
  310. package/dist/src/ipc/server.js +312 -0
  311. package/dist/src/ipc/server.js.map +1 -0
  312. package/dist/src/ipc/workerspec.js +148 -0
  313. package/dist/src/ipc/workerspec.js.map +1 -0
  314. package/dist/src/learner/learner.js +1272 -0
  315. package/dist/src/learner/learner.js.map +1 -0
  316. package/dist/src/learner/miner.js +948 -0
  317. package/dist/src/learner/miner.js.map +1 -0
  318. package/dist/src/learner/packet.js +216 -0
  319. package/dist/src/learner/packet.js.map +1 -0
  320. package/dist/src/learner/receipt.js +135 -0
  321. package/dist/src/learner/receipt.js.map +1 -0
  322. package/dist/src/learner/status.js +38 -0
  323. package/dist/src/learner/status.js.map +1 -0
  324. package/dist/src/ledgercheck.js +120 -0
  325. package/dist/src/ledgercheck.js.map +1 -0
  326. package/dist/src/lessonledger.js +451 -0
  327. package/dist/src/lessonledger.js.map +1 -0
  328. package/dist/src/lessonselect.js +639 -0
  329. package/dist/src/lessonselect.js.map +1 -0
  330. package/dist/src/lessonshadow.js +540 -0
  331. package/dist/src/lessonshadow.js.map +1 -0
  332. package/dist/src/levers.js +302 -0
  333. package/dist/src/levers.js.map +1 -0
  334. package/dist/src/live/projection.js +450 -0
  335. package/dist/src/live/projection.js.map +1 -0
  336. package/dist/src/live/publish.js +83 -0
  337. package/dist/src/live/publish.js.map +1 -0
  338. package/dist/src/live/read.js +60 -0
  339. package/dist/src/live/read.js.map +1 -0
  340. package/dist/src/livecli.js +288 -0
  341. package/dist/src/livecli.js.map +1 -0
  342. package/dist/src/loginhint.js +42 -0
  343. package/dist/src/loginhint.js.map +1 -0
  344. package/dist/src/loginrefresh/atomic.js +66 -0
  345. package/dist/src/loginrefresh/atomic.js.map +1 -0
  346. package/dist/src/loginrefresh/lock.js +93 -0
  347. package/dist/src/loginrefresh/lock.js.map +1 -0
  348. package/dist/src/loginrefresh/main.js +58 -0
  349. package/dist/src/loginrefresh/main.js.map +1 -0
  350. package/dist/src/loginrefresh/pirefresh.js +49 -0
  351. package/dist/src/loginrefresh/pirefresh.js.map +1 -0
  352. package/dist/src/loginrefresh/refresher.js +286 -0
  353. package/dist/src/loginrefresh/refresher.js.map +1 -0
  354. package/dist/src/loginrefresh/supervisor.js +253 -0
  355. package/dist/src/loginrefresh/supervisor.js.map +1 -0
  356. package/dist/src/loginrefresh/types.js +4 -0
  357. package/dist/src/loginrefresh/types.js.map +1 -0
  358. package/dist/src/memory/context.js +251 -0
  359. package/dist/src/memory/context.js.map +1 -0
  360. package/dist/src/memory/datafence.js +5 -0
  361. package/dist/src/memory/datafence.js.map +1 -0
  362. package/dist/src/memory/delivery.js +131 -0
  363. package/dist/src/memory/delivery.js.map +1 -0
  364. package/dist/src/memory/eventtags.js +81 -0
  365. package/dist/src/memory/eventtags.js.map +1 -0
  366. package/dist/src/memory/health.js +713 -0
  367. package/dist/src/memory/health.js.map +1 -0
  368. package/dist/src/memory/import.js +504 -0
  369. package/dist/src/memory/import.js.map +1 -0
  370. package/dist/src/memory/layout.js +252 -0
  371. package/dist/src/memory/layout.js.map +1 -0
  372. package/dist/src/memory/legacy-file.js +100 -0
  373. package/dist/src/memory/legacy-file.js.map +1 -0
  374. package/dist/src/memory/lessons.js +370 -0
  375. package/dist/src/memory/lessons.js.map +1 -0
  376. package/dist/src/memory/ovsession.js +449 -0
  377. package/dist/src/memory/ovsession.js.map +1 -0
  378. package/dist/src/memory/relayout.js +259 -0
  379. package/dist/src/memory/relayout.js.map +1 -0
  380. package/dist/src/memory/roundactivity.js +180 -0
  381. package/dist/src/memory/roundactivity.js.map +1 -0
  382. package/dist/src/memory/selection.js +690 -0
  383. package/dist/src/memory/selection.js.map +1 -0
  384. package/dist/src/memory/shadowstatus.js +69 -0
  385. package/dist/src/memory/shadowstatus.js.map +1 -0
  386. package/dist/src/memory/store.js +83 -0
  387. package/dist/src/memory/store.js.map +1 -0
  388. package/dist/src/memory/textidentity.js +8 -0
  389. package/dist/src/memory/textidentity.js.map +1 -0
  390. package/dist/src/metrics.js +773 -0
  391. package/dist/src/metrics.js.map +1 -0
  392. package/dist/src/missingconfig.js +8 -0
  393. package/dist/src/missingconfig.js.map +1 -0
  394. package/dist/src/npmverbs.js +226 -0
  395. package/dist/src/npmverbs.js.map +1 -0
  396. package/dist/src/onboard/choices.js +191 -0
  397. package/dist/src/onboard/choices.js.map +1 -0
  398. package/dist/src/onboard/engine.js +344 -0
  399. package/dist/src/onboard/engine.js.map +1 -0
  400. package/dist/src/onboard/launch.js +83 -0
  401. package/dist/src/onboard/launch.js.map +1 -0
  402. package/dist/src/onboard/steps/appslug.js +211 -0
  403. package/dist/src/onboard/steps/appslug.js.map +1 -0
  404. package/dist/src/onboard/steps/bringup.js +408 -0
  405. package/dist/src/onboard/steps/bringup.js.map +1 -0
  406. package/dist/src/onboard/steps/compose.js +343 -0
  407. package/dist/src/onboard/steps/compose.js.map +1 -0
  408. package/dist/src/onboard/steps/configdelivery.js +50 -0
  409. package/dist/src/onboard/steps/configdelivery.js.map +1 -0
  410. package/dist/src/onboard/steps/configfill.js +1148 -0
  411. package/dist/src/onboard/steps/configfill.js.map +1 -0
  412. package/dist/src/onboard/steps/deploysh.js +80 -0
  413. package/dist/src/onboard/steps/deploysh.js.map +1 -0
  414. package/dist/src/onboard/steps/embeddings.js +472 -0
  415. package/dist/src/onboard/steps/embeddings.js.map +1 -0
  416. package/dist/src/onboard/steps/escalation.js +571 -0
  417. package/dist/src/onboard/steps/escalation.js.map +1 -0
  418. package/dist/src/onboard/steps/githubapp.js +1092 -0
  419. package/dist/src/onboard/steps/githubapp.js.map +1 -0
  420. package/dist/src/onboard/steps/golive.js +506 -0
  421. package/dist/src/onboard/steps/golive.js.map +1 -0
  422. package/dist/src/onboard/steps/index.js +67 -0
  423. package/dist/src/onboard/steps/index.js.map +1 -0
  424. package/dist/src/onboard/steps/ingress.js +762 -0
  425. package/dist/src/onboard/steps/ingress.js.map +1 -0
  426. package/dist/src/onboard/steps/inventory.js +420 -0
  427. package/dist/src/onboard/steps/inventory.js.map +1 -0
  428. package/dist/src/onboard/steps/llmauth.js +893 -0
  429. package/dist/src/onboard/steps/llmauth.js.map +1 -0
  430. package/dist/src/onboard/steps/memory.js +1060 -0
  431. package/dist/src/onboard/steps/memory.js.map +1 -0
  432. package/dist/src/onboard/steps/memorykeys.js +43 -0
  433. package/dist/src/onboard/steps/memorykeys.js.map +1 -0
  434. package/dist/src/onboard/steps/preflight.js +172 -0
  435. package/dist/src/onboard/steps/preflight.js.map +1 -0
  436. package/dist/src/onboard/steps/proof.js +502 -0
  437. package/dist/src/onboard/steps/proof.js.map +1 -0
  438. package/dist/src/onboard/steps/ssh.js +300 -0
  439. package/dist/src/onboard/steps/ssh.js.map +1 -0
  440. package/dist/src/onboard/steps/topology.js +291 -0
  441. package/dist/src/onboard/steps/topology.js.map +1 -0
  442. package/dist/src/onboard/steps/transport.js +511 -0
  443. package/dist/src/onboard/steps/transport.js.map +1 -0
  444. package/dist/src/onboard/steps/verifyup.js +362 -0
  445. package/dist/src/onboard/steps/verifyup.js.map +1 -0
  446. package/dist/src/onboard/steps/vmdeploy.js +368 -0
  447. package/dist/src/onboard/steps/vmdeploy.js.map +1 -0
  448. package/dist/src/onboard/toml.js +53 -0
  449. package/dist/src/onboard/toml.js.map +1 -0
  450. package/dist/src/opencli.js +508 -0
  451. package/dist/src/opencli.js.map +1 -0
  452. package/dist/src/openpr.js +457 -0
  453. package/dist/src/openpr.js.map +1 -0
  454. package/dist/src/openviking/client.js +821 -0
  455. package/dist/src/openviking/client.js.map +1 -0
  456. package/dist/src/openviking/context.js +218 -0
  457. package/dist/src/openviking/context.js.map +1 -0
  458. package/dist/src/openviking/embedder.js +457 -0
  459. package/dist/src/openviking/embedder.js.map +1 -0
  460. package/dist/src/openviking/gapsink.js +38 -0
  461. package/dist/src/openviking/gapsink.js.map +1 -0
  462. package/dist/src/openviking/health.js +69 -0
  463. package/dist/src/openviking/health.js.map +1 -0
  464. package/dist/src/openviking/index.js +24 -0
  465. package/dist/src/openviking/index.js.map +1 -0
  466. package/dist/src/openviking/lessonfind.js +54 -0
  467. package/dist/src/openviking/lessonfind.js.map +1 -0
  468. package/dist/src/openviking/probe.js +89 -0
  469. package/dist/src/openviking/probe.js.map +1 -0
  470. package/dist/src/openviking/proc.js +95 -0
  471. package/dist/src/openviking/proc.js.map +1 -0
  472. package/dist/src/openviking/provisionreport.js +144 -0
  473. package/dist/src/openviking/provisionreport.js.map +1 -0
  474. package/dist/src/openviking/reembed.js +317 -0
  475. package/dist/src/openviking/reembed.js.map +1 -0
  476. package/dist/src/openviking/relayout.js +153 -0
  477. package/dist/src/openviking/relayout.js.map +1 -0
  478. package/dist/src/openviking/sidecar-main.js +39 -0
  479. package/dist/src/openviking/sidecar-main.js.map +1 -0
  480. package/dist/src/openviking/sidecar.js +79 -0
  481. package/dist/src/openviking/sidecar.js.map +1 -0
  482. package/dist/src/openviking/store.js +1758 -0
  483. package/dist/src/openviking/store.js.map +1 -0
  484. package/dist/src/openviking/supervisor.js +422 -0
  485. package/dist/src/openviking/supervisor.js.map +1 -0
  486. package/dist/src/openviking/types.js +5 -0
  487. package/dist/src/openviking/types.js.map +1 -0
  488. package/dist/src/operator-recovery.js +172 -0
  489. package/dist/src/operator-recovery.js.map +1 -0
  490. package/dist/src/operatormessage.js +44 -0
  491. package/dist/src/operatormessage.js.map +1 -0
  492. package/dist/src/outcomes.js +1361 -0
  493. package/dist/src/outcomes.js.map +1 -0
  494. package/dist/src/piauthcopy.js +5 -0
  495. package/dist/src/piauthcopy.js.map +1 -0
  496. package/dist/src/picli.js +45 -0
  497. package/dist/src/picli.js.map +1 -0
  498. package/dist/src/picwd.js +25 -0
  499. package/dist/src/picwd.js.map +1 -0
  500. package/dist/src/pilogin.js +35 -0
  501. package/dist/src/pilogin.js.map +1 -0
  502. package/dist/src/pingpong.js +1028 -0
  503. package/dist/src/pingpong.js.map +1 -0
  504. package/dist/src/posting-journal.js +441 -0
  505. package/dist/src/posting-journal.js.map +1 -0
  506. package/dist/src/posting-outbox.js +662 -0
  507. package/dist/src/posting-outbox.js.map +1 -0
  508. package/dist/src/posting-receipt.js +203 -0
  509. package/dist/src/posting-receipt.js.map +1 -0
  510. package/dist/src/posting.js +348 -0
  511. package/dist/src/posting.js.map +1 -0
  512. package/dist/src/postops.js +637 -0
  513. package/dist/src/postops.js.map +1 -0
  514. package/dist/src/pr-activity.js +11 -0
  515. package/dist/src/pr-activity.js.map +1 -0
  516. package/dist/src/pr-author.js +5 -0
  517. package/dist/src/pr-author.js.map +1 -0
  518. package/dist/src/pr-conversation.js +355 -0
  519. package/dist/src/pr-conversation.js.map +1 -0
  520. package/dist/src/pr-session-lifecycle.js +542 -0
  521. package/dist/src/pr-session-lifecycle.js.map +1 -0
  522. package/dist/src/preflight.js +341 -0
  523. package/dist/src/preflight.js.map +1 -0
  524. package/dist/src/priorresolve.js +275 -0
  525. package/dist/src/priorresolve.js.map +1 -0
  526. package/dist/src/qcrbin.js +180 -0
  527. package/dist/src/qcrbin.js.map +1 -0
  528. package/dist/src/recheck.js +1398 -0
  529. package/dist/src/recheck.js.map +1 -0
  530. package/dist/src/reconcile.js +820 -0
  531. package/dist/src/reconcile.js.map +1 -0
  532. package/dist/src/recordedfindings.js +15 -0
  533. package/dist/src/recordedfindings.js.map +1 -0
  534. package/dist/src/regression.js +546 -0
  535. package/dist/src/regression.js.map +1 -0
  536. package/dist/src/replay.js +598 -0
  537. package/dist/src/replay.js.map +1 -0
  538. package/dist/src/requiredpasses.js +113 -0
  539. package/dist/src/requiredpasses.js.map +1 -0
  540. package/dist/src/resumecheck.js +168 -0
  541. package/dist/src/resumecheck.js.map +1 -0
  542. package/dist/src/reviewcli.js +671 -0
  543. package/dist/src/reviewcli.js.map +1 -0
  544. package/dist/src/reviewcontext.js +22 -0
  545. package/dist/src/reviewcontext.js.map +1 -0
  546. package/dist/src/reviewdetach.js +574 -0
  547. package/dist/src/reviewdetach.js.map +1 -0
  548. package/dist/src/reviewhistory.js +284 -0
  549. package/dist/src/reviewhistory.js.map +1 -0
  550. package/dist/src/reviewhome.js +26 -0
  551. package/dist/src/reviewhome.js.map +1 -0
  552. package/dist/src/reviewmemory.js +110 -0
  553. package/dist/src/reviewmemory.js.map +1 -0
  554. package/dist/src/reviewrendercli.js +104 -0
  555. package/dist/src/reviewrendercli.js.map +1 -0
  556. package/dist/src/round-work.js +20 -0
  557. package/dist/src/round-work.js.map +1 -0
  558. package/dist/src/runhost.js +72 -0
  559. package/dist/src/runhost.js.map +1 -0
  560. package/dist/src/scanauth.js +25 -0
  561. package/dist/src/scanauth.js.map +1 -0
  562. package/dist/src/scanbox.js +846 -0
  563. package/dist/src/scanbox.js.map +1 -0
  564. package/dist/src/scancli.js +1074 -0
  565. package/dist/src/scancli.js.map +1 -0
  566. package/dist/src/scandriverlog.js +30 -0
  567. package/dist/src/scandriverlog.js.map +1 -0
  568. package/dist/src/session-bridge.js +75 -0
  569. package/dist/src/session-bridge.js.map +1 -0
  570. package/dist/src/session-command-payload.js +29 -0
  571. package/dist/src/session-command-payload.js.map +1 -0
  572. package/dist/src/session-command-supervisor.js +939 -0
  573. package/dist/src/session-command-supervisor.js.map +1 -0
  574. package/dist/src/sessionjsonl.js +85 -0
  575. package/dist/src/sessionjsonl.js.map +1 -0
  576. package/dist/src/sessions.js +541 -0
  577. package/dist/src/sessions.js.map +1 -0
  578. package/dist/src/setup/adapters.js +330 -0
  579. package/dist/src/setup/adapters.js.map +1 -0
  580. package/dist/src/setup/baselines.js +64 -0
  581. package/dist/src/setup/baselines.js.map +1 -0
  582. package/dist/src/setup/caserunner.js +554 -0
  583. package/dist/src/setup/caserunner.js.map +1 -0
  584. package/dist/src/setup/configcommit.js +358 -0
  585. package/dist/src/setup/configcommit.js.map +1 -0
  586. package/dist/src/setup/engine.js +672 -0
  587. package/dist/src/setup/engine.js.map +1 -0
  588. package/dist/src/setup/facts.js +593 -0
  589. package/dist/src/setup/facts.js.map +1 -0
  590. package/dist/src/setup/findings.js +948 -0
  591. package/dist/src/setup/findings.js.map +1 -0
  592. package/dist/src/setup/history.js +338 -0
  593. package/dist/src/setup/history.js.map +1 -0
  594. package/dist/src/setup/interview.js +185 -0
  595. package/dist/src/setup/interview.js.map +1 -0
  596. package/dist/src/setup/ledger.js +207 -0
  597. package/dist/src/setup/ledger.js.map +1 -0
  598. package/dist/src/setup/pins.js +43 -0
  599. package/dist/src/setup/pins.js.map +1 -0
  600. package/dist/src/setup/portrait.js +432 -0
  601. package/dist/src/setup/portrait.js.map +1 -0
  602. package/dist/src/setup/presentation.js +9 -0
  603. package/dist/src/setup/presentation.js.map +1 -0
  604. package/dist/src/setup/profile.js +417 -0
  605. package/dist/src/setup/profile.js.map +1 -0
  606. package/dist/src/setup/replay.js +240 -0
  607. package/dist/src/setup/replay.js.map +1 -0
  608. package/dist/src/setup/replaybuild.js +311 -0
  609. package/dist/src/setup/replaybuild.js.map +1 -0
  610. package/dist/src/setup/replayrun.js +806 -0
  611. package/dist/src/setup/replayrun.js.map +1 -0
  612. package/dist/src/setup/replaysource.js +169 -0
  613. package/dist/src/setup/replaysource.js.map +1 -0
  614. package/dist/src/setup/retune.js +333 -0
  615. package/dist/src/setup/retune.js.map +1 -0
  616. package/dist/src/setup/retunelog.js +51 -0
  617. package/dist/src/setup/retunelog.js.map +1 -0
  618. package/dist/src/setup/scan.js +725 -0
  619. package/dist/src/setup/scan.js.map +1 -0
  620. package/dist/src/setup/scanbuild.js +133 -0
  621. package/dist/src/setup/scanbuild.js.map +1 -0
  622. package/dist/src/setup/scanfacts.js +96 -0
  623. package/dist/src/setup/scanfacts.js.map +1 -0
  624. package/dist/src/setup/scanlease.js +251 -0
  625. package/dist/src/setup/scanlease.js.map +1 -0
  626. package/dist/src/setup/scanreport.js +289 -0
  627. package/dist/src/setup/scanreport.js.map +1 -0
  628. package/dist/src/setup/scanrun.js +1733 -0
  629. package/dist/src/setup/scanrun.js.map +1 -0
  630. package/dist/src/setup/scantree.js +257 -0
  631. package/dist/src/setup/scantree.js.map +1 -0
  632. package/dist/src/setup/stage2.js +617 -0
  633. package/dist/src/setup/stage2.js.map +1 -0
  634. package/dist/src/setup/stage2request.js +259 -0
  635. package/dist/src/setup/stage2request.js.map +1 -0
  636. package/dist/src/setup/survey.js +307 -0
  637. package/dist/src/setup/survey.js.map +1 -0
  638. package/dist/src/setup/surveyrun.js +549 -0
  639. package/dist/src/setup/surveyrun.js.map +1 -0
  640. package/dist/src/setup/textsniff.js +89 -0
  641. package/dist/src/setup/textsniff.js.map +1 -0
  642. package/dist/src/setup/trackersink.js +395 -0
  643. package/dist/src/setup/trackersink.js.map +1 -0
  644. package/dist/src/setup/triage.js +636 -0
  645. package/dist/src/setup/triage.js.map +1 -0
  646. package/dist/src/setup/tuning.js +585 -0
  647. package/dist/src/setup/tuning.js.map +1 -0
  648. package/dist/src/setup/unitcut.js +437 -0
  649. package/dist/src/setup/unitcut.js.map +1 -0
  650. package/dist/src/singleflight.js +72 -0
  651. package/dist/src/singleflight.js.map +1 -0
  652. package/dist/src/slack/announce.js +725 -0
  653. package/dist/src/slack/announce.js.map +1 -0
  654. package/dist/src/slack/api.js +227 -0
  655. package/dist/src/slack/api.js.map +1 -0
  656. package/dist/src/slack/messages.js +158 -0
  657. package/dist/src/slack/messages.js.map +1 -0
  658. package/dist/src/slack/origin.js +550 -0
  659. package/dist/src/slack/origin.js.map +1 -0
  660. package/dist/src/slack/policy.js +225 -0
  661. package/dist/src/slack/policy.js.map +1 -0
  662. package/dist/src/slack/reply.js +153 -0
  663. package/dist/src/slack/reply.js.map +1 -0
  664. package/dist/src/slack/router.js +189 -0
  665. package/dist/src/slack/router.js.map +1 -0
  666. package/dist/src/slack/socket.js +323 -0
  667. package/dist/src/slack/socket.js.map +1 -0
  668. package/dist/src/slack/types.js +11 -0
  669. package/dist/src/slack/types.js.map +1 -0
  670. package/dist/src/sqlitehint.js +30 -0
  671. package/dist/src/sqlitehint.js.map +1 -0
  672. package/dist/src/ssh-observation.js +25 -0
  673. package/dist/src/ssh-observation.js.map +1 -0
  674. package/dist/src/state.js +5869 -0
  675. package/dist/src/state.js.map +1 -0
  676. package/dist/src/statemachine.js +220 -0
  677. package/dist/src/statemachine.js.map +1 -0
  678. package/dist/src/stubs.js +52 -0
  679. package/dist/src/stubs.js.map +1 -0
  680. package/dist/src/takeover.js +506 -0
  681. package/dist/src/takeover.js.map +1 -0
  682. package/dist/src/takeoverpi.js +249 -0
  683. package/dist/src/takeoverpi.js.map +1 -0
  684. package/dist/src/terminal-failure.js +26 -0
  685. package/dist/src/terminal-failure.js.map +1 -0
  686. package/dist/src/thread-resolution-refusal.js +4 -0
  687. package/dist/src/thread-resolution-refusal.js.map +1 -0
  688. package/dist/src/tmux.js +126 -0
  689. package/dist/src/tmux.js.map +1 -0
  690. package/dist/src/trackerid.js +43 -0
  691. package/dist/src/trackerid.js.map +1 -0
  692. package/dist/src/transcriptindex.js +512 -0
  693. package/dist/src/transcriptindex.js.map +1 -0
  694. package/dist/src/tui/actions.js +404 -0
  695. package/dist/src/tui/actions.js.map +1 -0
  696. package/dist/src/tui/alerts.js +523 -0
  697. package/dist/src/tui/alerts.js.map +1 -0
  698. package/dist/src/tui/app.js +1835 -0
  699. package/dist/src/tui/app.js.map +1 -0
  700. package/dist/src/tui/archiveops.js +164 -0
  701. package/dist/src/tui/archiveops.js.map +1 -0
  702. package/dist/src/tui/autofile.js +191 -0
  703. package/dist/src/tui/autofile.js.map +1 -0
  704. package/dist/src/tui/board.js +1143 -0
  705. package/dist/src/tui/board.js.map +1 -0
  706. package/dist/src/tui/candidates.js +699 -0
  707. package/dist/src/tui/candidates.js.map +1 -0
  708. package/dist/src/tui/cellwidth.js +151 -0
  709. package/dist/src/tui/cellwidth.js.map +1 -0
  710. package/dist/src/tui/changelog-store.js +404 -0
  711. package/dist/src/tui/changelog-store.js.map +1 -0
  712. package/dist/src/tui/chord.js +26 -0
  713. package/dist/src/tui/chord.js.map +1 -0
  714. package/dist/src/tui/clipboard.js +81 -0
  715. package/dist/src/tui/clipboard.js.map +1 -0
  716. package/dist/src/tui/cmdbar.js +253 -0
  717. package/dist/src/tui/cmdbar.js.map +1 -0
  718. package/dist/src/tui/companion.js +1275 -0
  719. package/dist/src/tui/companion.js.map +1 -0
  720. package/dist/src/tui/companionplan.js +200 -0
  721. package/dist/src/tui/companionplan.js.map +1 -0
  722. package/dist/src/tui/companiontab.js +61 -0
  723. package/dist/src/tui/companiontab.js.map +1 -0
  724. package/dist/src/tui/confighome.js +105 -0
  725. package/dist/src/tui/confighome.js.map +1 -0
  726. package/dist/src/tui/connect.js +44 -0
  727. package/dist/src/tui/connect.js.map +1 -0
  728. package/dist/src/tui/deploy-ceremony.js +75 -0
  729. package/dist/src/tui/deploy-ceremony.js.map +1 -0
  730. package/dist/src/tui/deploy-drain.js +93 -0
  731. package/dist/src/tui/deploy-drain.js.map +1 -0
  732. package/dist/src/tui/deploy-process.js +234 -0
  733. package/dist/src/tui/deploy-process.js.map +1 -0
  734. package/dist/src/tui/deploytab.js +1263 -0
  735. package/dist/src/tui/deploytab.js.map +1 -0
  736. package/dist/src/tui/design.js +111 -0
  737. package/dist/src/tui/design.js.map +1 -0
  738. package/dist/src/tui/digesttab.js +148 -0
  739. package/dist/src/tui/digesttab.js.map +1 -0
  740. package/dist/src/tui/emptystate.js +32 -0
  741. package/dist/src/tui/emptystate.js.map +1 -0
  742. package/dist/src/tui/evidence.js +790 -0
  743. package/dist/src/tui/evidence.js.map +1 -0
  744. package/dist/src/tui/feed.js +415 -0
  745. package/dist/src/tui/feed.js.map +1 -0
  746. package/dist/src/tui/feedbacktab.js +907 -0
  747. package/dist/src/tui/feedbacktab.js.map +1 -0
  748. package/dist/src/tui/filters.js +72 -0
  749. package/dist/src/tui/filters.js.map +1 -0
  750. package/dist/src/tui/ghread.js +272 -0
  751. package/dist/src/tui/ghread.js.map +1 -0
  752. package/dist/src/tui/historypull.js +61 -0
  753. package/dist/src/tui/historypull.js.map +1 -0
  754. package/dist/src/tui/inboxpull.js +197 -0
  755. package/dist/src/tui/inboxpull.js.map +1 -0
  756. package/dist/src/tui/index.js +1425 -0
  757. package/dist/src/tui/index.js.map +1 -0
  758. package/dist/src/tui/issuesink.js +206 -0
  759. package/dist/src/tui/issuesink.js.map +1 -0
  760. package/dist/src/tui/jsonfile.js +32 -0
  761. package/dist/src/tui/jsonfile.js.map +1 -0
  762. package/dist/src/tui/keys.js +97 -0
  763. package/dist/src/tui/keys.js.map +1 -0
  764. package/dist/src/tui/layout.js +70 -0
  765. package/dist/src/tui/layout.js.map +1 -0
  766. package/dist/src/tui/learning.js +469 -0
  767. package/dist/src/tui/learning.js.map +1 -0
  768. package/dist/src/tui/lessonswitch.js +103 -0
  769. package/dist/src/tui/lessonswitch.js.map +1 -0
  770. package/dist/src/tui/livecontrol.js +167 -0
  771. package/dist/src/tui/livecontrol.js.map +1 -0
  772. package/dist/src/tui/memforward.js +310 -0
  773. package/dist/src/tui/memforward.js.map +1 -0
  774. package/dist/src/tui/memincident.js +287 -0
  775. package/dist/src/tui/memincident.js.map +1 -0
  776. package/dist/src/tui/memory.js +485 -0
  777. package/dist/src/tui/memory.js.map +1 -0
  778. package/dist/src/tui/memtab.js +513 -0
  779. package/dist/src/tui/memtab.js.map +1 -0
  780. package/dist/src/tui/metricstab.js +979 -0
  781. package/dist/src/tui/metricstab.js.map +1 -0
  782. package/dist/src/tui/model.js +104 -0
  783. package/dist/src/tui/model.js.map +1 -0
  784. package/dist/src/tui/mouse.js +83 -0
  785. package/dist/src/tui/mouse.js.map +1 -0
  786. package/dist/src/tui/msg.js +196 -0
  787. package/dist/src/tui/msg.js.map +1 -0
  788. package/dist/src/tui/nativecompanion.js +321 -0
  789. package/dist/src/tui/nativecompanion.js.map +1 -0
  790. package/dist/src/tui/openurl.js +17 -0
  791. package/dist/src/tui/openurl.js.map +1 -0
  792. package/dist/src/tui/paint.js +501 -0
  793. package/dist/src/tui/paint.js.map +1 -0
  794. package/dist/src/tui/panes.js +74 -0
  795. package/dist/src/tui/panes.js.map +1 -0
  796. package/dist/src/tui/pipane.js +166 -0
  797. package/dist/src/tui/pipane.js.map +1 -0
  798. package/dist/src/tui/poll-hooks.js +11 -0
  799. package/dist/src/tui/poll-hooks.js.map +1 -0
  800. package/dist/src/tui/poll.js +113 -0
  801. package/dist/src/tui/poll.js.map +1 -0
  802. package/dist/src/tui/proposals.js +715 -0
  803. package/dist/src/tui/proposals.js.map +1 -0
  804. package/dist/src/tui/prpause.js +132 -0
  805. package/dist/src/tui/prpause.js.map +1 -0
  806. package/dist/src/tui/reload.js +351 -0
  807. package/dist/src/tui/reload.js.map +1 -0
  808. package/dist/src/tui/remote.js +312 -0
  809. package/dist/src/tui/remote.js.map +1 -0
  810. package/dist/src/tui/rollover.js +767 -0
  811. package/dist/src/tui/rollover.js.map +1 -0
  812. package/dist/src/tui/scantab.js +1053 -0
  813. package/dist/src/tui/scantab.js.map +1 -0
  814. package/dist/src/tui/setupentry.js +81 -0
  815. package/dist/src/tui/setupentry.js.map +1 -0
  816. package/dist/src/tui/sidebar.js +602 -0
  817. package/dist/src/tui/sidebar.js.map +1 -0
  818. package/dist/src/tui/sshtriage.js +393 -0
  819. package/dist/src/tui/sshtriage.js.map +1 -0
  820. package/dist/src/tui/startup.js +172 -0
  821. package/dist/src/tui/startup.js.map +1 -0
  822. package/dist/src/tui/tabs.js +41 -0
  823. package/dist/src/tui/tabs.js.map +1 -0
  824. package/dist/src/tui/termmirror.js +217 -0
  825. package/dist/src/tui/termmirror.js.map +1 -0
  826. package/dist/src/tui/theme.js +95 -0
  827. package/dist/src/tui/theme.js.map +1 -0
  828. package/dist/src/tui/ticketstab.js +224 -0
  829. package/dist/src/tui/ticketstab.js.map +1 -0
  830. package/dist/src/tui/tmuxsocket.js +101 -0
  831. package/dist/src/tui/tmuxsocket.js.map +1 -0
  832. package/dist/src/tui/trackertickets.js +77 -0
  833. package/dist/src/tui/trackertickets.js.map +1 -0
  834. package/dist/src/tui/unwedge.js +245 -0
  835. package/dist/src/tui/unwedge.js.map +1 -0
  836. package/dist/src/tui/viewer.js +479 -0
  837. package/dist/src/tui/viewer.js.map +1 -0
  838. package/dist/src/tui/viewerinput.js +125 -0
  839. package/dist/src/tui/viewerinput.js.map +1 -0
  840. package/dist/src/updatenotice.js +143 -0
  841. package/dist/src/updatenotice.js.map +1 -0
  842. package/dist/src/usage.js +1007 -0
  843. package/dist/src/usage.js.map +1 -0
  844. package/dist/src/verdicts.js +3848 -0
  845. package/dist/src/verdicts.js.map +1 -0
  846. package/dist/src/version.js +58 -0
  847. package/dist/src/version.js.map +1 -0
  848. package/dist/src/wakes.js +411 -0
  849. package/dist/src/wakes.js.map +1 -0
  850. package/dist/src/webhook.js +725 -0
  851. package/dist/src/webhook.js.map +1 -0
  852. package/dist/src/webhookheal.js +238 -0
  853. package/dist/src/webhookheal.js.map +1 -0
  854. package/dist/src/wire.js +1801 -0
  855. package/dist/src/wire.js.map +1 -0
  856. package/dist/src/worker-session-host.js +531 -0
  857. package/dist/src/worker-session-host.js.map +1 -0
  858. package/dist/src/workerbreaker.js +112 -0
  859. package/dist/src/workerbreaker.js.map +1 -0
  860. package/dist/src/workercontrol.js +49 -0
  861. package/dist/src/workercontrol.js.map +1 -0
  862. package/dist/src/workerlease.js +351 -0
  863. package/dist/src/workerlease.js.map +1 -0
  864. package/dist/src/workerliveness.js +84 -0
  865. package/dist/src/workerliveness.js.map +1 -0
  866. package/dist/src/workerlog.js +65 -0
  867. package/dist/src/workerlog.js.map +1 -0
  868. package/dist/src/workerruntime.js +10 -0
  869. package/dist/src/workerruntime.js.map +1 -0
  870. package/dist/src/workersupervisor.js +1206 -0
  871. package/dist/src/workersupervisor.js.map +1 -0
  872. package/dist/src/workerusage.js +23 -0
  873. package/dist/src/workerusage.js.map +1 -0
  874. package/dist/src/workerworld.js +332 -0
  875. package/dist/src/workerworld.js.map +1 -0
  876. package/dist/src/worktrees.js +984 -0
  877. package/dist/src/worktrees.js.map +1 -0
  878. package/docker/Dockerfile +284 -0
  879. package/docker/Dockerfile.dockerignore +35 -0
  880. package/docker/README.md +221 -0
  881. package/docker/companion/Dockerfile +139 -0
  882. package/docker/companion/agents/evidence.md +34 -0
  883. package/docker/companion/agents/explore.md +26 -0
  884. package/docker/companion/agents/pass-survey.md +49 -0
  885. package/docker/companion/agents/study.md +26 -0
  886. package/docker/companion/entrypoint.sh +343 -0
  887. package/docker/companion/memory-health.mjs +269 -0
  888. package/docker/entrypoint.sh +782 -0
  889. package/docker/memory/Dockerfile +191 -0
  890. package/docker/memory/Dockerfile.dockerignore +20 -0
  891. package/docker/memory/README.md +60 -0
  892. package/docker/memory/entrypoint.sh +163 -0
  893. package/docker/setid/qcr-setid.c +109 -0
  894. package/docker/tunnel/Dockerfile.cloudflared +51 -0
  895. package/docker/tunnel/Dockerfile.ngrok +40 -0
  896. package/docker/tunnel/sidecar.mjs +411 -0
  897. package/docker/vm/tmux.conf +26 -0
  898. package/docker-compose.yml +348 -0
  899. package/extensions/cli/bash-guard-ambient.ts +71 -0
  900. package/extensions/cli/bash-guard.ts +12 -0
  901. package/extensions/cli/companion-guard.ts +8 -0
  902. package/extensions/cli/debug-round.ts +9 -0
  903. package/extensions/cli/inject-bridge.ts +8 -0
  904. package/extensions/cli/ledger-pin.ts +13 -0
  905. package/extensions/cli/lens.ts +22 -0
  906. package/extensions/cli/muted-theme.ts +9 -0
  907. package/extensions/cli/onboarding.ts +8 -0
  908. package/extensions/cli/setup.ts +8 -0
  909. package/extensions/cli/tui-view.ts +8 -0
  910. package/extensions/companion-guard.ts +411 -0
  911. package/extensions/debug-round.ts +281 -0
  912. package/extensions/inject-bridge.ts +630 -0
  913. package/extensions/inline-bash.ts +102 -0
  914. package/extensions/muted-theme.json +68 -0
  915. package/extensions/muted-theme.ts +23 -0
  916. package/extensions/onboarding.ts +233 -0
  917. package/extensions/setup-replay.ts +336 -0
  918. package/extensions/setup-scan.ts +1236 -0
  919. package/extensions/setup-triage.ts +190 -0
  920. package/extensions/setup.ts +1428 -0
  921. package/extensions/tui-view.ts +489 -0
  922. package/extensions/vendor/openviking-pi/LICENSE +201 -0
  923. package/extensions/vendor/openviking-pi/NOTICE +68 -0
  924. package/extensions/vendor/openviking-pi/README.md +550 -0
  925. package/extensions/vendor/openviking-pi/client.ts +588 -0
  926. package/extensions/vendor/openviking-pi/config.json +28 -0
  927. package/extensions/vendor/openviking-pi/config.ts +271 -0
  928. package/extensions/vendor/openviking-pi/index.ts +523 -0
  929. package/extensions/vendor/openviking-pi/lib/capture-adapter.d.mts +10 -0
  930. package/extensions/vendor/openviking-pi/lib/capture-adapter.mjs +88 -0
  931. package/extensions/vendor/openviking-pi/lib/takeover-core.d.mts +80 -0
  932. package/extensions/vendor/openviking-pi/lib/takeover-core.mjs +406 -0
  933. package/extensions/vendor/openviking-pi/lib/uri-guard-adapter.d.mts +1 -0
  934. package/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs +42 -0
  935. package/extensions/vendor/openviking-pi/patches/0000-vendoring-and-build-conformance.patch +726 -0
  936. package/extensions/vendor/openviking-pi/patches/0001-remove-session-before-compact-handler.patch +101 -0
  937. package/extensions/vendor/openviking-pi/patches/0002-no-ambient-work-in-subagent-leaves.patch +202 -0
  938. package/extensions/vendor/openviking-pi/patches/0003-never-auto-create-openviking-sessions.patch +120 -0
  939. package/extensions/vendor/openviking-pi/patches/0004-viking-write-durable-batch-write.patch +521 -0
  940. package/extensions/vendor/openviking-pi/patches/0005-second-memory-namespace.patch +786 -0
  941. package/extensions/vendor/openviking-pi/patches/0006-writes-that-stick-and-honest-errors.patch +996 -0
  942. package/extensions/vendor/openviking-pi/patches/0007-bounded-recall-no-commit.patch +794 -0
  943. package/extensions/vendor/openviking-pi/patches/0008-pr-derived-recall.patch +379 -0
  944. package/extensions/vendor/openviking-pi/patches/0009-pr-session-tools-in-round-areas.patch +375 -0
  945. package/extensions/vendor/openviking-pi/patches/0010-typed-lessons.patch +448 -0
  946. package/extensions/vendor/openviking-pi/patches/0011-review-session-memory-boundary.patch +382 -0
  947. package/extensions/vendor/openviking-pi/patches/0012-typecheck-against-the-real-pi.patch +129 -0
  948. package/extensions/vendor/openviking-pi/patches/0013-createopenviking-factory.patch +1168 -0
  949. package/extensions/vendor/openviking-pi/qcr-hint.ts +313 -0
  950. package/extensions/vendor/openviking-pi/qcr-honest.ts +183 -0
  951. package/extensions/vendor/openviking-pi/qcr-hooks.ts +87 -0
  952. package/extensions/vendor/openviking-pi/qcr-leaf.ts +78 -0
  953. package/extensions/vendor/openviking-pi/qcr-lesson.ts +231 -0
  954. package/extensions/vendor/openviking-pi/qcr-namespaces.ts +198 -0
  955. package/extensions/vendor/openviking-pi/qcr-recall.ts +288 -0
  956. package/extensions/vendor/openviking-pi/qcr-shim.ts +142 -0
  957. package/extensions/vendor/openviking-pi/qcr-write.ts +427 -0
  958. package/extensions/vendor/openviking-pi/recall.ts +149 -0
  959. package/extensions/vendor/openviking-pi/shared/capture-utils.d.mts +9 -0
  960. package/extensions/vendor/openviking-pi/shared/capture-utils.mjs +515 -0
  961. package/extensions/vendor/openviking-pi/shared/credentials.d.mts +14 -0
  962. package/extensions/vendor/openviking-pi/shared/credentials.mjs +228 -0
  963. package/extensions/vendor/openviking-pi/shared/pending-queue.d.mts +19 -0
  964. package/extensions/vendor/openviking-pi/shared/pending-queue.mjs +458 -0
  965. package/extensions/vendor/openviking-pi/shared/profile-inject.d.mts +17 -0
  966. package/extensions/vendor/openviking-pi/shared/profile-inject.mjs +294 -0
  967. package/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs +195 -0
  968. package/extensions/vendor/openviking-pi/shared/recall-core.d.mts +13 -0
  969. package/extensions/vendor/openviking-pi/shared/recall-core.mjs +609 -0
  970. package/extensions/vendor/openviking-pi/shared/retryable.mjs +9 -0
  971. package/extensions/vendor/openviking-pi/shared/session-model.d.mts +3 -0
  972. package/extensions/vendor/openviking-pi/shared/session-model.mjs +57 -0
  973. package/extensions/vendor/openviking-pi/shared/uri-guard.mjs +56 -0
  974. package/extensions/vendor/openviking-pi/shared/workspace-peer.d.mts +5 -0
  975. package/extensions/vendor/openviking-pi/shared/workspace-peer.mjs +16 -0
  976. package/extensions/vendor/openviking-pi/sync.ts +163 -0
  977. package/extensions/vendor/openviking-pi/takeover.ts +36 -0
  978. package/extensions/vendor/openviking-pi/tools.ts +479 -0
  979. package/extensions/vendor/openviking-pi/upstream.json +48 -0
  980. package/package.json +138 -4
  981. package/profiles/default/README.md +21 -0
  982. package/profiles/default/addenda/.gitkeep +0 -0
  983. package/profiles/default/profile.toml +17 -0
  984. package/profiles/example-django/README.md +21 -0
  985. package/profiles/example-django/addenda/10-migration-discipline.md +13 -0
  986. package/profiles/example-django/addenda/20-new-column-nullability.md +12 -0
  987. package/profiles/example-django/addenda/30-test-doctrine.md +12 -0
  988. package/profiles/example-django/addenda/40-orm-usage.md +19 -0
  989. package/profiles/example-django/addenda/50-declared-shape.md +10 -0
  990. package/profiles/example-django/addenda/60-config-placement.md +14 -0
  991. package/profiles/example-django/heuristics.toml +24 -0
  992. package/profiles/example-django/profile.toml +9 -0
  993. package/profiles/fast/README.md +24 -0
  994. package/profiles/fast/profile.toml +59 -0
  995. package/profiles/minimal/README.md +17 -0
  996. package/profiles/minimal/addenda/.gitkeep +0 -0
  997. package/profiles/minimal/profile.toml +8 -0
  998. package/profiles/snappy/README.md +24 -0
  999. package/profiles/snappy/addenda/10-race-as-question.md +6 -0
  1000. package/profiles/snappy/profile.toml +46 -0
  1001. package/prompts/companion-day-open.md +46 -0
  1002. package/prompts/companion-first-run.md +104 -0
  1003. package/prompts/companion.md +821 -0
  1004. package/prompts/conversation-system.md +117 -0
  1005. package/prompts/eod-sweep.md +120 -0
  1006. package/prompts/onboarding.md +74 -0
  1007. package/prompts/pass-common.md +52 -0
  1008. package/prompts/pass-quality-common.md +22 -0
  1009. package/prompts/round-first.md +874 -0
  1010. package/prompts/round-follow-up.md +991 -0
  1011. package/prompts/round-re-review.md +889 -0
  1012. package/prompts/round-recheck.md +196 -0
  1013. package/prompts/round-staleness.md +856 -0
  1014. package/schemas/review-result.v1.json +391 -0
  1015. package/schemas/scan-result.v1.json +421 -0
  1016. package/schemas/version.v1.json +57 -0
  1017. package/scripts/approve-pr.sh +16 -0
  1018. package/scripts/build-stamp.mjs +67 -0
  1019. package/scripts/commit-verdict.sh +155 -0
  1020. package/scripts/companion-e2e.sh +250 -0
  1021. package/scripts/companion-memory-forward.mjs +1966 -0
  1022. package/scripts/config-fingerprint.sh +28 -0
  1023. package/scripts/deploy-manifest.mjs +141 -0
  1024. package/scripts/deploy.sh +1435 -0
  1025. package/scripts/directory-lock.mjs +193 -0
  1026. package/scripts/heartbeat-fresh.mjs +54 -0
  1027. package/scripts/install-locator.sh +328 -0
  1028. package/scripts/install-wrapper.sh +76 -0
  1029. package/scripts/memory-search-check.mjs +98 -0
  1030. package/scripts/mint-token.sh +212 -0
  1031. package/scripts/openviking-embedder.py +392 -0
  1032. package/scripts/openviking-ov-conf.mjs +161 -0
  1033. package/scripts/openviking-provision.mjs +1122 -0
  1034. package/scripts/openviking-reembed.mjs +1154 -0
  1035. package/scripts/post-review.sh +16 -0
  1036. package/scripts/pr-checks.sh +256 -0
  1037. package/scripts/pr-context.py +174 -0
  1038. package/scripts/pr-context.sh +63 -0
  1039. package/scripts/pr-self.sh +144 -0
  1040. package/scripts/pr-threads.sh +145 -0
  1041. package/scripts/qcr +15 -0
  1042. package/scripts/qcr-host.sh +769 -0
  1043. package/scripts/render-review.sh +24 -0
  1044. package/scripts/reply-thread.sh +16 -0
  1045. package/scripts/required-passes.py +112 -0
  1046. package/scripts/smoke-companion.sh +211 -0
  1047. package/scripts/tui-deploy-runner.mjs +61 -0
  1048. package/scripts/verify-dist.mjs +201 -0
  1049. package/scripts/vm-ghcr-login.sh +188 -0
  1050. package/seeds/agents/pass-baseline.md +61 -0
  1051. package/seeds/agents/pass-contracts.md +30 -0
  1052. package/seeds/agents/pass-data-safety.md +54 -0
  1053. package/seeds/agents/pass-delivery.md +37 -0
  1054. package/seeds/agents/pass-prod-risk.md +24 -0
  1055. package/seeds/agents/pass-security.md +31 -0
  1056. package/seeds/agents/pass-statelessness.md +27 -0
  1057. package/seeds/agents/pass-ui.md +23 -0
  1058. package/seeds/agents/pass-validate.md +50 -0
  1059. package/seeds/prompts/conversation-system.md +117 -0
  1060. package/seeds/prompts/eod-sweep.md +120 -0
  1061. package/seeds/prompts/pass-common.md +52 -0
  1062. package/skills/companion/adjudicate/SKILL.md +247 -0
  1063. package/skills/companion/evidence/SKILL.md +150 -0
  1064. package/skills/companion/land/SKILL.md +200 -0
  1065. package/skills/companion/replay/SKILL.md +138 -0
  1066. package/skills/companion/setup/SKILL.md +167 -0
  1067. package/skills/companion/survey/SKILL.md +160 -0
  1068. package/skills/selfimprove/README.md +34 -0
  1069. package/skills/selfimprove/SKILL.md +127 -0
  1070. package/skills/selfimprove/agents/openai.yaml +2 -0
  1071. package/skills/selfimprove/commands/selfimprove.md +6 -0
  1072. package/skills/selfimprove/references/fix-loop.md +49 -0
  1073. package/skills/selfimprove/references/ledger.md +20 -0
  1074. package/skills/selfimprove/references/setup.md +40 -0
  1075. package/src/anomalies.ts +566 -0
  1076. package/src/answerworker.ts +251 -0
  1077. package/src/appstamp.ts +65 -0
  1078. package/src/archive/admission.ts +3 -0
  1079. package/src/archive/archivedb.ts +548 -0
  1080. package/src/archive/archiver.ts +1963 -0
  1081. package/src/archive/archivewrite.ts +279 -0
  1082. package/src/archive/bundle.ts +333 -0
  1083. package/src/archive/dbmove.ts +911 -0
  1084. package/src/archive/duplicatecounts.ts +98 -0
  1085. package/src/archive/eligibility.ts +181 -0
  1086. package/src/archive/extract.ts +342 -0
  1087. package/src/archive/fsutil.ts +415 -0
  1088. package/src/archive/gzfile.ts +370 -0
  1089. package/src/archive/kinds.ts +21 -0
  1090. package/src/archive/livecheckpoint.ts +217 -0
  1091. package/src/archive/liveretention.ts +180 -0
  1092. package/src/archive/manifest.ts +519 -0
  1093. package/src/archive/overseer.ts +336 -0
  1094. package/src/archive/piglobal.ts +174 -0
  1095. package/src/archive/plan.ts +612 -0
  1096. package/src/archive/prarchive.ts +984 -0
  1097. package/src/archive/prfiles.ts +406 -0
  1098. package/src/archive/report.ts +252 -0
  1099. package/src/archive/restore.ts +330 -0
  1100. package/src/archive/rows.ts +187 -0
  1101. package/src/archive/seal.ts +630 -0
  1102. package/src/archive/status.ts +719 -0
  1103. package/src/archive/storepass.ts +581 -0
  1104. package/src/backfill.ts +362 -0
  1105. package/src/bench/cost.ts +113 -0
  1106. package/src/bench/exec.ts +90 -0
  1107. package/src/bench/values.ts +13 -0
  1108. package/src/botcontrol.ts +176 -0
  1109. package/src/botworker.ts +953 -0
  1110. package/src/capture.ts +321 -0
  1111. package/src/cases.ts +1789 -0
  1112. package/src/channelfs.ts +26 -0
  1113. package/src/checklist.ts +506 -0
  1114. package/src/ciretry.ts +141 -0
  1115. package/src/cli.ts +2271 -0
  1116. package/src/cliops.ts +384 -0
  1117. package/src/clonedir.ts +15 -0
  1118. package/src/commandeffects.ts +57 -0
  1119. package/src/commands.ts +1678 -0
  1120. package/src/companioninbox.ts +239 -0
  1121. package/src/compare.ts +957 -0
  1122. package/src/config.ts +2050 -0
  1123. package/src/configcheck.ts +133 -0
  1124. package/src/coreext.ts +47 -0
  1125. package/src/daemon.ts +1302 -0
  1126. package/src/debuground.ts +927 -0
  1127. package/src/debugroundpi.ts +262 -0
  1128. package/src/diagnostics.ts +14 -0
  1129. package/src/digest.ts +183 -0
  1130. package/src/dispatch.ts +2250 -0
  1131. package/src/engine/answerguard.ts +27 -0
  1132. package/src/engine/botsdk.ts +336 -0
  1133. package/src/engine/caserunner-sdk.ts +423 -0
  1134. package/src/engine/debugpi.ts +235 -0
  1135. package/src/eod.ts +669 -0
  1136. package/src/eodpinwatch.ts +556 -0
  1137. package/src/escalation.ts +1253 -0
  1138. package/src/eventloop.ts +1045 -0
  1139. package/src/execboundary.ts +633 -0
  1140. package/src/feedback.ts +1162 -0
  1141. package/src/findingscheck.ts +298 -0
  1142. package/src/fsdenied.ts +24 -0
  1143. package/src/ghread.ts +242 -0
  1144. package/src/github.ts +1497 -0
  1145. package/src/homes.ts +175 -0
  1146. package/src/hostroute.ts +53 -0
  1147. package/src/improvements.ts +787 -0
  1148. package/src/install.ts +1103 -0
  1149. package/src/installkind.ts +50 -0
  1150. package/src/ipc/capability.ts +333 -0
  1151. package/src/ipc/client.ts +269 -0
  1152. package/src/ipc/control.ts +90 -0
  1153. package/src/ipc/ghreadshim.ts +94 -0
  1154. package/src/ipc/launcher.ts +65 -0
  1155. package/src/ipc/permits.ts +362 -0
  1156. package/src/ipc/postshim.ts +164 -0
  1157. package/src/ipc/protocol.ts +342 -0
  1158. package/src/ipc/server.ts +371 -0
  1159. package/src/ipc/workerspec.ts +218 -0
  1160. package/src/learner/learner.ts +1655 -0
  1161. package/src/learner/miner.ts +1290 -0
  1162. package/src/learner/packet.ts +340 -0
  1163. package/src/learner/receipt.ts +168 -0
  1164. package/src/learner/status.ts +107 -0
  1165. package/src/ledgercheck.ts +157 -0
  1166. package/src/lessonledger.ts +703 -0
  1167. package/src/lessonselect.ts +888 -0
  1168. package/src/lessonshadow.ts +810 -0
  1169. package/src/levers.ts +393 -0
  1170. package/src/live/projection.ts +491 -0
  1171. package/src/live/publish.ts +92 -0
  1172. package/src/live/read.ts +86 -0
  1173. package/src/livecli.ts +336 -0
  1174. package/src/loginhint.ts +56 -0
  1175. package/src/loginrefresh/atomic.ts +76 -0
  1176. package/src/loginrefresh/lock.ts +104 -0
  1177. package/src/loginrefresh/main.ts +59 -0
  1178. package/src/loginrefresh/pirefresh.ts +57 -0
  1179. package/src/loginrefresh/refresher.ts +326 -0
  1180. package/src/loginrefresh/supervisor.ts +273 -0
  1181. package/src/loginrefresh/types.ts +35 -0
  1182. package/src/memory/context.ts +385 -0
  1183. package/src/memory/datafence.ts +9 -0
  1184. package/src/memory/delivery.ts +171 -0
  1185. package/src/memory/eventtags.ts +80 -0
  1186. package/src/memory/health.ts +953 -0
  1187. package/src/memory/import.ts +664 -0
  1188. package/src/memory/layout.ts +261 -0
  1189. package/src/memory/legacy-file.ts +104 -0
  1190. package/src/memory/lessons.ts +447 -0
  1191. package/src/memory/ovsession.ts +601 -0
  1192. package/src/memory/relayout.ts +335 -0
  1193. package/src/memory/roundactivity.ts +209 -0
  1194. package/src/memory/selection.ts +989 -0
  1195. package/src/memory/shadowstatus.ts +125 -0
  1196. package/src/memory/store.ts +275 -0
  1197. package/src/memory/textidentity.ts +8 -0
  1198. package/src/metrics.ts +1056 -0
  1199. package/src/missingconfig.ts +7 -0
  1200. package/src/npmverbs.ts +264 -0
  1201. package/src/onboard/choices.ts +222 -0
  1202. package/src/onboard/engine.ts +518 -0
  1203. package/src/onboard/launch.ts +115 -0
  1204. package/src/onboard/steps/appslug.ts +265 -0
  1205. package/src/onboard/steps/bringup.ts +482 -0
  1206. package/src/onboard/steps/compose.ts +459 -0
  1207. package/src/onboard/steps/configdelivery.ts +58 -0
  1208. package/src/onboard/steps/configfill.ts +1352 -0
  1209. package/src/onboard/steps/deploysh.ts +105 -0
  1210. package/src/onboard/steps/embeddings.ts +550 -0
  1211. package/src/onboard/steps/escalation.ts +640 -0
  1212. package/src/onboard/steps/githubapp.ts +1414 -0
  1213. package/src/onboard/steps/golive.ts +577 -0
  1214. package/src/onboard/steps/index.ts +71 -0
  1215. package/src/onboard/steps/ingress.ts +907 -0
  1216. package/src/onboard/steps/inventory.ts +526 -0
  1217. package/src/onboard/steps/llmauth.ts +1095 -0
  1218. package/src/onboard/steps/memory.ts +1290 -0
  1219. package/src/onboard/steps/memorykeys.ts +85 -0
  1220. package/src/onboard/steps/preflight.ts +191 -0
  1221. package/src/onboard/steps/proof.ts +624 -0
  1222. package/src/onboard/steps/ssh.ts +377 -0
  1223. package/src/onboard/steps/topology.ts +337 -0
  1224. package/src/onboard/steps/transport.ts +665 -0
  1225. package/src/onboard/steps/verifyup.ts +448 -0
  1226. package/src/onboard/steps/vmdeploy.ts +442 -0
  1227. package/src/onboard/toml.ts +50 -0
  1228. package/src/opencli.ts +591 -0
  1229. package/src/openpr.ts +568 -0
  1230. package/src/openviking/client.ts +1131 -0
  1231. package/src/openviking/context.ts +263 -0
  1232. package/src/openviking/embedder.ts +516 -0
  1233. package/src/openviking/gapsink.ts +63 -0
  1234. package/src/openviking/health.ts +83 -0
  1235. package/src/openviking/index.ts +119 -0
  1236. package/src/openviking/lessonfind.ts +92 -0
  1237. package/src/openviking/probe.ts +129 -0
  1238. package/src/openviking/proc.ts +110 -0
  1239. package/src/openviking/provisionreport.ts +160 -0
  1240. package/src/openviking/reembed.ts +412 -0
  1241. package/src/openviking/relayout.ts +177 -0
  1242. package/src/openviking/sidecar-main.ts +38 -0
  1243. package/src/openviking/sidecar.ts +106 -0
  1244. package/src/openviking/store.ts +2025 -0
  1245. package/src/openviking/supervisor.ts +474 -0
  1246. package/src/openviking/types.ts +174 -0
  1247. package/src/operator-recovery.ts +237 -0
  1248. package/src/operatormessage.ts +52 -0
  1249. package/src/outcomes.ts +1670 -0
  1250. package/src/piauthcopy.ts +12 -0
  1251. package/src/picli.ts +49 -0
  1252. package/src/picwd.ts +25 -0
  1253. package/src/pilogin.ts +37 -0
  1254. package/src/pingpong.ts +1339 -0
  1255. package/src/posting-journal.ts +549 -0
  1256. package/src/posting-outbox.ts +802 -0
  1257. package/src/posting-receipt.ts +324 -0
  1258. package/src/posting.ts +603 -0
  1259. package/src/postops.ts +832 -0
  1260. package/src/pr-activity.ts +20 -0
  1261. package/src/pr-author.ts +6 -0
  1262. package/src/pr-conversation.ts +432 -0
  1263. package/src/pr-session-lifecycle.ts +631 -0
  1264. package/src/preflight.ts +391 -0
  1265. package/src/priorresolve.ts +343 -0
  1266. package/src/qcrbin.ts +186 -0
  1267. package/src/recheck.ts +1775 -0
  1268. package/src/reconcile.ts +1030 -0
  1269. package/src/recordedfindings.ts +27 -0
  1270. package/src/regression.ts +833 -0
  1271. package/src/replay.ts +816 -0
  1272. package/src/requiredpasses.ts +148 -0
  1273. package/src/resumecheck.ts +246 -0
  1274. package/src/reviewcli.ts +787 -0
  1275. package/src/reviewcontext.ts +35 -0
  1276. package/src/reviewdetach.ts +734 -0
  1277. package/src/reviewhistory.ts +427 -0
  1278. package/src/reviewhome.ts +36 -0
  1279. package/src/reviewmemory.ts +133 -0
  1280. package/src/reviewrendercli.ts +139 -0
  1281. package/src/round-work.ts +42 -0
  1282. package/src/runhost.ts +108 -0
  1283. package/src/scanauth.ts +36 -0
  1284. package/src/scanbox.ts +1081 -0
  1285. package/src/scancli.ts +1296 -0
  1286. package/src/scandriverlog.ts +32 -0
  1287. package/src/session-bridge.ts +139 -0
  1288. package/src/session-command-payload.ts +35 -0
  1289. package/src/session-command-supervisor.ts +1142 -0
  1290. package/src/sessionjsonl.ts +88 -0
  1291. package/src/sessions.ts +659 -0
  1292. package/src/setup/adapters.ts +335 -0
  1293. package/src/setup/baselines.ts +110 -0
  1294. package/src/setup/caserunner.ts +611 -0
  1295. package/src/setup/configcommit.ts +443 -0
  1296. package/src/setup/engine.ts +1001 -0
  1297. package/src/setup/facts.ts +627 -0
  1298. package/src/setup/findings.ts +1264 -0
  1299. package/src/setup/history.ts +443 -0
  1300. package/src/setup/interview.ts +243 -0
  1301. package/src/setup/ledger.ts +324 -0
  1302. package/src/setup/pins.ts +66 -0
  1303. package/src/setup/portrait.ts +635 -0
  1304. package/src/setup/presentation.ts +18 -0
  1305. package/src/setup/profile.ts +508 -0
  1306. package/src/setup/replay.ts +370 -0
  1307. package/src/setup/replaybuild.ts +392 -0
  1308. package/src/setup/replayrun.ts +1096 -0
  1309. package/src/setup/replaysource.ts +198 -0
  1310. package/src/setup/retune.ts +415 -0
  1311. package/src/setup/retunelog.ts +95 -0
  1312. package/src/setup/scan.ts +1033 -0
  1313. package/src/setup/scanbuild.ts +168 -0
  1314. package/src/setup/scanfacts.ts +107 -0
  1315. package/src/setup/scanlease.ts +297 -0
  1316. package/src/setup/scanreport.ts +373 -0
  1317. package/src/setup/scanrun.ts +2268 -0
  1318. package/src/setup/scantree.ts +259 -0
  1319. package/src/setup/stage2.ts +926 -0
  1320. package/src/setup/stage2request.ts +347 -0
  1321. package/src/setup/survey.ts +458 -0
  1322. package/src/setup/surveyrun.ts +758 -0
  1323. package/src/setup/textsniff.ts +95 -0
  1324. package/src/setup/trackersink.ts +433 -0
  1325. package/src/setup/triage.ts +768 -0
  1326. package/src/setup/tuning.ts +766 -0
  1327. package/src/setup/unitcut.ts +523 -0
  1328. package/src/singleflight.ts +86 -0
  1329. package/src/slack/announce.ts +911 -0
  1330. package/src/slack/api.ts +303 -0
  1331. package/src/slack/messages.ts +288 -0
  1332. package/src/slack/origin.ts +599 -0
  1333. package/src/slack/policy.ts +354 -0
  1334. package/src/slack/reply.ts +201 -0
  1335. package/src/slack/router.ts +285 -0
  1336. package/src/slack/socket.ts +384 -0
  1337. package/src/slack/types.ts +108 -0
  1338. package/src/sqlitehint.ts +32 -0
  1339. package/src/ssh-observation.ts +30 -0
  1340. package/src/state.ts +8243 -0
  1341. package/src/statemachine.ts +369 -0
  1342. package/src/stubs.ts +68 -0
  1343. package/src/takeover.ts +634 -0
  1344. package/src/takeoverpi.ts +293 -0
  1345. package/src/terminal-failure.ts +41 -0
  1346. package/src/thread-resolution-refusal.ts +2 -0
  1347. package/src/tmux.ts +153 -0
  1348. package/src/trackerid.ts +41 -0
  1349. package/src/transcriptindex.ts +665 -0
  1350. package/src/tui/actions.ts +484 -0
  1351. package/src/tui/alerts.ts +666 -0
  1352. package/src/tui/app.ts +1979 -0
  1353. package/src/tui/archiveops.ts +192 -0
  1354. package/src/tui/autofile.ts +233 -0
  1355. package/src/tui/board.ts +1432 -0
  1356. package/src/tui/candidates.ts +889 -0
  1357. package/src/tui/cellwidth.ts +148 -0
  1358. package/src/tui/changelog-store.ts +503 -0
  1359. package/src/tui/chord.ts +25 -0
  1360. package/src/tui/clipboard.ts +92 -0
  1361. package/src/tui/cmdbar.ts +296 -0
  1362. package/src/tui/companion.ts +1427 -0
  1363. package/src/tui/companionplan.ts +247 -0
  1364. package/src/tui/companiontab.ts +83 -0
  1365. package/src/tui/confighome.ts +155 -0
  1366. package/src/tui/connect.ts +68 -0
  1367. package/src/tui/deploy-ceremony.ts +104 -0
  1368. package/src/tui/deploy-drain.ts +129 -0
  1369. package/src/tui/deploy-process.ts +265 -0
  1370. package/src/tui/deploytab.ts +1523 -0
  1371. package/src/tui/design.ts +125 -0
  1372. package/src/tui/digesttab.ts +214 -0
  1373. package/src/tui/emptystate.ts +39 -0
  1374. package/src/tui/evidence.ts +999 -0
  1375. package/src/tui/feed.ts +604 -0
  1376. package/src/tui/feedbacktab.ts +1077 -0
  1377. package/src/tui/filters.ts +90 -0
  1378. package/src/tui/ghread.ts +321 -0
  1379. package/src/tui/historypull.ts +81 -0
  1380. package/src/tui/inboxpull.ts +236 -0
  1381. package/src/tui/index.ts +1565 -0
  1382. package/src/tui/issuesink.ts +238 -0
  1383. package/src/tui/jsonfile.ts +42 -0
  1384. package/src/tui/keys.ts +109 -0
  1385. package/src/tui/layout.ts +108 -0
  1386. package/src/tui/learning.ts +627 -0
  1387. package/src/tui/lessonswitch.ts +118 -0
  1388. package/src/tui/livecontrol.ts +228 -0
  1389. package/src/tui/memforward.ts +443 -0
  1390. package/src/tui/memincident.ts +363 -0
  1391. package/src/tui/memory.ts +620 -0
  1392. package/src/tui/memtab.ts +606 -0
  1393. package/src/tui/metricstab.ts +1177 -0
  1394. package/src/tui/model.ts +131 -0
  1395. package/src/tui/mouse.ts +98 -0
  1396. package/src/tui/msg.ts +268 -0
  1397. package/src/tui/nativecompanion.ts +417 -0
  1398. package/src/tui/openurl.ts +21 -0
  1399. package/src/tui/paint.ts +511 -0
  1400. package/src/tui/panes.ts +98 -0
  1401. package/src/tui/pipane.ts +219 -0
  1402. package/src/tui/poll-hooks.ts +12 -0
  1403. package/src/tui/poll.ts +147 -0
  1404. package/src/tui/proposals.ts +838 -0
  1405. package/src/tui/prpause.ts +150 -0
  1406. package/src/tui/reload.ts +436 -0
  1407. package/src/tui/remote.ts +413 -0
  1408. package/src/tui/rollover.ts +969 -0
  1409. package/src/tui/scantab.ts +1290 -0
  1410. package/src/tui/setupentry.ts +93 -0
  1411. package/src/tui/sidebar.ts +749 -0
  1412. package/src/tui/sshtriage.ts +510 -0
  1413. package/src/tui/startup.ts +231 -0
  1414. package/src/tui/tabs.ts +45 -0
  1415. package/src/tui/termmirror.ts +224 -0
  1416. package/src/tui/theme.ts +95 -0
  1417. package/src/tui/ticketstab.ts +310 -0
  1418. package/src/tui/tmuxsocket.ts +129 -0
  1419. package/src/tui/trackertickets.ts +84 -0
  1420. package/src/tui/unwedge.ts +286 -0
  1421. package/src/tui/viewer.ts +575 -0
  1422. package/src/tui/viewerinput.ts +173 -0
  1423. package/src/updatenotice.ts +178 -0
  1424. package/src/usage.ts +1154 -0
  1425. package/src/verdicts.ts +4689 -0
  1426. package/src/version.ts +80 -0
  1427. package/src/wakes.ts +476 -0
  1428. package/src/webhook.ts +942 -0
  1429. package/src/webhookheal.ts +276 -0
  1430. package/src/wire.ts +2153 -0
  1431. package/src/worker-session-host.ts +602 -0
  1432. package/src/workerbreaker.ts +156 -0
  1433. package/src/workercontrol.ts +104 -0
  1434. package/src/workerlease.ts +441 -0
  1435. package/src/workerliveness.ts +103 -0
  1436. package/src/workerlog.ts +79 -0
  1437. package/src/workerruntime.ts +30 -0
  1438. package/src/workersupervisor.ts +1538 -0
  1439. package/src/workerusage.ts +42 -0
  1440. package/src/workerworld.ts +427 -0
  1441. package/src/worktrees.ts +1138 -0
  1442. package/tests/fixtures/regression-cases.json +795 -0
  1443. package/tests/fixtures/seed-manifest.json +19 -0
@@ -0,0 +1,1154 @@
1
+ #!/usr/bin/env node
2
+ // OpenViking embedder migration — the re-embed path that lets an existing
3
+ // store move to a different embedder.
4
+ //
5
+ // Why this exists
6
+ // ---------------
7
+ // The shipped default is the local ENGLISH embedder, bge-small-en-v1.5-f16 at
8
+ // 384 dims, served on loopback by scripts/openviking-embedder.py and reached
9
+ // through the engine's OpenAI-compatible client (provider "openai", a loopback
10
+ // `api_base`), so nothing but the model call leaves the machine. A store may
11
+ // have been embedded under another embedder (a hosted model such as
12
+ // text-embedding-3-small at 1536 dims, or the server's built-in
13
+ // bge-small-zh-v1.5-f16 at 512 dims). Every embedder change is the same
14
+ // migration: a store embedded under the old embedder holds vectors the new one
15
+ // cannot read — and OpenViking 0.4.15 REFUSES TO START on such a store:
16
+ //
17
+ // EmbeddingRebuildRequiredError: Existing collection embedding dimension
18
+ // (1536) does not match current configuration (512). Vectors are
19
+ // incompatible; rebuild is required.
20
+ //
21
+ // (verified against a running 0.4.15 on a throwaway copy). There
22
+ // is no server-side rebuild: the vector collection has to be RESET while the
23
+ // server is down, and the vectors rebuilt afterwards through the maintenance
24
+ // API `POST /api/v1/content/reindex` (mode `vectors_only`, non-destructive,
25
+ // idempotent upsert — verified: a second run rebuilds the same records and
26
+ // changes nothing).
27
+ //
28
+ // THE TWO HALVES, AND WHO RUNS EACH
29
+ // ---------------------------------
30
+ // prepare DISK, server DOWN. The container entrypoint runs it right after
31
+ // rendering ov.conf and BEFORE boot provisioning starts a server.
32
+ // It reads the collection's own embedding metadata
33
+ // (`vectordb/<name>/collection_meta.json`, the same record the
34
+ // server checks) and, when it names a different embedder than
35
+ // ov.conf, writes the journal `reembed.json` beside ov.conf and
36
+ // only then MOVES the collection aside (never deletes — the old
37
+ // vectors stay on disk for a rollback), so no interruption can
38
+ // leave a moved collection with no rebuild on record. The journal
39
+ // names the namespace THIS host re-embeds
40
+ // (`--user`, the reviewer) as `pending`, every other provisioned
41
+ // namespace as `operator` — its key holder's to re-embed, from
42
+ // wherever that key lives. On a matching store it is a no-op and
43
+ // exits in milliseconds, every boot.
44
+ // resume HTTP, server UP. The daemon runs it once `/ready` passes (from
45
+ // src/openviking/reembed.ts), against the supervised server, with
46
+ // the REVIEWER user key — the server confines a USER key to its own
47
+ // namespace, so this re-embeds `viking://user/reviewer` and nothing
48
+ // else, and it needs no root or admin key anywhere. Resumable: the
49
+ // journal marks the namespace pending until a run completes with
50
+ // zero failed records; a daemon restart mid-run simply runs it
51
+ // again, and the reindex is an upsert.
52
+ // status what the journal says — the heartbeat's `openviking.reembed`.
53
+ // settle the operator's receipt for an `operator` namespace: after
54
+ // `qcr memory reembed` has rebuilt it from the PC, this marks the
55
+ // row completed so the journal (and the heartbeat) stop naming it.
56
+ // rehearse prepare + a temporary server + resume + stop, in one command,
57
+ // for proving the migration on a COPY of a store before it touches
58
+ // a live one (docs/memory-embeddings.md has the recipe).
59
+ //
60
+ // WHAT IT NEVER DOES: read a namespace it holds no key for (the companion's
61
+ // memory is re-embedded by the companion key's holder, from the operator's PC
62
+ // — `qcr memory reembed`), touch any file under `viking/` (the memory TEXT is
63
+ // never rewritten; only vectors are rebuilt), delete the old collection, or
64
+ // block a boot: `prepare` is milliseconds and `resume` runs behind the daemon.
65
+ //
66
+ // MEMORY NEVER BLOCKS THE BOOT. Every failure here is a log line and exit 0;
67
+ // `--strict` (tests, manual runs, `rehearse`) is the only way to a non-zero
68
+ // exit. Zero dependencies and plain JS on purpose: the entrypoint runs it
69
+ // before the TypeScript build, on a container that may have no `dist/` yet.
70
+ import { spawn } from "node:child_process";
71
+ import { randomUUID } from "node:crypto";
72
+ import { tryDirectoryLock } from "./directory-lock.mjs";
73
+ import {
74
+ closeSync,
75
+ existsSync,
76
+ fsyncSync,
77
+ mkdirSync,
78
+ openSync,
79
+ readFileSync,
80
+ realpathSync,
81
+ renameSync,
82
+ unlinkSync,
83
+ writeFileSync,
84
+ } from "node:fs";
85
+ import { dirname, join } from "node:path";
86
+ import { pathToFileURL } from "node:url";
87
+
88
+ import {
89
+ embedderSpecFromFlags,
90
+ parseUserList,
91
+ readSecret,
92
+ serverArgv,
93
+ startEmbedder,
94
+ stopServerChild,
95
+ waitForReady,
96
+ } from "./openviking-provision.mjs";
97
+
98
+ /** The journal, beside ov.conf under the OpenViking home. */
99
+ export const JOURNAL_FILE = "reembed.json";
100
+ export const JOURNAL_VERSION = 1;
101
+
102
+ /** The server's local vector project + collection meta file
103
+ * (`LocalCollectionAdapter.DEFAULT_LOCAL_PROJECT_NAME` and the persistent
104
+ * collection's `collection_meta.json`, OpenViking 0.4.15). */
105
+ export const VECTORDB_DIR = "vectordb";
106
+ export const COLLECTION_META = "collection_meta.json";
107
+ /** `storage.vectordb.name` when ov.conf names none. */
108
+ export const DEFAULT_COLLECTION = "context";
109
+ /** The separator the server puts between a collection's description and its
110
+ * embedding metadata JSON (`EMBEDDING_META_MARKER`, collection_schemas.py). */
111
+ export const META_MARKER = "\n\n[openviking.embedding]\n";
112
+
113
+ /** The server's BUILT-IN local dense embedder — the only local model 0.4.15
114
+ * ships a spec for, and what the server runs when ov.conf names no embedder at
115
+ * all. A store built before the local English embedder may carry it;
116
+ * `configuredEmbedder` answers it for an ov.conf without an `embedding`
117
+ * section, because that is what such a server really runs. */
118
+ export const SERVER_DEFAULT_EMBEDDER = Object.freeze({
119
+ provider: "local",
120
+ model: "bge-small-zh-v1.5-f16",
121
+ dimension: 512,
122
+ });
123
+
124
+ /** The local ENGLISH embedder as the engine records it — the
125
+ * engine's OpenAI-compatible provider pointed at the loopback service. The
126
+ * record the shipped default writes into a collection. Mirrors
127
+ * `LOCAL_EMBEDDING` in src/config.ts (tests/openviking-reembed.test.ts). */
128
+ export const LOCAL_EMBEDDER = Object.freeze({
129
+ provider: "openai",
130
+ model: "bge-small-en-v1.5-f16",
131
+ dimension: 384,
132
+ });
133
+
134
+ export const DEFAULTS = {
135
+ base: "http://127.0.0.1:1933",
136
+ user: "reviewer",
137
+ requestTimeoutMs: 10_000,
138
+ /** A namespace reindex is one queued task; polling it is cheap. */
139
+ pollMs: 2_000,
140
+ /** How long one resume run waits for the server's task before giving the
141
+ * namespace back to "pending" for the next run. */
142
+ deadlineMs: 30 * 60_000,
143
+ readyTimeoutMs: 120_000,
144
+ };
145
+
146
+ // ---- the embedder record -------------------------------------------------------
147
+
148
+ // The shapes below are JSDoc-typed so `allowJs` callers (src/openviking/
149
+ // reembed.ts declares the same contract structurally; the tests drive this
150
+ // real module through it) see the literal unions rather than `string`.
151
+ /** @typedef {{ provider: string, model: string, dimension: number }} Embedder */
152
+ /** @typedef {"pending" | "failed" | "completed" | "operator"} NamespaceState */
153
+ /** @typedef {{ state: NamespaceState, at?: string, attempts?: number, detail?: string, task_id?: string, scanned_records?: number, rebuilt_records?: number, failed_records?: number, unsupported_records?: number, settled_by?: string }} NamespaceRow */
154
+ /** @typedef {{ state: "none" | "pending" | "failed" | "completed" | "unreadable", embedder?: Embedder, previous?: Embedder | null, reset_at?: string, moved_to?: string, awaiting_operator?: string[], namespaces?: Record<string, NamespaceRow> }} JournalStatus */
155
+ /** @typedef {{ scanned_records: number, rebuilt_records: number, failed_records: number, unsupported_records: number }} ReindexCounts */
156
+ /** @typedef {{ uri: string, detail?: string, task_id?: string } & (({ status: "completed" } & ReindexCounts) | ({ status: "failed" | "busy" | "timeout" } & Partial<ReindexCounts>))} ReindexResult */
157
+ /** @typedef {(line: string) => void} Log */
158
+ /** @typedef {(url: string, init?: { method?: string, headers?: Record<string, string>, body?: string, signal?: AbortSignal }) => Promise<{ status: number, json?: () => Promise<unknown> }>} OvFetch */
159
+
160
+ /** The embedder ov.conf configures, WITHOUT its credential: provider, model
161
+ * and dimension — the three keys of the server's own compatibility check that
162
+ * this script can state with certainty (the fourth, `model_identity`, is
163
+ * derived from these and never differs when they agree). Spelled exactly as
164
+ * the SERVER spells them, because that is what it writes into a collection:
165
+ * the local English embedder is `openai/<model>` (its wire provider), and the
166
+ * loopback `api_base` that tells it apart from a hosted model is deliberately
167
+ * not part of the record. An ov.conf with no `embedding` section runs the
168
+ * server's built-in local embedder. */
169
+ export function configuredEmbedder(conf) {
170
+ const dense = conf?.embedding?.dense;
171
+ if (!dense || typeof dense !== "object") return { ...SERVER_DEFAULT_EMBEDDER };
172
+ const provider = String(dense.provider ?? "")
173
+ .trim()
174
+ .toLowerCase();
175
+ if (provider === "" || provider === "local") {
176
+ return {
177
+ provider: "local",
178
+ model: String(dense.model ?? SERVER_DEFAULT_EMBEDDER.model),
179
+ dimension: Number(dense.dimension ?? SERVER_DEFAULT_EMBEDDER.dimension),
180
+ };
181
+ }
182
+ return { provider, model: String(dense.model ?? ""), dimension: Number(dense.dimension) };
183
+ }
184
+
185
+ /** The embedder a persisted collection was built under, read out of
186
+ * `collection_meta.json`'s description. `null` when the file carries none
187
+ * (a collection from an older server) or cannot be parsed — the caller treats
188
+ * both as "unknown", never as "compatible". */
189
+ export function storedEmbedder(metaText) {
190
+ let meta;
191
+ try {
192
+ meta = JSON.parse(metaText);
193
+ } catch {
194
+ return null;
195
+ }
196
+ const description = typeof meta?.Description === "string" ? meta.Description : "";
197
+ const at = description.indexOf(META_MARKER);
198
+ if (at < 0) return null;
199
+ try {
200
+ const payload = JSON.parse(description.slice(at + META_MARKER.length).trim());
201
+ if (!payload || typeof payload !== "object") return null;
202
+ return {
203
+ provider: String(payload.provider ?? "").toLowerCase(),
204
+ model: String(payload.model ?? ""),
205
+ dimension: Number(payload.dimension),
206
+ model_identity: typeof payload.model_identity === "string" ? payload.model_identity : "",
207
+ };
208
+ } catch {
209
+ return null;
210
+ }
211
+ }
212
+
213
+ export function sameEmbedder(a, b) {
214
+ return (
215
+ !!a &&
216
+ !!b &&
217
+ a.provider === b.provider &&
218
+ a.model === b.model &&
219
+ Number(a.dimension) === Number(b.dimension)
220
+ );
221
+ }
222
+
223
+ /** `<home>/workspace` unless ov.conf says otherwise (it never does here). */
224
+ export function workspaceOf(home, conf) {
225
+ const ws = conf?.storage?.workspace;
226
+ return typeof ws === "string" && ws.trim() !== "" ? ws : join(home, "workspace");
227
+ }
228
+
229
+ export function collectionDirOf(workspace, conf) {
230
+ const name = conf?.storage?.vectordb?.name;
231
+ return join(
232
+ workspace,
233
+ VECTORDB_DIR,
234
+ typeof name === "string" && name.trim() !== "" ? name : DEFAULT_COLLECTION,
235
+ );
236
+ }
237
+
238
+ // ---- the journal ----------------------------------------------------------------
239
+
240
+ export function journalPath(home) {
241
+ return join(home, JOURNAL_FILE);
242
+ }
243
+
244
+ /** `{ journal, unreadable }`: absent ⇒ `{null, false}`; present but not
245
+ * parseable ⇒ `{null, true}` — "could not read" is never "nothing there". */
246
+ export function readJournal(home) {
247
+ const path = journalPath(home);
248
+ if (!existsSync(path)) return { journal: null, unreadable: false };
249
+ try {
250
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
251
+ if (!parsed || typeof parsed !== "object" || typeof parsed.namespaces !== "object")
252
+ return { journal: null, unreadable: true };
253
+ return { journal: parsed, unreadable: false };
254
+ } catch {
255
+ return { journal: null, unreadable: true };
256
+ }
257
+ }
258
+
259
+ function writeJournalUnlocked(home, journal) {
260
+ const path = journalPath(home);
261
+ mkdirSync(dirname(path), { recursive: true });
262
+ const tmp = `${path}.tmp-${process.pid}-${randomUUID()}`;
263
+ let fd;
264
+ try {
265
+ fd = openSync(tmp, "wx", 0o600);
266
+ writeFileSync(fd, `${JSON.stringify(journal, null, 2)}\n`);
267
+ fsyncSync(fd);
268
+ closeSync(fd);
269
+ fd = undefined;
270
+ renameSync(tmp, path);
271
+ const directory = openSync(dirname(path), "r");
272
+ try {
273
+ fsyncSync(directory);
274
+ } finally {
275
+ closeSync(directory);
276
+ }
277
+ } finally {
278
+ if (fd !== undefined) closeSync(fd);
279
+ try {
280
+ unlinkSync(tmp);
281
+ } catch {
282
+ /* The renamed temp no longer exists. */
283
+ }
284
+ }
285
+ }
286
+
287
+ /** @template T @param {string} home @param {() => T} run @returns {T} */
288
+ function withJournalLock(home, run) {
289
+ const lease = tryDirectoryLock(home);
290
+ if (!lease.ok) throw new Error(lease.detail);
291
+ try {
292
+ return run();
293
+ } finally {
294
+ lease.release();
295
+ }
296
+ }
297
+
298
+ /** Explicit journal replacement participates in the same writer protocol. */
299
+ export function writeJournal(home, journal) {
300
+ withJournalLock(home, () => writeJournalUnlocked(home, journal));
301
+ }
302
+
303
+ /**
304
+ * The heartbeat's view of the migration. No secrets, no throws.
305
+ *
306
+ * A namespace row is one of `pending` / `failed` / `completed` (this host's
307
+ * own namespace, driven by `resume`) or `operator` (a namespace whose key this
308
+ * host does not hold — re-embedded from wherever that key lives and receipted
309
+ * here with `settle`). The overall `state` is about what THIS host can do:
310
+ *
311
+ * none no migration on record — the store matches its embedder
312
+ * pending the collection was reset and this host's namespace is not
313
+ * re-embedded yet
314
+ * failed the last resume attempt failed (it will be retried; the
315
+ * counts say how far it got)
316
+ * completed this host's namespace is re-embedded
317
+ * unreadable a journal exists and cannot be parsed — unknown, not "none"
318
+ *
319
+ * `awaiting_operator` lists the `operator` rows still open, so a completed
320
+ * state never hides a namespace nobody has rebuilt yet.
321
+ */
322
+ /** @returns {JournalStatus} */
323
+ export function journalStatus(home) {
324
+ const { journal, unreadable } = readJournal(home);
325
+ if (unreadable) return { state: "unreadable" };
326
+ if (!journal) return { state: "none" };
327
+ const namespaces = journal.namespaces ?? {};
328
+ const own = Object.values(namespaces)
329
+ .filter((n) => n?.state !== "operator")
330
+ .map((n) => n?.state);
331
+ const state = own.some((s) => s === "failed")
332
+ ? "failed"
333
+ : own.some((s) => s !== "completed")
334
+ ? "pending"
335
+ : "completed";
336
+ return {
337
+ state,
338
+ embedder: journal.embedder,
339
+ previous: journal.previous ?? null,
340
+ reset_at: journal.reset_at,
341
+ moved_to: journal.moved_to,
342
+ awaiting_operator: Object.entries(namespaces)
343
+ .filter(([, n]) => n?.state === "operator")
344
+ .map(([user]) => user),
345
+ namespaces,
346
+ };
347
+ }
348
+
349
+ /**
350
+ * The operator's receipt for an `operator` namespace (or a stuck own one, by
351
+ * their explicit word): mark it completed. Refuses — as an answer, never a
352
+ * throw — when there is no journal, no such row, or the row is already
353
+ * completed, so a typo cannot mint a receipt for nothing.
354
+ */
355
+ function settleUnlocked({ home, user, detail = "", now = () => new Date() }) {
356
+ const { journal, unreadable } = readJournal(home);
357
+ if (unreadable) return { ok: false, detail: `${journalPath(home)} cannot be parsed` };
358
+ const ns = journal?.namespaces?.[user];
359
+ if (!journal || !ns) return { ok: false, detail: `no re-embed on record for ${user}` };
360
+ if (ns.state === "completed")
361
+ return { ok: false, detail: `${user} is already completed (${ns.at ?? "?"})` };
362
+ const entry = {
363
+ ...ns,
364
+ state: "completed",
365
+ at: now().toISOString(),
366
+ settled_by: "operator",
367
+ detail: detail || `settled by the operator (was ${ns.state})`,
368
+ };
369
+ writeJournalUnlocked(home, { ...journal, namespaces: { ...journal.namespaces, [user]: entry } });
370
+ return { ok: true, detail: entry.detail, entry };
371
+ }
372
+
373
+ /** @param {{home: string, user: string, detail?: string, now?: () => Date}} opts */
374
+ export function settle(opts) {
375
+ try {
376
+ return withJournalLock(opts.home, () => settleUnlocked(opts));
377
+ } catch (err) {
378
+ return { ok: false, detail: err instanceof Error ? err.message : String(err) };
379
+ }
380
+ }
381
+
382
+ // ---- prepare (disk half) -----------------------------------------------------------
383
+
384
+ /**
385
+ * What `prepare` should do — pure, so the decision is unit-tested apart from
386
+ * the filesystem.
387
+ *
388
+ * none the collection matches ov.conf (or does not exist yet — the server
389
+ * creates one for the configured embedder), nothing to reset
390
+ * reset the collection was built under a different embedder: move it aside
391
+ * refuse cannot decide safely: the meta is unreadable, or a reset for THIS
392
+ * embedder already happened and the collection still disagrees
393
+ * (another server wrote it since) — resetting again would loop
394
+ *
395
+ * The journal is written BEFORE the collection is moved, so a journal whose
396
+ * reset names a `moved_to` that does not exist (`movedAsidePresent` false)
397
+ * records a reset interrupted before its move: that collection is still the
398
+ * old one, and the reset is finished rather than refused.
399
+ */
400
+ /** @param {{ stored: (Embedder & { model_identity?: string }) | null, metaPresent: boolean, expected: Embedder, journal: any, movedAsidePresent?: boolean }} args */
401
+ export function planPrepare({ stored, metaPresent, expected, journal, movedAsidePresent }) {
402
+ if (!metaPresent)
403
+ return {
404
+ action: "none",
405
+ reason: "no vector collection yet — the server creates one for the configured embedder",
406
+ };
407
+ if (stored === null)
408
+ return {
409
+ action: "refuse",
410
+ reason: `${COLLECTION_META} carries no readable embedding metadata — not touching the collection`,
411
+ };
412
+ if (sameEmbedder(stored, expected))
413
+ return { action: "none", reason: `the collection already matches ${describe(expected)}` };
414
+ if (journal && sameEmbedder(journal.embedder, expected) && journal.reset_at) {
415
+ if (typeof journal.moved_to === "string" && movedAsidePresent === false)
416
+ return {
417
+ action: "reset",
418
+ reason: `a reset for ${describe(expected)} was journalled at ${journal.reset_at} but the collection was never moved aside — finishing it: the collection still reports ${describe(stored)}`,
419
+ };
420
+ return {
421
+ action: "refuse",
422
+ reason: `the collection was already reset for ${describe(expected)} at ${journal.reset_at} and still reports ${describe(stored)} — a server with a different ov.conf wrote it since; not resetting again`,
423
+ };
424
+ }
425
+ return {
426
+ action: "reset",
427
+ reason: `the collection was built under ${describe(stored)}, ov.conf configures ${describe(expected)} — the vectors are incompatible`,
428
+ };
429
+ }
430
+
431
+ export function describe(e) {
432
+ return e ? `${e.provider}/${e.model} (${e.dimension} dims)` : "unknown";
433
+ }
434
+
435
+ /** `20260902T153000Z` — the suffix of a moved-aside collection. */
436
+ export function stamp(now = new Date()) {
437
+ return now
438
+ .toISOString()
439
+ .replace(/[-:]/g, "")
440
+ .replace(/\.\d{3}Z$/, "Z");
441
+ }
442
+
443
+ /**
444
+ * Is a server serving this ov.conf's port right now? `prepare` must never move
445
+ * a collection out from under a running server. The port, not the PID file:
446
+ * `.openviking.pid` names a pid from the PREVIOUS container's namespace and is
447
+ * meaningless after a restart, whereas the port is loopback in the same
448
+ * namespace as whoever runs this script.
449
+ */
450
+ export async function serverIsUp({
451
+ base,
452
+ fetchFn = /** @type {OvFetch} */ (fetch),
453
+ timeoutMs = 1_500,
454
+ }) {
455
+ try {
456
+ const res = await fetchFn(`${base}/health`, {
457
+ method: "GET",
458
+ headers: {},
459
+ signal: AbortSignal.timeout(timeoutMs),
460
+ });
461
+ return res.status >= 200 && res.status < 500;
462
+ } catch {
463
+ return false;
464
+ }
465
+ }
466
+
467
+ /**
468
+ * The disk half. Returns a report and NEVER throws; the only side effects are
469
+ * the journal write and ONE rename (the collection directory, aside), both
470
+ * only on `action: "reset"`, in that order: the rebuild obligation is durable
471
+ * before the collection leaves, and a failed move puts the journal back as it
472
+ * was.
473
+ */
474
+ async function prepareUnlocked({
475
+ home,
476
+ conf,
477
+ users,
478
+ own = DEFAULTS.user,
479
+ base,
480
+ fetchFn = /** @type {OvFetch} */ (fetch),
481
+ now = () => new Date(),
482
+ log = /** @type {Log} */ (() => {}),
483
+ }) {
484
+ const expected = configuredEmbedder(conf);
485
+ const workspace = workspaceOf(home, conf);
486
+ const collectionDir = collectionDirOf(workspace, conf);
487
+ const metaPath = join(collectionDir, COLLECTION_META);
488
+ const { journal, unreadable } = readJournal(home);
489
+ if (unreadable) {
490
+ const reason = `${journalPath(home)} exists and cannot be parsed — not touching the collection until an operator reads it`;
491
+ log(`openviking: reembed prepare REFUSED — ${reason}`);
492
+ return { action: "refuse", reason, expected, collectionDir };
493
+ }
494
+ const metaPresent = existsSync(metaPath);
495
+ let stored = null;
496
+ if (metaPresent) {
497
+ try {
498
+ stored = storedEmbedder(readFileSync(metaPath, "utf8"));
499
+ } catch {
500
+ stored = null;
501
+ }
502
+ }
503
+ const movedAsidePresent =
504
+ journal && typeof journal.moved_to === "string" ? existsSync(journal.moved_to) : undefined;
505
+ const plan = planPrepare({ stored, metaPresent, expected, journal, movedAsidePresent });
506
+ if (plan.action !== "reset") {
507
+ log(`openviking: reembed prepare — ${plan.action}: ${plan.reason}`);
508
+ return { ...plan, expected, stored, collectionDir };
509
+ }
510
+ if (await serverIsUp({ base, fetchFn })) {
511
+ const reason = `a server is answering on ${base} — stop it before resetting the vector collection`;
512
+ log(`openviking: reembed prepare REFUSED — ${reason}`);
513
+ return { action: "refuse", reason, expected, stored, collectionDir };
514
+ }
515
+ const at = now();
516
+ const movedTo = `${collectionDir}.pre-reembed-${stamp(at)}`;
517
+ // This host re-embeds ONLY the namespace whose key it holds; every other
518
+ // provisioned namespace is journalled for its key holder to rebuild (the
519
+ // server confines a user key to its own tree — a 403 otherwise, verified).
520
+ const namespaces = {};
521
+ for (const user of new Set([own, ...users]))
522
+ namespaces[user] = { state: user === own ? "pending" : "operator" };
523
+ const next = {
524
+ version: JOURNAL_VERSION,
525
+ embedder: expected,
526
+ previous: stored,
527
+ reset_at: at.toISOString(),
528
+ moved_to: movedTo,
529
+ namespaces,
530
+ };
531
+ try {
532
+ writeJournalUnlocked(home, next);
533
+ } catch (err) {
534
+ const reason = `could not write ${journalPath(home)}: ${err instanceof Error ? err.message : String(err)} — the collection stays where it is`;
535
+ log(`openviking: reembed prepare FAILED — ${reason}`);
536
+ return { action: "refuse", reason, expected, stored, collectionDir };
537
+ }
538
+ try {
539
+ renameSync(collectionDir, movedTo);
540
+ } catch (err) {
541
+ const reason = `could not move ${collectionDir} aside: ${err instanceof Error ? err.message : String(err)}`;
542
+ log(`openviking: reembed prepare FAILED — ${reason}`);
543
+ restoreJournal(home, journal, log);
544
+ return { action: "refuse", reason, expected, stored, collectionDir };
545
+ }
546
+ const operators = Object.keys(namespaces).filter((u) => u !== own);
547
+ log(
548
+ `openviking: reembed prepare — RESET: ${plan.reason}. The old collection is kept at ${movedTo}; ` +
549
+ `${own} memory is re-embedded by the daemon once the server is ready` +
550
+ (operators.length
551
+ ? `; ${operators.join(", ")} by its key's holder (qcr memory reembed, then settle — docs/memory-embeddings.md)`
552
+ : ""),
553
+ );
554
+ return {
555
+ action: "reset",
556
+ reason: plan.reason,
557
+ expected,
558
+ stored,
559
+ collectionDir,
560
+ movedTo,
561
+ journal: next,
562
+ };
563
+ }
564
+
565
+ /** @param {{home: string, conf: Record<string, any>, users: string[], own?: string, base: string, fetchFn?: OvFetch, now?: () => Date, log?: Log}} opts */
566
+ export async function prepare(opts) {
567
+ const lease = tryDirectoryLock(opts.home);
568
+ if (!lease.ok)
569
+ return {
570
+ action: "refuse",
571
+ reason: lease.detail,
572
+ expected: configuredEmbedder(opts.conf),
573
+ collectionDir: collectionDirOf(workspaceOf(opts.home, opts.conf), opts.conf),
574
+ movedTo: undefined,
575
+ journal: undefined,
576
+ stored: undefined,
577
+ };
578
+ try {
579
+ return await prepareUnlocked(opts);
580
+ } finally {
581
+ lease.release();
582
+ }
583
+ }
584
+
585
+ /** Put the journal back as it was before a reset whose move failed: the
586
+ * previous journal, or none. A restore that fails is logged; the journal it
587
+ * leaves names a `moved_to` that does not exist, which the next `prepare`
588
+ * reads as an interrupted reset and finishes. */
589
+ function restoreJournal(home, previous, log) {
590
+ try {
591
+ if (previous) writeJournalUnlocked(home, previous);
592
+ else unlinkSync(journalPath(home));
593
+ } catch (err) {
594
+ log(
595
+ `openviking: reembed prepare — could not restore ${journalPath(home)}: ${err instanceof Error ? err.message : String(err)}`,
596
+ );
597
+ }
598
+ }
599
+
600
+ // ---- resume (HTTP half) --------------------------------------------------------------
601
+
602
+ /**
603
+ * The USER key as a Bearer, plus the identity header — and deliberately NOT
604
+ * `X-OpenViking-Actor-Peer`, which every other call here carries. VERIFIED
605
+ * LIVE (0.4.15): with an actor-peer header set, the reindex
606
+ * route's authorisation treats a namespace-level URI as one that "may include
607
+ * hidden actor peers" and answers 403 "USER can only reindex their own user
608
+ * namespace" — for the namespace that key does own. Without it the same key
609
+ * reindexes its own namespace and is still refused any other.
610
+ */
611
+ export function reindexHeaders(key, user) {
612
+ return {
613
+ Authorization: `Bearer ${key}`,
614
+ "X-OpenViking-User": user,
615
+ "Content-Type": "application/json",
616
+ };
617
+ }
618
+
619
+ async function call(fetchFn, url, init, timeoutMs) {
620
+ const key = init.headers?.Authorization?.replace(/^Bearer /, "") ?? "";
621
+ const scrub = (text) => (key.length >= 8 ? text.split(key).join("<redacted>") : text);
622
+ try {
623
+ const res = await fetchFn(url, { ...init, signal: AbortSignal.timeout(timeoutMs) });
624
+ let body = {};
625
+ if (typeof res.json === "function") body = await res.json().catch(() => ({}));
626
+ const serialized = JSON.stringify(body);
627
+ if (serialized !== undefined) body = JSON.parse(scrub(serialized));
628
+ return { status: res.status, body };
629
+ } catch (err) {
630
+ return { status: 0, body: {}, error: scrub(err instanceof Error ? err.message : String(err)) };
631
+ }
632
+ }
633
+
634
+ /** The counts out of a completed reindex result (a task's `result` or the
635
+ * synchronous answer), tolerant of either envelope. */
636
+ export function countsOf(result) {
637
+ const r = result && typeof result === "object" ? result : {};
638
+ const n = (k) => (typeof r[k] === "number" ? r[k] : 0);
639
+ return {
640
+ scanned_records: n("scanned_records"),
641
+ rebuilt_records: n("rebuilt_records"),
642
+ failed_records: n("failed_records"),
643
+ unsupported_records: n("unsupported_records"),
644
+ };
645
+ }
646
+
647
+ function envelopeError(body) {
648
+ return body && typeof body === "object" && body.status === "error";
649
+ }
650
+
651
+ function errorMessage(body, fallback) {
652
+ const m = body?.error?.message;
653
+ return typeof m === "string" && m !== "" ? m : fallback;
654
+ }
655
+
656
+ /**
657
+ * Re-embed ONE user namespace through `POST /api/v1/content/reindex`
658
+ * (`mode: "vectors_only"`, `wait: false`), then poll the task it returns until
659
+ * it settles. Total: every outcome is a report, never a throw.
660
+ *
661
+ * completed the task finished; `failed_records` says whether every record
662
+ * made it (the caller re-runs when it did not)
663
+ * failed the task failed, the request was refused (401/403 — the key
664
+ * does not own this namespace), or the server never answered
665
+ * busy another reindex of this namespace is already running
666
+ * (409) — try again later; the server allows one at a time
667
+ * timeout the task did not settle within `deadlineMs` — it may still be
668
+ * running server-side; the next run polls its saved task id
669
+ */
670
+ /** @returns {Promise<ReindexResult>} */
671
+ export async function reindexNamespace({
672
+ base,
673
+ key,
674
+ user,
675
+ fetchFn = /** @type {OvFetch} */ (fetch),
676
+ now = Date.now,
677
+ sleep = (ms) => new Promise((r) => setTimeout(r, ms)),
678
+ requestTimeoutMs = DEFAULTS.requestTimeoutMs,
679
+ pollMs = DEFAULTS.pollMs,
680
+ deadlineMs = DEFAULTS.deadlineMs,
681
+ log = /** @type {Log} */ (() => {}),
682
+ taskId: savedTaskId = "",
683
+ onTask = /** @type {(taskId: string) => void} */ (() => {}),
684
+ }) {
685
+ const uri = `viking://user/${user}`;
686
+ const headers = reindexHeaders(key, user);
687
+ let taskId = savedTaskId;
688
+ if (!taskId) {
689
+ const started = await call(
690
+ fetchFn,
691
+ `${base}/api/v1/content/reindex`,
692
+ { method: "POST", headers, body: JSON.stringify({ uri, mode: "vectors_only", wait: false }) },
693
+ requestTimeoutMs,
694
+ );
695
+ if (started.status === 401 || started.status === 403) {
696
+ return {
697
+ status: "failed",
698
+ uri,
699
+ detail: `refused (HTTP ${started.status}): ${errorMessage(started.body, "this key does not own the namespace")}`,
700
+ };
701
+ }
702
+ if (started.status === 409)
703
+ return {
704
+ status: "busy",
705
+ uri,
706
+ detail: "a reindex of this namespace is already running — retry later",
707
+ };
708
+ if (started.status < 200 || started.status >= 300 || envelopeError(started.body)) {
709
+ return {
710
+ status: "failed",
711
+ uri,
712
+ detail:
713
+ started.error ??
714
+ `HTTP ${started.status}: ${errorMessage(started.body, "reindex request refused")}`,
715
+ };
716
+ }
717
+ const result =
718
+ started.body?.result && typeof started.body.result === "object" ? started.body.result : {};
719
+ if (result.status === "completed") return { status: "completed", uri, ...countsOf(result) };
720
+ taskId = typeof result.task_id === "string" ? result.task_id : "";
721
+ if (!taskId)
722
+ return {
723
+ status: "failed",
724
+ uri,
725
+ detail: "the server accepted the reindex but named no task to follow",
726
+ };
727
+ log(`openviking: reembed ${uri} — task ${taskId} accepted`);
728
+
729
+ try {
730
+ onTask(taskId);
731
+ } catch (err) {
732
+ return {
733
+ status: "timeout",
734
+ uri,
735
+ task_id: taskId,
736
+ detail: `task accepted but its durable identity could not be saved: ${err instanceof Error ? err.message : String(err)}`,
737
+ };
738
+ }
739
+ }
740
+ const deadline = now() + deadlineMs;
741
+ let lastPollFailure = "";
742
+ for (;;) {
743
+ await sleep(pollMs);
744
+ const task = await call(
745
+ fetchFn,
746
+ `${base}/api/v1/tasks/${encodeURIComponent(taskId)}`,
747
+ { method: "GET", headers },
748
+ requestTimeoutMs,
749
+ );
750
+ // A restarted server may have lost its volatile task registry. Only an
751
+ // authoritative missing saved task permits starting a replacement.
752
+ if (savedTaskId && task.status === 404) {
753
+ return reindexNamespace({
754
+ base,
755
+ key,
756
+ user,
757
+ fetchFn,
758
+ now,
759
+ sleep,
760
+ requestTimeoutMs,
761
+ pollMs,
762
+ deadlineMs,
763
+ log,
764
+ onTask,
765
+ });
766
+ }
767
+ if (task.status >= 200 && task.status < 300 && !envelopeError(task.body)) {
768
+ const t = task.body?.result && typeof task.body.result === "object" ? task.body.result : {};
769
+ if (t.status === "completed")
770
+ return { status: "completed", uri, task_id: taskId, ...countsOf(t.result) };
771
+ if (t.status === "failed" || t.status === "cancelled") {
772
+ return {
773
+ status: "failed",
774
+ uri,
775
+ task_id: taskId,
776
+ detail: `task ${t.status}: ${typeof t.error === "string" && t.error ? t.error : "no detail"}`,
777
+ };
778
+ }
779
+ } else {
780
+ lastPollFailure =
781
+ task.error ?? `HTTP ${task.status}: ${errorMessage(task.body, "task poll refused")}`;
782
+ }
783
+ if (now() >= deadline)
784
+ return {
785
+ status: "timeout",
786
+ uri,
787
+ task_id: taskId,
788
+ detail: `task ${taskId} did not settle within ${Math.round(deadlineMs / 1000)}s${lastPollFailure ? ` (last poll: ${lastPollFailure})` : ""}`,
789
+ };
790
+ }
791
+ }
792
+
793
+ /**
794
+ * One resume pass for `user`'s namespace: nothing to do unless the journal
795
+ * marks it pending or failed. Writes the outcome back to the journal.
796
+ *
797
+ * A namespace is `completed` ONLY when the task finished with zero failed
798
+ * records — a partial rebuild stays `failed` so the next run retries it, and
799
+ * the counts in the journal say exactly how far the last attempt got.
800
+ */
801
+ /** @param {{ home: string, base: string, key: string, user: string, fetchFn?: OvFetch, now?: () => Date, sleep?: (ms: number) => Promise<void>, pollMs?: number, deadlineMs?: number, requestTimeoutMs?: number, log?: Log }} opts */
802
+ export async function resume({
803
+ home,
804
+ base,
805
+ key,
806
+ user,
807
+ fetchFn = /** @type {OvFetch} */ (fetch),
808
+ now = () => new Date(),
809
+ sleep,
810
+ pollMs,
811
+ deadlineMs,
812
+ requestTimeoutMs,
813
+ log = /** @type {Log} */ (() => {}),
814
+ }) {
815
+ const { journal, unreadable } = readJournal(home);
816
+ if (unreadable)
817
+ return { action: "none", state: "unreadable", detail: `${journalPath(home)} cannot be parsed` };
818
+ const ns = journal?.namespaces?.[user];
819
+ if (!journal || !ns)
820
+ return { action: "none", state: "none", detail: `no re-embed on record for ${user}` };
821
+ if (ns.state === "completed")
822
+ return {
823
+ action: "none",
824
+ state: "completed",
825
+ detail: `${user} already re-embedded at ${ns.at ?? "?"}`,
826
+ };
827
+ if (ns.state === "operator")
828
+ return {
829
+ action: "none",
830
+ state: "operator",
831
+ detail: `${user} is another key holder's namespace — this host cannot re-embed it`,
832
+ };
833
+ if (!key)
834
+ return {
835
+ action: "none",
836
+ state: ns.state,
837
+ detail: `no ${user} key — cannot re-embed until one is provisioned`,
838
+ };
839
+
840
+ const run = await reindexNamespace({
841
+ base,
842
+ key,
843
+ user,
844
+ taskId: ns.state === "pending" && typeof ns.task_id === "string" ? ns.task_id : "",
845
+ onTask: (taskId) =>
846
+ withJournalLock(home, () => {
847
+ const fresh = readJournal(home).journal;
848
+ const freshNs = fresh?.namespaces?.[user];
849
+ if (!fresh || !freshNs || fresh.reset_at !== journal.reset_at)
850
+ throw new Error("migration changed before task identity could be saved");
851
+ if (freshNs.state === "completed" && freshNs.settled_by === "operator") return;
852
+ writeJournalUnlocked(home, {
853
+ ...fresh,
854
+ namespaces: {
855
+ ...fresh.namespaces,
856
+ [user]: { ...freshNs, state: "pending", task_id: taskId },
857
+ },
858
+ });
859
+ }),
860
+ fetchFn,
861
+ now: () => now().getTime(),
862
+ sleep,
863
+ pollMs,
864
+ deadlineMs,
865
+ requestTimeoutMs,
866
+ log,
867
+ });
868
+ const at = now().toISOString();
869
+ let state;
870
+ if (run.status === "completed" && run.failed_records === 0) state = "completed";
871
+ else if (run.status === "busy" || run.status === "timeout") state = "pending";
872
+ else state = "failed";
873
+ const entry = {
874
+ state,
875
+ at,
876
+ attempts: (typeof ns.attempts === "number" ? ns.attempts : 0) + 1,
877
+ ...(run.task_id ? { task_id: run.task_id } : {}),
878
+ ...(run.status === "completed"
879
+ ? {
880
+ scanned_records: run.scanned_records,
881
+ rebuilt_records: run.rebuilt_records,
882
+ failed_records: run.failed_records,
883
+ unsupported_records: run.unsupported_records,
884
+ }
885
+ : {}),
886
+ detail:
887
+ run.status === "completed"
888
+ ? run.failed_records === 0
889
+ ? `re-embedded: ${run.rebuilt_records} vector records rebuilt from ${run.scanned_records} sources`
890
+ : `partial: ${run.failed_records} of ${run.scanned_records} sources failed — will retry`
891
+ : run.detail,
892
+ };
893
+ // The rebuild above can run for its whole deadline, and `settle` writes this
894
+ // same file from another process meanwhile. So the outcome is merged into
895
+ // the journal as it stands NOW, touching only this host's own row — never
896
+ // written back over the snapshot read before the rebuild, which would
897
+ // silently undo an operator's receipt. The short process lease covers the
898
+ // fresh read and write together; synchronous turns alone do not exclude
899
+ // another process. No lease spans the rebuild's HTTP polling.
900
+ try {
901
+ return withJournalLock(home, () => {
902
+ const fresh = readJournal(home).journal;
903
+ const freshNs = fresh?.namespaces?.[user];
904
+ if (!fresh || !freshNs || fresh.reset_at !== journal.reset_at) {
905
+ // The migration this rebuild belonged to is gone or was re-armed: its
906
+ // outcome says nothing about the journal on disk now.
907
+ const detail = `${state}, not journalled: the migration changed underneath`;
908
+ log(`openviking: reembed ${run.uri} — ${detail}`);
909
+ return { action: "reindex", state, run, entry, detail };
910
+ }
911
+ if (freshNs.state === "completed" && freshNs.settled_by === "operator") {
912
+ // The operator settled this row by their explicit word mid-rebuild; that
913
+ // receipt stands.
914
+ const detail = `${state}, not journalled: settled by the operator meanwhile`;
915
+ log(`openviking: reembed ${run.uri} — ${detail}`);
916
+ return { action: "reindex", state, run, entry, detail };
917
+ }
918
+ writeJournalUnlocked(home, { ...fresh, namespaces: { ...fresh.namespaces, [user]: entry } });
919
+ log(`openviking: reembed ${run.uri} — ${state}: ${entry.detail}`);
920
+ return { action: "reindex", state, run, entry };
921
+ });
922
+ } catch (err) {
923
+ const detail = `${state}, not journalled: ${err instanceof Error ? err.message : String(err)}`;
924
+ log(`openviking: reembed ${run.uri} — ${detail}`);
925
+ return { action: "reindex", state, run, entry, detail };
926
+ }
927
+ }
928
+
929
+ // ---- cli ----------------------------------------------------------------------------
930
+
931
+ export function parseArgs(argv, env = process.env) {
932
+ const positional = [];
933
+ const flags = new Map();
934
+ for (let i = 0; i < argv.length; i++) {
935
+ const a = argv[i];
936
+ if (!a.startsWith("--")) {
937
+ positional.push(a);
938
+ continue;
939
+ }
940
+ const [name, inline] = a.slice(2).split("=", 2);
941
+ if (inline !== undefined) flags.set(name, inline);
942
+ else if (argv[i + 1] && !argv[i + 1].startsWith("--")) flags.set(name, argv[++i]);
943
+ else flags.set(name, "true");
944
+ }
945
+ const home = flags.get("home") ?? env.QCR_OV_HOME ?? "";
946
+ const port = Number(flags.get("port") ?? 1933);
947
+ return {
948
+ command: positional[0] ?? "status",
949
+ home,
950
+ config: flags.get("config") ?? (home ? join(home, "ov.conf") : ""),
951
+ users: parseUserList(flags.get("users") ?? "reviewer,companion"),
952
+ base: flags.get("base") ?? env.QCR_OV_BASE ?? DEFAULTS.base,
953
+ user: flags.get("user") ?? DEFAULTS.user,
954
+ keyFile: flags.get("key-file") ?? "",
955
+ keyEnv: flags.get("key-env") ?? "",
956
+ detail: flags.get("detail") ?? "",
957
+ bin: flags.get("bin") ?? "",
958
+ host: flags.get("host") ?? "127.0.0.1",
959
+ port,
960
+ readyTimeoutMs: Number(flags.get("ready-timeout-ms") ?? DEFAULTS.readyTimeoutMs),
961
+ deadlineMs: Number(flags.get("deadline-ms") ?? DEFAULTS.deadlineMs),
962
+ strict: flags.has("strict"),
963
+ // `rehearse` only: the local embedder to run beside the temporary server
964
+ // — a spec, `null`, or an error string.
965
+ embedder: embedderSpecFromFlags(flags),
966
+ };
967
+ }
968
+
969
+ function readConf(path) {
970
+ try {
971
+ return JSON.parse(readFileSync(path, "utf8"));
972
+ } catch {
973
+ return null;
974
+ }
975
+ }
976
+
977
+ /** The namespace key for `resume`/`rehearse`: a file (0600, like every other
978
+ * secret here) or an environment variable name — never a value on the argv. */
979
+ function keyFor(cfg, env = process.env) {
980
+ if (cfg.keyFile) return readSecret(cfg.keyFile);
981
+ if (cfg.keyEnv) return String(env[cfg.keyEnv] ?? "").trim();
982
+ return "";
983
+ }
984
+
985
+ export async function main(argv, { env = process.env, log = (line) => console.log(line) } = {}) {
986
+ const cfg = parseArgs(argv, env);
987
+ try {
988
+ return await runCommand(cfg, env, log);
989
+ } catch (err) {
990
+ try {
991
+ log(
992
+ `openviking: reembed failed (${err instanceof Error ? err.message : String(err)}) — the server may refuse to start until an operator looks`,
993
+ );
994
+ } catch {
995
+ /* A broken output stream must preserve the exit contract too. */
996
+ }
997
+ return cfg.strict || !["prepare", "resume"].includes(cfg.command) ? 1 : 0;
998
+ }
999
+ }
1000
+
1001
+ async function runCommand(cfg, env, log) {
1002
+ if (!cfg.home) {
1003
+ log("openviking-reembed: --home <openviking home> is required (the directory holding ov.conf)");
1004
+ return 2;
1005
+ }
1006
+ switch (cfg.command) {
1007
+ case "status": {
1008
+ log(JSON.stringify(journalStatus(cfg.home), null, 2));
1009
+ return 0;
1010
+ }
1011
+ case "prepare": {
1012
+ const conf = readConf(cfg.config);
1013
+ if (!conf) {
1014
+ log(
1015
+ `openviking: reembed prepare skipped — ${cfg.config} is missing or not JSON (the render did not run?)`,
1016
+ );
1017
+ return cfg.strict ? 1 : 0;
1018
+ }
1019
+ const base = `http://${cfg.host}:${Number(conf?.server?.port ?? cfg.port)}`;
1020
+ const report = await prepare({
1021
+ home: cfg.home,
1022
+ conf,
1023
+ users: cfg.users,
1024
+ own: cfg.user,
1025
+ base,
1026
+ log,
1027
+ });
1028
+ return report.action === "refuse" && cfg.strict ? 1 : 0;
1029
+ }
1030
+ case "settle": {
1031
+ const r = settle({ home: cfg.home, user: cfg.user, detail: cfg.detail });
1032
+ log(
1033
+ `openviking: reembed settle ${cfg.user} — ${r.ok ? "completed" : "refused"}: ${r.detail}`,
1034
+ );
1035
+ return r.ok ? 0 : 1;
1036
+ }
1037
+ case "resume": {
1038
+ const report = await resume({
1039
+ home: cfg.home,
1040
+ base: cfg.base,
1041
+ key: keyFor(cfg, env),
1042
+ user: cfg.user,
1043
+ deadlineMs: cfg.deadlineMs,
1044
+ log,
1045
+ });
1046
+ log(
1047
+ `openviking: reembed resume — ${report.action}: ${report.state} (${report.detail ?? report.entry?.detail ?? ""})`,
1048
+ );
1049
+ return cfg.strict && report.state !== "completed" && report.state !== "none" ? 1 : 0;
1050
+ }
1051
+ case "rehearse": {
1052
+ // Everything, against a COPY: reset, a temporary server of our own,
1053
+ // the reindex, stop. Strict by nature — a rehearsal that did not
1054
+ // complete is the answer "do not run this on the live store yet".
1055
+ const conf = readConf(cfg.config);
1056
+ if (!conf) {
1057
+ log(`openviking-reembed: ${cfg.config} is missing or not JSON`);
1058
+ return 1;
1059
+ }
1060
+ if (!cfg.bin) {
1061
+ log("openviking-reembed: rehearse needs --bin <openviking-server>");
1062
+ return 1;
1063
+ }
1064
+ // An ov.conf on the local English embedder needs it running
1065
+ // — the server's /ready probes it, and the reindex is nothing but
1066
+ // embedding calls. Same flags as boot provisioning (--embedder-*),
1067
+ // checked BEFORE anything on disk moves.
1068
+ if (typeof cfg.embedder === "string") {
1069
+ log(`openviking-reembed: ${cfg.embedder}`);
1070
+ return 1;
1071
+ }
1072
+ const base = `http://${cfg.host}:${cfg.port}`;
1073
+ const prepared = await prepare({
1074
+ home: cfg.home,
1075
+ conf,
1076
+ users: cfg.users,
1077
+ own: cfg.user,
1078
+ base,
1079
+ log,
1080
+ });
1081
+ if (prepared.action === "refuse") return 1;
1082
+ let embedder = null;
1083
+ if (cfg.embedder) {
1084
+ const started = await startEmbedder(cfg.embedder, {
1085
+ log,
1086
+ readyTimeoutMs: cfg.readyTimeoutMs,
1087
+ });
1088
+ embedder = started.child;
1089
+ if (!started.ready) {
1090
+ await stopServerChild(embedder);
1091
+ return 1;
1092
+ }
1093
+ }
1094
+ const child = spawn(
1095
+ cfg.bin,
1096
+ serverArgv({ config: cfg.config, host: cfg.host, port: cfg.port }),
1097
+ { stdio: ["ignore", "inherit", "inherit"] },
1098
+ );
1099
+ child.on("error", (err) =>
1100
+ log(`openviking-reembed: could not start the server (${err.message})`),
1101
+ );
1102
+ child.unref?.();
1103
+ try {
1104
+ if (!(await waitForReady({ base, timeoutMs: cfg.readyTimeoutMs }))) {
1105
+ log("openviking-reembed: the server never became ready — see its log above");
1106
+ return 1;
1107
+ }
1108
+ const report = await resume({
1109
+ home: cfg.home,
1110
+ base,
1111
+ key: keyFor(cfg, env),
1112
+ user: cfg.user,
1113
+ deadlineMs: cfg.deadlineMs,
1114
+ log,
1115
+ });
1116
+ log(JSON.stringify(journalStatus(cfg.home), null, 2));
1117
+ return report.state === "completed" ? 0 : 1;
1118
+ } finally {
1119
+ await stopServerChild(child);
1120
+ await stopServerChild(embedder);
1121
+ }
1122
+ }
1123
+ default:
1124
+ log(
1125
+ `openviking-reembed: unknown command '${cfg.command}' (prepare | resume | status | settle | rehearse)`,
1126
+ );
1127
+ return 2;
1128
+ }
1129
+ }
1130
+
1131
+ const invokedDirectly = (() => {
1132
+ try {
1133
+ return (
1134
+ process.argv[1] !== undefined &&
1135
+ import.meta.url === pathToFileURL(realpathSync(process.argv[1])).href
1136
+ );
1137
+ } catch {
1138
+ return false;
1139
+ }
1140
+ })();
1141
+ if (invokedDirectly) {
1142
+ main(process.argv.slice(2))
1143
+ .then((code) => {
1144
+ if (typeof code === "number" && code !== 0) process.exit(code);
1145
+ })
1146
+ .catch((err) => {
1147
+ // Parsing can also fail before main's command boundary. Boot commands
1148
+ // remain soft; a strict invocation or rehearsal must report failure.
1149
+ if (process.argv.includes("--strict") || process.argv[2] === "rehearse") process.exitCode = 1;
1150
+ console.log(
1151
+ `openviking: reembed failed (${err instanceof Error ? err.message : String(err)}) — the server may refuse to start until an operator looks`,
1152
+ );
1153
+ });
1154
+ }