@glbgpt/cli 0.1.0-test.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.
- package/README.md +111 -0
- package/dist/src/auth/authClient.d.ts +32 -0
- package/dist/src/auth/authClient.js +88 -0
- package/dist/src/auth/authClient.js.map +1 -0
- package/dist/src/auth/credentialStore.d.ts +22 -0
- package/dist/src/auth/credentialStore.js +51 -0
- package/dist/src/auth/credentialStore.js.map +1 -0
- package/dist/src/auth/loginFlow.d.ts +30 -0
- package/dist/src/auth/loginFlow.js +43 -0
- package/dist/src/auth/loginFlow.js.map +1 -0
- package/dist/src/auth/loopbackServer.d.ts +41 -0
- package/dist/src/auth/loopbackServer.js +141 -0
- package/dist/src/auth/loopbackServer.js.map +1 -0
- package/dist/src/auth/token.d.ts +8 -0
- package/dist/src/auth/token.js +15 -0
- package/dist/src/auth/token.js.map +1 -0
- package/dist/src/commands/accountCommand.d.ts +2 -0
- package/dist/src/commands/accountCommand.js +56 -0
- package/dist/src/commands/accountCommand.js.map +1 -0
- package/dist/src/commands/configCommand.d.ts +4 -0
- package/dist/src/commands/configCommand.js +53 -0
- package/dist/src/commands/configCommand.js.map +1 -0
- package/dist/src/commands/execCommand.d.ts +32 -0
- package/dist/src/commands/execCommand.js +122 -0
- package/dist/src/commands/execCommand.js.map +1 -0
- package/dist/src/commands/loginCommand.d.ts +11 -0
- package/dist/src/commands/loginCommand.js +96 -0
- package/dist/src/commands/loginCommand.js.map +1 -0
- package/dist/src/commands/mediaCommand.d.ts +41 -0
- package/dist/src/commands/mediaCommand.js +277 -0
- package/dist/src/commands/mediaCommand.js.map +1 -0
- package/dist/src/config/configFile.d.ts +30 -0
- package/dist/src/config/configFile.js +54 -0
- package/dist/src/config/configFile.js.map +1 -0
- package/dist/src/config/env.d.ts +6 -0
- package/dist/src/config/env.js +24 -0
- package/dist/src/config/env.js.map +1 -0
- package/dist/src/config/paths.d.ts +6 -0
- package/dist/src/config/paths.js +16 -0
- package/dist/src/config/paths.js.map +1 -0
- package/dist/src/core/catalog.d.ts +49 -0
- package/dist/src/core/catalog.js +96 -0
- package/dist/src/core/catalog.js.map +1 -0
- package/dist/src/core/httpChatBackend.d.ts +31 -0
- package/dist/src/core/httpChatBackend.js +134 -0
- package/dist/src/core/httpChatBackend.js.map +1 -0
- package/dist/src/core/id.d.ts +2 -0
- package/dist/src/core/id.js +5 -0
- package/dist/src/core/id.js.map +1 -0
- package/dist/src/core/runChat.d.ts +28 -0
- package/dist/src/core/runChat.js +49 -0
- package/dist/src/core/runChat.js.map +1 -0
- package/dist/src/core/session.d.ts +44 -0
- package/dist/src/core/session.js +70 -0
- package/dist/src/core/session.js.map +1 -0
- package/dist/src/core/sessionStore.d.ts +39 -0
- package/dist/src/core/sessionStore.js +106 -0
- package/dist/src/core/sessionStore.js.map +1 -0
- package/dist/src/core/toolRegistry.d.ts +19 -0
- package/dist/src/core/toolRegistry.js +53 -0
- package/dist/src/core/toolRegistry.js.map +1 -0
- package/dist/src/core/tools/generateImage.d.ts +10 -0
- package/dist/src/core/tools/generateImage.js +34 -0
- package/dist/src/core/tools/generateImage.js.map +1 -0
- package/dist/src/core/turnLoop.d.ts +31 -0
- package/dist/src/core/turnLoop.js +155 -0
- package/dist/src/core/turnLoop.js.map +1 -0
- package/dist/src/core/types.d.ts +137 -0
- package/dist/src/core/types.js +9 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/exec/input.d.ts +35 -0
- package/dist/src/exec/input.js +85 -0
- package/dist/src/exec/input.js.map +1 -0
- package/dist/src/exec/output.d.ts +39 -0
- package/dist/src/exec/output.js +84 -0
- package/dist/src/exec/output.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +253 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/server.d.ts +38 -0
- package/dist/src/mcp/server.js +99 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/media/aiApiClient.d.ts +53 -0
- package/dist/src/media/aiApiClient.js +97 -0
- package/dist/src/media/aiApiClient.js.map +1 -0
- package/dist/src/media/errors.d.ts +7 -0
- package/dist/src/media/errors.js +70 -0
- package/dist/src/media/errors.js.map +1 -0
- package/dist/src/media/executor.d.ts +50 -0
- package/dist/src/media/executor.js +55 -0
- package/dist/src/media/executor.js.map +1 -0
- package/dist/src/media/generateImageTool.d.ts +19 -0
- package/dist/src/media/generateImageTool.js +120 -0
- package/dist/src/media/generateImageTool.js.map +1 -0
- package/dist/src/media/manifest.d.ts +23 -0
- package/dist/src/media/manifest.js +558 -0
- package/dist/src/media/manifest.js.map +1 -0
- package/dist/src/media/resolution.d.ts +13 -0
- package/dist/src/media/resolution.js +42 -0
- package/dist/src/media/resolution.js.map +1 -0
- package/dist/src/media/taskLedger.d.ts +17 -0
- package/dist/src/media/taskLedger.js +44 -0
- package/dist/src/media/taskLedger.js.map +1 -0
- package/dist/src/media/taskManager.d.ts +52 -0
- package/dist/src/media/taskManager.js +130 -0
- package/dist/src/media/taskManager.js.map +1 -0
- package/dist/src/media/types.d.ts +80 -0
- package/dist/src/media/types.js +15 -0
- package/dist/src/media/types.js.map +1 -0
- package/dist/src/tui/App.d.ts +34 -0
- package/dist/src/tui/App.js +540 -0
- package/dist/src/tui/App.js.map +1 -0
- package/dist/src/tui/MultilineInput.d.ts +36 -0
- package/dist/src/tui/MultilineInput.js +221 -0
- package/dist/src/tui/MultilineInput.js.map +1 -0
- package/dist/src/tui/atPopup.d.ts +21 -0
- package/dist/src/tui/atPopup.js +55 -0
- package/dist/src/tui/atPopup.js.map +1 -0
- package/dist/src/tui/attachments.d.ts +24 -0
- package/dist/src/tui/attachments.js +91 -0
- package/dist/src/tui/attachments.js.map +1 -0
- package/dist/src/tui/branding.d.ts +22 -0
- package/dist/src/tui/branding.js +119 -0
- package/dist/src/tui/branding.js.map +1 -0
- package/dist/src/tui/chatController.d.ts +188 -0
- package/dist/src/tui/chatController.js +614 -0
- package/dist/src/tui/chatController.js.map +1 -0
- package/dist/src/tui/commands.d.ts +13 -0
- package/dist/src/tui/commands.js +22 -0
- package/dist/src/tui/commands.js.map +1 -0
- package/dist/src/tui/confirmationBridge.d.ts +23 -0
- package/dist/src/tui/confirmationBridge.js +47 -0
- package/dist/src/tui/confirmationBridge.js.map +1 -0
- package/dist/src/tui/inputHistory.d.ts +7 -0
- package/dist/src/tui/inputHistory.js +64 -0
- package/dist/src/tui/inputHistory.js.map +1 -0
- package/dist/src/tui/markdown.d.ts +1 -0
- package/dist/src/tui/markdown.js +143 -0
- package/dist/src/tui/markdown.js.map +1 -0
- package/dist/src/tui/models.d.ts +30 -0
- package/dist/src/tui/models.js +54 -0
- package/dist/src/tui/models.js.map +1 -0
- package/dist/src/tui/run.d.ts +29 -0
- package/dist/src/tui/run.js +212 -0
- package/dist/src/tui/run.js.map +1 -0
- package/dist/src/tui/slashMedia.d.ts +36 -0
- package/dist/src/tui/slashMedia.js +86 -0
- package/dist/src/tui/slashMedia.js.map +1 -0
- package/dist/src/tui/visualLines.d.ts +38 -0
- package/dist/src/tui/visualLines.js +110 -0
- package/dist/src/tui/visualLines.js.map +1 -0
- package/dist/src/util/clipboardImage.d.ts +6 -0
- package/dist/src/util/clipboardImage.js +69 -0
- package/dist/src/util/clipboardImage.js.map +1 -0
- package/dist/src/util/hyperlink.d.ts +10 -0
- package/dist/src/util/hyperlink.js +33 -0
- package/dist/src/util/hyperlink.js.map +1 -0
- package/dist/src/util/imageRef.d.ts +15 -0
- package/dist/src/util/imageRef.js +46 -0
- package/dist/src/util/imageRef.js.map +1 -0
- package/dist/src/util/inlineImage.d.ts +13 -0
- package/dist/src/util/inlineImage.js +56 -0
- package/dist/src/util/inlineImage.js.map +1 -0
- package/dist/src/util/openBrowser.d.ts +5 -0
- package/dist/src/util/openBrowser.js +23 -0
- package/dist/src/util/openBrowser.js.map +1 -0
- package/dist/src/util/retry.d.ts +43 -0
- package/dist/src/util/retry.js +116 -0
- package/dist/src/util/retry.js.map +1 -0
- package/dist/src/version.d.ts +6 -0
- package/dist/src/version.js +16 -0
- package/dist/src/version.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { Box, Static, Text, useApp, useInput, useStdout } from 'ink';
|
|
4
|
+
import wrapAnsi from 'wrap-ansi';
|
|
5
|
+
import { MultilineInput } from './MultilineInput.js';
|
|
6
|
+
import { getChatModels } from './models.js';
|
|
7
|
+
import { buildSlashCommand } from './slashMedia.js';
|
|
8
|
+
import { filterCommands, SLASH_COMMANDS } from './commands.js';
|
|
9
|
+
import { LOGO_FRAMES, TAGLINE, brandTitle, supportsTruecolor } from './branding.js';
|
|
10
|
+
import { applyMarkdown } from './markdown.js';
|
|
11
|
+
import { hyperlink, fileUrl } from '../util/hyperlink.js';
|
|
12
|
+
import { atCandidates } from './atPopup.js';
|
|
13
|
+
import { readClipboardImage } from '../util/clipboardImage.js';
|
|
14
|
+
/**
|
|
15
|
+
* Chat TUI (phase 1). A thin view over {@link ChatController}: it renders the timeline,
|
|
16
|
+
* handles slash commands and the `/model` selector, and forwards user input to the
|
|
17
|
+
* controller. All engine behavior (turn loop, tools) lives in core.
|
|
18
|
+
*
|
|
19
|
+
* All user-facing text is English; the model replies in the user's own language.
|
|
20
|
+
*/
|
|
21
|
+
export function App({ controller, confirmationBridge, sessionPicker, firstRun, fetchAccountLine, inputHistory, readClipboard, }) {
|
|
22
|
+
const { exit } = useApp();
|
|
23
|
+
const { stdout } = useStdout();
|
|
24
|
+
const columns = stdout?.columns ?? 80;
|
|
25
|
+
const [state, setState] = useState(controller.getState());
|
|
26
|
+
const [input, setInput] = useState('');
|
|
27
|
+
const [selecting, setSelecting] = useState(false);
|
|
28
|
+
const [selIndex, setSelIndex] = useState(0);
|
|
29
|
+
const [sessions, setSessions] = useState(null);
|
|
30
|
+
const [sessIndex, setSessIndex] = useState(0);
|
|
31
|
+
const [sugIndex, setSugIndex] = useState(0);
|
|
32
|
+
const [pending, setPending] = useState(confirmationBridge?.current() ?? null);
|
|
33
|
+
const [accountLine, setAccountLine] = useState(null);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (!fetchAccountLine)
|
|
36
|
+
return;
|
|
37
|
+
let alive = true;
|
|
38
|
+
fetchAccountLine()
|
|
39
|
+
.then((line) => alive && line && setAccountLine(line))
|
|
40
|
+
.catch(() => { });
|
|
41
|
+
return () => {
|
|
42
|
+
alive = false;
|
|
43
|
+
};
|
|
44
|
+
}, [fetchAccountLine]);
|
|
45
|
+
// Input history (recall is arbitrated inside the editor; see onHistoryUp below).
|
|
46
|
+
const [history, setHistory] = useState([]);
|
|
47
|
+
const [histIndex, setHistIndex] = useState(-1); // -1 = editing a fresh line
|
|
48
|
+
const [draft, setDraft] = useState('');
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (!inputHistory)
|
|
51
|
+
return;
|
|
52
|
+
void inputHistory.load().then(setHistory).catch(() => { });
|
|
53
|
+
}, [inputHistory]);
|
|
54
|
+
// True while the composer holds an UNEDITED recalled-history entry. Recalled text must not
|
|
55
|
+
// trigger the / or @ popups — a popup would capture ↑/↓ and strand the history browse on a
|
|
56
|
+
// slash-command entry (Enter still executes it; any edit reopens popups as usual).
|
|
57
|
+
const recallActive = histIndex !== -1 && input === history[histIndex];
|
|
58
|
+
// Command popup: active while the input is just "/<partial-command>" (no arguments yet)
|
|
59
|
+
// and no modal owns the keyboard (baseline §5: candidates expand above the input).
|
|
60
|
+
const slashToken = /^\/(\S*)$/.exec(input)?.[1];
|
|
61
|
+
const suggestions = slashToken !== undefined && !pending && !selecting && !sessions && !recallActive ? filterCommands(slashToken) : [];
|
|
62
|
+
const showSuggestions = suggestions.length > 0;
|
|
63
|
+
const selectedSuggestion = suggestions[Math.min(sugIndex, suggestions.length - 1)];
|
|
64
|
+
// @ attachment popup: active while the input ENDS with "@<partial>" (image keywords +
|
|
65
|
+
// image files/dirs browsed from the typed prefix; Claude Code's file-mention pattern).
|
|
66
|
+
// `@"…` opens a QUOTED token so filenames with spaces (macOS screenshots) stay one token.
|
|
67
|
+
const atMatch = !showSuggestions && !pending && !selecting && !sessions && !recallActive
|
|
68
|
+
? /(^|\s)@(?:"([^"\n]*)|([^\s@"]*))$/.exec(input)
|
|
69
|
+
: null;
|
|
70
|
+
const atQuoted = atMatch?.[2] !== undefined;
|
|
71
|
+
const atPartial = atMatch ? (atMatch[2] ?? atMatch[3]) : undefined;
|
|
72
|
+
const [atCands, setAtCands] = useState([]);
|
|
73
|
+
const [atIndex, setAtIndex] = useState(0);
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
if (atPartial === undefined) {
|
|
76
|
+
setAtCands([]);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
let alive = true;
|
|
80
|
+
void atCandidates(atPartial).then((c) => {
|
|
81
|
+
if (alive) {
|
|
82
|
+
setAtCands(c);
|
|
83
|
+
setAtIndex(0);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
return () => {
|
|
87
|
+
alive = false;
|
|
88
|
+
};
|
|
89
|
+
}, [atPartial]);
|
|
90
|
+
const showAt = atPartial !== undefined && atCands.length > 0;
|
|
91
|
+
const selectedAt = atCands[Math.min(atIndex, atCands.length - 1)];
|
|
92
|
+
const applyAtCompletion = () => {
|
|
93
|
+
if (!selectedAt || atPartial === undefined)
|
|
94
|
+
return;
|
|
95
|
+
const base = input.slice(0, input.length - atPartial.length - (atQuoted ? 1 : 0));
|
|
96
|
+
// Names with spaces get quoted (the attachment tokenizer understands @"…"); an open
|
|
97
|
+
// quote stays open on directories so drilling deeper keeps the token intact.
|
|
98
|
+
const quote = atQuoted || /\s/.test(selectedAt.insert);
|
|
99
|
+
const completed = quote
|
|
100
|
+
? selectedAt.isDir
|
|
101
|
+
? `"${selectedAt.insert}`
|
|
102
|
+
: `"${selectedAt.insert}"`
|
|
103
|
+
: selectedAt.insert;
|
|
104
|
+
// Directories keep the popup open for drilling in; files/keywords close it with a space.
|
|
105
|
+
setInput(`${base}${completed}${selectedAt.isDir ? '' : ' '}`);
|
|
106
|
+
};
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
const unsubscribe = controller.subscribe(setState);
|
|
109
|
+
return unsubscribe;
|
|
110
|
+
}, [controller]);
|
|
111
|
+
// Print-and-forget transcript (Claude Code's <Static> pattern): items settled by the end
|
|
112
|
+
// of a turn never re-render — without this, every keystroke re-renders (and re-parses the
|
|
113
|
+
// markdown of) the whole conversation, which lags on long chats. While busy, the tail
|
|
114
|
+
// (streaming bubble, running tools) stays dynamic. Switching sessions (/new, /resume)
|
|
115
|
+
// remounts the Static region via the session-id key; prior output stays in scrollback.
|
|
116
|
+
const sessionId = controller.getSession().id;
|
|
117
|
+
const [frozen, setFrozen] = useState(0);
|
|
118
|
+
const [staticEpoch, setStaticEpoch] = useState(sessionId);
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
if (sessionId !== staticEpoch) {
|
|
121
|
+
setStaticEpoch(sessionId);
|
|
122
|
+
setFrozen(0);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (!state.busy && frozen !== state.items.length)
|
|
126
|
+
setFrozen(state.items.length);
|
|
127
|
+
}, [sessionId, staticEpoch, state.busy, state.items.length, frozen]);
|
|
128
|
+
const frozenItems = state.items.slice(0, frozen);
|
|
129
|
+
const liveItems = state.items.slice(frozen);
|
|
130
|
+
// Once chatting starts, the welcome block "settles" into scrollback exactly once (initial
|
|
131
|
+
// epoch only) — Claude Code banner behavior. The dynamic region then has no header at all;
|
|
132
|
+
// the model lives in the footer.
|
|
133
|
+
const [initialEpoch] = useState(sessionId);
|
|
134
|
+
const conversationStarted = state.items.length > 0 || state.busy;
|
|
135
|
+
const staticItems = staticEpoch === initialEpoch && conversationStarted ? ['welcome', ...frozenItems] : frozenItems;
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
if (!confirmationBridge)
|
|
138
|
+
return;
|
|
139
|
+
return confirmationBridge.subscribe(() => setPending(confirmationBridge.current()));
|
|
140
|
+
}, [confirmationBridge]);
|
|
141
|
+
// Paid-media confirmation takes keyboard priority while pending.
|
|
142
|
+
useInput((i, key) => {
|
|
143
|
+
if (!pending || !confirmationBridge)
|
|
144
|
+
return;
|
|
145
|
+
if (key.return || i === 'g' || i === 'y')
|
|
146
|
+
confirmationBridge.resolve(true);
|
|
147
|
+
else if (key.escape || i === 'c' || i === 'n')
|
|
148
|
+
confirmationBridge.resolve(false);
|
|
149
|
+
else if (i === 'e') {
|
|
150
|
+
// Edit: decline this submission and prefill the full slash command (all current
|
|
151
|
+
// parameters included) so the user can adjust anything and re-run.
|
|
152
|
+
const cmd = buildSlashCommand(pending);
|
|
153
|
+
confirmationBridge.resolve(false);
|
|
154
|
+
setInput(cmd);
|
|
155
|
+
}
|
|
156
|
+
}, { isActive: !!pending });
|
|
157
|
+
// Esc interrupts the in-flight turn (when no modal owns the keyboard).
|
|
158
|
+
useInput((_i, key) => {
|
|
159
|
+
if (key.escape)
|
|
160
|
+
controller.interrupt();
|
|
161
|
+
}, { isActive: state.busy && !pending && !selecting && !sessions });
|
|
162
|
+
// Ctrl+C: never an instant kill. First press clears the draft (or interrupts a busy turn)
|
|
163
|
+
// and arms a 2s exit window; a second press within it exits (Claude Code semantics).
|
|
164
|
+
const [exitArmed, setExitArmed] = useState(false);
|
|
165
|
+
useEffect(() => {
|
|
166
|
+
if (!exitArmed)
|
|
167
|
+
return;
|
|
168
|
+
const t = setTimeout(() => setExitArmed(false), 2000);
|
|
169
|
+
return () => clearTimeout(t);
|
|
170
|
+
}, [exitArmed]);
|
|
171
|
+
useInput((i, key) => {
|
|
172
|
+
if (!(key.ctrl && i === 'c'))
|
|
173
|
+
return;
|
|
174
|
+
if (exitArmed) {
|
|
175
|
+
exit();
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (state.busy)
|
|
179
|
+
controller.interrupt();
|
|
180
|
+
if (input)
|
|
181
|
+
setInput('');
|
|
182
|
+
setExitArmed(true);
|
|
183
|
+
});
|
|
184
|
+
// History recall is arbitrated INSIDE the editor (the Claude Code upOrHistoryUp model):
|
|
185
|
+
// these fire only when the cursor cannot move any further, so recall can never clobber a
|
|
186
|
+
// draft the user is still navigating.
|
|
187
|
+
const onHistoryUp = () => {
|
|
188
|
+
if (history.length === 0)
|
|
189
|
+
return;
|
|
190
|
+
const next = histIndex === -1 ? history.length - 1 : Math.max(0, histIndex - 1);
|
|
191
|
+
if (histIndex === -1)
|
|
192
|
+
setDraft(input); // stash the in-progress line
|
|
193
|
+
setHistIndex(next);
|
|
194
|
+
setInput(history[next]);
|
|
195
|
+
};
|
|
196
|
+
const onHistoryDown = () => {
|
|
197
|
+
if (histIndex === -1)
|
|
198
|
+
return;
|
|
199
|
+
const next = histIndex + 1;
|
|
200
|
+
if (next >= history.length) {
|
|
201
|
+
setHistIndex(-1);
|
|
202
|
+
setInput(draft); // walked past the newest entry → restore the stashed draft
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
setHistIndex(next);
|
|
206
|
+
setInput(history[next]);
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
// Ctrl+V pastes the clipboard image as an "[Image #N]" placeholder (Claude Code's binding
|
|
210
|
+
// and display — Cmd+V never reaches a terminal app). The placeholder maps to the resolved
|
|
211
|
+
// file and expands to an @<path> token on submit. MultilineInput never inserts
|
|
212
|
+
// ctrl-modified characters, so no stray 'v' reaches the composer.
|
|
213
|
+
const pastedImages = useState(() => new Map())[0];
|
|
214
|
+
useInput((i, key) => {
|
|
215
|
+
if (!(key.ctrl && i === 'v'))
|
|
216
|
+
return;
|
|
217
|
+
void (readClipboard ?? readClipboardImage)().then((file) => {
|
|
218
|
+
if (file) {
|
|
219
|
+
const placeholder = `[Image #${pastedImages.size + 1}]`;
|
|
220
|
+
pastedImages.set(placeholder, file);
|
|
221
|
+
setInput((cur) => `${cur}${cur && !cur.endsWith(' ') ? ' ' : ''}${placeholder} `);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
controller.note('No image on the clipboard (copy a screenshot or an image file first).');
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}, { isActive: !pending && !selecting && !sessions });
|
|
228
|
+
/** Expand "[Image #N]" placeholders to @<path> tokens for the engine. */
|
|
229
|
+
const expandPlaceholders = (text) => text.replace(/\[Image #\d+\]/g, (m) => {
|
|
230
|
+
const file = pastedImages.get(m);
|
|
231
|
+
return file ? `@${file}` : m;
|
|
232
|
+
});
|
|
233
|
+
// @ popup navigation: ↑/↓ select, Tab/Enter complete (Enter is intercepted in onSubmit).
|
|
234
|
+
useInput((_i, key) => {
|
|
235
|
+
if (key.upArrow)
|
|
236
|
+
setAtIndex((n) => (n - 1 + atCands.length) % atCands.length);
|
|
237
|
+
else if (key.downArrow)
|
|
238
|
+
setAtIndex((n) => (n + 1) % atCands.length);
|
|
239
|
+
else if (key.tab)
|
|
240
|
+
applyAtCompletion();
|
|
241
|
+
}, { isActive: showAt });
|
|
242
|
+
// Command popup navigation: ↑/↓ select, Tab completes into the input (Enter executes via onSubmit).
|
|
243
|
+
useInput((_i, key) => {
|
|
244
|
+
if (key.upArrow)
|
|
245
|
+
setSugIndex((n) => (n - 1 + suggestions.length) % suggestions.length);
|
|
246
|
+
else if (key.downArrow)
|
|
247
|
+
setSugIndex((n) => (n + 1) % suggestions.length);
|
|
248
|
+
else if (key.tab && selectedSuggestion)
|
|
249
|
+
setInput(`/${selectedSuggestion.name} `);
|
|
250
|
+
}, { isActive: showSuggestions });
|
|
251
|
+
// Model selector navigation.
|
|
252
|
+
useInput((_i, key) => {
|
|
253
|
+
if (!selecting)
|
|
254
|
+
return;
|
|
255
|
+
const chatModels = getChatModels();
|
|
256
|
+
if (key.upArrow)
|
|
257
|
+
setSelIndex((n) => (n - 1 + chatModels.length) % chatModels.length);
|
|
258
|
+
else if (key.downArrow)
|
|
259
|
+
setSelIndex((n) => (n + 1) % chatModels.length);
|
|
260
|
+
else if (key.return) {
|
|
261
|
+
controller.switchModel(chatModels[Math.min(selIndex, chatModels.length - 1)].id);
|
|
262
|
+
setSelecting(false);
|
|
263
|
+
}
|
|
264
|
+
else if (key.escape) {
|
|
265
|
+
setSelecting(false);
|
|
266
|
+
}
|
|
267
|
+
}, { isActive: selecting });
|
|
268
|
+
// Session picker navigation (/resume).
|
|
269
|
+
useInput((_i, key) => {
|
|
270
|
+
if (!sessions)
|
|
271
|
+
return;
|
|
272
|
+
if (key.upArrow)
|
|
273
|
+
setSessIndex((n) => (n - 1 + sessions.length) % sessions.length);
|
|
274
|
+
else if (key.downArrow)
|
|
275
|
+
setSessIndex((n) => (n + 1) % sessions.length);
|
|
276
|
+
else if (key.return) {
|
|
277
|
+
const chosen = sessions[sessIndex];
|
|
278
|
+
setSessions(null);
|
|
279
|
+
void sessionPicker
|
|
280
|
+
?.loadSession(chosen.id)
|
|
281
|
+
.then((r) => r ? controller.replaceSession(r.session, r.timeline) : controller.note('Could not load that conversation.'));
|
|
282
|
+
}
|
|
283
|
+
else if (key.escape) {
|
|
284
|
+
setSessions(null);
|
|
285
|
+
}
|
|
286
|
+
}, { isActive: !!sessions && sessions.length > 0 });
|
|
287
|
+
const onSubmit = (value) => {
|
|
288
|
+
if (showAt && selectedAt && selectedAt.insert !== atPartial) {
|
|
289
|
+
// Enter completes the highlighted attachment candidate instead of sending — but only
|
|
290
|
+
// when completion would change the token; a fully-typed token lets Enter submit.
|
|
291
|
+
applyAtCompletion();
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
// With the command popup open, Enter executes the highlighted command (Codex-style),
|
|
295
|
+
// completing a partial token like "/mo" to "/model".
|
|
296
|
+
const text = showSuggestions && selectedSuggestion ? `/${selectedSuggestion.name}` : value.trim();
|
|
297
|
+
setInput('');
|
|
298
|
+
setSugIndex(0);
|
|
299
|
+
setHistIndex(-1);
|
|
300
|
+
setDraft('');
|
|
301
|
+
if (!text)
|
|
302
|
+
return;
|
|
303
|
+
// History stores the EXPANDED form — "[Image #N]" placeholders are meaningless outside
|
|
304
|
+
// this process, while @<path> tokens replay (or fail with a clear error) on recall.
|
|
305
|
+
const expanded = text.startsWith('/') ? text : expandPlaceholders(text);
|
|
306
|
+
setHistory((h) => (h.at(-1) === expanded ? h : [...h, expanded]));
|
|
307
|
+
void inputHistory?.append(expanded);
|
|
308
|
+
if (text.startsWith('/')) {
|
|
309
|
+
handleSlash(text);
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
void controller.submit(expanded, expanded === text ? undefined : text);
|
|
313
|
+
};
|
|
314
|
+
const onInputChange = (value) => {
|
|
315
|
+
setInput(value);
|
|
316
|
+
setSugIndex(0); // retyping refilters; selection restarts at the top
|
|
317
|
+
setHistIndex(-1); // editing detaches from history recall
|
|
318
|
+
};
|
|
319
|
+
const handleSlash = (text) => {
|
|
320
|
+
const [cmd, ...restWords] = text.slice(1).split(/\s+/);
|
|
321
|
+
const rest = restWords.join(' ').trim();
|
|
322
|
+
switch (cmd) {
|
|
323
|
+
case 'model':
|
|
324
|
+
setSelIndex(Math.max(0, getChatModels().findIndex((m) => m.id === state.model)));
|
|
325
|
+
setSelecting(true);
|
|
326
|
+
break;
|
|
327
|
+
case 'image':
|
|
328
|
+
case 'video':
|
|
329
|
+
if (!rest) {
|
|
330
|
+
controller.note(`Usage: /${cmd} <prompt> [--ar 16:9 --res 2K -m <model> ...] — see /help`);
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
void controller.runMedia(cmd, rest);
|
|
334
|
+
break;
|
|
335
|
+
case 'models':
|
|
336
|
+
controller.showModels();
|
|
337
|
+
break;
|
|
338
|
+
case 'tasks':
|
|
339
|
+
void controller.showTasks();
|
|
340
|
+
break;
|
|
341
|
+
case 'status':
|
|
342
|
+
void controller.showStatus();
|
|
343
|
+
break;
|
|
344
|
+
case 'account':
|
|
345
|
+
void controller.showAccount();
|
|
346
|
+
break;
|
|
347
|
+
case 'transactions':
|
|
348
|
+
void controller.showTransactions();
|
|
349
|
+
break;
|
|
350
|
+
case 'login':
|
|
351
|
+
void controller.reauth(/--no-browser|-n\b/.test(rest) ? 'no-browser' : 'browser');
|
|
352
|
+
break;
|
|
353
|
+
case 'logout':
|
|
354
|
+
void controller.logout();
|
|
355
|
+
break;
|
|
356
|
+
case 'cost':
|
|
357
|
+
controller.showCost();
|
|
358
|
+
break;
|
|
359
|
+
case 'resume':
|
|
360
|
+
if (!sessionPicker) {
|
|
361
|
+
controller.note('/resume is not available here.');
|
|
362
|
+
break;
|
|
363
|
+
}
|
|
364
|
+
void sessionPicker.listSessions().then((list) => {
|
|
365
|
+
const others = list.filter((s) => s.id !== controller.getSession().id);
|
|
366
|
+
if (others.length === 0) {
|
|
367
|
+
controller.note('No previous conversations found.');
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
setSessIndex(0);
|
|
371
|
+
setSessions(others);
|
|
372
|
+
});
|
|
373
|
+
break;
|
|
374
|
+
case 'new':
|
|
375
|
+
controller.reset();
|
|
376
|
+
break;
|
|
377
|
+
case 'exit':
|
|
378
|
+
case 'quit':
|
|
379
|
+
exit();
|
|
380
|
+
break;
|
|
381
|
+
case 'help':
|
|
382
|
+
controller.showHelp();
|
|
383
|
+
break;
|
|
384
|
+
default:
|
|
385
|
+
controller.note(`Unknown command: /${cmd}`);
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Static, { items: staticItems, children: (item, i) => item === 'welcome' ? (_jsx(WelcomeBlock, { model: state.model, accountLine: accountLine, firstRun: firstRun ?? false, settled: true }, "welcome")) : (_jsx(TimelineRow, { item: item, columns: columns }, i)) }, staticEpoch), !conversationStarted && (_jsx(WelcomeBlock, { model: state.model, accountLine: accountLine, firstRun: firstRun ?? false })), liveItems.map((item, i) => (_jsx(TimelineRow, { item: item, columns: columns }, frozen + i))), state.busy && _jsx(BusySpinner, {}), state.runningTasks.length > 0 && _jsx(TaskSummaryBar, { tasks: state.runningTasks }), pending ? (_jsx(ConfirmationBlock, { info: pending })) : sessions ? (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "cyan", children: "Resume a conversation (\u2191/\u2193, Enter to choose, Esc to cancel):" }), sessions.map((s, i) => (_jsxs(Text, { color: i === sessIndex ? 'cyan' : undefined, children: [i === sessIndex ? '❯ ' : ' ', s.preview, " ", _jsxs(Text, { color: "gray", children: ["\u00B7 ", s.model, " \u00B7 ", timeAgo(s.updatedAt)] })] }, s.id)))] })) : selecting ? (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "cyan", children: "Select a model (\u2191/\u2193, Enter to choose, Esc to cancel):" }), getChatModels().map((m, i) => (_jsxs(Text, { color: i === selIndex ? 'cyan' : undefined, children: [i === selIndex ? '❯ ' : ' ', m.label] }, m.id)))] })) : (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [showSuggestions && (_jsxs(Box, { flexDirection: "column", children: [suggestions.map((c, i) => (_jsxs(Text, { color: c === selectedSuggestion ? 'cyan' : undefined, children: [c === selectedSuggestion ? '❯ ' : ' ', "/", c.name, _jsxs(Text, { color: "gray", children: [c.args ? ` ${c.args}` : '', " \u2014 ", c.description] })] }, c.name))), _jsx(Text, { color: "gray", dimColor: true, children: "\u2191/\u2193 select \u00B7 Tab complete \u00B7 Enter run" })] })), showAt && (_jsxs(Box, { flexDirection: "column", children: [atCands.map((c) => (_jsxs(Text, { color: c === selectedAt ? 'cyan' : undefined, children: [c === selectedAt ? '❯ ' : ' ', c.label, _jsxs(Text, { color: "gray", children: [" \u2014 ", c.hint] })] }, c.label))), _jsx(Text, { color: "gray", dimColor: true, children: "\u2191/\u2193 select \u00B7 Tab/Enter complete" })] })), state.queued.map((q, i) => (_jsxs(Text, { color: "gray", dimColor: true, children: [' ↳ queued: ', q.display] }, i))), _jsxs(Box, { borderStyle: "round", borderLeft: false, borderRight: false, borderColor: "gray", paddingLeft: 1, children: [_jsx(Text, { color: "cyan", children: '› ' }), _jsx(MultilineInput, { value: input, onChange: onInputChange, onSubmit: onSubmit, onHistoryUp: onHistoryUp, onHistoryDown: onHistoryDown, recallActive: recallActive, columns: Math.max(20, columns - 4), verticalNav: !showAt && !showSuggestions, placeholder: 'Type a message, or /help for commands (\\ + Enter for a new line)' })] }), _jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { color: exitArmed ? 'yellow' : 'gray', dimColor: !exitArmed, children: exitArmed
|
|
389
|
+
? 'Press ctrl+c again to exit'
|
|
390
|
+
: state.busy
|
|
391
|
+
? 'Esc interrupt · Enter to queue'
|
|
392
|
+
: '/ commands · @ attach image' }), _jsxs(Text, { color: "gray", dimColor: true, children: [state.model, state.sessionUsage.promptTokens + state.sessionUsage.completionTokens > 0
|
|
393
|
+
? ` · ${formatTokens(state.sessionUsage.promptTokens + state.sessionUsage.completionTokens)} tok`
|
|
394
|
+
: '', state.sessionUsage.mediaCreditsEstimated > 0 ? ` · ~${state.sessionUsage.mediaCreditsEstimated} cr` : '', state.runningTasks.length > 0 ? ` · ${state.runningTasks.length} task${state.runningTasks.length > 1 ? 's' : ''} running` : ''] })] })] }))] }));
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Full brand welcome area shown until the conversation starts (baseline §2/§3): logo raster
|
|
398
|
+
* (truecolor terminals only), name, tagline, model + account summary, and — on first use —
|
|
399
|
+
* a one-time command navigation.
|
|
400
|
+
*/
|
|
401
|
+
function WelcomeBlock({ model, accountLine, firstRun, settled = false, }) {
|
|
402
|
+
const logo = supportsTruecolor();
|
|
403
|
+
// One-shot reveal: step through the baked sweep frames (~60ms each), then hold the mark.
|
|
404
|
+
const [frame, setFrame] = useState(settled ? LOGO_FRAMES.length - 1 : 0);
|
|
405
|
+
useEffect(() => {
|
|
406
|
+
if (settled || !logo || frame >= LOGO_FRAMES.length - 1)
|
|
407
|
+
return;
|
|
408
|
+
const t = setTimeout(() => setFrame((f) => f + 1), 60);
|
|
409
|
+
return () => clearTimeout(t);
|
|
410
|
+
}, [settled, logo, frame]);
|
|
411
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { children: [logo && (_jsx(Box, { flexDirection: "column", marginRight: 2, width: 11, children: LOGO_FRAMES[frame].map((line, i) => (_jsx(Text, { children: line || ' ' }, i))) })), _jsxs(Box, { flexDirection: "column", justifyContent: "center", children: [_jsx(Text, { children: brandTitle() }), _jsx(Text, { color: "gray", children: TAGLINE }), _jsxs(Text, { color: "gray", children: ["model: ", model] }), accountLine && _jsx(Text, { color: "gray", children: accountLine })] })] }), firstRun && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "cyan", children: "Getting started:" }), SLASH_COMMANDS.slice(0, 5).map((c) => (_jsxs(Text, { color: "gray", children: [' ', "/", c.name.padEnd(7), " ", c.description] }, c.name))), _jsxs(Text, { color: "gray", children: [' ', "Type ", _jsx(Text, { color: "cyan", children: "/" }), " to see every command, or just start chatting."] })] }))] }));
|
|
412
|
+
}
|
|
413
|
+
/** One-line summary of background generations, shown above the input while any are running. */
|
|
414
|
+
function TaskSummaryBar({ tasks }) {
|
|
415
|
+
const newest = tasks.reduce((a, b) => (a.elapsedMs < b.elapsedMs ? a : b));
|
|
416
|
+
const label = tasks.length === 1 ? '1 task' : `${tasks.length} tasks`;
|
|
417
|
+
return (_jsx(Box, { children: _jsxs(Text, { color: "yellow", children: ["\u23F3 ", label, " running \u00B7 ", Math.round(newest.elapsedMs / 1000), "s \u00B7 /tasks for details"] }) }));
|
|
418
|
+
}
|
|
419
|
+
/** Compact relative time for the session picker. */
|
|
420
|
+
function timeAgo(ts) {
|
|
421
|
+
const mins = Math.max(0, Math.round((Date.now() - ts) / 60000));
|
|
422
|
+
if (mins < 1)
|
|
423
|
+
return 'just now';
|
|
424
|
+
if (mins < 60)
|
|
425
|
+
return `${mins}m ago`;
|
|
426
|
+
const hours = Math.round(mins / 60);
|
|
427
|
+
if (hours < 24)
|
|
428
|
+
return `${hours}h ago`;
|
|
429
|
+
return `${Math.round(hours / 24)}d ago`;
|
|
430
|
+
}
|
|
431
|
+
function ConfirmationBlock({ info }) {
|
|
432
|
+
const p = info.params;
|
|
433
|
+
const bits = [
|
|
434
|
+
p.aspectRatio && `ratio ${p.aspectRatio}`,
|
|
435
|
+
p.resolution && `res ${p.resolution}`,
|
|
436
|
+
p.duration !== undefined && `${p.duration}s`,
|
|
437
|
+
p.seed !== undefined && `seed ${p.seed}`,
|
|
438
|
+
p.n !== undefined && p.n !== 1 && `×${p.n}`,
|
|
439
|
+
p.generateAudio !== undefined && (p.generateAudio ? 'audio' : 'no audio'),
|
|
440
|
+
]
|
|
441
|
+
.filter(Boolean)
|
|
442
|
+
.join(' · ');
|
|
443
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: "yellow", children: ["Generate ", info.type === 'video' ? 'a video' : 'an image', " with ", info.displayName, "?"] }), _jsxs(Text, { color: "gray", children: [" \u201C", p.prompt, "\u201D"] }), _jsxs(Text, { color: "gray", children: [" model ", info.model, bits ? ` · ${bits}` : ''] }), _jsxs(Text, { color: "gray", children: [" ~", info.credits, " credits"] }), _jsx(Text, { color: "cyan", children: " [g] Generate [e] Edit params [c] Cancel" })] }));
|
|
444
|
+
}
|
|
445
|
+
/** Animated busy line: spinner frames + elapsed seconds (Claude Code/Codex-style). */
|
|
446
|
+
function BusySpinner() {
|
|
447
|
+
const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
448
|
+
const [tick, setTick] = useState(0);
|
|
449
|
+
const [startedAt] = useState(() => Date.now());
|
|
450
|
+
useEffect(() => {
|
|
451
|
+
const t = setInterval(() => setTick((n) => n + 1), 120);
|
|
452
|
+
return () => clearInterval(t);
|
|
453
|
+
}, []);
|
|
454
|
+
const secs = Math.floor((Date.now() - startedAt) / 1000);
|
|
455
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { color: "cyan", children: [FRAMES[tick % FRAMES.length], " working"] }), _jsxs(Text, { color: "gray", children: [secs > 0 ? ` ${secs}s` : '', " \u00B7 Esc to interrupt"] })] }));
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Assistant/tool row marker. Claude Code uses ⏺ on macOS but measures it via its own
|
|
459
|
+
* emoji-aware stringWidth in a forked renderer; stock ink measures ⏺ as width 1 while
|
|
460
|
+
* iTerm2 renders it 2 cells (emoji presentation), shifting every wrapped line by one
|
|
461
|
+
* column. The geometric ● keeps measurement and rendering consistent everywhere.
|
|
462
|
+
*/
|
|
463
|
+
const DOT = '●';
|
|
464
|
+
/** Dot color: brand coral (from the logo) on truecolor terminals; plain elsewhere. */
|
|
465
|
+
const DOT_COLOR = supportsTruecolor() ? '#F15B66' : undefined;
|
|
466
|
+
/**
|
|
467
|
+
* Pre-wrap ANSI-styled text to fit beside a fixed indent column. Ink's flex measurement
|
|
468
|
+
* doesn't subtract sibling widths when wrapping <Text>, so long styled lines overflow the
|
|
469
|
+
* terminal and hard-wrap at column 0 (Claude Code solves this inside its forked renderer;
|
|
470
|
+
* we wrap in userland with the same wrap-ansi ink itself uses).
|
|
471
|
+
*/
|
|
472
|
+
function fitTo(text, columns, indent) {
|
|
473
|
+
// hard:true — CJK text has no spaces, so soft wrapping never breaks it at all and the
|
|
474
|
+
// terminal hard-wraps instead (the actual bug); hard mode wraps by display width at
|
|
475
|
+
// character boundaries (standard CJK typesetting) while spaced text still breaks at
|
|
476
|
+
// spaces first. Extra 2-column slack: terminals configured with "ambiguous width = wide"
|
|
477
|
+
// (common for CJK users) render ●/›/… at 2 cells while string-width counts 1.
|
|
478
|
+
return wrapAnsi(text, Math.max(20, columns - indent - 2), { hard: true, trim: false });
|
|
479
|
+
}
|
|
480
|
+
function TimelineRow({ item, columns }) {
|
|
481
|
+
switch (item.kind) {
|
|
482
|
+
case 'user':
|
|
483
|
+
// The user's own words are an echo — render them dimmed so replies carry the weight.
|
|
484
|
+
return (_jsxs(Box, { marginTop: 1, children: [_jsx(Box, { width: 2, flexShrink: 0, children: _jsx(Text, { color: "gray", children: "\u203A " }) }), _jsx(Box, { flexGrow: 1, children: _jsx(Text, { color: "gray", children: fitTo(item.text, columns, 3) }) })] }));
|
|
485
|
+
case 'assistant':
|
|
486
|
+
return (_jsxs(Box, { marginTop: 1, children: [_jsx(Box, { width: 2, flexShrink: 0, children: _jsx(Text, { color: DOT_COLOR, children: DOT }) }), _jsx(Box, { flexGrow: 1, children: _jsx(Text, { children: fitTo(applyMarkdown(item.text), columns, 3) }) })] }));
|
|
487
|
+
case 'tool': {
|
|
488
|
+
// Claude Code layout: "⏺ name(arg summary)" with an indented "⎿ result" line.
|
|
489
|
+
const done = item.status === 'done';
|
|
490
|
+
const failed = done && typeof item.result?.error === 'string';
|
|
491
|
+
const cancelled = done && !failed && item.result?.cancelled === true;
|
|
492
|
+
const dotColor = failed ? 'red' : cancelled ? 'gray' : done ? 'green' : 'yellow';
|
|
493
|
+
const argSummary = summarizeArgs(item.args);
|
|
494
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { children: [_jsx(Box, { width: 2, flexShrink: 0, children: _jsx(Text, { color: dotColor, children: DOT }) }), _jsx(Box, { flexGrow: 1, children: _jsxs(Text, { children: [item.name, argSummary ? _jsxs(Text, { color: "gray", children: ["(", fitTo(argSummary, columns, 5 + item.name.length), ")"] }) : null] }) })] }), _jsxs(Box, { children: [_jsx(Box, { width: 4, flexShrink: 0, children: _jsx(Text, { color: "gray", children: ' ⎿ ' }) }), _jsx(Box, { flexGrow: 1, children: _jsx(Text, { color: "gray", children: fitTo(done ? summarizeResult(item.result) : 'running…', columns, 5) }) })] })] }));
|
|
495
|
+
}
|
|
496
|
+
case 'media': {
|
|
497
|
+
const isVideo = /\.(mp4|webm|mov)$/i.test(item.localPath ?? '');
|
|
498
|
+
const noun = isVideo ? 'video' : 'image';
|
|
499
|
+
return item.status === 'done' ? (_jsxs(Box, { children: [_jsxs(Text, { color: "green", children: [DOT, " "] }), _jsxs(Text, { children: [noun, " ready", ' ', _jsxs(Text, { color: "gray", children: ["\u00B7 ", item.localPath ? hyperlink(item.localPath, fileUrl(item.localPath)) : '', " \u00B7 ask about it with @image"] })] })] })) : (_jsxs(Box, { children: [_jsxs(Text, { color: "red", children: [DOT, " "] }), _jsxs(Text, { color: "red", children: ["generation failed: ", item.reason] })] }));
|
|
500
|
+
}
|
|
501
|
+
case 'note':
|
|
502
|
+
return (_jsx(Box, { children: _jsx(Text, { color: "gray", children: item.text }) }));
|
|
503
|
+
case 'error':
|
|
504
|
+
return (_jsx(Box, { children: _jsxs(Text, { color: "red", children: ["error: ", item.text] }) }));
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
function summarizeResult(result) {
|
|
508
|
+
if (!result)
|
|
509
|
+
return 'done';
|
|
510
|
+
if (typeof result.error === 'string')
|
|
511
|
+
return `failed: ${result.error}`;
|
|
512
|
+
if (result.cancelled === true)
|
|
513
|
+
return 'cancelled';
|
|
514
|
+
if (typeof result.task_id === 'string') {
|
|
515
|
+
const credits = typeof result.estimated_credits === 'number' ? ` · ~${result.estimated_credits} credits` : '';
|
|
516
|
+
return `task ${result.task_id} submitted${credits} — generating in the background`;
|
|
517
|
+
}
|
|
518
|
+
return 'done';
|
|
519
|
+
}
|
|
520
|
+
/** 1234 → "1.2k" for the footer token counter. */
|
|
521
|
+
function formatTokens(n) {
|
|
522
|
+
return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);
|
|
523
|
+
}
|
|
524
|
+
/** Compact argument preview for a tool row (the prompt, truncated, plus notable params). */
|
|
525
|
+
function summarizeArgs(args) {
|
|
526
|
+
if (!args)
|
|
527
|
+
return '';
|
|
528
|
+
const bits = [];
|
|
529
|
+
if (typeof args.prompt === 'string' && args.prompt) {
|
|
530
|
+
const p = args.prompt;
|
|
531
|
+
bits.push(p.length > 40 ? `${p.slice(0, 39)}…` : p);
|
|
532
|
+
}
|
|
533
|
+
for (const key of ['model', 'aspect_ratio', 'resolution', 'duration']) {
|
|
534
|
+
const v = args[key];
|
|
535
|
+
if (v !== undefined && v !== null && v !== '')
|
|
536
|
+
bits.push(`${key.replace('_', ' ')}: ${String(v)}`);
|
|
537
|
+
}
|
|
538
|
+
return bits.join(', ');
|
|
539
|
+
}
|
|
540
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/tui/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Multi-line composer input (replaces the single-line ink-text-input).
|
|
4
|
+
*
|
|
5
|
+
* Newline conventions from the references: a trailing `\` + Enter (Claude Code's
|
|
6
|
+
* documented binding — works in every terminal) or Ctrl+J (Codex/readline). Enter
|
|
7
|
+
* submits. Pasted chunks containing newlines insert literally instead of submitting
|
|
8
|
+
* per line. Characters with ctrl/meta modifiers are never inserted (the root fix for
|
|
9
|
+
* ink-text-input's stray 'v' on Ctrl+V).
|
|
10
|
+
*
|
|
11
|
+
* ↑/↓ move the cursor between VISUAL rows (wrapped lines, display-width columns, with
|
|
12
|
+
* column memory — the Claude Code Cursor.ts / Codex textarea.rs model), and history is
|
|
13
|
+
* arbitrated INSIDE the editor (CC's upOrHistoryUp): only when the cursor cannot move
|
|
14
|
+
* any further does ↑/↓ escalate to onHistoryUp/onHistoryDown. The ladder:
|
|
15
|
+
* ↑ → move up a row → (top row) jump to start → (at start) recall history
|
|
16
|
+
* ↓ → symmetric, ending in onHistoryDown
|
|
17
|
+
* While `recallActive` (the parent is mid history-browse and the entry is unedited),
|
|
18
|
+
* boundary ↑/↓ keep browsing instead (Codex should_handle_navigation).
|
|
19
|
+
*/
|
|
20
|
+
export declare function MultilineInput({ value, onChange, onSubmit, onHistoryUp, onHistoryDown, placeholder, focus, verticalNav, recallActive, columns, }: {
|
|
21
|
+
value: string;
|
|
22
|
+
onChange: (value: string) => void;
|
|
23
|
+
onSubmit: (value: string) => void;
|
|
24
|
+
/** ↑ when the cursor is already at the very start of the text (or browsing history). */
|
|
25
|
+
onHistoryUp?: () => void;
|
|
26
|
+
/** ↓ when the cursor is already at the very end of the text (or browsing history). */
|
|
27
|
+
onHistoryDown?: () => void;
|
|
28
|
+
placeholder?: string;
|
|
29
|
+
focus?: boolean;
|
|
30
|
+
/** When false, ↑/↓ are left to the parent (popup selection) even on multi-line values. */
|
|
31
|
+
verticalNav?: boolean;
|
|
32
|
+
/** True while the value is an unedited recalled-history entry (boundary ↑/↓ keep browsing). */
|
|
33
|
+
recallActive?: boolean;
|
|
34
|
+
/** Display width available for text — enables wrapped-row navigation and rendering. */
|
|
35
|
+
columns?: number;
|
|
36
|
+
}): React.ReactElement;
|