@quickchatai/quickreview 1.1.0 → 1.2.0

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 (225) hide show
  1. package/README.md +35 -19
  2. package/config.example.toml +41 -9
  3. package/dist/extensions/cli/login-route.js +5 -0
  4. package/dist/extensions/cli/login-route.js.map +1 -0
  5. package/dist/extensions/login-route.js +180 -0
  6. package/dist/extensions/login-route.js.map +1 -0
  7. package/dist/extensions/onboarding.js +29 -6
  8. package/dist/extensions/onboarding.js.map +1 -1
  9. package/dist/src/ciretry.js +2 -1
  10. package/dist/src/ciretry.js.map +1 -1
  11. package/dist/src/cli.js +43 -12
  12. package/dist/src/cli.js.map +1 -1
  13. package/dist/src/cliops.js +3 -2
  14. package/dist/src/cliops.js.map +1 -1
  15. package/dist/src/commands.js +25 -2
  16. package/dist/src/commands.js.map +1 -1
  17. package/dist/src/config.js +16 -2
  18. package/dist/src/config.js.map +1 -1
  19. package/dist/src/daemon.js +24 -8
  20. package/dist/src/daemon.js.map +1 -1
  21. package/dist/src/debugroundpi.js +5 -1
  22. package/dist/src/debugroundpi.js.map +1 -1
  23. package/dist/src/dispatch.js +5 -4
  24. package/dist/src/dispatch.js.map +1 -1
  25. package/dist/src/engine/debugpi.js +17 -5
  26. package/dist/src/engine/debugpi.js.map +1 -1
  27. package/dist/src/execboundary.js +10 -3
  28. package/dist/src/execboundary.js.map +1 -1
  29. package/dist/src/github.js +51 -16
  30. package/dist/src/github.js.map +1 -1
  31. package/dist/src/githubtoken.js +346 -0
  32. package/dist/src/githubtoken.js.map +1 -0
  33. package/dist/src/loginhint.js +8 -3
  34. package/dist/src/loginhint.js.map +1 -1
  35. package/dist/src/loginrefresh/pirefresh.js +3 -0
  36. package/dist/src/loginrefresh/pirefresh.js.map +1 -1
  37. package/dist/src/npmverbs.js +4 -2
  38. package/dist/src/npmverbs.js.map +1 -1
  39. package/dist/src/onboard/choices.js +29 -1
  40. package/dist/src/onboard/choices.js.map +1 -1
  41. package/dist/src/onboard/engine.js +8 -23
  42. package/dist/src/onboard/engine.js.map +1 -1
  43. package/dist/src/onboard/launch.js +12 -20
  44. package/dist/src/onboard/launch.js.map +1 -1
  45. package/dist/src/onboard/pipin.js +22 -0
  46. package/dist/src/onboard/pipin.js.map +1 -0
  47. package/dist/src/onboard/stepforward.js +41 -0
  48. package/dist/src/onboard/stepforward.js.map +1 -0
  49. package/dist/src/onboard/steps/appslug.js +4 -1
  50. package/dist/src/onboard/steps/appslug.js.map +1 -1
  51. package/dist/src/onboard/steps/compose.js +29 -0
  52. package/dist/src/onboard/steps/compose.js.map +1 -1
  53. package/dist/src/onboard/steps/configfill.js +102 -32
  54. package/dist/src/onboard/steps/configfill.js.map +1 -1
  55. package/dist/src/onboard/steps/githubaccount.js +595 -0
  56. package/dist/src/onboard/steps/githubaccount.js.map +1 -0
  57. package/dist/src/onboard/steps/githubapp.js +65 -7
  58. package/dist/src/onboard/steps/githubapp.js.map +1 -1
  59. package/dist/src/onboard/steps/golive.js +2 -0
  60. package/dist/src/onboard/steps/golive.js.map +1 -1
  61. package/dist/src/onboard/steps/index.js +11 -0
  62. package/dist/src/onboard/steps/index.js.map +1 -1
  63. package/dist/src/onboard/steps/ingress.js +80 -25
  64. package/dist/src/onboard/steps/ingress.js.map +1 -1
  65. package/dist/src/onboard/steps/llmauth.js +103 -30
  66. package/dist/src/onboard/steps/llmauth.js.map +1 -1
  67. package/dist/src/onboard/steps/memory.js +53 -1
  68. package/dist/src/onboard/steps/memory.js.map +1 -1
  69. package/dist/src/onboard/steps/proof.js +366 -56
  70. package/dist/src/onboard/steps/proof.js.map +1 -1
  71. package/dist/src/onboard/steps/topology.js +6 -6
  72. package/dist/src/onboard/steps/topology.js.map +1 -1
  73. package/dist/src/onboard/steps/transport.js +9 -1
  74. package/dist/src/onboard/steps/transport.js.map +1 -1
  75. package/dist/src/onboard/steps/tuiroute.js +102 -0
  76. package/dist/src/onboard/steps/tuiroute.js.map +1 -0
  77. package/dist/src/onboard/steps/verifyup.js +17 -1
  78. package/dist/src/onboard/steps/verifyup.js.map +1 -1
  79. package/dist/src/onboard/toolnames.js +30 -0
  80. package/dist/src/onboard/toolnames.js.map +1 -0
  81. package/dist/src/operatorwrite.js +23 -0
  82. package/dist/src/operatorwrite.js.map +1 -0
  83. package/dist/src/outcomes.js +4 -1
  84. package/dist/src/outcomes.js.map +1 -1
  85. package/dist/src/posting-journal.js +2 -1
  86. package/dist/src/posting-journal.js.map +1 -1
  87. package/dist/src/posting-outbox.js +6 -2
  88. package/dist/src/posting-outbox.js.map +1 -1
  89. package/dist/src/posting-receipt.js +14 -1
  90. package/dist/src/posting-receipt.js.map +1 -1
  91. package/dist/src/recheck.js +2 -1
  92. package/dist/src/recheck.js.map +1 -1
  93. package/dist/src/reconcile.js +22 -2
  94. package/dist/src/reconcile.js.map +1 -1
  95. package/dist/src/reviewhistory.js +32 -6
  96. package/dist/src/reviewhistory.js.map +1 -1
  97. package/dist/src/reviewnow.js +45 -0
  98. package/dist/src/reviewnow.js.map +1 -0
  99. package/dist/src/state.js.map +1 -1
  100. package/dist/src/statemachine.js +4 -1
  101. package/dist/src/statemachine.js.map +1 -1
  102. package/dist/src/takeoverpi.js +13 -0
  103. package/dist/src/takeoverpi.js.map +1 -1
  104. package/dist/src/tui/app.js +49 -0
  105. package/dist/src/tui/app.js.map +1 -1
  106. package/dist/src/tui/board.js +88 -12
  107. package/dist/src/tui/board.js.map +1 -1
  108. package/dist/src/tui/cmdbar.js +4 -1
  109. package/dist/src/tui/cmdbar.js.map +1 -1
  110. package/dist/src/tui/companion.js +74 -10
  111. package/dist/src/tui/companion.js.map +1 -1
  112. package/dist/src/tui/connect.js +7 -1
  113. package/dist/src/tui/connect.js.map +1 -1
  114. package/dist/src/tui/filters.js +5 -2
  115. package/dist/src/tui/filters.js.map +1 -1
  116. package/dist/src/tui/ghread.js +61 -5
  117. package/dist/src/tui/ghread.js.map +1 -1
  118. package/dist/src/tui/index.js +106 -20
  119. package/dist/src/tui/index.js.map +1 -1
  120. package/dist/src/tui/memforward.js +39 -2
  121. package/dist/src/tui/memforward.js.map +1 -1
  122. package/dist/src/tui/model.js +25 -0
  123. package/dist/src/tui/model.js.map +1 -1
  124. package/dist/src/tui/prpause.js +7 -0
  125. package/dist/src/tui/prpause.js.map +1 -1
  126. package/dist/src/tui/remote.js +7 -1
  127. package/dist/src/tui/remote.js.map +1 -1
  128. package/dist/src/tui/route.js +143 -0
  129. package/dist/src/tui/route.js.map +1 -0
  130. package/dist/src/tui/setupstate.js +29 -0
  131. package/dist/src/tui/setupstate.js.map +1 -0
  132. package/dist/src/tui/sshtriage.js +102 -5
  133. package/dist/src/tui/sshtriage.js.map +1 -1
  134. package/dist/src/tui/theme.js +2 -1
  135. package/dist/src/tui/theme.js.map +1 -1
  136. package/dist/src/tui/unwedge.js +2 -12
  137. package/dist/src/tui/unwedge.js.map +1 -1
  138. package/dist/src/verdicts.js +17 -5
  139. package/dist/src/verdicts.js.map +1 -1
  140. package/dist/src/version.js +1 -1
  141. package/dist/src/version.js.map +1 -1
  142. package/dist/src/webhook.js +12 -1
  143. package/dist/src/webhook.js.map +1 -1
  144. package/dist/src/wire.js +28 -6
  145. package/dist/src/wire.js.map +1 -1
  146. package/dist/src/workerworld.js +7 -1
  147. package/dist/src/workerworld.js.map +1 -1
  148. package/docker/companion/entrypoint.sh +20 -1
  149. package/docker/entrypoint.sh +17 -0
  150. package/extensions/cli/login-route.ts +10 -0
  151. package/extensions/login-route.ts +220 -0
  152. package/extensions/onboarding.ts +35 -6
  153. package/package.json +2 -2
  154. package/prompts/onboarding.md +57 -18
  155. package/scripts/mint-token.sh +25 -4
  156. package/src/ciretry.ts +2 -1
  157. package/src/cli.ts +49 -14
  158. package/src/cliops.ts +3 -2
  159. package/src/commands.ts +28 -2
  160. package/src/config.ts +24 -4
  161. package/src/daemon.ts +32 -7
  162. package/src/debugroundpi.ts +11 -1
  163. package/src/dispatch.ts +5 -4
  164. package/src/engine/debugpi.ts +17 -5
  165. package/src/execboundary.ts +16 -4
  166. package/src/github.ts +57 -15
  167. package/src/githubtoken.ts +435 -0
  168. package/src/loginhint.ts +8 -3
  169. package/src/loginrefresh/pirefresh.ts +3 -0
  170. package/src/npmverbs.ts +4 -2
  171. package/src/onboard/choices.ts +34 -1
  172. package/src/onboard/engine.ts +22 -3
  173. package/src/onboard/launch.ts +17 -29
  174. package/src/onboard/pipin.ts +31 -0
  175. package/src/onboard/stepforward.ts +61 -0
  176. package/src/onboard/steps/appslug.ts +4 -1
  177. package/src/onboard/steps/compose.ts +31 -0
  178. package/src/onboard/steps/configfill.ts +121 -33
  179. package/src/onboard/steps/githubaccount.ts +716 -0
  180. package/src/onboard/steps/githubapp.ts +92 -8
  181. package/src/onboard/steps/golive.ts +2 -0
  182. package/src/onboard/steps/index.ts +11 -0
  183. package/src/onboard/steps/ingress.ts +98 -31
  184. package/src/onboard/steps/llmauth.ts +114 -29
  185. package/src/onboard/steps/memory.ts +58 -1
  186. package/src/onboard/steps/proof.ts +473 -55
  187. package/src/onboard/steps/topology.ts +7 -6
  188. package/src/onboard/steps/transport.ts +15 -0
  189. package/src/onboard/steps/tuiroute.ts +119 -0
  190. package/src/onboard/steps/verifyup.ts +20 -1
  191. package/src/onboard/toolnames.ts +34 -0
  192. package/src/operatorwrite.ts +25 -0
  193. package/src/outcomes.ts +8 -1
  194. package/src/posting-journal.ts +6 -1
  195. package/src/posting-outbox.ts +10 -2
  196. package/src/posting-receipt.ts +17 -0
  197. package/src/recheck.ts +2 -1
  198. package/src/reconcile.ts +29 -3
  199. package/src/reviewhistory.ts +20 -6
  200. package/src/reviewnow.ts +76 -0
  201. package/src/state.ts +18 -0
  202. package/src/statemachine.ts +4 -1
  203. package/src/takeoverpi.ts +13 -0
  204. package/src/tui/app.ts +47 -0
  205. package/src/tui/board.ts +111 -14
  206. package/src/tui/cmdbar.ts +4 -1
  207. package/src/tui/companion.ts +78 -10
  208. package/src/tui/connect.ts +7 -1
  209. package/src/tui/filters.ts +7 -3
  210. package/src/tui/ghread.ts +74 -7
  211. package/src/tui/index.ts +114 -23
  212. package/src/tui/memforward.ts +52 -3
  213. package/src/tui/model.ts +36 -2
  214. package/src/tui/prpause.ts +11 -2
  215. package/src/tui/remote.ts +9 -1
  216. package/src/tui/route.ts +173 -0
  217. package/src/tui/setupstate.ts +52 -0
  218. package/src/tui/sshtriage.ts +127 -6
  219. package/src/tui/theme.ts +2 -1
  220. package/src/tui/unwedge.ts +2 -14
  221. package/src/verdicts.ts +23 -5
  222. package/src/version.ts +1 -1
  223. package/src/webhook.ts +10 -1
  224. package/src/wire.ts +36 -7
  225. package/src/workerworld.ts +7 -1
