@quickchatai/quickreview 1.1.0 → 1.3.1

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 (471) hide show
  1. package/README.md +137 -57
  2. package/bin/qcr.js +1 -1
  3. package/config.example.toml +60 -14
  4. package/deploy/ansible/README.md +20 -12
  5. package/deploy/ansible/inventory.example.ini +1 -1
  6. package/deploy/collect-secrets.sh +1 -1
  7. package/deploy/qcr-update.sh +1 -1
  8. package/dist/extensions/cli/home.js +14 -0
  9. package/dist/extensions/cli/home.js.map +1 -0
  10. package/dist/extensions/cli/login-route.js +5 -0
  11. package/dist/extensions/cli/login-route.js.map +1 -0
  12. package/dist/extensions/cli/selfimprove.js +18 -0
  13. package/dist/extensions/cli/selfimprove.js.map +1 -0
  14. package/dist/extensions/home.js +350 -0
  15. package/dist/extensions/home.js.map +1 -0
  16. package/dist/extensions/login-route.js +180 -0
  17. package/dist/extensions/login-route.js.map +1 -0
  18. package/dist/extensions/onboarding.js +35 -11
  19. package/dist/extensions/onboarding.js.map +1 -1
  20. package/dist/extensions/selfimprove.js +49 -0
  21. package/dist/extensions/selfimprove.js.map +1 -0
  22. package/dist/extensions/setup-scan.js +23 -592
  23. package/dist/extensions/setup-scan.js.map +1 -1
  24. package/dist/extensions/setup.js +2 -47
  25. package/dist/extensions/setup.js.map +1 -1
  26. package/dist/src/archive/restore.js +18 -15
  27. package/dist/src/archive/restore.js.map +1 -1
  28. package/dist/src/botworker.js +13 -2
  29. package/dist/src/botworker.js.map +1 -1
  30. package/dist/src/channelfs.js +3 -26
  31. package/dist/src/channelfs.js.map +1 -1
  32. package/dist/src/ciretry.js +2 -1
  33. package/dist/src/ciretry.js.map +1 -1
  34. package/dist/src/cli.js +54 -61
  35. package/dist/src/cli.js.map +1 -1
  36. package/dist/src/cliops.js +3 -2
  37. package/dist/src/cliops.js.map +1 -1
  38. package/dist/src/commands.js +25 -2
  39. package/dist/src/commands.js.map +1 -1
  40. package/dist/src/config.js +32 -2
  41. package/dist/src/config.js.map +1 -1
  42. package/dist/src/daemon.js +50 -8
  43. package/dist/src/daemon.js.map +1 -1
  44. package/dist/src/debuground.js +1 -0
  45. package/dist/src/debuground.js.map +1 -1
  46. package/dist/src/debugroundpi.js +6 -1
  47. package/dist/src/debugroundpi.js.map +1 -1
  48. package/dist/src/dispatch.js +5 -4
  49. package/dist/src/dispatch.js.map +1 -1
  50. package/dist/src/engine/caserunner-sdk.js +15 -251
  51. package/dist/src/engine/caserunner-sdk.js.map +1 -1
  52. package/dist/src/engine/debugpi.js +17 -5
  53. package/dist/src/engine/debugpi.js.map +1 -1
  54. package/dist/src/execboundary.js +10 -3
  55. package/dist/src/execboundary.js.map +1 -1
  56. package/dist/src/github.js +51 -16
  57. package/dist/src/github.js.map +1 -1
  58. package/dist/src/githubtoken.js +346 -0
  59. package/dist/src/githubtoken.js.map +1 -0
  60. package/dist/src/home/adapters.js +349 -0
  61. package/dist/src/home/adapters.js.map +1 -0
  62. package/dist/src/home/advanced.js +318 -0
  63. package/dist/src/home/advanced.js.map +1 -0
  64. package/dist/src/home/advancedtools.js +57 -0
  65. package/dist/src/home/advancedtools.js.map +1 -0
  66. package/dist/src/home/autoreview.js +325 -0
  67. package/dist/src/home/autoreview.js.map +1 -0
  68. package/dist/src/home/daemonstatus.js +32 -0
  69. package/dist/src/home/daemonstatus.js.map +1 -0
  70. package/dist/src/home/devicelogin.js +61 -0
  71. package/dist/src/home/devicelogin.js.map +1 -0
  72. package/dist/src/home/launch.js +202 -0
  73. package/dist/src/home/launch.js.map +1 -0
  74. package/dist/src/home/loginowner.js +205 -0
  75. package/dist/src/home/loginowner.js.map +1 -0
  76. package/dist/src/home/memory.js +122 -0
  77. package/dist/src/home/memory.js.map +1 -0
  78. package/dist/src/home/model.js +811 -0
  79. package/dist/src/home/model.js.map +1 -0
  80. package/dist/src/home/panel.js +520 -0
  81. package/dist/src/home/panel.js.map +1 -0
  82. package/dist/src/home/ports.js +19 -0
  83. package/dist/src/home/ports.js.map +1 -0
  84. package/dist/src/home/review.js +163 -0
  85. package/dist/src/home/review.js.map +1 -0
  86. package/dist/src/home/reviews.js +478 -0
  87. package/dist/src/home/reviews.js.map +1 -0
  88. package/dist/src/home/setup.js +507 -0
  89. package/dist/src/home/setup.js.map +1 -0
  90. package/dist/src/home/setupadapters.js +214 -0
  91. package/dist/src/home/setupadapters.js.map +1 -0
  92. package/dist/src/home/setupcard.js +199 -0
  93. package/dist/src/home/setupcard.js.map +1 -0
  94. package/dist/src/home/setuptools.js +45 -0
  95. package/dist/src/home/setuptools.js.map +1 -0
  96. package/dist/src/home/spend.js +160 -0
  97. package/dist/src/home/spend.js.map +1 -0
  98. package/dist/src/home/switches.js +209 -0
  99. package/dist/src/home/switches.js.map +1 -0
  100. package/dist/src/home/switchon.js +439 -0
  101. package/dist/src/home/switchon.js.map +1 -0
  102. package/dist/src/home/toolnames.js +41 -0
  103. package/dist/src/home/toolnames.js.map +1 -0
  104. package/dist/src/home/tune.js +341 -0
  105. package/dist/src/home/tune.js.map +1 -0
  106. package/dist/src/home/words.js +7 -0
  107. package/dist/src/home/words.js.map +1 -0
  108. package/dist/src/homes.js +14 -0
  109. package/dist/src/homes.js.map +1 -1
  110. package/dist/src/install.js +1 -1
  111. package/dist/src/install.js.map +1 -1
  112. package/dist/src/ipc/workerspec.js +8 -0
  113. package/dist/src/ipc/workerspec.js.map +1 -1
  114. package/dist/src/live/publish.js +1 -1
  115. package/dist/src/live/publish.js.map +1 -1
  116. package/dist/src/livecli.js +1 -1
  117. package/dist/src/livecli.js.map +1 -1
  118. package/dist/src/loginhint.js +8 -3
  119. package/dist/src/loginhint.js.map +1 -1
  120. package/dist/src/loginrefresh/handover.js +121 -0
  121. package/dist/src/loginrefresh/handover.js.map +1 -0
  122. package/dist/src/loginrefresh/lock.js +54 -3
  123. package/dist/src/loginrefresh/lock.js.map +1 -1
  124. package/dist/src/loginrefresh/pirefresh.js +3 -0
  125. package/dist/src/loginrefresh/pirefresh.js.map +1 -1
  126. package/dist/src/loginrefresh/refresher.js +33 -5
  127. package/dist/src/loginrefresh/refresher.js.map +1 -1
  128. package/dist/src/loginrefresh/supervisor.js +18 -1
  129. package/dist/src/loginrefresh/supervisor.js.map +1 -1
  130. package/dist/src/npmverbs.js +46 -14
  131. package/dist/src/npmverbs.js.map +1 -1
  132. package/dist/src/onboard/choices.js +35 -4
  133. package/dist/src/onboard/choices.js.map +1 -1
  134. package/dist/src/onboard/engine.js +32 -306
  135. package/dist/src/onboard/engine.js.map +1 -1
  136. package/dist/src/onboard/pipin.js +22 -0
  137. package/dist/src/onboard/pipin.js.map +1 -0
  138. package/dist/src/onboard/stepforward.js +41 -0
  139. package/dist/src/onboard/stepforward.js.map +1 -0
  140. package/dist/src/onboard/steps/appslug.js +4 -1
  141. package/dist/src/onboard/steps/appslug.js.map +1 -1
  142. package/dist/src/onboard/steps/bringup.js +3 -2
  143. package/dist/src/onboard/steps/bringup.js.map +1 -1
  144. package/dist/src/onboard/steps/compose.js +29 -0
  145. package/dist/src/onboard/steps/compose.js.map +1 -1
  146. package/dist/src/onboard/steps/configfill.js +120 -39
  147. package/dist/src/onboard/steps/configfill.js.map +1 -1
  148. package/dist/src/onboard/steps/githubaccount.js +595 -0
  149. package/dist/src/onboard/steps/githubaccount.js.map +1 -0
  150. package/dist/src/onboard/steps/githubapp.js +65 -7
  151. package/dist/src/onboard/steps/githubapp.js.map +1 -1
  152. package/dist/src/onboard/steps/golive.js +2 -0
  153. package/dist/src/onboard/steps/golive.js.map +1 -1
  154. package/dist/src/onboard/steps/index.js +11 -0
  155. package/dist/src/onboard/steps/index.js.map +1 -1
  156. package/dist/src/onboard/steps/ingress.js +80 -25
  157. package/dist/src/onboard/steps/ingress.js.map +1 -1
  158. package/dist/src/onboard/steps/llmauth.js +103 -30
  159. package/dist/src/onboard/steps/llmauth.js.map +1 -1
  160. package/dist/src/onboard/steps/loginshare.js +213 -0
  161. package/dist/src/onboard/steps/loginshare.js.map +1 -0
  162. package/dist/src/onboard/steps/memory.js +67 -3
  163. package/dist/src/onboard/steps/memory.js.map +1 -1
  164. package/dist/src/onboard/steps/proof.js +366 -56
  165. package/dist/src/onboard/steps/proof.js.map +1 -1
  166. package/dist/src/onboard/steps/repoconfig.js +72 -0
  167. package/dist/src/onboard/steps/repoconfig.js.map +1 -0
  168. package/dist/src/onboard/steps/topology.js +6 -6
  169. package/dist/src/onboard/steps/topology.js.map +1 -1
  170. package/dist/src/onboard/steps/transport.js +9 -1
  171. package/dist/src/onboard/steps/transport.js.map +1 -1
  172. package/dist/src/onboard/steps/tuiroute.js +102 -0
  173. package/dist/src/onboard/steps/tuiroute.js.map +1 -0
  174. package/dist/src/onboard/steps/verifyup.js +17 -1
  175. package/dist/src/onboard/steps/verifyup.js.map +1 -1
  176. package/dist/src/onboard/toolnames.js +30 -0
  177. package/dist/src/onboard/toolnames.js.map +1 -0
  178. package/dist/src/operatorwrite.js +23 -0
  179. package/dist/src/operatorwrite.js.map +1 -0
  180. package/dist/src/outcomes.js +4 -1
  181. package/dist/src/outcomes.js.map +1 -1
  182. package/dist/src/piagentdir.js +13 -0
  183. package/dist/src/piagentdir.js.map +1 -0
  184. package/dist/src/pilogin.js +31 -16
  185. package/dist/src/pilogin.js.map +1 -1
  186. package/dist/src/posting-journal.js +2 -1
  187. package/dist/src/posting-journal.js.map +1 -1
  188. package/dist/src/posting-outbox.js +6 -2
  189. package/dist/src/posting-outbox.js.map +1 -1
  190. package/dist/src/posting-receipt.js +14 -1
  191. package/dist/src/posting-receipt.js.map +1 -1
  192. package/dist/src/qcrbin.js +16 -11
  193. package/dist/src/qcrbin.js.map +1 -1
  194. package/dist/src/recheck.js +2 -1
  195. package/dist/src/recheck.js.map +1 -1
  196. package/dist/src/reconcile.js +22 -2
  197. package/dist/src/reconcile.js.map +1 -1
  198. package/dist/src/reviewargs.js +122 -0
  199. package/dist/src/reviewargs.js.map +1 -0
  200. package/dist/src/reviewcli.js +7 -161
  201. package/dist/src/reviewcli.js.map +1 -1
  202. package/dist/src/reviewdetach.js +76 -11
  203. package/dist/src/reviewdetach.js.map +1 -1
  204. package/dist/src/reviewhistory.js +32 -6
  205. package/dist/src/reviewhistory.js.map +1 -1
  206. package/dist/src/reviewnow.js +45 -0
  207. package/dist/src/reviewnow.js.map +1 -0
  208. package/dist/src/scancli.js +39 -691
  209. package/dist/src/scancli.js.map +1 -1
  210. package/dist/src/selfimprove.js +66 -0
  211. package/dist/src/selfimprove.js.map +1 -0
  212. package/dist/src/setup/adapters.js +5 -223
  213. package/dist/src/setup/adapters.js.map +1 -1
  214. package/dist/src/setup/caserunner.js +15 -249
  215. package/dist/src/setup/caserunner.js.map +1 -1
  216. package/dist/src/setup/engine.js +32 -341
  217. package/dist/src/setup/engine.js.map +1 -1
  218. package/dist/src/setup/facts.js +3 -592
  219. package/dist/src/setup/facts.js.map +1 -1
  220. package/dist/src/setup/findings.js +3 -947
  221. package/dist/src/setup/findings.js.map +1 -1
  222. package/dist/src/setup/presentation.js +3 -8
  223. package/dist/src/setup/presentation.js.map +1 -1
  224. package/dist/src/setup/scan.js +3 -724
  225. package/dist/src/setup/scan.js.map +1 -1
  226. package/dist/src/setup/scanbuild.js +9 -92
  227. package/dist/src/setup/scanbuild.js.map +1 -1
  228. package/dist/src/setup/scanlease.js +3 -250
  229. package/dist/src/setup/scanlease.js.map +1 -1
  230. package/dist/src/setup/scanreport.js +3 -288
  231. package/dist/src/setup/scanreport.js.map +1 -1
  232. package/dist/src/setup/scanrun.js +3 -1732
  233. package/dist/src/setup/scanrun.js.map +1 -1
  234. package/dist/src/setup/scantree.js +3 -256
  235. package/dist/src/setup/scantree.js.map +1 -1
  236. package/dist/src/setup/stage2request.js +3 -258
  237. package/dist/src/setup/stage2request.js.map +1 -1
  238. package/dist/src/setup/unitcut.js +3 -436
  239. package/dist/src/setup/unitcut.js.map +1 -1
  240. package/dist/src/state.js +2 -0
  241. package/dist/src/state.js.map +1 -1
  242. package/dist/src/statemachine.js +4 -1
  243. package/dist/src/statemachine.js.map +1 -1
  244. package/dist/src/takeover.js +1 -0
  245. package/dist/src/takeover.js.map +1 -1
  246. package/dist/src/takeoverpi.js +15 -1
  247. package/dist/src/takeoverpi.js.map +1 -1
  248. package/dist/src/tui/app.js +49 -0
  249. package/dist/src/tui/app.js.map +1 -1
  250. package/dist/src/tui/board.js +88 -12
  251. package/dist/src/tui/board.js.map +1 -1
  252. package/dist/src/tui/cmdbar.js +4 -1
  253. package/dist/src/tui/cmdbar.js.map +1 -1
  254. package/dist/src/tui/companion.js +76 -11
  255. package/dist/src/tui/companion.js.map +1 -1
  256. package/dist/src/tui/connect.js +7 -1
  257. package/dist/src/tui/connect.js.map +1 -1
  258. package/dist/src/tui/deploytab.js +2 -2
  259. package/dist/src/tui/deploytab.js.map +1 -1
  260. package/dist/src/tui/filters.js +5 -2
  261. package/dist/src/tui/filters.js.map +1 -1
  262. package/dist/src/tui/ghread.js +61 -5
  263. package/dist/src/tui/ghread.js.map +1 -1
  264. package/dist/src/tui/index.js +109 -20
  265. package/dist/src/tui/index.js.map +1 -1
  266. package/dist/src/tui/memforward.js +39 -2
  267. package/dist/src/tui/memforward.js.map +1 -1
  268. package/dist/src/tui/memory.js +3 -16
  269. package/dist/src/tui/memory.js.map +1 -1
  270. package/dist/src/tui/memoryurl.js +22 -0
  271. package/dist/src/tui/memoryurl.js.map +1 -0
  272. package/dist/src/tui/model.js +25 -0
  273. package/dist/src/tui/model.js.map +1 -1
  274. package/dist/src/tui/prpause.js +7 -0
  275. package/dist/src/tui/prpause.js.map +1 -1
  276. package/dist/src/tui/remote.js +7 -1
  277. package/dist/src/tui/remote.js.map +1 -1
  278. package/dist/src/tui/route.js +143 -0
  279. package/dist/src/tui/route.js.map +1 -0
  280. package/dist/src/tui/setupstate.js +32 -0
  281. package/dist/src/tui/setupstate.js.map +1 -0
  282. package/dist/src/tui/sshtriage.js +102 -5
  283. package/dist/src/tui/sshtriage.js.map +1 -1
  284. package/dist/src/tui/theme.js +2 -1
  285. package/dist/src/tui/theme.js.map +1 -1
  286. package/dist/src/tui/unwedge.js +2 -12
  287. package/dist/src/tui/unwedge.js.map +1 -1
  288. package/dist/src/verdicts.js +17 -5
  289. package/dist/src/verdicts.js.map +1 -1
  290. package/dist/src/version.js +1 -1
  291. package/dist/src/version.js.map +1 -1
  292. package/dist/src/webhook.js +12 -1
  293. package/dist/src/webhook.js.map +1 -1
  294. package/dist/src/wire.js +34 -8
  295. package/dist/src/wire.js.map +1 -1
  296. package/dist/src/workerworld.js +11 -1
  297. package/dist/src/workerworld.js.map +1 -1
  298. package/docker/README.md +1 -1
  299. package/docker/companion/entrypoint.sh +20 -1
  300. package/docker/entrypoint.sh +57 -6
  301. package/docker-compose.yml +16 -1
  302. package/extensions/cli/home.ts +14 -0
  303. package/extensions/cli/login-route.ts +10 -0
  304. package/extensions/cli/selfimprove.ts +18 -0
  305. package/extensions/home.ts +484 -0
  306. package/extensions/login-route.ts +220 -0
  307. package/extensions/onboarding.ts +41 -11
  308. package/extensions/selfimprove.ts +65 -0
  309. package/extensions/setup-scan.ts +79 -766
  310. package/extensions/setup.ts +14 -70
  311. package/package.json +6 -4
  312. package/prompts/onboarding.md +58 -18
  313. package/schemas/review-result.v1.json +60 -0
  314. package/scripts/deploy.sh +8 -6
  315. package/scripts/mint-token.sh +25 -4
  316. package/scripts/qcr-host.sh +28 -5
  317. package/scripts/vm-ghcr-login.sh +7 -4
  318. package/src/archive/restore.ts +18 -21
  319. package/src/botworker.ts +13 -2
  320. package/src/channelfs.ts +3 -26
  321. package/src/ciretry.ts +2 -1
  322. package/src/cli.ts +59 -67
  323. package/src/cliops.ts +3 -2
  324. package/src/commands.ts +28 -2
  325. package/src/config.ts +62 -4
  326. package/src/daemon.ts +58 -7
  327. package/src/debuground.ts +3 -0
  328. package/src/debugroundpi.ts +12 -1
  329. package/src/dispatch.ts +5 -4
  330. package/src/engine/caserunner-sdk.ts +29 -314
  331. package/src/engine/debugpi.ts +17 -5
  332. package/src/execboundary.ts +16 -4
  333. package/src/github.ts +57 -15
  334. package/src/githubtoken.ts +435 -0
  335. package/src/home/adapters.ts +418 -0
  336. package/src/home/advanced.ts +421 -0
  337. package/src/home/advancedtools.ts +96 -0
  338. package/src/home/autoreview.ts +385 -0
  339. package/src/home/daemonstatus.ts +55 -0
  340. package/src/home/devicelogin.ts +107 -0
  341. package/src/home/launch.ts +257 -0
  342. package/src/home/loginowner.ts +248 -0
  343. package/src/home/memory.ts +176 -0
  344. package/src/home/model.ts +965 -0
  345. package/src/home/panel.ts +666 -0
  346. package/src/home/ports.ts +338 -0
  347. package/src/home/review.ts +206 -0
  348. package/src/home/reviews.ts +565 -0
  349. package/src/home/setup.ts +689 -0
  350. package/src/home/setupadapters.ts +217 -0
  351. package/src/home/setupcard.ts +288 -0
  352. package/src/home/setuptools.ts +57 -0
  353. package/src/home/spend.ts +194 -0
  354. package/src/home/switches.ts +293 -0
  355. package/src/home/switchon.ts +554 -0
  356. package/src/home/toolnames.ts +46 -0
  357. package/src/home/tune.ts +405 -0
  358. package/src/home/words.ts +8 -0
  359. package/src/homes.ts +17 -0
  360. package/src/install.ts +1 -1
  361. package/src/ipc/workerspec.ts +15 -0
  362. package/src/live/publish.ts +4 -1
  363. package/src/livecli.ts +6 -1
  364. package/src/loginhint.ts +8 -3
  365. package/src/loginrefresh/handover.ts +138 -0
  366. package/src/loginrefresh/lock.ts +72 -3
  367. package/src/loginrefresh/pirefresh.ts +3 -0
  368. package/src/loginrefresh/refresher.ts +34 -5
  369. package/src/loginrefresh/supervisor.ts +25 -2
  370. package/src/npmverbs.ts +55 -13
  371. package/src/onboard/choices.ts +40 -4
  372. package/src/onboard/engine.ts +70 -421
  373. package/src/onboard/pipin.ts +31 -0
  374. package/src/onboard/stepforward.ts +61 -0
  375. package/src/onboard/steps/appslug.ts +4 -1
  376. package/src/onboard/steps/bringup.ts +3 -2
  377. package/src/onboard/steps/compose.ts +31 -0
  378. package/src/onboard/steps/configfill.ts +144 -40
  379. package/src/onboard/steps/githubaccount.ts +716 -0
  380. package/src/onboard/steps/githubapp.ts +92 -8
  381. package/src/onboard/steps/golive.ts +2 -0
  382. package/src/onboard/steps/index.ts +11 -0
  383. package/src/onboard/steps/ingress.ts +98 -31
  384. package/src/onboard/steps/llmauth.ts +114 -29
  385. package/src/onboard/steps/loginshare.ts +258 -0
  386. package/src/onboard/steps/memory.ts +76 -3
  387. package/src/onboard/steps/proof.ts +473 -55
  388. package/src/onboard/steps/repoconfig.ts +85 -0
  389. package/src/onboard/steps/topology.ts +7 -6
  390. package/src/onboard/steps/transport.ts +15 -0
  391. package/src/onboard/steps/tuiroute.ts +119 -0
  392. package/src/onboard/steps/verifyup.ts +20 -1
  393. package/src/onboard/toolnames.ts +34 -0
  394. package/src/operatorwrite.ts +25 -0
  395. package/src/outcomes.ts +8 -1
  396. package/src/piagentdir.ts +12 -0
  397. package/src/pilogin.ts +32 -16
  398. package/src/posting-journal.ts +6 -1
  399. package/src/posting-outbox.ts +10 -2
  400. package/src/posting-receipt.ts +17 -0
  401. package/src/qcrbin.ts +16 -11
  402. package/src/recheck.ts +2 -1
  403. package/src/reconcile.ts +29 -3
  404. package/src/reviewargs.ts +119 -0
  405. package/src/reviewcli.ts +6 -167
  406. package/src/reviewdetach.ts +107 -13
  407. package/src/reviewhistory.ts +20 -6
  408. package/src/reviewnow.ts +76 -0
  409. package/src/scancli.ts +75 -826
  410. package/src/selfimprove.ts +90 -0
  411. package/src/setup/adapters.ts +13 -221
  412. package/src/setup/caserunner.ts +34 -273
  413. package/src/setup/engine.ts +62 -496
  414. package/src/setup/facts.ts +3 -627
  415. package/src/setup/findings.ts +3 -1264
  416. package/src/setup/presentation.ts +3 -18
  417. package/src/setup/scan.ts +3 -1033
  418. package/src/setup/scanbuild.ts +20 -114
  419. package/src/setup/scanlease.ts +3 -297
  420. package/src/setup/scanreport.ts +3 -373
  421. package/src/setup/scanrun.ts +3 -2268
  422. package/src/setup/scantree.ts +3 -259
  423. package/src/setup/stage2request.ts +3 -347
  424. package/src/setup/unitcut.ts +3 -523
  425. package/src/state.ts +43 -0
  426. package/src/statemachine.ts +4 -1
  427. package/src/takeover.ts +5 -0
  428. package/src/takeoverpi.ts +16 -2
  429. package/src/tui/app.ts +47 -0
  430. package/src/tui/board.ts +111 -14
  431. package/src/tui/cmdbar.ts +4 -1
  432. package/src/tui/companion.ts +80 -11
  433. package/src/tui/connect.ts +7 -1
  434. package/src/tui/deploytab.ts +2 -2
  435. package/src/tui/filters.ts +7 -3
  436. package/src/tui/ghread.ts +74 -7
  437. package/src/tui/index.ts +117 -23
  438. package/src/tui/memforward.ts +52 -3
  439. package/src/tui/memory.ts +3 -15
  440. package/src/tui/memoryurl.ts +22 -0
  441. package/src/tui/model.ts +36 -2
  442. package/src/tui/prpause.ts +11 -2
  443. package/src/tui/remote.ts +9 -1
  444. package/src/tui/route.ts +173 -0
  445. package/src/tui/setupstate.ts +56 -0
  446. package/src/tui/sshtriage.ts +127 -6
  447. package/src/tui/theme.ts +2 -1
  448. package/src/tui/unwedge.ts +2 -14
  449. package/src/verdicts.ts +23 -5
  450. package/src/version.ts +1 -1
  451. package/src/webhook.ts +10 -1
  452. package/src/wire.ts +42 -9
  453. package/src/workerworld.ts +16 -2
  454. package/dist/src/live/projection.js +0 -450
  455. package/dist/src/live/projection.js.map +0 -1
  456. package/dist/src/live/read.js +0 -60
  457. package/dist/src/live/read.js.map +0 -1
  458. package/dist/src/onboard/launch.js +0 -83
  459. package/dist/src/onboard/launch.js.map +0 -1
  460. package/dist/src/setup/ledger.js +0 -207
  461. package/dist/src/setup/ledger.js.map +0 -1
  462. package/dist/src/setup/stage2.js +0 -617
  463. package/dist/src/setup/stage2.js.map +0 -1
  464. package/dist/src/setup/textsniff.js +0 -89
  465. package/dist/src/setup/textsniff.js.map +0 -1
  466. package/src/live/projection.ts +0 -491
  467. package/src/live/read.ts +0 -86
  468. package/src/onboard/launch.ts +0 -115
  469. package/src/setup/ledger.ts +0 -324
  470. package/src/setup/stage2.ts +0 -926
  471. package/src/setup/textsniff.ts +0 -95
