@namzu/cli 14.2.0 → 14.3.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 (88) hide show
  1. package/README.md +31 -7
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +7 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/login.d.ts +21 -3
  6. package/dist/commands/login.d.ts.map +1 -1
  7. package/dist/commands/login.js +33 -21
  8. package/dist/commands/login.js.map +1 -1
  9. package/dist/commands/prior-messages.d.ts.map +1 -1
  10. package/dist/commands/prior-messages.js +13 -4
  11. package/dist/commands/prior-messages.js.map +1 -1
  12. package/dist/commands/upgrade.d.ts +25 -0
  13. package/dist/commands/upgrade.d.ts.map +1 -0
  14. package/dist/commands/upgrade.js +182 -0
  15. package/dist/commands/upgrade.js.map +1 -0
  16. package/dist/context/runtime-message.d.ts +4 -0
  17. package/dist/context/runtime-message.d.ts.map +1 -0
  18. package/dist/context/runtime-message.js +20 -0
  19. package/dist/context/runtime-message.js.map +1 -0
  20. package/dist/integrations/providers/identity.d.ts +16 -21
  21. package/dist/integrations/providers/identity.d.ts.map +1 -1
  22. package/dist/integrations/providers/identity.js +16 -21
  23. package/dist/integrations/providers/identity.js.map +1 -1
  24. package/dist/integrations/providers/index.d.ts +1 -1
  25. package/dist/integrations/providers/index.d.ts.map +1 -1
  26. package/dist/integrations/providers/index.js +1 -1
  27. package/dist/integrations/providers/index.js.map +1 -1
  28. package/dist/integrations/providers/subscription-login.d.ts +7 -41
  29. package/dist/integrations/providers/subscription-login.d.ts.map +1 -1
  30. package/dist/integrations/providers/subscription-login.js +16 -143
  31. package/dist/integrations/providers/subscription-login.js.map +1 -1
  32. package/dist/integrations/sessions/transcript-export.d.ts.map +1 -1
  33. package/dist/integrations/sessions/transcript-export.js +10 -1
  34. package/dist/integrations/sessions/transcript-export.js.map +1 -1
  35. package/dist/integrations/sessions/turn-evidence.d.ts.map +1 -1
  36. package/dist/integrations/sessions/turn-evidence.js +9 -1
  37. package/dist/integrations/sessions/turn-evidence.js.map +1 -1
  38. package/dist/integrations/updates.d.ts +7 -1
  39. package/dist/integrations/updates.d.ts.map +1 -1
  40. package/dist/integrations/updates.js +59 -21
  41. package/dist/integrations/updates.js.map +1 -1
  42. package/dist/tui/App.d.ts +3 -1
  43. package/dist/tui/App.d.ts.map +1 -1
  44. package/dist/tui/App.js +287 -96
  45. package/dist/tui/App.js.map +1 -1
  46. package/dist/tui/Composer.d.ts +15 -5
  47. package/dist/tui/Composer.d.ts.map +1 -1
  48. package/dist/tui/Composer.js +73 -8
  49. package/dist/tui/Composer.js.map +1 -1
  50. package/dist/tui/LiveActivity.d.ts +3 -0
  51. package/dist/tui/LiveActivity.d.ts.map +1 -1
  52. package/dist/tui/LiveActivity.js +4 -1
  53. package/dist/tui/LiveActivity.js.map +1 -1
  54. package/dist/tui/Picker.d.ts +4 -2
  55. package/dist/tui/Picker.d.ts.map +1 -1
  56. package/dist/tui/Picker.js +136 -16
  57. package/dist/tui/Picker.js.map +1 -1
  58. package/dist/tui/StatusBar.d.ts +1 -1
  59. package/dist/tui/StatusBar.d.ts.map +1 -1
  60. package/dist/tui/StatusBar.js +8 -5
  61. package/dist/tui/StatusBar.js.map +1 -1
  62. package/dist/tui/Transcript.d.ts +3 -1
  63. package/dist/tui/Transcript.d.ts.map +1 -1
  64. package/dist/tui/Transcript.js +2 -2
  65. package/dist/tui/Transcript.js.map +1 -1
  66. package/dist/tui/agent.d.ts +15 -0
  67. package/dist/tui/agent.d.ts.map +1 -1
  68. package/dist/tui/agent.js +17 -0
  69. package/dist/tui/agent.js.map +1 -1
  70. package/dist/tui/exit-summary.d.ts +6 -0
  71. package/dist/tui/exit-summary.d.ts.map +1 -0
  72. package/dist/tui/exit-summary.js +8 -0
  73. package/dist/tui/exit-summary.js.map +1 -0
  74. package/dist/tui/index.d.ts.map +1 -1
  75. package/dist/tui/index.js +15 -6
  76. package/dist/tui/index.js.map +1 -1
  77. package/dist/tui/log-pane.d.ts +13 -8
  78. package/dist/tui/log-pane.d.ts.map +1 -1
  79. package/dist/tui/log-pane.js +23 -29
  80. package/dist/tui/log-pane.js.map +1 -1
  81. package/dist/tui/login-prompt.d.ts +0 -1
  82. package/dist/tui/login-prompt.d.ts.map +1 -1
  83. package/dist/tui/login-prompt.js +1 -6
  84. package/dist/tui/login-prompt.js.map +1 -1
  85. package/dist/tui/open-browser.d.ts.map +1 -1
  86. package/dist/tui/open-browser.js +27 -9
  87. package/dist/tui/open-browser.js.map +1 -1
  88. package/package.json +7 -7