@@ -1 +1 @@
1
- {"version":3,"file":"workerworld.js","sourceRoot":"","sources":["../../src/workerworld.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workerworld.js","sourceRoot":"","sources":["../../src/workerworld.ts"],"names":[],"mappings":"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"}
@@ -237,6 +237,23 @@ if (defMatch) {
237
237
  cfg.defaultProvider = defMatch[1];
238
238
  cfg.defaultModel = defMatch[2];
239
239
  if (defMatch[3]) cfg.defaultThinkingLevel = defMatch[3];
240
+ // Any OpenAI login serves the model: `openai-codex` (the legacy Codex login)
241
+ // and `openai` (Sign in with ChatGPT, or an API key) carry the same ids. When
242
+ // the named provider has no login and its twin has one, the default is the
243
+ // twin (the rule of packages/pi-plugin/src/modelroute.ts, which the companion's
244
+ // login-route extension applies again inside pi).
245
+ const twin = { "openai-codex": "openai", openai: "openai-codex" }[cfg.defaultProvider];
246
+ if (twin) {
247
+ let logins = {};
248
+ try { logins = JSON.parse(fs.readFileSync(process.env.HOME + "/.pi/agent/auth.json", "utf8")); } catch {}
249
+ const has = (p) => {
250
+ const c = logins[p];
251
+ if (c && c.type === "oauth") return true;
252
+ if (c && c.type === "api_key" && typeof c.key === "string" && c.key.trim() !== "") return true;
253
+ return p === "openai" && (process.env.OPENAI_API_KEY || "").trim() !== "";
254
+ };
255
+ if (!has(cfg.defaultProvider) && has(twin)) cfg.defaultProvider = twin;
256
+ }
240
257
  }
241
258
 
242
259
  fs.writeFileSync(path, JSON.stringify(cfg, null, 2) + "\n");
@@ -302,7 +319,9 @@ fi
302
319
  # OpenAI auth: the OAuth route (`/login` once inside a pi session) persists in
303
320
  # $PI_HOME_DIR/agent/auth.json on the volume and takes precedence over the env
304
321
  # var. OPENAI_API_KEY is honored when the caller passes one.
305
- # Provider prefix under OAuth is `openai-codex/`, not `openai/`.
322
+ # Any OpenAI login works: the shipped model prefix is `openai-codex/` (the
323
+ # legacy Codex login), and a model whose provider has no login runs on the
324
+ # other OpenAI login (`openai/`: Sign in with ChatGPT, or an API key).
306
325
 
307
326
  # Memory health watcher: probes OpenViking through the host-owned
308
327
  # forward and drops an alert file into /alerts when it stops answering (and a
@@ -503,6 +503,23 @@ if (defMatch) {
503
503
  cfg.defaultProvider = defMatch[1];
504
504
  cfg.defaultModel = defMatch[2];
505
505
  if (defMatch[3]) cfg.defaultThinkingLevel = defMatch[3];
506
+ // Any OpenAI login serves the model: `openai-codex` (the legacy Codex login)
507
+ // and `openai` (Sign in with ChatGPT, or an API key) carry the same ids. When
508
+ // the named provider has no login and its twin has one, the default is the
509
+ // twin (the rule of packages/pi-plugin/src/modelroute.ts, which the
510
+ // companion's login-route extension applies again inside pi).
511
+ const twin = { "openai-codex": "openai", openai: "openai-codex" }[cfg.defaultProvider];
512
+ if (twin) {
513
+ let logins = {};
514
+ try { logins = JSON.parse(fs.readFileSync(path.join(home, ".pi", "agent", "auth.json"), "utf8")); } catch {}
515
+ const has = (p) => {
516
+ const c = logins[p];
517
+ if (c && c.type === "oauth") return true;
518
+ if (c && c.type === "api_key" && typeof c.key === "string" && c.key.trim() !== "") return true;
519
+ return p === "openai" && (process.env.OPENAI_API_KEY || "").trim() !== "";
520
+ };
521
+ if (!has(cfg.defaultProvider) && has(twin)) cfg.defaultProvider = twin;
522
+ }
506
523
  }
507
524
  fs.writeFileSync(file, JSON.stringify(cfg, null, 2) + "\n");
508
525
  console.log("pi skills registered: " + (cfg.skills.join(", ") || "none"));
@@ -0,0 +1,10 @@
1
+ // The env shim for the login route (extensions/login-route.ts): the one place
2
+ // the process's env becomes its config. QCR_LOGIN_OPEN=submit opens pi's login
3
+ // menu when no model is usable; anything else leaves `/login` on the input
4
+ // line for one Enter.
5
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
6
+ import { createLoginRoute, loginRouteConfigFromEnv } from "../login-route.js";
7
+
8
+ export default function activate(pi: ExtensionAPI): void {
9
+ void createLoginRoute(loginRouteConfigFromEnv(process.env))(pi);
10
+ }
@@ -0,0 +1,220 @@
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 {
30
+ CustomEditor,
31
+ type ExtensionAPI,
32
+ type ExtensionContext,
33
+ type ExtensionFactory,
34
+ type ExtensionUIContext,
35
+ } from "@earendil-works/pi-coding-agent";
36
+ import type { Api, Model } from "@earendil-works/pi-ai";
37
+ import { routeProvider, twinProvider } from "@quickchatai/pi-quickreview/src/modelroute.js";
38
+
39
+ /** The widget key the hint is shown under. */
40
+ export const LOGIN_WIDGET = "qcr-login";
41
+
42
+ /** The command the hint prefills and the wizard submits: pi's own login,
43
+ * with every provider it offers. */
44
+ export const LOGIN_COMMAND = "/login";
45
+
46
+ /** What the person reads above the input line while no model is usable:
47
+ * which logins work and how to reach them in pi's menu (pi 1.4.0's labels),
48
+ * then how to (re)open the menu. `opened` says whether the menu is on screen. */
49
+ export function loginHintLines(opened: boolean): string[] {
50
+ return [
51
+ "Quickreview needs a model login before it can do anything. Any OpenAI login works:",
52
+ ' - "Sign in with an account", then "OpenAI" (Sign in with ChatGPT) or "OpenAI Codex (legacy)";',
53
+ ' - "Sign in with an API key", then type openai, pick "OpenAI" and paste your key (sk-...).',
54
+ opened
55
+ ? `pi's login menu is open below. Closed it? Type ${LOGIN_COMMAND} and press Enter.`
56
+ : `Press Enter to open pi's login menu (${LOGIN_COMMAND} is on the input line).`,
57
+ ];
58
+ }
59
+
60
+ /** How a pi opens the login when it needs one. */
61
+ export type LoginOpen = "submit" | "prefill";
62
+
63
+ export interface LoginRouteConfig {
64
+ /** "submit" opens pi's login menu; "prefill" leaves `/login` on the input
65
+ * line for one Enter. */
66
+ open: LoginOpen;
67
+ }
68
+
69
+ /** The config the env describes: QCR_LOGIN_OPEN=submit, else prefill. */
70
+ export function loginRouteConfigFromEnv(env: NodeJS.ProcessEnv): LoginRouteConfig {
71
+ return { open: env.QCR_LOGIN_OPEN === "submit" ? "submit" : "prefill" };
72
+ }
73
+
74
+ /** What the model route did. */
75
+ export type ModelRouteOutcome =
76
+ /** The current model's provider has a credential. */
77
+ | "usable"
78
+ /** The model was moved to its OpenAI twin, whose login exists. */
79
+ | "switched"
80
+ /** There is a model, and neither it nor a twin has a credential. */
81
+ | "unusable"
82
+ /** There is no model at all. */
83
+ | "none";
84
+
85
+ type Registry = Pick<
86
+ ExtensionContext["modelRegistry"],
87
+ "find" | "getAvailable" | "getProviderAuthStatus"
88
+ >;
89
+
90
+ function hasCredential(registry: Registry, provider: string): boolean {
91
+ try {
92
+ return registry.getProviderAuthStatus(provider).configured;
93
+ } catch {
94
+ return false;
95
+ }
96
+ }
97
+
98
+ /**
99
+ * Keep the session's model on a login that exists: the model as it is when its
100
+ * provider has a credential, else its OpenAI twin when that has one.
101
+ *
102
+ * VERIFY-ON-PIN (pi 1.4.0): ModelRegistry.getProviderAuthStatus(p).configured
103
+ * covers a stored login, a stored or runtime key and an environment key, and
104
+ * the extension pi.setModel returns false (switching nothing) for a provider
105
+ * without a credential.
106
+ */
107
+ export async function routeSessionModel(
108
+ pi: Pick<ExtensionAPI, "setModel">,
109
+ ctx: { model: Model<Api> | undefined; modelRegistry: Registry },
110
+ ): Promise<ModelRouteOutcome> {
111
+ const model = ctx.model;
112
+ if (!model) return "none";
113
+ const registry = ctx.modelRegistry;
114
+ if (hasCredential(registry, model.provider)) return "usable";
115
+ if (twinProvider(model.provider) === undefined) return "unusable";
116
+ const provider = routeProvider(model.provider, model.id, {
117
+ hasCredential: (p) => hasCredential(registry, p),
118
+ hasModel: (p, id) => registry.find(p, id) !== undefined,
119
+ });
120
+ if (provider === model.provider) return "unusable";
121
+ const twin = registry.find(provider, model.id);
122
+ if (twin && (await pi.setModel(twin))) return "switched";
123
+ return "unusable";
124
+ }
125
+
126
+ /** Does this pi need a login: no usable model, and none pi could pick? */
127
+ export function needsLogin(outcome: ModelRouteOutcome, registry: Registry): boolean {
128
+ if (outcome === "usable" || outcome === "switched") return false;
129
+ if (outcome === "unusable") return true;
130
+ try {
131
+ return registry.getAvailable().length === 0;
132
+ } catch {
133
+ return true;
134
+ }
135
+ }
136
+
137
+ type EditorUi = Pick<ExtensionUIContext, "setEditorComponent" | "getEditorComponent">;
138
+ type MakeEditor = Parameters<ExtensionUIContext["setEditorComponent"]>[0] & {};
139
+
140
+ /**
141
+ * Submit `text` through pi's own editor submit, as if typed and Entered. pi
142
+ * runs its built-in commands (`/login` among them) only from that handler, and
143
+ * hands it to every editor component an extension installs: so a stock editor
144
+ * is installed, its handler taken, and the previous editor (pi's default, or
145
+ * another extension's) restored before anything renders. Returns false, having
146
+ * submitted nothing, when pi did not wire a handler.
147
+ *
148
+ * VERIFY-ON-PIN (pi 1.4.0, interactive-mode.js setCustomEditorComponent):
149
+ * `newEditor.onSubmit = this.defaultEditor.onSubmit` runs synchronously inside
150
+ * setEditorComponent, and setEditorComponent(undefined) restores the default
151
+ * editor with its text.
152
+ */
153
+ export function submitThroughEditor(
154
+ ui: EditorUi,
155
+ text: string,
156
+ makeEditor: MakeEditor = (tui, theme, keybindings) => new CustomEditor(tui, theme, keybindings),
157
+ ): boolean {
158
+ let made: { onSubmit?: (text: string) => void } | undefined;
159
+ const previous = ui.getEditorComponent();
160
+ try {
161
+ ui.setEditorComponent((tui, theme, keybindings) => {
162
+ const editor = makeEditor(tui, theme, keybindings);
163
+ made = editor;
164
+ return editor;
165
+ });
166
+ } catch {
167
+ made = undefined;
168
+ }
169
+ const submit = made?.onSubmit;
170
+ ui.setEditorComponent(previous);
171
+ if (typeof submit !== "function") return false;
172
+ void Promise.resolve()
173
+ .then(() => submit(text))
174
+ .catch(() => undefined);
175
+ return true;
176
+ }
177
+
178
+ type HintUi = Pick<ExtensionUIContext, "setWidget" | "setEditorText"> & EditorUi;
179
+
180
+ /** Show the hint and open (or prefill) pi's login. Returns how it was opened. */
181
+ export function openLogin(ui: HintUi, open: LoginOpen): "submitted" | "prefilled" {
182
+ if (open === "submit" && submitThroughEditor(ui, LOGIN_COMMAND)) {
183
+ ui.setWidget(LOGIN_WIDGET, loginHintLines(true), { placement: "aboveEditor" });
184
+ return "submitted";
185
+ }
186
+ ui.setWidget(LOGIN_WIDGET, loginHintLines(false), { placement: "aboveEditor" });
187
+ ui.setEditorText(LOGIN_COMMAND);
188
+ return "prefilled";
189
+ }
190
+
191
+ /** Register the model route and the login hint on `pi`. Exported so a host that
192
+ * builds its own onboarding extension (over `toolDefinitions`) gets the same
193
+ * first-run login as `qcr onboard`. */
194
+ export function registerLoginRoute(pi: ExtensionAPI, config: LoginRouteConfig): void {
195
+ if (typeof pi.on !== "function") return;
196
+ let shown = false;
197
+ pi.on("session_start", async (_event, ctx) => {
198
+ const outcome = await routeSessionModel(pi, ctx);
199
+ if (!ctx.hasUI || !needsLogin(outcome, ctx.modelRegistry)) return;
200
+ shown = true;
201
+ openLogin(ctx.ui, config.open);
202
+ });
203
+ // pi checks the model's credential after this event, so a login made inside
204
+ // the session (its default model stays the spec's provider) is routed here.
205
+ pi.on("input", async (_event, ctx) => {
206
+ await routeSessionModel(pi, ctx);
207
+ return { action: "continue" };
208
+ });
209
+ pi.on("model_select", (_event, ctx) => {
210
+ if (!shown || !ctx.hasUI) return;
211
+ shown = false;
212
+ ctx.ui.setWidget(LOGIN_WIDGET, undefined);
213
+ });
214
+ }
215
+
216
+ /** The factory, for a pi that loads the route by path (its shim) or a host
217
+ * that composes factories. */
218
+ export function createLoginRoute(config: LoginRouteConfig): ExtensionFactory {
219
+ return (pi) => registerLoginRoute(pi, config);
220
+ }
@@ -38,7 +38,14 @@ import {
38
38
  type StepStatusLine,
39
39
  } from "../src/onboard/engine.js";
40
40
  import { defaultSteps } from "../src/onboard/steps/index.js";
41
+ import { openStepMemoryForward } from "../src/onboard/stepforward.js";
41
42
  import { locateConfig } from "../src/install.js";
43
+ import { registerLoginRoute } from "./login-route.js";
44
+ import {
45
+ ONBOARD_FINISH_TOOL,
46
+ ONBOARD_STATUS_TOOL,
47
+ onboardStepToolName,
48
+ } from "../src/onboard/toolnames.js";
42
49
 
43
50
  const NO_PARAMS = { type: "object", properties: {} } as const;
44
51
 
@@ -71,6 +78,7 @@ export function realAdapters(root: string): OnboardAdapters {
71
78
  // $QCR_CONFIG, else the install's config home (never the checkout's).
72
79
  paths: { stateDir: join(root, "state"), configPath: locateConfig().path },
73
80
  log: (line) => console.error(line),
81
+ memoryForward: (req) => openStepMemoryForward(req),
74
82
  };
75
83
  }
