@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,350 @@
1
+ import { registerQcrTool, textResult, } from "@quickchatai/pi-quickreview/extensions/pi-tool.js";
2
+ import { REVIEW_MESSAGE } from "@quickchatai/pi-quickreview/src/plugin/messages.js";
3
+ import { readQuickReviewSettings } from "@quickchatai/pi-quickreview/src/plugin/settings.js";
4
+ import { piDeviceLogin } from "../src/home/devicelogin.js";
5
+ import { Relogin, RELOGIN_KEY, isLoginError } from "../src/home/loginowner.js";
6
+ import { HomeAdvanced } from "../src/home/advanced.js";
7
+ import { advancedTools } from "../src/home/advancedtools.js";
8
+ import { HomeModel } from "../src/home/model.js";
9
+ import { HOME_OVERLAY, HomePanel } from "../src/home/panel.js";
10
+ import { HomeSetup } from "../src/home/setup.js";
11
+ import { SETUP_OVERLAY, SetupCard } from "../src/home/setupcard.js";
12
+ import { setupTools } from "../src/home/setuptools.js";
13
+ import { HOME_TOOL_NAMES } from "../src/home/toolnames.js";
14
+ import { HomeTune } from "../src/home/tune.js";
15
+ /** How often the home reads its sources again by itself. */
16
+ export const REFRESH_MS = 60_000;
17
+ const SPIN_MS = 100;
18
+ const realEvery = (ms, fn) => {
19
+ const t = setInterval(fn, ms);
20
+ t.unref?.();
21
+ return () => clearInterval(t);
22
+ };
23
+ const realAfter = (ms, fn) => {
24
+ const t = setTimeout(fn, ms);
25
+ t.unref?.();
26
+ return () => clearTimeout(t);
27
+ };
28
+ const NO_PARAMS = { type: "object", properties: {}, additionalProperties: false };
29
+ const PR_PARAM = {
30
+ type: "integer",
31
+ minimum: 1,
32
+ description: "The pull request's number.",
33
+ };
34
+ export function createHome(o) {
35
+ return (pi) => {
36
+ const every = o.every ?? realEvery;
37
+ let tui;
38
+ let handle;
39
+ let close;
40
+ let mounted;
41
+ let session;
42
+ let frame = 0;
43
+ /** The session's UI, for the switches' questions. */
44
+ let sessionUi;
45
+ const askOf = (ctx) => ctx?.hasUI ? ctx.ui : sessionUi;
46
+ const stops = [];
47
+ const redraw = () => tui?.requestRender();
48
+ // the session's UI, for the post question; none outside the TUI
49
+ let ui;
50
+ const message = (err) => (err instanceof Error ? err.message : String(err));
51
+ // a read nobody awaits: what went wrong is said, while the session lasts
52
+ const refresh = () => {
53
+ model.refresh().catch((err) => {
54
+ if (session)
55
+ model.say(`Couldn't read everything again: ${message(err)}`, "warn");
56
+ });
57
+ };
58
+ const model = new HomeModel({
59
+ adapters: o.adapters,
60
+ model: o.model,
61
+ tools: o.tools,
62
+ onChange: redraw,
63
+ after: o.after ?? realAfter,
64
+ ask: async (question, options) => ui?.select(question, options),
65
+ // shown, never a turn of its own: while the agent streams, the message
66
+ // waits for the turn to end instead of steering it
67
+ send: (m) => pi.sendMessage({ customType: REVIEW_MESSAGE, content: m.content, display: true, details: m.details }, { triggerTurn: false }),
68
+ postingRule: () => {
69
+ let all;
70
+ try {
71
+ all = pi.getSettings();
72
+ }
73
+ catch {
74
+ all = undefined;
75
+ }
76
+ const read = readQuickReviewSettings(all);
77
+ for (const w of read.warnings)
78
+ warn(w);
79
+ return read.settings.posting;
80
+ },
81
+ gaps: () => setup.gaps(),
82
+ onRead: () => setup.sync(),
83
+ });
84
+ // a word to the person: pi's notice, else the panel's line
85
+ const warn = (text) => {
86
+ if (session?.hasUI)
87
+ session.ui.notify(text, "warning");
88
+ else
89
+ model.say(text, "warn");
90
+ };
91
+ const setup = new HomeSetup({
92
+ model,
93
+ github: o.adapters.github,
94
+ ports: o.setup ?? {},
95
+ deviceLogin: () => deviceLogin(),
96
+ onChange: redraw,
97
+ onPhase: () => {
98
+ if (session?.mode === "tui")
99
+ mount(session);
100
+ },
101
+ interactive: () => session?.mode === "tui",
102
+ });
103
+ const deviceLogin = () => o.setup?.deviceLogin ?? (session ? piDeviceLogin(session.modelRegistry) : undefined);
104
+ const relogin = new Relogin({
105
+ model,
106
+ owner: o.adapters.loginOwner,
107
+ deviceLogin,
108
+ onChange: redraw,
109
+ });
110
+ const tune = new HomeTune({
111
+ ...(o.tune ? { port: o.tune } : {}),
112
+ repo: () => model.repo(),
113
+ say: (text, kind) => model.say(text, kind),
114
+ after: o.after ?? realAfter,
115
+ onChange: redraw,
116
+ });
117
+ const advanced = new HomeAdvanced({
118
+ ...(o.advanced ? { port: o.advanced } : {}),
119
+ ...(o.adapters.autoReview.control ? { autoReview: o.adapters.autoReview.control } : {}),
120
+ say: (text, kind) => model.say(text, kind),
121
+ refresh: () => model.refresh(),
122
+ selected: () => model.selected,
123
+ });
124
+ // Setup's brief goes to the chat as the person's message, after the
125
+ // agent's turn when one is running
126
+ const tellAgent = (text) => pi.sendUserMessage(text, { deliverAs: "followUp" });
127
+ const advancedAsk = (ctx) => ctx?.hasUI ? ctx.ui : session?.hasUI ? session.ui : undefined;
128
+ const dialogs = (ctx) => ctx?.hasUI
129
+ ? {
130
+ select: (title, options) => ctx.ui.select(title, options),
131
+ input: (title, placeholder) => ctx.ui.input(title, placeholder),
132
+ }
133
+ : undefined;
134
+ const nextStep = (ctx) => setup.next(dialogs(ctx));
135
+ // The card while setup has a gap, the panel otherwise; a change of phase
136
+ // closes the one and opens the other.
137
+ const mount = (ctx) => {
138
+ const want = setup.phase();
139
+ if (close && mounted === want)
140
+ return;
141
+ close?.();
142
+ close = undefined;
143
+ handle = undefined;
144
+ mounted = want;
145
+ const focused = () => handle?.isFocused() ?? false;
146
+ void ctx.ui.custom((t, theme, _keys, done) => {
147
+ tui = t;
148
+ close = () => done();
149
+ return want === "setup"
150
+ ? new SetupCard(theme, {
151
+ setup,
152
+ model,
153
+ focused,
154
+ rows: () => t.terminal.rows,
155
+ unfocus: () => handle?.unfocus(),
156
+ frame: () => frame,
157
+ next: () => void nextStep(session),
158
+ })
159
+ : new HomePanel(theme, {
160
+ model,
161
+ focused,
162
+ rows: () => t.terminal.rows,
163
+ unfocus: () => handle?.unfocus(),
164
+ frame: () => frame,
165
+ ask: () => sessionUi,
166
+ relogin: () => void relogin.start(),
167
+ signingAgain: () => relogin.running() !== null,
168
+ tune: () => void tune.tune(tellAgent),
169
+ advanced: () => void advanced.open(advancedAsk(session)),
170
+ });
171
+ }, {
172
+ overlay: true,
173
+ overlayOptions: want === "setup"
174
+ ? { ...SETUP_OVERLAY }
175
+ : { ...HOME_OVERLAY, margin: { ...HOME_OVERLAY.margin } },
176
+ onHandle: (h) => (handle = h),
177
+ });
178
+ };
179
+ pi.on("session_start", (_e, ctx) => {
180
+ session = ctx;
181
+ model.setChatModel(ctx.model?.provider);
182
+ ui = ctx.mode === "tui" ? ctx.ui : undefined;
183
+ sessionUi = ctx.hasUI ? ctx.ui : undefined;
184
+ if (ctx.mode === "tui") {
185
+ mount(ctx);
186
+ // the spinner turns only while a read or a setup step is in flight
187
+ stops.push(every(SPIN_MS, () => {
188
+ if (!model.busy() && !setup.busy() && relogin.running() === null)
189
+ return;
190
+ frame++;
191
+ redraw();
192
+ }));
193
+ }
194
+ stops.push(every(REFRESH_MS, refresh));
195
+ refresh();
196
+ });
197
+ pi.on("model_select", (e) => model.setChatModel(e.model.provider));
198
+ // pi's own word on the login: a reply refused for it, or one that came back
199
+ pi.on("message_end", (e) => {
200
+ const m = e.message;
201
+ if (m.role !== "assistant")
202
+ return;
203
+ if (m.stopReason === "error") {
204
+ if (typeof m.errorMessage === "string" && isLoginError(m.errorMessage))
205
+ model.loginFailed(m.errorMessage);
206
+ }
207
+ else if (m.stopReason !== "aborted")
208
+ model.chatAnswered();
209
+ });
210
+ pi.on("session_shutdown", () => {
211
+ // the session's timers and its pricing stop; a running review goes on
212
+ model.dispose();
213
+ relogin.close();
214
+ tune.dispose();
215
+ ui = undefined;
216
+ for (const stop of stops.splice(0))
217
+ stop();
218
+ setup.close();
219
+ close?.();
220
+ close = undefined;
221
+ mounted = undefined;
222
+ // pi's context for this session is stale now: nothing may reach it
223
+ session = undefined;
224
+ sessionUi = undefined;
225
+ tui = undefined;
226
+ });
227
+ const key = (id, description, run) => pi.registerShortcut(id, {
228
+ description,
229
+ handler: (ctx) => {
230
+ void new Promise((resolve) => resolve(run(ctx))).catch((err) => {
231
+ if (session)
232
+ model.say(message(err), "warn");
233
+ });
234
+ },
235
+ });
236
+ key("alt+j", "quickreview home: next pull request", () => model.move(1));
237
+ key("alt+k", "quickreview home: previous pull request", () => model.move(-1));
238
+ key("alt+o", "quickreview home: open the pull request on GitHub", () => model.openPr());
239
+ key("alt+u", "quickreview home: read everything again", () => refresh());
240
+ key("alt+r", "quickreview home: review the pull request, or show its review", () => model.enter());
241
+ key("alt+s", "quickreview home: stop the pull request's review", () => model.stopReview());
242
+ key("f2", "quickreview home: focus the panel", () => handle?.focus());
243
+ key("alt+a", "quickreview home: switch auto-review on or off", (ctx) => model.switchAutoReview(askOf(ctx)));
244
+ key("alt+m", "quickreview home: switch memory on or off", (ctx) => model.switchMemory(askOf(ctx)));
245
+ key(RELOGIN_KEY, "quickreview home: sign in again (an expired login)", () => relogin.start());
246
+ key("alt+t", "quickreview home: tune the review to this repo (Setup)", () => tune.tune(tellAgent));
247
+ key("alt+x", "quickreview home: advanced (a GitHub App, webhooks, a server, Slack, live)", (ctx) => advanced.open(advancedAsk(ctx)));
248
+ pi.registerShortcut("alt+n", {
249
+ description: "quickreview home: run the next setup step",
250
+ handler: (ctx) => {
251
+ void nextStep(ctx);
252
+ },
253
+ });
254
+ // one definition per HOME_TOOL_NAMES entry: a name without one does not compile
255
+ const tools = {
256
+ home_status: {
257
+ name: "home_status",
258
+ label: "Home status",
259
+ description: "Read what the quickreview home shows: the repository, the logins, auto-review, memory, spend and the open pull requests (To review, Reviewed). A value that could not be read is null.",
260
+ parameters: NO_PARAMS,
261
+ execute: () => textResult(JSON.stringify(model.status(), null, 1)),
262
+ },
263
+ home_refresh: {
264
+ name: "home_refresh",
265
+ label: "Home refresh",
266
+ description: "Read the home's sources again: the logins, the repository and its open pull requests.",
267
+ parameters: NO_PARAMS,
268
+ execute: async () => textResult(await model.refresh()),
269
+ },
270
+ home_move: {
271
+ name: "home_move",
272
+ label: "Home move",
273
+ description: "Move the home's selection through its pull request lists: 1 is the next row, -1 the previous.",
274
+ parameters: {
275
+ type: "object",
276
+ properties: { by: { type: "integer", description: "Rows to move; negative moves up." } },
277
+ required: ["by"],
278
+ additionalProperties: false,
279
+ },
280
+ execute: (_id, p) => textResult(model.move(Number(p["by"]))),
281
+ },
282
+ home_select: {
283
+ name: "home_select",
284
+ label: "Home select",
285
+ description: "Select one open pull request in the home's lists, by number.",
286
+ parameters: {
287
+ type: "object",
288
+ properties: { pr: PR_PARAM },
289
+ required: ["pr"],
290
+ additionalProperties: false,
291
+ },
292
+ execute: (_id, p) => textResult(model.select(Number(p["pr"]))),
293
+ },
294
+ home_open_pr: {
295
+ name: "home_open_pr",
296
+ label: "Home open PR",
297
+ description: "Open a pull request on GitHub in the person's browser: the one given, or the home's selected one.",
298
+ parameters: { type: "object", properties: { pr: PR_PARAM }, additionalProperties: false },
299
+ execute: async (_id, p) => textResult(await model.openPr(typeof p["pr"] === "number" ? p["pr"] : undefined)),
300
+ },
301
+ home_review_pr: {
302
+ name: "home_review_pr",
303
+ label: "Home review PR",
304
+ description: "Review a pull request with QuickReview in the background: the one given, or the home's selected one. It previews the price, starts the review and returns at once; the home shows its progress and findings, and nothing is posted to GitHub unless the person's posting rule says so.",
305
+ parameters: { type: "object", properties: { pr: PR_PARAM }, additionalProperties: false },
306
+ execute: async (_id, p) => textResult(await model.review(typeof p["pr"] === "number" ? p["pr"] : undefined)),
307
+ },
308
+ home_show_review: {
309
+ name: "home_show_review",
310
+ label: "Home show review",
311
+ description: "Put a reviewed pull request's findings in the chat: the one given, or the home's selected one.",
312
+ parameters: { type: "object", properties: { pr: PR_PARAM }, additionalProperties: false },
313
+ execute: (_id, p) => textResult(model.showReview(typeof p["pr"] === "number" ? p["pr"] : undefined)),
314
+ },
315
+ home_stop_review: {
316
+ name: "home_stop_review",
317
+ label: "Home stop review",
318
+ description: "Stop the running QuickReview review of a pull request: the one given, or the home's selected one.",
319
+ parameters: { type: "object", properties: { pr: PR_PARAM }, additionalProperties: false },
320
+ execute: async (_id, p) => textResult(await model.stopReview(typeof p["pr"] === "number" ? p["pr"] : undefined)),
321
+ },
322
+ home_auto_review: {
323
+ name: "home_auto_review",
324
+ label: "Home auto-review",
325
+ description: "Switch auto-review on or off. Switching on checks this machine, then asks the person where it runs, whether to turn memory on too, and for their one confirm, and it comes up in dry-run; switching off warns them which review is running, and from dry-run offers going live (a proof round on the selected pull request, then one more confirm). Every question is the person's to answer in the home: this tool cannot answer or confirm for them.",
326
+ parameters: NO_PARAMS,
327
+ execute: async (_id, _p, _signal, _onUpdate, ctx) => textResult(await model.switchAutoReview(askOf(ctx))),
328
+ },
329
+ home_memory: {
330
+ name: "home_memory",
331
+ label: "Home memory",
332
+ description: "Switch reviewer memory on or off, on its own: auto-review is not touched. The person confirms in the home, after seeing its RAM cost.",
333
+ parameters: NO_PARAMS,
334
+ execute: async (_id, _p, _signal, _onUpdate, ctx) => textResult(await model.switchMemory(askOf(ctx))),
335
+ },
336
+ home_relogin: {
337
+ name: "home_relogin",
338
+ label: "Home sign in again",
339
+ description: "Sign in again with pi's own device-code login, for the provider the chat runs on, when the login has expired or was revoked (the home's login line says \"login expired\"). When auto-review runs on this machine its login refresher is paused during the sign-in and resumes on the new login. Answers with the URL and the code to enter once pi has them; the sign-in finishes in the background when the person approves it.",
340
+ parameters: NO_PARAMS,
341
+ execute: async () => textResult(await relogin.start()),
342
+ },
343
+ ...setupTools(setup),
344
+ ...advancedTools({ tune, advanced, tellAgent, ask: (ctx) => advancedAsk(ctx) }),
345
+ };
346
+ for (const name of HOME_TOOL_NAMES)
347
+ registerQcrTool(pi, tools[name]);
348
+ };
349
+ }
350
+ //# sourceMappingURL=home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home.js","sourceRoot":"","sources":["../../extensions/home.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ // login-route — a pi that has no usable model login says so, and opens pi's
2
+ // own /login; a pi whose model names one OpenAI provider while the person
3
+ // logged in with the other runs the same model on the login that exists.
4
+ //
5
+ // Loaded by every CLI pi Quickreview starts for a person: the onboarding
6
+ // wizard (registered by extensions/onboarding.ts, which opens the login for
7
+ // the person), the companion, a takeover and a debug round (the env shim
8
+ // extensions/cli/login-route.ts, which prefills it). An SDK session needs none
9
+ // of this: PiHost routes its model the same way (packages/pi-plugin/src/engine/pisdk.ts).
10
+ //
11
+ // Three behaviours, each on pi's own API:
12
+ // - Model route. On session_start and before every prompt (the `input`
13
+ // event, which pi runs before it checks the model's credential), a model
14
+ // whose provider has no credential is switched to its OpenAI twin when the
15
+ // twin has one and serves the same id (packages/pi-plugin/src/modelroute.ts).
16
+ // The provider the spec names always wins when its login exists, so an
17
+ // install that works today is untouched. pi.setModel does not persist the
18
+ // switch to settings.
19
+ // - Login hint. When no usable model is left, a widget says exactly what to
20
+ // do, and pi's input line holds `/login`, so one Enter opens pi's login.
21
+ // The widget clears once a model is selected (`model_select`).
22
+ // - Open (the wizard only). pi runs `/login` only from its editor's submit
23
+ // (an extension cannot call the command), and the one public way to reach
24
+ // that submit is an editor component: pi wires its own submit handler
25
+ // onto every editor an extension installs. So the login is opened by
26
+ // installing a stock CustomEditor for an instant, submitting `/login`
27
+ // through the handler pi gave it, and restoring the editor that was there.
28
+ // When that wiring is not found, the prefilled `/login` is the fallback.
29
+ import { CustomEditor, } from "@earendil-works/pi-coding-agent";
30
+ import { routeProvider, twinProvider } from "@quickchatai/pi-quickreview/src/modelroute.js";
31
+ /** The widget key the hint is shown under. */
32
+ export const LOGIN_WIDGET = "qcr-login";
33
+ /** The command the hint prefills and the wizard submits: pi's own login,
34
+ * with every provider it offers. */
35
+ export const LOGIN_COMMAND = "/login";
36
+ /** What the person reads above the input line while no model is usable:
37
+ * which logins work and how to reach them in pi's menu (pi 1.4.0's labels),
38
+ * then how to (re)open the menu. `opened` says whether the menu is on screen. */
39
+ export function loginHintLines(opened) {
40
+ return [
41
+ "Quickreview needs a model login before it can do anything. Any OpenAI login works:",
42
+ ' - "Sign in with an account", then "OpenAI" (Sign in with ChatGPT) or "OpenAI Codex (legacy)";',
43
+ ' - "Sign in with an API key", then type openai, pick "OpenAI" and paste your key (sk-...).',
44
+ opened
45
+ ? `pi's login menu is open below. Closed it? Type ${LOGIN_COMMAND} and press Enter.`
46
+ : `Press Enter to open pi's login menu (${LOGIN_COMMAND} is on the input line).`,
47
+ ];
48
+ }
49
+ /** The config the env describes: QCR_LOGIN_OPEN=submit, else prefill. */
50
+ export function loginRouteConfigFromEnv(env) {
51
+ return { open: env.QCR_LOGIN_OPEN === "submit" ? "submit" : "prefill" };
52
+ }
53
+ function hasCredential(registry, provider) {
54
+ try {
55
+ return registry.getProviderAuthStatus(provider).configured;
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }
61
+ /**
62
+ * Keep the session's model on a login that exists: the model as it is when its
63
+ * provider has a credential, else its OpenAI twin when that has one.
64
+ *
65
+ * VERIFY-ON-PIN (pi 1.4.0): ModelRegistry.getProviderAuthStatus(p).configured
66
+ * covers a stored login, a stored or runtime key and an environment key, and
67
+ * the extension pi.setModel returns false (switching nothing) for a provider
68
+ * without a credential.
69
+ */
70
+ export async function routeSessionModel(pi, ctx) {
71
+ const model = ctx.model;
72
+ if (!model)
73
+ return "none";
74
+ const registry = ctx.modelRegistry;
75
+ if (hasCredential(registry, model.provider))
76
+ return "usable";
77
+ if (twinProvider(model.provider) === undefined)
78
+ return "unusable";
79
+ const provider = routeProvider(model.provider, model.id, {
80
+ hasCredential: (p) => hasCredential(registry, p),
81
+ hasModel: (p, id) => registry.find(p, id) !== undefined,
82
+ });
83
+ if (provider === model.provider)
84
+ return "unusable";
85
+ const twin = registry.find(provider, model.id);
86
+ if (twin && (await pi.setModel(twin)))
87
+ return "switched";
88
+ return "unusable";
89
+ }
90
+ /** Does this pi need a login: no usable model, and none pi could pick? */
91
+ export function needsLogin(outcome, registry) {
92
+ if (outcome === "usable" || outcome === "switched")
93
+ return false;
94
+ if (outcome === "unusable")
95
+ return true;
96
+ try {
97
+ return registry.getAvailable().length === 0;
98
+ }
99
+ catch {
100
+ return true;
101
+ }
102
+ }
103
+ /**
104
+ * Submit `text` through pi's own editor submit, as if typed and Entered. pi
105
+ * runs its built-in commands (`/login` among them) only from that handler, and
106
+ * hands it to every editor component an extension installs: so a stock editor
107
+ * is installed, its handler taken, and the previous editor (pi's default, or
108
+ * another extension's) restored before anything renders. Returns false, having
109
+ * submitted nothing, when pi did not wire a handler.
110
+ *
111
+ * VERIFY-ON-PIN (pi 1.4.0, interactive-mode.js setCustomEditorComponent):
112
+ * `newEditor.onSubmit = this.defaultEditor.onSubmit` runs synchronously inside
113
+ * setEditorComponent, and setEditorComponent(undefined) restores the default
114
+ * editor with its text.
115
+ */
116
+ export function submitThroughEditor(ui, text, makeEditor = (tui, theme, keybindings) => new CustomEditor(tui, theme, keybindings)) {
117
+ let made;
118
+ const previous = ui.getEditorComponent();
119
+ try {
120
+ ui.setEditorComponent((tui, theme, keybindings) => {
121
+ const editor = makeEditor(tui, theme, keybindings);
122
+ made = editor;
123
+ return editor;
124
+ });
125
+ }
126
+ catch {
127
+ made = undefined;
128
+ }
129
+ const submit = made?.onSubmit;
130
+ ui.setEditorComponent(previous);
131
+ if (typeof submit !== "function")
132
+ return false;
133
+ void Promise.resolve()
134
+ .then(() => submit(text))
135
+ .catch(() => undefined);
136
+ return true;
137
+ }
138
+ /** Show the hint and open (or prefill) pi's login. Returns how it was opened. */
139
+ export function openLogin(ui, open) {
140
+ if (open === "submit" && submitThroughEditor(ui, LOGIN_COMMAND)) {
141
+ ui.setWidget(LOGIN_WIDGET, loginHintLines(true), { placement: "aboveEditor" });
142
+ return "submitted";
143
+ }
144
+ ui.setWidget(LOGIN_WIDGET, loginHintLines(false), { placement: "aboveEditor" });
145
+ ui.setEditorText(LOGIN_COMMAND);
146
+ return "prefilled";
147
+ }
148
+ /** Register the model route and the login hint on `pi`. Exported so a host that
149
+ * builds its own onboarding extension (over `toolDefinitions`) gets the same
150
+ * first-run login as the onboarding wizard. */
151
+ export function registerLoginRoute(pi, config) {
152
+ if (typeof pi.on !== "function")
153
+ return;
154
+ let shown = false;
155
+ pi.on("session_start", async (_event, ctx) => {
156
+ const outcome = await routeSessionModel(pi, ctx);
157
+ if (!ctx.hasUI || !needsLogin(outcome, ctx.modelRegistry))
158
+ return;
159
+ shown = true;
160
+ openLogin(ctx.ui, config.open);
161
+ });
162
+ // pi checks the model's credential after this event, so a login made inside
163
+ // the session (its default model stays the spec's provider) is routed here.
164
+ pi.on("input", async (_event, ctx) => {
165
+ await routeSessionModel(pi, ctx);
166
+ return { action: "continue" };
167
+ });
168
+ pi.on("model_select", (_event, ctx) => {
169
+ if (!shown || !ctx.hasUI)
170
+ return;
171
+ shown = false;
172
+ ctx.ui.setWidget(LOGIN_WIDGET, undefined);
173
+ });
174
+ }
175
+ /** The factory, for a pi that loads the route by path (its shim) or a host
176
+ * that composes factories. */
177
+ export function createLoginRoute(config) {
178
+ return (pi) => registerLoginRoute(pi, config);
179
+ }
180
+ //# sourceMappingURL=login-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-route.js","sourceRoot":"","sources":["../../extensions/login-route.ts"],"names":[],"mappings":"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"}