@namzu/cli 14.2.0 → 14.2.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 (33) hide show
  1. package/README.md +8 -6
  2. package/dist/commands/login.d.ts +21 -3
  3. package/dist/commands/login.d.ts.map +1 -1
  4. package/dist/commands/login.js +33 -21
  5. package/dist/commands/login.js.map +1 -1
  6. package/dist/integrations/providers/identity.d.ts +16 -21
  7. package/dist/integrations/providers/identity.d.ts.map +1 -1
  8. package/dist/integrations/providers/identity.js +16 -21
  9. package/dist/integrations/providers/identity.js.map +1 -1
  10. package/dist/integrations/providers/index.d.ts +1 -1
  11. package/dist/integrations/providers/index.d.ts.map +1 -1
  12. package/dist/integrations/providers/index.js +1 -1
  13. package/dist/integrations/providers/index.js.map +1 -1
  14. package/dist/integrations/providers/subscription-login.d.ts +7 -41
  15. package/dist/integrations/providers/subscription-login.d.ts.map +1 -1
  16. package/dist/integrations/providers/subscription-login.js +16 -143
  17. package/dist/integrations/providers/subscription-login.js.map +1 -1
  18. package/dist/tui/App.d.ts.map +1 -1
  19. package/dist/tui/App.js +76 -71
  20. package/dist/tui/App.js.map +1 -1
  21. package/dist/tui/Picker.d.ts +4 -2
  22. package/dist/tui/Picker.d.ts.map +1 -1
  23. package/dist/tui/Picker.js +99 -10
  24. package/dist/tui/Picker.js.map +1 -1
  25. package/dist/tui/StatusBar.d.ts +1 -1
  26. package/dist/tui/StatusBar.d.ts.map +1 -1
  27. package/dist/tui/StatusBar.js +8 -5
  28. package/dist/tui/StatusBar.js.map +1 -1
  29. package/dist/tui/login-prompt.d.ts +0 -1
  30. package/dist/tui/login-prompt.d.ts.map +1 -1
  31. package/dist/tui/login-prompt.js +1 -6
  32. package/dist/tui/login-prompt.js.map +1 -1
  33. package/package.json +4 -4
@@ -10,21 +10,11 @@
10
10
  *
11
11
  * ## The flow
12
12
  *
13
- * Authorization code with PKCE (RFC 7636, S256), redirected to a loopback
14
- * address (RFC 8252 §7.3). Two ways to finish, and BOTH are always offered:
15
- *
16
- * 1. **Loopback.** A one-request server on `127.0.0.1` at the port the
17
- * redirect is registered under. The browser lands on it and the code
18
- * never touches a screen.
19
- * 2. **Paste.** The operator copies the code — or the whole redirect URL —
20
- * out of a browser and hands it back.
21
- *
22
- * The second is not a consolation prize. A container, a remote shell over
23
- * SSH, a machine with no graphical session: none of them can be redirected
24
- * to, and on all of them the loopback server is either unreachable from
25
- * wherever the browser actually is or cannot bind at all. `start()` says
26
- * which of the two it managed to arrange (`loopback`), and the paste path
27
- * works whether or not it did.
13
+ * Authorization code with PKCE (RFC 7636, S256), redirected to the platform
14
+ * callback registered for the owner client's public identity. The operator
15
+ * copies the code — or the whole finished address — back to the initiating
16
+ * surface. This flow deliberately does not invent a localhost redirect: the
17
+ * authorization server rejects an unregistered callback before sign-in.
28
18
  *
29
19
  * ## What never happens here
30
20
  *
@@ -35,12 +25,11 @@
35
25
  * login leaves no partial credential behind.
36
26
  */
37
27
  import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';
38
- import { createServer } from 'node:http';
39
28
  import { writeStoredSubscriptionCredential } from './credential-store.js';
