@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,996 @@
1
+ diff --git a/extensions/vendor/openviking-pi/NOTICE b/extensions/vendor/openviking-pi/NOTICE
2
+ --- a/extensions/vendor/openviking-pi/NOTICE
3
+ +++ b/extensions/vendor/openviking-pi/NOTICE
4
+ @@ -38,6 +38,10 @@ Changed by the quickreviewd maintainers, 2026-08-20:
5
+ removed.
6
+ 5. The memory tools can address a second OpenViking user namespace, built
7
+ from a second USER key when one is present in the environment.
8
+ + 6. A "directory busy" 409 is retried (a precondition 409 is not),
9
+ + `viking_write` writes several entries as one batch, a refused key is
10
+ + re-read once, and tool failures are reported as failures rather than
11
+ + as empty results (2026-10-06).
12
+
13
+ Plus vendoring scaffolding: build-conformance fixes for this repo's stricter
14
+ tsconfig, ambient type declarations for uninstalled packages, three unused
15
+ diff --git a/extensions/vendor/openviking-pi/README.md b/extensions/vendor/openviking-pi/README.md
16
+ --- a/extensions/vendor/openviking-pi/README.md
17
+ +++ b/extensions/vendor/openviking-pi/README.md
18
+ @@ -1,7 +1,7 @@
19
+ # openviking-pi — vendored, patched fork
20
+
21
+ The OpenViking pi extension our sessions load. Vendored, not depended on:
22
+ -upstream ships it as an `examples/` directory, not a package, and we need five
23
+ +upstream ships it as an `examples/` directory, not a package, and we need six
24
+ behaviour changes that upstream has no reason to make.
25
+
26
+ | | |
27
+ @@ -20,7 +20,7 @@ fails on drift between the two.
28
+
29
+ ## Why a fork rather than configuration
30
+
31
+ -Every one of the five patches was tried as configuration first and does not
32
+ +Every one of the six patches was tried as configuration first and does not
33
+ exist there. The evidence is a spike against a **running v0.4.15 server plus
34
+ the pinned pi 0.84.1** — `assets/findings.md` in the issue tracker,
35
+ with transcripts. Read it before changing anything here; several of its
36
+ @@ -28,9 +28,9 @@ findings contradict the OpenViking docs, which lead the tag.
37
+
38
+ ## The patch series
39
+
40
+ -Five numbered behaviour patches, applied in order over the vendored upstream
41
+ +Six numbered behaviour patches, applied in order over the vendored upstream
42
+ files, plus one unnumbered scaffolding patch. They live in `patches/` as
43
+ -`git apply`-able diffs — verified by applying all six, in order, to a
44
+ +`git apply`-able diffs — verified by applying all seven, in order, to a
45
+ pristine `v0.4.15` extraction and diffing the result against this directory:
46
+ byte-identical. (`patches/` and `upstream.json` are meta and are not themselves
47
+ part of the reproduced tree.) Every hunk they add carries a greppable marker:
48
+ @@ -224,6 +224,48 @@ Touches: `qcr-namespaces.ts` (new), `config.ts` (`withoutRootKey` generic +
49
+ `env`), `index.ts` (client construction, health probe, the advertised
50
+ namespaces), `tools.ts` (routing, the `namespace` parameter, prefixed answers).
51
+
52
+ +### 0006 — writes that stick, errors that say so (S2)
53
+ +
54
+ +Four changes, one reason: memory writes were dropped and memory failures were
55
+ +read as empty answers.
56
+ +
57
+ +* **A busy 409 is retried; a precondition 409 is not.** The server's
58
+ + batch-write takes a zero-timeout try-lock on its root directory, and a
59
+ + second writer into the same directory gets `409 CONFLICT` with
60
+ + `details.conflict_type = "path_busy"` and `retryable: true` — nothing was
61
+ + checked or written. The tool used to answer every 409 with "someone else
62
+ + edited the file — re-read it, never retry", for files nobody had touched:
63
+ + 6 of the 8 EOD writes on 2026-10-05 died that way. `batchWrite` and
64
+ + `setTags` now retry exactly that answer, jittered and bounded (≤10 s,
65
+ + `qcr-honest.ts` `BUSY_RETRY`, the same rule as the daemon's client); a
66
+ + hash-precondition 409 carries no `path_busy` and stays a refusal.
67
+ +* **`viking_write` takes several entries as ONE batch-write.** `entries[]`
68
+ + (or the old `uri` + `content` for one) — one request under the entries'
69
+ + deepest common directory, so a day's lessons take the directory lock once
70
+ + and land whole or not at all. The frozen EOD seed already said "it batches,
71
+ + so write today's entries in one call"; now it is true. A batch is routed by
72
+ + its entries' own addresses (`routeWrite`): in a two-key process (the
73
+ + companion) a batch of reviewer-tree entries goes to the reviewer key
74
+ + without naming the namespace, and one that straddles both trees is refused.
75
+ +* **No failure reads as "No results found".** `find()` returns the envelope
76
+ + instead of collapsing every failure to `[]`, and `viking_search`,
77
+ + `viking_read` and `viking_browse` name a refused key, a dead server or a
78
+ + busy directory as what it is (`failureText`): every PR-session memory call
79
+ + in history came back "No results found." or "No content at …", two of them
80
+ + inside the five-week `Invalid API Key` outage. "No content" / "Not found" /
81
+ + "Empty directory" now mean exactly that (a NOT_FOUND or an empty answer).
82
+ +* **A refused key is re-read once.** The primary client's key is re-resolved
83
+ + from its source after an auth failure (`rereadApiKey` in `config.ts`) and
84
+ + the request retried once, only if the key actually changed — the daemon
85
+ + rewrites the sessions' `ovcli.conf` when its key rotates, and a running
86
+ + session used to keep sending the dead one until it died.
87
+ +
88
+ +Touches: `qcr-honest.ts` (new), `qcr-write.ts` (`buildBatchWriteRequest`,
89
+ +`routeWrite`),
90
+ +`client.ts` (`rekey`, busy retry, `find` / `readLevel` / `lsResponse` /
91
+ +`statResponse` envelopes), `config.ts` (`rereadApiKey`), `tools.ts`,
92
+ +`index.ts` (the banner, the re-reader).
93
+ +
94
+ ## Rebasing onto a newer upstream
95
+
96
+ ```sh
97
+ @@ -236,16 +278,16 @@ git -C /tmp/ov checkout <new-tag>
98
+ for p in extensions/vendor/openviking-pi/patches/0*.patch; do
99
+ git apply --3way "$p" || echo "RESOLVE: $p"
100
+ done
101
+ -# 3. Re-verify all five patches, then:
102
+ +# 3. Re-verify all six patches, then:
103
+ timeout 900 npm test && npm run build
104
+ ```
105
+
106
+ Then update `extension_commit` and `version` in `config.toml [openviking]`,
107
+ the base commit in `NOTICE` and in the table above, and re-run the live
108
+ -verification below. A bump re-verifies **all five** patches — a patch that no
109
+ +verification below. A bump re-verifies **all six** patches — a patch that no
110
+ longer applies is a patch whose reason may have changed, not a patch to drop.
111
+
112
+ -`tests/openviking-fork.test.ts` is the guard rail: it asserts the five patches
113
+ +`tests/openviking-fork.test.ts` is the guard rail: it asserts the six patches
114
+ are still present (markers, and the *absence* of what each one removed) and
115
+ that the pinned commit here matches `config.toml`. It cannot tell you whether
116
+ upstream grew a *new* compaction handler or a *new* write tool — read the
117
+ diff --git a/extensions/vendor/openviking-pi/client.ts b/extensions/vendor/openviking-pi/client.ts
118
+ --- a/extensions/vendor/openviking-pi/client.ts
119
+ +++ b/extensions/vendor/openviking-pi/client.ts
120
+ @@ -1,4 +1,11 @@
121
+ import type { OVConfig } from "./config.js";
122
+ +// [QCR PATCH 6]
123
+ +import {
124
+ + shouldRekey,
125
+ + withBusyRetry,
126
+ + type BusyRetryHooks,
127
+ + type BusyRetryNote,
128
+ +} from "./qcr-honest.js";
129
+
130
+ // --- OV API Response Shapes ---
131
+ // All OV responses wrap in: { status: "ok"|"error", result: T, error?: {...}, ... }
132
+ @@ -101,6 +108,17 @@ export class OVClient {
133
+
134
+ private resolvedSpaces: Map<string, string> = new Map();
135
+
136
+ + /** [QCR PATCH 6] Re-reads this client's key from its source (the
137
+ + * ovcli.conf the daemon rewrites when its key rotates). Set by index.ts on
138
+ + * the primary client only — an env-supplied key cannot change in-process.
139
+ + * On an auth failure the request is retried ONCE, and only when the
140
+ + * re-read key differs (`shouldRekey`). */
141
+ + rekey: (() => string) | null = null;
142
+ +
143
+ + /** [QCR PATCH 6] The busy retry's clock and sleep — real ones in pi; a
144
+ + * test injects instant ones. */
145
+ + retryHooks: BusyRetryHooks = {};
146
+ +
147
+ private static RESERVED_USER = new Set(["memories"]);
148
+ private static RESERVED_AGENT = new Set(["memories", "skills", "instructions", "workspaces"]);
149
+
150
+ @@ -128,6 +146,28 @@ export class OVClient {
151
+
152
+ /** Core fetch wrapper. Returns { ok, result } after parsing OV's { status, result } envelope. */
153
+ async fetchJSON<T>(path: string, init?: RequestInit, timeoutMs = 10000): Promise<OVResponse<T>> {
154
+ + const res = await this.fetchOnce<T>(path, init, timeoutMs);
155
+ + // [QCR PATCH 6] A refused key is re-read once from its source: the daemon
156
+ + // rewrites the sessions' ovcli.conf the moment its key rotates, and a
157
+ + // session that kept the key it loaded with stayed locked out until it
158
+ + // died. Retried only when the re-read key is actually different.
159
+ + if (!res.ok && this.rekey) {
160
+ + let fresh = "";
161
+ + try {
162
+ + fresh = this.rekey() ?? "";
163
+ + } catch {
164
+ + fresh = "";
165
+ + }
166
+ + if (shouldRekey(res, this.apiKey, fresh)) {
167
+ + this.apiKey = fresh;
168
+ + return this.fetchOnce<T>(path, init, timeoutMs);
169
+ + }
170
+ + }
171
+ + return res;
172
+ + }
173
+ +
174
+ + /** [QCR PATCH 6] One attempt of `fetchJSON` (the upstream body, unchanged). */
175
+ + private async fetchOnce<T>(path: string, init?: RequestInit, timeoutMs = 10000): Promise<OVResponse<T>> {
176
+ try {
177
+ const controller = new AbortController();
178
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
179
+ @@ -264,11 +304,16 @@ export class OVClient {
180
+
181
+ // ========== Search ==========
182
+
183
+ - /** POST /api/v1/search/find — basic vector search */
184
+ + /** POST /api/v1/search/find — basic vector search.
185
+ + *
186
+ + * [QCR PATCH 6] Returns the ENVELOPE, not a bare list: upstream returned
187
+ + * `[]` for every failure, a refused key included, so `viking_search`
188
+ + * answered "No results found." through five weeks of `Invalid API Key`. A
189
+ + * failure is now a failure the tool can name (`failureText`). */
190
+ async find(
191
+ query: string,
192
+ opts?: { targetUri?: string; topK?: number; scoreThreshold?: number },
193
+ - ): Promise<OVSearchResult[]> {
194
+ + ): Promise<OVResponse<OVSearchResult[]>> {
195
+ const body: Record<string, unknown> = { query };
196
+ if (opts?.targetUri) body.target_uri = opts.targetUri;
197
+ if (opts?.topK) body.limit = opts.topK;
198
+ @@ -277,7 +322,8 @@ export class OVClient {
199
+ const res = await this.fetchJSON<any>("/api/v1/search/find", {
200
+ method: "POST", body: JSON.stringify(body),
201
+ }, 10000);
202
+ - if (!res.ok || !res.result) return [];
203
+ + if (!res.ok) return { ...res, result: null };
204
+ + if (!res.result) return { ok: true, result: [], traceId: res.traceId };
205
+
206
+ // OV returns { memories: [...], resources: [...], skills: [...], total }
207
+ const all: OVSearchResult[] = [];
208
+ @@ -298,7 +344,7 @@ export class OVClient {
209
+ }
210
+ }
211
+ }
212
+ - return all;
213
+ + return { ok: true, result: all, traceId: res.traceId };
214
+ }
215
+
216
+ // ========== Content ==========
217
+ @@ -317,11 +363,19 @@ export class OVClient {
218
+ async batchWrite(
219
+ request: { root_uri: string; operations: unknown[]; wait: boolean },
220
+ timeoutMs = 30000,
221
+ - ): Promise<OVResponse<OVBatchWriteResult>> {
222
+ - return this.fetchJSON<OVBatchWriteResult>(
223
+ - "/api/v1/content/batch-write",
224
+ - { method: "POST", body: JSON.stringify(request) },
225
+ - timeoutMs,
226
+ + ): Promise<OVResponse<OVBatchWriteResult> & BusyRetryNote> {
227
+ + // [QCR PATCH 6] A BUSY 409 (`details.conflict_type = "path_busy"`: the
228
+ + // directory lock was held, nothing was checked or written) is retried,
229
+ + // jittered and bounded; a precondition 409 is returned as the refusal it
230
+ + // is. See qcr-honest.ts.
231
+ + return withBusyRetry(
232
+ + () =>
233
+ + this.fetchJSON<OVBatchWriteResult>(
234
+ + "/api/v1/content/batch-write",
235
+ + { method: "POST", body: JSON.stringify(request) },
236
+ + timeoutMs,
237
+ + ),
238
+ + this.retryHooks,
239
+ );
240
+ }
241
+
242
+ @@ -333,14 +387,61 @@ export class OVClient {
243
+ */
244
+ async setTags(uri: string, tags: string[], mode: "append" | "replace" = "append"): Promise<boolean> {
245
+ if (tags.length === 0) return true;
246
+ - const res = await this.fetchJSON<any>(
247
+ - "/api/v1/fs/attrs/set_tags",
248
+ - { method: "POST", body: JSON.stringify({ uri, tags, mode }) },
249
+ - 10000,
250
+ + // [QCR PATCH 6] set_tags takes the same lock family; a busy answer is
251
+ + // retried like a write's.
252
+ + const res = await withBusyRetry(
253
+ + () =>
254
+ + this.fetchJSON<any>(
255
+ + "/api/v1/fs/attrs/set_tags",
256
+ + { method: "POST", body: JSON.stringify({ uri, tags, mode }) },
257
+ + 10000,
258
+ + ),
259
+ + this.retryHooks,
260
+ );
261
+ return res.ok;
262
+ }
263
+
264
+ + /** [QCR PATCH 6] One read at a detail level, as an ENVELOPE — `abstract`,
265
+ + * `overview` and `readContent` below collapse every failure to null, which
266
+ + * the tools used to render as "No content at …" for a refused key too. */
267
+ + async readLevel(uri: string, level: "abstract" | "overview" | "full"): Promise<OVResponse<string>> {
268
+ + const path = level === "full" ? "read" : level;
269
+ + return this.fetchJSON<string>(
270
+ + `/api/v1/content/${path}?uri=${encodeURIComponent(uri)}`,
271
+ + undefined, 10000,
272
+ + );
273
+ + }
274
+ +
275
+ + /** [QCR PATCH 6] `fs/ls` as an envelope (`ls()` keeps upstream's `[]`). */
276
+ + async lsResponse(uri: string): Promise<OVResponse<OVDirEntry[]>> {
277
+ + const res = await this.fetchJSON<any[]>(
278
+ + `/api/v1/fs/ls?uri=${encodeURIComponent(uri)}`,
279
+ + undefined, 10000,
280
+ + );
281
+ + if (!res.ok) return { ...res, result: null };
282
+ + const rows = Array.isArray(res.result) ? res.result : [];
283
+ + return {
284
+ + ok: true,
285
+ + result: rows.map(e => ({
286
+ + uri: e.uri ?? "",
287
+ + name: e.name ?? uriBasename(e.uri ?? ""),
288
+ + isDir: e.isDir ?? false,
289
+ + size: e.size ?? 0,
290
+ + mode: e.mode ?? 0,
291
+ + modTime: e.modTime ?? "",
292
+ + abstract: e.abstract ?? "",
293
+ + })),
294
+ + };
295
+ + }
296
+ +
297
+ + /** [QCR PATCH 6] `fs/stat` as an envelope (`stat()` keeps upstream's null). */
298
+ + async statResponse(uri: string): Promise<OVResponse<OVStatInfo>> {
299
+ + return this.fetchJSON<OVStatInfo>(
300
+ + `/api/v1/fs/stat?uri=${encodeURIComponent(uri)}`,
301
+ + undefined, 10000,
302
+ + );
303
+ + }
304
+ +
305
+ /** GET /api/v1/content/abstract — L0 summary */
306
+ async abstract(uri: string): Promise<string | null> {
307
+ const res = await this.fetchJSON<string>(
308
+ diff --git a/extensions/vendor/openviking-pi/config.ts b/extensions/vendor/openviking-pi/config.ts
309
+ --- a/extensions/vendor/openviking-pi/config.ts
310
+ +++ b/extensions/vendor/openviking-pi/config.ts
311
+ @@ -52,6 +52,20 @@ function readServerRootKey(env: Record<string, string | undefined> = process.env
312
+ }
313
+ }
314
+
315
+ +/**
316
+ + * [QCR PATCH 6] The primary key as its source says NOW — the same resolver and
317
+ + * the same root-key guard `loadConfig` used at load. The client calls it after
318
+ + * an auth failure: the daemon rewrites the sessions' ovcli.conf when its key
319
+ + * rotates (S1), and a running session must not keep the dead one.
320
+ + */
321
+ +export function rereadApiKey(env: Record<string, string | undefined> = process.env): string {
322
+ + try {
323
+ + return withoutRootKey(resolveOpenVikingCredentials(env), env).apiKey;
324
+ + } catch {
325
+ + return "";
326
+ + }
327
+ +}
328
+ +
329
+ /** Hand-maintained: this extension ships no manifest to read a version from. */
330
+ export const EXTENSION_VERSION = "0.1.0";
331
+
332
+ diff --git a/extensions/vendor/openviking-pi/index.ts b/extensions/vendor/openviking-pi/index.ts
333
+ --- a/extensions/vendor/openviking-pi/index.ts
334
+ +++ b/extensions/vendor/openviking-pi/index.ts
335
+ @@ -11,7 +11,7 @@
336
+ *
337
+ * ── QCR FORK ────────────────────────────────────────────────────────────────
338
+ * Vendored from volcengine/OpenViking @ v0.4.15, examples/pi-coding-agent-
339
+ - * extension. Five numbered patches; every hunk carries a `[QCR PATCH n]`
340
+ + * extension. Six numbered patches; every hunk carries a `[QCR PATCH n]`
341
+ * marker so a rebase is a search, not an audit. See README.md here.
342
+ * PATCH 1 — no session_before_compact handler (extensions/ledger-pin.ts is
343
+ * the sole owner of compaction) and takeover forced off.
344
+ @@ -20,12 +20,16 @@
345
+ * PATCH 4 — viking_write (durable content/batch-write), the ONLY write tool.
346
+ * PATCH 5 — a second memory namespace (the companion's reviewer key), tools
347
+ * only; a leaf and a single-keyed review session are unchanged.
348
+ + * PATCH 6 — writes that stick: a busy 409 is retried (a precondition 409
349
+ + * is not), viking_write takes several entries as ONE batch, a
350
+ + * refused key is re-read once, and no failure reads as "No
351
+ + * results found".
352
+ * ────────────────────────────────────────────────────────────────────────────
353
+ */
354
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
355
+ import { appendFileSync, mkdirSync } from "node:fs";
356
+ import { dirname } from "node:path";
357
+ -import { loadConfigFromModuleUrl, type OVConfig } from "./config.js";
358
+ +import { loadConfigFromModuleUrl, rereadApiKey, type OVConfig } from "./config.js";
359
+ import { OVClient } from "./client.js";
360
+ import { RecallManager } from "./recall.js";
361
+ import { SyncManager } from "./sync.js";
362
+ @@ -51,6 +55,11 @@ export default async function (pi: ExtensionAPI) {
363
+
364
+ // --- Initialize modules ---
365
+ const client = new OVClient(config);
366
+ + // [QCR PATCH 6] The primary key is re-read from its source after an auth
367
+ + // failure (the daemon rewrites ovcli.conf on a key rotation). The extra
368
+ + // namespaces' keys come from the environment, which cannot change
369
+ + // in-process, so they get no re-reader.
370
+ + client.rekey = () => rereadApiKey();
371
+ // [QCR PATCH 5] A SECOND client, and only when a second USER key is in the
372
+ // environment: the companion's `OPENVIKING_REVIEWER_KEY`, which lets the
373
+ // local pi read AND write reviewer memory as well as its own. Same base URL,
374
+ diff --git a/extensions/vendor/openviking-pi/qcr-write.ts b/extensions/vendor/openviking-pi/qcr-write.ts
375
+ --- a/extensions/vendor/openviking-pi/qcr-write.ts
376
+ +++ b/extensions/vendor/openviking-pi/qcr-write.ts
377
+ @@ -22,6 +22,8 @@
378
+ // therefore the ONE write path — findings §3.3.
379
+
380
+ import { createHash } from "node:crypto";
381
+ +// [QCR PATCH 6] a batch is routed by its entries (`routeWrite`)
382
+ +import { routeNamespace, type NamespaceRoute } from "./qcr-namespaces.js";
383
+
384
+ /** Memory targets keep a text-extension allowlist server-side; these are the
385
+ * two we ever author. */
386
+ @@ -219,3 +221,178 @@ export function buildWriteRequest(input: WriteRequestInput): WriteRequestResult
387
+ },
388
+ };
389
+ }
390
+ +
391
+ +// ---- [QCR PATCH 6] several entries, ONE batch-write -------------------------
392
+ +//
393
+ +// The EOD curator writes a day's lessons together, and the frozen sweep seed
394
+ +// already tells it "it batches, so write today's entries in one call" — which
395
+ +// was not true: one `viking_write` was one file, so a day's entries went out
396
+ +// as parallel calls into ONE directory, and the server's zero-timeout
397
+ +// directory lock answered most of them busy (6 of 8 on 2026-10-05). One
398
+ +// request with every entry under one root takes that lock once. The server
399
+ +// checks every precondition before it writes anything, so the batch lands
400
+ +// whole or not at all.
401
+ +
402
+ +/** The most entries one call may carry (the server's own cap is 256). */
403
+ +export const MAX_BATCH_ENTRIES = 64;
404
+ +
405
+ +export interface BatchEntryInput {
406
+ + uri?: unknown;
407
+ + content?: unknown;
408
+ + tags?: unknown;
409
+ + mode?: unknown;
410
+ + expect_hash?: unknown;
411
+ +}
412
+ +
413
+ +/** One entry (`uri` + `content`, as `WriteRequestInput`) or several
414
+ + * (`entries`) — every field optional, since either form leaves the other's
415
+ + * fields out. */
416
+ +export interface BatchWriteInput {
417
+ + uri?: unknown;
418
+ + content?: unknown;
419
+ + tags?: unknown;
420
+ + mode?: unknown;
421
+ + expect_hash?: unknown;
422
+ + wait?: unknown;
423
+ + entries?: unknown;
424
+ +}
425
+ +
426
+ +export interface BatchEntryBuilt {
427
+ + uri: string;
428
+ + body: string;
429
+ + hash: string;
430
+ + tags: string[];
431
+ +}
432
+ +
433
+ +export interface BatchRequestOk {
434
+ + ok: true;
435
+ + request: BatchWriteRequest;
436
+ + entries: BatchEntryBuilt[];
437
+ +}
438
+ +
439
+ +export type BatchRequestResult = BatchRequestOk | WriteRequestError;
440
+ +
441
+ +/** The deepest directory every URI sits under (`viking://a/b/c.md` and
442
+ + * `viking://a/b/d/e.md` → `viking://a/b`); "" when they share none. */
443
+ +export function commonParentUri(uris: readonly string[]): string {
444
+ + const dirs = uris.map((u) => parentUri(u));
445
+ + if (dirs.length === 0 || dirs.some((d) => d === "")) return "";
446
+ + const split = dirs.map((d) => d.slice("viking://".length).split("/"));
447
+ + const first = split[0]!;
448
+ + let depth = first.length;
449
+ + for (const parts of split.slice(1)) {
450
+ + let i = 0;
451
+ + while (i < depth && i < parts.length && parts[i] === first[i]) i += 1;
452
+ + depth = i;
453
+ + }
454
+ + return depth === 0 ? "" : `viking://${first.slice(0, depth).join("/")}`;
455
+ +}
456
+ +
457
+ +/**
458
+ + * Which memory tree a `viking_write` call writes into. One entry routes
459
+ + * exactly as every other tool call does (`routeNamespace` over its `uri` and
460
+ + * `namespace`). A batch carries no top-level `uri`, so it routes by its
461
+ + * ENTRIES: each one by that same rule (its own `uri`, the call's
462
+ + * `namespace`), and every entry must land in the same tree. Routing the bare
463
+ + * top-level params instead fell back to this process's own tree, and then
464
+ + * refused a batch whose every entry was in the reviewer's as "more than one
465
+ + * memory tree" — which was false.
466
+ + */
467
+ +export function routeWrite(
468
+ + params: BatchWriteInput & { namespace?: unknown },
469
+ + names: readonly string[],
470
+ +): NamespaceRoute {
471
+ + if (!Array.isArray(params.entries) || params.entries.length === 0) {
472
+ + return routeNamespace(params, names);
473
+ + }
474
+ + let routed: string | null = null;
475
+ + for (const [i, raw] of params.entries.entries()) {
476
+ + const entry = (raw && typeof raw === "object" ? raw : {}) as BatchEntryInput;
477
+ + const each = routeNamespace({ uri: entry.uri, namespace: params.namespace }, names);
478
+ + if (!each.ok) return { ok: false, error: `Entry ${i + 1}: ${each.error}` };
479
+ + if (routed !== null && each.namespace !== routed) {
480
+ + return {
481
+ + ok: false,
482
+ + error: `The entries address more than one memory tree (${routed} and ${each.namespace}) — write each tree's entries in a separate call.`,
483
+ + };
484
+ + }
485
+ + routed = each.namespace;
486
+ + }
487
+ + return { ok: true, namespace: routed! };
488
+ +}
489
+ +
490
+ +/**
491
+ + * Validate + assemble ONE `content/batch-write` for one or many entries.
492
+ + * Either `uri` + `content` (one entry — exactly `buildWriteRequest`) or
493
+ + * `entries[]`, never both. Every entry is validated by the same rules as a
494
+ + * single write (`create_if_absent` by default, `replace` only with its
495
+ + * `expect_hash`); they must not repeat a target, and they share one root —
496
+ + * the deepest directory they all sit under.
497
+ + */
498
+ +export function buildBatchWriteRequest(input: BatchWriteInput): BatchRequestResult {
499
+ + const hasSingle = input.uri !== undefined || input.content !== undefined;
500
+ + if (input.entries === undefined) {
501
+ + const one = buildWriteRequest({
502
+ + uri: input.uri,
503
+ + content: input.content,
504
+ + tags: input.tags,
505
+ + mode: input.mode,
506
+ + expect_hash: input.expect_hash,
507
+ + wait: input.wait,
508
+ + });
509
+ + if (!one.ok) return one;
510
+ + return {
511
+ + ok: true,
512
+ + request: one.request,
513
+ + entries: [
514
+ + { uri: one.request.operations[0]!.uri, body: one.body, hash: one.hash, tags: one.tags },
515
+ + ],
516
+ + };
517
+ + }
518
+ + if (hasSingle) {
519
+ + return {
520
+ + ok: false,
521
+ + error: "Give either `uri` + `content` (one entry) or `entries` (several) — not both.",
522
+ + };
523
+ + }
524
+ + if (!Array.isArray(input.entries) || input.entries.length === 0) {
525
+ + return { ok: false, error: "`entries` must be a non-empty list of {uri, content, …}." };
526
+ + }
527
+ + if (input.entries.length > MAX_BATCH_ENTRIES) {
528
+ + return {
529
+ + ok: false,
530
+ + error: `Too many entries (${input.entries.length}); one call carries at most ${MAX_BATCH_ENTRIES}.`,
531
+ + };
532
+ + }
533
+ + const built: BatchEntryBuilt[] = [];
534
+ + const operations: BatchWriteOperation[] = [];
535
+ + for (const [i, raw] of input.entries.entries()) {
536
+ + const entry = (raw && typeof raw === "object" ? raw : {}) as BatchEntryInput;
537
+ + const one = buildWriteRequest({
538
+ + uri: entry.uri,
539
+ + content: entry.content,
540
+ + tags: entry.tags,
541
+ + mode: entry.mode,
542
+ + expect_hash: entry.expect_hash,
543
+ + });
544
+ + if (!one.ok) return { ok: false, error: `Entry ${i + 1}: ${one.error} Nothing was written.` };
545
+ + const op = one.request.operations[0]!;
546
+ + if (operations.some((o) => o.uri === op.uri)) {
547
+ + return { ok: false, error: `Entry ${i + 1}: "${op.uri}" appears twice in one batch.` };
548
+ + }
549
+ + operations.push(op);
550
+ + built.push({ uri: op.uri, body: one.body, hash: one.hash, tags: one.tags });
551
+ + }
552
+ + const root = commonParentUri(operations.map((o) => o.uri));
553
+ + if (!root) {
554
+ + return {
555
+ + ok: false,
556
+ + error: "The entries share no directory, so they cannot go in one batch — write them in separate calls.",
557
+ + };
558
+ + }
559
+ + return {
560
+ + ok: true,
561
+ + entries: built,
562
+ + request: { root_uri: root, operations, wait: input.wait === true },
563
+ + };
564
+ +}
565
+ diff --git a/extensions/vendor/openviking-pi/tools.ts b/extensions/vendor/openviking-pi/tools.ts
566
+ --- a/extensions/vendor/openviking-pi/tools.ts
567
+ +++ b/extensions/vendor/openviking-pi/tools.ts
568
+ @@ -2,8 +2,10 @@ import { Type } from "typebox";
569
+ import { StringEnum } from "@earendil-works/pi-ai";
570
+ import type { OVClient } from "./client.js";
571
+ import type { SyncManager } from "./sync.js";
572
+ -// [QCR PATCH 4]
573
+ -import { buildWriteRequest } from "./qcr-write.js";
574
+ +// [QCR PATCH 4] (the batch builder and its router are [QCR PATCH 6])
575
+ +import { buildBatchWriteRequest, routeWrite } from "./qcr-write.js";
576
+ +// [QCR PATCH 6]
577
+ +import { failureText, isNotFound, isPreconditionConflict } from "./qcr-honest.js";
578
+ // [QCR PATCH 5]
579
+ import { namespaceNote, ownNamespaceName, routeNamespace } from "./qcr-namespaces.js";
580
+
581
+ @@ -57,9 +59,13 @@ export function registerTools(
582
+ /** Every answer names the tree it came from — the model must never have to
583
+ * infer which memory it just touched. */
584
+ const scoped = (ns: ToolNamespace, text: string) => (multi ? `[${ns.name}] ${text}` : text);
585
+ - /** Route one call, or explain why it cannot be routed. */
586
+ - const pick = (params: any): { ok: true; ns: ToolNamespace } | { ok: false; error: string } => {
587
+ - const routed = routeNamespace(params ?? {}, names);
588
+ + /** Route one call, or explain why it cannot be routed. [QCR PATCH 6] The
589
+ + * write tool passes its own router: a batch routes by its entries. */
590
+ + const pick = (
591
+ + params: any,
592
+ + route: (p: any, n: readonly string[]) => ReturnType<typeof routeNamespace> = routeNamespace,
593
+ + ): { ok: true; ns: ToolNamespace } | { ok: false; error: string } => {
594
+ + const routed = route(params ?? {}, names);
595
+ if (!routed.ok) return { ok: false, error: routed.error };
596
+ return { ok: true, ns: spaces.find((s) => s.name.toLowerCase() === routed.namespace) ?? own };
597
+ };
598
+ @@ -92,10 +98,20 @@ export function registerTools(
599
+ if (!ns.client.connected) {
600
+ return { content: [{ type: "text", text: scoped(ns, "OpenViking server is not reachable.") }] };
601
+ }
602
+ - const results = await ns.client.find(params.query, {
603
+ + const res = await ns.client.find(params.query, {
604
+ targetUri: params.scope,
605
+ topK: params.limit ?? 10,
606
+ });
607
+ + // [QCR PATCH 6] A failure is said as one — never "No results found".
608
+ + if (!res.ok) {
609
+ + return {
610
+ + content: [{ type: "text", text: scoped(ns, failureText(res, "searched")) }],
611
+ + details: multi
612
+ + ? { namespace: ns.name, error: true, status: res.status }
613
+ + : { error: true, status: res.status },
614
+ + };
615
+ + }
616
+ + const results = res.result ?? [];
617
+ if (results.length === 0) {
618
+ return { content: [{ type: "text", text: scoped(ns, "No results found.") }] };
619
+ }
620
+ @@ -135,12 +151,20 @@ export function registerTools(
621
+ if (!ns.client.connected) {
622
+ return { content: [{ type: "text", text: scoped(ns, "OpenViking server is not reachable.") }] };
623
+ }
624
+ - let content: string | null = null;
625
+ - switch (params.level) {
626
+ - case "abstract": content = await ns.client.abstract(params.uri); break;
627
+ - case "overview": content = await ns.client.overview(params.uri); break;
628
+ - case "full": content = await ns.client.readContent(params.uri); break;
629
+ + // [QCR PATCH 6] One envelope-returning read: "No content" only when the
630
+ + // server said the path is not there (or holds nothing) — a refused key
631
+ + // or a dead server is named as such.
632
+ + const level = params.level === "abstract" || params.level === "overview" ? params.level : "full";
633
+ + const res = await ns.client.readLevel(params.uri, level);
634
+ + if (!res.ok && !isNotFound(res)) {
635
+ + return {
636
+ + content: [{ type: "text", text: scoped(ns, failureText(res, "read")) }],
637
+ + details: multi
638
+ + ? { namespace: ns.name, error: true, status: res.status }
639
+ + : { error: true, status: res.status },
640
+ + };
641
+ }
642
+ + const content = res.ok && typeof res.result === "string" ? res.result : "";
643
+ if (!content) {
644
+ return { content: [{ type: "text", text: scoped(ns, `No content at ${params.uri}`) }] };
645
+ }
646
+ @@ -175,12 +199,22 @@ export function registerTools(
647
+ }
648
+ const uri = params.uri ?? "viking://";
649
+ if (params.action === "stat") {
650
+ - const info = await ns.client.stat(uri);
651
+ + // [QCR PATCH 6] "Not found" only when it is not found.
652
+ + const st = await ns.client.statResponse(uri);
653
+ + if (!st.ok && !isNotFound(st)) {
654
+ + return { content: [{ type: "text", text: scoped(ns, failureText(st, "listed")) }] };
655
+ + }
656
+ + const info = st.ok ? st.result : null;
657
+ if (!info) return { content: [{ type: "text", text: scoped(ns, `Not found: ${uri}`) }] };
658
+ return { content: [{ type: "text", text: scoped(ns, JSON.stringify(info, null, 2)) }] };
659
+ }
660
+ // list
661
+ - const entries = await ns.client.ls(uri);
662
+ + // [QCR PATCH 6] "Empty directory" only when it IS empty (or absent).
663
+ + const listed = await ns.client.lsResponse(uri);
664
+ + if (!listed.ok && !isNotFound(listed)) {
665
+ + return { content: [{ type: "text", text: scoped(ns, failureText(listed, "listed")) }] };
666
+ + }
667
+ + const entries = listed.ok ? (listed.result ?? []) : [];
668
+ if (entries.length === 0) {
669
+ return { content: [{ type: "text", text: scoped(ns, `Empty directory: ${uri}`) }] };
670
+ }
671
+ @@ -210,20 +244,32 @@ export function registerTools(
672
+ name: "viking_write",
673
+ label: "Viking Write",
674
+ description:
675
+ - "Durably write a memory file to OpenViking (content/batch-write). Use this — not a session message — for anything that must survive the session: review lessons, project gotchas, decisions. mode 'create' fails if the file exists; mode 'replace' requires expect_hash and fails if the file changed since you read it. Returns the hash of what it wrote." + nsNote,
676
+ - promptSnippet: "Durably write a memory file to OpenViking",
677
+ + "Durably write memory files to OpenViking (content/batch-write). Use this — not a session message — for anything that must survive the session: review lessons, project gotchas, decisions. One entry: `uri` + `content`. Several (a day's lessons): `entries`, written as ONE batch that lands whole or not at all. mode 'create' fails if the file exists; mode 'replace' requires expect_hash and fails if the file changed since you read it. Returns the hash of what it wrote." + nsNote,
678
+ + promptSnippet: "Durably write memory files to OpenViking",
679
+ promptGuidelines: [
680
+ "Write one self-contained fact or lesson per file; a memory read months later has no conversation around it.",
681
+ + "Several entries at once go in ONE call as `entries` — never as parallel calls into the same directory.",
682
+ "Prefer mode 'create' with a fresh filename. Only 'replace' an entry you just read, passing its hash as expect_hash.",
683
+ - "A 409 means someone else edited the file — re-read it and decide, never retry blindly.",
684
+ + "A 409 REFUSED means the file changed (or already exists) — re-read it and decide, never retry blindly. A busy directory is retried for you; if it stays busy, try again in a minute.",
685
+ ...nsGuidelines,
686
+ ],
687
+ parameters: Type.Object({
688
+ - uri: Type.String({ description: "Target viking:// URI, ending in .md (e.g. 'viking://user/reviewer/memories/experiences/pr-5312-migration.md')" }),
689
+ - content: Type.String({ description: "Markdown body of the memory" }),
690
+ + uri: Type.Optional(Type.String({ description: "Target viking:// URI, ending in .md (e.g. 'viking://user/reviewer/memories/experiences/pr-5312-migration.md'). With `content`, for ONE entry." })),
691
+ + content: Type.Optional(Type.String({ description: "Markdown body of the memory (one entry)" })),
692
+ tags: Type.Optional(Type.Array(Type.String(), { description: "Convention tags without '#', e.g. ['pinned','review-ops']" })),
693
+ mode: Type.Optional(StringEnum(["create", "replace"] as const)),
694
+ expect_hash: Type.Optional(Type.String({ description: "Required for mode 'replace': sha256 of the CURRENT stored bytes" })),
695
+ + // [QCR PATCH 6] several entries, one batch-write under one root.
696
+ + entries: Type.Optional(Type.Array(
697
+ + Type.Object({
698
+ + uri: Type.String({ description: "Target viking:// URI, ending in .md" }),
699
+ + content: Type.String({ description: "Markdown body of the memory" }),
700
+ + tags: Type.Optional(Type.Array(Type.String())),
701
+ + mode: Type.Optional(StringEnum(["create", "replace"] as const)),
702
+ + expect_hash: Type.Optional(Type.String()),
703
+ + }),
704
+ + { description: "Several entries written as ONE batch (instead of uri + content). They must share a directory; the batch lands whole or not at all." },
705
+ + )),
706
+ wait: Type.Optional(Type.Boolean({ description: "Block until the search index is refreshed (slow — costs ~1.6 core-seconds). Default false; the bytes are durable either way." })),
707
+ ...nsParam,
708
+ }),
709
+ @@ -233,7 +279,9 @@ export function registerTools(
710
+ ) {
711
+ // [QCR PATCH 5] Route BEFORE building the request: a write under the
712
+ // wrong key is the one mistake here that is both silent and durable.
713
+ - const routed = pick(params);
714
+ + // [QCR PATCH 6] A batch routes by its entries' own addresses, every
715
+ + // one by the single-write rule, and may not straddle trees.
716
+ + const routed = pick(params, routeWrite);
717
+ if (!routed.ok) {
718
+ return { content: [{ type: "text", text: `${routed.error} Nothing was written.` }], details: { written: false } };
719
+ }
720
+ @@ -241,50 +289,65 @@ export function registerTools(
721
+ if (!ns.client.connected) {
722
+ return { content: [{ type: "text", text: scoped(ns, "OpenViking server is not reachable — nothing was written.") }] };
723
+ }
724
+ - const built = buildWriteRequest(params ?? {});
725
+ + const built = buildBatchWriteRequest(params ?? {});
726
+ if (!built.ok) {
727
+ return { content: [{ type: "text", text: built.error }], details: { written: false } };
728
+ }
729
+
730
+ const res = await ns.client.batchWrite(built.request);
731
+ if (!res.ok) {
732
+ + // [QCR PATCH 6] Only a PRECONDITION 409 is "someone edited this";
733
+ + // a busy directory was retried (and named as busy if it stayed so),
734
+ + // and a refused key is named as the outage it is.
735
+ + const conflict = isPreconditionConflict(res);
736
+ const message = res.error?.message || `HTTP ${res.status ?? 0}`;
737
+ - const conflict = res.status === 409;
738
+ return {
739
+ content: [{
740
+ type: "text",
741
+ text: scoped(ns, conflict
742
+ - ? `Write REFUSED (409): ${message} Nothing was written. Re-read ${built.request.operations[0]?.uri} and decide on the current content.`
743
+ - : `Write failed: ${message} Nothing was written.`),
744
+ + ? `Write REFUSED (409): ${message} Nothing was written. Re-read ${built.entries.map((e) => e.uri).join(", ")} and decide on the current content.`
745
+ + : failureText(res, "written")),
746
+ }],
747
+ details: multi
748
+ - ? { namespace: ns.name, written: false, status: res.status, conflict }
749
+ - : { written: false, status: res.status, conflict },
750
+ + ? { namespace: ns.name, written: false, status: res.status, conflict, busy: res.stillBusy }
751
+ + : { written: false, status: res.status, conflict, busy: res.stillBusy },
752
+ };
753
+ }
754
+
755
+ const result = res.result;
756
+ - const uri = built.request.operations[0]?.uri ?? "";
757
+ - const outcome = (result?.created ?? []).includes(uri)
758
+ - ? "created"
759
+ - : (result?.updated ?? []).includes(uri)
760
+ - ? "updated"
761
+ - : (result?.unchanged ?? []).includes(uri)
762
+ - ? "unchanged (byte-identical)"
763
+ - : "written";
764
+ - // Best effort, deliberately after the durable write and never fatal:
765
+ - // the tags are already in the body text.
766
+ - const tagged = built.tags.length > 0 ? await ns.client.setTags(uri, built.tags) : true;
767
+ - const details = { written: true, uri, outcome, hash: built.hash, tags: built.tags, tagged, result };
768
+ + const lines: string[] = [];
769
+ + const written: Array<Record<string, unknown>> = [];
770
+ + for (const entry of built.entries) {
771
+ + const outcome = (result?.created ?? []).includes(entry.uri)
772
+ + ? "created"
773
+ + : (result?.updated ?? []).includes(entry.uri)
774
+ + ? "updated"
775
+ + : (result?.unchanged ?? []).includes(entry.uri)
776
+ + ? "unchanged (byte-identical)"
777
+ + : "written";
778
+ + // Best effort, deliberately after the durable write and never fatal:
779
+ + // the tags are already in the body text.
780
+ + const tagged = entry.tags.length > 0 ? await ns.client.setTags(entry.uri, entry.tags) : true;
781
+ + written.push({ uri: entry.uri, outcome, hash: entry.hash, tags: entry.tags, tagged });
782
+ + lines.push(
783
+ + `${entry.uri} ${outcome}. hash=${entry.hash}` +
784
+ + (entry.tags.length > 0
785
+ + ? ` tags=${entry.tags.map((t) => `#${t}`).join(" ")}${tagged ? "" : " (body only — the retrieval tag list was not updated)"}`
786
+ + : ""),
787
+ + );
788
+ + }
789
+ + const single = built.entries.length === 1 ? written[0]! : null;
790
+ + const details = single
791
+ + ? { written: true, ...single, result, busyRetries: res.busyRetries }
792
+ + : { written: true, entries: written, result, busyRetries: res.busyRetries };
793
+ return {
794
+ content: [{
795
+ type: "text",
796
+ text: scoped(ns,
797
+ - `${uri} ${outcome}. hash=${built.hash}` +
798
+ - (built.tags.length > 0
799
+ - ? ` tags=${built.tags.map((t) => `#${t}`).join(" ")}${tagged ? "" : " (body only — the retrieval tag list was not updated)"}`
800
+ - : "") +
801
+ - " Pass that hash as expect_hash to replace this entry later."),
802
+ + lines.join("\n") +
803
+ + (built.entries.length === 1
804
+ + ? " Pass that hash as expect_hash to replace this entry later."
805
+ + : "\nPass an entry's hash as expect_hash to replace it later.")),
806
+ }],
807
+ details: multi ? { namespace: ns.name, ...details } : details,
808
+ };
809
+ diff --git a/extensions/vendor/openviking-pi/qcr-honest.ts b/extensions/vendor/openviking-pi/qcr-honest.ts
810
+ new file mode 100644
811
+ --- /dev/null
812
+ +++ b/extensions/vendor/openviking-pi/qcr-honest.ts
813
+ @@ -0,0 +1,183 @@
814
+ +// QCR FORK — file added by PATCH 6 (writes that stick, errors that say so).
815
+ +// Not upstream. S2.
816
+ +//
817
+ +// The pure half of three fixes, kept free of pi and of the OV client so
818
+ +// `tests/openviking-fork.test.ts` can exercise it (`tools.ts` cannot be
819
+ +// imported from a test: it pulls `typebox` and `@earendil-works/pi-ai`).
820
+ +//
821
+ +// 1. A BUSY 409 IS RETRIED, A PRECONDITION 409 IS NOT. The server's
822
+ +// batch-write takes a zero-timeout try-lock on its root directory; a
823
+ +// second writer into the same directory gets `409 CONFLICT` with
824
+ +// `details.conflict_type = "path_busy"` and `retryable: true` — nothing was
825
+ +// checked and nothing was written (server/error_mapping.py). The tool used
826
+ +// to tell the model "someone else edited the file — re-read it, never
827
+ +// retry", for a file nobody had touched: 6 of the 8 EOD writes on
828
+ +// 2026-10-05 died that way. `withBusyRetry` retries ONLY that answer,
829
+ +// jittered and bounded (≤10 s in total); a hash-precondition 409 carries
830
+ +// the same status and code but no `path_busy`, and stays a refusal.
831
+ +// 2. AN ERROR IS NEVER "NO RESULTS". `find()` turned every failure — a
832
+ +// refused key included — into an empty list, so `viking_search` said "No
833
+ +// results found." through five weeks of `Invalid API Key` (every PR-session
834
+ +// memory call in history returned that, or "No content at …").
835
+ +// `failureText` names what actually happened, and says plainly that it is
836
+ +// an outage, not an empty answer.
837
+ +// 3. A ROTATED KEY IS PICKED UP. The extension reads its key once, at load;
838
+ +// the daemon rewrites the sessions' ovcli.conf when its key changes
839
+ +// (S1), but a running session kept sending the dead one.
840
+ +// `shouldRekey` is the rule the client applies on an auth failure: re-read
841
+ +// the credential once, and retry once only if it actually changed.
842
+ +
843
+ +/** What a client answer looks like here — the `OVResponse` shape, loosened
844
+ + * so this file does not import the client. */
845
+ +export interface AnswerLike {
846
+ + ok: boolean;
847
+ + status?: number;
848
+ + error?: unknown;
849
+ +}
850
+ +
851
+ +/** The `details.conflict_type` the server stamps on a lock it could not take. */
852
+ +export const BUSY_CONFLICT_TYPE = "path_busy";
853
+ +
854
+ +/** Retry bound for a busy answer: at most `retries` more attempts, the n-th
855
+ + * after a jittered `min(capMs, baseMs·2ⁿ)` wait (half to all of it), never
856
+ + * past `budgetMs` from the first attempt. Mirrors the daemon client's
857
+ + * `BUSY_RETRY_DEFAULTS` (src/openviking/client.ts) — two processes, one rule. */
858
+ +export const BUSY_RETRY = Object.freeze({
859
+ + retries: 4,
860
+ + baseMs: 250,
861
+ + capMs: 2000,
862
+ + budgetMs: 10_000,
863
+ +});
864
+ +
865
+ +/** Is this answer the server's "directory busy, try again"? Keyed on
866
+ + * `details.conflict_type` alone — never the message, never the status alone. */
867
+ +export function isBusy(res: AnswerLike): boolean {
868
+ + if (res.ok || res.status !== 409) return false;
869
+ + const error = res.error;
870
+ + if (!error || typeof error !== "object") return false;
871
+ + const details = (error as { details?: unknown }).details;
872
+ + if (!details || typeof details !== "object") return false;
873
+ + return (details as { conflict_type?: unknown }).conflict_type === BUSY_CONFLICT_TYPE;
874
+ +}
875
+ +
876
+ +/** Is this answer a precondition refusal — a 409 that is NOT busy? */
877
+ +export function isPreconditionConflict(res: AnswerLike): boolean {
878
+ + return !res.ok && res.status === 409 && !isBusy(res);
879
+ +}
880
+ +
881
+ +/** The wait before busy retry `retry` (0-based). Pure — `random` injected. */
882
+ +export function busyDelay(retry: number, random: () => number = Math.random): number {
883
+ + const step = Math.min(BUSY_RETRY.capMs, BUSY_RETRY.baseMs * 2 ** Math.max(0, retry));
884
+ + const r = Math.min(1, Math.max(0, random()));
885
+ + return Math.round(step * (0.5 + r / 2));
886
+ +}
887
+ +
888
+ +export interface BusyRetryHooks {
889
+ + sleep?: (ms: number) => Promise<void>;
890
+ + random?: () => number;
891
+ + now?: () => number;
892
+ +}
893
+ +
894
+ +/** What `withBusyRetry` adds to the answer it returns. */
895
+ +export interface BusyRetryNote {
896
+ + /** How many busy answers were retried. */
897
+ + busyRetries: number;
898
+ + /** True when the LAST answer was still busy — the budget ran out. */
899
+ + stillBusy: boolean;
900
+ +}
901
+ +
902
+ +const defaultSleep = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));
903
+ +
904
+ +/**
905
+ + * Run `attempt` and retry it while — and only while — it answers busy, within
906
+ + * `BUSY_RETRY`. Safe for any request: a busy answer means the server took no
907
+ + * lock, so it checked and wrote nothing, and a repeat cannot double a write.
908
+ + */
909
+ +export async function withBusyRetry<T extends AnswerLike>(
910
+ + attempt: () => Promise<T>,
911
+ + hooks: BusyRetryHooks = {},
912
+ +): Promise<T & BusyRetryNote> {
913
+ + const sleep = hooks.sleep ?? defaultSleep;
914
+ + const random = hooks.random ?? Math.random;
915
+ + const now = hooks.now ?? Date.now;
916
+ + const started = now();
917
+ + for (let retry = 0; ; retry += 1) {
918
+ + const res = await attempt();
919
+ + if (!isBusy(res)) return { ...res, busyRetries: retry, stillBusy: false };
920
+ + const delay = busyDelay(retry, random);
921
+ + if (retry >= BUSY_RETRY.retries || now() - started + delay > BUSY_RETRY.budgetMs) {
922
+ + return { ...res, busyRetries: retry, stillBusy: true };
923
+ + }
924
+ + await sleep(delay);
925
+ + }
926
+ +}
927
+ +
928
+ +/** Server error codes that mean "this key does not authenticate here". */
929
+ +const AUTH_CODES = new Set([
930
+ + "UNAUTHENTICATED",
931
+ + "UNAUTHORIZED",
932
+ + "PERMISSION_DENIED",
933
+ + "FORBIDDEN",
934
+ + "INVALID_API_KEY",
935
+ +]);
936
+ +
937
+ +function errorField(error: unknown, field: "code" | "message"): string {
938
+ + if (!error || typeof error !== "object") return "";
939
+ + const v = (error as Record<string, unknown>)[field];
940
+ + return typeof v === "string" ? v : "";
941
+ +}
942
+ +
943
+ +/** A refused key: 401/403, an auth code, or the 0.4.15 server's own words
944
+ + * ("Invalid API Key"), which it has been seen to send inside an error
945
+ + * envelope. Same rule as the daemon's `isAuthFailure`. */
946
+ +export function isAuthFailure(res: AnswerLike): boolean {
947
+ + if (res.ok) return false;
948
+ + if (res.status === 401 || res.status === 403) return true;
949
+ + if (AUTH_CODES.has(errorField(res.error, "code").toUpperCase())) return true;
950
+ + return /invalid api key|unauthenticated|unauthori[sz]ed/i.test(errorField(res.error, "message"));
951
+ +}
952
+ +
953
+ +/** Should an auth failure be retried with a re-read key? Only once, and only
954
+ + * when the credential source actually yields a DIFFERENT, non-empty key —
955
+ + * re-sending the refused one would just be a second refusal. */
956
+ +export function shouldRekey(res: AnswerLike, current: string, reread: string): boolean {
957
+ + return isAuthFailure(res) && reread !== "" && reread !== current;
958
+ +}
959
+ +
960
+ +/** Is this answer a NOT_FOUND — the path is not there (an authenticated
961
+ + * answer, not an outage)? */
962
+ +export function isNotFound(res: AnswerLike): boolean {
963
+ + return !res.ok && (res.status === 404 || errorField(res.error, "code") === "NOT_FOUND");
964
+ +}
965
+ +
966
+ +/**
967
+ + * The honest sentence for a failed call, rendered to the model verbatim.
968
+ + * `what` completes "nothing was …" — `searched`, `read`, `listed`, `written`.
969
+ + * Never "No results found": an outage must not read like an empty memory.
970
+ + */
971
+ +export function failureText(res: AnswerLike & Partial<BusyRetryNote>, what: string): string {
972
+ + const status = res.status ?? 0;
973
+ + const code = errorField(res.error, "code");
974
+ + const message = errorField(res.error, "message").slice(0, 300);
975
+ + const said = [status ? `HTTP ${status}` : "", code].filter((x) => x !== "").join(" ");
976
+ + if (isAuthFailure(res)) {
977
+ + return (
978
+ + `OpenViking REFUSED this session's key (${said || "auth"}${message ? `: ${message}` : ""}) — ` +
979
+ + `memory is unavailable to this session, so nothing was ${what}. ` +
980
+ + "This is an outage, not an empty result; the daemon's memory health reports it."
981
+ + );
982
+ + }
983
+ + if (isBusy(res) || res.stillBusy) {
984
+ + return (
985
+ + `OpenViking kept that memory directory busy (409 ${BUSY_CONFLICT_TYPE}) past the retry budget — ` +
986
+ + `nothing was ${what}. Nobody's edit was refused: another write held the lock. Try again in a minute.`
987
+ + );
988
+ + }
989
+ + if (status === 0) {
990
+ + return (
991
+ + `OpenViking did not answer (${message || "no response"}) — nothing was ${what}. ` +
992
+ + "This is an outage, not an empty result."
993
+ + );
994
+ + }
995
+ + return `OpenViking error (${said}${message ? `: ${message}` : ""}) — nothing was ${what}.`;
996
+ +}