@@ -1,71 +1,24 @@
1
- // The scan agent build and the settings a scan runs with.
2
- //
3
- // A scan's leaves are the production lenses — `pass-scan` for stage 1, the
4
- // validator when `[scan] validator` is on (the default: the scan validator is
5
- // the skeptic, composed with the `mode: "scan"` `scan-skeptic-validate`
6
- // addendum and run at the tier of the lens it judges, so every tier's variant
7
- // is built), and stage 2's deep lenses (every suggestible lens the profile
8
- // leaves on, at the tier its row names) — built by the one agent build
9
- // (`packages/pi-plugin/src/include.ts buildAgents`) in `"scan"` mode:
10
- //
11
- // * the scan-mode anchor addendum composes (`mode: "scan"` in PASS_ADDENDA)
12
- // — in this build and in no other: the daemon's, the bench's and the
13
- // replay's builds are `"pr"` builds and never carry it;
14
- // * `agents/scan/` joins `agents/` as a source, so `pass-scan` exists here
15
- // and nowhere else;
16
- // * every variant's tools are `SCAN_LEAF_TOOLS` — a scan leaf runs with no
17
- // extensions, so there is no bash guard to stand between it and a shell;
18
- // * a DEEP scan (`[scan] depth = "deep"`, or a stage-2 proposal made deep)
19
- // also composes the `depth: "deep"` addenda: `scan-deep-suggest` on
20
- // `pass-scan` (a deep lens named for every focus file) and `scan-deep-dig`
21
- // on every lens a scan may run (follow callers and siblings, the state ×
22
- // obligation table, what each early exit drops). A standard scan build is
23
- // byte-identical without them.
24
- //
25
- // Everything a PR build composes from the repo's profile composes here too
26
- // (the pack, the per-lens emphasis/ceiling/guide, a lens's `effort`), so a
27
- // scan reviews the way this repo's PR rounds do. `pass-scan` itself is tuned
28
- // by `[scan] tier`/`effort`, config.toml's defaults under the profile's
29
- // `[scan]` table — the profile wins.
30
- //
31
- // The build lands in `<state home>/scan/agents/`, which the scan's case
32
- // runner reads; it is rebuilt at every start, so a profile edit reaches the
33
- // next run without anything else to remember.
1
+ // The scan's config, as the app reads it: the live config.toml (the install
2
+ // locator's answer), parsed whole, then the scan's own build and settings
3
+ // (scanagents.ts) over it.
34
4
  import { readFileSync } from "node:fs";
