@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,1160 @@
1
+ // setup — the companion's setup & scan tool belt. The one companion
2
+ // extension that exposes the SetupEngine as pi tools: the companion judges,
3
+ // these tools act. Loaded per spawn by the companion's piArgv
4
+ // (src/tui/companion.ts), never registered globally, never on the VM (no new
5
+ // session kind — the single-shepherd invariant, AGENTS.md invariant 7).
6
+ //
7
+ // Tools:
8
+ // - setup_repo_facts: the deterministic facts (stack, frameworks, CI,
9
+ // linters, guides, agent files) and the stack-aware unit candidates;
10
+ // - setup_unit_cut: the saved cut and the draft, re-checked against the
11
+ // repo as it is now, with each unit's case split;
12
+ // - setup_unit_cut_propose / _adjust / _save: the companion proposes, the
13
+ // operator's corrections are applied, and save persists the cut in the
14
+ // state home — refused until it is a complete partition of the repo;
15
+ // - setup_review_history / _themes: read the review history
16
+ // digest the TUI pulled into the state home, page by page, and save the
17
+ // themes condensed from it — the only part that goes on to reviewer
18
+ // memory (`#history`) and the portrait. A theme quoting a raw comment or
19
+ // naming its author is refused;
20
+ // - setup_survey_preview / _start / _status / _stop: the survey
21
+ // over the saved cut, behind a cost preview whose key the start must
22
+ // quote; it runs as background `pass-survey` subagents so the companion
23
+ // keeps talking, and writes unpinned `#survey` notes into the reviewer's
24
+ // memory, superseding the previous survey's;
25
+ // - setup_portrait_assemble / setup_portrait / setup_portrait_narrative:
26
+ // the repo portrait — deterministic facts assembled into the
27
+ // state home, the companion's narrative of them stored in the config home
28
+ // against the facts' key, each keeping the version it replaced for a diff.
29
+ // - setup_interview / setup_profile / setup_profile_apply /
30
+ // setup_profile_validate / setup_pin_propose: the interview's
31
+ // fixed points, concerns and priority table; the profile the install uses
32
+ // and whether setup is owed (the nudge); the answers applied to the repo
33
+ // profile — previewed with a diff, written only once validated by the
34
+ // daemon's own loaders, a commit asked of the operator's machine; the same
35
+ // check for a direct edit; and the memory entries proposed for pinning,
36
+ // which the operator pins in the TUI (no tool here pins).
37
+ // Registered beside them: the PR replay's (extensions/setup-replay.ts):
38
+ // setup_replay_preview / _start / _status / _stop — one or two recent PRs
39
+ // reviewed with the old and the new profile, the cost stated first, the two
40
+ // reviews side by side; the scan's (extensions/setup-scan.ts): scan_preview /
41
+ // _start / _status / _stop, scan_findings and scan_matches / scan_match;
42
+ // stage 2's scan_suggestions / scan_stage2_propose / scan_stage2_start, and
43
+ // the watcher that answers the TUI's stage-2 start click and scan stop; and
44
+ // triage's (extensions/setup-triage.ts): scan_dismiss / scan_promote /
45
+ // scan_close_fixed / scan_memory.
46
+ //
47
+ // Convention (onboarding.ts, tui-view.ts): degrade, never wedge — a pi
48
+ // without registerTool registers nothing and says so, and every tool answers
49
+ // a refusal as its result rather than throwing.
50
+ import { usd } from "../src/setup/presentation.js";
51
+ import { registerQcrTool, textResult as text, refusedResult as refused, } from "@quickchatai/pi-quickreview/extensions/pi-tool.js";
52
+ import { fileURLToPath } from "node:url";
53
+ import { configHome, stateHome } from "../src/install.js";
54
+ import { SetupEngine } from "../src/setup/engine.js";
55
+ import { HISTORY_SECTIONS, HISTORY_PAGE_MAX, QUOTE_WORDS, MAX_THEMES, THEME_SOURCES, THEME_SUMMARY_MAX, THEME_TITLE_MAX, } from "../src/setup/history.js";
56
+ import { checkoutReader, configHomeFs, reviewerMemoryFromEnv, stateHomeFs, tokenFileGitHubReader, } from "../src/setup/adapters.js";
57
+ import { piCaseRunner } from "../src/setup/caserunner.js";
58
+ import { REPO_SCOPE } from "../src/setup/survey.js";
59
+ import { NARRATIVE_FILE, NARRATIVE_MAX, NARRATIVE_PREVIOUS_FILE, PORTRAIT_FACTS_FILE, shapeLines, } from "../src/setup/portrait.js";
60
+ import { resolveMaxConcurrency } from "@quickchatai/pi-quickreview/src/engine/lens/env.js";
61
+ import { ciText, displayRoot, evidenceText, UNIT_KINDS, } from "../src/setup/facts.js";
62
+ import { ADJUST_OPS } from "../src/setup/unitcut.js";
63
+ import { CONCERNS, FIXED_POINTS, PRIORITIES, PRIORITY_SETTINGS, TABLE_KEYS, } from "../src/setup/interview.js";
64
+ import { describeCheck, describeSummary } from "../src/setup/profile.js";
65
+ import { GOALS_MAX_CHARS, MAX_PIN_PROPOSALS, PIN_WHY_MAX, } from "../src/setup/tuning.js";
66
+ import { GUIDE_REASON, RETUNE_REASON_MAX } from "../src/setup/retune.js";
67
+ import { buildScan, scanToolDefinitions, watchTuiRequests } from "./setup-scan.js";
68
+ import { triageToolDefinitions } from "./setup-triage.js";
69
+ import { scanTrackerSink } from "../src/setup/trackersink.js";
70
+ import { buildReplay, replayToolDefinitions } from "./setup-replay.js";
71
+ const NO_PARAMS = { type: "object", properties: {} };
72
+ /** Where the reviewed checkout sits in the companion (CONTAINER.reviewedRepo),
73
+ * when the spawn does not say. */
74
+ export const DEFAULT_REVIEWED_REPO = "/reviewed-repo";
75
+ const reviewedCheckout = (env) => env.QCR_REVIEWED_REPO?.trim() || DEFAULT_REVIEWED_REPO;
76
+ // ---- rendering ---------------------------------------------------------------
77
+ export function renderFacts(facts, head) {
78
+ const ev = (xs) => xs.length === 0 ? " (none found)" : xs.map((x) => ` - ${evidenceText(x)}`).join("\n");
79
+ const list = (xs) => xs.length === 0 ? " (none found)" : xs.map((x) => ` - ${x}`).join("\n");
80
+ return [
81
+ `Repo facts (${facts.files} tracked files${head ? ` at ${head.slice(0, 12)}` : ""}). Deterministic: each fact names the file that shows it; "none found" means no such file, not that the practice is absent.`,
82
+ `Languages:\n${facts.languages.length === 0 ? " (none recognised)" : facts.languages.map((l) => ` - ${l.language}: ${l.files} files`).join("\n")}`,
83
+ `Manifests:\n${ev(facts.manifests)}`,
84
+ `Frameworks:\n${ev(facts.frameworks)}`,
85
+ `CI:\n${facts.ci.length === 0 ? " (none found)" : facts.ci.map((c) => ` - ${ciText(c)}`).join("\n")}`,
86
+ `Linters / formatters:\n${ev(facts.linters)}`,
87
+ `Design docs:\n${list(facts.guides)}`,
88
+ `Style guides:\n${list(facts.style_guides)}`,
89
+ `Agent-directive files:\n${list(facts.agent_files)}`,
90
+ `Unit candidates (a first guess — propose your own cut from these):\n${facts.unit_candidates
91
+ .map((u) => ` - ${u.name} [${u.kind}] ${u.roots.map(displayRoot).join(", ")} — ${u.reason}`)
92
+ .join("\n")}`,
93
+ ].join("\n\n");
94
+ }
95
+ export function renderCut(title, v) {
96
+ const rows = v.units.map((u) => {
97
+ const split = u.cases === null
98
+ ? " — case coverage UNKNOWN"
99
+ : u.cases.length > 1
100
+ ? ` — split into ${u.cases.length} cases (${u.cases.map((c) => `${c.id}: ${c.files}f/${c.lines}l`).join(", ")})`
101
+ : "";
102
+ const over = u.cases?.some((c) => c.over_budget)
103
+ ? " [a file alone exceeds one case — a scan reads it in line ranges]"
104
+ : "";
105
+ return ` - ${u.name} [${u.kind}] ${u.roots.map(displayRoot).join(", ")}: ${u.files ?? "UNKNOWN"} files, ${u.reviewable ?? "UNKNOWN"} reviewable, ${u.lines ?? "UNKNOWN"} lines${split}${over}${u.note ? ` — ${u.note}` : ""}`;
106
+ });
107
+ const lines = [`${title}:`, ...rows];
108
+ if (v.ignored.length > 0)
109
+ lines.push(` ignored: ${v.ignored.join(", ")} (${v.ignored_files ?? "UNKNOWN"} files)`);
110
+ for (const e of v.errors)
111
+ lines.push(` ✗ ${e}`);
112
+ for (const b of v.blocking_save)
113
+ lines.push(` ! ${b}`);
114
+ return lines.join("\n");
115
+ }
116
+ export const CUT_TOOL_VERBS = { save: "setup_unit_cut_save" };
117
+ export const CUT_CLI_VERBS = { save: "qcr scan units save" };
118
+ /** A stored or adjusted draft, and that it is not in use until saved. */
119
+ export function renderDraft(title, draft, verbs = CUT_TOOL_VERBS) {
120
+ return `${renderCut(title, draft)}\n\nNot in use until ${verbs.save}.`;
121
+ }
122
+ export function renderStatus(s) {
123
+ const out = [];
124
+ for (const p of s.problems)
125
+ out.push(`✗ ${p}`);
126
+ if (s.saved) {
127
+ const stale = s.saved.blocking_save.length > 0 ? " — STALE against the repo now, see the ! lines" : "";
128
+ out.push(renderCut(`Saved unit cut (saved ${s.saved.saved_at}${s.saved.head ? ` at ${s.saved.head.slice(0, 12)}` : ""})${stale}`, s.saved));
129
+ }
130
+ else if (s.cut_file_unreadable) {
131
+ out.push("Saved unit cut: UNKNOWN — the cut file could not be read (see above); nothing will overwrite it.");
132
+ }
133
+ else {
134
+ out.push("No saved unit cut yet.");
135
+ }
136
+ if (s.draft)
137
+ out.push(renderCut(`Draft (${s.draft.source}, updated ${s.draft.updated_at}) — not in use until saved`, s.draft));
138
+ if (s.has_previous)
139
+ out.push("The cut before the saved one is kept as `previous` in the state home.");
140
+ return out.join("\n\n");
141
+ }
142
+ export function renderThemes(themes) {
143
+ return themes.length === 0
144
+ ? " (none — an empty history has no themes)"
145
+ : themes.map((t) => ` - ${t.title} [${t.source}, ${t.weight}] — ${t.summary}`).join("\n");
146
+ }
147
+ export function renderHistory(h) {
148
+ const out = [];
149
+ const saved = (f) => h.themes_error !== null
150
+ ? `✗ ${h.themes_error}\nSaved themes: UNKNOWN.`
151
+ : f
152
+ ? `Saved themes (${f.saved_at}, from the digest of ${f.digest_generated_at}):\n${renderThemes(f.themes)}`
153
+ : "No themes saved yet.";
154
+ if (h.digest === "absent") {
155
+ out.push("No review history digest in the state home yet. Ask the owner to run `qcr history pull` on his machine — it reads " +
156
+ "the history on the VM through the App (minutes on a busy repo) and writes the digest here. You cannot fetch it yourself.");
157
+ out.push(saved(h.themes));
158
+ return out.join("\n\n");
159
+ }
160
+ if (h.digest === "unreadable") {
161
+ for (const p of h.problems)
162
+ out.push(`✗ ${p}`);
163
+ out.push("The digest is UNKNOWN until it is pulled again.");
164
+ out.push(saved(h.themes));
165
+ return out.join("\n\n");
166
+ }
167
+ const s = h.summary;
168
+ out.push(`Review history of ${s.repo} (digest ${s.generated_at}, since ${s.since.slice(0, 10)}, ${s.months} months):\n` +
169
+ ` human review comments: ${s.human_comments} on ${s.prs_scanned} of ${s.prs_enumerated} merged PRs${s.truncated ? " (capped — newest kept)" : ""}\n` +
170
+ ` own rounds: ${s.rounds}\n [feedback] signals: ${s.feedback}`);
171
+ for (const p of s.problems)
172
+ out.push(`! ${p}`);
173
+ if (s.empty) {
174
+ out.push("EMPTY history: no merged-PR review comments, no rounds, no feedback. Save an empty theme list to record that.");
175
+ }
176
+ if (h.page) {
177
+ const end = h.page.offset + h.page.lines.length;
178
+ out.push(`${h.page.section} ${h.page.total === 0 ? "(none)" : `${h.page.offset + 1}–${end} of ${h.page.total}`}` +
179
+ `${end < h.page.total ? ` — next page: offset ${end}` : ""}. RAW text: condense it, never copy it onward.\n` +
180
+ h.page.lines.map((l) => ` ${l}`).join("\n"));
181
+ }
182
+ out.push(saved(h.themes));
183
+ return out.join("\n\n");
184
+ }
185
+ const scopeName = (unit) => unit === REPO_SCOPE ? "repo-wide read" : `unit ${unit}`;
186
+ export function renderSurveyPreview(p) {
187
+ const rows = p.cases.map((c) => ` - ${c.id} (${scopeName(c.unit)}): ${c.files.length} files, ${c.lines} lines, ~${usd(c.estimate_usd)}\n` +
188
+ c.files.map((f) => ` ${f.path} — ${f.reason}`).join("\n"));
189
+ const out = [
190
+ `Survey plan${p.head ? ` at ${p.head.slice(0, 12)}` : ""}: ${p.cases.length} cases, ${p.lines} lines, estimated ${usd(p.estimate_usd)} ` +
191
+ `(${p.concurrency} at once; the repo-wide read first, then one case per unit).`,
192
+ `Price basis: ${p.rate.basis}.`,
193
+ ...rows,
194
+ ];
195
+ if (p.unsampled.length > 0)
196
+ out.push(`Not surveyed (no code to sample outside tests and migrations): ${p.unsampled.join(", ")}`);
197
+ if (p.unassigned.length > 0) {
198
+ out.push(`Not surveyed: ${p.unassigned.length} file(s) belong to no unit of the saved cut: ${p.unassigned.slice(0, 10).join(", ")}` +
199
+ `${p.unassigned.length > 10 ? ", …" : ""} — adjust and save the cut to cover them.`);
200
+ }
201
+ out.push(p.existing_entries === null
202
+ ? "Existing #survey memory: UNKNOWN (memory could not be read)."
203
+ : `Existing #survey memory: ${p.existing_entries} live survey-written entries — a completed survey supersedes them (pinned and #manual entries stay).`);
204
+ if (p.last_complete) {
205
+ out.push(`A survey already completed (${p.last_complete.id}, ${p.last_complete.finished_at}, ${p.last_complete.notes} notes, ${usd(p.last_complete.cost_usd)}) — ` +
206
+ "starting again is a RE-SURVEY: only when the operator asked for one, with resurvey: true.");
207
+ }
208
+ for (const b of p.blockers)
209
+ out.push(`✗ ${b}`);
210
+ out.push(`Preview key: ${p.key} — show the operator this cost; start with this key only when he agrees.`);
211
+ return out.join("\n");
212
+ }
213
+ export function renderSurveyStatus(s) {
214
+ const out = s.problems.map((p) => `✗ ${p}`);
215
+ const run = s.run;
216
+ if (run === null) {
217
+ out.push(s.ok
218
+ ? "No survey has run yet."
219
+ : "Survey record: UNKNOWN — the file could not be read (see above); nothing will overwrite it.");
220
+ }
221
+ else {
222
+ const done = run.cases.filter((c) => c.status === "done").length;
223
+ const cost = run.cases.some((c) => c.cost_usd !== null)
224
+ ? run.cases.reduce((n, c) => n + (c.cost_usd ?? 0), 0)
225
+ : null;
226
+ // A finished case the runner could not price makes the sum a floor, and
227
+ // it says so rather than reading as the whole spend.
228
+ const unpriced = run.cases.some((c) => c.cost_usd === null &&
229
+ (c.status === "done" || c.status === "failed" || c.started_at !== null));
230
+ const state = run.display === "interrupted"
231
+ ? "INTERRUPTED — the companion restarted mid-run; notes written so far are kept, start again (after a preview) to finish"
232
+ : run.display;
233
+ out.push(`Survey ${run.id}: ${state}. ${done}/${run.cases.length} cases done; ${run.cases.reduce((n, c) => n + c.notes_written, 0)} notes written; ` +
234
+ `${run.superseded} earlier entries superseded; spent ${cost !== null && unpriced ? "at least " : ""}${usd(cost)} of an estimated ${usd(run.estimate_usd)}.`);
235
+ for (const c of run.cases) {
236
+ const extra = [
237
+ c.none ? "NONE" : "",
238
+ c.notes_failed ? `${c.notes_failed} notes refused by memory` : "",
239
+ c.notes_dropped ? `${c.notes_dropped} over the cap` : "",
240
+ c.notes_truncated ? `${c.notes_truncated} cut at the length cap` : "",
241
+ c.error ?? "",
242
+ ].filter(Boolean);
243
+ out.push(` - ${c.id}: ${c.status}, ${c.notes_written} notes${c.cost_usd !== null ? `, ${usd(c.cost_usd)}` : ""}${extra.length ? ` — ${extra.join("; ")}` : ""}`);
244
+ }
245
+ for (const p of run.problems)
246
+ out.push(` ! ${p}`);
247
+ }
248
+ if (s.last_complete && s.last_complete.id !== run?.id) {
249
+ out.push(`Last completed survey: ${s.last_complete.id} (${s.last_complete.finished_at}).`);
250
+ }
251
+ return out.join("\n");
252
+ }
253
+ const SECTION_TITLES = {
254
+ stack: "Stack",
255
+ units: "Units",
256
+ conventions: "Conventions (written down)",
257
+ enforced: "Enforced (by tooling)",
258
+ history: "Review history themes",
259
+ survey: "Survey",
260
+ scan: "What the scans found",
261
+ problems: "Problems",
262
+ };
263
+ const bullets = (xs, none = " (none found)") => xs.length === 0 ? none : xs.map((x) => ` - ${x}`).join("\n");
264
+ /** The facts, for reading: counts beside the shape lines the key is over. */
265
+ export function renderPortraitFacts(v) {
266
+ const f = v.facts;
267
+ const lines = shapeLines(f);
268
+ const out = [
269
+ `Portrait facts ${v.key} (assembled ${v.assembled_at}${f.head ? ` at ${f.head.slice(0, 12)}` : ""}; ${f.stack.files} tracked files). ` +
270
+ "Deterministic; the key moves only when the SHAPE does (a framework, unit, doc, tool or theme), never with a count.",
271
+ ];
272
+ const langs = f.stack.languages.map((l) => `${l.language} ${l.files}`).join(", ");
273
+ out.push(`${SECTION_TITLES.stack}:\n languages: ${langs || "(none recognised)"}\n` +
274
+ bullets(lines.stack.filter((l) => !l.startsWith("language ")), " (no manifests or frameworks found)"));
275
+ const units = f.units.units.map((u) => `${u.name} [${u.kind}] ${u.roots.map(displayRoot).join(", ")}: ${u.files ?? "UNKNOWN"} files, ${u.lines ?? "UNKNOWN"} lines` +
276
+ `${u.cases === null ? ", case coverage UNKNOWN" : u.cases > 1 ? `, ${u.cases} cases` : ""}${u.note ? ` — ${u.note}` : ""}`);
277
+ const cut = f.units.source === "saved"
278
+ ? `the saved cut (${f.units.saved_at})`
279
+ : "NO SAVED CUT — the deterministic candidates, not the cut";
280
+ out.push(`${SECTION_TITLES.units}, ${cut}:\n${bullets(units)}` +
281
+ (f.units.ignored.length > 0 ? `\n ignored: ${f.units.ignored.join(", ")}` : ""));
282
+ for (const section of ["conventions", "enforced", "history", "survey"]) {
283
+ out.push(`${SECTION_TITLES[section]}:\n${bullets(lines[section])}`);
284
+ }
285
+ const scan = f.scan ?? null;
286
+ if (scan !== null) {
287
+ const t = scan.findings;
288
+ const sev = Object.entries(t.by_severity)
289
+ .map(([k, n]) => `${k} ${n}`)
290
+ .join(", ");
291
+ const units = t.units.map((u) => `${u.unit}: ${u.open} open (${u.promoted} promoted${u.doubted > 0 ? `, ${u.doubted} may not be valid` : ""}), ` +
292
+ `${u.dismissed} dismissed, ${u.fixed} fixed${u.open_by.length > 0 ? ` — ${u.open_by.join(", ")}` : ""}`);
293
+ out.push(`${SECTION_TITLES.scan}${scan.state === "unreadable" ? " (PARTIAL — a scan record is unreadable, see Problems)" : ""}:\n` +
294
+ ` last scan: ${scan.last ? `${scan.last.id} [${scan.last.mode}, ${scan.last.state}] at ${scan.last.sha.slice(0, 12)}${scan.last.finished_at ? `, ${scan.last.finished_at}` : ""}` : "none finished"}\n` +
295
+ ` findings: ${t.open} open${sev ? ` (${sev})` : ""}, ${t.promoted} promoted, ${t.dismissed} dismissed, ${t.fixed} fixed\n` +
296
+ `${bullets(units, " (no findings by unit)")}\n` +
297
+ ` hotspots:\n${scan.hotspots.length === 0 ? " (none written to scan memory)" : scan.hotspots.map((h) => ` - ${h.unit} — ${h.text}`).join("\n")}`);
298
+ }
299
+ if (f.problems.length > 0) {
300
+ out.push(`${SECTION_TITLES.problems} (these parts are UNKNOWN, not empty):\n${f.problems.map((p) => ` ✗ ${p}`).join("\n")}`);
301
+ }
302
+ return out.join("\n\n");
303
+ }
304
+ export function renderFactsDiff(diff, since) {
305
+ if (diff.length === 0)
306
+ return `Facts: no change in shape since ${since}.`;
307
+ const sections = diff.map((d) => ` ${SECTION_TITLES[d.section] ?? d.section}:\n` +
308
+ [...d.added.map((l) => ` + ${l}`), ...d.removed.map((l) => ` - ${l}`)].join("\n"));
309
+ return [`Facts changed since ${since}:`, ...sections].join("\n");
310
+ }
311
+ export function renderPortrait(v) {
312
+ const out = [];
313
+ if (v.facts.state === "absent")
314
+ out.push("No portrait facts yet — setup_portrait_assemble reads them (free, deterministic).");
315
+ else if (v.facts.state === "unreadable")
316
+ out.push(`✗ ${v.facts.error}\nPortrait facts: UNKNOWN.`);
317
+ else
318
+ out.push(renderPortraitFacts(v.facts.file.current));
319
+ const n = v.narrative;
320
+ if (n.state === "no-config-home")
321
+ out.push("Narrative: no config home in this assembly.");
322
+ else if (n.state === "absent")
323
+ out.push(`Narrative: none yet (${NARRATIVE_FILE} in the config home).`);
324
+ else if (n.state === "unreadable")
325
+ out.push(`✗ ${n.error}\nNarrative: UNKNOWN.`);
326
+ else {
327
+ const fresh = v.stale === null
328
+ ? n.doc.facts_key === null
329
+ ? "which facts it was written from is unknown (its header was edited) — check it against the facts yourself"
330
+ : `written from facts ${n.doc.facts_key}; whether it is current is UNKNOWN — the facts cannot be read`
331
+ : v.stale
332
+ ? `STALE — written from facts ${n.doc.facts_key}, and the facts have moved since; re-read them and rewrite it`
333
+ : "current with these facts";
334
+ out.push(`Narrative (${n.doc.written_at ?? "time unknown"}; ${fresh}):\n\n${n.doc.body}`);
335
+ }
336
+ if (v.has_previous_narrative)
337
+ out.push(`The narrative it replaced is kept (${NARRATIVE_PREVIOUS_FILE}).`);
338
+ if (v.previous_narrative_error !== null)
339
+ out.push(`✗ ${v.previous_narrative_error}\nThe kept previous narrative: UNKNOWN.`);
340
+ if (v.facts_diff !== null && v.facts.state === "ok") {
341
+ const prev = v.facts.file.previous;
342
+ out.push(prev
343
+ ? renderFactsDiff(v.facts_diff, `${prev.key} (${prev.assembled_at})`)
344
+ : "Facts: no earlier version kept yet.");
345
+ }
346
+ if (v.narrative_diff !== null && v.previous_narrative_error === null) {
347
+ out.push(!v.has_previous_narrative
348
+ ? "Narrative: no earlier version kept yet."
349
+ : v.narrative_diff.length === 0
350
+ ? "Narrative: the same text as the one it replaced."
351
+ : `Narrative changes since the one it replaced:\n${v.narrative_diff.map((l) => ` ${l}`).join("\n")}`);
352
+ }
353
+ return out.join("\n\n");
354
+ }
355
+ // ---- the interview's tuning ------------------------------------------------------
356
+ const settingsText = (s) => {
357
+ const parts = TABLE_KEYS.filter((k) => s[k] !== undefined).map((k) => `${k} = ${JSON.stringify(s[k])}`);
358
+ return parts.length === 0 ? "(nothing — the shipped behaviour)" : parts.join(", ");
359
+ };
360
+ export function renderInterviewTable() {
361
+ const out = [
362
+ "The four points every setup interview covers (adaptive otherwise — ask from the portrait):",
363
+ ...FIXED_POINTS.map((p) => ` - ${p.name}: ${p.question}`),
364
+ "",
365
+ "Concerns — give each a priority; the table below turns it into lens settings:",
366
+ ];
367
+ for (const { name: point } of FIXED_POINTS.filter((p) => p.name !== "goals")) {
368
+ out.push(` ${point}:`);
369
+ for (const c of CONCERNS.filter((x) => x.point === point))
370
+ out.push(` - ${c.name} — ${c.title} [${c.lenses.join(", ")}]`);
371
+ }
372
+ out.push("", "The table (priority → the lens settings it writes on every lens its concern names):");
373
+ for (const p of PRIORITIES)
374
+ out.push(` - ${p}: ${settingsText(PRIORITY_SETTINGS[p])}`);
375
+ out.push("", "A lens two concerns share takes the HIGHER priority. `normal` clears what an earlier answer wrote. The goals point is " +
376
+ "words: record them as `goals`, and turn what a lens should watch for into that lens's `emphasis`.");
377
+ return out.join("\n");
378
+ }
379
+ export const renderCheck = describeCheck;
380
+ export function renderProfileStatus(s) {
381
+ const out = [];
382
+ out.push(s.target.state === "ok"
383
+ ? `Live config ${s.target.config} names ${s.target.named === "" ? "NO repo profile" : `profile "${s.target.named}"`}.`
384
+ : `✗ Live config: ${s.target.error}`);
385
+ if (s.needs_setup === true) {
386
+ out.push(`SETUP IS OWED: ${s.why_setup}. Tell the owner, once, and offer to run setup (the \`setup\` skill) — never start it on your own.`);
387
+ }
388
+ else if (s.needs_setup === null) {
389
+ out.push(`Whether setup is owed is UNKNOWN: ${s.why_setup}. Do not nudge on it; say what could not be read.`);
390
+ }
391
+ if (s.profile && s.check)
392
+ out.push(renderCheck(s.profile, s.check));
393
+ if (s.target.state === "ok" && s.profile && s.target.named !== s.profile) {
394
+ out.push(`The live config does not name "${s.profile}", so PR rounds do not use it yet: the owner sets \`[review] profile = "${s.profile}"\` in ${s.target.config} (you cannot write it) and deploys.`);
395
+ }
396
+ if (s.interview.state === "unreadable")
397
+ out.push(`✗ ${s.interview.error}`);
398
+ else if (s.interview.state === "ok") {
399
+ const r = s.interview.record;
400
+ out.push(`Interview answers (${r.updated_at}): goals ${r.goals === null ? "NOT recorded" : "recorded"}; ` +
401
+ Object.entries(r.priorities)
402
+ .map(([c, p]) => `${c} ${p}`)
403
+ .join(", "));
404
+ }
405
+ else
406
+ out.push("No interview recorded yet.");
407
+ if (s.unanswered === null)
408
+ out.push("Unanswered concerns: UNKNOWN (the interview record cannot be read).");
409
+ else if (s.unanswered.length > 0)
410
+ out.push(`Unanswered concerns: ${s.unanswered.join(", ")}.`);
411
+ for (const c of s.commits) {
412
+ const r = c.result;
413
+ out.push(` commit ${c.id}: ${r === null ? "requested — the owner's TUI (or `qcr setup commit`) carries it out" : r === "unreadable" ? "result UNKNOWN (unreadable)" : `${r.state}${r.sha ? ` ${r.sha.slice(0, 12)}` : ""} — ${r.detail}`}`);
414
+ }
415
+ return out.join("\n");
416
+ }
417
+ function renderDecisions(ds) {
418
+ return ds.length === 0
419
+ ? " (no concern answered yet)"
420
+ : ds
421
+ .map((d) => ` - ${d.lens}: ${d.priority} (${d.because.join(", ")}) → ${settingsText(d.settings)}`)
422
+ .join("\n");
423
+ }
424
+ export function renderApply(r) {
425
+ const out = [];
426
+ out.push(r.written
427
+ ? `Profile "${r.profile}" ${r.created ? "created" : "updated"} at ${r.dir}.`
428
+ : r.unchanged
429
+ ? `Profile "${r.profile}": these answers change nothing — it already says this.`
430
+ : `PREVIEW of profile "${r.profile}" (${r.dir}) — nothing written. Show the owner the diff; write only when he agrees.`);
431
+ out.push(`What the table decides:\n${renderDecisions(r.decisions)}`);
432
+ for (const d of r.diff)
433
+ out.push(`${d.file}:\n${d.lines.map((l) => ` ${l}`).join("\n")}`);
434
+ out.push(`Validated with the daemon's own loaders:\n${describeSummary(r.summary)}`);
435
+ const todo = [...(r.goals_missing ? ["the goals"] : []), ...r.unanswered];
436
+ if (todo.length > 0)
437
+ out.push(`Still to ask before it can be written: ${todo.join(", ")}.`);
438
+ if (r.config_names !== null && r.config_names !== r.profile) {
439
+ out.push(`The live config names ${r.config_names === "" ? "no profile" : `"${r.config_names}"`}: until the owner sets \`[review] profile = "${r.profile}"\` there and deploys, PR rounds do not use this one.`);
440
+ }
441
+ if (r.written) {
442
+ out.push(`${r.commit ? `A commit was asked for (${r.commit.id}); it lands if the config home is a git repo. ` : ""}` +
443
+ 'PR reviews change only when the owner deploys — the deploy tab says "profile changed, not deployed" until then.');
444
+ }
445
+ // The replay's default "old" side is this record — say when it
446
+ // could not be kept, never leave the companion to find out at preview.
447
+ if (r.baseline !== null) {
448
+ out.push("id" in r.baseline
449
+ ? `The profile as it was before this write is kept for a replay (${r.baseline.id}).`
450
+ : `✗ ${r.baseline.error} — a replay cannot default to "before this write"; pass old explicitly.`);
451
+ }
452
+ return out.join("\n\n");
453
+ }
454
+ /** A re-tune's report: what changed, why, what it moved, and that it waits on a deploy. */
455
+ export function renderRetune(r) {
456
+ const out = [];
457
+ out.push(r.written
458
+ ? `Re-tuned profile "${r.profile}" after scan ${r.scan.run} (${r.scan.mode} at ${r.scan.sha.slice(0, 12)}).`
459
+ : r.record
460
+ ? `Re-tune recorded after scan ${r.scan.run}, but no profile file changed — nothing to deploy.`
461
+ : `PREVIEW of a re-tune of "${r.profile}" after scan ${r.scan.run} — nothing written. Tell the owner what you will change and why; then write it.`);
462
+ out.push("What changed, and why:\n" +
463
+ r.changes
464
+ .map((c) => ` - ${c.input}: ${c.from} → ${c.to}\n why: ${c.why}\n` +
465
+ (c.effects.length > 0
466
+ ? c.effects.map((e) => ` moves ${e}`).join("\n")
467
+ : " moves no resolved lens setting"))
468
+ .join("\n"));
469
+ for (const d of r.diff)
470
+ out.push(`${d.file}:\n${d.lines.map((l) => ` ${l}`).join("\n")}`);
471
+ if (r.config_names !== null && r.config_names !== r.profile) {
472
+ out.push(`The live config names ${r.config_names === "" ? "no profile" : `"${r.config_names}"`} — PR rounds do not use "${r.profile}" even once deployed.`);
473
+ }
474
+ if (r.record) {
475
+ const portrait = "key" in r.record.portrait
476
+ ? `Portrait facts refreshed (key ${r.record.portrait.key}) — if your narrative is now STALE, rewrite it from them.`
477
+ : `The portrait facts could NOT be refreshed: ${r.record.portrait.error}.`;
478
+ out.push(portrait);
479
+ }
480
+ if (r.written) {
481
+ out.push(`${r.commit ? `A commit was asked for (${r.commit.id}). ` : ""}` +
482
+ 'Report this to the owner: what changed and why. It reaches PR reviews ONLY when he deploys — the deploy tab shows this re-tune as "profile changed, not deployed" until then. You never deploy.');
483
+ }
484
+ return out.join("\n\n");
485
+ }
486
+ // ---- tool belt ---------------------------------------------------------------
487
+ const UNIT_SCHEMA = {
488
+ type: "object",
489
+ properties: {
490
+ name: {
491
+ type: "string",
492
+ description: "Plain name: letters, digits, '.', '_', '-' (it keys every report).",
493
+ },
494
+ roots: {
495
+ type: "array",
496
+ items: { type: "string" },
497
+ description: 'Repo-relative directory or file prefixes the unit owns; "" is the repo root (a catch-all).',
498
+ },
499
+ kind: {
500
+ type: "string",
501
+ description: UNIT_KINDS.join(" | "),
502
+ },
503
+ note: { type: "string", description: "Why this unit — shown beside it." },
504
+ },
505
+ required: ["name", "roots"],
506
+ };
507
+ export function toolDefinitions(engine) {
508
+ const facts = {
509
+ name: "setup_repo_facts",
510
+ label: "Repo facts",
511
+ description: "Deterministic facts about the reviewed repo, read from its files without a model: languages, manifests, frameworks, CI, " +
512
+ "linters and formatters, design docs, style guides, agent-directive files, and stack-aware unit candidates. " +
513
+ "Free — call it before judging anything about the repo's shape.",
514
+ promptSnippet: "Read the reviewed repo's deterministic facts",
515
+ parameters: NO_PARAMS,
516
+ execute: async () => {
517
+ const r = engine.facts();
518
+ if (!r.ok)
519
+ return refused("Repo facts", r);
520
+ return text(renderFacts(r.facts, r.head), { facts: r.facts, head: r.head });
521
+ },
522
+ };
523
+ const status = {
524
+ name: "setup_unit_cut",
525
+ label: "Unit cut",
526
+ description: "The saved unit cut (the one survey and scan reuse) and any draft, each re-checked against the repo as it is now: files and " +
527
+ "lines per unit, how an oversized unit splits into cases (the unit's name kept), ignored trees, and anything save would refuse.",
528
+ promptSnippet: "Show the saved unit cut and the draft",
529
+ parameters: NO_PARAMS,
530
+ execute: async () => {
531
+ const s = engine.status();
532
+ return text(renderStatus(s), { status: s });
533
+ },
534
+ };
535
+ const propose = {
536
+ name: "setup_unit_cut_propose",
537
+ label: "Propose a unit cut",
538
+ description: "Store YOUR proposed unit cut as the draft (replacing an earlier draft, never the saved cut). A unit owns path prefixes; a file " +
539
+ "belongs to the unit with the longest matching root, so units may nest; `ignored` prefixes are reviewed by nobody. Omit `units` " +
540
+ "to start from the deterministic candidates. Show the operator the result and let them adjust before saving.",
541
+ promptSnippet: "Propose a unit cut as the draft",
542
+ parameters: {
543
+ type: "object",
544
+ properties: {
545
+ units: { type: "array", items: UNIT_SCHEMA },
546
+ ignored: {
547
+ type: "array",
548
+ items: { type: "string" },
549
+ description: "Prefixes nobody reviews (vendored, generated).",
550
+ },
551
+ },
552
+ },
553
+ execute: async (_id, params) => {
554
+ const r = engine.propose(params && "units" in params ? params : undefined);
555
+ if (!r.ok)
556
+ return refused("Proposal", r);
557
+ return text(renderDraft("Draft stored", r.draft), { draft: r.draft });
558
+ },
559
+ };
560
+ const adjust = {
561
+ name: "setup_unit_cut_adjust",
562
+ label: "Adjust the unit cut",
563
+ description: "Apply the operator's corrections to the draft (a draft is started from the saved cut when there is none). All-or-nothing: " +
564
+ `one bad op changes nothing. Ops: ${ADJUST_OPS.join(", ")} — {op:"rename",unit,to}, {op:"add",name,roots,kind?,note?}, ` +
565
+ '{op:"remove",unit}, {op:"merge",units:[…],into}, {op:"move",root,to}, {op:"set_roots",unit,roots}, {op:"ignore",roots}, ' +
566
+ '{op:"unignore",roots}, {op:"note",unit,note}. A root given to add/move/set_roots/ignore is taken from whoever held it.',
567
+ promptSnippet: "Adjust the draft unit cut",
568
+ parameters: {
569
+ type: "object",
570
+ properties: { ops: { type: "array", items: { type: "object" } } },
571
+ required: ["ops"],
572
+ },
573
+ execute: async (_id, params) => {
574
+ const r = engine.adjust(params?.ops);
575
+ if (!r.ok)
576
+ return refused("Adjustment", r);
577
+ return text(renderDraft("Draft adjusted", r.draft), { draft: r.draft });
578
+ },
579
+ };
580
+ const save = {
581
+ name: "setup_unit_cut_save",
582
+ label: "Save the unit cut",
583
+ description: "Make the draft THE unit cut, persisted in the install's state home and reused by every survey and scan. Refused unless every " +
584
+ "file is in exactly one unit or ignored and no unit is empty. The cut it replaces is kept. Save only when the operator agreed.",
585
+ promptSnippet: "Save the draft as the unit cut",
586
+ parameters: NO_PARAMS,
587
+ execute: async () => {
588
+ const r = engine.save();
589
+ if (!r.ok)
590
+ return refused("Save", r);
591
+ return text(renderCut("Unit cut saved", r.saved), { saved: r.saved });
592
+ },
593
+ };
594
+ const history = {
595
+ name: "setup_review_history",
596
+ label: "Review history",
597
+ description: "The review history digest in the install's state home: human review comments on merged PRs of the last six months, the " +
598
+ "reviewer's own rounds, and [feedback]. Without `section` it summarises; with one it returns a page of RAW items " +
599
+ "(human | rounds | feedback) to read and condense. Raw comments stay in the state home: never quote them, and never name " +
600
+ "who wrote them, in anything you write elsewhere.",
601
+ promptSnippet: "Read the review history digest",
602
+ parameters: {
603
+ type: "object",
604
+ properties: {
605
+ section: { type: "string", enum: HISTORY_SECTIONS },
606
+ offset: { type: "number", description: "First item of the page (0-based)." },
607
+ limit: {
608
+ type: "number",
609
+ description: `Items per page (at most ${HISTORY_PAGE_MAX}; default 50).`,
610
+ },
611
+ },
612
+ },
613
+ execute: async (_id, params) => {
614
+ const p = (params ?? {});
615
+ const section = typeof p.section === "string" && HISTORY_SECTIONS.some((s) => s === p.section)
616
+ ? p.section
617
+ : null;
618
+ const num = (v) => typeof v === "number" && Number.isFinite(v) ? v : undefined;
619
+ const offset = num(p.offset);
620
+ const limit = num(p.limit);
621
+ const h = engine.history(section
622
+ ? {
623
+ section,
624
+ ...(offset !== undefined ? { offset } : {}),
625
+ ...(limit !== undefined ? { limit } : {}),
626
+ }
627
+ : null);
628
+ return text(renderHistory(h), { digest: h.digest, summary: h.summary });
629
+ },
630
+ };
631
+ const themes = {
632
+ name: "setup_review_history_themes",
633
+ label: "Save review history themes",
634
+ description: `Save the THEMES you condensed from the review history — at most ${MAX_THEMES}, each {title (≤${THEME_TITLE_MAX}), summary ` +
635
+ `(≤${THEME_SUMMARY_MAX}), source: ${THEME_SOURCES.join("|")}, weight: items behind it}. Your own words about the code and ` +
636
+ `what reviewers ask for; a theme that quotes a raw comment (${QUOTE_WORDS} words running) or names a comment's author is refused. ` +
637
+ "Saved to the state home (the portrait reads them) and written to reviewer memory as #history entries, replacing the " +
638
+ "earlier unpinned ones. An empty list is valid for an empty history.",
639
+ promptSnippet: "Save the review history themes",
640
+ parameters: {
641
+ type: "object",
642
+ properties: {
643
+ themes: {
644
+ type: "array",
645
+ items: {
646
+ type: "object",
647
+ properties: {
648
+ title: { type: "string" },
649
+ summary: { type: "string" },
650
+ source: { type: "string", enum: [...THEME_SOURCES] },
651
+ weight: { type: "number" },
652
+ },
653
+ required: ["title", "summary", "source", "weight"],
654
+ },
655
+ },
656
+ },
657
+ required: ["themes"],
658
+ },
659
+ execute: async (_id, params) => {
660
+ const r = await engine.saveHistoryThemes(params?.themes);
661
+ if (!r.ok)
662
+ return refused("Themes", r);
663
+ const mem = r.memory;
664
+ const memLine = `Memory: ${mem.written} #history entr${mem.written === 1 ? "y" : "ies"} written, ${mem.retired} earlier retired.` +
665
+ (mem.problems.length > 0 ? `\n${mem.problems.map((p) => `! ${p}`).join("\n")}` : "");
666
+ return text(`Themes saved:\n${renderThemes(r.themes)}\n\n${memLine}`, {
667
+ themes: r.themes,
668
+ memory: mem,
669
+ });
670
+ },
671
+ };
672
+ const surveyPreview = {
673
+ name: "setup_survey_preview",
674
+ label: "Survey preview",
675
+ description: "What the setup survey would read and cost, over the SAVED unit cut: first a repo-wide read of every agent-directive file and " +
676
+ "design doc in full, then one `pass-survey` case (at `low`) per unit over a small code sample — entry points, models/schemas, " +
677
+ "the most-changed and the largest files. Returns the price and a preview key. Show the operator the price before starting.",
678
+ promptSnippet: "Preview the setup survey and its cost",
679
+ parameters: NO_PARAMS,
680
+ execute: async () => {
681
+ const r = await engine.surveyPreview();
682
+ if (!r.ok)
683
+ return refused("Survey preview", r);
684
+ return text(renderSurveyPreview(r.preview), { preview: r.preview });
685
+ },
686
+ };
687
+ const surveyStart = {
688
+ name: "setup_survey_start",
689
+ label: "Start the survey",
690
+ description: "Start the previewed survey in the BACKGROUND and return at once — keep talking to the operator; setup_survey_status shows " +
691
+ "progress. `key` is the preview's key: a plan or price that changed since is refused. A survey writes unpinned `#survey` notes " +
692
+ "into reviewer memory; once one has completed, starting again is a re-survey that supersedes them — only when the operator " +
693
+ "asks, with `resurvey: true`. Never start one on your own initiative.",
694
+ promptSnippet: "Start the previewed survey in the background",
695
+ parameters: {
696
+ type: "object",
697
+ properties: {
698
+ key: { type: "string", description: "The key setup_survey_preview returned." },
699
+ resurvey: {
700
+ type: "boolean",
701
+ description: "The operator asked to survey again, superseding the last survey's notes.",
702
+ },
703
+ },
704
+ required: ["key"],
705
+ },
706
+ execute: async (_id, params) => {
707
+ const p = (params ?? {});
708
+ const r = await engine.surveyStart({ key: p.key, resurvey: p.resurvey });
709
+ if (!r.ok)
710
+ return refused("Survey start", r);
711
+ return text(`Survey ${r.run.id} started in the background: ${r.run.cases.length} cases, estimated ${usd(r.run.estimate_usd)}. ` +
712
+ "It needs nothing from you; check setup_survey_status when the operator asks, or in a while.", { run: r.run });
713
+ },
714
+ };
715
+ const surveyStatus = {
716
+ name: "setup_survey_status",
717
+ label: "Survey status",
718
+ description: "The latest survey: each case's state, notes written, cost so far against the estimate, earlier entries superseded, and " +
719
+ "anything that went wrong. A run the companion restarted in the middle of shows as INTERRUPTED.",
720
+ promptSnippet: "Show the survey's progress",
721
+ parameters: NO_PARAMS,
722
+ execute: async () => {
723
+ const s = engine.surveyStatus();
724
+ return text(renderSurveyStatus(s), { status: s });
725
+ },
726
+ };
727
+ const surveyStop = {
728
+ name: "setup_survey_stop",
729
+ label: "Stop the survey",
730
+ description: "Stop the running survey: running cases are killed, pending ones never start; notes already written stay.",
731
+ promptSnippet: "Stop the running survey",
732
+ parameters: NO_PARAMS,
733
+ execute: async () => {
734
+ const r = engine.surveyStop();
735
+ if (!r.ok)
736
+ return refused("Survey stop", r);
737
+ return text(`Stopping survey ${r.id}; setup_survey_status shows what it finished.`);
738
+ },
739
+ };
740
+ const portraitAssemble = {
741
+ name: "setup_portrait_assemble",
742
+ label: "Assemble the portrait facts",
743
+ description: "Assemble the repo portrait's FACTS from what is on disk now — the stack, the saved unit cut (the candidates, flagged, before " +
744
+ "one is saved), the conventions the repo writes down and what its CI and linters already enforce, and the saved review " +
745
+ `history themes — and store them in the state home (${PORTRAIT_FACTS_FILE}). Free and deterministic. When their shape changed, ` +
746
+ "the version they replace is kept and the answer says what changed. Returns the facts key a narrative is stored against.",
747
+ promptSnippet: "Assemble the repo portrait facts",
748
+ parameters: NO_PARAMS,
749
+ execute: async () => {
750
+ const r = engine.portraitAssemble();
751
+ if (!r.ok)
752
+ return refused("Portrait facts", r);
753
+ const out = [renderPortraitFacts(r.current)];
754
+ out.push(r.unchanged
755
+ ? "Facts: no change in shape since they were last assembled (counts refreshed)."
756
+ : r.previous
757
+ ? renderFactsDiff(r.diff, `${r.previous.key} (${r.previous.assembled_at})`)
758
+ : "The first facts for this repo — nothing earlier to compare.");
759
+ const v = engine.portrait();
760
+ if (v.narrative.state === "ok") {
761
+ out.push(v.stale === false
762
+ ? "Your stored narrative is current with these facts."
763
+ : v.stale === true
764
+ ? "Your stored narrative was not written from these facts — read it (setup_portrait) and rewrite it from them."
765
+ : "Which facts your stored narrative was written from is unknown (its header was edited) — read it (setup_portrait) and check it against these facts.");
766
+ }
767
+ else if (v.narrative.state === "absent") {
768
+ out.push(`No narrative stored yet: write the operator a reading of these facts and store it with setup_portrait_narrative, facts_key ${r.current.key}.`);
769
+ }
770
+ return text(out.join("\n\n"), { key: r.current.key, unchanged: r.unchanged, diff: r.diff });
771
+ },
772
+ };
773
+ const portrait = {
774
+ name: "setup_portrait",
775
+ label: "Repo portrait",
776
+ description: "The stored repo portrait as it is, nothing reassembled: the facts, your narrative and whether it is STALE (written from " +
777
+ "other facts), and — with `diff: true` — what changed in the facts and in the narrative since the versions they replaced.",
778
+ promptSnippet: "Read the stored repo portrait",
779
+ parameters: {
780
+ type: "object",
781
+ properties: {
782
+ diff: {
783
+ type: "boolean",
784
+ description: "Also show what changed since the kept previous versions.",
785
+ },
786
+ },
787
+ },
788
+ execute: async (_id, params) => {
789
+ const v = engine.portrait({
790
+ diff: params?.diff === true,
791
+ });
792
+ return text(renderPortrait(v), {
793
+ facts: v.facts.state,
794
+ narrative: v.narrative.state,
795
+ stale: v.stale,
796
+ });
797
+ },
798
+ };
799
+ const narrative = {
800
+ name: "setup_portrait_narrative",
801
+ label: "Store the portrait narrative",
802
+ description: `Store YOUR narrative of the portrait facts — prose for the operator, at most ${NARRATIVE_MAX} characters — in the install's ` +
803
+ `config home (${NARRATIVE_FILE}). \`facts_key\` is the key of the facts you read: facts assembled since refuse it (read ` +
804
+ "them again). A narrative that quotes a raw review comment or names its author is refused. The narrative it replaces is " +
805
+ `kept (${NARRATIVE_PREVIOUS_FILE}) and the answer shows what changed.`,
806
+ promptSnippet: "Store the repo portrait narrative",
807
+ parameters: {
808
+ type: "object",
809
+ properties: {
810
+ facts_key: {
811
+ type: "string",
812
+ description: "The key setup_portrait_assemble (or setup_portrait) showed.",
813
+ },
814
+ narrative: {
815
+ type: "string",
816
+ description: "Markdown prose: what the facts say about this repo, and what they leave open.",
817
+ },
818
+ },
819
+ required: ["facts_key", "narrative"],
820
+ },
821
+ execute: async (_id, params) => {
822
+ const p = (params ?? {});
823
+ const r = engine.storePortraitNarrative({ facts_key: p.facts_key, narrative: p.narrative });
824
+ if (!r.ok)
825
+ return refused("Narrative", r);
826
+ if (r.unchanged) {
827
+ return text(`Narrative unchanged — the stored one is the same text, from facts ${r.facts_key}.`, { unchanged: true });
828
+ }
829
+ const out = [
830
+ `Narrative stored from facts ${r.facts_key} (${NARRATIVE_FILE} in the config home).`,
831
+ ];
832
+ if (r.replaced) {
833
+ out.push(`The previous one is kept (${NARRATIVE_PREVIOUS_FILE}); changes:\n${r.diff.map((l) => ` ${l}`).join("\n")}`);
834
+ }
835
+ return text(out.join("\n\n"), { facts_key: r.facts_key, replaced: r.replaced });
836
+ },
837
+ };
838
+ const interview = {
839
+ name: "setup_interview",
840
+ label: "Setup interview",
841
+ description: "The setup interview's fixed frame: the four points every interview covers (goals, merge-blocking concerns, risk areas, " +
842
+ "style & tests), the concerns you give a priority each (critical | important | normal | ignore), and the table in code " +
843
+ "that turns a priority into lens settings. Read it before the interview; ask adaptively from the portrait.",
844
+ promptSnippet: "Show the setup interview's points, concerns and priority table",
845
+ parameters: NO_PARAMS,
846
+ execute: async () => text(renderInterviewTable()),
847
+ };
848
+ const profileState = {
849
+ name: "setup_profile",
850
+ label: "Repo profile",
851
+ description: "The repo profile this install uses: what the live config names, whether it loads (the daemon's own check), whether " +
852
+ "setup is OWED (no profile of the repo's own — nudge the owner once), the interview answers recorded so far, the " +
853
+ "concerns still unanswered, and each commit asked for with what became of it.",
854
+ promptSnippet: "Show the repo profile, whether setup is owed, and the interview so far",
855
+ parameters: NO_PARAMS,
856
+ execute: async () => {
857
+ const s = engine.profileStatus();
858
+ if (!("target" in s))
859
+ return refused("Profile status", s);
860
+ return text(renderProfileStatus(s), {
861
+ needs_setup: s.needs_setup,
862
+ profile: s.profile,
863
+ unanswered: s.unanswered,
864
+ });
865
+ },
866
+ };
867
+ const profileApply = {
868
+ name: "setup_profile_apply",
869
+ label: "Apply the interview to the profile",
870
+ description: "Turn the interview's answers into the repo profile. `priorities` {concern: critical|important|normal|ignore} map through " +
871
+ "the table (setup_interview) onto each concern's lenses; `emphasis` {lens: words | null} is what that lens should watch " +
872
+ "for here; `style_guide` is a guide you drafted (markdown) for a repo that writes none — a guide the repo writes always " +
873
+ "wins; `goals` is the project's goals in the owner's words. A WRITE records the answers, so a later call (a re-tune) " +
874
+ "sends only what changed; a preview uses the recorded answers plus its own and records nothing. Without `write` it " +
875
+ "PREVIEWS: the diff and what the table decided, nothing written. `write: true` needs every concern answered and the " +
876
+ "goals, validates the result with the daemon's own loaders (refused, unchanged, if it would not load), writes it into " +
877
+ "the config home and asks for a commit there. Write only after the owner saw the diff and agreed.",
878
+ promptSnippet: "Preview or write the repo profile from the interview's answers",
879
+ parameters: {
880
+ type: "object",
881
+ properties: {
882
+ profile: {
883
+ type: "string",
884
+ description: "The profile's name — needed only when the live config names none (the repo's name is a good one).",
885
+ },
886
+ goals: {
887
+ type: "string",
888
+ description: `The project's goals, in the owner's words (at most ${GOALS_MAX_CHARS} characters).`,
889
+ },
890
+ priorities: {
891
+ type: "object",
892
+ description: `{concern: priority}; concerns: ${CONCERNS.map((c) => c.name).join(", ")}; priorities: ${PRIORITIES.join(", ")}.`,
893
+ },
894
+ emphasis: {
895
+ type: "object",
896
+ description: "{lens: the words for it, or null to remove them}.",
897
+ },
898
+ style_guide: {
899
+ type: "string",
900
+ description: "A style guide you drafted (markdown), for a repo that writes none.",
901
+ },
902
+ drop_style_guide: {
903
+ type: "boolean",
904
+ description: "true stops the style lens reading the drafted guide.",
905
+ },
906
+ write: { type: "boolean", description: "true writes; omitted or false previews." },
907
+ },
908
+ },
909
+ execute: async (_id, params) => {
910
+ const r = engine.profileApply(params ?? {});
911
+ if (!r.ok)
912
+ return refused("Profile", r);
913
+ return text(renderApply(r), {
914
+ written: r.written,
915
+ unchanged: r.unchanged,
916
+ profile: r.profile,
917
+ commit: r.commit,
918
+ });
919
+ },
920
+ };
921
+ const retune = {
922
+ name: "setup_retune",
923
+ label: "Re-tune the profile after a scan",
924
+ description: "After a scan, change the repo profile from what the scan found — through the same path as setup_profile_apply " +
925
+ "(`priorities` through the table, `emphasis`, a drafted `style_guide`) — and REPORT it. Needs a finished scan run (the " +
926
+ "latest, or `scan`) and a finished setup interview. Every change needs its reason in `reasons` — keyed by the concern " +
927
+ `(a priority), the lens (an emphasis) or "${GUIDE_REASON}" — at most ${RETUNE_REASON_MAX} characters, citing what the scan ` +
928
+ "found; a reason for something that does not change is refused. Without `write` it PREVIEWS. `write: true` writes the " +
929
+ "profile (validated with the daemon's own loaders), logs the report, refreshes the portrait facts and asks for a " +
930
+ "commit. You apply it yourself — then tell the owner what changed and why. It reaches PR reviews only when HE deploys.",
931
+ promptSnippet: "Preview or apply a post-scan re-tune of the repo profile, with its reasons",
932
+ parameters: {
933
+ type: "object",
934
+ properties: {
935
+ scan: {
936
+ type: "string",
937
+ description: "The finished scan run it follows (scan_status); the latest when omitted.",
938
+ },
939
+ priorities: {
940
+ type: "object",
941
+ description: `{concern: priority} to change; concerns: ${CONCERNS.map((c) => c.name).join(", ")}; priorities: ${PRIORITIES.join(", ")}.`,
942
+ },
943
+ emphasis: {
944
+ type: "object",
945
+ description: "{lens: the words for it, or null to remove them}.",
946
+ },
947
+ style_guide: { type: "string", description: "A revised drafted style guide (markdown)." },
948
+ drop_style_guide: {
949
+ type: "boolean",
950
+ description: "true stops the style lens reading the drafted guide.",
951
+ },
952
+ reasons: {
953
+ type: "object",
954
+ description: `{concern | lens | "${GUIDE_REASON}": why, from what the scan found} — one per change.`,
955
+ },
956
+ write: { type: "boolean", description: "true writes; omitted or false previews." },
957
+ },
958
+ required: ["reasons"],
959
+ },
960
+ execute: async (_id, params) => {
961
+ const r = engine.retune(params ?? {});
962
+ if (!r.ok)
963
+ return refused("Re-tune", r);
964
+ return text(renderRetune(r), {
965
+ written: r.written,
966
+ profile: r.profile,
967
+ scan: r.scan.run,
968
+ changes: r.changes.length,
969
+ commit: r.commit,
970
+ });
971
+ },
972
+ };
973
+ const profileValidate = {
974
+ name: "setup_profile_validate",
975
+ label: "Validate the repo profile",
976
+ description: "Check a repo profile AS IT IS ON DISK with the daemon's own loaders — for a direct edit (the owner's editor, or yours): " +
977
+ "whether the daemon would boot with it and what it resolves to (the extends chain, addenda, tuned lenses, heuristics, " +
978
+ "[scan]). Defaults to the profile setup works on.",
979
+ promptSnippet: "Validate the repo profile on disk",
980
+ parameters: { type: "object", properties: { profile: { type: "string" } } },
981
+ execute: async (_id, params) => {
982
+ const r = engine.profileValidate(params?.profile);
983
+ if (!("check" in r))
984
+ return refused("Validate", r);
985
+ return text(renderCheck(r.profile, r.check), { ok: r.check.ok });
986
+ },
987
+ };
988
+ const pins = {
989
+ name: "setup_pin_propose",
990
+ label: "Propose memory pins",
991
+ description: `Propose up to ${MAX_PIN_PROPOSALS} reviewer-memory entries (the survey's and history's most important conventions) for ` +
992
+ "PINNING — pinned entries head every PR round, and the head is small. Each is {id, ts, block, why}: a live, unpinned " +
993
+ `entry as memory lists it, and one line (≤${PIN_WHY_MAX}) of why. It REPLACES earlier proposals and pins NOTHING: the ` +
994
+ "owner pins in the TUI's memory tab, where each proposal is marked with your reason. The answer prices the pinned head.",
995
+ promptSnippet: "Propose memory entries for the owner to pin",
996
+ parameters: {
997
+ type: "object",
998
+ properties: {
999
+ entries: {
1000
+ type: "array",
1001
+ items: {
1002
+ type: "object",
1003
+ properties: {
1004
+ id: { type: "string" },
1005
+ ts: { type: "string" },
1006
+ block: { type: "number" },
1007
+ why: { type: "string" },
1008
+ },
1009
+ required: ["id", "ts", "block", "why"],
1010
+ },
1011
+ },
1012
+ },
1013
+ required: ["entries"],
1014
+ },
1015
+ execute: async (_id, params) => {
1016
+ const r = await engine.proposePins(params?.entries);
1017
+ if (!r.ok)
1018
+ return refused("Pin proposals", r);
1019
+ const over = r.projected_chars > r.budget_chars;
1020
+ return text([
1021
+ `Proposed ${r.proposed.length} entr${r.proposed.length === 1 ? "y" : "ies"} for the owner to pin${r.replaced > 0 ? ` (replacing ${r.replaced} earlier proposals)` : ""}:`,
1022
+ ...r.proposed.map((p) => ` ☆ ${p.ts} [${p.id}#${p.block}] ${p.excerpt} — ${p.why}`),
1023
+ `Pinned head: ${r.pinned_chars} characters now, ${r.projected_chars} if he pins them all (budget ~${r.budget_chars})${over ? " — OVER: propose fewer, or shorter entries" : ""}.`,
1024
+ "Tell him they are marked ☆ on the TUI's memory tab ([2]); he pins with p. You do not pin them.",
1025
+ ].join("\n"), { proposed: r.proposed.length, projected_chars: r.projected_chars });
1026
+ },
1027
+ };
1028
+ return [
1029
+ facts,
1030
+ status,
1031
+ propose,
1032
+ adjust,
1033
+ save,
1034
+ history,
1035
+ themes,
1036
+ surveyPreview,
1037
+ surveyStart,
1038
+ surveyStatus,
1039
+ surveyStop,
1040
+ portraitAssemble,
1041
+ portrait,
1042
+ narrative,
1043
+ interview,
1044
+ profileState,
1045
+ profileApply,
1046
+ retune,
1047
+ profileValidate,
1048
+ pins,
1049
+ ];
1050
+ }
1051
+ // ---- activation ----------------------------------------------------------------
1052
+ /** The companion agent set (docker/companion/agents), beside this file in
1053
+ * the /workspace checkout — where `pass-survey` lives. Resolved from this
1054
+ * SOURCE file: pi loads the extension's .ts through jiti, never dist/. */
1055
+ export const COMPANION_AGENTS_DIR = fileURLToPath(new URL("../docker/companion/agents", import.meta.url));
1056
+ /** The app checkout this extension runs from (`/workspace` in the
1057
+ * companion) — where the generic profiles a repo profile extends live. */
1058
+ export const APP_ROOT = fileURLToPath(new URL("..", import.meta.url));
1059
+ /** The ports the engine and the scan triage share: the reviewer's memory
1060
+ * and the tracker sink — the issue tracker mounted at QCR_TRACKER_DIR
1061
+ * (`/tracker`), or one markdown file per promoted finding in the state home
1062
+ * when there is none. */
1063
+ export function sharedPorts(env) {
1064
+ return {
1065
+ memory: reviewerMemoryFromEnv(env),
1066
+ tracker: scanTrackerSink({
1067
+ trackerDir: env.QCR_TRACKER_DIR?.trim(),
1068
+ state: stateHomeFs(stateHome(env)),
1069
+ clock: () => new Date(),
1070
+ }),
1071
+ };
1072
+ }
1073
+ export function buildEngine(env, shared = sharedPorts(env),
1074
+ /** The case runner's cwd when QCR_ROOT names none. */
1075
+ cwd = APP_ROOT) {
1076
+ return new SetupEngine({
1077
+ repo: checkoutReader(reviewedCheckout(env)),
1078
+ state: stateHomeFs(stateHome(env)),
1079
+ // The config home, for the portrait narrative. In the
1080
+ // companion only `profiles/` and `portrait/` of it are mounted
1081
+ // read-write, and the narrative is written under `portrait/` alone.
1082
+ config: configHomeFs(configHome(env)),
1083
+ // The repo profile: read, checked with the daemon's own
1084
+ // loaders against the app's generic examples, and written under the
1085
+ // config home's `profiles/` — the one part of it mounted read-write.
1086
+ profiles: { root: env.QCR_ROOT?.trim() || APP_ROOT, env },
1087
+ clock: () => new Date(),
1088
+ // The reviewer's memory (survey notes and review-history themes are
1089
+ // for PR rounds), or null — the survey then refuses to start
1090
+ // and a themes save says memory was not written.
1091
+ memory: shared.memory,
1092
+ // Background pi subagents, run from the companion's own cwd (first-party
1093
+ // ground), never from the reviewed checkout.
1094
+ cases: piCaseRunner({
1095
+ agentsDir: COMPANION_AGENTS_DIR,
1096
+ cwd: env.QCR_ROOT?.trim() || cwd,
1097
+ }),
1098
+ tracker: shared.tracker,
1099
+ github: tokenFileGitHubReader({
1100
+ envFile: env.QCR_GITHUB_READ_ENV,
1101
+ fetch: (input, init) => fetch(input, init),
1102
+ clock: () => new Date(),
1103
+ }),
1104
+ log: (line) => console.error(line),
1105
+ },
1106
+ // The companion's subagent cap (QCR_SUBAGENT_MAX_CONCURRENCY).
1107
+ { surveyConcurrency: resolveMaxConcurrency(env) });
1108
+ }
1109
+ /** The factory that registers the `setup_*`, `scan_*` and replay tools. The env
1110
+ * shim is extensions/cli/setup.ts. */
1111
+ export function createSetup(config) {
1112
+ return (pi) => registerSetup(pi, config);
1113
+ }
1114
+ function registerSetup(pi, config) {
1115
+ const { env } = config;
1116
+ if (typeof pi.registerTool !== "function") {
1117
+ console.error("setup: pi.registerTool unavailable — no setup tools registered.");
1118
+ return;
1119
+ }
1120
+ let engine;
1121
+ let shared;
1122
+ try {
1123
+ shared = sharedPorts(env);
1124
+ engine = buildEngine(env, shared, config.cwd);
1125
+ }
1126
+ catch (err) {
1127
+ // A bad QCR_INSTALL is the only throw on this path: say so, start without
1128
+ // the belt rather than failing the companion's start.
1129
+ console.error(`setup: not registered — ${String(err)}`);
1130
+ return;
1131
+ }
1132
+ for (const def of toolDefinitions(engine))
1133
+ registerQcrTool(pi, def);
1134
+ // The scan tools, over the same engine's saved unit cut.
1135
+ const { scan, findings, settingsOf, triage, home } = buildScan(engine, reviewedCheckout(env), env, shared);
1136
+ for (const def of scanToolDefinitions(scan, findings, settingsOf, triage ? () => triage.closeFixed() : null, { home }))
1137
+ registerQcrTool(pi, def);
1138
+ // Triage — dismiss, promote, close fixed, scan memory.
1139
+ if (triage)
1140
+ for (const def of triageToolDefinitions(triage))
1141
+ registerQcrTool(pi, def);
1142
+ // The PR replay — old vs new profile, cost first.
1143
+ const replay = buildReplay(reviewedCheckout(env), env, resolveMaxConcurrency(env));
1144
+ for (const def of replayToolDefinitions(replay))
1145
+ registerQcrTool(pi, def);
1146
+ // The TUI's stage-2 start click and its scan stop, answered while the
1147
+ // companion's session runs (the inject-bridge's lifecycle: start on
1148
+ // session_start, stop on session_shutdown).
1149
+ let unwatch = null;
1150
+ // VERIFY-ON-PIN: "session_start" / "session_shutdown" event names (as inject-bridge).
1151
+ pi.on("session_start", () => {
1152
+ unwatch?.();
1153
+ unwatch = watchTuiRequests(scan);
1154
+ });
1155
+ pi.on("session_shutdown", () => {
1156
+ unwatch?.();
1157
+ unwatch = null;
1158
+ });
1159
+ }
1160
+ //# sourceMappingURL=setup.js.map