@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,953 @@
1
+ // The bot's per-round worker: one Node process that serves ONE round
2
+ // of one PR and exits.
3
+ //
4
+ // node dist/src/botworker.js --command <id> --mode round|answer
5
+ //
6
+ // `--mode answer` (rule 9's second exception) serves an operator's message
7
+ // to an idle PR instead of a round: the same handshake, login and resume under the
8
+ // same session id, then ONE user turn marked with operator provenance, and the
9
+ // reply goes back in the `done` event. Its tools are the read-only repo tools and
10
+ // the memory lookups (src/engine/botsdk.ts `answer`), no lens tool, no verdict,
11
+ // and no wave, wake or permit: the daemon's own wakes stay held for the round.
12
+ // Only a message the operator marked may-post also gets bash, for the post
13
+ // scripts, and the capability they read; the daemon refuses any other post in any
14
+ // case. It compacts before it exits like a round, and the daemon bounds it by
15
+ // `[daemon] answer_timeout_s` and `answer_cap_usd`. The numbered round below is the
16
+ // round mode's; an answer runs 1 to 3, the one turn, then 6 and 7.
17
+ //
18
+ // The daemon starts it with the command's capability on an inherited fd
19
+ // (QCR_IPC_CAP_FD, src/ipc/capability.ts), the socket path, the command id and
20
+ // the generation in env (QCR_IPC_*), and a small allowlisted env of its own. It
21
+ // holds no GitHub credential (rule 3: the bot mints per command, and every post
22
+ // goes to the daemon's one gate over the socket) and it never opens state.db:
23
+ // what it needs to know arrives through `worker.spec`, what it records goes
24
+ // back as events, and the held wakes come through `wakes.take`
25
+ // (src/ipc/workerspec.ts). tests/botworker-fence.test.ts holds the last claim
26
+ // by walking the import closure.
27
+ //
28
+ // A round, in order:
29
+ // 1. connect, ask for the spec, and verify the payload against the sha256 the
30
+ // daemon recorded at dispatch;
31
+ // 2. borrow the login: a refresh-blanked copy read once from the agent dir the
32
+ // login refresher owns, refused when the token would expire inside
33
+ // this worker's wall-clock cap. The worker never refreshes it;
34
+ // 3. open the PR's session: resume the newest JSONL under its session dir
35
+ // under the SAME id (the provider's cache key), or start one at birth;
36
+ // 4. start the planned discovery wave (the engine, rule 9), then send the
37
+ // round order. A JSONL that already holds this command's marker means an
38
+ // earlier worker took the order: this worker continues instead of sending
39
+ // it again (marker idempotency, as the inject bridge's receipt works);
40
+ // 5. deliver the wakes held while the round ran, in arrival order;
41
+ // 6. compact (ledger-pin pins the review ledger through pi's own compact());
42
+ // 7. report usage and done, and exit.
43
+ //
44
+ // Throughout, the daemon may push the operator's controls (src/botcontrol.ts):
45
+ // a steer lands in the turn in flight, a follow-up behind the run, an abort stops the
46
+ // session and the passes it started and ends the round with the aborted exit code.
47
+ // Each is acked once over `control.ack`. The turns a control starts are waited for
48
+ // before the wakes and again before the compaction.
49
+ //
50
+ // Exit codes: 0 the round was served (a verdict may or may not have been
51
+ // written: `done` says), 1 a turn failed (timeout, cap, stream, refused
52
+ // login), 2 bad usage, 3 the handshake or the
53
+ // payload could not be trusted, 4 the login was refused up front, 5 the session
54
+ // could not be opened, 6 the operator aborted the round, 75 the daemon went away, 76 the daemon fenced this
55
+ // worker (a stale generation or an inactive command), 143 terminated.
56
+ import { existsSync, readFileSync } from "node:fs";
57
+ import { homedir } from "node:os";
58
+ import { join } from "node:path";
59
+ import { EventCostMeter } from "./bench/cost.js";
60
+ import { CONTEXT_PACK_FILE } from "@quickchatai/pi-quickreview/src/contextpack.js";
61
+ import {
62
+ AuthError,
63
+ classifyAuthFailure,
64
+ engineCredentials,
65
+ type EngineAuth,
66
+ } from "@quickchatai/pi-quickreview/src/engine/auth.js";
67
+ import { agentDirSettings } from "@quickchatai/pi-quickreview/src/engine/agentdir.js";
68
+ import { COMMIT_VERDICT_RE } from "./engine/answerguard.js";
69
+ import { NO_LENS, botSdkRuntime } from "./engine/botsdk.js";
70
+ import {
71
+ engineLensTools,
72
+ type EngineLensTools,
73
+ } from "@quickchatai/pi-quickreview/src/engine/lens/engine-tools.js";
74
+ import type { Permits } from "@quickchatai/pi-quickreview/src/engine/lens/permits.js";
75
+ import type { LensRunConfig } from "@quickchatai/pi-quickreview/src/engine/lens/runlens.js";
76
+ import {
77
+ planLaunch,
78
+ type LaunchUnit,
79
+ } from "@quickchatai/pi-quickreview/src/engine/lens/launch-plan.js";
80
+ import { engineLensSection } from "@quickchatai/pi-quickreview/src/engine/lens/section.js";
81
+ import {
82
+ LensWave,
83
+ launchWave,
84
+ type WaveRow,
85
+ } from "@quickchatai/pi-quickreview/src/engine/lens/wave.js";
86
+ import type { LensRun } from "@quickchatai/pi-quickreview/src/engine/lens/runlens.js";
87
+ import { stopLiveSessions } from "@quickchatai/pi-quickreview/src/engine/livesessions.js";
88
+ import {
89
+ LENS_LEDGER_FILE,
90
+ LENS_SESSIONS_DIR,
91
+ } from "@quickchatai/pi-quickreview/src/engine/openable.js";
92
+ import {
93
+ PiHost,
94
+ headerId,
95
+ type PiHostOptions,
96
+ } from "@quickchatai/pi-quickreview/src/engine/pisdk.js";
97
+ import type {
98
+ RuntimeSession,
99
+ SessionSpec,
100
+ TurnOptions,
101
+ TurnResult,
102
+ } from "@quickchatai/pi-quickreview/src/engine/port.js";
103
+ import { engineLensConfig } from "@quickchatai/pi-quickreview/src/engine/reviewsdk.js";
104
+ import {
105
+ credentialPaths,
106
+ loginSourceDirs,
107
+ } from "@quickchatai/pi-quickreview/src/engine/toolfence.js";
108
+ import {
109
+ TOOL_UMASK,
110
+ checkToolUid,
111
+ toolIdsOf,
112
+ } from "@quickchatai/pi-quickreview/src/engine/tooluid.js";
113
+ import { connectFromEnv, type IpcClient } from "./ipc/client.js";
114
+ import { brokerPermits } from "./ipc/permits.js";
115
+ import { IpcError, type IpcEventKind } from "./ipc/protocol.js";
116
+ import {
117
+ WAKES_ACK_OP,
118
+ WAKES_TAKE_OP,
119
+ WORKER_MODES,
120
+ WORKER_SPEC_OP,
121
+ parseWakesTaken,
122
+ parseWorkerSpec,
123
+ lensDirOf,
124
+ roundPassesDir,
125
+ type WorkerMode,
126
+ type WorkerSpec,
127
+ } from "./ipc/workerspec.js";
128
+ import { WorkerControls, ackSender } from "./botcontrol.js";
129
+ import { MAX_REPLY_CHARS, operatorMayPost } from "./operatormessage.js";
130
+ import { sessionCommandMarker } from "@quickchatai/pi-quickreview/src/session-command.js";
131
+ import { verifiedPayload } from "./session-command-payload.js";
132
+ import { newestSessionFile } from "./sessionjsonl.js";
133
+
134
+ export const EXIT = {
135
+ ok: 0,
136
+ failed: 1,
137
+ usage: 2,
138
+ handshake: 3,
139
+ auth: 4,
140
+ session: 5,
141
+ aborted: 6,
142
+ lost: 75,
143
+ fenced: 76,
144
+ terminated: 143,
145
+ } as const;
146
+
147
+ /** The most rounds of `wakes.take` one worker serves: wakes that arrive while it
148
+ * delivers are served too, but a flood cannot keep a round open for ever. */
149
+ const MAX_WAKE_PASSES = 20;
150
+ /** How long the round waits for the wave's rows to settle once it has ended
151
+ * them (each ends its session and writes its ledger line). */
152
+ const WAVE_SETTLE_MS = 15_000;
153
+ const DEFAULT_HEARTBEAT_MS = 15_000;
154
+ /** A turn is never given less than this, so a nearly spent cap still runs it. */
155
+ const MIN_TURN_MS = 1_000;
156
+ /** The names of the worker's own env the main session's bash needs for the post
157
+ * shims (src/ipc/postshim.ts). Never given to a lens pass. */
158
+ const IPC_ENV = [
159
+ "QCR_IPC_SOCKET",
160
+ "QCR_IPC_CAP_FD",
161
+ "QCR_IPC_COMMAND_ID",
162
+ "QCR_IPC_GENERATION",
163
+ ] as const;
164
+
165
+ /** The names of a round's identity in the session env. An answer has no round, so
166
+ * the model's bash (and the post scripts it may run) carries none of them: a post
167
+ * would claim a round and the daemon would refuse it. */
168
+ const ROUND_ONLY_ENV = ["QCR_ROUND_NO", "QCR_EXPECTED_HEAD", "QCR_POSTING_KEY"] as const;
169
+
170
+ export interface WorkerArgs {
171
+ command: string;
172
+ mode: WorkerMode;
173
+ }
174
+
175
+ export function parseWorkerArgs(argv: readonly string[]): WorkerArgs | { error: string } {
176
+ let command: string | undefined;
177
+ let mode: string | undefined;
178
+ for (let i = 0; i < argv.length; i++) {
179
+ const a = argv[i];
180
+ if (a === "--command") command = argv[++i];
181
+ else if (a === "--mode") mode = argv[++i];
182
+ else return { error: `unknown argument ${JSON.stringify(a)}` };
183
+ }
184
+ if (!command) return { error: "--command <id> is required" };
185
+ if (!mode || !WORKER_MODES.includes(mode as WorkerMode))
186
+ return { error: "--mode must be round or answer" };
187
+ return { command, mode: mode as WorkerMode };
188
+ }
189
+
190
+ export interface WorkerDeps {
191
+ /** The worker's own process env. */
192
+ env: NodeJS.ProcessEnv;
193
+ /** Opens the daemon connection. Omitted: from env and the inherited fd. */
194
+ connect?: () => Promise<IpcClient>;
195
+ /** Builds the host (test seam: the faux provider). Omitted: a PiHost that
196
+ * owns this process, over the spec's agent dir and the borrowed login. */
197
+ makeHost?: (options: PiHostOptions) => Promise<PiHost>;
198
+ /** Test seam over the OpenViking config the session's extension is given. */
199
+ openViking?: Parameters<typeof botSdkRuntime>[1]["openViking"];
200
+ now?: () => number;
201
+ /** Diagnostics: one line, no secret. */
202
+ log?: (line: string) => void;
203
+ }
204
+
205
+ /** A user turn's closing marker, in the inject bridge's own spelling. */
206
+ function withMarker(text: string, marker: string): string {
207
+ return `${text}${text.endsWith("\n") ? "\n" : "\n\n"}${marker}`;
208
+ }
209
+
210
+ export const wakeMarker = (batchId: string): string => `<!-- qcr-wake:${batchId} -->`;
211
+
212
+ /** What a continuing worker tells the session. */
213
+ export function continuationText(marker: string): string {
214
+ return [
215
+ "The worker that was running this round stopped before the round finished; this conversation is intact. Carry on from where it stopped.",
216
+ "",
217
+ "Before you repeat a step, check what the round already produced: files you wrote, lens results you read, a review that was posted. Never post the same review twice (the post scripts tell you when it is already posted). A planned lens whose result you did not read ran in the worker that is gone: run `lens_wave` over the round's task directory again for it.",
218
+ "",
219
+ `The round order is the message above that carries ${marker}.`,
220
+ ].join("\n");
221
+ }
222
+
223
+ /** What a continuing answer worker tells the session. */
224
+ export function answerContinuationText(marker: string): string {
225
+ return [
226
+ "The worker that was answering the operator's message stopped before it finished; this conversation is intact. Finish the answer.",
227
+ "",
228
+ "Before you repeat a step, check what is already done: a review or reply you posted stays posted (the post scripts tell you when it is). Never post the same thing twice.",
229
+ "",
230
+ `The operator's message is the one above that carries ${marker}.`,
231
+ ].join("\n");
232
+ }
233
+
234
+ /** Does the session JSONL already hold `marker`? An unreadable file holds none. */
235
+ export function jsonlHasMarker(file: string, marker: string): boolean {
236
+ try {
237
+ return readFileSync(file, "utf8").includes(marker);
238
+ } catch {
239
+ return false;
240
+ }
241
+ }
242
+
243
+ const POST_RE = /(?:^|[\s/;&|(])(post-review|approve-pr|reply-thread)\.sh(?:\s|$)/;
244
+
245
+ /** What the daemon wants to know of the session's work: a verdict committed, a
246
+ * post made, and whether the model's last answer was the provider's failure.
247
+ * Observed off the session's events, the way the supervisor reads a round's
248
+ * progress, never off files. */
249
+ class RoundWatch {
250
+ verdictWritten = false;
251
+ posted = 0;
252
+ /** The provider's error on the newest assistant message, if that is how it ended. */
253
+ lastError: string | undefined;
254
+ /** The text of the newest assistant message that did not end in a tool call:
255
+ * what the model said last, which is an answer's reply. */
256
+ replyText: string | undefined;
257
+ private readonly commands = new Map<string, string>();
258
+
259
+ constructor(private readonly report: (kind: IpcEventKind, body?: unknown) => void) {}
260
+
261
+ hear(event: Record<string, unknown>): void {
262
+ if (event["type"] === "message_end") {
263
+ const message = event["message"] as
264
+ { role?: unknown; stopReason?: unknown; errorMessage?: unknown } | undefined;
265
+ if (message?.role === "assistant") {
266
+ const full = event["message"] as { content?: unknown; stopReason?: unknown };
267
+ if (full.stopReason !== "toolUse" && full.stopReason !== "error")
268
+ this.replyText = textOf(full.content);
269
+ }
270
+ if (message?.role === "assistant")
271
+ this.lastError =
272
+ message.stopReason === "error"
273
+ ? (typeof message.errorMessage === "string"
274
+ ? message.errorMessage
275
+ : "the provider returned an error"
276
+ ).slice(0, 300)
277
+ : undefined;
278
+ return;
279
+ }
280
+ const id = event["toolCallId"];
281
+ if (typeof id !== "string") return;
282
+ if (event["type"] === "tool_execution_start" && event["toolName"] === "bash") {
283
+ const command = (event["args"] as { command?: unknown } | null | undefined)?.command;
284
+ if (typeof command === "string") this.commands.set(id, command);
285
+ return;
286
+ }
287
+ if (event["type"] !== "tool_execution_end") return;
288
+ const command = this.commands.get(id);
289
+ this.commands.delete(id);
290
+ if (command === undefined || event["isError"] !== false) return;
291
+ if (COMMIT_VERDICT_RE.test(command)) {
292
+ this.verdictWritten = true;
293
+ this.report("verdict_written", {});
294
+ }
295
+ const post = POST_RE.exec(command);
296
+ if (post) {
297
+ this.posted++;
298
+ this.report("posted", { script: `${post[1]}.sh` });
299
+ }
300
+ }
301
+ }
302
+
303
+ /** The text blocks of an assistant message's content, joined. */
304
+ function textOf(content: unknown): string {
305
+ if (typeof content === "string") return content;
306
+ if (!Array.isArray(content)) return "";
307
+ return content
308
+ .flatMap((b: unknown) =>
309
+ typeof b === "object" &&
310
+ b !== null &&
311
+ (b as { type?: unknown }).type === "text" &&
312
+ typeof (b as { text?: unknown }).text === "string"
313
+ ? [(b as { text: string }).text]
314
+ : [],
315
+ )
316
+ .join("\n")
317
+ .trim();
318
+ }
319
+
320
+ /** `: <the file's last line>` for a failure's reason, or nothing. */
321
+ function lastLineOf(file: string): string {
322
+ try {
323
+ const line = readFileSync(file, "utf8").trimEnd().split("\n").at(-1)?.trim();
324
+ return line ? `: ${line.slice(0, 300)}` : "";
325
+ } catch {
326
+ return "";
327
+ }
328
+ }
329
+
330
+ class Stop extends Error {
331
+ constructor(
332
+ readonly exit: number,
333
+ readonly reason: string,
334
+ ) {
335
+ super(reason);
336
+ }
337
+ }
338
+
339
+ /** The PR's session, opened. */
340
+ interface Opened {
341
+ session: RuntimeSession;
342
+ /** The round's lens tools; none for an answer worker. */
343
+ tools: EngineLensTools | undefined;
344
+ resumed: boolean;
345
+ /** The JSONL it was resumed from; undefined at birth. */
346
+ file: string | undefined;
347
+ /** The JSONL already holds this command's marker: an earlier worker took the order. */
348
+ continuing: boolean;
349
+ }
350
+
351
+ /** Serve one round. Resolves to the exit code; a failed round is a returned
352
+ * code and a `failed` event, never a throw. */
353
+ export async function runBotWorker(args: WorkerArgs, deps: WorkerDeps): Promise<number> {
354
+ const log = deps.log ?? ((): void => {});
355
+ const now = deps.now ?? Date.now;
356
+ const env = deps.env;
357
+ const answering = args.mode === "answer";
358
+ if (env["QCR_IPC_COMMAND_ID"] !== args.command) {
359
+ log("botworker: --command is not the command id the daemon put in env");
360
+ return EXIT.usage;
361
+ }
362
+
363
+ let client: IpcClient;
364
+ try {
365
+ client = await (deps.connect ?? (() => connectFromEnv("worker", env)))();
366
+ } catch (e) {
367
+ log(`botworker: could not reach the daemon: ${errText(e)}`);
368
+ return EXIT.lost;
369
+ }
370
+
371
+ let broken = false;
372
+ const report = (kind: IpcEventKind, body?: unknown): void => {
373
+ if (broken) return;
374
+ try {
375
+ client.event(kind, body);
376
+ } catch {
377
+ broken = true;
378
+ }
379
+ };
380
+
381
+ // A daemon that restarts takes the socket with it: there is nobody left
382
+ // to post for this worker, so it stops spending. The same for a daemon that
383
+ // fences it (a newer generation, a command that is no longer active).
384
+ let stopCode: number | undefined;
385
+ let stopReason = "stopped";
386
+ let stopped: Promise<void> = Promise.resolve();
387
+ let session: RuntimeSession | undefined;
388
+ const stopNow = (code: number, why: string): Promise<void> => {
389
+ if (stopCode !== undefined) return stopped;
390
+ stopCode = code;
391
+ stopReason = why;
392
+ log(`botworker: stopping (${why})`);
393
+ stopped = (session?.abort() ?? Promise.resolve())
394
+ .catch(() => {})
395
+ .then(() => stopLiveSessions(5_000))
396
+ .catch(() => {});
397
+ return stopped;
398
+ };
399
+ const checkpoint = (): void => {
400
+ if (stopCode !== undefined) throw new Stop(stopCode, stopReason);
401
+ };
402
+ client.onClose((e) => void stopNow(EXIT.lost, `the daemon connection ended: ${e.message}`));
403
+ client.onError((e) => {
404
+ if (e.code === "stale_generation" || e.code === "command_inactive" || e.code === "unauthorized")
405
+ void stopNow(EXIT.fenced, `the daemon fenced this worker: ${e.code}`);
406
+ });
407
+ // The operator's controls. They are taken from the moment the daemon
408
+ // connects: one that arrives before the session is open is refused, not lost.
409
+ let turnLimits: () => TurnOptions = () => ({});
410
+ const controls = new WorkerControls({
411
+ session: () => session,
412
+ limits: () => turnLimits(),
413
+ abort: () => stopNow(EXIT.aborted, "the round was aborted by the operator"),
414
+ ack: ackSender((op, body) => client.request(op, body)),
415
+ log,
416
+ });
417
+ client.onControl((kind, body) => controls.receive(kind, body));
418
+
419
+ let host: PiHost | undefined;
420
+ let beat: ReturnType<typeof setInterval> | undefined;
421
+ let endWave: () => Promise<void> = async () => {};
422
+ const started = now();
423
+ try {
424
+ const spec = await handshake(client, args);
425
+ const deadline = started + spec.wall_clock_ms;
426
+ const remaining = (): number => Math.max(MIN_TURN_MS, deadline - now());
427
+
428
+ // The payload is what the daemon dispatched, byte for byte, or nothing runs.
429
+ const verified = verifiedPayload(
430
+ { payload_path: spec.payload_path, payload_sha256: spec.payload_sha256 },
431
+ "the command's payload",
432
+ );
433
+ if (!verified.ok) throw new Stop(EXIT.handshake, verified.why);
434
+ // An answer posts only when the operator marked the message: the daemon's word
435
+ // (the spec) and the sealed payload both have to say so.
436
+ const mayPost =
437
+ answering && spec.may_post === true && operatorMayPost(verified.payload.toString("utf8"));
438
+
439
+ // The login: borrowed, blanked, and checked against this worker's own cap.
440
+ let auth: EngineAuth;
441
+ try {
442
+ auth = engineCredentials({ srcDir: spec.agent_dir, needMs: spec.wall_clock_ms, now });
443
+ } catch (e) {
444
+ if (e instanceof AuthError) throw new Stop(EXIT.auth, e.message);
445
+ throw e;
446
+ }
447
+ checkpoint();
448
+
449
+ // The host, the lens tools and the session. The model's tools run as the
450
+ // tool uid wherever the image asks for it.
451
+ const wave = new LensWave();
452
+ let lensUsd = 0;
453
+ let lensRuns = 0;
454
+ const marker = sessionCommandMarker(spec.command_id, spec.payload_sha256);
455
+ let opened: Opened;
456
+ try {
457
+ checkToolUid(env, { what: "the bot worker", instead: "", isolated: true });
458
+ const ids = toolIdsOf(env);
459
+ host = await (deps.makeHost ?? PiHost.create)({
460
+ agentDir: spec.agent_dir,
461
+ ownsProcess: true,
462
+ homeDir: homedir(),
463
+ ...(ids !== null && !("refused" in ids) ? { toolUid: ids } : {}),
464
+ fenceDirs: [...loginSourceDirs(env), ...credentialPaths(env, spec.env)],
465
+ credentials: auth.credentials,
466
+ settings: agentDirSettings(spec.agent_dir),
467
+ });
468
+ // The lens cap is the daemon's, over every worker: a pass asks the broker.
469
+ const permits = brokerPermits(client, (m) => log(`botworker: ${m}`));
470
+ opened = await openSession(
471
+ host,
472
+ spec,
473
+ env,
474
+ wave,
475
+ marker,
476
+ deps,
477
+ log,
478
+ permits,
479
+ (run) => {
480
+ lensUsd += run.result.usage.cost;
481
+ lensRuns++;
482
+ },
483
+ answering ? { mayPost } : undefined,
484
+ );
485
+ } catch (e) {
486
+ throw new Stop(EXIT.session, `could not open the session: ${errText(e)}`);
487
+ }
488
+ const { tools, resumed, continuing } = opened;
489
+ const live = opened.session;
490
+ session = live;
491
+ checkpoint();
492
+
493
+ const watch = new RoundWatch(report);
494
+ let accepted = false;
495
+ live.subscribe((event) => {
496
+ if (!accepted && event["type"] === "agent_start") {
497
+ accepted = true;
498
+ report("accepted", { command_id: spec.command_id, continued: continuing });
499
+ }
500
+ watch.hear(event);
501
+ });
502
+ report("ready", {
503
+ session_id: live.id,
504
+ session_file: opened.file ?? null,
505
+ resumed,
506
+ continued: continuing,
507
+ });
508
+ beat = setInterval(
509
+ () =>
510
+ report("progress", {
511
+ stage: "heartbeat",
512
+ turns: live.stats().turns,
513
+ busy: live.stats().busy,
514
+ }),
515
+ spec.heartbeat_ms ?? DEFAULT_HEARTBEAT_MS,
516
+ );
517
+ beat.unref();
518
+
519
+ turnLimits = () => ({
520
+ timeoutMs: remaining(),
521
+ ...(spec.cap_usd !== undefined
522
+ ? { capUsd: Math.max(0, spec.cap_usd - live.stats().spentUsd) }
523
+ : {}),
524
+ });
525
+ // What the round has cost, priced the way the transcript is (src/bench/cost.ts):
526
+ // the session's assistant messages and the passes its lens tools reported, each
527
+ // run once, and, at the end, the lens ledger's warm-ups. The daemon's est_usd
528
+ // takes it in place of measuring the transcript.
529
+ const meter = new EventCostMeter();
530
+ live.subscribe(
531
+ (event) => {
532
+ const type = event["type"];
533
+ if (
534
+ type === "message_end" ||
535
+ type === "tool_execution_update" ||
536
+ type === "tool_execution_end"
537
+ )
538
+ meter.add(JSON.stringify(event));
539
+ },
540
+ { updates: true },
541
+ );
542
+ const usage = (): void =>
543
+ report("usage", {
544
+ total_usd: meter.totalUsd,
545
+ lens_usd: lensUsd,
546
+ lens_runs: lensRuns,
547
+ turns: live.stats().turns,
548
+ });
549
+ const settle = (r: TurnResult, what: string): void => {
550
+ usage();
551
+ checkpoint();
552
+ if (r.timedOut) throw new Stop(EXIT.failed, `${what}: the wall-clock cap ran out`);
553
+ if (r.capped) throw new Stop(EXIT.failed, `${what}: the dollar cap was reached`);
554
+ if (r.streamError)
555
+ throw new Stop(
556
+ EXIT.failed,
557
+ `${what}: output stream failed: ${r.streamError.slice(0, 300)}`,
558
+ );
559
+ // A provider failure ends the turn as an assistant message, not as a throw.
560
+ if (watch.lastError !== undefined) {
561
+ const refused = classifyAuthFailure(watch.lastError);
562
+ throw new Stop(
563
+ EXIT.failed,
564
+ refused
565
+ ? `${what}: the provider refused the login: ${refused.message}`
566
+ : `${what}: the provider failed the turn: ${watch.lastError}`,
567
+ );
568
+ }
569
+ if (r.code !== 0)
570
+ throw new Stop(EXIT.failed, `${what}: the turn failed${lastLineOf(spec.stderr_file)}`);
571
+ };
572
+ const deliver = async (text: string, what: string): Promise<void> => {
573
+ const d = await live.followUp(text, turnLimits());
574
+ if (d.status === "queued") {
575
+ // An operator's turn is in flight, and this message runs behind it: its
576
+ // result is the session's last once nothing is queued.
577
+ await controls.drain();
578
+ const last = live.stats().last;
579
+ if (last === null) throw new Stop(EXIT.failed, `${what}: the message was not run (queued)`);
580
+ settle(last, what);
581
+ return;
582
+ }
583
+ if (d.status !== "handled")
584
+ throw new Stop(EXIT.failed, `${what}: the message was not run (${d.status})`);
585
+ settle(d.result, what);
586
+ };
587
+ // The turns an operator's control started: settled before the round goes on.
588
+ let controlsChecked = 0;
589
+ const settleControls = async (close: boolean): Promise<void> => {
590
+ await (close ? controls.drainAndClose() : controls.drain());
591
+ checkpoint();
592
+ const taken = controls.counts.steer + controls.counts.follow_up;
593
+ const last = live.stats().last;
594
+ if (last !== null && taken > controlsChecked) settle(last, "the operator's message");
595
+ controlsChecked = taken;
596
+ };
597
+
598
+ // The round's turn. The engine starts the planned wave first, so the lenses
599
+ // are in flight while the session reads. A continuation does not: the rows ran
600
+ // in the worker that is gone, and the session is told so. An answer is one
601
+ // turn: the operator's message, no wave and no wakes (the daemon's own wakes
602
+ // stay held for the round).
603
+ let wakesDelivered = 0;
604
+ if (answering) {
605
+ const message = verified.payload.toString("utf8");
606
+ if (continuing) {
607
+ report("progress", { stage: "continuing" });
608
+ await deliver(answerContinuationText(marker), "the continuation");
609
+ } else {
610
+ report("progress", { stage: "message_sent" });
611
+ settle(await live.prompt(withMarker(message, marker), turnLimits()), "the answer");
612
+ }
613
+ } else {
614
+ if (continuing) {
615
+ report("progress", { stage: "continuing" });
616
+ await deliver(continuationText(marker), "the continuation");
617
+ } else {
618
+ const planned = plannedWave(spec, env);
619
+ if (planned.note) log(`botworker: ${planned.note}`);
620
+ const section = engineLensSection(
621
+ planned.dir,
622
+ spec.planned_wave && planned.units.length
623
+ ? { dir: planned.dir, agents: planned.units.map((u) => u.agent) }
624
+ : null,
625
+ );
626
+ if (spec.planned_wave && planned.units.length) {
627
+ const stop = new AbortController();
628
+ if (tools === undefined)
629
+ throw new Stop(EXIT.session, "a round opens with its lens tools");
630
+ const rows: WaveRow[] = launchWave(wave, tools.runner, planned.units, stop.signal);
631
+ report("progress", { stage: "wave_started", rows: rows.length });
632
+ endWave = async () => {
633
+ stop.abort();
634
+ let timer: NodeJS.Timeout | undefined;
635
+ await Promise.race([
636
+ Promise.allSettled(rows.map((row) => row.done)),
637
+ new Promise((resolve) => (timer = setTimeout(resolve, WAVE_SETTLE_MS))),
638
+ ]);
639
+ clearTimeout(timer);
640
+ endWave = async () => {};
641
+ };
642
+ }
643
+ const order = verified.payload.toString("utf8");
644
+ report("progress", { stage: "round_order_sent" });
645
+ settle(
646
+ await live.prompt(withMarker(`${order.trimEnd()}\n\n${section}`, marker), turnLimits()),
647
+ "the round",
648
+ );
649
+ }
650
+ // Whatever the operator steered or followed up with runs to its end first.
651
+ await settleControls(false);
652
+ // The turns are over: a wave row nobody joined is not wanted any more.
653
+ await endWave();
654
+
655
+ // The wakes held while the round ran, in arrival order.
656
+ for (let pass = 0; pass < MAX_WAKE_PASSES; pass++) {
657
+ let batches;
658
+ try {
659
+ batches = parseWakesTaken(await client.request(WAKES_TAKE_OP, {})).batches;
660
+ } catch (e) {
661
+ if (e instanceof IpcError && e.code === "unknown_op") break;
662
+ throw e;
663
+ }
664
+ if (batches.length === 0) break;
665
+ for (const batch of batches) {
666
+ const mark = wakeMarker(batch.id);
667
+ const file = live.sessionFile;
668
+ // A batch an earlier worker delivered and died before acking is acked, not sent again.
669
+ if (!(file !== null && jsonlHasMarker(file, mark)))
670
+ await deliver(withMarker(batch.message, mark), `wake ${batch.id}`);
671
+ await client.request(WAKES_ACK_OP, { id: batch.id });
672
+ wakesDelivered++;
673
+ }
674
+ report("progress", { stage: "wakes_delivered", delivered: wakesDelivered });
675
+ }
676
+ }
677
+
678
+ // Nothing is steered into a round that is closing; an abort still is.
679
+ await settleControls(true);
680
+
681
+ // Compaction through ledger-pin: pi's own compact() fires the session's
682
+ // session_before_compact. An optimisation, so a failure is reported and not fatal.
683
+ let compacted = "skipped";
684
+ if (spec.compact !== false && live.compact) {
685
+ report("progress", { stage: "compacting" });
686
+ const outcome = await live.compact();
687
+ compacted = outcome.status;
688
+ report("compacted", outcome);
689
+ }
690
+
691
+ checkpoint();
692
+ if (!answering) foldLensLedger(meter, lensLedgerOf(spec));
693
+ usage();
694
+ report("done", {
695
+ mode: args.mode,
696
+ ...(answering
697
+ ? {
698
+ // What the model said last, for the operator: the daemon writes it to the
699
+ // command's result file.
700
+ reply: (watch.replyText ?? "").slice(0, MAX_REPLY_CHARS),
701
+ may_post: mayPost,
702
+ }
703
+ : {}),
704
+ session_id: live.id,
705
+ resumed,
706
+ continued: continuing,
707
+ verdict_written: watch.verdictWritten,
708
+ posted: watch.posted,
709
+ wakes_delivered: wakesDelivered,
710
+ controls: { ...controls.counts },
711
+ compacted,
712
+ turns: live.stats().turns,
713
+ total_usd: meter.totalUsd,
714
+ lens_usd: lensUsd,
715
+ elapsed_ms: now() - started,
716
+ });
717
+ return EXIT.ok;
718
+ } catch (e) {
719
+ // A dropped connection fails whatever request was in flight; the cause is the
720
+ // stop code, not the request's error (the supervisor reads lost/fenced from it).
721
+ const stop =
722
+ e instanceof Stop
723
+ ? e
724
+ : stopCode !== undefined
725
+ ? new Stop(stopCode, stopReason)
726
+ : new Stop(EXIT.failed, errText(e));
727
+ log(`botworker: ${stop.reason}`);
728
+ report("failed", { code: stop.exit, reason: stop.reason });
729
+ return stop.exit;
730
+ } finally {
731
+ if (beat !== undefined) clearInterval(beat);
732
+ await endWave().catch(() => {});
733
+ await session?.dispose().catch(() => {});
734
+ host?.dispose();
735
+ await controls.flush().catch(() => {});
736
+ await client.drain().catch(() => {});
737
+ client.close();
738
+ }
739
+ }
740
+
741
+ const errText = (e: unknown): string => (e instanceof Error ? e.message : String(e)).slice(0, 500);
742
+
743
+ /** The hello is the daemon's; the spec is its answer to who this command is. */
744
+ async function handshake(client: IpcClient, args: WorkerArgs): Promise<WorkerSpec> {
745
+ let spec: WorkerSpec;
746
+ try {
747
+ spec = parseWorkerSpec(await client.request(WORKER_SPEC_OP, {}));
748
+ } catch (e) {
749
+ throw new Stop(EXIT.handshake, `no usable spec from the daemon: ${errText(e)}`);
750
+ }
751
+ if (spec.command_id !== args.command || spec.mode !== args.mode)
752
+ throw new Stop(EXIT.handshake, "the spec is for another command or mode");
753
+ if (spec.pr !== client.pr) throw new Stop(EXIT.handshake, "the spec is for another PR");
754
+ if (Object.keys(spec.env).some((k) => k.startsWith("QCR_IPC_")))
755
+ throw new Stop(
756
+ EXIT.handshake,
757
+ "the spec's env names the IPC variables, which are the worker's",
758
+ );
759
+ return spec;
760
+ }
761
+
762
+ /** The planned discovery wave's task files: the round's own pass dir. */
763
+ function plannedWave(
764
+ spec: WorkerSpec,
765
+ env: NodeJS.ProcessEnv,
766
+ ): { dir: string; units: LaunchUnit[]; note?: string } {
767
+ const passes = roundPassesDir(spec, spec.round_no ?? 0);
768
+ const dir = join(passes, "tasks");
769
+ if (!existsSync(dir)) return { dir, units: [] };
770
+ const plan = planLaunch(
771
+ { dirs: [passes] },
772
+ { QCR_SANDBOX_ROOT: spec.root, QCR_PR: String(spec.pr), PATH: env["PATH"] },
773
+ );
774
+ return plan.ok
775
+ ? { dir, units: plan.units }
776
+ : { dir, units: [], note: `engine wave not planned: ${plan.error}`.slice(0, 300) };
777
+ }
778
+
779
+ /** The main session's spec: the daemon's env, plus the IPC names the post shims
780
+ * read from the model's bash. A lens pass never gets those. */
781
+ function sessionSpecOf(
782
+ spec: WorkerSpec,
783
+ env: NodeJS.ProcessEnv,
784
+ answer?: { mayPost: boolean },
785
+ ): SessionSpec {
786
+ const ipc: Record<string, string> = {};
787
+ // An answer that may not post is given no way to reach the daemon at all.
788
+ if (!answer || answer.mayPost)
789
+ for (const name of IPC_ENV) {
790
+ const value = env[name];
791
+ if (value !== undefined) ipc[name] = value;
792
+ }
793
+ const own: Record<string, string> = { ...spec.env };
794
+ if (answer) for (const name of ROUND_ONLY_ENV) delete own[name];
795
+ return {
796
+ cwd: spec.cwd,
797
+ env: { ...own, ...ipc },
798
+ model: spec.model,
799
+ systemPromptFile: spec.system_prompt_file,
800
+ name: spec.session,
801
+ eventsFile: spec.events_file,
802
+ stderrFile: spec.stderr_file,
803
+ limits: {
804
+ timeoutMs: spec.wall_clock_ms,
805
+ ...(spec.cap_usd !== undefined ? { capUsd: spec.cap_usd } : {}),
806
+ },
807
+ };
808
+ }
809
+
810
+ const lensLedgerOf = (spec: WorkerSpec): string => join(lensDirOf(spec), LENS_LEDGER_FILE);
811
+
812
+ /** The ledger's lines priced into `meter`: a run a tool result already reported
813
+ * adds nothing, a cache warm-up (which only the ledger records) is added. */
814
+ function foldLensLedger(meter: EventCostMeter, file: string): void {
815
+ try {
816
+ for (const line of readFileSync(file, "utf8").split("\n")) meter.add(line);
817
+ } catch {
818
+ // no ledger: the round ran no pass
819
+ }
820
+ }
821
+
822
+ /** Open the PR's session: the engine's lens tools over this round's own ledger
823
+ * and JSONLs, the bot runtime over them, and then resume the newest JSONL
824
+ * under the PR's session dir (same id) or, with none, a session born there. */
825
+ async function openSession(
826
+ host: PiHost,
827
+ spec: WorkerSpec,
828
+ env: NodeJS.ProcessEnv,
829
+ wave: LensWave,
830
+ marker: string,
831
+ deps: WorkerDeps,
832
+ log: (line: string) => void,
833
+ permitPort: Permits,
834
+ tap: (run: LensRun) => void,
835
+ answer?: { mayPost: boolean },
836
+ ): Promise<Opened> {
837
+ if (answer) return openAnswerSession(host, spec, env, marker, deps, log, answer);
838
+ const round = spec.round_no ?? 0;
839
+ const lensDir = lensDirOf(spec);
840
+ const lensSpec: SessionSpec = {
841
+ ...sessionSpecOf(spec, {}),
842
+ env: { ...spec.env, PI_CODING_AGENT_DIR: spec.agent_dir },
843
+ };
844
+ const base: LensRunConfig = {
845
+ ...engineLensConfig(host, lensSpec),
846
+ warn: (m) => console.error(`[lens] ${m}`),
847
+ };
848
+ // The round's context pack sits beside its task files, not beside the ledger.
849
+ const packFile = join(roundPassesDir(spec, round), CONTEXT_PACK_FILE);
850
+ const pack = existsSync(packFile) ? readFileSync(packFile, "utf8") : "";
851
+ const tools = engineLensTools(
852
+ {
853
+ ...base,
854
+ permitPort,
855
+ ledgerPath: lensLedgerOf(spec),
856
+ sessionsDir: join(lensDir, LENS_SESSIONS_DIR),
857
+ ...(base.cache && pack ? { cache: { ...base.cache, pack } } : {}),
858
+ },
859
+ wave,
860
+ tap,
861
+ );
862
+ const runtime = botSdkRuntime(host, {
863
+ lens: tools,
864
+ processEnv: env,
865
+ ...(spec.round_no !== null
866
+ ? { live: { root: spec.root, key: spec.session, round: spec.round_no } }
867
+ : {}),
868
+ warn: (m) => log(`botworker: ${m}`),
869
+ ...(deps.openViking ? { openViking: deps.openViking } : {}),
870
+ });
871
+ const sessionSpec = sessionSpecOf(spec, env);
872
+ const file = newestSessionFile(spec.session_dir);
873
+ if (file === undefined) {
874
+ const born = await runtime.create({ ...sessionSpec, sessionDir: spec.session_dir });
875
+ return { session: born, tools, resumed: false, file: undefined, continuing: false };
876
+ }
877
+ const id = headerId(file);
878
+ const resumed = await runtime.resume(file, sessionSpec);
879
+ if (id !== null && resumed.id !== id) {
880
+ await resumed.dispose();
881
+ throw new Error(`the resumed session id ${resumed.id} is not the JSONL's ${id}`);
882
+ }
883
+ return { session: resumed, tools, resumed: true, file, continuing: jsonlHasMarker(file, marker) };
884
+ }
885
+
886
+ /** An answer worker's session: the PR's newest JSONL resumed under its own id (an
887
+ * answer never births one), with the read-only tool set and no lens tool. */
888
+ async function openAnswerSession(
889
+ host: PiHost,
890
+ spec: WorkerSpec,
891
+ env: NodeJS.ProcessEnv,
892
+ marker: string,
893
+ deps: WorkerDeps,
894
+ log: (line: string) => void,
895
+ answer: { mayPost: boolean },
896
+ ): Promise<Opened> {
897
+ const file = newestSessionFile(spec.session_dir);
898
+ if (file === undefined)
899
+ throw new Error(`#${spec.pr} has no session to resume: an answer never births one`);
900
+ const liveRound = spec.round_no ?? spec.live_round;
901
+ const runtime = botSdkRuntime(host, {
902
+ lens: NO_LENS,
903
+ answer,
904
+ processEnv: env,
905
+ ...(liveRound !== undefined
906
+ ? { live: { root: spec.root, key: spec.session, round: liveRound } }
907
+ : {}),
908
+ warn: (m) => log(`botworker: ${m}`),
909
+ ...(deps.openViking ? { openViking: deps.openViking } : {}),
910
+ });
911
+ const id = headerId(file);
912
+ const resumed = await runtime.resume(file, sessionSpecOf(spec, env, answer));
913
+ if (id !== null && resumed.id !== id) {
914
+ await resumed.dispose();
915
+ throw new Error(`the resumed session id ${resumed.id} is not the JSONL's ${id}`);
916
+ }
917
+ return {
918
+ session: resumed,
919
+ tools: undefined,
920
+ resumed: true,
921
+ file,
922
+ continuing: jsonlHasMarker(file, marker),
923
+ };
924
+ }
925
+
926
+ async function main(): Promise<void> {
927
+ const parsed = parseWorkerArgs(process.argv.slice(2));
928
+ if ("error" in parsed) {
929
+ process.stderr.write(`botworker: ${parsed.error}\n`);
930
+ process.exit(EXIT.usage);
931
+ }
932
+ // Under the tool uid the run uid and the tool uid share one
933
+ // gid: what this worker's file tools write (a verdict staged, a review body)
934
+ // the model's bash may rewrite (commit-verdict.sh, render-review.sh), and the
935
+ // reverse, so both write group-writable files. The daemon keeps its own umask:
936
+ // the files it writes for a session to read (the recall hints) stay its own.
937
+ const ids = toolIdsOf(process.env);
938
+ if (ids !== null && !("refused" in ids)) process.umask(TOOL_UMASK);
939
+ // The supervisor's TERM is the hard stop (the process exit); this stops the
940
+ // sessions first so a turn in flight is aborted and its JSONL closed.
941
+ for (const sig of ["SIGTERM", "SIGINT"] as const)
942
+ process.on(sig, () => {
943
+ void stopLiveSessions(3_000).finally(() => process.exit(EXIT.terminated));
944
+ });
945
+ const code = await runBotWorker(parsed, {
946
+ env: process.env,
947
+ log: (line) => process.stderr.write(`${line}\n`),
948
+ });
949
+ process.exit(code);
950
+ }
951
+
952
+ // Run only as the entry point, not when a test imports runBotWorker.
953
+ if (process.argv[1]?.endsWith("botworker.js")) void main();