35
- import { join } from "node:path";
36
5
  import { parseConfig, type Config } from "../config.js";
37
6
  import { homeProfileLookup, locateConfig } from "../install.js";
38
- import {
39
- PASS_ADDENDA,
40
- buildAgents,
41
- configAddenda,
42
- identityVars,
43
- type BuiltAgent,
44
- } from "@quickchatai/pi-quickreview/src/include.js";
45
- import {
46
- applyProfileTuning,
47
- effortSpec,
48
- lensModelOverrides,
49
- lensTuningAddenda,
50
- } from "@quickchatai/pi-quickreview/src/lenstuning.js";
51
- import { PASS_TIER_ORDER } from "@quickchatai/pi-quickreview/src/types.js";
52
- import {
53
- applyProfileScan,
54
- loadProfileAddenda,
55
- loadProfileEcosystem,
56
- loadProfileLensTuning,
57
- loadProfileScan,
58
- type ProfileLookup,
59
- } from "@quickchatai/pi-quickreview/src/profiles.js";
7
+ import type { BuiltAgent } from "@quickchatai/pi-quickreview/src/include.js";
8
+ import type { ProfileLookup } from "@quickchatai/pi-quickreview/src/profiles.js";
60
9
  import type { Refusal } from "./engine.js";
61
- import { SCAN_PASS } from "./scan.js";
62
- import type { ScanSettings } from "./scanrun.js";
63
-
64
- /** Where the scan build lands, relative to the state home. */
65
- export const SCAN_AGENTS_DIR = "scan/agents";
10
+ import {
11
+ buildScanAgents as buildAgentsOver,
12
+ scanConfigOf,
13
+ } from "@quickchatai/pi-quickreview/src/scan/scanagents.js";
66
14
 
