@quickchatai/quickreview 1.2.0 → 1.3.2

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 (350) hide show
  1. package/README.md +116 -53
  2. package/bin/qcr.js +1 -1
  3. package/config.example.toml +25 -7
  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/extensions/vendor/openviking-pi/index.js +4 -0
  25. package/dist/extensions/vendor/openviking-pi/index.js.map +1 -1
  26. package/dist/extensions/vendor/openviking-pi/qcr-hooks.js +3 -1
  27. package/dist/extensions/vendor/openviking-pi/qcr-hooks.js.map +1 -1
  28. package/dist/extensions/vendor/openviking-pi/sync.js +81 -0
  29. package/dist/extensions/vendor/openviking-pi/sync.js.map +1 -1
  30. package/dist/src/archive/restore.js +18 -15
  31. package/dist/src/archive/restore.js.map +1 -1
  32. package/dist/src/botworker.js +13 -2
  33. package/dist/src/botworker.js.map +1 -1
  34. package/dist/src/channelfs.js +3 -26
  35. package/dist/src/channelfs.js.map +1 -1
  36. package/dist/src/cli.js +14 -50
  37. package/dist/src/cli.js.map +1 -1
  38. package/dist/src/config.js +16 -0
  39. package/dist/src/config.js.map +1 -1
  40. package/dist/src/daemon.js +33 -4
  41. package/dist/src/daemon.js.map +1 -1
  42. package/dist/src/debuground.js +1 -0
  43. package/dist/src/debuground.js.map +1 -1
  44. package/dist/src/debugroundpi.js +1 -0
  45. package/dist/src/debugroundpi.js.map +1 -1
  46. package/dist/src/engine/caserunner-sdk.js +15 -251
  47. package/dist/src/engine/caserunner-sdk.js.map +1 -1
  48. package/dist/src/home/adapters.js +349 -0
  49. package/dist/src/home/adapters.js.map +1 -0
  50. package/dist/src/home/advanced.js +318 -0
  51. package/dist/src/home/advanced.js.map +1 -0
  52. package/dist/src/home/advancedtools.js +57 -0
  53. package/dist/src/home/advancedtools.js.map +1 -0
  54. package/dist/src/home/autoreview.js +325 -0
  55. package/dist/src/home/autoreview.js.map +1 -0
  56. package/dist/src/home/daemonstatus.js +32 -0
  57. package/dist/src/home/daemonstatus.js.map +1 -0
  58. package/dist/src/home/devicelogin.js +61 -0
  59. package/dist/src/home/devicelogin.js.map +1 -0
  60. package/dist/src/home/launch.js +202 -0
  61. package/dist/src/home/launch.js.map +1 -0
  62. package/dist/src/home/loginowner.js +205 -0
  63. package/dist/src/home/loginowner.js.map +1 -0
  64. package/dist/src/home/memory.js +122 -0
  65. package/dist/src/home/memory.js.map +1 -0
  66. package/dist/src/home/model.js +811 -0
  67. package/dist/src/home/model.js.map +1 -0
  68. package/dist/src/home/panel.js +520 -0
  69. package/dist/src/home/panel.js.map +1 -0
  70. package/dist/src/home/ports.js +19 -0
  71. package/dist/src/home/ports.js.map +1 -0
  72. package/dist/src/home/review.js +163 -0
  73. package/dist/src/home/review.js.map +1 -0
  74. package/dist/src/home/reviews.js +478 -0
  75. package/dist/src/home/reviews.js.map +1 -0
  76. package/dist/src/home/setup.js +507 -0
  77. package/dist/src/home/setup.js.map +1 -0
  78. package/dist/src/home/setupadapters.js +214 -0
  79. package/dist/src/home/setupadapters.js.map +1 -0
  80. package/dist/src/home/setupcard.js +199 -0
  81. package/dist/src/home/setupcard.js.map +1 -0
  82. package/dist/src/home/setuptools.js +45 -0
  83. package/dist/src/home/setuptools.js.map +1 -0
  84. package/dist/src/home/spend.js +160 -0
  85. package/dist/src/home/spend.js.map +1 -0
  86. package/dist/src/home/switches.js +209 -0
  87. package/dist/src/home/switches.js.map +1 -0
  88. package/dist/src/home/switchon.js +439 -0
  89. package/dist/src/home/switchon.js.map +1 -0
  90. package/dist/src/home/toolnames.js +41 -0
  91. package/dist/src/home/toolnames.js.map +1 -0
  92. package/dist/src/home/tune.js +341 -0
  93. package/dist/src/home/tune.js.map +1 -0
  94. package/dist/src/home/words.js +7 -0
  95. package/dist/src/home/words.js.map +1 -0
  96. package/dist/src/homes.js +14 -0
  97. package/dist/src/homes.js.map +1 -1
  98. package/dist/src/install.js +1 -1
  99. package/dist/src/install.js.map +1 -1
  100. package/dist/src/ipc/workerspec.js +8 -0
  101. package/dist/src/ipc/workerspec.js.map +1 -1
  102. package/dist/src/ledgercheck.js +39 -10
  103. package/dist/src/ledgercheck.js.map +1 -1
  104. package/dist/src/live/publish.js +1 -1
  105. package/dist/src/live/publish.js.map +1 -1
  106. package/dist/src/livecli.js +1 -1
  107. package/dist/src/livecli.js.map +1 -1
  108. package/dist/src/loginrefresh/handover.js +121 -0
  109. package/dist/src/loginrefresh/handover.js.map +1 -0
  110. package/dist/src/loginrefresh/lock.js +54 -3
  111. package/dist/src/loginrefresh/lock.js.map +1 -1
  112. package/dist/src/loginrefresh/refresher.js +33 -5
  113. package/dist/src/loginrefresh/refresher.js.map +1 -1
  114. package/dist/src/loginrefresh/supervisor.js +18 -1
  115. package/dist/src/loginrefresh/supervisor.js.map +1 -1
  116. package/dist/src/npmverbs.js +42 -12
  117. package/dist/src/npmverbs.js.map +1 -1
  118. package/dist/src/onboard/choices.js +6 -3
  119. package/dist/src/onboard/choices.js.map +1 -1
  120. package/dist/src/onboard/engine.js +33 -292
  121. package/dist/src/onboard/engine.js.map +1 -1
  122. package/dist/src/onboard/steps/bringup.js +3 -2
  123. package/dist/src/onboard/steps/bringup.js.map +1 -1
  124. package/dist/src/onboard/steps/configfill.js +18 -7
  125. package/dist/src/onboard/steps/configfill.js.map +1 -1
  126. package/dist/src/onboard/steps/loginshare.js +213 -0
  127. package/dist/src/onboard/steps/loginshare.js.map +1 -0
  128. package/dist/src/onboard/steps/memory.js +14 -2
  129. package/dist/src/onboard/steps/memory.js.map +1 -1
  130. package/dist/src/onboard/steps/repoconfig.js +72 -0
  131. package/dist/src/onboard/steps/repoconfig.js.map +1 -0
  132. package/dist/src/onboard/toolnames.js +2 -2
  133. package/dist/src/onboard/toolnames.js.map +1 -1
  134. package/dist/src/piagentdir.js +13 -0
  135. package/dist/src/piagentdir.js.map +1 -0
  136. package/dist/src/pilogin.js +31 -16
  137. package/dist/src/pilogin.js.map +1 -1
  138. package/dist/src/qcrbin.js +16 -11
  139. package/dist/src/qcrbin.js.map +1 -1
  140. package/dist/src/reviewargs.js +122 -0
  141. package/dist/src/reviewargs.js.map +1 -0
  142. package/dist/src/reviewcli.js +7 -161
  143. package/dist/src/reviewcli.js.map +1 -1
  144. package/dist/src/reviewdetach.js +76 -11
  145. package/dist/src/reviewdetach.js.map +1 -1
  146. package/dist/src/scancli.js +39 -691
  147. package/dist/src/scancli.js.map +1 -1
  148. package/dist/src/selfimprove.js +66 -0
  149. package/dist/src/selfimprove.js.map +1 -0
  150. package/dist/src/session-command-supervisor.js +38 -9
  151. package/dist/src/session-command-supervisor.js.map +1 -1
  152. package/dist/src/setup/adapters.js +5 -223
  153. package/dist/src/setup/adapters.js.map +1 -1
  154. package/dist/src/setup/caserunner.js +15 -249
  155. package/dist/src/setup/caserunner.js.map +1 -1
  156. package/dist/src/setup/engine.js +32 -341
  157. package/dist/src/setup/engine.js.map +1 -1
  158. package/dist/src/setup/facts.js +3 -592
  159. package/dist/src/setup/facts.js.map +1 -1
  160. package/dist/src/setup/findings.js +3 -947
  161. package/dist/src/setup/findings.js.map +1 -1
  162. package/dist/src/setup/presentation.js +3 -8
  163. package/dist/src/setup/presentation.js.map +1 -1
  164. package/dist/src/setup/scan.js +3 -724
  165. package/dist/src/setup/scan.js.map +1 -1
  166. package/dist/src/setup/scanbuild.js +9 -92
  167. package/dist/src/setup/scanbuild.js.map +1 -1
  168. package/dist/src/setup/scanlease.js +3 -250
  169. package/dist/src/setup/scanlease.js.map +1 -1
  170. package/dist/src/setup/scanreport.js +3 -288
  171. package/dist/src/setup/scanreport.js.map +1 -1
  172. package/dist/src/setup/scanrun.js +3 -1732
  173. package/dist/src/setup/scanrun.js.map +1 -1
  174. package/dist/src/setup/scantree.js +3 -256
  175. package/dist/src/setup/scantree.js.map +1 -1
  176. package/dist/src/setup/stage2request.js +3 -258
  177. package/dist/src/setup/stage2request.js.map +1 -1
  178. package/dist/src/setup/unitcut.js +3 -436
  179. package/dist/src/setup/unitcut.js.map +1 -1
  180. package/dist/src/state.js +75 -9
  181. package/dist/src/state.js.map +1 -1
  182. package/dist/src/takeover.js +1 -0
  183. package/dist/src/takeover.js.map +1 -1
  184. package/dist/src/takeoverpi.js +2 -1
  185. package/dist/src/takeoverpi.js.map +1 -1
  186. package/dist/src/tui/alerts.js +4 -1
  187. package/dist/src/tui/alerts.js.map +1 -1
  188. package/dist/src/tui/board.js +2 -2
  189. package/dist/src/tui/board.js.map +1 -1
  190. package/dist/src/tui/companion.js +2 -1
  191. package/dist/src/tui/companion.js.map +1 -1
  192. package/dist/src/tui/deploytab.js +2 -2
  193. package/dist/src/tui/deploytab.js.map +1 -1
  194. package/dist/src/tui/index.js +9 -6
  195. package/dist/src/tui/index.js.map +1 -1
  196. package/dist/src/tui/memory.js +3 -16
  197. package/dist/src/tui/memory.js.map +1 -1
  198. package/dist/src/tui/memoryurl.js +22 -0
  199. package/dist/src/tui/memoryurl.js.map +1 -0
  200. package/dist/src/tui/remote.js +1 -1
  201. package/dist/src/tui/remote.js.map +1 -1
  202. package/dist/src/tui/route.js +2 -2
  203. package/dist/src/tui/route.js.map +1 -1
  204. package/dist/src/tui/setupstate.js +8 -5
  205. package/dist/src/tui/setupstate.js.map +1 -1
  206. package/dist/src/tui/sshtriage.js +1 -1
  207. package/dist/src/tui/sshtriage.js.map +1 -1
  208. package/dist/src/verdicts.js +12 -0
  209. package/dist/src/verdicts.js.map +1 -1
  210. package/dist/src/wire.js +9 -4
  211. package/dist/src/wire.js.map +1 -1
  212. package/dist/src/workerbreaker.js +32 -5
  213. package/dist/src/workerbreaker.js.map +1 -1
  214. package/dist/src/workerworld.js +4 -0
  215. package/dist/src/workerworld.js.map +1 -1
  216. package/docker/README.md +1 -1
  217. package/docker/entrypoint.sh +40 -6
  218. package/docker-compose.yml +16 -1
  219. package/extensions/cli/home.ts +14 -0
  220. package/extensions/cli/selfimprove.ts +18 -0
  221. package/extensions/home.ts +484 -0
  222. package/extensions/login-route.ts +1 -1
  223. package/extensions/onboarding.ts +8 -7
  224. package/extensions/selfimprove.ts +65 -0
  225. package/extensions/setup-scan.ts +79 -766
  226. package/extensions/setup.ts +14 -70
  227. package/extensions/vendor/openviking-pi/NOTICE +5 -0
  228. package/extensions/vendor/openviking-pi/README.md +39 -5
  229. package/extensions/vendor/openviking-pi/index.ts +4 -0
  230. package/extensions/vendor/openviking-pi/patches/0014-one-turn-sync-in-flight.patch +239 -0
  231. package/extensions/vendor/openviking-pi/qcr-hooks.ts +3 -1
  232. package/extensions/vendor/openviking-pi/sync.ts +80 -0
  233. package/extensions/vendor/openviking-pi/upstream.json +2 -1
  234. package/package.json +6 -4
  235. package/prompts/onboarding.md +8 -7
  236. package/schemas/review-result.v1.json +60 -0
  237. package/scripts/deploy.sh +8 -6
  238. package/scripts/qcr-host.sh +28 -5
  239. package/scripts/vm-ghcr-login.sh +7 -4
  240. package/src/archive/restore.ts +18 -21
  241. package/src/botworker.ts +13 -2
  242. package/src/channelfs.ts +3 -26
  243. package/src/cli.ts +13 -54
  244. package/src/config.ts +38 -0
  245. package/src/daemon.ts +34 -4
  246. package/src/debuground.ts +3 -0
  247. package/src/debugroundpi.ts +1 -0
  248. package/src/engine/caserunner-sdk.ts +29 -314
  249. package/src/home/adapters.ts +418 -0
  250. package/src/home/advanced.ts +421 -0
  251. package/src/home/advancedtools.ts +96 -0
  252. package/src/home/autoreview.ts +385 -0
  253. package/src/home/daemonstatus.ts +55 -0
  254. package/src/home/devicelogin.ts +107 -0
  255. package/src/home/launch.ts +257 -0
  256. package/src/home/loginowner.ts +248 -0
  257. package/src/home/memory.ts +176 -0
  258. package/src/home/model.ts +965 -0
  259. package/src/home/panel.ts +666 -0
  260. package/src/home/ports.ts +338 -0
  261. package/src/home/review.ts +206 -0
  262. package/src/home/reviews.ts +565 -0
  263. package/src/home/setup.ts +689 -0
  264. package/src/home/setupadapters.ts +217 -0
  265. package/src/home/setupcard.ts +288 -0
  266. package/src/home/setuptools.ts +57 -0
  267. package/src/home/spend.ts +194 -0
  268. package/src/home/switches.ts +293 -0
  269. package/src/home/switchon.ts +554 -0
  270. package/src/home/toolnames.ts +46 -0
  271. package/src/home/tune.ts +405 -0
  272. package/src/home/words.ts +8 -0
  273. package/src/homes.ts +17 -0
  274. package/src/install.ts +1 -1
  275. package/src/ipc/workerspec.ts +15 -0
  276. package/src/ledgercheck.ts +45 -9
  277. package/src/live/publish.ts +4 -1
  278. package/src/livecli.ts +6 -1
  279. package/src/loginrefresh/handover.ts +138 -0
  280. package/src/loginrefresh/lock.ts +72 -3
  281. package/src/loginrefresh/refresher.ts +34 -5
  282. package/src/loginrefresh/supervisor.ts +25 -2
  283. package/src/npmverbs.ts +51 -11
  284. package/src/onboard/choices.ts +6 -3
  285. package/src/onboard/engine.ts +64 -434
  286. package/src/onboard/steps/bringup.ts +3 -2
  287. package/src/onboard/steps/configfill.ts +23 -7
  288. package/src/onboard/steps/loginshare.ts +258 -0
  289. package/src/onboard/steps/memory.ts +18 -2
  290. package/src/onboard/steps/repoconfig.ts +85 -0
  291. package/src/onboard/toolnames.ts +2 -2
  292. package/src/piagentdir.ts +12 -0
  293. package/src/pilogin.ts +32 -16
  294. package/src/qcrbin.ts +16 -11
  295. package/src/reviewargs.ts +119 -0
  296. package/src/reviewcli.ts +6 -167
  297. package/src/reviewdetach.ts +107 -13
  298. package/src/scancli.ts +75 -826
  299. package/src/selfimprove.ts +90 -0
  300. package/src/session-command-supervisor.ts +41 -8
  301. package/src/setup/adapters.ts +13 -221
  302. package/src/setup/caserunner.ts +34 -273
  303. package/src/setup/engine.ts +62 -496
  304. package/src/setup/facts.ts +3 -627
  305. package/src/setup/findings.ts +3 -1264
  306. package/src/setup/presentation.ts +3 -18
  307. package/src/setup/scan.ts +3 -1033
  308. package/src/setup/scanbuild.ts +20 -114
  309. package/src/setup/scanlease.ts +3 -297
  310. package/src/setup/scanreport.ts +3 -373
  311. package/src/setup/scanrun.ts +3 -2268
  312. package/src/setup/scantree.ts +3 -259
  313. package/src/setup/stage2request.ts +3 -347
  314. package/src/setup/unitcut.ts +3 -523
  315. package/src/state.ts +126 -11
  316. package/src/takeover.ts +5 -0
  317. package/src/takeoverpi.ts +3 -2
  318. package/src/tui/alerts.ts +9 -2
  319. package/src/tui/board.ts +2 -2
  320. package/src/tui/companion.ts +2 -1
  321. package/src/tui/deploytab.ts +2 -2
  322. package/src/tui/index.ts +9 -6
  323. package/src/tui/memory.ts +3 -15
  324. package/src/tui/memoryurl.ts +22 -0
  325. package/src/tui/remote.ts +1 -1
  326. package/src/tui/route.ts +2 -2
  327. package/src/tui/setupstate.ts +20 -16
  328. package/src/tui/sshtriage.ts +1 -1
  329. package/src/verdicts.ts +13 -0
  330. package/src/wire.ts +9 -4
  331. package/src/workerbreaker.ts +41 -5
  332. package/src/workerworld.ts +9 -1
  333. package/dist/src/live/projection.js +0 -450
  334. package/dist/src/live/projection.js.map +0 -1
  335. package/dist/src/live/read.js +0 -60
  336. package/dist/src/live/read.js.map +0 -1
  337. package/dist/src/onboard/launch.js +0 -75
  338. package/dist/src/onboard/launch.js.map +0 -1
  339. package/dist/src/setup/ledger.js +0 -207
  340. package/dist/src/setup/ledger.js.map +0 -1
  341. package/dist/src/setup/stage2.js +0 -617
  342. package/dist/src/setup/stage2.js.map +0 -1
  343. package/dist/src/setup/textsniff.js +0 -89
  344. package/dist/src/setup/textsniff.js.map +0 -1
  345. package/src/live/projection.ts +0 -491
  346. package/src/live/read.ts +0 -86
  347. package/src/onboard/launch.ts +0 -103
  348. package/src/setup/ledger.ts +0 -324
  349. package/src/setup/stage2.ts +0 -926
  350. package/src/setup/textsniff.ts +0 -95
