@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,507 @@
1
+ // The home's setup checklist: what a fresh machine walks through before the
2
+ // home opens on its pull requests. It is the plugin's step registry
3
+ // (@quickchatai/pi-quickreview/src/setupchecklist.ts) with the app's steps
4
+ // registered onto it, as ADR 0001 names the seam:
5
+ //
6
+ // pi_version, git the plugin's own first-run checks: the card shows one
7
+ // only while it fails
8
+ // login pi's own device-code login for the provider the chat
9
+ // runs on (openai-codex): it starts by itself, the card
10
+ // shows the URL and the code, and it retries cleanly
11
+ // github `gh` installed and signed in; one key checks again
12
+ // repo the repository: one of the person's recently pushed
13
+ // ones, or any owner/name or GitHub URL, written to the
14
+ // app config's `[github] repo` with the silent defaults
15
+ // (timezone, base branch, the owner's name and login)
16
+ //
17
+ // Each step's detect runs first, over what the home has just read (the
18
+ // HomeModel's slots), and a step already true is done with what was found.
19
+ // A step whose source cannot be read is Unknown: it stays pending, and is
20
+ // never a gap that holds the card up (invariant 9). The card shows while a
21
+ // step that a read showed to be missing is left; when the last one is done
22
+ // the panel turns into the home.
23
+ //
24
+ // Every step is one method here, called by a key (alt+n, ⏎ on the focused
25
+ // card) and by a `home_*` tool alike (src/home/setuptools.ts). The checklist
26
+ // lives in memory: every launch detects afresh.
27
+ import { PLUGIN_SETUP_STEPS, pluginSetupSteps, } from "@quickchatai/pi-quickreview/src/plugin/setup.js";
28
+ import { SetupChecklist, StepRegistry, } from "@quickchatai/pi-quickreview/src/setupchecklist.js";
29
+ import { providerLabel } from "./model.js";
30
+ /** The app's step ids, in their order on the card. */
31
+ export const HOME_STEPS = { login: "login", github: "github", repo: "repo" };
32
+ const HOME_STEP_ORDER = [
33
+ HOME_STEPS.login,
34
+ HOME_STEPS.github,
35
+ HOME_STEPS.repo,
36
+ ];
37
+ /** The plugin's steps the home runs as its first-run checks: pi and git
38
+ * (gh is the github step's). The plugin's login, GitHub credential and repo
39
+ * profile steps are the home's own steps' business, or Setup's. */
40
+ export const FIRST_RUN_CHECKS = [PLUGIN_SETUP_STEPS.pi, PLUGIN_SETUP_STEPS.git];
41
+ export const PASTE_REPO = "Paste any repository…";
42
+ /** The providers whose login the card runs as pi's device-code flow. Any
43
+ * other provider the chat runs on signs in with pi's own /login. */
44
+ export const DEVICE_LOGIN_PROVIDERS = new Set(["openai-codex"]);
45
+ /** owner/name from what a person pastes: owner/name, a github.com URL (a PR
46
+ * or file URL too), or a git remote. Null when it is none of those. */
47
+ export function parseRepoInput(text) {
48
+ let s = text.trim();
49
+ let wasUrl = false;
50
+ const strip = (re) => {
51
+ if (re.test(s)) {
52
+ s = s.replace(re, "");
53
+ wasUrl = true;
54
+ }
55
+ };
56
+ strip(/^git@github\.com:/i);
57
+ strip(/^(?:(?:https?|ssh|git):\/\/)?(?:[^@/]+@)?(?:www\.)?github\.com\//i);
58
+ s = s.replace(/[?#].*$/, "").replace(/\/+$/, "");
59
+ const parts = s.split("/");
60
+ if (parts.length < 2 || (parts.length > 2 && !wasUrl))
61
+ return null;
62
+ const owner = parts[0];
63
+ const name = parts[1].replace(/\.git$/i, "");
64
+ if (!/^[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?$/.test(owner))
65
+ return null;
66
+ if (!/^[A-Za-z0-9._-]+$/.test(name) || name === "." || name === "..")
67
+ return null;
68
+ return `${owner}/${name}`;
69
+ }
70
+ const asDetection = (f) => ("unknown" in f ? { missing: f.unknown } : f);
71
+ const report = (name, f) => "found" in f
72
+ ? { ok: true, checks: [{ name, ok: true, detail: f.found }] }
73
+ : {
74
+ ok: false,
75
+ checks: [{ name, ok: false, detail: "unknown" in f ? f.unknown : f.missing }],
76
+ };
77
+ const refused = (name, detail) => ({
78
+ ok: false,
79
+ checks: [{ name, ok: false, detail }],
80
+ });
81
+ const message = (err) => (err instanceof Error ? err.message : String(err));
82
+ export class HomeSetup {
83
+ o;
84
+ checklist;
85
+ checkIds;
86
+ /** Steps whose last detect could not read its source, and why. */
87
+ unknownWhy = new Map();
88
+ signing = null;
89
+ failure = null;
90
+ stepping = 0;
91
+ recentRepos = null;
92
+ synced = false;
93
+ autoStarted = false;
94
+ lastPhase = "home";
95
+ closed = false;
96
+ constructor(o) {
97
+ this.o = o;
98
+ const checks = o.ports.firstRun
99
+ ? pluginSetupSteps({ host: o.ports.firstRun.host, range: o.ports.firstRun.range }).filter((s) => FIRST_RUN_CHECKS.includes(s.id))
100
+ : [];
101
+ this.checkIds = checks.map((s) => s.id);
102
+ const registry = new StepRegistry(checks).register(...this.homeSteps());
103
+ this.checklist = new SetupChecklist(registry, { clock: () => new Date() }, { file: null });
104
+ }
105
+ get m() {
106
+ return this.o.model;
107
+ }
108
+ changed() {
109
+ this.o.onChange?.();
110
+ }
111
+ // ---- what each step reads ---------------------------------------------
112
+ loginTitle() {
113
+ return `Sign in to ${providerLabel(this.m.chatProvider())}`;
114
+ }
115
+ loginFacts() {
116
+ const label = providerLabel(this.m.chatProvider());
117
+ const signed = this.m.signedIn();
118
+ if (signed === true)
119
+ return { found: `${label === "OpenAI" ? "ChatGPT" : label} · signed in with pi` };
120
+ if (signed === false)
121
+ return { missing: `pi has no ${label} login yet` };
122
+ const l = this.m.state.login;
123
+ return { unknown: l.kind === "unknown" ? `can't read pi's login: ${l.why}` : "still reading" };
124
+ }
125
+ which(cmd) {
126
+ return this.o.ports.firstRun?.host.runner.which(cmd);
127
+ }
128
+ githubFacts() {
129
+ if (this.which("gh") === null)
130
+ return { missing: "gh is not installed: get it from https://cli.github.com" };
131
+ const g = this.m.state.github;
132
+ if (g.kind === "known")
133
+ return g.value === null
134
+ ? { missing: "gh is signed out: run `gh auth login` in a shell" }
135
+ : { found: `@${g.value} · via gh` };
136
+ return { unknown: g.kind === "unknown" ? `can't tell: ${g.why}` : "still reading" };
137
+ }
138
+ repoFacts() {
139
+ const r = this.m.state.repo;
140
+ if (r.kind === "known")
141
+ return r.value === null
142
+ ? { missing: "no repository is chosen yet" }
143
+ : { found: `${r.value} · from your qcr config` };
144
+ return {
145
+ unknown: r.kind === "unknown" ? `can't read your qcr config: ${r.why}` : "still reading",
146
+ };
147
+ }
148
+ facts(id) {
149
+ return id === "login"
150
+ ? this.loginFacts()
151
+ : id === "github"
152
+ ? this.githubFacts()
153
+ : this.repoFacts();
154
+ }
155
+ /** detect: the facts, noting an Unknown so it never counts as a gap. */
156
+ detected(id) {
157
+ const f = this.facts(id);
158
+ if ("unknown" in f)
159
+ this.unknownWhy.set(id, f.unknown);
160
+ else
161
+ this.unknownWhy.delete(id);
162
+ return asDetection(f);
163
+ }
164
+ homeSteps() {
165
+ const step = (id, title, order, explain, run) => ({
166
+ id,
167
+ title,
168
+ order,
169
+ explain,
170
+ detect: async () => this.detected(id),
171
+ run,
172
+ verify: async () => report(title, this.facts(id)),
173
+ });
174
+ return [
175
+ step(HOME_STEPS.login, "Sign in", 10, "pi's own device-code login, for the provider the chat runs on.", () => this.runLogin()),
176
+ step(HOME_STEPS.github, "Connect GitHub", 11, "gh installed and signed in: the home reads the pull requests through it.", () => this.runGithub()),
177
+ step(HOME_STEPS.repo, "Choose a repository", 12, "The repository the home reviews, written to your qcr config's [github] repo.", (ctx) => this.runRepo(ctx.input["repo"])),
178
+ ];
179
+ }
180
+ // ---- the steps' runs --------------------------------------------------
181
+ async runLogin() {
182
+ const provider = this.m.chatProvider();
183
+ if (!DEVICE_LOGIN_PROVIDERS.has(provider)) {
184
+ this.failure = {
185
+ kind: "unavailable",
186
+ why: `sign in to ${providerLabel(provider)} with pi's own /login`,
187
+ };
188
+ return refused("login", this.failure.why);
189
+ }
190
+ const port = this.o.deviceLogin();
191
+ const s = this.signing;
192
+ if (port === undefined || s === null) {
193
+ this.failure = {
194
+ kind: "unavailable",
195
+ why: "this home cannot run pi's device login: type /login to sign in with pi's own menu",
196
+ };
197
+ return refused("login", this.failure.why);
198
+ }
199
+ const r = await port.login({
200
+ provider,
201
+ signal: s.ac.signal,
202
+ onCode: (code) => {
203
+ s.code = code;
204
+ s.onCode?.(code);
205
+ this.changed();
206
+ },
207
+ });
208
+ if (r.ok)
209
+ return { ok: true, checks: [{ name: "login", ok: true, detail: "signed in with pi" }] };
210
+ this.failure = { kind: r.kind, why: r.why };
211
+ return refused("login", r.why);
212
+ }
213
+ async runGithub() {
214
+ if (this.which("gh") === null)
215
+ return refused("github", "gh is not installed: get it from https://cli.github.com");
216
+ let u;
217
+ try {
218
+ u = await this.o.github.user();
219
+ }
220
+ catch (err) {
221
+ u = { kind: "unknown", why: message(err) };
222
+ }
223
+ if (u.kind === "unknown")
224
+ return refused("github", `can't tell: ${u.why}`);
225
+ return u.value === null
226
+ ? refused("github", "gh is still signed out: run `gh auth login` in a shell")
227
+ : { ok: true, checks: [{ name: "github", ok: true, detail: `@${u.value} · via gh` }] };
228
+ }
229
+ async runRepo(raw) {
230
+ const repos = this.o.ports.repos;
231
+ if (repos === undefined)
232
+ return refused("repo", "this home cannot write your qcr config: set [github] repo in it");
233
+ if (typeof raw !== "string" || raw.trim() === "")
234
+ return refused("repo", "which repository? Give owner/name or a GitHub URL");
235
+ const repo = parseRepoInput(raw);
236
+ if (repo === null)
237
+ return refused("repo", `${JSON.stringify(raw.trim())} is not a repository: give owner/name or a GitHub URL`);
238
+ const seen = await repos.describe(repo);
239
+ if (!seen.ok)
240
+ return refused("repo", `GitHub can't show ${repo}: ${seen.why}`);
241
+ const profile = await repos.profile();
242
+ const wrote = await repos.write({
243
+ repo: seen.repo,
244
+ baseBranch: seen.defaultBranch,
245
+ timezone: this.o.ports.timezone?.() ?? null,
246
+ ownerLogin: profile.kind === "known" ? profile.value.login : null,
247
+ ownerName: profile.kind === "known" ? profile.value.name : null,
248
+ });
249
+ if (!wrote.ok)
250
+ return refused("repo", `couldn't write your qcr config: ${wrote.why}`);
251
+ return {
252
+ ok: true,
253
+ checks: [{ name: "repo", ok: true, detail: `${seen.repo}, written to ${wrote.path}` }],
254
+ };
255
+ }
256
+ // ---- what the home asks of it -----------------------------------------
257
+ /** Detect again over what the home has just read: a done step is
258
+ * re-verified, a pending one detected. The HomeModel calls it after every
259
+ * read, before its first notice. */
260
+ async sync() {
261
+ await this.checklist.reconcile();
262
+ await this.checklist.detect();
263
+ // the session ended while the reads were out: their answer lands into nothing
264
+ if (this.closed)
265
+ return;
266
+ this.synced = true;
267
+ if (this.isPending(HOME_STEPS.repo))
268
+ void this.recent();
269
+ const phase = this.phase();
270
+ if (phase !== this.lastPhase) {
271
+ this.lastPhase = phase;
272
+ this.o.onPhase?.(phase);
273
+ }
274
+ this.maybeStartLogin();
275
+ this.changed();
276
+ }
277
+ isPending(id) {
278
+ return this.checklist.list().find((l) => l.id === id)?.status === "pending";
279
+ }
280
+ /** The steps a read showed to be missing, in order: the setup checklist's
281
+ * gaps. An Unknown is none. Empty before the first read. */
282
+ gaps() {
283
+ if (!this.synced)
284
+ return [];
285
+ return this.checklist
286
+ .list()
287
+ .filter((l) => l.status === "pending" && !l.optional && !this.unknownWhy.has(l.id))
288
+ .map((l) => l.id);
289
+ }
290
+ /** The card while a gap is left, then the home. */
291
+ phase() {
292
+ return this.gaps().length > 0 ? "setup" : "home";
293
+ }
294
+ /** A step is running: the card's spinner turns. */
295
+ busy() {
296
+ return this.signing !== null || this.stepping > 0;
297
+ }
298
+ /** The first pending step: what alt+n runs. */
299
+ nextId() {
300
+ return this.checklist.list().find((l) => l.status === "pending")?.id;
301
+ }
302
+ /** Read everything again after a step changed it. A read already in
303
+ * flight may have started before the change, so it is joined and then read
304
+ * once more. */
305
+ async reread() {
306
+ if (this.closed)
307
+ return;
308
+ if (this.m.busy())
309
+ await this.m.refresh();
310
+ await this.m.refresh();
311
+ }
312
+ /** The login starts by itself when it is the first thing missing. */
313
+ maybeStartLogin() {
314
+ if (this.autoStarted || this.closed || !(this.o.interactive?.() ?? false))
315
+ return;
316
+ const gaps = this.gaps();
317
+ if (gaps[0] !== HOME_STEPS.login || !DEVICE_LOGIN_PROVIDERS.has(this.m.chatProvider()))
318
+ return;
319
+ this.autoStarted = true;
320
+ void this.signIn();
321
+ }
322
+ async step(id, input) {
323
+ this.stepping++;
324
+ this.changed();
325
+ try {
326
+ return await this.checklist.runStep(id, input);
327
+ }
328
+ finally {
329
+ this.stepping--;
330
+ this.changed();
331
+ }
332
+ }
333
+ /** Run the next step (alt+n, ⏎ on the card, `home_setup_next`). */
334
+ async next(ui) {
335
+ const id = this.nextId();
336
+ if (id === undefined)
337
+ return "setup is done: every step is";
338
+ if (id === HOME_STEPS.login)
339
+ return this.signIn();
340
+ if (id === HOME_STEPS.github)
341
+ return this.checkGithub();
342
+ if (id === HOME_STEPS.repo)
343
+ return this.chooseRepo(undefined, ui);
344
+ // a first-run check: look again
345
+ const r = await this.step(id);
346
+ if (r.ok)
347
+ await this.reread();
348
+ const title = this.checklist.list().find((l) => l.id === id)?.title ?? id;
349
+ return r.ok ? `${title}: ok` : `${title}: ${r.failures.join("; ")}`;
350
+ }
351
+ /** pi's device login. The answer comes once the code is shown (or the
352
+ * login ended): the sign-in itself goes on in the background. */
353
+ async signIn() {
354
+ const s = this.signing;
355
+ if (s !== null)
356
+ return s.code
357
+ ? `Still waiting: open ${s.code.verificationUri} and enter ${s.code.userCode}.`
358
+ : "The sign-in is starting: the code shows in a moment.";
359
+ if (!this.isPending(HOME_STEPS.login)) {
360
+ const f = this.loginFacts();
361
+ return `already signed in: ${"found" in f ? f.found : "done"}`;
362
+ }
363
+ const signing = { ac: new AbortController() };
364
+ this.signing = signing;
365
+ this.failure = null;
366
+ this.m.say(`Signing in to ${providerLabel(this.m.chatProvider())} with pi's device code.`);
367
+ let answer;
368
+ const answered = new Promise((r) => (answer = r));
369
+ signing.onCode = (c) => answer(`Open ${c.verificationUri} and enter the code ${c.userCode}. The home finishes the sign-in once you approve it.`);
370
+ void this.checklist.runStep(HOME_STEPS.login).then(async (r) => {
371
+ this.signing = null;
372
+ const label = providerLabel(this.m.chatProvider());
373
+ if (r.ok) {
374
+ await this.reread();
375
+ this.m.say(`Signed in to ${label} with pi.`, "ok");
376
+ answer(`signed in to ${label}`);
377
+ }
378
+ else {
379
+ const f = this.failure;
380
+ if (f?.kind !== "cancelled")
381
+ this.m.say(loginFailureText(f, "alt+n"), "warn");
382
+ answer(`the sign-in did not finish: ${r.failures.join("; ")}`);
383
+ }
384
+ this.changed();
385
+ });
386
+ return answered;
387
+ }
388
+ /** gh: check again (one key). */
389
+ async checkGithub() {
390
+ const r = await this.step(HOME_STEPS.github);
391
+ await this.reread();
392
+ if (r.ok) {
393
+ this.m.say(`Connected to GitHub as ${r.checks[0]?.detail ?? "you"}.`, "ok");
394
+ return `GitHub: ${r.checks[0]?.detail ?? "signed in"}`;
395
+ }
396
+ const why = r.failures.join("; ");
397
+ this.m.say(`${why.replace(/^github: /, "")}, then press alt+n to check again.`, "warn");
398
+ return why;
399
+ }
400
+ /** The person's recently pushed repositories, read once. */
401
+ recent() {
402
+ const repos = this.o.ports.repos;
403
+ if (repos === undefined)
404
+ return Promise.resolve({ kind: "unknown", why: "this home cannot list them" });
405
+ this.recentRepos ??= repos.recent().catch((err) => ({
406
+ kind: "unknown",
407
+ why: message(err),
408
+ }));
409
+ return this.recentRepos;
410
+ }
411
+ /** Choose the repository: `repo` as given (owner/name or a URL), or, with
412
+ * pi's dialogs, picked from the recent ones or pasted. */
413
+ async chooseRepo(repo, ui) {
414
+ let text = repo;
415
+ if (text === undefined || text.trim() === "") {
416
+ const recent = await this.recent();
417
+ const names = recent.kind === "known" ? [...recent.value] : [];
418
+ if (ui === undefined)
419
+ return recent.kind === "known"
420
+ ? `Which repository? Give owner/name or a GitHub URL as \`repo\`.${names.length ? ` Recently pushed: ${names.join(", ")}.` : ""}`
421
+ : `Which repository? Give owner/name or a GitHub URL as \`repo\`. The recent ones are unknown: ${recent.why}.`;
422
+ const pick = await ui.select(names.length ? "Choose a repository: your recently pushed ones" : "Choose a repository", [...names, PASTE_REPO]);
423
+ if (pick === undefined)
424
+ return "no repository was chosen";
425
+ text =
426
+ pick === PASTE_REPO ? await ui.input("Repository", "owner/name or a GitHub URL") : pick;
427
+ if (text === undefined || text.trim() === "")
428
+ return "no repository was chosen";
429
+ }
430
+ const r = await this.step(HOME_STEPS.repo, { repo: text });
431
+ if (!r.ok) {
432
+ const why = r.failures.join("; ").replace(/^repo: /, "");
433
+ this.m.say(`${why[0]?.toUpperCase() ?? ""}${why.slice(1)}.`, "warn");
434
+ return why;
435
+ }
436
+ await this.reread();
437
+ const name = this.m.repo() ?? "the repository";
438
+ const open = this.m.ordered().length;
439
+ if (this.phase() === "home")
440
+ this.m.say(`You're set. ${open} open pull request${open === 1 ? "" : "s"} in ${name}.`, "ok");
441
+ return r.checks[0]?.detail ?? `repository set to ${name}`;
442
+ }
443
+ /** The session ends: a login in flight stops with it. */
444
+ close() {
445
+ this.closed = true;
446
+ this.signing?.ac.abort();
447
+ }
448
+ /** What the card draws. */
449
+ view() {
450
+ const lines = this.checklist.list();
451
+ const next = this.nextId();
452
+ const running = (id) => id === HOME_STEPS.login && this.signing !== null;
453
+ const checks = lines
454
+ .filter((l) => this.checkIds.includes(l.id) && l.status === "pending")
455
+ .map((l) => ({ id: l.id, title: l.title, why: l.note ?? l.explain, next: l.id === next }));
456
+ const steps = HOME_STEP_ORDER.map((id) => {
457
+ const l = lines.find((x) => x.id === id);
458
+ const title = id === HOME_STEPS.login ? this.loginTitle() : (l?.title ?? id);
459
+ if (l?.status === "done") {
460
+ const f = this.facts(id);
461
+ return { id, title, state: "done", found: "found" in f ? f.found : "done", next: false };
462
+ }
463
+ const unknown = this.unknownWhy.get(id);
464
+ const f = this.facts(id);
465
+ return {
466
+ id,
467
+ title,
468
+ state: running(id) ? "running" : "pending",
469
+ ...(unknown !== undefined ? { unknown } : "missing" in f ? { missing: f.missing } : {}),
470
+ next: id === next && !running(id),
471
+ };
472
+ });
473
+ return {
474
+ checks,
475
+ steps,
476
+ login: {
477
+ running: this.signing !== null,
478
+ ...(this.signing?.code ? { code: this.signing.code } : {}),
479
+ ...(this.failure ? { failure: this.failure } : {}),
480
+ },
481
+ provider: providerLabel(this.m.chatProvider()),
482
+ done: steps.filter((s) => s.state === "done").length,
483
+ total: steps.length,
484
+ };
485
+ }
486
+ }
487
+ /** What a person reads after a device login that did not finish, with the
488
+ * key that tries again. */
489
+ export function loginFailureText(f, key) {
490
+ switch (f?.kind) {
491
+ case "expired":
492
+ return `The code expired before it was approved. ${key} gets a new one.`;
493
+ case "denied":
494
+ return `The sign-in was denied. ${key} tries again.`;
495
+ case "not_enabled":
496
+ return `Device-code login is off for this ChatGPT account: turn it on in ChatGPT → Settings → Security, then ${key} tries again.`;
497
+ case "cancelled":
498
+ return `The sign-in stopped. ${key} starts it again.`;
499
+ case "unavailable":
500
+ return `${f.why}.`;
501
+ case "failed":
502
+ return `The sign-in failed: ${f.why}. ${key} tries again.`;
503
+ default:
504
+ return `The sign-in did not finish. ${key} tries again.`;
505
+ }
506
+ }
507
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/home/setup.ts"],"names":[],"mappings":"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"}