@@ -3,10 +3,56 @@ import { Box, Text, useInput } from 'ink';
3
3
  import { useCallback, useEffect, useRef, useState } from 'react';
4
4
  import { readClipboardImage } from '../integrations/clipboard/image.js';
5
5
  import { matchSlashCommands } from './slashCommands.js';
6
+ import { terminalDisplayText } from './terminal-display.js';
6
7
  import { theme } from './theme.js';
7
8
  const MAX_SUGGESTIONS = 6;
8
9
  // A single keypress longer than this (with no newline) is treated as a paste.
9
10
  const PASTE_THRESHOLD = 80;
11
+ // A recalled or branch-restored prompt can be much larger than anything the
12
+ // operator typed one key at a time. Keep the exact source in state, but never
13
+ // hand an unbounded string to Ink's wrapping engine. Eight logical tail lines
14
+ // preserve the only edit position this composer exposes: the cursor at the end.
15
+ const COMPOSER_DISPLAY_CODE_UNITS = 2048;
16
+ const COMPOSER_DISPLAY_LINES = 8;
17
+ function composerDisplayValue(source) {
18
+ let start = Math.max(0, source.length - COMPOSER_DISPLAY_CODE_UNITS);
19
+ // Do not begin the view with the low half of a split surrogate pair. Dropping
20
+ // that one half is display-only; the complete pair stays in `source`.
21
+ if (start > 0 &&
22
+ source.charCodeAt(start) >= 0xdc00 &&
23
+ source.charCodeAt(start) <= 0xdfff &&
24
+ source.charCodeAt(start - 1) >= 0xd800 &&
25
+ source.charCodeAt(start - 1) <= 0xdbff) {
26
+ start += 1;
27
+ }
28
+ let newlineCount = 0;
29
+ for (let index = source.length - 1; index >= start; index -= 1) {
30
+ if (source.charCodeAt(index) !== 0x0a)
31
+ continue;
32
+ newlineCount += 1;
33
+ if (newlineCount === COMPOSER_DISPLAY_LINES) {
34
+ start = index + 1;
35
+ break;
36
+ }
37
+ }
38
+ const visible = terminalDisplayText(source.slice(start));
39
+ return start > 0 ? `… ${visible}` : visible;
40
+ }
41
+ /**
42
+ * Terminal Ctrl+W / Unix word-rubout semantics.
43
+ *
44
+ * Punctuation is part of the word: `hello-world` disappears as one unit. The
45
+ * boundary is whitespace, matching the reference composer and the shell habit
46
+ * operators already bring to this key.
47
+ */
48
+ export function deletePreviousWord(source) {
49
+ let index = source.length;
50
+ while (index > 0 && /\s/u.test(source[index - 1] ?? ''))
51
+ index -= 1;
52
+ while (index > 0 && !/\s/u.test(source[index - 1] ?? ''))
53
+ index -= 1;
54
+ return source.slice(0, index);
55
+ }
10
56
  export function Composer({ disabled = false, onSubmit, history, userCommands = [], hidden = false, escapeInterrupts = false, onNotice, onEditPrevious, draftToRestore = null, onDraftRestored, }) {
11
57
  const [value, setValue] = useState('');
12
58
  const [historyIndex, setHistoryIndex] = useState(-1);
@@ -22,6 +68,8 @@ export function Composer({ disabled = false, onSubmit, history, userCommands = [
22
68
  const suggestions = matchSlashCommands(value, userCommands).slice(0, MAX_SUGGESTIONS);
23
69
  const showSuggestions = suggestions.length > 0;
24
70
  const selIdx = Math.min(selected, Math.max(0, suggestions.length - 1));
71
+ const displayValue = composerDisplayValue(value);
72
+ const commandColumnWidth = Math.min(24, Math.max(10, ...suggestions.map((command) => command.name.length + 4)));
25
73
  const reset = useCallback(() => {
26
74
  setValue('');
27
75
  setHistoryIndex(-1);
@@ -59,6 +107,21 @@ export function Composer({ disabled = false, onSubmit, history, userCommands = [
59
107
  return;
60
108
  if (!key.escape && editPreviousArmed)
61
109
  setEditPreviousArmed(false);
110
+ const submit = (mode) => {
111
+ const message = [value, ...pastes]
112
+ .map((s) => s.trim())
113
+ .filter(Boolean)
114
+ .join('\n\n');
115
+ if (message.length === 0 && attachments.length === 0)
116
+ return false;
117
+ const submittedAttachments = attachments.length > 0 ? attachments : undefined;
118
+ if (mode === 'queue')
119
+ onSubmit(message, submittedAttachments, mode);
120
+ else
121
+ onSubmit(message, submittedAttachments);
122
+ reset();
123
+ return true;
124
+ };
62
125
  if (key.return) {
63
126
  if (showSuggestions) {
64
127
  // Run the highlighted command.
@@ -66,11 +129,7 @@ export function Composer({ disabled = false, onSubmit, history, userCommands = [
66
129
  reset();
67
130
  return;
68
131
  }
69
- const message = [value, ...pastes].map((s) => s.trim()).filter(Boolean).join('\n\n');
70
- if (message.length === 0 && attachments.length === 0)
71
- return;
72
- onSubmit(message, attachments.length > 0 ? attachments : undefined);
73
- reset();
132
+ submit('submit');
74
133
  return;
75
134
  }
76
135
  if (key.tab) {
@@ -78,7 +137,9 @@ export function Composer({ disabled = false, onSubmit, history, userCommands = [
78
137
  // Complete to the highlighted command, ready for arguments.
79
138
  setValue(`/${suggestions[selIdx]?.name ?? ''} `);
80
139
  setSelected(0);
140
+ return;
81
141
  }
142
+ submit('queue');
82
143
  return;
83
144
  }
84
145
  if (key.escape) {
@@ -140,13 +201,13 @@ export function Composer({ disabled = false, onSubmit, history, userCommands = [
140
201
  setValue(history[history.length - 1 - next] ?? '');
141
202
  return;
142
203
  }
143
- // Ctrl+V: pull an image off the clipboard and hold it as an attachment.
204
+ // Ctrl+V / Alt+V: pull an image off the clipboard and hold it as an attachment.
144
205
  //
145
206
  // Every outcome says something. The status bar advertises this key, so
146
207
  // a press that produces no chip and no words is indistinguishable from
147
208
  // a key that was never wired up — and the operator's next move differs
148
209
  // per reason: copy an image, install a tool, or stop pressing it.
149
- if (key.ctrl && input === 'v') {
210
+ if ((key.ctrl || key.meta) && input === 'v') {
150
211
  const read = readClipboardImage();
151
212
  if (read.kind === 'image') {
152
213
  setAttachments((p) => [...p, read.image]);
@@ -159,6 +220,10 @@ export function Composer({ disabled = false, onSubmit, history, userCommands = [
159
220
  }
160
221
  return;
161
222
  }
223
+ if (key.ctrl && input === 'w') {
224
+ setValue(deletePreviousWord);
225
+ return;
226
+ }
162
227
  if (key.ctrl || key.meta)
163
228
  return;
164
229
  if (input.length === 0)
@@ -179,7 +244,7 @@ export function Composer({ disabled = false, onSubmit, history, userCommands = [
179
244
  return null;
180
245
  const promptGlyph = disabled ? '…' : '>';
181
246
  const showPlaceholder = !disabled && value.length === 0 && !editPreviousArmed;
182
- return (_jsxs(Box, { flexDirection: "column", children: [pastes.length > 0 || attachments.length > 0 ? (_jsxs(Box, { flexDirection: "column", paddingX: 1, paddingBottom: 1, children: [attachments.map((attachment, i) => (_jsxs(Text, { color: theme.accent.tool, children: ["\u2398 ", attachmentLabel(attachment, i)] }, `attachment-${i}`))), pastes.map((p, i) => (_jsxs(Text, { color: theme.text.secondary, children: ["\u2398 Pasted text #", i + 1, " (+", p.split('\n').length, " lines)"] }, `paste-${i}`)))] })) : null, _jsxs(Box, { paddingX: 1, children: [_jsx(Box, { width: 2, flexShrink: 0, children: _jsx(Text, { color: disabled ? theme.text.muted : theme.accent.user, bold: true, children: promptGlyph }) }), _jsx(Box, { flexGrow: 1, children: showPlaceholder ? (_jsx(Text, { color: theme.text.muted, children: "Type a message\u2026 (/help for commands)" })) : editPreviousArmed ? (_jsx(Text, { color: theme.text.muted, children: "Press Esc again to edit a previous prompt" })) : (_jsxs(Text, { color: disabled ? theme.text.muted : theme.text.primary, wrap: "wrap", children: [value, disabled ? null : _jsx(Text, { color: theme.border.focus, children: "\u258F" })] })) })] }), showSuggestions ? (_jsx(Box, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: suggestions.map((cmd, i) => (_jsxs(Box, { children: [_jsx(Box, { width: 12, flexShrink: 0, children: _jsxs(Text, { color: i === selIdx ? theme.accent.user : theme.text.secondary, bold: i === selIdx, children: [i === selIdx ? '› ' : ' ', "/", cmd.name] }) }), _jsx(Text, { color: theme.text.muted, children: cmd.description })] }, cmd.name))) })) : null] }));
247
+ return (_jsxs(Box, { flexDirection: "column", children: [pastes.length > 0 || attachments.length > 0 ? (_jsxs(Box, { flexDirection: "column", paddingX: 1, paddingBottom: 1, children: [attachments.map((attachment, i) => (_jsxs(Text, { color: theme.accent.tool, children: ["\u2398 ", attachmentLabel(attachment, i)] }, `attachment-${i}`))), pastes.map((p, i) => (_jsxs(Text, { color: theme.text.secondary, children: ["\u2398 Pasted text #", i + 1, " (+", p.split('\n').length, " lines)"] }, `paste-${i}`)))] })) : null, _jsxs(Box, { paddingX: 1, children: [_jsx(Box, { width: 2, flexShrink: 0, children: _jsx(Text, { color: disabled ? theme.text.muted : theme.accent.user, bold: true, children: promptGlyph }) }), _jsx(Box, { flexGrow: 1, children: showPlaceholder ? (_jsx(Text, { color: theme.text.muted, children: "Type a message\u2026 (/help for commands)" })) : editPreviousArmed ? (_jsx(Text, { color: theme.text.muted, children: "Press Esc again to edit a previous prompt" })) : (_jsxs(Text, { color: disabled ? theme.text.muted : theme.text.primary, wrap: "wrap", children: [displayValue, disabled ? null : _jsx(Text, { color: theme.border.focus, children: "\u258F" })] })) })] }), showSuggestions ? (_jsx(Box, { flexDirection: "column", paddingX: 1, paddingTop: 1, width: "100%", children: suggestions.map((cmd, i) => (_jsxs(Box, { width: "100%", flexDirection: "row", children: [_jsx(Box, { width: commandColumnWidth, flexShrink: 0, children: _jsxs(Text, { color: i === selIdx ? theme.accent.user : theme.text.secondary, bold: i === selIdx, children: [i === selIdx ? '› ' : ' ', "/", cmd.name] }) }), _jsx(Box, { flexGrow: 1, minWidth: 0, children: _jsx(Text, { color: theme.text.muted, wrap: "wrap", children: cmd.description }) })] }, cmd.name))) })) : null] }));
183
248
  }
184
249
  function attachmentLabel(attachment, index) {
185
250
  if (attachment.type === 'stored') {
@@ -1 +1 @@
1
- {"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../src/tui/Composer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../src/tui/Composer.tsx"],"names":[],"mappings":"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"}
@@ -10,6 +10,9 @@ export interface ActiveTool {
10
10
  /** Display label, e.g. `Bash(npm test)`. */
11
11
  readonly label: string;
12
12
  readonly startedAt: number;
13
+ /** Latest bounded progress state; intermediate updates are intentionally coalesced. */
14
+ readonly progress?: string;
15
+ readonly fraction?: number;
13
16
  }
14
17
  export interface LiveActivityProps {
15
18
  readonly activeTools: readonly ActiveTool[];
@@ -1 +1 @@
1
- {"version":3,"file":"LiveActivity.d.ts","sourceRoot":"","sources":["../../src/tui/LiveActivity.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAA;IAC3C,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC1B;AAID,wBAAgB,YAAY,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,iBAAiB,kDAgCxE;AAaD,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMhD"}
1
+ {"version":3,"file":"LiveActivity.d.ts","sourceRoot":"","sources":["../../src/tui/LiveActivity.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAA;IAC3C,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC1B;AAID,wBAAgB,YAAY,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,iBAAiB,kDA6CxE;AAaD,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMhD"}
@@ -19,7 +19,10 @@ export function LiveActivity({ activeTools, thinking }) {
19
19
  const spinner = SPINNER_FRAMES[tick % SPINNER_FRAMES.length] ?? '⠋';
20
20
  const now = Date.now();
21
21
  if (activeTools.length > 0) {
22
- return (_jsx(Box, { flexDirection: "column", children: activeTools.map((t) => (_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { width: 2, flexShrink: 0, children: _jsx(Text, { color: theme.accent.tool, children: spinner }) }), _jsxs(Text, { color: theme.text.secondary, wrap: "truncate-end", children: [terminalDisplayText(t.label), _jsxs(Text, { color: theme.text.muted, children: [" \u00B7 ", formatElapsed(now - t.startedAt)] })] })] }, t.id))) }));
22
+ return (_jsx(Box, { flexDirection: "column", children: activeTools.map((t) => {
23
+ const percent = t.fraction === undefined ? '' : `${Math.round(t.fraction * 100)}% · `;
24
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { width: 2, flexShrink: 0, children: _jsx(Text, { color: theme.accent.tool, children: spinner }) }), _jsxs(Text, { color: theme.text.secondary, wrap: "truncate-end", children: [terminalDisplayText(t.label), _jsxs(Text, { color: theme.text.muted, children: [" \u00B7 ", formatElapsed(now - t.startedAt)] })] })] }), t.progress !== undefined ? (_jsx(Box, { flexDirection: "row", paddingLeft: 2, children: _jsxs(Text, { color: theme.text.muted, wrap: "truncate-end", children: [percent, terminalDisplayText(t.progress)] }) })) : null] }, t.id));
25
+ }) }));
23
26
  }
24
27
  return (_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { width: 2, flexShrink: 0, children: _jsx(Text, { color: theme.accent.assistant, children: spinner }) }), _jsx(Text, { color: theme.text.muted, children: "thinking\u2026" })] }));
25
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LiveActivity.js","sourceRoot":"","sources":["../../src/tui/LiveActivity.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LiveActivity.js","sourceRoot":"","sources":["../../src/tui/LiveActivity.tsx"],"names":[],"mappings":"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"}
@@ -52,7 +52,9 @@ export interface PickerProps {
52
52
  * sources it scans, offered a key to paste, and said to restart, while a
53
53
  * working sign-in sat one unreachable keystroke away.
54
54
  */
55
- readonly onLogin?: (provider: SubscriptionProviderId, signal: AbortSignal) => void;
55
+ readonly onLogin?: (provider: SubscriptionProviderId, signal: AbortSignal) => Promise<'awaiting-input' | 'finished' | 'failed'>;
56
+ /** Finish the browser flow from the code/address pasted into this picker. */
57
+ readonly onLoginComplete?: (input: string, signal: AbortSignal) => Promise<'retry' | 'finished'>;
56
58
  /**
57
59
  * Seam for tests: how a typed key is checked. Defaulted to the real thing,
58
60
  * so no production caller knows this exists.
@@ -90,5 +92,5 @@ export interface PickerProps {
90
92
  */
91
93
  readonly notice?: string | null;
92
94
  }
93
- export declare function Picker({ detected, currentProvider, selectionKind, currentModel, initialView, onSubmit, onCancel, describeModels, onCredential, onLogin, verify, keyEntryFor, notice, }: PickerProps): import("react/jsx-runtime").JSX.Element;
95
+ export declare function Picker({ detected, currentProvider, selectionKind, currentModel, initialView, onSubmit, onCancel, describeModels, onCredential, onLogin, onLoginComplete, verify, keyEntryFor, notice, }: PickerProps): import("react/jsx-runtime").JSX.Element;
94
96
  //# sourceMappingURL=Picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Picker.d.ts","sourceRoot":"","sources":["../../src/tui/Picker.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAEN,KAAK,gBAAgB,EAErB,KAAK,UAAU,EAEf,KAAK,sBAAsB,EAE3B,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,KAAK,YAAY,EAA0B,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAWxF,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAA;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,oBAAoB,GAAG,wBAAwB,CAAA;IACxE,8EAA8E;IAC9E,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,eAAe,CAAA;IACpD,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE,WAAW,KAAK,IAAI,CAAA;IACjG,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CACzB,EAAE,EAAE,UAAU,EACd,GAAG,EAAE,gBAAgB,EACrB,MAAM,CAAC,EAAE,WAAW,KAChB,OAAO,CAAC,YAAY,CAAC,CAAA;IAC1B;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CACvB,UAAU,EAAE,gBAAgB,EAC5B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,KACf,IAAI,CAAA;IACT;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,EAAE,MAAM,EAAE,WAAW,KAAK,IAAI,CAAA;IAClF;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,gBAAgB,CAAA;IACzC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IACxC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AA4BD,wBAAgB,MAAM,CAAC,EACtB,QAAQ,EACR,eAAe,EACf,aAAoC,EACpC,YAAY,EACZ,WAAyB,EACzB,QAAQ,EACR,QAAQ,EACR,cAAuC,EACvC,YAAY,EACZ,OAAO,EACP,MAAyB,EACzB,WAAW,EACX,MAAM,GACN,EAAE,WAAW,2CAsiBb"}
1
+ {"version":3,"file":"Picker.d.ts","sourceRoot":"","sources":["../../src/tui/Picker.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAEN,KAAK,gBAAgB,EAErB,KAAK,UAAU,EAGf,KAAK,sBAAsB,EAE3B,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,KAAK,YAAY,EAA0B,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAWxF,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAA;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,oBAAoB,GAAG,wBAAwB,CAAA;IACxE,8EAA8E;IAC9E,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,eAAe,CAAA;IACpD,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE,WAAW,KAAK,IAAI,CAAA;IACjG,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CACzB,EAAE,EAAE,UAAU,EACd,GAAG,EAAE,gBAAgB,EACrB,MAAM,CAAC,EAAE,WAAW,KAChB,OAAO,CAAC,YAAY,CAAC,CAAA;IAC1B;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CACvB,UAAU,EAAE,gBAAgB,EAC5B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,KACf,IAAI,CAAA;IACT;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAClB,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,WAAW,KACf,OAAO,CAAC,gBAAgB,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAA;IACtD,6EAA6E;IAC7E,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,GAAG,UAAU,CAAC,CAAA;IAChG;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,gBAAgB,CAAA;IACzC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IACxC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AA2DD,wBAAgB,MAAM,CAAC,EACtB,QAAQ,EACR,eAAe,EACf,aAAoC,EACpC,YAAY,EACZ,WAAyB,EACzB,QAAQ,EACR,QAAQ,EACR,cAAuC,EACvC,YAAY,EACZ,OAAO,EACP,eAAe,EACf,MAAyB,EACzB,WAAW,EACX,MAAM,GACN,EAAE,WAAW,2CAyrBb"}
@@ -9,7 +9,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
9
9
  */
10
10
  import { Box, Text, useInput } from 'ink';
11
11
  import { useCallback, useEffect, useRef, useState } from 'react';
12
- import { ALL_PROVIDER_IDS, PROVIDER_REGISTRY, unsupportedProviderMessage, } from '../integrations/providers/index.js';
12
+ import { ALL_PROVIDER_IDS, PROVIDER_REGISTRY, signedInSubscriptionProviders, unsupportedProviderMessage, } from '../integrations/providers/index.js';
13
13
  import { describeProviderModels, verifyCredential } from './agent.js';
14
14
  import { classifyCredential, describeDisposition, keyLooksUsable, maskKey, sessionCredential, } from './credential-entry.js';
15
15
  import { modelStep } from './model-choices.js';
@@ -21,6 +21,24 @@ function keyCapableProviders() {
21
21
  function subscriptionProviders() {
22
22
  return ALL_PROVIDER_IDS.map((id) => PROVIDER_REGISTRY[id]).filter((entry) => entry.subscriptionLogin !== undefined);
23
23
  }
24
+ /**
25
+ * The subscription screen offers two different operations and names both.
26
+ *
27
+ * A detected subscription session is already usable and must not be presented
28
+ * as a new OAuth flow. Conversely, a provider with no usable device session is
29
+ * still a valid new sign-in target. Keeping both rows means `/login` can switch
30
+ * to an owner CLI session without overwriting it, while still allowing a fresh
31
+ * Namzu-owned credential when the operator explicitly asks for one.
32
+ */
33
+ function subscriptionChoices(detected) {
34
+ return [
35
+ ...signedInSubscriptionProviders(detected).map((provider) => ({ kind: 'existing', detected: provider })),
36
+ ...subscriptionProviders().map((entry) => ({ kind: 'sign-in', entry })),
37
+ ];
38
+ }
39
+ function signInChoiceIndex(choices, provider) {
40
+ return choices.findIndex((choice) => choice.kind === 'sign-in' && choice.entry.id === provider);
41
+ }
24
42
  /**
25
43
  * The provider `k` opens entry for.
26
44
  *
@@ -36,7 +54,7 @@ function keyEntryTarget(keyEntryFor) {
36
54
  }
37
55
  return keyCapableProviders()[0] ?? null;
38
56
  }
39
- export function Picker({ detected, currentProvider, selectionKind = 'provider-and-model', currentModel, initialView = 'providers', onSubmit, onCancel, describeModels = describeProviderModels, onCredential, onLogin, verify = verifyCredential, keyEntryFor, notice, }) {
57
+ export function Picker({ detected, currentProvider, selectionKind = 'provider-and-model', currentModel, initialView = 'providers', onSubmit, onCancel, describeModels = describeProviderModels, onCredential, onLogin, onLoginComplete, verify = verifyCredential, keyEntryFor, notice, }) {
40
58
  /**
41
59
  * The one foreign operation still allowed to publish into this picker.
42
60
  *
@@ -79,6 +97,7 @@ export function Picker({ detected, currentProvider, selectionKind = 'provider-an
79
97
  const [modelPhase, setModelPhase] = useState(null);
80
98
  const [loginPhase, setLoginPhase] = useState(initialView === 'subscriptions');
81
99
  useEffect(() => setLoginPhase(initialView === 'subscriptions'), [initialView]);
100
+ const [loginEntry, setLoginEntry] = useState(null);
82
101
  // Key entry. `value` is the secret and never leaves this component except as
83
102
  // a mask or as the credential handed to `onCredential`.
84
103
  //
@@ -136,7 +155,72 @@ export function Picker({ detected, currentProvider, selectionKind = 'provider-an
136
155
  // another choice aborts it, so a late session cannot replace the newer one.
137
156
  onCredential?.(cred, describeDisposition(entry, verification, kind), operation.controller.signal);
138
157
  };
158
+ const acceptLogin = async () => {
159
+ const entry = loginEntry;
160
+ const operation = operationRef.current;
161
+ if (!entry || entry.status !== 'typing' || !operation || !onLoginComplete)
162
+ return;
163
+ if (entry.value.trim().length === 0) {
164
+ setLoginEntry({
165
+ ...entry,
166
+ problem: 'Paste the authorization code or finished address first.',
167
+ });
168
+ return;
169
+ }
170
+ setLoginEntry({ ...entry, status: 'checking', problem: undefined });
171
+ try {
172
+ const disposition = await onLoginComplete(entry.value, operation.controller.signal);
173
+ if (!ownsOperation(operation))
174
+ return;
175
+ if (disposition === 'retry') {
176
+ setLoginEntry({
177
+ ...entry,
178
+ status: 'typing',
179
+ problem: 'That value could not finish this sign-in. Check the address or code and try again.',
180
+ });
181
+ return;
182
+ }
183
+ finishOperation(operation);
184
+ setLoginEntry(null);
185
+ }
186
+ catch (error) {
187
+ if (!ownsOperation(operation))
188
+ return;
189
+ setLoginEntry({
190
+ ...entry,
191
+ status: 'typing',
192
+ problem: `Could not finish sign-in: ${error instanceof Error ? error.message : String(error)}`,
193
+ });
194
+ }
195
+ };
139
196
  useInput((input, key) => {
197
+ if (loginEntry) {
198
+ if (key.escape) {
199
+ invalidateOperation();
200
+ setLoginEntry(null);
201
+ return;
202
+ }
203
+ if (loginEntry.status !== 'typing')
204
+ return;
205
+ if (key.return) {
206
+ void acceptLogin();
207
+ return;
208
+ }
209
+ if (key.backspace || key.delete) {
210
+ setLoginEntry((current) => current
211
+ ? {
212
+ ...current,
213
+ value: current.value.slice(0, -1),
214
+ problem: undefined,
215
+ }
216
+ : current);
217
+ return;
218
+ }
219
+ if (input && !key.ctrl && !key.meta) {
220
+ setLoginEntry((current) => current ? { ...current, value: current.value + input, problem: undefined } : current);
221
+ }
222
+ return;
223
+ }
140
224
  // Key entry owns the keyboard while it is open: every printable character
141
225
  // is part of a secret, so nothing here may fall through to a shortcut.
142
226
  if (keyEntry) {
@@ -186,8 +270,9 @@ export function Picker({ detected, currentProvider, selectionKind = 'provider-an
186
270
  if (canLogin && (input === 'l' || input === 'L')) {
187
271
  invalidateOperation();
188
272
  setLoginPhase(true);
273
+ const choices = subscriptionChoices(detected);
189
274
  setCursor(loginTarget?.subscriptionLogin
190
- ? Math.max(0, subscriptionProviders().findIndex((entry) => entry.id === loginTarget.id))
275
+ ? Math.max(0, signInChoiceIndex(choices, loginTarget.id))
191
276
  : 0);
192
277
  return;
193
278
  }
@@ -223,7 +308,7 @@ export function Picker({ detected, currentProvider, selectionKind = 'provider-an
223
308
  return;
224
309
  }
225
310
  if (loginPhase) {
226
- const choices = subscriptionProviders();
311
+ const choices = subscriptionChoices(detected);
227
312
  if (key.upArrow) {
228
313
  setCursor((current) => Math.max(0, current - 1));
229
314
  return;
@@ -234,18 +319,39 @@ export function Picker({ detected, currentProvider, selectionKind = 'provider-an
234
319
  }
235
320
  if (key.return) {
236
321
  const chosen = choices[cursor];
237
- if (!chosen || !chosen.subscriptionLogin)
322
+ if (!chosen)
323
+ return;
324
+ if (chosen.kind === 'existing') {
325
+ const operation = beginOperation();
326
+ onSubmit({ provider: chosen.detected.entry.id }, operation.controller.signal);
238
327
  return;
239
- const operation = beginOperation();
240
- try {
241
- onLogin?.(chosen.id, operation.controller.signal);
242
328
  }
243
- catch (error) {
244
- if (ownsOperation(operation)) {
245
- finishOperation(operation);
246
- setErrorHint(`Could not start sign-in: ${error instanceof Error ? error.message : String(error)}`);
247
- }
329
+ if (!chosen.entry.subscriptionLogin)
330
+ return;
331
+ if (!onLogin) {
332
+ setErrorHint('Subscription sign-in is not available on this screen.');
333
+ return;
248
334
  }
335
+ const operation = beginOperation();
336
+ setLoginEntry({ entry: chosen.entry, value: '', status: 'starting' });
337
+ void onLogin(chosen.entry.id, operation.controller.signal)
338
+ .then((disposition) => {
339
+ if (!ownsOperation(operation))
340
+ return;
341
+ if (disposition === 'awaiting-input') {
342
+ setLoginEntry({ entry: chosen.entry, value: '', status: 'typing' });
343
+ return;
344
+ }
345
+ finishOperation(operation);
346
+ setLoginEntry(null);
347
+ })
348
+ .catch((error) => {
349
+ if (!ownsOperation(operation))
350
+ return;
351
+ finishOperation(operation);
352
+ setLoginEntry(null);
353
+ setErrorHint(`Could not start sign-in: ${error instanceof Error ? error.message : String(error)}`);
354
+ });
249
355
  return;
250
356
  }
251
357
  const selected = Number.parseInt(input, 10);
@@ -346,6 +452,13 @@ export function Picker({ detected, currentProvider, selectionKind = 'provider-an
346
452
  // Above every screen this picker draws, so the reason is on the same frame as
347
453
  // the choice it is asking for.
348
454
  const noticeBox = notice ? (_jsx(Box, { paddingBottom: 1, children: _jsx(Text, { color: theme.status.warn, children: notice }) })) : null;
455
+ if (loginEntry) {
456
+ const waitsForDeviceApproval = loginEntry.entry.subscriptionLogin === 'device';
457
+ const painted = loginEntry.value
458
+ ? `${'•'.repeat(Math.min(loginEntry.value.length, 32))}${loginEntry.value.length > 32 ? '…' : ''}`
459
+ : '(nothing pasted yet)';
460
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.border.focus, paddingX: 1, children: [noticeBox, _jsxs(Text, { color: theme.accent.system, bold: true, children: ["Complete ", loginEntry.entry.label, " sign-in"] }), waitsForDeviceApproval ? (_jsx(Text, { color: theme.text.muted, children: "Approve the device code shown above in your browser. esc cancels." })) : (_jsxs(_Fragment, { children: [_jsx(Text, { color: theme.text.muted, children: "Paste the authorization code, or the finished browser address, then press enter. esc cancels." }), _jsx(Box, { paddingTop: 1, children: _jsx(Text, { color: loginEntry.value ? theme.text.primary : theme.text.muted, children: painted }) })] })), _jsxs(Box, { paddingTop: 1, flexDirection: "column", children: [loginEntry.status === 'starting' ? (_jsx(Text, { color: theme.text.muted, children: waitsForDeviceApproval ? 'Waiting for browser approval…' : 'Starting browser sign-in…' })) : loginEntry.status === 'checking' ? (_jsx(Text, { color: theme.text.muted, children: "Finishing sign-in\u2026" })) : null, loginEntry.problem ? _jsx(Text, { color: theme.status.warn, children: loginEntry.problem }) : null] })] }));
461
+ }
349
462
  if (keyEntry) {
350
463
  const { entry } = keyEntry;
351
464
  // What the operator has typed SO FAR, classified live. It settles as they
@@ -359,15 +472,22 @@ export function Picker({ detected, currentProvider, selectionKind = 'provider-an
359
472
  return (_jsxs(Box, { flexDirection: "column", children: [noticeBox, _jsx(ModelStepView, { providerLabel: modelPhase.provider.entry.label, step: modelPhase.step, cursor: cursor, errorHint: errorHint })] }));
360
473
  }
361
474
  if (loginPhase) {
362
- const choices = subscriptionProviders();
363
- return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.border.focus, paddingX: 1, children: [noticeBox, _jsx(Text, { color: theme.accent.system, bold: true, children: "Choose a subscription" }), _jsx(Text, { color: theme.text.muted, children: "Use an existing device session when one is available; this creates a Namzu-owned sign-in." }), _jsx(Box, { flexDirection: "column", paddingTop: 1, children: choices.map((entry, index) => (_jsxs(Text, { color: index === cursor ? theme.text.primary : theme.text.muted, children: [index === cursor ? '❯' : ' ', " ", index + 1, ". ", entry.label, entry.subscriptionLogin === 'device' ? ' · device code' : ' · browser sign-in'] }, entry.id))) }), _jsxs(Box, { paddingTop: 1, flexDirection: "column", children: [_jsx(Text, { color: theme.text.muted, children: "\u2191\u2193 or 1-2 navigate \u00B7 enter sign in \u00B7 esc back" }), errorHint ? _jsx(Text, { color: theme.status.warn, children: errorHint }) : null] })] }));
475
+ const choices = subscriptionChoices(detected);
476
+ const existingCount = choices.filter((choice) => choice.kind === 'existing').length;
477
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.border.focus, paddingX: 1, children: [noticeBox, _jsx(Text, { color: theme.accent.system, bold: true, children: "Choose a subscription session" }), _jsx(Text, { color: theme.text.muted, children: existingCount > 0
478
+ ? 'Reuse a signed-in device session, or start a separate Namzu-owned sign-in.'
479
+ : 'No usable Claude or Codex device session was found. Start a new subscription sign-in.' }), _jsx(Box, { flexDirection: "column", paddingTop: 1, children: choices.map((choice, index) => (_jsxs(Text, { color: index === cursor ? theme.text.primary : theme.text.muted, children: [index === cursor ? '❯' : ' ', " ", index + 1, ".", ' ', choice.kind === 'existing'
480
+ ? `Use existing ${choice.detected.entry.label} · ${describeSource(choice.detected)}`
481
+ : `Sign in to ${choice.entry.label} · ${choice.entry.subscriptionLogin === 'device' ? 'device code' : 'browser'}`] }, `${choice.kind}-${choice.kind === 'existing' ? choice.detected.entry.id : choice.entry.id}`))) }), _jsxs(Box, { paddingTop: 1, flexDirection: "column", children: [_jsxs(Text, { color: theme.text.muted, children: ["\u2191\u2193 or 1-", choices.length, " navigate \u00B7 enter use \u00B7 esc back"] }), errorHint ? _jsx(Text, { color: theme.status.warn, children: errorHint }) : null] })] }));
364
482
  }
365
483
  // Non-null exactly when `k` is live on the populated list — the same
366
484
  // condition the key handler uses, read from one place so the hint and the
367
485
  // keyboard cannot drift apart.
368
486
  const entryTarget = keyEntryFor && onCredential ? keyEntryTarget(keyEntryFor) : null;
369
487
  if (detected.length === 0) {
370
- return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.status.warn, paddingX: 1, children: [noticeBox, _jsx(Text, { color: theme.status.warn, bold: true, children: "No providers detected" }), _jsxs(Box, { paddingTop: 1, flexDirection: "column", children: [_jsx(Text, { color: theme.text.primary, children: "namzu scans these sources, in order, for an LLM credential:" }), _jsxs(Text, { color: theme.text.muted, children: [' ', "\u00B7 existing", ' ', subscriptionProviders().map((entry) => entry.label).join(' and '), " sessions on this device"] }), _jsxs(Text, { color: theme.text.muted, children: [' ', "\u00B7 subscriptions signed in to from namzu (~/.namzu/credentials.json)"] }), _jsxs(Text, { color: theme.text.muted, children: [' ', "\u00B7 env vars / API keys (optional alternatives: ANTHROPIC_API_KEY, OPENAI_API_KEY, \u2026)"] }), _jsxs(Text, { color: theme.text.muted, children: [' ', "\u00B7 local servers (Ollama localhost:11434, LM Studio localhost:1234)"] })] }), onLogin ? (_jsx(Box, { paddingTop: 1, children: _jsxs(Text, { color: theme.text.primary, children: ["Press ", _jsx(Text, { color: theme.accent.system, children: "l" }), " to sign in with a subscription \u2014 no API key, and namzu keeps it for next time."] }) })) : null, _jsx(Box, { paddingTop: 1, children: _jsxs(Text, { color: theme.text.primary, children: ["Or press ", _jsx(Text, { color: theme.accent.system, children: "k" }), " to paste a credential now and use it for this session."] }) }), _jsx(Box, { paddingTop: 1, children: _jsx(Text, { color: theme.text.secondary, children: "You can also set one of the env vars above (or start a local server) and restart." }) }), _jsx(Box, { paddingTop: 1, children: _jsxs(Text, { color: theme.text.muted, children: [onLogin ? 'l: sign in · ' : '', "k: enter a credential \u00B7 esc: exit picker"] }) })] }));
488
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.status.warn, paddingX: 1, children: [noticeBox, _jsx(Text, { color: theme.status.warn, bold: true, children: "No providers detected" }), _jsxs(Box, { paddingTop: 1, flexDirection: "column", children: [_jsx(Text, { color: theme.text.primary, children: "namzu scans these sources, in order, for an LLM credential:" }), _jsxs(Text, { color: theme.text.muted, children: [' ', "\u00B7 existing", ' ', subscriptionProviders()
489
+ .map((entry) => entry.label)
490
+ .join(' and '), ' ', "sessions on this device"] }), _jsxs(Text, { color: theme.text.muted, children: [' ', "\u00B7 subscriptions signed in to from namzu (~/.namzu/credentials.json)"] }), _jsxs(Text, { color: theme.text.muted, children: [' ', "\u00B7 env vars / API keys (optional alternatives: ANTHROPIC_API_KEY, OPENAI_API_KEY, \u2026)"] }), _jsxs(Text, { color: theme.text.muted, children: [' ', "\u00B7 local servers (Ollama localhost:11434, LM Studio localhost:1234)"] })] }), onLogin ? (_jsx(Box, { paddingTop: 1, children: _jsxs(Text, { color: theme.text.primary, children: ["Press ", _jsx(Text, { color: theme.accent.system, children: "l" }), " to sign in with a subscription \u2014 no API key, and namzu keeps it for next time."] }) })) : null, _jsx(Box, { paddingTop: 1, children: _jsxs(Text, { color: theme.text.primary, children: ["Or press ", _jsx(Text, { color: theme.accent.system, children: "k" }), " to paste a credential now and use it for this session."] }) }), _jsx(Box, { paddingTop: 1, children: _jsx(Text, { color: theme.text.secondary, children: "You can also set one of the env vars above (or start a local server) and restart." }) }), _jsx(Box, { paddingTop: 1, children: _jsxs(Text, { color: theme.text.muted, children: [onLogin ? 'l: sign in · ' : '', "k: enter a credential \u00B7 esc: exit picker"] }) })] }));
371
491
  }
372
492
  return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.border.focus, paddingX: 1, children: [noticeBox, _jsxs(Box, { flexDirection: "column", paddingBottom: 1, children: [_jsx(Text, { color: theme.accent.system, bold: true, children: selectionKind === 'signed-in-subscription'
373
493
  ? 'Choose a signed-in subscription'