@@ -0,0 +1,202 @@
1
+ // A bare `qcr`: the home. The app's pinned pi (src/picli.ts), with the plugin
2
+ // and the home's extension loaded, on the person's own pi home.
3
+ //
4
+ // pi home the person's own: $PI_CODING_AGENT_DIR as the person set it,
5
+ // else ~/.pi/agent. The launch never sets it, so the chat, the
6
+ // panel's login line (which reads the same dir) and every review
7
+ // use one login.
8
+ // quiet no logo, resource list, trust prompt, changelog or model
9
+ // warning, and nothing written to the person's global pi
10
+ // settings: the quiet start is project settings in the home's
11
+ // own working directory (in the app's state home), the per-run
12
+ // trust flag `--approve`, and an explicit `--model`. The
13
+ // project settings also carry the pinned pi's version as the
14
+ // last changelog seen, or pi would record it in the global
15
+ // settings on a first run.
16
+ // resume the sessions live in the state home (`--session-dir`), and
17
+ // `--continue` opens the most recent one there, or a new one.
18
+ // tools `[home] tools = "reviewer"` (the default) names the allowed
19
+ // tools (src/home/toolnames.ts) and starts no MCP server;
20
+ // "full" leaves pi's own defaults.
21
+ // GitHub the person's own `gh`. In the image (scripts/qcr-host.sh's
22
+ // home mode) there is no gh config: the wrapper hands the token
23
+ // over as a file (packages/pi-plugin/src/ghcred.ts), src/cli.ts
24
+ // takes it at startup, and the home passes it to pi as GH_TOKEN,
25
+ // in its environment only.
26
+ //
27
+ // `-ne` keeps the person's own extensions out: a plugin they installed in pi
28
+ // themselves would otherwise register its commands twice.
29
+ //
30
+ // Everything effectful is injected; `homeRunDeps()` is the real assembly.
31
+ import { spawnSync } from "node:child_process";
32
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
33
+ import { dirname, join } from "node:path";
34
+ import { parse } from "smol-toml";
35
+ import { HOME_DEFAULTS, parseHomeSection } from "../config.js";
36
+ import { pluginPackageDir } from "../coreext.js";
37
+ import { locateConfig, stateHome } from "../homes.js";
38
+ import { piCliPath, piPackageDir } from "../picli.js";
39
+ import { HOME_MODEL_ENV, HOME_TOOLS_ENV } from "./adapters.js";
40
+ import { reviewerToolAllowlist } from "./toolnames.js";
41
+ /** The home's places in the state home. */
42
+ export function homePaths(state) {
43
+ const cwd = join(state, "home");
44
+ return {
45
+ cwd,
46
+ settings: join(cwd, ".pi", "settings.json"),
47
+ sessions: join(cwd, "sessions"),
48
+ };
49
+ }
50
+ /** The env shim pi loads for the home, in the app at `appRoot`. */
51
+ export function homeExtensionPath(appRoot) {
52
+ return join(appRoot, "extensions", "cli", "home.ts");
53
+ }
54
+ /** The home's project settings, over whatever the file already holds. */
55
+ export function homeProjectSettings(existing, piVersion) {
56
+ const base = typeof existing === "object" && existing !== null && !Array.isArray(existing)
57
+ ? existing
58
+ : {};
59
+ return {
60
+ ...base,
61
+ quietStartup: true,
62
+ ...(piVersion === null ? {} : { lastChangelogVersion: piVersion }),
63
+ };
64
+ }
65
+ /** What a bare `qcr` runs. */
66
+ export function homeLaunch(o) {
67
+ const p = homePaths(o.stateHome);
68
+ const tools = o.home.tools === "reviewer" ? ["--tools", reviewerToolAllowlist().join(","), "--no-mcp"] : [];
69
+ return {
70
+ args: [
71
+ o.piCli,
72
+ "--approve",
73
+ "--no-extensions",
74
+ "-e",
75
+ o.pluginDir,
76
+ "-e",
77
+ homeExtensionPath(o.appRoot),
78
+ "--model",
79
+ o.home.model,
80
+ ...tools,
81
+ "--session-dir",
82
+ p.sessions,
83
+ "--continue",
84
+ ],
85
+ cwd: p.cwd,
86
+ // PI_CODING_AGENT_DIR passes through as the person set it, or stays unset
87
+ env: {
88
+ ...o.env,
89
+ PI_SKIP_VERSION_CHECK: "1",
90
+ [HOME_MODEL_ENV]: o.home.model,
91
+ [HOME_TOOLS_ENV]: o.home.tools,
92
+ ...(o.githubToken ? { GH_TOKEN: o.githubToken } : {}),
93
+ },
94
+ };
95
+ }
96
+ /** A bare `qcr`: open the home. pi's exit code. */
97
+ export function runHome(deps) {
98
+ let piCli;
99
+ let pluginDir;
100
+ try {
101
+ piCli = deps.piCli();
102
+ pluginDir = deps.pluginDir();
103
+ }
104
+ catch (err) {
105
+ deps.err(`qcr: ${err instanceof Error ? err.message : String(err)}`);
106
+ return 1;
107
+ }
108
+ const { home, problem } = deps.homeConfig();
109
+ if (problem)
110
+ deps.err(`qcr: ${problem}; the home opens on its defaults.`);
111
+ const p = homePaths(deps.stateHome);
112
+ try {
113
+ deps.mkdir(p.sessions);
114
+ deps.mkdir(dirname(p.settings));
115
+ let existing = undefined;
116
+ let before = null;
117
+ try {
118
+ before = deps.readFile(p.settings);
119
+ existing = JSON.parse(before);
120
+ }
121
+ catch {
122
+ // no settings yet, or not ours to read: written fresh below
123
+ }
124
+ const text = `${JSON.stringify(homeProjectSettings(existing, deps.piVersion()), null, 2)}\n`;
125
+ if (text !== before)
126
+ deps.writeFile(p.settings, text);
127
+ }
128
+ catch (err) {
129
+ deps.err(`qcr: can't prepare the home in ${p.cwd}: ${err instanceof Error ? err.message : String(err)}`);
130
+ return 1;
131
+ }
132
+ const launch = homeLaunch({
133
+ piCli,
134
+ pluginDir,
135
+ appRoot: deps.appRoot,
136
+ stateHome: deps.stateHome,
137
+ home,
138
+ env: deps.env,
139
+ githubToken: deps.githubToken(),
140
+ });
141
+ const r = deps.run(deps.execPath, launch.args, { cwd: launch.cwd, env: launch.env });
142
+ if (r.error) {
143
+ deps.err(`qcr: pi could not start: ${r.error.message}`);
144
+ return 1;
145
+ }
146
+ return r.status ?? 1;
147
+ }
148
+ /** The config's `[home]`, read on its own: the home opens even when the rest
149
+ * of the config would not load. */
150
+ export function readHomeConfig(env, read = (p) => readFileSync(p, "utf8")) {
151
+ const path = locateConfig({ env }).path;
152
+ let raw;
153
+ try {
154
+ raw = read(path);
155
+ }
156
+ catch (err) {
157
+ if (err?.code === "ENOENT")
158
+ return { home: { ...HOME_DEFAULTS } };
159
+ return { home: { ...HOME_DEFAULTS }, problem: `can't read ${path}` };
160
+ }
161
+ try {
162
+ return { home: parseHomeSection(parse(raw)["home"]) };
163
+ }
164
+ catch (err) {
165
+ return {
166
+ home: { ...HOME_DEFAULTS },
167
+ problem: `${path}: ${err instanceof Error ? err.message : String(err)}`,
168
+ };
169
+ }
170
+ }
171
+ export function homeRunDeps(appRoot, env = process.env) {
172
+ return {
173
+ env,
174
+ appRoot,
175
+ stateHome: stateHome(env),
176
+ piCli: () => piCliPath(),
177
+ pluginDir: () => pluginPackageDir(),
178
+ piVersion: () => {
179
+ try {
180
+ const pkg = JSON.parse(readFileSync(join(piPackageDir(), "package.json"), "utf8"));
181
+ return typeof pkg.version === "string" ? pkg.version : null;
182
+ }
183
+ catch {
184
+ return null;
185
+ }
186
+ },
187
+ // the person's own gh; the image's `qcr home` (src/cli.ts) passes the
188
+ // token the wrapper handed over
189
+ githubToken: () => null,
190
+ homeConfig: () => readHomeConfig(env),
191
+ readFile: (p) => readFileSync(p, "utf8"),
192
+ writeFile: (p, t) => writeFileSync(p, t),
193
+ mkdir: (p) => mkdirSync(p, { recursive: true }),
194
+ run: (cmd, args, opts) => {
195
+ const r = spawnSync(cmd, [...args], { stdio: "inherit", cwd: opts.cwd, env: opts.env });
196
+ return { status: r.status, ...(r.error ? { error: r.error } : {}) };
197
+ },
198
+ execPath: process.execPath,
199
+ err: (l) => console.error(l),
200
+ };
201
+ }
202
+ //# sourceMappingURL=launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/home/launch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,205 @@
1
+ // One login per box, as the home sees it: who refreshes
2
+ // the OpenAI login the home signed in to, whether it still works, and the
3
+ // re-login that replaces it safely.
4
+ //
5
+ // owner the daemon's refresher holds the login while auto-review runs
6
+ // on this machine (its single-instance lock, beside auth.json in
7
+ // the home's own pi agent dir, which the stack mounts:
8
+ // src/onboard/steps/loginshare.ts). Otherwise the home's pi refreshes it
9
+ // itself, by pi's own rule: a token inside pi's 5-minute window,
10
+ // under pi's own lock. While the refresher runs no token gets
11
+ // near that window, so the home's pi never refreshes: it borrows.
12
+ // expired the refresher's record says its refresh fails and the token is
13
+ // past its expiry (or the grant was refused); or the chat itself
14
+ // was refused for the login (extensions/home.ts reads pi's error);
15
+ // or auto-review is paused on it. The login line then says "login
16
+ // expired", with one key that signs in again.
17
+ // re-login pi's own device login (src/home/devicelogin.ts), with the
18
+ // entrypoint's handover around it (src/loginrefresh/handover.ts):
19
+ // a running refresher is paused first, and keeps its lock, so its
20
+ // refresh can never land on top of the new login; the pause is
21
+ // lifted after, and the refresher re-reads the new login at once,
22
+ // so auto-review resumes on it.
23
+ //
24
+ // Nothing here reads or prints a token: the refresher's status file carries
25
+ // expiry times and redacted errors only.
26
+ import { readFileSync } from "node:fs";
27
+ import { join } from "node:path";
28
+ import { PI_AUTH_ERROR_RE } from "@quickchatai/pi-quickreview/src/authwatch.js";
29
+ import { holdRefresher, refresherRuns } from "../loginrefresh/handover.js";
30
+ import { STATUS_FILE } from "../loginrefresh/refresher.js";
31
+ import { providerLabel } from "./model.js";
32
+ import { known, unknown, } from "./ports.js";
33
+ import { DEVICE_LOGIN_PROVIDERS, loginFailureText, } from "./setup.js";
34
+ /** What the login line says of a login that no longer works. */
35
+ export const LOGIN_EXPIRED = "login expired";
36
+ /** The key that signs in again, while typing (the panel's is `l`). */
37
+ export const RELOGIN_KEY = "alt+l";
38
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
39
+ const message = (err) => (err instanceof Error ? err.message : String(err));
40
+ /** A refresh refused for good: the grant is gone, not a network blip. */
41
+ const REFUSED = /invalid_grant|revoked|refresh_token_(?:reused|expired|invalidated)/i;
42
+ /** Why the refresher's record (its loginrefresh.status.json) says the login
43
+ * no longer works, or null. Pure. */
44
+ export function expiredWhy(record, now) {
45
+ if (!isObj(record))
46
+ return null;
47
+ const err = record["last_error"];
48
+ if (typeof err !== "string" || err === "")
49
+ return null;
50
+ if (REFUSED.test(err))
51
+ return LOGIN_EXPIRED;
52
+ const expires = typeof record["expires_at"] === "string" ? Date.parse(record["expires_at"]) : NaN;
53
+ return Number.isFinite(expires) && expires <= now ? LOGIN_EXPIRED : null;
54
+ }
55
+ /** An error pi showed in the chat that is the login's (pi-ai's refresh
56
+ * failure, or the provider refusing the token). */
57
+ export function isLoginError(text) {
58
+ return PI_AUTH_ERROR_RE.test(text) || /OAuth refresh failed/i.test(text);
59
+ }
60
+ /** The login in the home's own pi agent dir, beside the refresher that may
61
+ * hold it. */
62
+ export function hostLoginOwner(o) {
63
+ const read = o.read ?? ((p) => readFileSync(p, "utf8"));
64
+ const probe = {
65
+ ...(o.flockBin ? { flockBin: o.flockBin } : {}),
66
+ ...(o.daemonRuns ? { refresherRuns: o.daemonRuns } : {}),
67
+ };
68
+ return {
69
+ health: async () => {
70
+ const runs = await refresherRuns(o.loginDir, probe);
71
+ if (runs === null)
72
+ return unknown("can't tell whether auto-review's login refresher runs");
73
+ if (!runs)
74
+ return known({ refresher: "home" });
75
+ let record;
76
+ try {
77
+ record = JSON.parse(read(join(o.loginDir, STATUS_FILE)));
78
+ }
79
+ catch {
80
+ // it has not written one yet: nothing says the login fails
81
+ return known({ refresher: "auto-review" });
82
+ }
83
+ const why = expiredWhy(record, o.now());
84
+ const checked = isObj(record) && typeof record["checked_at"] === "string"
85
+ ? Date.parse(record["checked_at"])
86
+ : NaN;
87
+ return known({
88
+ refresher: "auto-review",
89
+ ...(why ? { expired: why } : {}),
90
+ ...(Number.isFinite(checked) ? { checkedAt: checked } : {}),
91
+ });
92
+ },
93
+ hold: () => holdRefresher(o.loginDir, { ...probe, ...(o.waitMs ? { waitMs: o.waitMs } : {}) }),
94
+ };
95
+ }
96
+ /** "login expired" → one key, or `home_relogin`: sign in again. */
97
+ export class Relogin {
98
+ o;
99
+ signing = null;
100
+ closed = false;
101
+ constructor(o) {
102
+ this.o = o;
103
+ }
104
+ /** A re-login in flight: its code once pi has one. */
105
+ running() {
106
+ return this.signing === null ? null : this.signing.code ? { code: this.signing.code } : {};
107
+ }
108
+ changed() {
109
+ this.o.onChange?.();
110
+ }
111
+ /** Sign in again. The answer comes once the code is shown (or the login
112
+ * ended): the sign-in goes on in the background. */
113
+ async start() {
114
+ const m = this.o.model;
115
+ const s = this.signing;
116
+ if (s !== null)
117
+ return s.code
118
+ ? `Still waiting: open ${s.code.verificationUri} and enter ${s.code.userCode}.`
119
+ : "The sign-in is starting: the code shows in a moment.";
120
+ if (this.closed)
121
+ return "the home has closed";
122
+ const provider = m.chatProvider();
123
+ const label = providerLabel(provider);
124
+ const port = DEVICE_LOGIN_PROVIDERS.has(provider) ? this.o.deviceLogin() : undefined;
125
+ if (port === undefined) {
126
+ const why = `sign in to ${label} again with pi's own /login (switch auto-review off first, so its refresher does not write over the new login)`;
127
+ m.say(`${why[0].toUpperCase()}${why.slice(1)}.`, "warn");
128
+ return why;
129
+ }
130
+ const signing = { ac: new AbortController() };
131
+ this.signing = signing;
132
+ this.changed();
133
+ // the refresher first, when one runs: it keeps its lock and stops writing
134
+ let hold;
135
+ try {
136
+ hold = this.o.owner
137
+ ? await this.o.owner.hold()
138
+ : { ok: true, held: false, release: () => { } };
139
+ }
140
+ catch (err) {
141
+ hold = { ok: false, why: message(err) };
142
+ }
143
+ if (!hold.ok) {
144
+ this.signing = null;
145
+ m.say(`Couldn't sign in again: ${hold.why}. Nothing changed.`, "warn");
146
+ this.changed();
147
+ return `the sign-in did not start: ${hold.why}`;
148
+ }
149
+ const release = hold.release;
150
+ const held = hold.held;
151
+ if (signing.ac.signal.aborted) {
152
+ release();
153
+ this.signing = null;
154
+ return "the home has closed";
155
+ }
156
+ m.say(`Signing in to ${label} again with pi's device code.`);
157
+ let answer;
158
+ const answered = new Promise((r) => (answer = r));
159
+ signing.onCode = (c) => {
160
+ m.say(`Open ${c.verificationUri} and enter the code ${c.userCode}.`);
161
+ answer(`Open ${c.verificationUri} and enter the code ${c.userCode}. The home finishes the sign-in once you approve it.`);
162
+ };
163
+ void (async () => {
164
+ let outcome;
165
+ try {
166
+ outcome = await port.login({
167
+ provider,
168
+ signal: signing.ac.signal,
169
+ onCode: (code) => {
170
+ signing.code = code;
171
+ signing.onCode?.(code);
172
+ this.changed();
173
+ },
174
+ });
175
+ }
176
+ catch (err) {
177
+ outcome = { ok: false, kind: "failed", why: message(err) };
178
+ }
179
+ finally {
180
+ // the pause is lifted whatever happened: the refresher re-reads the file
181
+ release();
182
+ this.signing = null;
183
+ }
184
+ if (outcome.ok) {
185
+ m.signedInAgain();
186
+ await m.refresh();
187
+ m.say(`Signed in to ${label} again.${held ? " Auto-review's refresher has the new login, and auto-review resumes." : ""}`, "ok");
188
+ answer(`signed in to ${label} again`);
189
+ }
190
+ else {
191
+ if (outcome.kind !== "cancelled")
192
+ m.say(loginFailureText(outcome, RELOGIN_KEY), "warn");
193
+ answer(`the sign-in did not finish: ${outcome.why}`);
194
+ }
195
+ this.changed();
196
+ })();
197
+ return answered;
198
+ }
199
+ /** The session ends: a re-login in flight stops, and its pause is lifted. */
200
+ close() {
201
+ this.closed = true;
202
+ this.signing?.ac.abort();
203
+ }
204
+ }
205
+ //# sourceMappingURL=loginowner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loginowner.js","sourceRoot":"","sources":["../../../src/home/loginowner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ import { OnboardingEngine } from "../onboard/engine.js";
2
+ import { BROUGHT_UP_CHOICE_KEY } from "../onboard/steps/bringup.js";
3
+ import { DAEMON_SERVICE, MEMORY_SERVICE, composeArgs, readEnvText, } from "../onboard/steps/compose.js";
4
+ import { readEnvKey } from "../onboard/steps/ingress.js";
5
+ import { MEMORY_CHOICE_KEY, MEMORY_STEP_ID, waitsOnServer } from "../onboard/steps/memory.js";
6
+ import { MEMORY_KEYS_STEP_ID } from "../onboard/steps/memorykeys.js";
7
+ import { serviceState } from "./autoreview.js";
8
+ import { known, } from "./ports.js";
9
+ import { MACHINE_CHECKS_STEP_ID, memoryPhaseB, runSteps, switchOnInput, switchOnRegistry, } from "./switchon.js";
10
+ /** compose's memory cap when the project `.env` names none
11
+ * (docker-compose.yml `mem_limit: ${QCR_MEMORY_LIMIT:-4g}`). */
12
+ export const DEFAULT_MEMORY_LIMIT = "4g";
13
+ /** "4g" → "up to 4 GB of RAM"; a value compose would not read is said as is. */
14
+ export function ramCostOf(limit) {
15
+ const m = /^\s*(\d+(?:\.\d+)?)\s*([kmgt])?b?\s*$/i.exec(limit);
16
+ if (!m)
17
+ return `up to ${limit.trim()} of RAM`;
18
+ const unit = { k: "KB", m: "MB", g: "GB", t: "TB" }[(m[2] ?? "").toLowerCase()] ?? "bytes";
19
+ return `up to ${m[1]} ${unit} of RAM`;
20
+ }
21
+ /** The memory engine's state from its container's. */
22
+ export function memoryStateOf(c) {
23
+ if (c.kind === "unknown")
24
+ return c;
25
+ return known(c.value === "running" ? "on" : c.value === "restarting" ? "starting" : "off");
26
+ }
27
+ const firstLine = (s) => s.trim().split("\n")[0]?.trim() || "no output";
28
+ /** The memory step's answer when the person turns memory on. */
29
+ const MEMORY_YES = switchOnInput(MEMORY_STEP_ID, {
30
+ answers: { memory: true, confirmed: false },
31
+ repo: null,
32
+ });
33
+ /**
34
+ * Memory on, on a stack brought up before. Set up when it never was (or was
35
+ * declined): phase A places the root key, and when the engine does not run
36
+ * yet that is all it can do, so the engine is started (it reads the key at
37
+ * boot) and phase B runs once it answers (memoryPhaseB). Otherwise the engine
38
+ * is started as it is. Then its user keys, when that step is not done.
39
+ */
40
+ export async function memoryOnStack(e, o) {
41
+ const configured = e.list().find((s) => s.id === MEMORY_STEP_ID);
42
+ let waits = false;
43
+ if (configured?.status !== "done" || e.choices()[MEMORY_CHOICE_KEY] === "declined") {
44
+ o.progress?.("Setting memory up…");
45
+ const r = await e.runStep(MEMORY_STEP_ID, MEMORY_YES);
46
+ if (!r.ok && !waitsOnServer(r.checks))
47
+ return { ok: false, detail: r.failures.join("; ") };
48
+ waits = !r.ok;
49
+ }
50
+ if (waits) {
51
+ const b = await memoryPhaseB({ ...o, checklist: e }, MEMORY_YES);
52
+ if (!b.ok)
53
+ return { ok: false, detail: b.detail };
54
+ }
55
+ else {
56
+ const up = await o.startMemory();
57
+ if (!up.ok)
58
+ return up;
59
+ }
60
+ const keys = e.list().find((s) => s.id === MEMORY_KEYS_STEP_ID);
61
+ if (keys && keys.status !== "done" && keys.status !== "disabled") {
62
+ const r = await e.runStep(MEMORY_KEYS_STEP_ID);
63
+ if (!r.ok)
64
+ return { ok: false, detail: `the engine runs, but ${r.failures.join("; ")}` };
65
+ }
66
+ return { ok: true, detail: "Memory is on." };
67
+ }
68
+ export function composeMemory(o) {
69
+ const compose = async (args, what) => {
70
+ const r = await o.runner.run("docker", composeArgs(o.root, args));
71
+ return r.code === 0
72
+ ? { ok: true, detail: what }
73
+ : {
74
+ ok: false,
75
+ detail: `docker compose ${args.join(" ")} exited ${r.code}: ${firstLine(r.stderr || r.stdout)}`,
76
+ };
77
+ };
78
+ const engine = (log) => new OnboardingEngine(switchOnRegistry(o), o.stepAdapters(log));
79
+ const startMemory = () => compose(["up", "-d", MEMORY_SERVICE], "the memory engine runs");
80
+ return {
81
+ status: async () => memoryStateOf(await serviceState(o.runner, o.root, MEMORY_SERVICE)),
82
+ control: {
83
+ ramCost: () => ramCostOf((readEnvKey(readEnvText(o.root), "QCR_MEMORY_LIMIT") ?? "").trim() ||
84
+ DEFAULT_MEMORY_LIMIT),
85
+ switchOn: async (progress) => {
86
+ const e = engine((l) => progress?.(l));
87
+ if (typeof e.choices()[BROUGHT_UP_CHOICE_KEY] !== "string") {
88
+ // No stack yet: switch-on's steps bring it up with memory, and the
89
+ // daemon is put back as it was (off), so auto-review stays off.
90
+ const daemonWas = await serviceState(o.runner, o.root, DAEMON_SERVICE);
91
+ const checks = await e.runStep(MACHINE_CHECKS_STEP_ID);
92
+ if (!checks.ok)
93
+ return { ok: false, detail: checks.failures.join("; ") };
94
+ const steps = [];
95
+ const walked = await runSteps({
96
+ checklist: e,
97
+ memory: true,
98
+ repo: await o.repo(),
99
+ startMemory,
100
+ ...(o.sleep ? { sleep: o.sleep } : {}),
101
+ ...(progress ? { progress } : {}),
102
+ }, steps);
103
+ if (!walked.ok)
104
+ return { ok: false, detail: walked.detail };
105
+ if (daemonWas.kind === "known" && daemonWas.value !== "running") {
106
+ const stopped = await compose(["stop", DAEMON_SERVICE], "");
107
+ if (!stopped.ok)
108
+ return { ok: false, detail: `memory is on, but ${stopped.detail}` };
109
+ }
110
+ return { ok: true, detail: "Memory is on." };
111
+ }
112
+ return memoryOnStack(e, {
113
+ startMemory,
114
+ ...(o.sleep ? { sleep: o.sleep } : {}),
115
+ ...(progress ? { progress } : {}),
116
+ });
117
+ },
118
+ switchOff: () => compose(["stop", MEMORY_SERVICE], "Memory is off. What it learned is kept."),
119
+ },
120
+ };
121
+ }
122
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/home/memory.ts"],"names":[],"mappings":"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"}