76
84
 
@@ -89,7 +97,14 @@ export function renderStatus(
89
97
  reconciled: ReconcileReport,
90
98
  ): string {
91
99
  const rows = lines.map((l) => {
92
- const mark = l.status === "done" ? "[done]" : l.status === "disabled" ? "[skipped]" : "[ ]";
100
+ const mark =
101
+ l.status === "done"
102
+ ? "[done]"
103
+ : l.status === "disabled"
104
+ ? "[skipped]"
105
+ : l.optional
106
+ ? "[after setup]"
107
+ : "[ ]";
93
108
  return `${mark} ${l.id} — ${l.title}${l.note ? ` (${l.note})` : ""}`;
94
109
  });
95
110
  const demoted = reconciled.demoted.map(
@@ -114,7 +129,7 @@ export function toolDefinitions(
114
129
  shutdown: (ctx?: Pick<ExtensionToolContext, "shutdown">) => void,
115
130
  ): QcrTool[] {
116
131
  const stepTools: QcrTool[] = engine.stepDefs().map((step) => ({
117
- name: `onboard_${step.id}`,
132
+ name: onboardStepToolName(step.id),
118
133
  label: step.title,
119
134
  description:
120
135
  `${step.explain} Deterministic: runs the "${step.id}" onboarding step's real checks and returns one ✓/✗ line per check. ` +
@@ -141,7 +156,7 @@ export function toolDefinitions(
141
156
  }));
142
157
 
143
158
  const status: QcrTool = {
144
- name: "onboard_status",
159
+ name: ONBOARD_STATUS_TOOL,
145
160
  label: "Onboarding status",
146
161
  description:
147
162
  "The checklist: every step in order with its status. Re-verifies each claimed-done step against reality first " +
@@ -155,7 +170,7 @@ export function toolDefinitions(
155
170
  };
156
171
 
157
172
  const finish: QcrTool = {
158
- name: "finish_and_exit",
173
+ name: ONBOARD_FINISH_TOOL,
159
174
  label: "Finish onboarding",
160
175
  description:
161
176
  "Re-run EVERY verification. While anything is red this refuses and returns the failures — it never exits on red. " +
@@ -167,7 +182,7 @@ export function toolDefinitions(
167
182
  const result = await engine.finish();
168
183
  if (!result.ok) {
169
184
  const red = result.results
170
- .filter((r) => !r.ok)
185
+ .filter((r) => !r.ok && !r.optional)
171
186
  .map((r) => `✗ ${r.id}: ${r.failures.join("; ") || "not verified"}`);
172
187
  return text(
173
188
  `Not finished — these verifications are red:\n${red.join("\n")}\n` +
@@ -182,7 +197,8 @@ export function toolDefinitions(
182
197
  return text(
183
198
  `Every step verified green — onboarding is complete (recorded ${result.completed_at}).\n` +
184
199
  `${result.marker_written ? "First-run marker written for the companion greeting." : "First-run marker already present — left untouched."}\n` +
185
- "This session now shuts down and the TUI opens.",
200
+ "This session now shuts down and the TUI opens: the board lists the repository's open pull requests — " +
201
+ "select one and press R to review it now (dry-run: nothing is posted).",
186
202
  );
187
203
  },
188
204
  };
@@ -208,7 +224,20 @@ export function createOnboarding(config: OnboardingConfig): ExtensionFactory {
208
224
  return (pi) => registerOnboarding(pi, config);
209
225
  }
210
226
 
227
+ /**
228
+ * The onboarding session's first-run login: when pi has no usable model
229
+ * login, pi's own /login menu opens with a widget that says which logins work
230
+ * (any OpenAI one), and an OpenAI model whose provider has no login runs on
231
+ * the twin login that exists (extensions/login-route.ts). `qcr onboard`
232
+ * registers it with the tools; a host that builds its own onboarding
233
+ * extension over `toolDefinitions` + `registerQcrTool` calls it too.
234
+ */
235
+ export function registerOnboardingSession(pi: ExtensionAPI): void {
236
+ registerLoginRoute(pi, { open: "submit" });
237
+ }
238
+
211
239
  function registerOnboarding(pi: ExtensionAPI, config: OnboardingConfig): void {
240
+ registerOnboardingSession(pi);
212
241
  if (typeof pi.registerTool !== "function") {
213
242
  // Degrade loudly, never wedge: pi still starts, the guide can only talk.
214
243
  console.error(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quickchatai/quickreview",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "private": false,
5
5
  "//private": "The root is the published `qcr` CLI: the whole app (TUI, daemon, companion, every verb), installed with npm, pnpm or bun. It depends on the pi plugin (packages/pi-plugin) at its exact version and on pi at the exact pins below. Publishing is a release step of its own, never part of a build.",
6
6
  "description": "A 24/7 AI code reviewer for GitHub: a deterministic daemon driving pi review sessions, with an operator TUI and a local qcr review",
@@ -116,7 +116,7 @@
116
116
  },
117
117
  "dependencies": {
118
118
  "@earendil-works/pi-ai": "1.4.0",
119
- "@quickchatai/pi-quickreview": "1.1.0",
119
+ "@quickchatai/pi-quickreview": "1.2.0",
120
120
  "@earendil-works/pi-coding-agent": "1.4.0",
121
121
  "better-sqlite3": "13.0.3",
122
122
  "smol-toml": "1.9.1"
@@ -26,6 +26,33 @@ never as a lecture up front.
26
26
  - **On a fully-finished installation** this session doubles as a diagnostic:
27
27
  `onboard_status` re-verifies everything; report what holds and what broke.
28
28
 
29
+ ## What the person needs, and the fast path
30
+
31
+ Say this near the start, in two or three short lines. They need three things:
32
+ a **model login** (pi's `/login` opens by itself the first time — any working
33
+ OpenAI login is fine), their **GitHub sign-in** (`gh` logged in; on a Boxes VM
34
+ it already is), and **one repository**. Setup ends once the defaults are in
35
+ place and verified; the TUI then opens on the board, which lists the
36
+ repository's open pull requests — they pick one there and press `R` to review
37
+ it.
38
+
39
+ Recommend the fast path and take its defaults unless they ask otherwise:
40
+
41
+ - **topology** — `onboard_topology` with `choice: "local"` (this computer);
42
+ - **GitHub** — `onboard_github_account` with no `github_auth`: where gh is
43
+ signed in it uses their own account by itself. Call it once to get their
44
+ recent repositories, then again with `repo`;
45
+ - **ingress** — `onboard_ingress` with no `choice`: polling is the default
46
+ (the reviewer checks GitHub every few minutes; webhooks can come later);
47
+ - **the first review** — not part of setup: after `finish_and_exit` the board
48
+ lists the open pull requests, and `R` on one starts its review at once, no
49
+ label to add.
50
+
51
+ **Never ask for something no tool takes.** Every question you put to the person
52
+ is a step's input (the tool's parameters say which). If a step asks for nothing,
53
+ do not invent a question for it — run it. When a tool returns a refusal that
54
+ lists options, read those options out; do not add your own.
55
+
29
56
  ## What you teach, when
30
57
 
31
58
  - **At the start** (one short paragraph): QuickReview is a deterministic
@@ -42,33 +69,45 @@ never as a lecture up front.
42
69
  (what the reviewer learns and keeps). Explain each only when its step is in
43
70
  front of you.
44
71
 
45
- ## The last three steps
72
+ ## GitHub, in one step
73
+
74
+ `onboard_github_account` is the GitHub question. On their own account it saves
75
+ their token (0600, never shown — say so), installs a refresh every 20 minutes,
76
+ and creates the trigger labels if their account may. Read out its refresh line
77
+ as it is: on a machine without `crontab` it says what lapses and gives the
78
+ manual command. If they want a GitHub App instead, call it with
79
+ `github_auth: "app"`; the App steps then take over. Never call the App step on
80
+ the own-account route: it is skipped there.
81
+
82
+ ## The last steps
46
83
 
47
84
  - **Bring-up is slow the first time.** Say so before you run it — the tool's
48
85
  own warning is there to be read out — and let its streamed output show. A
49
86
  long build is expected, not a hang.
50
- - **The proof round is the point of the whole session.** Ask the operator for
51
- one real, open pull request of their own and have them add the trigger label
52
- to it. Then follow it. When the review comes back, show it to them and let
53
- them read it: this is their first sight of what the reviewer says, and it
54
- still cannot have posted anywhere.
55
- - **The go-live offer is theirs, and only theirs.** Read out what dry-run is
56
- and what going live means, then ask once and accept the answer. Do not
57
- advocate, do not repeat the offer, and never call the tool with a decision
58
- they did not say. Staying in dry-run is a finished, fully working
59
- installation — say so plainly if they choose it, and mention that they can
60
- flip later whenever they like.
87
+ - **The reviewer needs its own model login.** The review sessions run in the
88
+ daemon's container, and a login never transfers from this machine into it.
89
+ Once the stack is up, the LLM auth step's `daemon_login` check names the one
90
+ command that opens it; ask them to run it in a second terminal, sign in, and
91
+ tell you — then re-run the LLM auth step. Without it the first review on the
92
+ board would fail at once.
93
+ - **The first review and go-live come after setup.** `onboard_proof_round` and
94
+ `onboard_go_live` are marked "after setup": setup finishes without them. Do
95
+ not run them here unless the person asks. Say plainly that the installation
96
+ stays in dry-run (every intended GitHub write is recorded, nothing is
97
+ posted), and that going live is their decision later: re-run `qcr onboard`
98
+ and ask for it once a review on the board has shown them what it says.
61
99
 
62
100
  ## Finishing
63
101
 
64
- When every step reports done, say that `finish_and_exit` will re-verify the
65
- whole checklist one last time and, only if all green, close this session and
66
- open the TUI. If it returns red checks, that is the answer: explain them, fix
102
+ When every setup step reports done (the "after setup" ones need not be), say
103
+ that `finish_and_exit` will re-verify the whole checklist one last time and,
104
+ only if all green, close this session and open the TUI on the board: there they
105
+ select a pull request and press `R` to review it now. If it returns red checks, that is the answer: explain them, fix
67
106
  what can be fixed through the step tools, and try again. Never present
68
107
  onboarding as finished while anything is red, and never tell the operator to
69
108
  quit around a red check.
70
109
 
71
- Before `finish_and_exit`, pass on what comes next, as the go-live step's
72
- `next` line says it: set up the repo with `qcr setup` (or `I` on the TUI
73
- board). Until then the reviewer knows nothing about this codebase. It is a
110
+ Before `finish_and_exit`, pass on what comes next: the first review is `R` on
111
+ a pull request on the board; then set up the repo with `qcr setup` (or `I` on
112
+ the TUI board). Until then the reviewer knows nothing about this codebase. It is a
74
113
  recommendation, once — never start it from here.
@@ -1,15 +1,21 @@
1
1
  #!/usr/bin/env bash
2
- # mint-token.sh — GitHub App installation token for the pi sessions' `gh` prefixing.
2
+ # mint-token.sh — the daemon's GitHub token for the pi sessions' `gh` prefixing
3
+ # and the git credential helper.
3
4
  #
4
- # Shell equivalent of packages/pi-plugin/src/githubAuth.ts:
5
+ # Under `[github] auth = "user"` (the person's own credential, polling-only;
6
+ # SECURITY.md) it prints the token file `<secrets dir>/github_token`
7
+ # that the host-side refresher (`qcr github-token sync`) keeps fresh, and does
8
+ # nothing else: no App, no JWT, no cache. --refresh re-reads the same file.
9
+ #
10
+ # Otherwise (`auth = "app"`, the default) it is the shell equivalent of
11
+ # packages/pi-plugin/src/githubAuth.ts:
5
12
  # * RS256 app JWT, iat = now-60s, exp = iat+9min (≤10 min ceiling)
6
13
  # * installation id resolved via GET /app/installations
7
14
  # * POST /app/installations/{id}/access_tokens for the installation token
8
15
  # * token + expires_at cached; reused while (expires_at - now) > 5 min
9
16
  # * single-flight via an mkdir lock; --refresh re-mints (the 401 path)
10
17
  #
11
- # The app PEM is the only credential — there is no personal-token path here.
12
- # Prints the bare token to stdout. stdlib tools only: bash, openssl, curl, python3.
18
+ # The app PEM is the App route's only credential. Prints the bare token to stdout. stdlib tools only: bash, openssl, curl, python3.
13
19
  #
14
20
  # Usage: mint-token.sh [--refresh]
15
21
  # e.g. GH_TOKEN="$(scripts/mint-token.sh)" gh pr view 123
@@ -63,6 +69,21 @@ cfg_sed() { # crude fallback: first `key = "value"` inside [section]
63
69
  # ~/.config/quickreview-bot). The same answer the daemon's loader reaches.
64
70
  SECRETS_DIR="$(qcr_locate_secrets "$(cfg github secrets_dir || true)")" || exit 1
65
71
 
72
+ # ---- auth = "user": the person's token file, as written ---------------------
73
+
74
+ AUTH="$(cfg github auth 2>/dev/null || true)"
75
+ AUTH="${AUTH:-app}"
76
+ if [[ "$AUTH" == "user" ]]; then
77
+ TOKEN_FILE="$SECRETS_DIR/github_token"
78
+ [[ -r "$TOKEN_FILE" ]] ||
79
+ die "unreadable user token: $TOKEN_FILE ([github] auth = \"user\"; run \`qcr github-token sync\` on the host)"
80
+ token="$(tr -d '[:space:]' < "$TOKEN_FILE")"
81
+ [[ -n "$token" ]] || die "empty user token file: $TOKEN_FILE (run \`qcr github-token sync\` on the host)"
82
+ printf '%s\n' "$token"
83
+ exit 0
84
+ fi
85
+ [[ "$AUTH" == "app" ]] || die "[github] auth must be \"app\" or \"user\" (got \"$AUTH\")"
86
+
66
87
  APP_ID_FILE="$SECRETS_DIR/app_id"
67
88
  PEM_FILE="$SECRETS_DIR/app.pem"
68
89
  [[ -r "$APP_ID_FILE" ]] || die "unreadable app id: $APP_ID_FILE"
package/src/ciretry.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  // is re-queued when its CI turns green, so its session can decide again.
5
5
  //
6
6
  // Nothing here triggers, re-runs or cancels CI: the one CI call is a GET.
7
+ import { botAccountLogin } from "@quickchatai/pi-quickreview/src/identity.js";
7
8
  import {
8
9
  classifyCi,
9
10
  type CheckSummary,
@@ -125,7 +126,7 @@ export async function retryWithheldApproval(
125
126
  { type: "trigger", source: "reconcile" },
126
127
  {},
127
128
  {
128
- botLogin: cfg.github.bot_login,
129
+ botLogin: botAccountLogin(cfg.github),
129
130
  ...(deps.now ? { now: deps.now } : {}),
130
131
  reason: "ci-green:withheld-approval-retry",
131
132
  },