40
- import { AUTHORIZE_URL, MANUAL_REDIRECT_URI, OAUTH_CLIENT_ID, OAUTH_SCOPES, OAUTH_TOKEN_URL, REDIRECT_URI, SUBSCRIPTION_REDIRECT_PORT, } from './identity.js';
29
+ import { AUTHORIZE_URL, MANUAL_REDIRECT_URI, OAUTH_CLIENT_ID, OAUTH_SCOPES, OAUTH_TOKEN_URL, } from './identity.js';
41
30
  import { PROVIDER_REGISTRY } from './registry.js';
42
31
  /**
43
- * Begin a login. Returns the page to open plus the two ways to finish it.
32
+ * Begin a login. Returns the page to open plus the paste-completion handle.
44
33
  *
45
34
  * Deliberately does NOT open a browser. Which of `open`, `xdg-open` or a
46
35
  * Windows protocol handler to spawn — and whether spawning anything is even
@@ -54,7 +43,10 @@ export async function beginSubscriptionLogin(options = {}) {
54
43
  const attemptSignal = options.signal
55
44
  ? AbortSignal.any([options.signal, cancelController.signal])
56
45
  : cancelController.signal;
57
- const exchangeOptions = { ...options, signal: attemptSignal };
46
+ const exchangeOptions = {
47
+ ...options,
48
+ signal: attemptSignal,
49
+ };
58
50
  const verifier = base64Url(randomBytes(32));
59
51
  const challenge = base64Url(createHash('sha256').update(verifier).digest());
60
52
  // An independent value, not the verifier reused.
@@ -65,9 +57,7 @@ export async function beginSubscriptionLogin(options = {}) {
65
57
  // the way — and the secret PKCE exists to keep out of that URL is exactly
66
58
  // the verifier.
67
59
  const state = base64Url(randomBytes(16));
68
- const listener = options.loopback === false ? null : await openLoopback(state, attemptSignal);
69
- attemptSignal.throwIfAborted();
70
- const redirectUri = listener ? REDIRECT_URI : MANUAL_REDIRECT_URI;
60
+ const redirectUri = MANUAL_REDIRECT_URI;
71
61
  let settled = false;
72
62
  const exchangeOnce = async (code, seenState) => {
73
63
  if (settled)
@@ -84,20 +74,6 @@ export async function beginSubscriptionLogin(options = {}) {
84
74
  return {
85
75
  url: authorizeUrl(challenge, state, redirectUri),
86
76
  redirectUri,
87
- loopback: listener !== null,
88
- waitForCallback: () => listener === null
89
- ? null
90
- : listener.received.then((got) => got === null
91
- ? {
92
- ok: false,
93
- reason: 'The sign-in was cancelled before the browser came back.',
94
- }
95
- : got.error
96
- ? {
97
- ok: false,
98
- reason: `The sign-in did not complete (${got.error}). Nothing was stored.`,
99
- }
100
- : exchangeOnce(got.code, got.state)),
101
77
  completeWithPastedCode: async (input) => {
102
78
  const parsed = parsePastedInput(input);
103
79
  if (!parsed.code) {
@@ -110,7 +86,6 @@ export async function beginSubscriptionLogin(options = {}) {
110
86
  },
111
87
  cancel: () => {
112
88
  cancelController.abort(new Error('The sign-in attempt was cancelled.'));
113
- listener?.close();
114
89
  },
115
90
  };
116
91
  }
@@ -199,7 +174,10 @@ async function exchange(code, state, verifier, redirectUri, options) {
199
174
  try {
200
175
  res = await awaitWithSignal(fetchFn(OAUTH_TOKEN_URL, {
201
176
  method: 'POST',
202
- headers: { 'content-type': 'application/json', accept: 'application/json' },
177
+ headers: {
178
+ 'content-type': 'application/json',
179
+ accept: 'application/json',
180
+ },
203
181
  body: JSON.stringify({
204
182
  grant_type: 'authorization_code',
205
183
  client_id: OAUTH_CLIENT_ID,
@@ -286,111 +264,6 @@ async function exchange(code, state, verifier, redirectUri, options) {
286
264
  }
287
265
  return { ok: true, credential, storedAt };
288
266
  }
289
- /**
290
- * A single-purpose listener on the loopback redirect, or `null`.
291
- *
292
- * `null` on every failure to bind — the port is in use (a second namzu, or
293
- * another product's login mid-flight), the sandbox forbids listening, there
294
- * is no loopback interface. None of those is fatal, because the paste path
295
- * does not need this.
296
- */
297
- async function openLoopback(expectedState, signal) {
298
- signal?.throwIfAborted();
299
- let settle = () => { };
300
- const received = new Promise((r) => {
301
- let done = false;
302
- settle = (v) => {
303
- if (done)
304
- return;
305
- done = true;
306
- r(v);
307
- };
308
- });
309
- const server = createServer((req, res) => {
310
- const url = new URL(req.url ?? '/', `http://127.0.0.1:${SUBSCRIPTION_REDIRECT_PORT}`);
311
- const error = url.searchParams.get('error');
312
- const code = url.searchParams.get('code');
313
- const state = url.searchParams.get('state');
314
- const finish = (status, text) => {
315
- res.writeHead(status, { 'content-type': 'text/plain; charset=utf-8' });
316
- res.end(text);
317
- };
318
- if (error) {
319
- finish(400, 'Sign-in did not complete. Return to namzu.');
320
- settle({ code: '', state: '', error });
321
- return;
322
- }
323
- if (!code || !state) {
324
- // Not our redirect — a browser probing the port, a favicon request.
325
- // Answering and NOT settling keeps the listener alive for the real one.
326
- finish(404, 'Not the sign-in callback.');
327
- return;
328
- }
329
- if (!constantTimeEquals(state, expectedState)) {
330
- // Refused here as well as at the exchange. This is the request a
331
- // cross-site attempt would make, and answering it with "done" would
332
- // tell whoever made it that the port is a live login.
333
- finish(400, 'Sign-in did not complete. Return to namzu.');
334
- return;
335
- }
336
- finish(200, 'Signed in. You can close this tab and return to namzu.');
337
- settle({ code, state });
338
- });
339
- let bindOwned = true;
340
- let closeOwned = false;
341
- let abortBind;
342
- const close = () => {
343
- if (closeOwned)
344
- return;
345
- closeOwned = true;
346
- settle(null);
347
- try {
348
- server.close();
349
- }
350
- catch {
351
- // A cancellation can win before `listen()` owns a handle. There is no
352
- // resource to close in that branch, and the bind promise is rejected.
353
- }
354
- };
355
- const bound = await new Promise((resolve, reject) => {
356
- const finish = (value) => {
357
- if (!bindOwned)
358
- return;
359
- bindOwned = false;
360
- resolve(value);
361
- };
362
- abortBind = () => {
363
- if (!bindOwned)
364
- return;
365
- bindOwned = false;
366
- close();
367
- reject(signal?.reason);
368
- };
369
- signal?.addEventListener('abort', abortBind, { once: true });
370
- server.once('error', () => finish(false));
371
- server.listen(SUBSCRIPTION_REDIRECT_PORT, '127.0.0.1', () => finish(true));
372
- if (signal?.aborted)
373
- abortBind();
374
- });
375
- if (abortBind)
376
- signal?.removeEventListener('abort', abortBind);
377
- if (!bound) {
378
- close();
379
- return null;
380
- }
381
- if (signal?.aborted) {
382
- close();
383
- throw signal.reason;
384
- }
385
- signal?.addEventListener('abort', close, { once: true });
386
- return {
387
- received,
388
- close: () => {
389
- signal?.removeEventListener('abort', close);
390
- close();
391
- },
392
- };
393
- }
394
267
  /**
395
268
  * Pull a code (and a state, when there is one) out of whatever got pasted.
396
269
  *
@@ -1 +1 @@
1
- {"version":3,"file":"subscription-login.js","sourceRoot":"","sources":["../../../src/integrations/providers/subscription-login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subscription-login.js","sourceRoot":"","sources":["../../../src/integrations/providers/subscription-login.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAMN,KAAK,OAAO,EAaZ,MAAM,YAAY,CAAA;AAmHnB,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAG/D,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;CACxB;AA8DD,sEAAsE;AACtE,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,MAAM,EAAE,MAAM,MAAM,EACpB,iBAAiB,GAAE,SAAS,MAAM,EAAO,GACvC,SAAS,iBAAiB,EAAE,CA4D9B;AAgED,wBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,QAAQ,2CA+mHhD"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAMN,KAAK,OAAO,EAaZ,MAAM,YAAY,CAAA;AAoHnB,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAG/D,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;CACxB;AA8DD,sEAAsE;AACtE,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,MAAM,EAAE,MAAM,MAAM,EACpB,iBAAiB,GAAE,SAAS,MAAM,EAAO,GACvC,SAAS,iBAAiB,EAAE,CA4D9B;AAgED,wBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,QAAQ,2CA4mHhD"}
package/dist/tui/App.js CHANGED
@@ -19,7 +19,7 @@ import { pinTrustedProjectPath, resolveTrustedProjectContext, } from '../config/
19
19
  import { visibleProjectInstructionPath } from '../context/project-path.js';
20
20
  import { writeClipboardText } from '../integrations/clipboard/text.js';
21
21
  import { terminalNotificationEnabled, writeTerminalNotification, } from '../integrations/notifications/terminal.js';
22
- import { beginCodexDeviceLogin, beginSubscriptionLogin, clearAllStoredCredentials, credentialsPath, primaryProvider, readStoredCodexCredential, readStoredSubscriptionCredential, signedInSubscriptionProviders, writePreferences, } from '../integrations/providers/index.js';
22
+ import { beginCodexDeviceLogin, beginSubscriptionLogin, clearAllStoredCredentials, credentialsPath, parsePastedInput, primaryProvider, readStoredCodexCredential, readStoredSubscriptionCredential, signedInSubscriptionProviders, writePreferences, } from '../integrations/providers/index.js';
23
23
  import { appendMessages, forkConversation, forkConversationBeforeUser, listRecent, loadConversation, openSessions, replaceConversation, requireWritableConversation, setTitle, startConversation, titleOf, } from '../integrations/sessions/store.js';
24
24
  import { conversationMarkdown, writeConversationExport, } from '../integrations/sessions/transcript-export.js';
25
25
  import { isTrusted, trustDir } from '../integrations/trust/store.js';
@@ -836,15 +836,14 @@ export function App({ ctx: initialCtx }) {
836
836
  * nobody can see. Everything this path says goes into `pickerNotice`, which
837
837
  * the picker renders.
838
838
  *
839
- * It uses the browser route only. There is no paste input on this screen,
840
- * and rather than invent one — a second text field beside the credential
841
- * one, on the screen an operator reaches when they are already stuck — the
842
- * no-browser case is handed to `namzu login`, which reads the pasted
843
- * address from standard input and exists for exactly that machine.
839
+ * The registered browser callback shows a code rather than returning to a
840
+ * local listener. The picker therefore owns the matching paste field; sending a
841
+ * first-run operator to another terminal would make the sign-in technically
842
+ * started here but impossible to finish on the screen that started it.
844
843
  */