67
- /** The scan-only lens sources, relative to the app's root. */
68
- export const SCAN_AGENTS_SRC = "agents/scan";
15
+ export {
16
+ SCAN_AGENTS_DIR,
17
+ SCAN_AGENTS_SRC,
18
+ scanConfigOf,
19
+ scanPassModels,
20
+ scanSettings,
21
+ } from "@quickchatai/pi-quickreview/src/scan/scanagents.js";
69
22
 
70
23
  /** The config a scan runs with: config.toml parsed, the profile's per-lens
71
24
  * tuning and `[scan]` overrides applied (the profile wins). Throws on a bad
@@ -75,10 +28,7 @@ export function scanConfig(
75
28
  toml: string,
76
29
  lookup: ProfileLookup = homeProfileLookup(),
77
30
  ): Config {
78
- const parsed = parseConfig(toml);
79
- const profile = parsed.review.profile;
80
- const tuned = applyProfileTuning(parsed, loadProfileLensTuning(root, profile, lookup));
81
- return applyProfileScan(tuned, loadProfileScan(root, profile, lookup));
31
+ return scanConfigOf(parseConfig(toml), root, lookup);
82
32
  }
83
33
 
84
34
  /** The live config (the install locator's answer), as `scanConfig` reads
@@ -112,57 +62,13 @@ export function loadScanConfig(
112
62
  }
113
63
  }
114
64
 
115
- /** The settings a scan run takes from a resolved config. */
116
- export function scanSettings(cfg: Config): ScanSettings {
117
- return {
118
- scan: cfg.scan,
119
- // Stage 2: which deep lenses run, at which tiers and effort —
120
- // the same per-lens tuning the build composes.
121
- lenses: cfg.lenses,
122
- riskPasses: cfg.models.risk_passes,
123
- };
124
- }
125
-
126
- /** `pass-scan`'s model spec: the `[scan] tier`'s spec at `[scan] effort`
127
- * (`high` = the model's ceiling), through the same per-variant hook a
128
- * lens's `effort` uses. One variant — stage 1 runs at that tier alone. */
129
- export function scanPassModels(cfg: Pick<Config, "models" | "scan">): Record<string, string> {
130
- return {
131
- [`${SCAN_PASS}--${cfg.scan.tier}`]: effortSpec(cfg.models, cfg.scan.tier, cfg.scan.effort),
132
- };
133
- }
134
-
135
- /** Build the scan agents into `outDir` — `buildAgents` in `"scan"` mode at
136
- * `cfg.scan.depth`, the profile's pack and tuning composed exactly as a PR
137
- * build composes them. */
65
+ /** Build the scan agents into `outDir` (scanagents.ts `buildScanAgents`),
66
+ * the profile looked up in this install's homes unless told otherwise. */
138
67
  export function buildScanAgents(
139
68
  root: string,
140
69
  outDir: string,
141
70
  cfg: Config,
142
71
  lookup: ProfileLookup = homeProfileLookup(),
143
72
  ): BuiltAgent[] {
144
- return buildAgents(join(root, "agents"), outDir, {
145
- root,
146
- mode: "scan",
147
- scanDepth: cfg.scan.depth,
148
- extraSrcDirs: [join(root, SCAN_AGENTS_SRC)],
149
- tiers: cfg.models.tiers,
150
- riskPasses: cfg.models.risk_passes,
151
- // The skeptic runs at the tier of the lens it judges — stage 1's
152
- // `[scan] tier`, a stage-2 row's own — so every tier keeps a variant
153
- // (never `validate_tier`, never floored upward).
154
- validateTier: PASS_TIER_ORDER[0],
155
- vars: identityVars(cfg),
156
- ecosystem: loadProfileEcosystem(root, cfg.review.profile, lookup),
157
- models: { ...lensModelOverrides(cfg.models, cfg.lenses), ...scanPassModels(cfg) },
158
- // Stage 1 runs `pass-scan--<[scan] tier>` and nothing else names it
159
- // (stage 2 rows refuse it), so no other tier's variant is built.
160
- onlyTiers: { [SCAN_PASS]: [cfg.scan.tier] },
161
- addenda: [
162
- ...PASS_ADDENDA,
163
- ...configAddenda(cfg.review),
164
- ...loadProfileAddenda(root, cfg.review.profile, lookup),
165
- ...lensTuningAddenda(cfg.lenses),
166
- ],
167
- });
73
+ return buildAgentsOver(root, outDir, cfg, lookup);
168
74
  }
