@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.
- package/README.md +31 -7
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/login.d.ts +21 -3
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +33 -21
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/prior-messages.d.ts.map +1 -1
- package/dist/commands/prior-messages.js +13 -4
- package/dist/commands/prior-messages.js.map +1 -1
- package/dist/commands/upgrade.d.ts +25 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +182 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/context/runtime-message.d.ts +4 -0
- package/dist/context/runtime-message.d.ts.map +1 -0
- package/dist/context/runtime-message.js +20 -0
- package/dist/context/runtime-message.js.map +1 -0
- package/dist/integrations/providers/identity.d.ts +16 -21
- package/dist/integrations/providers/identity.d.ts.map +1 -1
- package/dist/integrations/providers/identity.js +16 -21
- package/dist/integrations/providers/identity.js.map +1 -1
- package/dist/integrations/providers/index.d.ts +1 -1
- package/dist/integrations/providers/index.d.ts.map +1 -1
- package/dist/integrations/providers/index.js +1 -1
- package/dist/integrations/providers/index.js.map +1 -1
- package/dist/integrations/providers/subscription-login.d.ts +7 -41
- package/dist/integrations/providers/subscription-login.d.ts.map +1 -1
- package/dist/integrations/providers/subscription-login.js +16 -143
- package/dist/integrations/providers/subscription-login.js.map +1 -1
- package/dist/integrations/sessions/transcript-export.d.ts.map +1 -1
- package/dist/integrations/sessions/transcript-export.js +10 -1
- package/dist/integrations/sessions/transcript-export.js.map +1 -1
- package/dist/integrations/sessions/turn-evidence.d.ts.map +1 -1
- package/dist/integrations/sessions/turn-evidence.js +9 -1
- package/dist/integrations/sessions/turn-evidence.js.map +1 -1
- package/dist/integrations/updates.d.ts +7 -1
- package/dist/integrations/updates.d.ts.map +1 -1
- package/dist/integrations/updates.js +59 -21
- package/dist/integrations/updates.js.map +1 -1
- package/dist/tui/App.d.ts +3 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +287 -96
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/Composer.d.ts +15 -5
- package/dist/tui/Composer.d.ts.map +1 -1
- package/dist/tui/Composer.js +73 -8
- package/dist/tui/Composer.js.map +1 -1
- package/dist/tui/LiveActivity.d.ts +3 -0
- package/dist/tui/LiveActivity.d.ts.map +1 -1
- package/dist/tui/LiveActivity.js +4 -1
- package/dist/tui/LiveActivity.js.map +1 -1
- package/dist/tui/Picker.d.ts +4 -2
- package/dist/tui/Picker.d.ts.map +1 -1
- package/dist/tui/Picker.js +136 -16
- package/dist/tui/Picker.js.map +1 -1
- package/dist/tui/StatusBar.d.ts +1 -1
- package/dist/tui/StatusBar.d.ts.map +1 -1
- package/dist/tui/StatusBar.js +8 -5
- package/dist/tui/StatusBar.js.map +1 -1
- package/dist/tui/Transcript.d.ts +3 -1
- package/dist/tui/Transcript.d.ts.map +1 -1
- package/dist/tui/Transcript.js +2 -2
- package/dist/tui/Transcript.js.map +1 -1
- package/dist/tui/agent.d.ts +15 -0
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +17 -0
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/exit-summary.d.ts +6 -0
- package/dist/tui/exit-summary.d.ts.map +1 -0
- package/dist/tui/exit-summary.js +8 -0
- package/dist/tui/exit-summary.js.map +1 -0
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +15 -6
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/log-pane.d.ts +13 -8
- package/dist/tui/log-pane.d.ts.map +1 -1
- package/dist/tui/log-pane.js +23 -29
- package/dist/tui/log-pane.js.map +1 -1
- package/dist/tui/login-prompt.d.ts +0 -1
- package/dist/tui/login-prompt.d.ts.map +1 -1
- package/dist/tui/login-prompt.js +1 -6
- package/dist/tui/login-prompt.js.map +1 -1
- package/dist/tui/open-browser.d.ts.map +1 -1
- package/dist/tui/open-browser.js +27 -9
- package/dist/tui/open-browser.js.map +1 -1
- package/package.json +7 -7
package/dist/tui/Composer.js
CHANGED
|
@@ -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
|
-
|
|
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: [
|
|
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') {
|
package/dist/tui/Composer.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/tui/LiveActivity.js
CHANGED
|
@@ -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) =>
|
|
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":";AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"LiveActivity.js","sourceRoot":"","sources":["../../src/tui/LiveActivity.tsx"],"names":[],"mappings":"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"}
|
package/dist/tui/Picker.d.ts
CHANGED
|
@@ -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) =>
|
|
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
|
package/dist/tui/Picker.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/tui/Picker.js
CHANGED
|
@@ -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,
|
|
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 =
|
|
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
|
|
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
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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 =
|
|
363
|
-
|
|
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()
|
|
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'
|