@quickchatai/quickreview 1.2.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 (322) hide show
  1. package/README.md +114 -50
  2. package/bin/qcr.js +1 -1
  3. package/config.example.toml +20 -6
  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/selfimprove.js +18 -0
  11. package/dist/extensions/cli/selfimprove.js.map +1 -0
  12. package/dist/extensions/home.js +350 -0
  13. package/dist/extensions/home.js.map +1 -0
  14. package/dist/extensions/login-route.js +1 -1
  15. package/dist/extensions/login-route.js.map +1 -1
  16. package/dist/extensions/onboarding.js +8 -7
  17. package/dist/extensions/onboarding.js.map +1 -1
  18. package/dist/extensions/selfimprove.js +49 -0
  19. package/dist/extensions/selfimprove.js.map +1 -0
  20. package/dist/extensions/setup-scan.js +23 -592
  21. package/dist/extensions/setup-scan.js.map +1 -1
  22. package/dist/extensions/setup.js +2 -47
  23. package/dist/extensions/setup.js.map +1 -1
  24. package/dist/src/archive/restore.js +18 -15
  25. package/dist/src/archive/restore.js.map +1 -1
  26. package/dist/src/botworker.js +13 -2
  27. package/dist/src/botworker.js.map +1 -1
  28. package/dist/src/channelfs.js +3 -26
  29. package/dist/src/channelfs.js.map +1 -1
  30. package/dist/src/cli.js +12 -50
  31. package/dist/src/cli.js.map +1 -1
  32. package/dist/src/config.js +16 -0
  33. package/dist/src/config.js.map +1 -1
  34. package/dist/src/daemon.js +26 -0
  35. package/dist/src/daemon.js.map +1 -1
  36. package/dist/src/debuground.js +1 -0
  37. package/dist/src/debuground.js.map +1 -1
  38. package/dist/src/debugroundpi.js +1 -0
  39. package/dist/src/debugroundpi.js.map +1 -1
  40. package/dist/src/engine/caserunner-sdk.js +15 -251
  41. package/dist/src/engine/caserunner-sdk.js.map +1 -1
  42. package/dist/src/home/adapters.js +349 -0
  43. package/dist/src/home/adapters.js.map +1 -0
  44. package/dist/src/home/advanced.js +318 -0
  45. package/dist/src/home/advanced.js.map +1 -0
  46. package/dist/src/home/advancedtools.js +57 -0
  47. package/dist/src/home/advancedtools.js.map +1 -0
  48. package/dist/src/home/autoreview.js +325 -0
  49. package/dist/src/home/autoreview.js.map +1 -0
  50. package/dist/src/home/daemonstatus.js +32 -0
  51. package/dist/src/home/daemonstatus.js.map +1 -0
  52. package/dist/src/home/devicelogin.js +61 -0
  53. package/dist/src/home/devicelogin.js.map +1 -0
  54. package/dist/src/home/launch.js +202 -0
  55. package/dist/src/home/launch.js.map +1 -0
  56. package/dist/src/home/loginowner.js +205 -0
  57. package/dist/src/home/loginowner.js.map +1 -0
  58. package/dist/src/home/memory.js +122 -0
  59. package/dist/src/home/memory.js.map +1 -0
  60. package/dist/src/home/model.js +811 -0
  61. package/dist/src/home/model.js.map +1 -0
  62. package/dist/src/home/panel.js +520 -0
  63. package/dist/src/home/panel.js.map +1 -0
  64. package/dist/src/home/ports.js +19 -0
  65. package/dist/src/home/ports.js.map +1 -0
  66. package/dist/src/home/review.js +163 -0
  67. package/dist/src/home/review.js.map +1 -0
  68. package/dist/src/home/reviews.js +478 -0
  69. package/dist/src/home/reviews.js.map +1 -0
  70. package/dist/src/home/setup.js +507 -0
  71. package/dist/src/home/setup.js.map +1 -0
  72. package/dist/src/home/setupadapters.js +214 -0
  73. package/dist/src/home/setupadapters.js.map +1 -0
  74. package/dist/src/home/setupcard.js +199 -0
  75. package/dist/src/home/setupcard.js.map +1 -0
  76. package/dist/src/home/setuptools.js +45 -0
  77. package/dist/src/home/setuptools.js.map +1 -0
  78. package/dist/src/home/spend.js +160 -0
  79. package/dist/src/home/spend.js.map +1 -0
  80. package/dist/src/home/switches.js +209 -0
  81. package/dist/src/home/switches.js.map +1 -0
  82. package/dist/src/home/switchon.js +439 -0
  83. package/dist/src/home/switchon.js.map +1 -0
  84. package/dist/src/home/toolnames.js +41 -0
  85. package/dist/src/home/toolnames.js.map +1 -0
  86. package/dist/src/home/tune.js +341 -0
  87. package/dist/src/home/tune.js.map +1 -0
  88. package/dist/src/home/words.js +7 -0
  89. package/dist/src/home/words.js.map +1 -0
  90. package/dist/src/homes.js +14 -0
  91. package/dist/src/homes.js.map +1 -1
  92. package/dist/src/install.js +1 -1
  93. package/dist/src/install.js.map +1 -1
  94. package/dist/src/ipc/workerspec.js +8 -0
  95. package/dist/src/ipc/workerspec.js.map +1 -1
  96. package/dist/src/live/publish.js +1 -1
  97. package/dist/src/live/publish.js.map +1 -1
  98. package/dist/src/livecli.js +1 -1
  99. package/dist/src/livecli.js.map +1 -1
  100. package/dist/src/loginrefresh/handover.js +121 -0
  101. package/dist/src/loginrefresh/handover.js.map +1 -0
  102. package/dist/src/loginrefresh/lock.js +54 -3
  103. package/dist/src/loginrefresh/lock.js.map +1 -1
  104. package/dist/src/loginrefresh/refresher.js +33 -5
  105. package/dist/src/loginrefresh/refresher.js.map +1 -1
  106. package/dist/src/loginrefresh/supervisor.js +18 -1
  107. package/dist/src/loginrefresh/supervisor.js.map +1 -1
  108. package/dist/src/npmverbs.js +42 -12
  109. package/dist/src/npmverbs.js.map +1 -1
  110. package/dist/src/onboard/choices.js +6 -3
  111. package/dist/src/onboard/choices.js.map +1 -1
  112. package/dist/src/onboard/engine.js +33 -292
  113. package/dist/src/onboard/engine.js.map +1 -1
  114. package/dist/src/onboard/steps/bringup.js +3 -2
  115. package/dist/src/onboard/steps/bringup.js.map +1 -1
  116. package/dist/src/onboard/steps/configfill.js +18 -7
  117. package/dist/src/onboard/steps/configfill.js.map +1 -1
  118. package/dist/src/onboard/steps/loginshare.js +213 -0
  119. package/dist/src/onboard/steps/loginshare.js.map +1 -0
  120. package/dist/src/onboard/steps/memory.js +14 -2
  121. package/dist/src/onboard/steps/memory.js.map +1 -1
  122. package/dist/src/onboard/steps/repoconfig.js +72 -0
  123. package/dist/src/onboard/steps/repoconfig.js.map +1 -0
  124. package/dist/src/onboard/toolnames.js +2 -2
  125. package/dist/src/onboard/toolnames.js.map +1 -1
  126. package/dist/src/piagentdir.js +13 -0
  127. package/dist/src/piagentdir.js.map +1 -0
  128. package/dist/src/pilogin.js +31 -16
  129. package/dist/src/pilogin.js.map +1 -1
  130. package/dist/src/qcrbin.js +16 -11
  131. package/dist/src/qcrbin.js.map +1 -1
  132. package/dist/src/reviewargs.js +122 -0
  133. package/dist/src/reviewargs.js.map +1 -0
  134. package/dist/src/reviewcli.js +7 -161
  135. package/dist/src/reviewcli.js.map +1 -1
  136. package/dist/src/reviewdetach.js +76 -11
  137. package/dist/src/reviewdetach.js.map +1 -1
  138. package/dist/src/scancli.js +39 -691
  139. package/dist/src/scancli.js.map +1 -1
  140. package/dist/src/selfimprove.js +66 -0
  141. package/dist/src/selfimprove.js.map +1 -0
  142. package/dist/src/setup/adapters.js +5 -223
  143. package/dist/src/setup/adapters.js.map +1 -1
  144. package/dist/src/setup/caserunner.js +15 -249
  145. package/dist/src/setup/caserunner.js.map +1 -1
  146. package/dist/src/setup/engine.js +32 -341
  147. package/dist/src/setup/engine.js.map +1 -1
  148. package/dist/src/setup/facts.js +3 -592
  149. package/dist/src/setup/facts.js.map +1 -1
  150. package/dist/src/setup/findings.js +3 -947
  151. package/dist/src/setup/findings.js.map +1 -1
  152. package/dist/src/setup/presentation.js +3 -8
  153. package/dist/src/setup/presentation.js.map +1 -1
  154. package/dist/src/setup/scan.js +3 -724
  155. package/dist/src/setup/scan.js.map +1 -1
  156. package/dist/src/setup/scanbuild.js +9 -92
  157. package/dist/src/setup/scanbuild.js.map +1 -1
  158. package/dist/src/setup/scanlease.js +3 -250
  159. package/dist/src/setup/scanlease.js.map +1 -1
  160. package/dist/src/setup/scanreport.js +3 -288
  161. package/dist/src/setup/scanreport.js.map +1 -1
  162. package/dist/src/setup/scanrun.js +3 -1732
  163. package/dist/src/setup/scanrun.js.map +1 -1
  164. package/dist/src/setup/scantree.js +3 -256
  165. package/dist/src/setup/scantree.js.map +1 -1
  166. package/dist/src/setup/stage2request.js +3 -258
  167. package/dist/src/setup/stage2request.js.map +1 -1
  168. package/dist/src/setup/unitcut.js +3 -436
  169. package/dist/src/setup/unitcut.js.map +1 -1
  170. package/dist/src/state.js +2 -0
  171. package/dist/src/state.js.map +1 -1
  172. package/dist/src/takeover.js +1 -0
  173. package/dist/src/takeover.js.map +1 -1
  174. package/dist/src/takeoverpi.js +2 -1
  175. package/dist/src/takeoverpi.js.map +1 -1
  176. package/dist/src/tui/board.js +1 -1
  177. package/dist/src/tui/board.js.map +1 -1
  178. package/dist/src/tui/companion.js +2 -1
  179. package/dist/src/tui/companion.js.map +1 -1
  180. package/dist/src/tui/deploytab.js +2 -2
  181. package/dist/src/tui/deploytab.js.map +1 -1
  182. package/dist/src/tui/index.js +9 -6
  183. package/dist/src/tui/index.js.map +1 -1
  184. package/dist/src/tui/memory.js +3 -16
  185. package/dist/src/tui/memory.js.map +1 -1
  186. package/dist/src/tui/memoryurl.js +22 -0
  187. package/dist/src/tui/memoryurl.js.map +1 -0
  188. package/dist/src/tui/remote.js +1 -1
  189. package/dist/src/tui/remote.js.map +1 -1
  190. package/dist/src/tui/route.js +2 -2
  191. package/dist/src/tui/route.js.map +1 -1
  192. package/dist/src/tui/setupstate.js +8 -5
  193. package/dist/src/tui/setupstate.js.map +1 -1
  194. package/dist/src/tui/sshtriage.js +1 -1
  195. package/dist/src/tui/sshtriage.js.map +1 -1
  196. package/dist/src/wire.js +6 -2
  197. package/dist/src/wire.js.map +1 -1
  198. package/dist/src/workerworld.js +4 -0
  199. package/dist/src/workerworld.js.map +1 -1
  200. package/docker/README.md +1 -1
  201. package/docker/entrypoint.sh +40 -6
  202. package/docker-compose.yml +16 -1
  203. package/extensions/cli/home.ts +14 -0
  204. package/extensions/cli/selfimprove.ts +18 -0
  205. package/extensions/home.ts +484 -0
  206. package/extensions/login-route.ts +1 -1
  207. package/extensions/onboarding.ts +8 -7
  208. package/extensions/selfimprove.ts +65 -0
  209. package/extensions/setup-scan.ts +79 -766
  210. package/extensions/setup.ts +14 -70
  211. package/package.json +6 -4
  212. package/prompts/onboarding.md +8 -7
  213. package/schemas/review-result.v1.json +60 -0
  214. package/scripts/deploy.sh +8 -6
  215. package/scripts/qcr-host.sh +28 -5
  216. package/scripts/vm-ghcr-login.sh +7 -4
  217. package/src/archive/restore.ts +18 -21
  218. package/src/botworker.ts +13 -2
  219. package/src/channelfs.ts +3 -26
  220. package/src/cli.ts +11 -54
  221. package/src/config.ts +38 -0
  222. package/src/daemon.ts +26 -0
  223. package/src/debuground.ts +3 -0
  224. package/src/debugroundpi.ts +1 -0
  225. package/src/engine/caserunner-sdk.ts +29 -314
  226. package/src/home/adapters.ts +418 -0
  227. package/src/home/advanced.ts +421 -0
  228. package/src/home/advancedtools.ts +96 -0
  229. package/src/home/autoreview.ts +385 -0
  230. package/src/home/daemonstatus.ts +55 -0
  231. package/src/home/devicelogin.ts +107 -0
  232. package/src/home/launch.ts +257 -0
  233. package/src/home/loginowner.ts +248 -0
  234. package/src/home/memory.ts +176 -0
  235. package/src/home/model.ts +965 -0
  236. package/src/home/panel.ts +666 -0
  237. package/src/home/ports.ts +338 -0
  238. package/src/home/review.ts +206 -0
  239. package/src/home/reviews.ts +565 -0
  240. package/src/home/setup.ts +689 -0
  241. package/src/home/setupadapters.ts +217 -0
  242. package/src/home/setupcard.ts +288 -0
  243. package/src/home/setuptools.ts +57 -0
  244. package/src/home/spend.ts +194 -0
  245. package/src/home/switches.ts +293 -0
  246. package/src/home/switchon.ts +554 -0
  247. package/src/home/toolnames.ts +46 -0
  248. package/src/home/tune.ts +405 -0
  249. package/src/home/words.ts +8 -0
  250. package/src/homes.ts +17 -0
  251. package/src/install.ts +1 -1
  252. package/src/ipc/workerspec.ts +15 -0
  253. package/src/live/publish.ts +4 -1
  254. package/src/livecli.ts +6 -1
  255. package/src/loginrefresh/handover.ts +138 -0
  256. package/src/loginrefresh/lock.ts +72 -3
  257. package/src/loginrefresh/refresher.ts +34 -5
  258. package/src/loginrefresh/supervisor.ts +25 -2
  259. package/src/npmverbs.ts +51 -11
  260. package/src/onboard/choices.ts +6 -3
  261. package/src/onboard/engine.ts +64 -434
  262. package/src/onboard/steps/bringup.ts +3 -2
  263. package/src/onboard/steps/configfill.ts +23 -7
  264. package/src/onboard/steps/loginshare.ts +258 -0
  265. package/src/onboard/steps/memory.ts +18 -2
  266. package/src/onboard/steps/repoconfig.ts +85 -0
  267. package/src/onboard/toolnames.ts +2 -2
  268. package/src/piagentdir.ts +12 -0
  269. package/src/pilogin.ts +32 -16
  270. package/src/qcrbin.ts +16 -11
  271. package/src/reviewargs.ts +119 -0
  272. package/src/reviewcli.ts +6 -167
  273. package/src/reviewdetach.ts +107 -13
  274. package/src/scancli.ts +75 -826
  275. package/src/selfimprove.ts +90 -0
  276. package/src/setup/adapters.ts +13 -221
  277. package/src/setup/caserunner.ts +34 -273
  278. package/src/setup/engine.ts +62 -496
  279. package/src/setup/facts.ts +3 -627
  280. package/src/setup/findings.ts +3 -1264
  281. package/src/setup/presentation.ts +3 -18
  282. package/src/setup/scan.ts +3 -1033
  283. package/src/setup/scanbuild.ts +20 -114
  284. package/src/setup/scanlease.ts +3 -297
  285. package/src/setup/scanreport.ts +3 -373
  286. package/src/setup/scanrun.ts +3 -2268
  287. package/src/setup/scantree.ts +3 -259
  288. package/src/setup/stage2request.ts +3 -347
  289. package/src/setup/unitcut.ts +3 -523
  290. package/src/state.ts +25 -0
  291. package/src/takeover.ts +5 -0
  292. package/src/takeoverpi.ts +3 -2
  293. package/src/tui/board.ts +1 -1
  294. package/src/tui/companion.ts +2 -1
  295. package/src/tui/deploytab.ts +2 -2
  296. package/src/tui/index.ts +9 -6
  297. package/src/tui/memory.ts +3 -15
  298. package/src/tui/memoryurl.ts +22 -0
  299. package/src/tui/remote.ts +1 -1
  300. package/src/tui/route.ts +2 -2
  301. package/src/tui/setupstate.ts +20 -16
  302. package/src/tui/sshtriage.ts +1 -1
  303. package/src/wire.ts +6 -2
  304. package/src/workerworld.ts +9 -1
  305. package/dist/src/live/projection.js +0 -450
  306. package/dist/src/live/projection.js.map +0 -1
  307. package/dist/src/live/read.js +0 -60
  308. package/dist/src/live/read.js.map +0 -1
  309. package/dist/src/onboard/launch.js +0 -75
  310. package/dist/src/onboard/launch.js.map +0 -1
  311. package/dist/src/setup/ledger.js +0 -207
  312. package/dist/src/setup/ledger.js.map +0 -1
  313. package/dist/src/setup/stage2.js +0 -617
  314. package/dist/src/setup/stage2.js.map +0 -1
  315. package/dist/src/setup/textsniff.js +0 -89
  316. package/dist/src/setup/textsniff.js.map +0 -1
  317. package/src/live/projection.ts +0 -491
  318. package/src/live/read.ts +0 -86
  319. package/src/onboard/launch.ts +0 -103
  320. package/src/setup/ledger.ts +0 -324
  321. package/src/setup/stage2.ts +0 -926
  322. package/src/setup/textsniff.ts +0 -95