@@ -1,297 +1,3 @@
1
- // The scan driver lease: which process drives the scan in flight, across
2
- // processes. A ScanRunner knows its OWN run (`active`); a run recorded as
3
- // `running` that this runner does not drive is either interrupted or driven
4
- // by another process sharing the state home — the companion, or a
5
- // `qcr scan start` driver. The lease tells them apart: the driving runner
6
- // holds it and renews it while it drives; a holder that stopped renewing
7
- // (killed, its machine asleep) has let it lapse, and its run reads as
8
- // interrupted again.
9
- //
10
- // The lease is a sequence of GENERATIONS, `scan/driver/<n>.json`, the highest
11
- // one current. A claim creates the next generation with an exclusive create
12
- // (the record is written aside and hard-linked into place, which fails when
13
- // the name exists — or, on a filesystem that refuses hard links, an O_EXCL
14
- // create), so of any number of processes claiming at once exactly one wins
15
- // each generation; the winner then checks no newer generation appeared before
16
- // it takes the lease. A holder renews only its own generation; once a newer
17
- // one exists (its lease lapsed and was taken over) it no longer holds the
18
- // lease, and renewal says so. An unreadable current generation (an O_EXCL
19
- // create not yet written, or a corrupt file) counts as live until its file is
20
- // as old as the lease's life, then as no lease. A claim prunes every
21
- // generation but the one before its own, and temp files older than the
22
- // lease's life.
23
- //
24
- // What the lease does NOT serialise: the records other processes may write
25
- // while a run is driven elsewhere. `qcr scan match` / `dismiss` and the
26
- // companion's triage rewrite `scan/findings.json`, and a driver's reconcile
27
- // does too, each as a fresh read, a change and a write — between one
28
- // process's read and its write another's write can be lost. The run record
29
- // `scan/run.json` is written only by the lease holder; a holder that lost the
30
- // lease stops its run and writes it no more (scanrun.ts).
31
- //
32
- // A leaf: node built-ins only, so the TUI's scan tab reads the lease too.
33
- import { randomUUID } from "node:crypto";
34
- import {
35
- linkSync,
36
- statSync,
37
- mkdirSync,
38
- readdirSync,
39
- readFileSync,
40
- renameSync,
41
- unlinkSync,
42
- writeFileSync,
43
- } from "node:fs";
44
- import { hostname } from "node:os";
45
- import { join } from "node:path";
46
-
47
- export const DRIVER_DIR = "scan/driver";
48
- /** How often a driving runner renews its lease. */
49
- export const LEASE_RENEW_MS = 5_000;
50
- /** A lease not renewed for this long has lapsed. */
51
- export const LEASE_TTL_MS = 30_000;
52
-
53
- export interface LeaseRecord {
54
- holder: string;
55
- /** The run it drives; null while a start is still planning. */
56
- run: string | null;
57
- pid: number;
58
- host: string;
59
- at: string;
60
- }
61
-
62
- /** The lease port a ScanRunner drives. */
63
- export interface ScanLease {
64
- /** This runner's holder id. */
65
- readonly holder: string;
66
- /** Take the lease for `run` — or renew it when this runner holds it
67
- * already; false when another live holder has it, or another claim won. */
68
- claim(run: string | null): boolean;
69
- /** Renew the lease this runner holds; false when it holds none any more. */
70
- renew(run: string | null): boolean;
71
- /** Give the lease up — only when this runner still holds it. */
72
- release(): void;
73
- /** Why the last claim failed, when it was not another holder's live lease. */
74
- readonly lastError: string | null;
75
- /** The live lease of ANOTHER holder, or null. */
76
- other(): LeaseRecord | null;
77
- }
78
-
79
- function parse(text: string): LeaseRecord | null {
80
- try {
81
- const r = JSON.parse(text) as Partial<LeaseRecord>;
82
- if (typeof r.holder !== "string" || typeof r.at !== "string") return null;
83
- return {
84
- holder: r.holder,
85
- run: typeof r.run === "string" ? r.run : null,
86
- pid: typeof r.pid === "number" ? r.pid : 0,
87
- host: typeof r.host === "string" ? r.host : "",
88
- at: r.at,
89
- };
90
- } catch {
91
- return null;
92
- }
93
- }
94
-
95
- const GEN = /^(\d+)\.json$/;
96
-
97
- /** Has the file at `path` been written within the lease's life? Files carry
98
- * the real clock's mtime, so this reads the real clock. */
99
- function fresh(path: string): boolean {
100
- try {
101
- return Date.now() - statSync(path).mtimeMs < LEASE_TTL_MS;
102
- } catch {
103
- return false;
104
- }
105
- }
106
-
107
- const errText = (err: unknown): string =>
108
- err instanceof Error
109
- ? `${(err as NodeJS.ErrnoException).code ?? "error"}: ${err.message}`
110
- : String(err);
111
-
112
- /** Where a hard link is refused rather than the name taken. */
113
- const NO_LINK = new Set(["EPERM", "ENOTSUP", "EOPNOTSUPP", "EXDEV"]);
114
-
115
- /** The current generation and its record (null: unreadable), or null when
116
- * there is no lease at all. */
117
- function current(dir: string): { gen: number; record: LeaseRecord | null } | null {
118
- let names: string[];
119
- try {
120
- names = readdirSync(dir);
121
- } catch {
122
- return null;
123
- }
124
- const gens = names.flatMap((n) => {
125
- const m = GEN.exec(n);
126
- return m ? [Number(m[1])] : [];
127
- });
128
- if (gens.length === 0) return null;
129
- const gen = Math.max(...gens);
130
- let record: LeaseRecord | null = null;
131
- try {
132
- record = parse(readFileSync(join(dir, `${gen}.json`), "utf8"));
133
- } catch {
134
- record = null;
135
- }
136
- return { gen, record };
137
- }
138
-
139
- const isLive = (r: LeaseRecord, now: Date): boolean => {
140
- const at = Date.parse(r.at);
141
- return Number.isFinite(at) && now.getTime() - at < LEASE_TTL_MS;
142
- };
143
-
144
- /** The current lease record under the state home `home`, live or not —
145
- * null when there is none or it cannot be read. For a reader that holds
146
- * none (the TUI), which judges it with `leaseIsLive`. */
147
- export function currentLease(home: string): LeaseRecord | null {
148
- return current(join(home, DRIVER_DIR))?.record ?? null;
149
- }
150
-
151
- export const leaseIsLive = (r: LeaseRecord, now: Date = new Date()): boolean => isLive(r, now);
152
-
153
- /** The live lease under the state home `home`, or null. */
154
- export function liveLease(home: string, now: Date = new Date()): LeaseRecord | null {
155
- const r = currentLease(home);
156
- return r && isLive(r, now) ? r : null;
157
- }
158
-
159
- /** The lease as generation files under the state home `home`. Total: a
160
- * failed write is a failed claim or renewal, never a throw. */
161
- export function fileLease(
162
- home: string,
163
- opts: {
164
- clock?: () => Date;
165
- holder?: string;
166
- /** Called between reading the lease and creating the next generation. */
167
- beforeCreate?: () => void;
168
- /** Called right after generation `gen` was created, before the check
169
- * that no newer one appeared. */
170
- afterCreate?: (gen: number) => void;
171
- /** The hard link (`fs.linkSync`). */
172
- link?: (existing: string, path: string) => void;
173
- } = {},
174
- ): ScanLease {
175
- const dir = join(home, DRIVER_DIR);
176
- const clock = opts.clock ?? (() => new Date());
177
- const holder = opts.holder ?? `${hostname()}:${process.pid}:${randomUUID().slice(0, 8)}`;
178
- const link = opts.link ?? linkSync;
179
- let mine: number | null = null;
180
- let lastError: string | null = null;
181
- const record = (run: string | null, at = clock()): string =>
182
- `${JSON.stringify({ holder, run, pid: process.pid, host: hostname(), at: at.toISOString() })}\n`;
183
- // Only its holder rewrites a generation: tmp + rename.
184
- const rewrite = (gen: number, text: string): boolean => {
185
- const tmp = join(dir, `.${gen}.${randomUUID()}.tmp`);
186
- try {
187
- writeFileSync(tmp, text);
188
- renameSync(tmp, join(dir, `${gen}.json`));
189
- return true;
190
- } catch {
191
- return false;
192
- }
193
- };
194
- const prune = (below: number): void => {
195
- let names: string[];
196
- try {
197
- names = readdirSync(dir);
198
- } catch {
199
- return;
200
- }
201
- for (const name of names) {
202
- const m = GEN.exec(name);
203
- const stale =
204
- (m !== null && Number(m[1]) < below) ||
205
- (name.startsWith(".") && name.endsWith(".tmp") && !fresh(join(dir, name)));
206
- if (!stale) continue;
207
- try {
208
- unlinkSync(join(dir, name));
209
- } catch {
210
- // Another claimer pruned it first.
211
- }
212
- }
213
- };
214
- /** Create generation `gen` exclusively; null, or why not. */
215
- const create = (gen: number, text: string): string | null => {
216
- const path = join(dir, `${gen}.json`);
217
- const tmp = join(dir, `.claim.${randomUUID()}.tmp`);
218
- try {
219
- mkdirSync(dir, { recursive: true });
220
- writeFileSync(tmp, text);
221
- try {
222
- link(tmp, path);
223
- return null;
224
- } catch (err) {
225
- if (!NO_LINK.has((err as NodeJS.ErrnoException).code ?? "")) throw err;
226
- }
227
- writeFileSync(path, text, { flag: "wx" });
228
- return null;
229
- } catch (err) {
230
- return errText(err);
231
- } finally {
232
- try {
233
- unlinkSync(tmp);
234
- } catch {
235
- // Never written.
236
- }
237
- }
238
- };
239
- const lease: ScanLease = {
240
- holder,
241
- get lastError() {
242
- return lastError;
243
- },
244
- claim(run) {
245
- lastError = null;
246
- const cur = current(dir);
247
- if (cur !== null && mine === cur.gen) return lease.renew(run);
248
- if (cur !== null && cur.record === null && fresh(join(dir, `${cur.gen}.json`))) {
249
- lastError = `generation ${cur.gen} is unreadable and was written within the lease's life — it may still be being written`;
250
- return false;
251
- }
252
- if (cur?.record && cur.record.holder !== holder && isLive(cur.record, clock())) return false;
253
- opts.beforeCreate?.();
254
- const gen = (cur?.gen ?? 0) + 1;
255
- const failed = create(gen, record(run));
256
- if (failed !== null) {
257
- lastError = `generation ${gen} could not be created (${failed})`;
258
- return false;
259
- }
260
- opts.afterCreate?.(gen);
261
- // Won the create; still the newest?
262
- if (current(dir)?.gen !== gen) {
263
- lastError = `a newer generation than ${gen} appeared as it was created`;
264
- return false;
265
- }
266
- mine = gen;
267
- prune(gen - 1);
268
- return true;
269
- },
270
- renew(run) {
271
- const cur = current(dir);
272
- if (
273
- mine === null ||
274
- cur === null ||
275
- cur.gen !== mine ||
276
- cur.record === null ||
277
- !isLive(cur.record, clock())
278
- ) {
279
- mine = null;
280
- return false;
281
- }
282
- return rewrite(mine, record(run));
283
- },
284
- release() {
285
- const cur = current(dir);
286
- if (mine !== null && cur !== null && cur.gen === mine)
287
- rewrite(mine, record(null, new Date(0)));
288
- mine = null;
289
- },
290
- other() {
291
- const cur = current(dir);
292
- if (cur === null || cur.record === null || cur.gen === mine) return null;
293
- return isLive(cur.record, clock()) ? cur.record : null;
294
- },
295
- };
296
- return lease;
297
- }
1
+ // Moved to the plugin (packages/pi-plugin/src/scan/scanlease.ts), the scan engine's
2
+ // home: this name stays for the app's importers.
3
+ export * from "@quickchatai/pi-quickreview/src/scan/scanlease.js";