845
844
  const startLoginFromPicker = useCallback(async (provider, signal) => {
846
845
  if (signal.aborted)
847
- return;
846
+ return 'failed';
848
847
  cancelPendingLogin();
849
848
  if (provider === 'codex') {
850
849
  let start;
@@ -855,11 +854,11 @@ export function App({ ctx: initialCtx }) {
855
854
  if (!signal.aborted) {
856
855
  setPickerNotice(`Could not start Codex sign-in: ${error instanceof Error ? error.message : String(error)}`);
857
856
  }
858
- return;
857
+ return 'failed';
859
858
  }
860
859
  if (signal.aborted) {
861
860
  start.cancel();
862
- return;
861
+ return 'failed';
863
862
  }
864
863
  codexLoginRef.current = start;
865
864
  setPickerNotice(describeCodexDeviceLoginStart({
@@ -869,7 +868,7 @@ export function App({ ctx: initialCtx }) {
869
868
  }));
870
869
  const outcome = await start.waitForCompletion();
871
870
  if (codexLoginRef.current !== start || signal.aborted)
872
- return;
871
+ return 'failed';
873
872
  codexLoginRef.current = null;
874
873
  start.cancel();
875
874
  setPickerNotice(describeLoginOutcome(outcome));
@@ -877,7 +876,7 @@ export function App({ ctx: initialCtx }) {
877
876
  setPickerInitialView('providers');
878
877
  await runProbeRef.current?.(signal);
879
878
  }
880
- return;
879
+ return 'finished';
881
880
  }
882
881
  let start;
883
882
  try {
@@ -885,13 +884,13 @@ export function App({ ctx: initialCtx }) {
885
884
  }
886
885
  catch (err) {
887
886
  if (signal.aborted)
888
- return;
887
+ return 'failed';
889
888
  setPickerNotice(`Could not start a sign-in: ${err instanceof Error ? err.message : String(err)}`);
890
- return;
889
+ return 'failed';
891
890
  }
892
891
  if (signal.aborted) {
893
892
  start.cancel();
894
- return;
893
+ return 'failed';
895
894
  }
896
895
  loginRef.current = start;
897
896
  const cancelForPicker = () => {
@@ -906,36 +905,39 @@ export function App({ ctx: initialCtx }) {
906
905
  signal.addEventListener('abort', cancelForPicker, { once: true });
907
906
  if (signal.aborted) {
908
907
  cancelForPicker();
909
- return;
908
+ return 'failed';
910
909
  }
911
910
  setPickerNotice(describeLoginStart({
912
911
  url: start.url,
913
- loopback: start.loopback,
914
912
  browserOpened: openInBrowser(start.url),
915
- // Named for THIS screen. Telling someone at the picker to type a
916
- // slash command is what made the feature unreachable; telling them
917
- // to run a command in another terminal is something they can do
918
- // from where they are sitting.
919
- completionHint: 'run "namzu login" in a terminal and paste it there',
913
+ completionHint: 'paste it below and press enter',
920
914
  }));
921
- const waiting = start.waitForCallback();
922
- if (!waiting)
923
- return;
924
- const outcome = await waiting;
925
- if (loginRef.current !== start || signal.aborted)
926
- return;
915
+ return 'awaiting-input';
916
+ }, [cancelPendingLogin]);
917
+ const finishLoginFromPicker = useCallback(async (pasted, signal) => {
918
+ const pending = loginRef.current;
919
+ if (!pending) {
920
+ setPickerNotice('There is no Claude sign-in waiting for this code. Start it again.');
921
+ return 'finished';
922
+ }
923
+ if (!parsePastedInput(pasted).code) {
924
+ setPickerNotice('That does not contain an authorization code. Paste the whole finished address, or the code Claude showed.');
925
+ return 'retry';
926
+ }
927
+ const outcome = await pending.completeWithPastedCode(pasted);
928
+ if (loginRef.current !== pending || signal.aborted)
929
+ return 'finished';
927
930
  loginRef.current = null;
928
- cleanup();
931
+ loginAbortCleanupRef.current?.();
929
932
  loginAbortCleanupRef.current = null;
930
- start.cancel();
931
- if (!outcome.ok && outcome.reason.includes('cancelled'))
932
- return;
933
+ pending.cancel();
933
934
  setPickerNotice(describeLoginOutcome(outcome));
934
935
  if (outcome.ok) {
935
936
  setPickerInitialView('providers');
936
937
  await runProbeRef.current?.(signal);
937
938
  }
938
- }, [cancelPendingLogin]);
939
+ return 'finished';
940
+ }, []);
939
941
  const runProbe = useCallback(async (signal) => {
940
942
  try {
941
943
  if (signal?.aborted)
@@ -3240,46 +3242,46 @@ export function App({ ctx: initialCtx }) {
3240
3242
  // Background is left natural — we inherit the terminal's own background
3241
3243
  // and only theme the foreground. Forcing
3242
3244
  // a filled bg left mismatched patches around bordered areas, so we don't.
3243
- return (_jsxs(Box, { flexDirection: "column", children: [phase !== 'ready' ? (_jsx(Banner, { version: ctx.version, session: session, permissionMode: permissionMode, cwd: ctx.cwd })) : null, _jsxs(Box, { flexDirection: "column", paddingX: 1, children: [phase === 'trust' ? (_jsx(TrustPrompt, { cwd: ctx.cwd })) : phase === 'resume' ? (_jsx(ResumePicker, { conversations: resumeList, selected: selectedResume })) : phase === 'edit' ? (_jsx(EditPromptPicker, { prompts: editList, selected: selectedEdit })) : phase === 'picker' ? (_jsx(Picker, { detected: pickerDetected ?? detected, currentProvider: currentProvider, selectionKind: pickerSelectionKind, currentModel: session?.modelSummary ?? null, initialView: pickerInitialView, onSubmit: handlePickerSubmit, onCancel: handlePickerCancel, onCredential: handleTypedCredential, onLogin: (provider, signal) => void startLoginFromPicker(provider, signal), keyEntryFor: keyEntryFor, notice: pickerNotice })) : (_jsxs(_Fragment, { children: [_jsx(TranscriptFrame, { children: _jsx(Transcript, { messages: finalized, pending: messages.find((m) => m.pending) ?? null, state: state, settled: window.settled, resetKey: resetKey, raw: rawOutput, header: phase === 'ready' ? (_jsx(Banner, { version: ctx.version, session: session, permissionMode: permissionMode, cwd: ctx.cwd })) : undefined }) }), spacerRows > 0 ? _jsx(Box, { height: spacerRows }) : null, _jsx(LiveActivity, { activeTools: activeTools, thinking: state === 'thinking' && !messages.some((m) => m.pending) }), permission ? (_jsx(PermissionOverlay, { toolCalls: permission.toolCalls })) : choicePicker ? (_jsx(ChoicePicker, { title: choicePicker.title, notice: choicePicker.notice, options: choicePicker.options, selected: selectedChoice })) : copyPicker ? (_jsx(CopyPicker, { targets: copyPicker.targets, selected: selectedCopy })) : null, _jsxs(ComposerFrame, { focus: state === 'idle' &&
3244
- phase === 'ready' &&
3245
- conversationMutation === null &&
3246
- choicePicker === null &&
3247
- copyPicker === null, hidden: permission !== null || choicePicker !== null || copyPicker !== null, children: [queued.length > 0 &&
3248
- permission === null &&
3249
- choicePicker === null &&
3250
- copyPicker === null ? (_jsx(Box, { paddingX: 1, children: _jsxs(Text, { color: theme.text.muted, children: [queuePause ? '⏸' : '⏎', " ", queued.length, " message", queued.length > 1 ? 's' : '', " queued \u2014", ' ', queuePause
3251
- ? `paused after a ${queuePause.outcome} turn; send a message or change model to continue`
3252
- : 'sending when ready'] }) })) : null, _jsx(Composer, { disabled: phase !== 'ready' ||
3253
- state === 'awaiting-permission' ||
3254
- compacting ||
3255
- conversationMutation !== null, hidden: permission !== null || choicePicker !== null || copyPicker !== null,
3256
- // A turn is running, so Esc is the interrupt and not
3257
- // the composer's clear.
3258
- escapeInterrupts: !compacting && (state === 'thinking' || state === 'tool'), onSubmit: handleSubmit, onNotice: (text) => pushMessage('system', text), onEditPrevious: openPromptEditor, draftToRestore: composerDraft, onDraftRestored: (token) => setComposerDraft((draft) => (draft?.token === token ? null : draft)), userCommands: userCommands, history: history })] })] })), _jsx(Box, { paddingTop: 1, children: _jsx(StatusBar, { cwd: ctx.cwd, provider: session?.providerSummary ?? null, model: session?.modelSummary ?? null, effort: reasoningEffort ?? 'default', goal: phase === 'ready' &&
3259
- state === 'idle' &&
3245
+ return (_jsx(Box, { flexDirection: "column", children: _jsxs(Box, { flexDirection: "column", paddingX: 1, children: [phase === 'trust' ? (_jsx(TrustPrompt, { cwd: ctx.cwd })) : phase === 'resume' ? (_jsx(ResumePicker, { conversations: resumeList, selected: selectedResume })) : phase === 'edit' ? (_jsx(EditPromptPicker, { prompts: editList, selected: selectedEdit })) : phase === 'picker' ? (_jsx(Picker, { detected: pickerDetected ?? detected, currentProvider: currentProvider, selectionKind: pickerSelectionKind, currentModel: session?.modelSummary ?? null, initialView: pickerInitialView, onSubmit: handlePickerSubmit, onCancel: handlePickerCancel, onCredential: handleTypedCredential, onLogin: startLoginFromPicker, onLoginComplete: finishLoginFromPicker, keyEntryFor: keyEntryFor, notice: pickerNotice })) : (_jsxs(_Fragment, { children: [_jsx(TranscriptFrame, { children: _jsx(Transcript, { messages: finalized, pending: messages.find((m) => m.pending) ?? null, state: state, settled: window.settled, resetKey: resetKey, raw: rawOutput, header: phase === 'ready' ? (_jsx(Banner, { version: ctx.version, session: session, permissionMode: permissionMode, cwd: ctx.cwd })) : undefined }) }), spacerRows > 0 ? _jsx(Box, { height: spacerRows }) : null, _jsx(LiveActivity, { activeTools: activeTools, thinking: state === 'thinking' && !messages.some((m) => m.pending) }), permission ? (_jsx(PermissionOverlay, { toolCalls: permission.toolCalls })) : choicePicker ? (_jsx(ChoicePicker, { title: choicePicker.title, notice: choicePicker.notice, options: choicePicker.options, selected: selectedChoice })) : copyPicker ? (_jsx(CopyPicker, { targets: copyPicker.targets, selected: selectedCopy })) : null, _jsxs(ComposerFrame, { focus: state === 'idle' &&
3246
+ phase === 'ready' &&
3260
3247
  conversationMutation === null &&
3261
- !compacting &&
3262
- permission === null &&
3263
3248
  choicePicker === null &&
3264
- copyPicker === null
3265
- ? goalStatusLabel(goalStatus)
3266
- : null, state: state, hint: conversationMutation === 'fork'
3267
- ? 'forking conversation — input is paused'
3268
- : conversationMutation === 'edit'
3269
- ? 'branching before prompt — input is paused'
3270
- : conversationMutation === 'new'
3271
- ? 'starting a fresh conversation — input is paused'
3272
- : compacting
3273
- ? 'compacting conversation — input is paused'
3274
- : permission
3275
- ? hintForPhase(phase, state, session?.hasProvider === true)
3276
- : choicePicker
3277
- ? 'choice open — ↑↓ / 1–9 select · enter apply · esc cancel'
3278
- : copyPicker
3279
- ? 'copy target open — ↑↓ / 1–9 select · esc cancel'
3280
- : goalStatus && phase === 'ready' && state === 'idle'
3281
- ? undefined
3282
- : hintForPhase(phase, state, session?.hasProvider === true), usage: usage, context: context }) })] })] }));
3249
+ copyPicker === null, hidden: permission !== null || choicePicker !== null || copyPicker !== null, children: [queued.length > 0 &&
3250
+ permission === null &&
3251
+ choicePicker === null &&
3252
+ copyPicker === null ? (_jsx(Box, { paddingX: 1, children: _jsxs(Text, { color: theme.text.muted, children: [queuePause ? '⏸' : '⏎', " ", queued.length, " message", queued.length > 1 ? 's' : '', " queued \u2014", ' ', queuePause
3253
+ ? `paused after a ${queuePause.outcome} turn; send a message or change model to continue`
3254
+ : 'sending when ready'] }) })) : null, _jsx(Composer, { disabled: phase !== 'ready' ||
3255
+ state === 'awaiting-permission' ||
3256
+ compacting ||
3257
+ conversationMutation !== null, hidden: permission !== null || choicePicker !== null || copyPicker !== null,
3258
+ // A turn is running, so Esc is the interrupt and not
3259
+ // the composer's clear.
3260
+ escapeInterrupts: !compacting && (state === 'thinking' || state === 'tool'), onSubmit: handleSubmit, onNotice: (text) => pushMessage('system', text), onEditPrevious: openPromptEditor, draftToRestore: composerDraft, onDraftRestored: (token) => setComposerDraft((draft) => (draft?.token === token ? null : draft)), userCommands: userCommands, history: history })] })] })), _jsx(Box, { paddingTop: 1, children: _jsx(StatusBar, { cwd: ctx.cwd, provider: session?.providerSummary ?? null, model: session?.modelSummary ?? null, effort: reasoningEffort ?? 'default', goal: phase === 'ready' &&
3261
+ state === 'idle' &&
3262
+ conversationMutation === null &&
3263
+ !compacting &&
3264
+ permission === null &&
3265
+ choicePicker === null &&
3266
+ copyPicker === null
3267
+ ? goalStatusLabel(goalStatus)
3268
+ : null, state: state, hint: conversationMutation === 'fork'
3269
+ ? 'forking conversation — input is paused'
3270
+ : conversationMutation === 'edit'
3271
+ ? 'branching before prompt — input is paused'
3272
+ : conversationMutation === 'new'
3273
+ ? 'starting a fresh conversation — input is paused'
3274
+ : compacting
3275
+ ? 'compacting conversation — input is paused'
3276
+ : permission
3277
+ ? hintForPhase(phase, state, session?.hasProvider === true)
3278
+ : choicePicker
3279
+ ? 'choice open — ↑↓ / 1–9 select · enter apply · esc cancel'
3280
+ : copyPicker
3281
+ ? 'copy target open — ↑↓ / 1–9 select · esc cancel'
3282
+ : goalStatus && phase === 'ready' && state === 'idle'
3283
+ ? undefined
3284
+ : hintForPhase(phase, state, session?.hasProvider === true), usage: usage, context: context }) })] }) }));
3283
3285
  }
3284
3286
  function Banner({ version, session, permissionMode, cwd, }) {
3285
3287
  const cols = process.stdout.columns ?? 80;
@@ -3335,7 +3337,10 @@ canReturn = false) {
3335
3337
  return 'y approve · n / esc reject · a approve all';
3336
3338
  if (state !== 'idle')
3337
3339
  return 'agent is working — esc to interrupt';
3338
- return '/help · Esc×2 edit previous · @file / Ctrl+V attach · Ctrl+C ×2 to exit';
3340
+ // The composer already points to /help. Keeping the complete key legend in
3341
+ // every idle frame made ordinary conversation read like a permanent setup
3342
+ // screen; only state-specific actions belong in the footer.
3343
+ return '';
3339
3344
  }
3340
3345
  function goalStatusLabel(goal) {
3341
3346
  if (!goal)