@quickchatai/quickreview 1.1.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/README.md +137 -57
  2. package/bin/qcr.js +1 -1
  3. package/config.example.toml +60 -14
  4. package/deploy/ansible/README.md +20 -12
  5. package/deploy/ansible/inventory.example.ini +1 -1
  6. package/deploy/collect-secrets.sh +1 -1
  7. package/deploy/qcr-update.sh +1 -1
  8. package/dist/extensions/cli/home.js +14 -0
  9. package/dist/extensions/cli/home.js.map +1 -0
  10. package/dist/extensions/cli/login-route.js +5 -0
  11. package/dist/extensions/cli/login-route.js.map +1 -0
  12. package/dist/extensions/cli/selfimprove.js +18 -0
  13. package/dist/extensions/cli/selfimprove.js.map +1 -0
  14. package/dist/extensions/home.js +350 -0
  15. package/dist/extensions/home.js.map +1 -0
  16. package/dist/extensions/login-route.js +180 -0
  17. package/dist/extensions/login-route.js.map +1 -0
  18. package/dist/extensions/onboarding.js +35 -11
  19. package/dist/extensions/onboarding.js.map +1 -1
  20. package/dist/extensions/selfimprove.js +49 -0
  21. package/dist/extensions/selfimprove.js.map +1 -0
  22. package/dist/extensions/setup-scan.js +23 -592
  23. package/dist/extensions/setup-scan.js.map +1 -1
  24. package/dist/extensions/setup.js +2 -47
  25. package/dist/extensions/setup.js.map +1 -1
  26. package/dist/src/archive/restore.js +18 -15
  27. package/dist/src/archive/restore.js.map +1 -1
  28. package/dist/src/botworker.js +13 -2
  29. package/dist/src/botworker.js.map +1 -1
  30. package/dist/src/channelfs.js +3 -26
  31. package/dist/src/channelfs.js.map +1 -1
  32. package/dist/src/ciretry.js +2 -1
  33. package/dist/src/ciretry.js.map +1 -1
  34. package/dist/src/cli.js +54 -61
  35. package/dist/src/cli.js.map +1 -1
  36. package/dist/src/cliops.js +3 -2
  37. package/dist/src/cliops.js.map +1 -1
  38. package/dist/src/commands.js +25 -2
  39. package/dist/src/commands.js.map +1 -1
  40. package/dist/src/config.js +32 -2
  41. package/dist/src/config.js.map +1 -1
  42. package/dist/src/daemon.js +50 -8
  43. package/dist/src/daemon.js.map +1 -1
  44. package/dist/src/debuground.js +1 -0
  45. package/dist/src/debuground.js.map +1 -1
  46. package/dist/src/debugroundpi.js +6 -1
  47. package/dist/src/debugroundpi.js.map +1 -1
  48. package/dist/src/dispatch.js +5 -4
  49. package/dist/src/dispatch.js.map +1 -1
  50. package/dist/src/engine/caserunner-sdk.js +15 -251
  51. package/dist/src/engine/caserunner-sdk.js.map +1 -1
  52. package/dist/src/engine/debugpi.js +17 -5
  53. package/dist/src/engine/debugpi.js.map +1 -1
  54. package/dist/src/execboundary.js +10 -3
  55. package/dist/src/execboundary.js.map +1 -1
  56. package/dist/src/github.js +51 -16
  57. package/dist/src/github.js.map +1 -1
  58. package/dist/src/githubtoken.js +346 -0
  59. package/dist/src/githubtoken.js.map +1 -0
  60. package/dist/src/home/adapters.js +349 -0
  61. package/dist/src/home/adapters.js.map +1 -0
  62. package/dist/src/home/advanced.js +318 -0
  63. package/dist/src/home/advanced.js.map +1 -0
  64. package/dist/src/home/advancedtools.js +57 -0
  65. package/dist/src/home/advancedtools.js.map +1 -0
  66. package/dist/src/home/autoreview.js +325 -0
  67. package/dist/src/home/autoreview.js.map +1 -0
  68. package/dist/src/home/daemonstatus.js +32 -0
  69. package/dist/src/home/daemonstatus.js.map +1 -0
  70. package/dist/src/home/devicelogin.js +61 -0
  71. package/dist/src/home/devicelogin.js.map +1 -0
  72. package/dist/src/home/launch.js +202 -0
  73. package/dist/src/home/launch.js.map +1 -0
  74. package/dist/src/home/loginowner.js +205 -0
  75. package/dist/src/home/loginowner.js.map +1 -0
  76. package/dist/src/home/memory.js +122 -0
  77. package/dist/src/home/memory.js.map +1 -0
  78. package/dist/src/home/model.js +811 -0
  79. package/dist/src/home/model.js.map +1 -0
  80. package/dist/src/home/panel.js +520 -0
  81. package/dist/src/home/panel.js.map +1 -0
  82. package/dist/src/home/ports.js +19 -0
  83. package/dist/src/home/ports.js.map +1 -0
  84. package/dist/src/home/review.js +163 -0
  85. package/dist/src/home/review.js.map +1 -0
  86. package/dist/src/home/reviews.js +478 -0
  87. package/dist/src/home/reviews.js.map +1 -0
  88. package/dist/src/home/setup.js +507 -0
  89. package/dist/src/home/setup.js.map +1 -0
  90. package/dist/src/home/setupadapters.js +214 -0
  91. package/dist/src/home/setupadapters.js.map +1 -0
  92. package/dist/src/home/setupcard.js +199 -0
  93. package/dist/src/home/setupcard.js.map +1 -0
  94. package/dist/src/home/setuptools.js +45 -0
  95. package/dist/src/home/setuptools.js.map +1 -0
  96. package/dist/src/home/spend.js +160 -0
  97. package/dist/src/home/spend.js.map +1 -0
  98. package/dist/src/home/switches.js +209 -0
  99. package/dist/src/home/switches.js.map +1 -0
  100. package/dist/src/home/switchon.js +439 -0
  101. package/dist/src/home/switchon.js.map +1 -0
  102. package/dist/src/home/toolnames.js +41 -0
  103. package/dist/src/home/toolnames.js.map +1 -0
  104. package/dist/src/home/tune.js +341 -0
  105. package/dist/src/home/tune.js.map +1 -0
  106. package/dist/src/home/words.js +7 -0
  107. package/dist/src/home/words.js.map +1 -0
  108. package/dist/src/homes.js +14 -0
  109. package/dist/src/homes.js.map +1 -1
  110. package/dist/src/install.js +1 -1
  111. package/dist/src/install.js.map +1 -1
  112. package/dist/src/ipc/workerspec.js +8 -0
  113. package/dist/src/ipc/workerspec.js.map +1 -1
  114. package/dist/src/live/publish.js +1 -1
  115. package/dist/src/live/publish.js.map +1 -1
  116. package/dist/src/livecli.js +1 -1
  117. package/dist/src/livecli.js.map +1 -1
  118. package/dist/src/loginhint.js +8 -3
  119. package/dist/src/loginhint.js.map +1 -1
  120. package/dist/src/loginrefresh/handover.js +121 -0
  121. package/dist/src/loginrefresh/handover.js.map +1 -0
  122. package/dist/src/loginrefresh/lock.js +54 -3
  123. package/dist/src/loginrefresh/lock.js.map +1 -1
  124. package/dist/src/loginrefresh/pirefresh.js +3 -0
  125. package/dist/src/loginrefresh/pirefresh.js.map +1 -1
  126. package/dist/src/loginrefresh/refresher.js +33 -5
  127. package/dist/src/loginrefresh/refresher.js.map +1 -1
  128. package/dist/src/loginrefresh/supervisor.js +18 -1
  129. package/dist/src/loginrefresh/supervisor.js.map +1 -1
  130. package/dist/src/npmverbs.js +46 -14
  131. package/dist/src/npmverbs.js.map +1 -1
  132. package/dist/src/onboard/choices.js +35 -4
  133. package/dist/src/onboard/choices.js.map +1 -1
  134. package/dist/src/onboard/engine.js +32 -306
  135. package/dist/src/onboard/engine.js.map +1 -1
  136. package/dist/src/onboard/pipin.js +22 -0
  137. package/dist/src/onboard/pipin.js.map +1 -0
  138. package/dist/src/onboard/stepforward.js +41 -0
  139. package/dist/src/onboard/stepforward.js.map +1 -0
  140. package/dist/src/onboard/steps/appslug.js +4 -1
  141. package/dist/src/onboard/steps/appslug.js.map +1 -1
  142. package/dist/src/onboard/steps/bringup.js +3 -2
  143. package/dist/src/onboard/steps/bringup.js.map +1 -1
  144. package/dist/src/onboard/steps/compose.js +29 -0
  145. package/dist/src/onboard/steps/compose.js.map +1 -1
  146. package/dist/src/onboard/steps/configfill.js +120 -39
  147. package/dist/src/onboard/steps/configfill.js.map +1 -1
  148. package/dist/src/onboard/steps/githubaccount.js +595 -0
  149. package/dist/src/onboard/steps/githubaccount.js.map +1 -0
  150. package/dist/src/onboard/steps/githubapp.js +65 -7
  151. package/dist/src/onboard/steps/githubapp.js.map +1 -1
  152. package/dist/src/onboard/steps/golive.js +2 -0
  153. package/dist/src/onboard/steps/golive.js.map +1 -1
  154. package/dist/src/onboard/steps/index.js +11 -0
  155. package/dist/src/onboard/steps/index.js.map +1 -1
  156. package/dist/src/onboard/steps/ingress.js +80 -25
  157. package/dist/src/onboard/steps/ingress.js.map +1 -1
  158. package/dist/src/onboard/steps/llmauth.js +103 -30
  159. package/dist/src/onboard/steps/llmauth.js.map +1 -1
  160. package/dist/src/onboard/steps/loginshare.js +213 -0
  161. package/dist/src/onboard/steps/loginshare.js.map +1 -0
  162. package/dist/src/onboard/steps/memory.js +67 -3
  163. package/dist/src/onboard/steps/memory.js.map +1 -1
  164. package/dist/src/onboard/steps/proof.js +366 -56
  165. package/dist/src/onboard/steps/proof.js.map +1 -1
  166. package/dist/src/onboard/steps/repoconfig.js +72 -0
  167. package/dist/src/onboard/steps/repoconfig.js.map +1 -0
  168. package/dist/src/onboard/steps/topology.js +6 -6
  169. package/dist/src/onboard/steps/topology.js.map +1 -1
  170. package/dist/src/onboard/steps/transport.js +9 -1
  171. package/dist/src/onboard/steps/transport.js.map +1 -1
  172. package/dist/src/onboard/steps/tuiroute.js +102 -0
  173. package/dist/src/onboard/steps/tuiroute.js.map +1 -0
  174. package/dist/src/onboard/steps/verifyup.js +17 -1
  175. package/dist/src/onboard/steps/verifyup.js.map +1 -1
  176. package/dist/src/onboard/toolnames.js +30 -0
  177. package/dist/src/onboard/toolnames.js.map +1 -0
  178. package/dist/src/operatorwrite.js +23 -0
  179. package/dist/src/operatorwrite.js.map +1 -0
  180. package/dist/src/outcomes.js +4 -1
  181. package/dist/src/outcomes.js.map +1 -1
  182. package/dist/src/piagentdir.js +13 -0
  183. package/dist/src/piagentdir.js.map +1 -0
  184. package/dist/src/pilogin.js +31 -16
  185. package/dist/src/pilogin.js.map +1 -1
  186. package/dist/src/posting-journal.js +2 -1
  187. package/dist/src/posting-journal.js.map +1 -1
  188. package/dist/src/posting-outbox.js +6 -2
  189. package/dist/src/posting-outbox.js.map +1 -1
  190. package/dist/src/posting-receipt.js +14 -1
  191. package/dist/src/posting-receipt.js.map +1 -1
  192. package/dist/src/qcrbin.js +16 -11
  193. package/dist/src/qcrbin.js.map +1 -1
  194. package/dist/src/recheck.js +2 -1
  195. package/dist/src/recheck.js.map +1 -1
  196. package/dist/src/reconcile.js +22 -2
  197. package/dist/src/reconcile.js.map +1 -1
  198. package/dist/src/reviewargs.js +122 -0
  199. package/dist/src/reviewargs.js.map +1 -0
  200. package/dist/src/reviewcli.js +7 -161
  201. package/dist/src/reviewcli.js.map +1 -1
  202. package/dist/src/reviewdetach.js +76 -11
  203. package/dist/src/reviewdetach.js.map +1 -1
  204. package/dist/src/reviewhistory.js +32 -6
  205. package/dist/src/reviewhistory.js.map +1 -1
  206. package/dist/src/reviewnow.js +45 -0
  207. package/dist/src/reviewnow.js.map +1 -0
  208. package/dist/src/scancli.js +39 -691
  209. package/dist/src/scancli.js.map +1 -1
  210. package/dist/src/selfimprove.js +66 -0
  211. package/dist/src/selfimprove.js.map +1 -0
  212. package/dist/src/setup/adapters.js +5 -223
  213. package/dist/src/setup/adapters.js.map +1 -1
  214. package/dist/src/setup/caserunner.js +15 -249
  215. package/dist/src/setup/caserunner.js.map +1 -1
  216. package/dist/src/setup/engine.js +32 -341
  217. package/dist/src/setup/engine.js.map +1 -1
  218. package/dist/src/setup/facts.js +3 -592
  219. package/dist/src/setup/facts.js.map +1 -1
  220. package/dist/src/setup/findings.js +3 -947
  221. package/dist/src/setup/findings.js.map +1 -1
  222. package/dist/src/setup/presentation.js +3 -8
  223. package/dist/src/setup/presentation.js.map +1 -1
  224. package/dist/src/setup/scan.js +3 -724
  225. package/dist/src/setup/scan.js.map +1 -1
  226. package/dist/src/setup/scanbuild.js +9 -92
  227. package/dist/src/setup/scanbuild.js.map +1 -1
  228. package/dist/src/setup/scanlease.js +3 -250
  229. package/dist/src/setup/scanlease.js.map +1 -1
  230. package/dist/src/setup/scanreport.js +3 -288
  231. package/dist/src/setup/scanreport.js.map +1 -1
  232. package/dist/src/setup/scanrun.js +3 -1732
  233. package/dist/src/setup/scanrun.js.map +1 -1
  234. package/dist/src/setup/scantree.js +3 -256
  235. package/dist/src/setup/scantree.js.map +1 -1
  236. package/dist/src/setup/stage2request.js +3 -258
  237. package/dist/src/setup/stage2request.js.map +1 -1
  238. package/dist/src/setup/unitcut.js +3 -436
  239. package/dist/src/setup/unitcut.js.map +1 -1
  240. package/dist/src/state.js +2 -0
  241. package/dist/src/state.js.map +1 -1
  242. package/dist/src/statemachine.js +4 -1
  243. package/dist/src/statemachine.js.map +1 -1
  244. package/dist/src/takeover.js +1 -0
  245. package/dist/src/takeover.js.map +1 -1
  246. package/dist/src/takeoverpi.js +15 -1
  247. package/dist/src/takeoverpi.js.map +1 -1
  248. package/dist/src/tui/app.js +49 -0
  249. package/dist/src/tui/app.js.map +1 -1
  250. package/dist/src/tui/board.js +88 -12
  251. package/dist/src/tui/board.js.map +1 -1
  252. package/dist/src/tui/cmdbar.js +4 -1
  253. package/dist/src/tui/cmdbar.js.map +1 -1
  254. package/dist/src/tui/companion.js +76 -11
  255. package/dist/src/tui/companion.js.map +1 -1
  256. package/dist/src/tui/connect.js +7 -1
  257. package/dist/src/tui/connect.js.map +1 -1
  258. package/dist/src/tui/deploytab.js +2 -2
  259. package/dist/src/tui/deploytab.js.map +1 -1
  260. package/dist/src/tui/filters.js +5 -2
  261. package/dist/src/tui/filters.js.map +1 -1
  262. package/dist/src/tui/ghread.js +61 -5
  263. package/dist/src/tui/ghread.js.map +1 -1
  264. package/dist/src/tui/index.js +109 -20
  265. package/dist/src/tui/index.js.map +1 -1
  266. package/dist/src/tui/memforward.js +39 -2
  267. package/dist/src/tui/memforward.js.map +1 -1
  268. package/dist/src/tui/memory.js +3 -16
  269. package/dist/src/tui/memory.js.map +1 -1
  270. package/dist/src/tui/memoryurl.js +22 -0
  271. package/dist/src/tui/memoryurl.js.map +1 -0
  272. package/dist/src/tui/model.js +25 -0
  273. package/dist/src/tui/model.js.map +1 -1
  274. package/dist/src/tui/prpause.js +7 -0
  275. package/dist/src/tui/prpause.js.map +1 -1
  276. package/dist/src/tui/remote.js +7 -1
  277. package/dist/src/tui/remote.js.map +1 -1
  278. package/dist/src/tui/route.js +143 -0
  279. package/dist/src/tui/route.js.map +1 -0
  280. package/dist/src/tui/setupstate.js +32 -0
  281. package/dist/src/tui/setupstate.js.map +1 -0
  282. package/dist/src/tui/sshtriage.js +102 -5
  283. package/dist/src/tui/sshtriage.js.map +1 -1
  284. package/dist/src/tui/theme.js +2 -1
  285. package/dist/src/tui/theme.js.map +1 -1
  286. package/dist/src/tui/unwedge.js +2 -12
  287. package/dist/src/tui/unwedge.js.map +1 -1
  288. package/dist/src/verdicts.js +17 -5
  289. package/dist/src/verdicts.js.map +1 -1
  290. package/dist/src/version.js +1 -1
  291. package/dist/src/version.js.map +1 -1
  292. package/dist/src/webhook.js +12 -1
  293. package/dist/src/webhook.js.map +1 -1
  294. package/dist/src/wire.js +34 -8
  295. package/dist/src/wire.js.map +1 -1
  296. package/dist/src/workerworld.js +11 -1
  297. package/dist/src/workerworld.js.map +1 -1
  298. package/docker/README.md +1 -1
  299. package/docker/companion/entrypoint.sh +20 -1
  300. package/docker/entrypoint.sh +57 -6
  301. package/docker-compose.yml +16 -1
  302. package/extensions/cli/home.ts +14 -0
  303. package/extensions/cli/login-route.ts +10 -0
  304. package/extensions/cli/selfimprove.ts +18 -0
  305. package/extensions/home.ts +484 -0
  306. package/extensions/login-route.ts +220 -0
  307. package/extensions/onboarding.ts +41 -11
  308. package/extensions/selfimprove.ts +65 -0
  309. package/extensions/setup-scan.ts +79 -766
  310. package/extensions/setup.ts +14 -70
  311. package/package.json +6 -4
  312. package/prompts/onboarding.md +58 -18
  313. package/schemas/review-result.v1.json +60 -0
  314. package/scripts/deploy.sh +8 -6
  315. package/scripts/mint-token.sh +25 -4
  316. package/scripts/qcr-host.sh +28 -5
  317. package/scripts/vm-ghcr-login.sh +7 -4
  318. package/src/archive/restore.ts +18 -21
  319. package/src/botworker.ts +13 -2
  320. package/src/channelfs.ts +3 -26
  321. package/src/ciretry.ts +2 -1
  322. package/src/cli.ts +59 -67
  323. package/src/cliops.ts +3 -2
  324. package/src/commands.ts +28 -2
  325. package/src/config.ts +62 -4
  326. package/src/daemon.ts +58 -7
  327. package/src/debuground.ts +3 -0
  328. package/src/debugroundpi.ts +12 -1
  329. package/src/dispatch.ts +5 -4
  330. package/src/engine/caserunner-sdk.ts +29 -314
  331. package/src/engine/debugpi.ts +17 -5
  332. package/src/execboundary.ts +16 -4
  333. package/src/github.ts +57 -15
  334. package/src/githubtoken.ts +435 -0
  335. package/src/home/adapters.ts +418 -0
  336. package/src/home/advanced.ts +421 -0
  337. package/src/home/advancedtools.ts +96 -0
  338. package/src/home/autoreview.ts +385 -0
  339. package/src/home/daemonstatus.ts +55 -0
  340. package/src/home/devicelogin.ts +107 -0
  341. package/src/home/launch.ts +257 -0
  342. package/src/home/loginowner.ts +248 -0
  343. package/src/home/memory.ts +176 -0
  344. package/src/home/model.ts +965 -0
  345. package/src/home/panel.ts +666 -0
  346. package/src/home/ports.ts +338 -0
  347. package/src/home/review.ts +206 -0
  348. package/src/home/reviews.ts +565 -0
  349. package/src/home/setup.ts +689 -0
  350. package/src/home/setupadapters.ts +217 -0
  351. package/src/home/setupcard.ts +288 -0
  352. package/src/home/setuptools.ts +57 -0
  353. package/src/home/spend.ts +194 -0
  354. package/src/home/switches.ts +293 -0
  355. package/src/home/switchon.ts +554 -0
  356. package/src/home/toolnames.ts +46 -0
  357. package/src/home/tune.ts +405 -0
  358. package/src/home/words.ts +8 -0
  359. package/src/homes.ts +17 -0
  360. package/src/install.ts +1 -1
  361. package/src/ipc/workerspec.ts +15 -0
  362. package/src/live/publish.ts +4 -1
  363. package/src/livecli.ts +6 -1
  364. package/src/loginhint.ts +8 -3
  365. package/src/loginrefresh/handover.ts +138 -0
  366. package/src/loginrefresh/lock.ts +72 -3
  367. package/src/loginrefresh/pirefresh.ts +3 -0
  368. package/src/loginrefresh/refresher.ts +34 -5
  369. package/src/loginrefresh/supervisor.ts +25 -2
  370. package/src/npmverbs.ts +55 -13
  371. package/src/onboard/choices.ts +40 -4
  372. package/src/onboard/engine.ts +70 -421
  373. package/src/onboard/pipin.ts +31 -0
  374. package/src/onboard/stepforward.ts +61 -0
  375. package/src/onboard/steps/appslug.ts +4 -1
  376. package/src/onboard/steps/bringup.ts +3 -2
  377. package/src/onboard/steps/compose.ts +31 -0
  378. package/src/onboard/steps/configfill.ts +144 -40
  379. package/src/onboard/steps/githubaccount.ts +716 -0
  380. package/src/onboard/steps/githubapp.ts +92 -8
  381. package/src/onboard/steps/golive.ts +2 -0
  382. package/src/onboard/steps/index.ts +11 -0
  383. package/src/onboard/steps/ingress.ts +98 -31
  384. package/src/onboard/steps/llmauth.ts +114 -29
  385. package/src/onboard/steps/loginshare.ts +258 -0
  386. package/src/onboard/steps/memory.ts +76 -3
  387. package/src/onboard/steps/proof.ts +473 -55
  388. package/src/onboard/steps/repoconfig.ts +85 -0
  389. package/src/onboard/steps/topology.ts +7 -6
  390. package/src/onboard/steps/transport.ts +15 -0
  391. package/src/onboard/steps/tuiroute.ts +119 -0
  392. package/src/onboard/steps/verifyup.ts +20 -1
  393. package/src/onboard/toolnames.ts +34 -0
  394. package/src/operatorwrite.ts +25 -0
  395. package/src/outcomes.ts +8 -1
  396. package/src/piagentdir.ts +12 -0
  397. package/src/pilogin.ts +32 -16
  398. package/src/posting-journal.ts +6 -1
  399. package/src/posting-outbox.ts +10 -2
  400. package/src/posting-receipt.ts +17 -0
  401. package/src/qcrbin.ts +16 -11
  402. package/src/recheck.ts +2 -1
  403. package/src/reconcile.ts +29 -3
  404. package/src/reviewargs.ts +119 -0
  405. package/src/reviewcli.ts +6 -167
  406. package/src/reviewdetach.ts +107 -13
  407. package/src/reviewhistory.ts +20 -6
  408. package/src/reviewnow.ts +76 -0
  409. package/src/scancli.ts +75 -826
  410. package/src/selfimprove.ts +90 -0
  411. package/src/setup/adapters.ts +13 -221
  412. package/src/setup/caserunner.ts +34 -273
  413. package/src/setup/engine.ts +62 -496
  414. package/src/setup/facts.ts +3 -627
  415. package/src/setup/findings.ts +3 -1264
  416. package/src/setup/presentation.ts +3 -18
  417. package/src/setup/scan.ts +3 -1033
  418. package/src/setup/scanbuild.ts +20 -114
  419. package/src/setup/scanlease.ts +3 -297
  420. package/src/setup/scanreport.ts +3 -373
  421. package/src/setup/scanrun.ts +3 -2268
  422. package/src/setup/scantree.ts +3 -259
  423. package/src/setup/stage2request.ts +3 -347
  424. package/src/setup/unitcut.ts +3 -523
  425. package/src/state.ts +43 -0
  426. package/src/statemachine.ts +4 -1
  427. package/src/takeover.ts +5 -0
  428. package/src/takeoverpi.ts +16 -2
  429. package/src/tui/app.ts +47 -0
  430. package/src/tui/board.ts +111 -14
  431. package/src/tui/cmdbar.ts +4 -1
  432. package/src/tui/companion.ts +80 -11
  433. package/src/tui/connect.ts +7 -1
  434. package/src/tui/deploytab.ts +2 -2
  435. package/src/tui/filters.ts +7 -3
  436. package/src/tui/ghread.ts +74 -7
  437. package/src/tui/index.ts +117 -23
  438. package/src/tui/memforward.ts +52 -3
  439. package/src/tui/memory.ts +3 -15
  440. package/src/tui/memoryurl.ts +22 -0
  441. package/src/tui/model.ts +36 -2
  442. package/src/tui/prpause.ts +11 -2
  443. package/src/tui/remote.ts +9 -1
  444. package/src/tui/route.ts +173 -0
  445. package/src/tui/setupstate.ts +56 -0
  446. package/src/tui/sshtriage.ts +127 -6
  447. package/src/tui/theme.ts +2 -1
  448. package/src/tui/unwedge.ts +2 -14
  449. package/src/verdicts.ts +23 -5
  450. package/src/version.ts +1 -1
  451. package/src/webhook.ts +10 -1
  452. package/src/wire.ts +42 -9
  453. package/src/workerworld.ts +16 -2
  454. package/dist/src/live/projection.js +0 -450
  455. package/dist/src/live/projection.js.map +0 -1
  456. package/dist/src/live/read.js +0 -60
  457. package/dist/src/live/read.js.map +0 -1
  458. package/dist/src/onboard/launch.js +0 -83
  459. package/dist/src/onboard/launch.js.map +0 -1
  460. package/dist/src/setup/ledger.js +0 -207
  461. package/dist/src/setup/ledger.js.map +0 -1
  462. package/dist/src/setup/stage2.js +0 -617
  463. package/dist/src/setup/stage2.js.map +0 -1
  464. package/dist/src/setup/textsniff.js +0 -89
  465. package/dist/src/setup/textsniff.js.map +0 -1
  466. package/src/live/projection.ts +0 -491
  467. package/src/live/read.ts +0 -86
  468. package/src/onboard/launch.ts +0 -115
  469. package/src/setup/ledger.ts +0 -324
  470. package/src/setup/stage2.ts +0 -926
  471. package/src/setup/textsniff.ts +0 -95