@@ -1,450 +0,0 @@
1
- // The round-progress v2 projection of a LiveEvent log.
2
- //
3
- // extensions/round-progress.ts publishes `state/round-progress/pr-<n>.json`
4
- // (and the append-only transition log beside it) from inside the tmux pi, by
5
- // listening to pi's events. This module reproduces both from the LiveEvent log
6
- // alone, so the engine routes - which have no such extension - and a viewer
7
- // reading a finished or running round all get the same snapshot, with the
8
- // contract in packages/pi-plugin/src/round-progress.ts unchanged: board.ts, requiredpasses.ts and
9
- // the supervisor read it as they always have.
10
- //
11
- // The extension is the REFERENCE. Every rule here mirrors the handler it
12
- // stands for, line by line, because the golden test
13
- // (tests/live-projection-golden.test.ts) holds the two byte-equal on the same
14
- // events. The one place the log is coarser than pi's stream is time: a held
15
- // update is stamped at its window's flush (~250 ms), so a heartbeat or a
16
- // `started_at` taken from an update can differ from the extension's by that
17
- // much. Nothing the supervisor decides on (the milestones' order, statuses,
18
- // command identity) depends on it.
19
- import { parseSessionCommandMarker } from "@quickchatai/pi-quickreview/src/session-command.js";
20
- import { isLiveAgentStatus, } from "@quickchatai/pi-quickreview/src/round-progress.js";
21
- function text(value) {
22
- return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
23
- }
24
- function number(value) {
25
- return typeof value === "number" && Number.isFinite(value) ? Math.max(0, value) : 0;
26
- }
27
- function status(value, exitCode) {
28
- if (isLiveAgentStatus(value))
29
- return value;
30
- return exitCode === 0 ? "completed" : exitCode === undefined ? "running" : "failed";
31
- }
32
- /** The round number rides the order's posting calls (`QCR_ROUND_NO=<k>`, with
33
- * or without `export`); the head rides the Worktree line. */
34
- function reviewIdentity(body) {
35
- const round = /(?:^|\s)(?:export )?QCR_ROUND_NO=(\d+)(?=\s|$)/.exec(body);
36
- const head = /\*\*Worktree\*\*:[^\n]* @ `([^`]+)`/.exec(body);
37
- if (!round || !head)
38
- return undefined;
39
- const roundNo = Number(round[1]);
40
- return Number.isInteger(roundNo) && roundNo > 0
41
- ? { round_no: roundNo, head_sha: head[1] }
42
- : undefined;
43
- }
44
- function currentTool(progress) {
45
- if (!Array.isArray(progress?.recent_tools))
46
- return undefined;
47
- const tools = progress.recent_tools;
48
- const picked = [...tools].reverse().find((x) => x.status === "running") ?? tools.at(-1);
49
- if (!picked)
50
- return undefined;
51
- const name = text(picked.tool) ?? "tool";
52
- const args = text(picked.args);
53
- return args ? `${name}: ${args.slice(0, 120)}` : name;
54
- }
55
- function asAgent(result, fallbackAgent, live = false) {
56
- const agent = text(result.agent) ?? fallbackAgent;
57
- if (!agent)
58
- return undefined;
59
- const progress = result.progress;
60
- const native = result.native ?? { tool_count: 0 };
61
- const error = text(progress?.error) ?? text(result.error_message);
62
- const exit = result.exit_code;
63
- const nativeFailed = (typeof exit === "number" && exit > 0) ||
64
- result.stop_reason === "error" ||
65
- result.stop_reason === "aborted";
66
- const st = isLiveAgentStatus(progress?.status)
67
- ? progress.status
68
- : nativeFailed
69
- ? "failed"
70
- : live || exit === -1 || exit === undefined
71
- ? "running"
72
- : status(undefined, exit);
73
- const tool = currentTool(progress) ?? (live ? native.last_tool : undefined);
74
- const last = text(progress?.last_message) ?? native.last_text;
75
- return {
76
- agent,
77
- status: st,
78
- duration_ms: number(progress?.duration_ms),
79
- tool_count: number(progress?.tool_count) || native.tool_count,
80
- ...(tool ? { current_tool: tool } : {}),
81
- ...(last ? { last_message: last } : {}),
82
- ...(error ? { error } : {}),
83
- };
84
- }
85
- export class RoundProgressProjection {
86
- who;
87
- snapshotState;
88
- written;
89
- log = [];
90
- lastHeartbeat = 0;
91
- clock = "";
92
- agents = new Map();
93
- callAgents = new Map();
94
- runKeys = new Map();
95
- endLogged = new Set();
96
- /** The children of each open lens call, rebuilt from the changed slots. */
97
- calls = new Map();
98
- constructor(who) {
99
- this.who = who;
100
- }
101
- /** The snapshot as its file would hold it now (the last write). */
102
- get snapshot() {
103
- return this.written === undefined
104
- ? undefined
105
- : JSON.parse(this.written);
106
- }
107
- /** The bytes of `pr-<n>.json`. */
108
- get snapshotJson() {
109
- return this.written;
110
- }
111
- /** The transition lines, in order. */
112
- get transitions() {
113
- return this.log;
114
- }
115
- /** The bytes of `pr-<n>.jsonl` (before its size-cap rotation). */
116
- get transitionsJsonl() {
117
- return this.log.map((l) => `${JSON.stringify(l)}\n`).join("");
118
- }
119
- apply(event) {
120
- this.clock = event.at;
121
- switch (event.type) {
122
- case "agent_start":
123
- return this.agentStart();
124
- case "message_start":
125
- return this.messageStart(event.role, event.text);
126
- case "turn_start":
127
- case "message_delta":
128
- return this.heartbeat();
129
- case "tool_start":
130
- return this.toolStart(event);
131
- case "tool_update":
132
- return this.toolUpdate(event);
133
- case "tool_end":
134
- return this.toolEnd(event);
135
- case "agent_settled":
136
- return this.settled();
137
- default:
138
- return;
139
- }
140
- }
141
- // ---- the extension's helpers --------------------------------------------------
142
- nowIso() {
143
- return this.clock;
144
- }
145
- bindRun(run, key) {
146
- if (run === null)
147
- return key;
148
- const held = this.runKeys.get(run);
149
- if (held !== undefined)
150
- return held;
151
- this.runKeys.set(run, key);
152
- return key;
153
- }
154
- executionKeys(callId, names) {
155
- const seen = new Map();
156
- return names.map((agent) => {
157
- const n = (seen.get(agent) ?? 0) + 1;
158
- seen.set(agent, n);
159
- return n === 1 ? `${callId}:${agent}` : `${callId}:${agent}#${n}`;
160
- });
161
- }
162
- write() {
163
- const snapshot = this.snapshotState;
164
- if (!snapshot)
165
- return;
166
- snapshot.updated_at = this.nowIso();
167
- snapshot.agents = [...this.agents.values()];
168
- this.written = `${JSON.stringify(snapshot)}\n`;
169
- }
170
- transition(entry) {
171
- const snapshot = this.snapshotState;
172
- if (!snapshot)
173
- return;
174
- this.log.push({
175
- at: this.nowIso(),
176
- pr: this.who.pr,
177
- session: this.who.session,
178
- run_started_at: snapshot.run_started_at,
179
- ...(snapshot.command_id ? { command_id: snapshot.command_id } : {}),
180
- ...entry,
181
- });
182
- }
183
- passEnded(agent) {
184
- const key = agent.execution_id;
185
- if (!key || agent.status === "running" || this.endLogged.has(key))
186
- return;
187
- this.endLogged.add(key);
188
- this.transition({
189
- event: "pass_end",
190
- execution_id: key,
191
- agent: agent.agent,
192
- status: agent.status,
193
- });
194
- }
195
- fanoutSeen() {
196
- const snapshot = this.snapshotState;
197
- if (!snapshot || this.agents.size === 0)
198
- return;
199
- snapshot.first_lens_started_at ??= this.nowIso();
200
- snapshot.fanout_started_at ??= snapshot.first_lens_started_at;
201
- }
202
- activity(description) {
203
- const snapshot = this.snapshotState;
204
- if (!snapshot)
205
- return;
206
- snapshot.last_activity = description;
207
- snapshot.last_activity_at = this.nowIso();
208
- this.write();
209
- }
210
- heartbeat() {
211
- if (!this.snapshotState)
212
- return;
213
- const now = Date.parse(this.clock);
214
- if (now - this.lastHeartbeat < 1_000)
215
- return;
216
- this.lastHeartbeat = now;
217
- this.write();
218
- }
219
- freshSnapshot(lastActivity) {
220
- const at = this.nowIso();
221
- this.agents.clear();
222
- this.callAgents.clear();
223
- this.runKeys.clear();
224
- this.endLogged.clear();
225
- return {
226
- version: 2,
227
- pr: this.who.pr,
228
- session: this.who.session,
229
- run_started_at: at,
230
- updated_at: at,
231
- parent_status: "active",
232
- last_activity_at: at,
233
- last_activity: lastActivity,
234
- agents: [],
235
- };
236
- }
237
- /** The children of a call after this line: the slots it carries laid over
238
- * what the call's earlier lines left. */
239
- merge(id, n, changed) {
240
- const held = this.calls.get(id) ?? [];
241
- for (const r of changed)
242
- held[r.slot] = r;
243
- const full = Array.from({ length: n }, (_, slot) => held[slot] ?? { slot });
244
- this.calls.set(id, full);
245
- return full;
246
- }
247
- // ---- the handlers ---------------------------------------------------------------
248
- agentStart() {
249
- // pi's automatic retry or queued continuation emits another agent_start
250
- // inside the SAME outer run: an inner start keeps the run's command,
251
- // milestones and passes.
252
- if (this.snapshotState && this.snapshotState.parent_status === "active") {
253
- this.activity("parent run continued");
254
- return;
255
- }
256
- this.snapshotState = this.freshSnapshot("parent run started");
257
- this.write();
258
- this.transition({ event: "parent_start" });
259
- }
260
- messageStart(role, body) {
261
- const snapshot = this.snapshotState;
262
- if (!snapshot || role !== "user" || !body)
263
- return;
264
- const marker = parseSessionCommandMarker(body);
265
- if (!marker)
266
- return;
267
- // A different command in a run that has one already is a new execution.
268
- let current = snapshot;
269
- if (current.command_id !== undefined && current.command_id !== marker.id) {
270
- current = this.freshSnapshot("parent run started");
271
- this.snapshotState = current;
272
- }
273
- current.command_id = marker.id;
274
- current.command_sha256 = marker.payloadSha256;
275
- const identity = reviewIdentity(body);
276
- if (identity) {
277
- current.round_no = identity.round_no;
278
- current.head_sha = identity.head_sha;
279
- }
280
- const firstAcceptance = current.command_accepted_at === undefined;
281
- current.command_accepted_at ??= this.nowIso();
282
- current.preparing_at ??= current.command_accepted_at;
283
- if (firstAcceptance)
284
- this.transition({
285
- event: "command_accepted",
286
- ...(current.round_no !== undefined ? { round_no: current.round_no } : {}),
287
- ...(current.head_sha !== undefined ? { head_sha: current.head_sha } : {}),
288
- });
289
- this.activity(`command ${marker.id} accepted; parent preparing compact fanout context`);
290
- }
291
- toolStart(ev) {
292
- const snapshot = this.snapshotState;
293
- if (!snapshot)
294
- return;
295
- const executions = ev.executions ?? [];
296
- if (executions.length > 0) {
297
- const names = executions.map(({ agent }) => agent);
298
- const at = this.nowIso();
299
- this.callAgents.set(ev.id, names);
300
- const keys = this.executionKeys(ev.id, names);
301
- for (const [index, agent] of names.entries()) {
302
- const key = keys[index];
303
- const phase = executions[index]?.phase;
304
- this.agents.set(key, {
305
- execution_id: key,
306
- agent,
307
- ...(phase ? { phase } : {}),
308
- status: "running",
309
- duration_ms: 0,
310
- tool_count: 0,
311
- started_at: at,
312
- });
313
- this.transition({ event: "pass_start", execution_id: key, agent });
314
- }
315
- snapshot.first_lens_started_at ??= at;
316
- snapshot.fanout_started_at ??= snapshot.first_lens_started_at;
317
- snapshot.active_tool = `subagent: ${names.join(", ")}`;
318
- this.activity(`${names.join(", ")} started`);
319
- return;
320
- }
321
- snapshot.active_tool = ev.preview ? `${ev.tool}: ${ev.preview}` : ev.tool;
322
- this.activity(snapshot.active_tool);
323
- }
324
- toolUpdate(ev) {
325
- const snapshot = this.snapshotState;
326
- if (!snapshot)
327
- return;
328
- const fallbacks = this.callAgents.get(ev.id) ?? [];
329
- const reported = this.merge(ev.id, ev.n, ev.results);
330
- // Native parallel mode marks a still-running slot with exitCode -1 and a
331
- // finished one with its real exit code.
332
- let changed = false;
333
- const updated = reported.flatMap((result, index) => {
334
- const agent = asAgent(result, fallbacks[index] ?? (fallbacks.length === 1 ? fallbacks[0] : undefined), ev.mode === "parallel" ? result.exit_code === -1 : true);
335
- return agent ? [{ agent, run: result.id ?? null }] : [];
336
- });
337
- const updateKeys = this.executionKeys(ev.id, updated.map(({ agent }) => agent.agent));
338
- for (const [index, { agent, run }] of updated.entries()) {
339
- const key = this.bindRun(run, updateKeys[index]);
340
- const previous = this.agents.get(key);
341
- // A parallel slot can finish while its siblings still run: a terminal
342
- // record carries its completion milestone from the first update that
343
- // reports it, and a running one never carries one.
344
- const { finished_at: previousFinished, ...kept } = previous ?? {};
345
- const next = {
346
- ...kept,
347
- ...agent,
348
- execution_id: key,
349
- started_at: previous?.started_at ?? this.nowIso(),
350
- ...(agent.status === "running" ? {} : { finished_at: previousFinished ?? this.nowIso() }),
351
- };
352
- this.agents.set(key, next);
353
- this.passEnded(next);
354
- snapshot.active_tool = `subagent: ${agent.agent}`;
355
- changed = true;
356
- }
357
- this.fanoutSeen();
358
- if (changed)
359
- this.write();
360
- else
361
- this.heartbeat();
362
- }
363
- toolEnd(ev) {
364
- const snapshot = this.snapshotState;
365
- if (!snapshot)
366
- return;
367
- const id = ev.id;
368
- const fallbacks = this.callAgents.get(id) ?? [];
369
- const reported = this.merge(id, ev.n, ev.results);
370
- this.calls.delete(id);
371
- const finalAgents = [];
372
- const ended = reported.flatMap((result, index) => {
373
- const agent = asAgent(result, fallbacks[index] ?? (fallbacks.length === 1 ? fallbacks[0] : undefined));
374
- return agent ? [{ agent, run: result.id ?? null }] : [];
375
- });
376
- const endKeys = this.executionKeys(id, ended.map(({ agent }) => agent.agent));
377
- for (const [index, { agent, run }] of ended.entries()) {
378
- const key = this.bindRun(run, endKeys[index]);
379
- const previous = this.agents.get(key);
380
- // A child the call returns still running (a placeholder) carries no
381
- // finish time, as in toolUpdate: the parser refuses the pair.
382
- const { finished_at: previousFinished, ...kept } = previous ?? {};
383
- const finalAgent = {
384
- ...kept,
385
- ...agent,
386
- execution_id: key,
387
- started_at: previous?.started_at ?? this.nowIso(),
388
- ...(agent.status === "running" ? {} : { finished_at: previousFinished ?? this.nowIso() }),
389
- };
390
- this.agents.set(key, finalAgent);
391
- finalAgents.push(finalAgent);
392
- this.passEnded(finalAgent);
393
- }
394
- if (finalAgents.length === 0 && fallbacks.length > 0) {
395
- const failed = ev.is_error;
396
- const fallbackKeys = this.executionKeys(id, fallbacks);
397
- for (const [index, fallback] of fallbacks.entries()) {
398
- const key = fallbackKeys[index];
399
- const previous = this.agents.get(key);
400
- if (previous && previous.status !== "running") {
401
- finalAgents.push(previous);
402
- continue;
403
- }
404
- const finalAgent = {
405
- ...(previous ?? {
406
- execution_id: key,
407
- agent: fallback,
408
- duration_ms: 0,
409
- tool_count: 0,
410
- started_at: this.nowIso(),
411
- }),
412
- status: failed ? "failed" : "completed",
413
- finished_at: previous?.finished_at ?? this.nowIso(),
414
- };
415
- this.agents.set(key, finalAgent);
416
- finalAgents.push(finalAgent);
417
- this.passEnded(finalAgent);
418
- }
419
- }
420
- this.fanoutSeen();
421
- this.callAgents.delete(id);
422
- snapshot.active_tool = undefined;
423
- this.activity(finalAgents.length > 0
424
- ? `${finalAgents.map((agent) => `${agent.agent} ${agent.status}`).join(", ")}`
425
- : `${ev.tool} ${ev.is_error ? "failed" : "completed"}`);
426
- }
427
- settled() {
428
- const snapshot = this.snapshotState;
429
- if (!snapshot)
430
- return;
431
- snapshot.parent_status = "settled";
432
- snapshot.active_tool = undefined;
433
- this.activity("parent session settled");
434
- this.transition({ event: "parent_settle" });
435
- }
436
- }
437
- /** Project a main log. The identity (PR, session) comes from its
438
- * `session_start` line; a log with none, or for a round that has no PR number,
439
- * projects to nothing - as the extension does nothing outside a numbered PR
440
- * session. */
441
- export function projectRoundProgress(events) {
442
- const start = events.find((e) => e.type === "session_start");
443
- if (start?.type !== "session_start" || start.stream !== "main" || start.pr === null)
444
- return undefined;
445
- const projection = new RoundProgressProjection({ pr: start.pr, session: start.session });
446
- for (const e of events)
447
- projection.apply(e);
448
- return projection;
449
- }
450
- //# sourceMappingURL=projection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/live/projection.ts"],"names":[],"mappings":"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"}
@@ -1,60 +0,0 @@
1
- // Finding and reading a round's LiveEvent logs: what `qcr review status` and
2
- // `qcr live` do with a run directory. No writer and no engine here, so a
3
- // daemon-side or TUI reader can import it.
4
- import { readdirSync, statSync } from "node:fs";
5
- import { join } from "node:path";
6
- import { LIVE_MAIN_FILE, readLiveEvents, } from "@quickchatai/pi-quickreview/src/live/events.js";
7
- import { projectRoundProgress } from "./projection.js";
8
- const names = (dir) => {
9
- try {
10
- return readdirSync(dir);
11
- }
12
- catch {
13
- return [];
14
- }
15
- };
16
- /** Every round log directory under `<root>/state/live/`, oldest round first. */
17
- export function listLiveRounds(root) {
18
- const base = join(root, "state", "live");
19
- const found = [];
20
- for (const key of names(base)) {
21
- for (const r of names(join(base, key))) {
22
- const m = /^r(\d+)$/.exec(r);
23
- if (m)
24
- found.push({ dir: join(base, key, r), key, round: Number(m[1]) });
25
- }
26
- }
27
- return found.sort((a, b) => a.key.localeCompare(b.key) || a.round - b.round);
28
- }
29
- function mtime(path) {
30
- try {
31
- return statSync(path).mtimeMs;
32
- }
33
- catch {
34
- return 0;
35
- }
36
- }
37
- /** The round that was written last. */
38
- export function latestLiveRound(root) {
39
- return listLiveRounds(root).reduce((best, r) => best === undefined ||
40
- mtime(join(r.dir, LIVE_MAIN_FILE)) >= mtime(join(best.dir, LIVE_MAIN_FILE))
41
- ? r
42
- : best, undefined);
43
- }
44
- /** The ids of the lens sessions a round logged, in file-name order. */
45
- export function lensLogIds(dir) {
46
- return names(dir)
47
- .flatMap((f) => /^lens-(.+)\.jsonl$/.exec(f)?.[1] ?? [])
48
- .sort();
49
- }
50
- /** Read one round's main log and project it. */
51
- export function viewRound(ref) {
52
- const { events } = readLiveEvents(join(ref.dir, LIVE_MAIN_FILE));
53
- return {
54
- ref,
55
- events,
56
- snapshot: projectRoundProgress(events)?.snapshot,
57
- lenses: lensLogIds(ref.dir),
58
- };
59
- }
60
- //# sourceMappingURL=read.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/live/read.ts"],"names":[],"mappings":"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"}
@@ -1,75 +0,0 @@
1
- // `qcr onboard` mechanics: launch pi at the pinned version via npx
2
- // (pi stays a non-dependency — this works from a bare clone with only Node and
3
- // the checkout), hand it the onboarding system prompt + exactly one onboarding
4
- // extension + a restricted built-in tool set, and on exit either exec the TUI
5
- // (checklist complete) or say how to resume.
6
- //
7
- // Everything effectful is injected (spawn, completion read, log), so tests
8
- // drive the whole flow with fakes; src/cli.ts cmdOnboard is the one real
9
- // assembly.
10
- import { join } from "node:path";
11
- import { defaultSteps } from "./steps/index.js";
12
- import { onboardingToolAllowlist } from "./toolnames.js";
13
- // The pin reader lives in a leaf module: src/version.ts (on the daemon's import
14
- // graph) needs it, and this module imports the whole step registry.
15
- export { piPinFromPackageJson } from "./pipin.js";
16
- /** Dedicated onboarding session store — never the reviewer/companion dirs, so
17
- * onboarding cannot pollute (or be polluted by) any other pi session store. */
18
- export function onboardingSessionDir(root) {
19
- return join(root, "state", "onboarding", "pi-sessions");
20
- }
21
- /**
22
- * The full npx argv for the onboarding pi session.
23
- *
24
- * `--approve` is the same never-block-on-input rule as buildPiCommand
25
- * (src/sessions.ts) and the companion's piArgv: the wizard must never stall
26
- * on pi's interactive "Trust project folder?" modal.
27
- *
28
- * VERIFY-ON-PIN: `--no-extensions`, `--no-skills`, `--no-context-files`,
29
- * `-e <path>` and `--tools <list>` against the pinned pi version's --help —
30
- * the intent (no ambient extensions, exactly one onboarding extension, a
31
- * read-only built-in belt) is the design decision; the exact flag spellings
32
- * are unverified statically and belong to the named onboarding smoke step.
33
- *
34
- * `--tools` is an allowlist over extension tools too (pi 1.4.0; pinned by
35
- * tests/onboard-tools-sdk.test.ts on the real SDK), so it names every wizard
36
- * tool, derived from the step registry: a step added there is active here
37
- * with no second edit. bash, write and edit stay off it.
38
- */
39
- export function onboardingPiArgv(pin, root, stepIds = defaultSteps().map((s) => s.id)) {
40
- return [
41
- "npx",
42
- "-y",
43
- `${pin.package}@${pin.version}`,
44
- "--approve",
45
- "--no-extensions",
46
- "--no-skills",
47
- "--no-context-files",
48
- "-e",
49
- join(root, "extensions", "cli", "onboarding.ts"),
50
- "--system-prompt",
51
- join(root, "prompts", "onboarding.md"),
52
- "--tools",
53
- onboardingToolAllowlist(stepIds).join(","),
54
- "--session-dir",
55
- onboardingSessionDir(root),
56
- ];
57
- }
58
- /**
59
- * Run the onboarding session and handle the handoff:
60
- * - checklist complete after pi exits ⇒ open the TUI (same stdio);
61
- * - otherwise print how to resume — `qcr onboard` again re-verifies
62
- * completed steps and continues at the first unfinished one.
63
- */
64
- export async function runOnboard(deps) {
65
- const argv = onboardingPiArgv(deps.pin, deps.root);
66
- deps.log(`onboarding: launching pi ${deps.pin.package}@${deps.pin.version} via npx (first run downloads it — give it a moment)`);
67
- const code = await deps.spawn(argv[0], argv.slice(1));
68
- if (deps.isComplete()) {
69
- deps.log("onboarding: checklist verified complete — opening the TUI.");
70
- return deps.spawn(deps.nodeBin ?? process.execPath, [deps.cliPath, "tui"]);
71
- }
72
- deps.log("onboarding: not finished yet. Run `qcr onboard` again to resume — completed steps are re-verified, not repeated.");
73
- return code;
74
- }
75
- //# sourceMappingURL=launch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/onboard/launch.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,+EAA+E;AAC/E,+EAA+E;AAC/E,8EAA8E;AAC9E,6CAA6C;AAC7C,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,YAAY;AACZ,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,gFAAgF;AAChF,oEAAoE;AACpE,OAAO,EAAE,oBAAoB,EAAc,MAAM,YAAY,CAAC;AAG9D;+EAC+E;AAC/E,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAU,EACV,IAAY,EACZ,UAA6B,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5D,OAAO;QACL,KAAK;QACL,IAAI;QACJ,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE;QAC/B,WAAW;QACX,iBAAiB;QACjB,aAAa;QACb,oBAAoB;QACpB,IAAI;QACJ,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,CAAC;QAChD,iBAAiB;QACjB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC;QACtC,SAAS;QACT,uBAAuB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1C,eAAe;QACf,oBAAoB,CAAC,IAAI,CAAC;KAC3B,CAAC;AACJ,CAAC;AAkBD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAoB;IACnD,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,CACN,4BAA4B,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,sDAAsD,CACvH,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,GAAG,CACN,kHAAkH,CACnH,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}