@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,929 @@
1
+ // quickreviewd — the daemon entrypoint. Wires config → store → gate → adapter →
2
+ // webhook server + reconcile poll + dispatch pump + verdict watcher + deadline
3
+ // checker + status.json writer.
4
+ //
5
+ // Everything that touches GitHub goes through the MutationGate, which in
6
+ // dry-run records the intended call to state/dryrun/ instead of executing it.
7
+ // The session manager is behind SessionHooks: `createDaemon({ hooks })` swaps
8
+ // the real implementation in for the disk-logging stub without touching this
9
+ // file.
10
+ import { readFileSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { AnomalyWakePolicy } from "./anomalies.js";
13
+ import { CompanionInbox } from "./companioninbox.js";
14
+ import { retryWithheldApproval } from "./ciretry.js";
15
+ import { resolveRoundStageBounds, DEFAULT_POSTING_RETRY_OFFSETS_MIN, DEFAULT_POSTING_RETRY_WINDOW_MIN, loadConfig, sandboxRoot, } from "./config.js";
16
+ import { dispatchOnce } from "./dispatch.js";
17
+ import { DaemonLoadMonitor, EVENT_LOOP_WAKE_KIND, eventLoopPolicy, } from "./eventloop.js";
18
+ import { MutationGate } from "@quickchatai/pi-quickreview/src/gate.js";
19
+ import { GitHubAdapter } from "./github.js";
20
+ import { appActorAlias, TokenMinter } from "@quickchatai/pi-quickreview/src/githubAuth.js";
21
+ import { REVIEW_SET_ASIDE_STALE_WINDOW_MS } from "./feedback.js";
22
+ import { enforceLedgerFreshness } from "./ledgercheck.js";
23
+ import { readLedgerCarry } from "@quickchatai/pi-quickreview/src/ledgercarry.js";
24
+ import { sweepExpiredLevers } from "./levers.js";
25
+ import { PingPongLedger, ThreadDecisionWatcher, buildWakeMessage, } from "./pingpong.js";
26
+ import { OutcomeCapture } from "./outcomes.js";
27
+ import { reconcileOnce } from "./reconcile.js";
28
+ import { RecheckWatcher, runBaseAdvance, runRecheck, recheckFingerprint, } from "./recheck.js";
29
+ import { applyEvent } from "./statemachine.js";
30
+ import { buildPipelineStatus, buildStatusSnapshot, StateStore, writeStatusJson } from "./state.js";
31
+ import { PiAuthWatch } from "@quickchatai/pi-quickreview/src/authwatch.js";
32
+ import { SessionCommandSupervisor } from "./session-command-supervisor.js";
33
+ import { readRoundProgress } from "./requiredpasses.js";
34
+ import { SingleFlight } from "./singleflight.js";
35
+ import { yieldToLoop } from "@quickchatai/pi-quickreview/src/yieldloop.js";
36
+ import { stubSessionHooks } from "./stubs.js";
37
+ import { VerdictWatcher } from "./verdicts.js";
38
+ import { applyInterpretation, createWebhookServer } from "./webhook.js";
39
+ import { wakeOrHold, withRepoFacts } from "./wakes.js";
40
+ import { prWorktreeRel } from "./worktrees.js";
41
+ import { PrConversation } from "./pr-conversation.js";
42
+ import { PostingOutbox, jobPath as postingJobPath, outboxProcesses, readPostingJob, } from "./posting-outbox.js";
43
+ /** The ping-pong wake's repo-fact appender lives with the wakes; re-exported
44
+ * for the callers that know it from here. */
45
+ export { withRepoFacts };
46
+ /** A per-PR runtime reader that cannot take the status write down with it. */
47
+ function runtimeReader(read) {
48
+ return (pr) => {
49
+ try {
50
+ return read(pr);
51
+ }
52
+ catch {
53
+ return undefined;
54
+ }
55
+ };
56
+ }
57
+ // Sub-poll cadences (seconds). The authoritative reconcile interval is
58
+ // config.daemon.poll_interval_s; these are cheap local ticks.
59
+ const DISPATCH_TICK_S = 15;
60
+ const VERDICT_SWEEP_S = 10;
61
+ const DEADLINE_TICK_S = 60;
62
+ const STATUS_TICK_S = 30;
63
+ const AUTHWATCH_TICK_S = 60;
64
+ /** A reconcile pass running this many poll intervals is abandoned (logged as
65
+ * the quiet anomaly `reconcile_pass_overdue`) and the next one starts. */
66
+ export const RECONCILE_OVERDUE_INTERVALS = 3;
67
+ function readWebhookSecret(cfg) {
68
+ return readFileSync(join(cfg.github.secrets_dir, "webhook_secret"), "utf8").trim();
69
+ }
70
+ /** The real adapter: token minter → mutation gate (dry-run aware) → adapter. */
71
+ function buildGitHubAdapter(cfg, stateDir) {
72
+ const minter = new TokenMinter(cfg.github.secrets_dir);
73
+ const gate = new MutationGate(cfg.dry_run, join(stateDir, "dryrun"), (intent) => github.executeMutation(intent));
74
+ // The gate's loud line (app-self-config executions) on stdout.
75
+ gate.setLog((msg, extra) => console.log(`[quickreviewd] ${msg}`, extra ?? ""));
76
+ const github = new GitHubAdapter(cfg, minter, gate);
77
+ return github;
78
+ }
79
+ /**
80
+ * Serve one author reply in a bot thread: claim it, then wake the PR's
81
+ * session (held while its round is in flight). The webhook interpretation
82
+ * guarantees a same-PR bot-owned root; the claim comes before the wake so a
83
+ * duplicate delivery cannot produce duplicate replies or resolutions.
84
+ */
85
+ export async function serveAuthorReply(deps, reply) {
86
+ const { store, pingpong, log } = deps;
87
+ if (reply.in_reply_to_id === null)
88
+ return;
89
+ // Deploy-window drain: no ping-pong wake while draining — and the
90
+ // claim is deliberately not taken, so a redelivery after the lift
91
+ // can still service the reply. Belt-and-braces in practice: while
92
+ // draining the webhook drops the delivery before it reaches here.
93
+ if (store.drainState().draining) {
94
+ log(`pingpong: #${reply.pr} reply dropped — draining`);
95
+ return;
96
+ }
97
+ const event = {
98
+ pr: reply.pr,
99
+ comment_id: reply.comment_id,
100
+ in_reply_to_id: reply.in_reply_to_id,
101
+ body: reply.body,
102
+ author: reply.author,
103
+ };
104
+ // The repo facts for the replied thread's file — "" unless
105
+ // `[memory] delivery = "on"`, so the wake is otherwise byte-identical.
106
+ // The path rides the interpretation only, never the event: the wake's
107
+ // own text does not change. Read before the claim, so the claim is
108
+ // followed at once by its held wake — the claim refuses every
109
+ // redelivery, and the held row is what the stranded-wake sweep recovers.
110
+ let facts = "";
111
+ if (deps.repoFacts && reply.path) {
112
+ const before = store.getPr(reply.pr);
113
+ facts = await deps.repoFacts({
114
+ pr: reply.pr,
115
+ title: before?.title ?? "",
116
+ paths: [reply.path],
117
+ head_sha: before?.head_sha ?? null,
118
+ purpose: "pingpong",
119
+ });
120
+ if (typeof facts !== "string")
121
+ facts = "";
122
+ // That read can take the lesson budget (≤ 2 s): a drain the operator
123
+ // started meanwhile still stops the wake, the claim still not taken.
124
+ if (store.drainState().draining) {
125
+ log(`pingpong: #${reply.pr} reply dropped — draining`);
126
+ return;
127
+ }
128
+ }
129
+ let claimed = false;
130
+ const row = store.getPr(reply.pr);
131
+ // The PR's one main pi never gets a second instruction while its round
132
+ // is in flight — the wake is held and flushed at round end (rule 9).
133
+ const disposition = await wakeOrHold({ store, inject: deps.inject, log }, reply.pr, withRepoFacts(buildWakeMessage(event, {
134
+ head_sha: row?.head_sha,
135
+ worktree: join(deps.root, prWorktreeRel(reply.pr)),
136
+ }, pingpong.discipline(reply.in_reply_to_id)), facts), "author_reply",
137
+ // The message is already claimed: the wake is held before the
138
+ // injection is awaited and stays held if it fails, or no redelivery
139
+ // can ever answer it.
140
+ {
141
+ holdOnFailure: true,
142
+ claim: () => {
143
+ claimed = pingpong.claimAuthorMessage(event);
144
+ return claimed;
145
+ },
146
+ });
147
+ if (!claimed)
148
+ return;
149
+ if (disposition === "held")
150
+ log(`pingpong: #${reply.pr} reply held — round in flight, backlog or failed inject`);
151
+ }
152
+ export function createDaemon(deps = {}) {
153
+ const cfg = deps.cfg ?? loadConfig();
154
+ const root = deps.root ?? sandboxRoot();
155
+ const stateDir = join(root, "state");
156
+ const log = deps.log ??
157
+ ((msg, extra) => console.log(`[quickreviewd] ${msg}`, extra ?? ""));
158
+ const store = deps.store ?? new StateStore(join(stateDir, "state.db"));
159
+ const hooks = deps.hooks ?? stubSessionHooks(root, log);
160
+ const roundStageBounds = resolveRoundStageBounds(cfg.daemon);
161
+ // Companion-inbox policy: every logAnomaly flows through the one
162
+ // severity map + dedup; WAKE classes write an inbox item, QUIET classes
163
+ // stay DB-only. Wired here so stub-wired daemons behave identically.
164
+ const writeInbox = deps.writeInbox ?? new CompanionInbox({ root, log }).writer();
165
+ const wakePolicy = new AnomalyWakePolicy({ writeInbox, log });
166
+ store.setAnomalySink((signal) => wakePolicy.onAnomaly(signal));
167
+ const gh = deps.adapter ?? buildGitHubAdapter(cfg, stateDir);
168
+ // The daemon measures its own event loop and the container's CPU
169
+ // throttling. A stall wakes through the one anomaly funnel (WAKE kind
170
+ // `daemon_event_loop_stalled`), rate-limited by the watch's cooldown.
171
+ const load = new DaemonLoadMonitor({
172
+ policy: eventLoopPolicy(cfg.daemon),
173
+ raise: (detail, message) => store.logAnomaly(EVENT_LOOP_WAKE_KIND, null, null, detail, message),
174
+ log,
175
+ ...deps.eventLoop,
176
+ });
177
+ // The lazy announcer seam: a thin forwarder so the verdict watcher (built
178
+ // once, here) reaches whatever wire.ts assembles later — and swallows the
179
+ // gap before it exists. Absent `deps.announce` ⇒ undefined, i.e. no Slack.
180
+ const resolveAnnounce = deps.announce;
181
+ const announce = resolveAnnounce
182
+ ? {
183
+ roundStarted: async (a) => void (await resolveAnnounce()?.roundStarted(a)),
184
+ verdict: async (a) => void (await resolveAnnounce()?.verdict(a)),
185
+ anomaly: async (a) => void (await resolveAnnounce()?.anomaly(a)),
186
+ superseded: async (a) => void (await resolveAnnounce()?.superseded(a)),
187
+ }
188
+ : undefined;
189
+ const verdictDir = join(root, "verdict");
190
+ const verdicts = new VerdictWatcher({
191
+ cfg,
192
+ store,
193
+ adapter: gh,
194
+ hooks,
195
+ writeInbox,
196
+ announce,
197
+ verdictDir,
198
+ root, // anchors the default pi-session dir for round usage measurement
199
+ ...(deps.now ? { now: deps.now } : {}),
200
+ // The durable reasoning record — same dir the round prompts pin.
201
+ findingsDir: join(root, "state", "findings"),
202
+ // The lesson shadow ledger marks the round's posted findings.
203
+ ...(deps.onFindingsRecorded ? { onFindingsRecorded: deps.onFindingsRecorded } : {}),
204
+ log,
205
+ });
206
+ const postingOutbox = deps.postingDelivery
207
+ ? new PostingOutbox({
208
+ dir: join(stateDir, "posting-receipts"),
209
+ repo: cfg.github.repo,
210
+ dryRun: cfg.dry_run,
211
+ botLogins: [cfg.github.bot_login, `${cfg.github.app_slug}[bot]`],
212
+ adapter: deps.postingDelivery,
213
+ current: (job) => {
214
+ const pr = store.getPr(job.pr);
215
+ const round = store.roundsFor(job.pr).find((r) => r.round_no === job.round_no);
216
+ return (pr?.state === "reviewing" &&
217
+ pr.head_sha.toLowerCase() === job.head_sha.toLowerCase() &&
218
+ round?.status === "running" &&
219
+ round.posting_key === job.posting_key);
220
+ },
221
+ ...(deps.now ? { now: deps.now } : {}),
222
+ ...(deps.postingDelivery.createDeferredReview
223
+ ? {
224
+ deferred: {
225
+ ledger: store,
226
+ offsetsMs: (cfg.daemon.posting_retry_offsets_min ?? DEFAULT_POSTING_RETRY_OFFSETS_MIN).map((m) => m * 60_000),
227
+ windowMs: (cfg.daemon.posting_retry_window_min ?? DEFAULT_POSTING_RETRY_WINDOW_MIN) *
228
+ 60_000,
229
+ deliver: (pr, payload, key) => deps.postingDelivery.createDeferredReview(pr, payload, key),
230
+ // A new push does not end the debt (the review posts at its
231
+ // original commit_id); a cancelled round — an operator's `u`
232
+ // — does.
233
+ owed: (job) => {
234
+ const round = store.roundsFor(job.pr).find((r) => r.round_no === job.round_no);
235
+ return (store.getPr(job.pr)?.state !== "closed" &&
236
+ round?.status === "running" &&
237
+ round.posting_key === job.posting_key);
238
+ },
239
+ // The verdict watcher's posting proof now reads `exhausted`
240
+ // and fails the round loud on whichever path reaches it first
241
+ // (verdict sweep, stage limit, deadline): the FAILED_LOUD
242
+ // hold, its review_failed_loud wake and status.json. This
243
+ // row says why, at once.
244
+ onExhausted: (job, detail) => store.logAnomaly("posting_retry_exhausted", job.pr, job.round_no, `deferred review posting ${job.posting_key} was not delivered: ${detail}`),
245
+ },
246
+ }
247
+ : {}),
248
+ log: (message, job) => {
249
+ log(`#${job.pr} round ${job.round_no}: ${message}`);
250
+ store.logEvent("posting_delivery", job.pr, {
251
+ round_no: job.round_no,
252
+ posting_key: job.posting_key,
253
+ status: job.status,
254
+ attempts: job.attempts,
255
+ next_attempt_at: job.next_attempt_at,
256
+ detail: message,
257
+ });
258
+ },
259
+ })
260
+ : undefined;
261
+ const roundStages = new SessionCommandSupervisor({
262
+ cfg,
263
+ store,
264
+ hooks,
265
+ verdictDir,
266
+ progress: (pr) => readRoundProgress(root, pr),
267
+ onRoundFailure: (pr, roundNo, stage, detail) => verdicts.recoverInfrastructureFailure(pr, roundNo, stage, detail),
268
+ ...(deps.now ? { now: deps.now } : {}),
269
+ });
270
+ const prConversation = new PrConversation({
271
+ store,
272
+ adapter: gh,
273
+ verdictDir,
274
+ botLogin: cfg.github.bot_login,
275
+ inject: (pr, message) => hooks.inject(pr, message),
276
+ ...(deps.now ? { now: deps.now } : {}),
277
+ });
278
+ const pingpong = new PingPongLedger(store.db);
279
+ const threadDecisions = new ThreadDecisionWatcher({
280
+ adapter: gh,
281
+ store,
282
+ ledger: pingpong,
283
+ verdictDir,
284
+ log,
285
+ isDraining: () => store.drainState().draining,
286
+ botLogin: cfg.github.bot_login,
287
+ ownerActorAlias: appActorAlias(cfg.github.bot_login, cfg.github.app_slug),
288
+ // The author asked for a person on a review thread.
289
+ //
290
+ // There is no park to put them in: the state event is a deliberate no-op
291
+ // (`statemachine.ts`: "noted, never a handover — AI keeps working") and no
292
+ // reviewer is ever nominated on GitHub (rule 10). The signal is recorded,
293
+ // durably and visibly, and it is never a handover. `logAnomaly` is the one
294
+ // durable funnel; the kind is deliberately unlisted in `anomalies.ts`
295
+ // WAKE_KINDS, so it is quiet-tier — it lands in the DB, surfaces in the
296
+ // operator views and in the overseer's daily heartbeat, and never injects.
297
+ // An author asking for a person is worth a human's eyes; it is not a
298
+ // review that ran unsoundly now.
299
+ onHumanRequested: async (decision) => {
300
+ applyEvent(store, decision.pr, { type: "human_requested" }, {}, {
301
+ botLogin: cfg.github.bot_login,
302
+ reason: "pingpong:human-requested",
303
+ });
304
+ store.logAnomaly("human_requested", decision.pr, null, `the author asked for a person on thread ${decision.thread_id} (comment ${decision.comment_id})` +
305
+ `${decision.reason ? ` — ${decision.reason}` : ""}. No handover exists: the reviewer keeps driving.`);
306
+ },
307
+ });
308
+ // The repo-fact lessons a recheck nudge and a ping-pong wake
309
+ // carry for the paths they touch. Total — the hook is bounded by the lesson
310
+ // prefetch's budget, and a throw is "" — so neither wake is ever held or
311
+ // lost for it.
312
+ const repoFactsFor = async (q) => {
313
+ try {
314
+ const s = await deps.lessons?.repoFacts?.(q);
315
+ return typeof s === "string" ? s : "";
316
+ }
317
+ catch (err) {
318
+ log(`lessons: #${q.pr} ${q.purpose} repo facts failed (ignored)`, err);
319
+ return "";
320
+ }
321
+ };
322
+ // The post-approval delta recheck. Three of its four triggers are
323
+ // wired below; the fourth — an author reply — is owned by ping-pong above and
324
+ // deliberately never reaches this path.
325
+ const recheckDeps = {
326
+ cfg,
327
+ store,
328
+ adapter: gh,
329
+ inject: (pr, message) => hooks.inject(pr, message),
330
+ ...(deps.renderRecheckPrompt ? { renderPrompt: deps.renderRecheckPrompt } : {}),
331
+ ...(deps.resolvedFilesInMerges ? { resolvedFilesInMerges: deps.resolvedFilesInMerges } : {}),
332
+ // The repo facts for the delta's files — "" unless
333
+ // `[memory] delivery = "on"`, so the nudge is otherwise byte-identical.
334
+ ...(deps.lessons?.repoFacts
335
+ ? { repoFacts: (q) => repoFactsFor(q) }
336
+ : {}),
337
+ log,
338
+ };
339
+ const rechecks = new RecheckWatcher({
340
+ cfg,
341
+ store,
342
+ verdictDir,
343
+ findingsDir: join(root, "state", "findings"),
344
+ log,
345
+ // Ledger freshness after a recheck uphold — same enforcement the
346
+ // VerdictWatcher runs at round end, keyed by head (no round in flight).
347
+ checkLedger: async (pr, headSha) => {
348
+ await enforceLedgerFreshness({
349
+ store,
350
+ ledgerPathFor: (n) => join(root, "state", "ledgers", `pr-${n}.md`),
351
+ inject: (n, message) => hooks.inject(n, message),
352
+ log,
353
+ }, { pr, roundNo: null, headSha });
354
+ },
355
+ });
356
+ // The withheld-approval retry — same `ci_completed` event, opposite
357
+ // direction: the recheck above asks whether a standing approval must fall,
358
+ // this asks whether a withheld one can finally be given.
359
+ const ciDeps = { cfg, store, adapter: gh, log };
360
+ const timers = [];
361
+ let server = null;
362
+ let stopping = false;
363
+ const onInterpretation = async (i, ctx) => {
364
+ const ingressGuard = async (what, fn) => {
365
+ if (!ctx?.guid)
366
+ return guard(what, fn);
367
+ try {
368
+ await fn();
369
+ }
370
+ catch (err) {
371
+ log(`${what} failed`, err);
372
+ store.logEvent("daemon_error", null, { what, error: String(err) });
373
+ throw err;
374
+ }
375
+ };
376
+ const requireRecheckHandoff = (req, outcome) => {
377
+ if (!ctx?.guid || outcome.action !== "noop" || outcome.reason !== "delivery-failed")
378
+ return;
379
+ const head = req.head_sha ?? store.getPr(req.pr)?.head_sha ?? "";
380
+ if (!store.recheckDelivery(req.pr, recheckFingerprint(req, head))) {
381
+ throw new Error(`recheck #${req.pr} failed before durable question handoff`);
382
+ }
383
+ };
384
+ const ingressRecheck = async (req) => {
385
+ requireRecheckHandoff(req, await runRecheck(recheckDeps, req));
386
+ };
387
+ await applyInterpretation({
388
+ cfg,
389
+ store,
390
+ deliveryGuid: ctx?.guid,
391
+ onPrTouched: async () => {
392
+ await pump();
393
+ },
394
+ onAuthorPrComment: async (comment) => {
395
+ await prConversation.accept(comment);
396
+ },
397
+ onAuthorReply: async (reply) => {
398
+ await serveAuthorReply({
399
+ store,
400
+ pingpong,
401
+ inject: (pr, message) => hooks.inject(pr, message),
402
+ root,
403
+ log,
404
+ ...(deps.lessons?.repoFacts ? { repoFacts: repoFactsFor } : {}),
405
+ }, reply);
406
+ },
407
+ onClosed: async (pr) => {
408
+ await hooks.archiveAndClose(pr);
409
+ },
410
+ // A push after an approve: the recheck audits the new delta.
411
+ onSynchronize: async (sync) => {
412
+ await ingressGuard(`recheck #${sync.pr}`, () => ingressRecheck({ pr: sync.pr, trigger: "push", head_sha: sync.meta.head_sha }));
413
+ },
414
+ onCiCompleted: async (ci) => {
415
+ for (const pr of ci.prs) {
416
+ await ingressGuard(`recheck #${pr}`, () => ingressRecheck({
417
+ pr,
418
+ trigger: "ci",
419
+ head_sha: ci.head_sha,
420
+ ci: { conclusion: ci.conclusion },
421
+ }));
422
+ // The other side of the same event. A PR whose approval
423
+ // was withheld for red CI is re-queued the moment CI goes green at
424
+ // that head — without this the gate turns every infra flake into a
425
+ // permanently stuck PR.
426
+ await ingressGuard(`approval retry #${pr}`, async () => {
427
+ const outcome = await retryWithheldApproval(ciDeps, {
428
+ pr,
429
+ head_sha: ci.head_sha,
430
+ conclusion: ci.conclusion,
431
+ });
432
+ if (outcome.action === "requeued")
433
+ await pump();
434
+ });
435
+ }
436
+ },
437
+ onBaseAdvanced: async (advance) => {
438
+ await ingressGuard(`recheck base ${advance.branch}`, async () => {
439
+ const outcomes = await runBaseAdvance(recheckDeps, {
440
+ branch: advance.branch,
441
+ before: advance.before,
442
+ after: advance.after,
443
+ });
444
+ for (const [pr, outcome] of outcomes)
445
+ requireRecheckHandoff({ pr, trigger: "base_advance", base: advance }, outcome);
446
+ });
447
+ },
448
+ // Forward tuning-loop signals to the engine. A review set
449
+ // aside right after a head push is GitHub's own stale-review sweep,
450
+ // classified here (the store holds the push clock), not a human verdict.
451
+ onFeedbackSignal: async (e) => {
452
+ if (!deps.onFeedback)
453
+ return;
454
+ await ingressGuard(`feedback #${e.pr}`, async () => {
455
+ if (e.kind === "review_set_aside") {
456
+ const lastPush = store.lastEventAt("head_push", e.pr);
457
+ const stale = lastPush !== undefined &&
458
+ Date.now() - Date.parse(lastPush) < REVIEW_SET_ASIDE_STALE_WINDOW_MS;
459
+ await deps.onFeedback({ ...e, stale });
460
+ }
461
+ else {
462
+ await deps.onFeedback(e);
463
+ }
464
+ });
465
+ },
466
+ }, i);
467
+ };
468
+ const guard = async (what, fn) => {
469
+ try {
470
+ await fn();
471
+ }
472
+ catch (err) {
473
+ log(`${what} failed`, err);
474
+ store.logEvent("daemon_error", null, { what, error: String(err) });
475
+ }
476
+ };
477
+ // Outcome capture: what became of every posted finding. It reads only
478
+ // (state.db, the base clone) and rides the reconcile pass.
479
+ const outcomes = new OutcomeCapture({
480
+ store,
481
+ botLogin: cfg.github.bot_login,
482
+ ...(deps.outcomeGit ? { git: deps.outcomeGit } : {}),
483
+ ...(deps.now ? { now: deps.now } : {}),
484
+ });
485
+ let firstReconcileSeen = false;
486
+ let firstHealthyReconcileAt = null;
487
+ // Deploy-window drain auto-lift: only the boot's first reconcile pass may
488
+ // lift the drain, and only when it completed healthily — reconcileOnce
489
+ // resolved and its per-step `report.errors` is empty. A failed first pass
490
+ // leaves the drain standing for the rest of this boot (a broken deploy must
491
+ // not resume work blind); clearing it then takes an explicit `drain off`.
492
+ // In a multi-deploy window each healthy boot lifts the drain, so the
493
+ // operator re-drains before each step. Two drains are never lifted here: a
494
+ // system's (with a reason) and the operator's HOLD (`qcr drain on --hold`,
495
+ // the cutover's), which only an explicit `drain off` lifts.
496
+ //
497
+ // One reconcile pass at a time: an overlapping pass would pay every step
498
+ // again. A tick that finds a pass running is skipped; an explicit call
499
+ // waits for it and then runs its own pass.
500
+ //
501
+ // The guard is bounded: it covers reconcileOnce and the drain lift only —
502
+ // the conversation sweep and the dispatch pump run after it is released,
503
+ // each behind its own lock — and a pass still running after
504
+ // RECONCILE_OVERDUE_INTERVALS poll intervals is abandoned, so one hung await
505
+ // can never stop every later pass (and with them the backstop and the
506
+ // undelivered-recheck sweep).
507
+ const reconcileFlight = new SingleFlight({
508
+ overdueMs: () => RECONCILE_OVERDUE_INTERVALS * cfg.daemon.poll_interval_s * 1000,
509
+ onOverdue: (ageMs) => {
510
+ const detail = `a reconcile pass has run ${Math.round(ageMs / 1000)} s ` +
511
+ `(over ${RECONCILE_OVERDUE_INTERVALS} poll intervals of ${cfg.daemon.poll_interval_s} s) ` +
512
+ `without settling — no longer waited for; the next pass starts beside it`;
513
+ log(`reconcile: ${detail}`);
514
+ store.logAnomaly("reconcile_pass_overdue", null, null, detail);
515
+ },
516
+ });
517
+ const reconcile = async () => {
518
+ if (!(await reconcileFlight.run(reconcilePass)))
519
+ return;
520
+ // Outside the single-flight: both have their own locks (PrConversation's
521
+ // `busy`, dispatch's per-store active pump), and a pump that hangs on a
522
+ // worktree fetch must not hold the next reconcile pass back.
523
+ await guard("reconcile", async () => {
524
+ await prConversation.sweep();
525
+ await pump();
526
+ });
527
+ };
528
+ const reconcileTick = () => {
529
+ if (reconcileFlight.running()) {
530
+ log("reconcile: the previous pass is still running — this tick skipped");
531
+ return;
532
+ }
533
+ void reconcile();
534
+ };
535
+ /** The guarded part of a pass; true when it completed (the follow-ups run
536
+ * only then). */
537
+ const reconcilePass = async () => {
538
+ const bootFirstPass = !firstReconcileSeen;
539
+ firstReconcileSeen = true;
540
+ let completed = false;
541
+ await guard("reconcile", async () => {
542
+ const report = await reconcileOnce({
543
+ cfg,
544
+ store,
545
+ adapter: gh,
546
+ hooks,
547
+ log,
548
+ // Push-trigger backstop: same runRecheck the webhook's onSynchronize
549
+ // calls, so a dead/lost webhook never leaves a post-review push
550
+ // unexamined.
551
+ onHeadPush: async (pr, head_sha) => {
552
+ await guard(`recheck #${pr}`, () => runRecheck(recheckDeps, { pr, trigger: "push", head_sha }));
553
+ },
554
+ // Feedback backstop: merged-over-block for closes the webhook missed.
555
+ onMergedOverBlock: async (pr) => {
556
+ await guard(`feedback #${pr}`, async () => deps.onFeedback?.({ kind: "merged_over_block", pr }));
557
+ },
558
+ outcomes,
559
+ // The boot's first pass lifts a deploy drain; the undelivered-recheck
560
+ // sweep reads session transcripts and is not needed for that, so it
561
+ // starts on the next pass to keep the boot pass short.
562
+ receiptSweep: !bootFirstPass,
563
+ });
564
+ log(`reconcile: open=${report.open_prs} triggered=${report.triggered.length} ` +
565
+ `closed=${report.closed.length} captured=${report.captured_comments} ` +
566
+ `corrections=${report.corrections} errors=${report.errors.length}`);
567
+ if (report.errors.length === 0 && firstHealthyReconcileAt === null)
568
+ firstHealthyReconcileAt = deps.now ? deps.now() : new Date();
569
+ const standing = store.drainState();
570
+ if (bootFirstPass && standing.draining && standing.hold) {
571
+ // The operator's hold: the boot keeps it, and says so — a healthy
572
+ // first pass is exactly where a plain drain would have lifted.
573
+ if (report.errors.length === 0) {
574
+ store.logEvent("drain_hold_kept", null, {
575
+ dropped_deliveries: standing.drained_deliveries,
576
+ });
577
+ log(`drain_hold_kept — first reconcile pass healthy; the operator's drain HOLD stands, only an explicit drain off lifts it`);
578
+ }
579
+ else {
580
+ log("drain hold stands — first reconcile pass had errors; only an explicit drain off lifts it");
581
+ }
582
+ }
583
+ else if (bootFirstPass && standing.draining && standing.reason !== null) {
584
+ // A drain a system set for a reason (the worker crash-loop breaker,
585
+ // `worker_failures`) is not a deploy window: a restart does not clear what
586
+ // made it. Only an explicit `drain off` does.
587
+ log(`drain stands — held for ${standing.reason}; only an explicit drain off lifts it`);
588
+ }
589
+ else if (bootFirstPass && report.errors.length === 0 && standing.draining) {
590
+ // The operator's lift: this is the deploy flow's drain completing, so
591
+ // it clears whatever hold stands — a session's included.
592
+ const { dropped } = store.liftDrain("operator");
593
+ store.logEvent("drain_lifted", null, { dropped_deliveries: dropped });
594
+ log(`drain_lifted — first reconcile pass healthy; ${dropped} webhook delivery(ies) were dropped while draining`);
595
+ threadDecisions.requestSweep();
596
+ }
597
+ completed = true;
598
+ });
599
+ return completed;
600
+ };
601
+ const pump = async () => {
602
+ await guard("dispatch", async () => {
603
+ // Session levers that lapsed since the last tick leave the ledger here;
604
+ // the readers below already treat them as gone.
605
+ sweepExpiredLevers(store, (line) => log(line));
606
+ const orders = await dispatchOnce({
607
+ cfg,
608
+ store,
609
+ adapter: gh,
610
+ hooks,
611
+ renderPrompt: (order, memory) => (deps.renderPrompt ? deps.renderPrompt(order, memory) : JSON.stringify(order, null, 2)) +
612
+ prConversation.context(order.pr),
613
+ ...(deps.memory ? { memory: deps.memory } : {}),
614
+ ...(deps.lessons ? { lessons: deps.lessons } : {}),
615
+ ...(deps.ecosystem ? { ecosystem: deps.ecosystem } : {}),
616
+ ...(deps.heuristics ? { heuristics: deps.heuristics } : {}),
617
+ // Every round order re-hands the PR's ledger, read
618
+ // from ledger-pin's mirror — the same file the freshness check reads.
619
+ // Total: no file, an unreadable one or another PR's ⇒ no carry.
620
+ ledgerCarry: (n) => readLedgerCarry(join(root, "state", "ledgers", `pr-${n}.md`), n),
621
+ prepareWorktree: deps.prepareWorktree,
622
+ ...(deps.prOwnedDelta ? { prOwnedDelta: deps.prOwnedDelta } : {}),
623
+ ...(deps.pinReviewedHead ? { pinReviewedHead: deps.pinReviewedHead } : {}),
624
+ findingsDir: join(root, "state", "findings"),
625
+ postingReceiptDir: join(root, "state", "posting-receipts"),
626
+ listBaseMigrations: deps.listBaseMigrations,
627
+ ...(deps.dependencySources ? { dependencySources: deps.dependencySources } : {}),
628
+ directiveAuthor: deps.directiveAuthor,
629
+ resolvedFilesInMerges: deps.resolvedFilesInMerges,
630
+ announce,
631
+ log,
632
+ ...(deps.now ? { now: deps.now } : {}),
633
+ });
634
+ for (const o of orders)
635
+ log(`dispatched #${o.pr} round ${o.round_no} (${o.round_type}) lenses=${o.lenses.join(",")}`);
636
+ });
637
+ };
638
+ const retryDueReviewFailures = async () => {
639
+ // This transition only republishes ordinary queued debt; the one dispatch
640
+ // pump below remains the sole round and pi-command creator.
641
+ const automaticRetries = store.activateDueReviewFailureRetries(store.currentTimeIso());
642
+ if (automaticRetries.length > 0) {
643
+ for (const retry of automaticRetries) {
644
+ log(`automatic pre-fanout retry: #${retry.pr} round ${retry.target_round_no} epoch ${retry.retry_epoch} @ ${retry.target_head_sha.slice(0, 7)}`);
645
+ }
646
+ await pump();
647
+ }
648
+ return automaticRetries.length;
649
+ };
650
+ // Passive pi auth-failure watch: no smoke calls, just the session JSONLs pi
651
+ // already writes. A detection is a wake-grade anomaly
652
+ // (10-min dedup via the sink) and a status.json flag the TUI alerts on.
653
+ const piAuthWatch = deps.piSessionsDir ? new PiAuthWatch(deps.piSessionsDir) : undefined;
654
+ const authWatchTick = () => {
655
+ if (!piAuthWatch)
656
+ return;
657
+ try {
658
+ const hits = piAuthWatch.scan();
659
+ if (hits.length > 0) {
660
+ const files = hits.map((h) => h.file.split("/").pop()).join(", ");
661
+ store.logAnomaly("pi_auth_expired", null, null, `pi API auth failures (token expired) in ${hits.length} session file(s): ${files}`, [
662
+ "PI AUTH EXPIRED — sessions are failing API calls with token-expired errors.",
663
+ `Fresh hits in: ${files}`,
664
+ "Every round in flight will wedge until a human re-runs /login in the container (interactive OAuth — the daemon cannot do it).",
665
+ ].join("\n"));
666
+ log(`authwatch: pi token-expired errors in ${hits.length} session file(s)`, files);
667
+ writeStatus();
668
+ }
669
+ }
670
+ catch (err) {
671
+ log("authwatch failed", err);
672
+ }
673
+ };
674
+ const writeStatus = () => {
675
+ // Fail-soft twice over: reading the OpenViking block can never abort the
676
+ // heartbeat (its own try/catch), and the write itself is guarded as before.
677
+ let openviking;
678
+ try {
679
+ openviking = deps.openvikingStatus?.();
680
+ }
681
+ catch (err) {
682
+ log("openviking status read failed (heartbeat continues)", err);
683
+ }
684
+ let memory;
685
+ try {
686
+ memory = deps.memoryStatus?.();
687
+ }
688
+ catch (err) {
689
+ log("memory health read failed (heartbeat continues)", err);
690
+ }
691
+ let daemonLoad;
692
+ try {
693
+ daemonLoad = load.status();
694
+ }
695
+ catch (err) {
696
+ log("event-loop watch read failed (heartbeat continues)", err);
697
+ }
698
+ let archive;
699
+ try {
700
+ archive = deps.archiveStatus?.();
701
+ }
702
+ catch (err) {
703
+ log("archive status read failed (heartbeat continues)", err);
704
+ }
705
+ let loginRefresh;
706
+ try {
707
+ loginRefresh = deps.loginRefreshStatus?.();
708
+ }
709
+ catch (err) {
710
+ log("login refresh status read failed (heartbeat continues)", err);
711
+ }
712
+ let permits;
713
+ try {
714
+ permits = deps.permitStatus?.();
715
+ }
716
+ catch (err) {
717
+ log("permit status read failed (heartbeat continues)", err);
718
+ }
719
+ try {
720
+ const snapshot = buildStatusSnapshot(store, cfg.dry_run, deps.digestHeadline?.(), undefined, cfg.daemon.max_concurrent_rounds, piAuthWatch?.status(), openviking, threadDecisions.status(), roundStages.health(), roundStageBounds, memory, daemonLoad, archive, loginRefresh, permits, deps.runtimeOf && runtimeReader(deps.runtimeOf));
721
+ if (postingOutbox)
722
+ for (const pr of snapshot.prs) {
723
+ if (!pr.current_round)
724
+ continue;
725
+ const job = readPostingJob(postingJobPath(join(stateDir, "posting-receipts"), pr.number, pr.current_round.round_no));
726
+ if (job && outboxProcesses(job, cfg.github.repo))
727
+ pr.current_round.posting_delivery = {
728
+ attempts: job.attempts,
729
+ next_attempt_at: job.next_attempt_at,
730
+ ...(job.last_error ? { last_error: job.last_error } : {}),
731
+ ...(job.deferred_at ? { deferred_since: job.deferred_at } : {}),
732
+ };
733
+ }
734
+ if (deps.runHost)
735
+ snapshot.run_host = deps.runHost;
736
+ writeStatusJson(stateDir, snapshot);
737
+ }
738
+ catch (err) {
739
+ log("status.json write failed", err);
740
+ }
741
+ };
742
+ const every = (seconds, fn) => {
743
+ const t = setInterval(fn, seconds * 1000);
744
+ t.unref?.();
745
+ timers.push(t);
746
+ };
747
+ return {
748
+ store,
749
+ cfg,
750
+ outcomes,
751
+ load,
752
+ firstHealthyReconcileAt: () => firstHealthyReconcileAt,
753
+ reconcile,
754
+ pump,
755
+ retryDueReviewFailures,
756
+ scanRoundStages: () => roundStages.scan(),
757
+ sweepVerdicts: () => verdicts.sweep(),
758
+ wakeThreadDecisions: () => threadDecisions.requestSweep(),
759
+ retryThreadDecision: (commentId) => threadDecisions.retryFailed(commentId),
760
+ async start() {
761
+ log(`starting — ${cfg.dry_run ? "DRY-RUN" : "LIVE"} — repo ${cfg.github.repo}`);
762
+ if (deps.runHost?.warning)
763
+ log(`WARNING: ${deps.runHost.warning}`);
764
+ store.logEvent("daemon_start", null, { dry_run: cfg.dry_run, port: cfg.server.port });
765
+ // First, so a boot that holds the loop is measured too.
766
+ load.start();
767
+ if (deps.listen !== false) {
768
+ const secret = deps.webhookSecret ?? readWebhookSecret(cfg);
769
+ server = createWebhookServer({
770
+ cfg,
771
+ store,
772
+ secret,
773
+ onInterpretation,
774
+ ...(gh.listReviewCommentsFull
775
+ ? { listReviewCommentsFull: (pr) => gh.listReviewCommentsFull(pr) }
776
+ : {}),
777
+ // Only the pipeline block — never the whole snapshot (every PR,
778
+ // every round) on each probe: `/health` is what a stalled loop is
779
+ // measured by, so it must cost almost nothing itself.
780
+ pipelineHealth: () => buildPipelineStatus(store, new Date(), roundStages.health()),
781
+ log,
782
+ });
783
+ // Loopback by default; in the container the daemon must bind 0.0.0.0
784
+ // (docker's published port targets the container's eth0, and the
785
+ // host-side binding is already 127.0.0.1-only).
786
+ const bindHost = process.env.QC_BIND_HOST ?? "127.0.0.1";
787
+ await new Promise((resolve) => server.listen(cfg.server.port, bindHost, resolve));
788
+ log(`webhook listening on ${bindHost}:${cfg.server.port}/webhook`);
789
+ }
790
+ verdicts.start();
791
+ // Independent of reconcile and round/session scheduling: a GitHub read
792
+ // outage must not prevent the delivery worker itself getting a turn.
793
+ if (postingOutbox) {
794
+ void guard("posting delivery", () => postingOutbox.tick());
795
+ every(15, () => void guard("posting delivery", () => postingOutbox.tick()));
796
+ }
797
+ threadDecisions.start();
798
+ rechecks.start();
799
+ writeStatus();
800
+ // Start the correctness scan without holding daemon startup. If it
801
+ // hangs, its attempt lease ages while status.json keeps advancing and
802
+ // the pipeline reports unhealthy rather than blocking the process.
803
+ void guard("round stage supervisor", async () => {
804
+ try {
805
+ await roundStages.scan();
806
+ }
807
+ finally {
808
+ writeStatus();
809
+ }
810
+ });
811
+ // onStart before the first reconcile: the sweep can nudge a recheck at a
812
+ // dead session immediately (boot after a deploy restart), and the
813
+ // respawn path needs the title resolver wired in onStart.
814
+ //
815
+ // Fatal, not guarded: onStart assembles the command watchers, the EOD
816
+ // timer and the Slack concierge, and refuses loudly on what must not
817
+ // run half-built (Slack auth.test, a malformed profile pack). Swallowing
818
+ // the throw would leave a daemon that reviews PRs while serving no
819
+ // overseer or operator command and running no sweep. The caller
820
+ // (wire.ts main) stops and exits non-zero; the container restart is the
821
+ // retry.
822
+ if (deps.onStart) {
823
+ // A real event-loop turn between the first status write and the
824
+ // assembly: each is tens of ms of synchronous work, and back to back
825
+ // (with any of onStart's calls answering without real I/O) they would
826
+ // be one uninterrupted span of the boot.
827
+ await yieldToLoop();
828
+ try {
829
+ await deps.onStart(this);
830
+ }
831
+ catch (err) {
832
+ log("onStart failed — refusing to run a half-assembled daemon", err);
833
+ store.logEvent("daemon_error", null, {
834
+ what: "onStart",
835
+ error: String(err),
836
+ fatal: true,
837
+ });
838
+ throw err;
839
+ }
840
+ }
841
+ // The periodic timers go in BEFORE the boot's first reconcile is
842
+ // awaited: that pass, and the dispatch pump it runs after, can hang on
843
+ // an await with no deadline of its own (a worktree fetch), and a boot
844
+ // left waiting there would install no later reconcile, no recovery scan
845
+ // and no status heartbeat. A tick that finds the boot pass still
846
+ // running is skipped like any other overlap.
847
+ every(cfg.daemon.poll_interval_s, reconcileTick);
848
+ every(DISPATCH_TICK_S, () => void pump());
849
+ every(VERDICT_SWEEP_S, () => void guard("verdict sweep", async () => {
850
+ await verdicts.sweep();
851
+ await threadDecisions.sweep();
852
+ await prConversation.sweep();
853
+ await rechecks.sweep();
854
+ }));
855
+ every(DEADLINE_TICK_S, () => {
856
+ void guard("round stage supervisor", async () => {
857
+ try {
858
+ await roundStages.scan();
859
+ }
860
+ finally {
861
+ writeStatus();
862
+ }
863
+ });
864
+ void guard("deadline check", async () => {
865
+ await verdicts.checkDeadlines();
866
+ // A safe pre-fanout exhaustion is a circuit breaker, not an inert
867
+ // operator park.
868
+ await retryDueReviewFailures();
869
+ // Zombie-round expiry: rounds stuck `overdue` past the
870
+ // horizon whose PR has since verdicted/closed become terminal
871
+ // `expired`. Rounds a rerun could still service are left standing.
872
+ if (cfg.daemon.expire_overdue_after_h > 0) {
873
+ const expired = store.expireOverdueRounds(cfg.daemon.expire_overdue_after_h);
874
+ if (expired.length > 0)
875
+ log(`expired ${expired.length} zombie round(s): ids ${expired.join(",")}`);
876
+ }
877
+ // Stranded rounds: the ones the sweep above deliberately leaves —
878
+ // overdue, but the PR is still open and still undecided, so "a rerun
879
+ // could service it". Nothing reruns an overdue round on its own, so
880
+ // past a week it is abandoned: terminalize it and say so. One anomaly
881
+ // per round, once, because the row stops being overdue the moment it
882
+ // is reported.
883
+ for (const r of store.expireStrandedRounds()) {
884
+ store.logAnomaly("round_stranded", r.pr, r.round_no, `round ${r.round_no} has sat overdue since ${r.deadline_at} with nothing to rescue it — closed as expired`, [
885
+ `STRANDED ROUND — PR #${r.pr} round ${r.round_no}`,
886
+ `Overdue since ${r.deadline_at}; its PR was still open and undecided, so the zombie sweep kept skipping it. Nothing reruns an overdue round, so it would have sat there indefinitely.`,
887
+ "The round row is now closed (expired). Its spend still counts. GitHub was NOT touched and the PR was NOT requeued — decide whether this PR still needs a review, and if so trigger one (commands/rerun-round).",
888
+ ].join("\n"));
889
+ log(`stranded round closed: #${r.pr} round ${r.round_no} (overdue since ${r.deadline_at})`);
890
+ }
891
+ });
892
+ });
893
+ every(STATUS_TICK_S, writeStatus);
894
+ if (piAuthWatch)
895
+ every(AUTHWATCH_TICK_S, authWatchTick);
896
+ await reconcile();
897
+ },
898
+ async stop(reason) {
899
+ if (stopping)
900
+ return;
901
+ stopping = true;
902
+ log("stopping");
903
+ if (deps.onStop)
904
+ await guard("onStop", async () => deps.onStop(reason));
905
+ for (const t of timers)
906
+ clearInterval(t);
907
+ timers.length = 0;
908
+ load.stop();
909
+ wakePolicy.stop();
910
+ verdicts.stop();
911
+ threadDecisions.stop();
912
+ rechecks.stop();
913
+ if (server)
914
+ await new Promise((resolve) => server.close(() => resolve()));
915
+ server = null;
916
+ writeStatus();
917
+ store.logEvent("daemon_stop", null, {});
918
+ if (!deps.store)
919
+ store.close();
920
+ },
921
+ };
922
+ }
923
+ // No process entrypoint here, deliberately. An entrypoint in this module
924
+ // would build a real MutationGate against the real config without installing
925
+ // the posting guards or the CI gate. `src/wire.ts` is the production assembly
926
+ // and the only entrypoint that builds a live gate; it installs the guards
927
+ // before it starts. This module stays the stub-wired, test-friendly core.
928
+ // Pinned by `tests/fences-gate.test.ts`.
929
+ //# sourceMappingURL=daemon.js.map