@@ -0,0 +1,325 @@
1
+ // Auto-review in the home: its honest label, read from the daemon's
2
+ // container and its status snapshot, and the real switch over this machine's
3
+ // compose stack (src/home/switchon.ts runs the steps).
4
+ //
5
+ // The label:
6
+ //
7
+ // off the daemon's container is not running (switched off, or
8
+ // never brought up)
9
+ // starting it runs and its first poll has not ended yet, or the home
10
+ // is switching it on (the home holds that)
11
+ // on-live/-dry it runs, its heartbeat is within two poll intervals AND its
12
+ // last poll was clean; dry_run says which
13
+ // paused-login the login it reviews on expired (pi_auth_expired, or the
14
+ // login refresher's own record)
15
+ // broken it runs but is not working: the heartbeat or the poll is
16
+ // stale, the last poll failed, the container keeps
17
+ // restarting, or the pipeline or provider reports a cause
18
+ // unknown anything the home cannot read: Docker, the snapshot, or a
19
+ // snapshot from an older daemon with no `poll` record
20
+ // (invariant 9: never Off and never On)
21
+ import { readFileSync } from "node:fs";
22
+ import { parse } from "smol-toml";
23
+ import { snapshotHeartbeat } from "../state.js";
24
+ import { OnboardingEngine } from "../onboard/engine.js";
25
+ import { CONTAINER_STATE_DIR, DAEMON_SERVICE, MEMORY_SERVICE, composeArgs, composePs, daemonExec, serviceRow, } from "../onboard/steps/compose.js";
26
+ import { known, unknown, } from "./ports.js";
27
+ import { MACHINE_CHECKS_STEP_ID, recordedProof, runGoLive, runProofRound, runSwitchOn, switchOnRegistry, } from "./switchon.js";
28
+ /** "On" needs a heartbeat within this many poll intervals. */
29
+ export const HEARTBEAT_INTERVALS = 2;
30
+ /** A poll older than this many intervals is not working: the daemon abandons
31
+ * a pass after three (RECONCILE_OVERDUE_INTERVALS) and starts the next. */
32
+ export const POLL_STALE_INTERVALS = 4;
33
+ const minutes = (ms) => {
34
+ const m = Math.max(0, Math.round(ms / 60_000));
35
+ return m < 60 ? `${m}m` : `${Math.round(m / 60)}h`;
36
+ };
37
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
38
+ /** status.json's text as an object; a reason when it is not one. */
39
+ function parseSnapshot(text) {
40
+ try {
41
+ const v = JSON.parse(text);
42
+ return isObj(v) ? v : "its status.json is not an object";
43
+ }
44
+ catch {
45
+ return "its status.json is not readable JSON";
46
+ }
47
+ }
48
+ /** The refresher's record of the login, when the snapshot has one. */
49
+ function refresherLogin(s) {
50
+ const lr = s["login_refresh"];
51
+ const login = isObj(lr) ? lr["login"] : undefined;
52
+ return isObj(login) ? login : null;
53
+ }
54
+ /** A re-login ended the daemon's last auth failure: the refresher's record,
55
+ * read after that failure, of a login that works now. It outweighs the
56
+ * failure's flag, which would otherwise stand for its own half hour. */
57
+ function loginRecovered(s, now) {
58
+ const expired = s["pi_auth_expired"];
59
+ const login = refresherLogin(s);
60
+ return isObj(expired) && login !== null && worksSince(login, expired["last_at"], now);
61
+ }
62
+ /** Why the login it reviews on stops it, or null. A re-login ends the pause
63
+ * (loginRecovered). */
64
+ function loginPause(s, now) {
65
+ const login = refresherLogin(s);
66
+ if (isObj(s["pi_auth_expired"]) && !loginRecovered(s, now))
67
+ return "login expired";
68
+ if (login === null)
69
+ return null;
70
+ if (login["paused"] === true)
71
+ return "a login is in progress";
72
+ const expires = typeof login["expires_at"] === "string" ? Date.parse(login["expires_at"]) : NaN;
73
+ if (Number.isFinite(expires) && expires <= now && typeof login["last_error"] === "string")
74
+ return "login expired";
75
+ return null;
76
+ }
77
+ /** The refresher looked after `since` and found a login that works: not
78
+ * paused, no error, a token not yet expired. */
79
+ function worksSince(login, since, now) {
80
+ const at = typeof since === "string" ? Date.parse(since) : NaN;
81
+ const checked = typeof login["checked_at"] === "string" ? Date.parse(login["checked_at"]) : NaN;
82
+ const expires = typeof login["expires_at"] === "string" ? Date.parse(login["expires_at"]) : NaN;
83
+ return (Number.isFinite(at) &&
84
+ Number.isFinite(checked) &&
85
+ checked > at &&
86
+ login["paused"] !== true &&
87
+ login["last_error"] === null &&
88
+ Number.isFinite(expires) &&
89
+ expires > now);
90
+ }
91
+ /** The provider record the snapshot derives from that same auth failure
92
+ * (src/state.ts writes the two together, with one `last_at`). */
93
+ function authDerived(s, pv) {
94
+ const expired = s["pi_auth_expired"];
95
+ return (isObj(expired) && typeof pv["last_at"] === "string" && pv["last_at"] === expired["last_at"]);
96
+ }
97
+ /** The pipeline's or the provider's cause, or null. A provider failure that
98
+ * is only the recovered login's own flag is not a cause; any other is. */
99
+ function brokenCause(s, now) {
100
+ const p = s["pipeline"];
101
+ if (isObj(p) && p["healthy"] === false) {
102
+ const first = Array.isArray(p["causes"]) ? p["causes"][0] : undefined;
103
+ if (isObj(first)) {
104
+ const pr = typeof first["pr"] === "number" ? `#${first["pr"]}: ` : "";
105
+ const detail = typeof first["detail"] === "string" ? first["detail"] : "the pipeline is unhealthy";
106
+ return `${pr}${detail}`;
107
+ }
108
+ return "the review pipeline reports itself unhealthy";
109
+ }
110
+ const pv = s["provider"];
111
+ if (isObj(pv) && pv["healthy"] === false && !(authDerived(s, pv) && loginRecovered(s, now)))
112
+ return typeof pv["detail"] === "string" ? pv["detail"] : "the model provider is failing";
113
+ return null;
114
+ }
115
+ /** The label, from what was read. Pure. */
116
+ export function autoReviewLabel(r) {
117
+ if (r.container.kind === "unknown")
118
+ return unknown(`can't ask Docker whether the daemon runs: ${r.container.why}`);
119
+ if (r.container.value === "stopped")
120
+ return known({ state: "off" });
121
+ if (r.container.value === "restarting")
122
+ return known({
123
+ state: "broken",
124
+ cause: "the daemon keeps restarting (docker compose logs daemon says why)",
125
+ });
126
+ if (r.snapshot.kind === "unknown")
127
+ return unknown(`can't read the daemon's status: ${r.snapshot.why}`);
128
+ if (r.snapshot.value === null)
129
+ return unknown("the daemon runs but has written no status yet");
130
+ const s = parseSnapshot(r.snapshot.value);
131
+ if (typeof s === "string")
132
+ return unknown(s);
133
+ const beat = Date.parse(snapshotHeartbeat(s) ?? "");
134
+ if (!Number.isFinite(beat))
135
+ return unknown("its status has no heartbeat");
136
+ const poll = s["poll"];
137
+ if (!isObj(poll))
138
+ return unknown("its status has no poll record (an older daemon)");
139
+ const interval = poll["interval_s"];
140
+ if (typeof interval !== "number" || !(interval > 0))
141
+ return unknown("its poll record has no poll interval");
142
+ const step = interval * 1000;
143
+ if (r.now - beat > HEARTBEAT_INTERVALS * step)
144
+ return known({ state: "broken", cause: `no heartbeat for ${minutes(r.now - beat)}` });
145
+ const paused = loginPause(s, r.now);
146
+ if (paused)
147
+ return known({ state: "paused-login", cause: paused });
148
+ const lastAt = typeof poll["last_at"] === "string" ? Date.parse(poll["last_at"]) : null;
149
+ if (poll["last_at"] === null)
150
+ return known({ state: "starting" });
151
+ if (lastAt === null || !Number.isFinite(lastAt))
152
+ return unknown("its poll record has no readable time");
153
+ const checkedAt = lastAt;
154
+ if (poll["ok"] === false)
155
+ return known({
156
+ state: "broken",
157
+ cause: `the last poll failed: ${typeof poll["error"] === "string" ? poll["error"] : "no reason given"}`,
158
+ checkedAt,
159
+ });
160
+ if (poll["ok"] !== true)
161
+ return unknown("its poll record does not say how the poll went");
162
+ if (r.now - lastAt > POLL_STALE_INTERVALS * step)
163
+ return known({
164
+ state: "broken",
165
+ cause: `no poll has finished for ${minutes(r.now - lastAt)}`,
166
+ checkedAt,
167
+ });
168
+ const cause = brokenCause(s, r.now);
169
+ if (cause)
170
+ return known({ state: "broken", cause, checkedAt });
171
+ if (s["dry_run"] === true)
172
+ return known({ state: "on-dry", checkedAt });
173
+ if (s["dry_run"] === false)
174
+ return known({ state: "on-live", checkedAt });
175
+ return unknown("its status does not say whether it runs in dry-run");
176
+ }
177
+ /** The rounds running now, from status.json's text. */
178
+ export function runningRounds(text) {
179
+ const s = parseSnapshot(text);
180
+ if (typeof s === "string")
181
+ return unknown(s);
182
+ if (!Array.isArray(s["prs"]))
183
+ return unknown("its status lists no pull requests");
184
+ const out = [];
185
+ for (const p of s["prs"]) {
186
+ if (!isObj(p) || typeof p["number"] !== "number" || !isObj(p["current_round"]))
187
+ continue;
188
+ const round = p["current_round"]["round_no"];
189
+ out.push({ pr: p["number"], round: typeof round === "number" ? round : 0 });
190
+ }
191
+ return known(out);
192
+ }
193
+ /** "a review of #12 is running and will be stopped", for one or more. */
194
+ export function runningWarning(rounds) {
195
+ if (rounds.kind === "unknown")
196
+ return `Whether a review is running is unknown (${rounds.why}); one that is will be stopped.`;
197
+ const n = rounds.value.map((r) => `#${r.pr}`);
198
+ if (n.length === 0)
199
+ return "Nothing is running now.";
200
+ if (n.length === 1)
201
+ return `A review of ${n[0]} is running and will be stopped.`;
202
+ return `Reviews of ${n.slice(0, -1).join(", ")} and ${n[n.length - 1]} are running and will be stopped.`;
203
+ }
204
+ // ---- the real adapter: this machine's compose stack ----------------------
205
+ /** A container's state as Docker reports it, folded. */
206
+ export function containerState(state) {
207
+ if (state === undefined)
208
+ return "stopped";
209
+ if (/restarting/i.test(state))
210
+ return "restarting";
211
+ return /running|up/i.test(state) ? "running" : "stopped";
212
+ }
213
+ /** One compose service's container, or unknown when Docker cannot answer. */
214
+ export async function serviceState(runner, root, service) {
215
+ const ps = await composePs(runner, root);
216
+ if (!ps.ok)
217
+ return unknown(ps.detail || "docker compose ps failed");
218
+ return known(containerState(serviceRow(ps.rows, service)?.state));
219
+ }
220
+ const firstLine = (s) => s.trim().split("\n")[0]?.trim() || "no output";
221
+ const message = (err) => (err instanceof Error ? err.message : String(err));
222
+ /** The config's `[github]` table and root `dry_run`, read again each time. */
223
+ function readConfig(path, read) {
224
+ try {
225
+ const v = parse(read(path));
226
+ return isObj(v) ? v : `${path} is not a TOML table`;
227
+ }
228
+ catch (err) {
229
+ return `can't read ${path}: ${message(err)}`;
230
+ }
231
+ }
232
+ /** Auto-review on this machine: Docker for the container, the daemon's own
233
+ * status.json (inside its state volume) for the rest. */
234
+ export function composeAutoReview(o) {
235
+ const read = o.read ?? ((p) => readFileSync(p, "utf8"));
236
+ const statusText = async () => {
237
+ const r = await daemonExec(o.runner, o.root, ["cat", `${CONTAINER_STATE_DIR}/status.json`]);
238
+ if (r.code === 0)
239
+ return known(r.stdout);
240
+ if (/no such file/i.test(r.stderr))
241
+ return known(null);
242
+ return unknown(firstLine(r.stderr || r.stdout));
243
+ };
244
+ const config = () => readConfig(o.configPath(), read);
245
+ const engine = (log) => new OnboardingEngine(switchOnRegistry(o), o.stepAdapters(log));
246
+ const dryRunNow = () => {
247
+ const c = config();
248
+ return typeof c === "string" ? null : typeof c["dry_run"] === "boolean" ? c["dry_run"] : null;
249
+ };
250
+ const compose = async (args, what) => {
251
+ const r = await o.runner.run("docker", composeArgs(o.root, args));
252
+ return r.code === 0
253
+ ? { ok: true, detail: what }
254
+ : {
255
+ ok: false,
256
+ detail: `docker compose ${args.join(" ")} exited ${r.code}: ${firstLine(r.stderr || r.stdout)}`,
257
+ };
258
+ };
259
+ const control = {
260
+ machineChecks: async () => {
261
+ const lines = [];
262
+ const r = await engine((l) => lines.push(l)).runStep(MACHINE_CHECKS_STEP_ID);
263
+ // the three the person is told about: Docker, disk, ports
264
+ const said = r.checks
265
+ .filter((c) => c.name === "docker" || c.name === "disk" || c.name === "ports")
266
+ .map((c) => c.detail)
267
+ .join(" · ");
268
+ return r.ok ? { ok: true, detail: said } : { ok: false, detail: r.failures.join("; ") };
269
+ },
270
+ dryRun: async () => {
271
+ const d = dryRunNow();
272
+ return d === null ? unknown(`can't read dry_run from ${o.configPath()}`) : known(d);
273
+ },
274
+ switchOn: async (answers, progress) => {
275
+ const c = config();
276
+ const github = typeof c === "string" ? undefined : c["github"];
277
+ const repo = isObj(github) && typeof github["repo"] === "string" && github["repo"] !== ""
278
+ ? github["repo"]
279
+ : null;
280
+ return runSwitchOn({
281
+ checklist: engine((l) => progress?.(l)),
282
+ answers,
283
+ repo,
284
+ dryRun: dryRunNow,
285
+ stopMemory: () => compose(["stop", MEMORY_SERVICE], "memory stopped"),
286
+ startMemory: () => compose(["up", "-d", MEMORY_SERVICE], "the memory engine runs"),
287
+ ...(progress ? { progress } : {}),
288
+ });
289
+ },
290
+ proof: async () => {
291
+ const p = recordedProof(engine(() => { }));
292
+ return p ? { pr: p.pr, verdict: p.verdict } : null;
293
+ },
294
+ proofRound: (pr, progress) => runProofRound(engine((l) => progress?.(l)), pr),
295
+ goLive: (answers) => runGoLive(engine(() => { }), answers),
296
+ running: async () => {
297
+ const t = await statusText();
298
+ if (t.kind === "unknown")
299
+ return t;
300
+ return t.value === null ? known([]) : runningRounds(t.value);
301
+ },
302
+ switchOff: () => compose(["stop", DAEMON_SERVICE], "the daemon is stopped; its data is kept"),
303
+ };
304
+ return {
305
+ status: async () => {
306
+ const container = await serviceState(o.runner, o.root, DAEMON_SERVICE);
307
+ const snapshot = container.kind === "known" && container.value === "running"
308
+ ? await statusText()
309
+ : known(null);
310
+ return autoReviewLabel({ container, snapshot, now: o.now() });
311
+ },
312
+ trigger: async () => {
313
+ const c = config();
314
+ if (typeof c === "string")
315
+ return unknown(c);
316
+ const github = c["github"];
317
+ const label = isObj(github) ? github["trigger_label"] : undefined;
318
+ return typeof label === "string" && label.trim() !== ""
319
+ ? known(label.trim())
320
+ : unknown(`${o.configPath()} has no [github] trigger_label`);
321
+ },
322
+ control,
323
+ };
324
+ }
325
+ //# sourceMappingURL=autoreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoreview.js","sourceRoot":"","sources":["../../../src/home/autoreview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { COMPOSE_PROJECT, CONTAINER_STATE_DIR, DAEMON_SERVICE, daemonExec, } from "../onboard/steps/compose.js";
2
+ import { serviceState } from "./autoreview.js";
3
+ const firstLine = (s) => s.trim().split("\n")[0]?.trim() || "no output";
4
+ /** The daemon's status.json on the compose stack at `root`. */
5
+ export async function daemonSnapshot(runner, root) {
6
+ const container = await serviceState(runner, root, DAEMON_SERVICE);
7
+ if (container.kind === "unknown") {
8
+ // no Docker at all: auto-review never ran on this machine
9
+ const v = await runner.run("docker", ["--version"]);
10
+ if (v.code !== 0 && /ENOENT|not found/i.test(`${v.stderr}${v.stdout}`))
11
+ return { kind: "none" };
12
+ return { kind: "unknown", why: `can't ask Docker about auto-review: ${container.why}` };
13
+ }
14
+ if (container.value === "running") {
15
+ const r = await daemonExec(runner, root, ["cat", `${CONTAINER_STATE_DIR}/status.json`]);
16
+ if (r.code === 0)
17
+ return { kind: "text", text: r.stdout };
18
+ if (/no such file/i.test(r.stderr))
19
+ return { kind: "none" };
20
+ return { kind: "unknown", why: `can't read its status: ${firstLine(r.stderr || r.stdout)}` };
21
+ }
22
+ // off: did it ever run here? Its state volume is where its snapshot is.
23
+ const volume = `${COMPOSE_PROJECT}_qcr-state`;
24
+ const vol = await runner.run("docker", ["volume", "ls", "-q", "--filter", `name=^${volume}$`]);
25
+ if (vol.code !== 0)
26
+ return {
27
+ kind: "unknown",
28
+ why: `can't ask Docker for its state volume: ${firstLine(vol.stderr)}`,
29
+ };
30
+ return vol.stdout.trim() === "" ? { kind: "none" } : { kind: "off" };
31
+ }
32
+ //# sourceMappingURL=daemonstatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemonstatus.js","sourceRoot":"","sources":["../../../src/home/daemonstatus.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,UAAU,GACX,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAU/C,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC;AAExF,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAqB,EAAE,IAAY;IACtE,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACnE,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjC,0DAA0D;QAC1D,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAChG,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,uCAAuC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC;IAC1F,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,mBAAmB,cAAc,CAAC,CAAC,CAAC;QACxF,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1D,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,0BAA0B,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;IAC/F,CAAC;IACD,wEAAwE;IACxE,MAAM,MAAM,GAAG,GAAG,eAAe,YAAY,CAAC;IAC9C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/F,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,0CAA0C,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;SACvE,CAAC;IACJ,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACvE,CAAC"}
@@ -0,0 +1,61 @@
1
+ const message = (err) => (err instanceof Error ? err.message : String(err));
2
+ /** A device login that ended in an error, as a person reads it. */
3
+ export function loginFailure(err, aborted) {
4
+ const why = message(err);
5
+ if (aborted || /login cancelled/i.test(why))
6
+ return { kind: "cancelled", why };
7
+ if (/timed out|expired|expir/i.test(why))
8
+ return { kind: "expired", why };
9
+ if (/not enabled/i.test(why))
10
+ return { kind: "not_enabled", why };
11
+ if (/denied|rejected|declined|access_denied/i.test(why))
12
+ return { kind: "denied", why };
13
+ return { kind: "failed", why };
14
+ }
15
+ /** The runtime behind pi's registry facade, when this pi has one. */
16
+ function runtimeOf(registry) {
17
+ const runtime = registry?.runtime;
18
+ return typeof runtime?.login === "function" ? runtime : null;
19
+ }
20
+ /** The device login of the pi whose `ctx.modelRegistry` is `registry`. */
21
+ export function piDeviceLogin(registry) {
22
+ return {
23
+ login: async ({ provider, signal, onCode }) => {
24
+ const runtime = runtimeOf(registry);
25
+ if (runtime === null)
26
+ return {
27
+ ok: false,
28
+ kind: "unavailable",
29
+ why: "this pi offers no device login to the home: type /login to sign in with pi's own menu",
30
+ };
31
+ try {
32
+ await runtime.login(provider, "oauth", {
33
+ signal,
34
+ prompt: async (p) => {
35
+ const device = p.type === "select" ? p.options?.find((o) => /device/i.test(o.id)) : undefined;
36
+ if (device)
37
+ return device.id;
38
+ throw new Error(`pi's login asked "${p.message ?? p.type}", which the home does not answer: type /login to sign in with pi's own menu`);
39
+ },
40
+ notify: (e) => {
41
+ if (e.type === "device_code" && "userCode" in e) {
42
+ const code = {
43
+ userCode: e.userCode,
44
+ verificationUri: e.verificationUri,
45
+ ...(e.expiresInSeconds !== undefined
46
+ ? { expiresInSeconds: e.expiresInSeconds }
47
+ : {}),
48
+ };
49
+ onCode(code);
50
+ }
51
+ },
52
+ });
53
+ return { ok: true };
54
+ }
55
+ catch (err) {
56
+ return { ok: false, ...loginFailure(err, signal.aborted) };
57
+ }
58
+ },
59
+ };
60
+ }
61
+ //# sourceMappingURL=devicelogin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devicelogin.js","sourceRoot":"","sources":["../../../src/home/devicelogin.ts"],"names":[],"mappings":"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"}