@hopper-agent/tui 0.1.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 (75) hide show
  1. package/LICENSE +179 -0
  2. package/dist/src/agents-tab.d.ts +15 -0
  3. package/dist/src/agents-tab.d.ts.map +1 -0
  4. package/dist/src/agents-tab.js +32 -0
  5. package/dist/src/agents-tab.js.map +1 -0
  6. package/dist/src/approval-picker.d.ts +11 -0
  7. package/dist/src/approval-picker.d.ts.map +1 -0
  8. package/dist/src/approval-picker.js +14 -0
  9. package/dist/src/approval-picker.js.map +1 -0
  10. package/dist/src/channels-tab.d.ts +19 -0
  11. package/dist/src/channels-tab.d.ts.map +1 -0
  12. package/dist/src/channels-tab.js +37 -0
  13. package/dist/src/channels-tab.js.map +1 -0
  14. package/dist/src/chat-surface.d.ts +58 -0
  15. package/dist/src/chat-surface.d.ts.map +1 -0
  16. package/dist/src/chat-surface.js +493 -0
  17. package/dist/src/chat-surface.js.map +1 -0
  18. package/dist/src/effort-picker.d.ts +10 -0
  19. package/dist/src/effort-picker.d.ts.map +1 -0
  20. package/dist/src/effort-picker.js +30 -0
  21. package/dist/src/effort-picker.js.map +1 -0
  22. package/dist/src/footer.d.ts +11 -0
  23. package/dist/src/footer.d.ts.map +1 -0
  24. package/dist/src/footer.js +11 -0
  25. package/dist/src/footer.js.map +1 -0
  26. package/dist/src/header.d.ts +11 -0
  27. package/dist/src/header.d.ts.map +1 -0
  28. package/dist/src/header.js +15 -0
  29. package/dist/src/header.js.map +1 -0
  30. package/dist/src/index.d.ts +25 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/index.js +17 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/init-wizard.d.ts +37 -0
  35. package/dist/src/init-wizard.d.ts.map +1 -0
  36. package/dist/src/init-wizard.js +500 -0
  37. package/dist/src/init-wizard.js.map +1 -0
  38. package/dist/src/mascot.d.ts +2 -0
  39. package/dist/src/mascot.d.ts.map +1 -0
  40. package/dist/src/mascot.js +6 -0
  41. package/dist/src/mascot.js.map +1 -0
  42. package/dist/src/mode-picker.d.ts +10 -0
  43. package/dist/src/mode-picker.d.ts.map +1 -0
  44. package/dist/src/mode-picker.js +29 -0
  45. package/dist/src/mode-picker.js.map +1 -0
  46. package/dist/src/projects-tab.d.ts +16 -0
  47. package/dist/src/projects-tab.d.ts.map +1 -0
  48. package/dist/src/projects-tab.js +76 -0
  49. package/dist/src/projects-tab.js.map +1 -0
  50. package/dist/src/slash-commands.d.ts +87 -0
  51. package/dist/src/slash-commands.d.ts.map +1 -0
  52. package/dist/src/slash-commands.js +814 -0
  53. package/dist/src/slash-commands.js.map +1 -0
  54. package/dist/src/stats-data.d.ts +15 -0
  55. package/dist/src/stats-data.d.ts.map +1 -0
  56. package/dist/src/stats-data.js +76 -0
  57. package/dist/src/stats-data.js.map +1 -0
  58. package/dist/src/stats-tab.d.ts +16 -0
  59. package/dist/src/stats-tab.d.ts.map +1 -0
  60. package/dist/src/stats-tab.js +103 -0
  61. package/dist/src/stats-tab.js.map +1 -0
  62. package/dist/src/status-line.d.ts +13 -0
  63. package/dist/src/status-line.d.ts.map +1 -0
  64. package/dist/src/status-line.js +31 -0
  65. package/dist/src/status-line.js.map +1 -0
  66. package/dist/src/tab-bar.d.ts +14 -0
  67. package/dist/src/tab-bar.d.ts.map +1 -0
  68. package/dist/src/tab-bar.js +22 -0
  69. package/dist/src/tab-bar.js.map +1 -0
  70. package/dist/src/waiting-dot.d.ts +8 -0
  71. package/dist/src/waiting-dot.d.ts.map +1 -0
  72. package/dist/src/waiting-dot.js +19 -0
  73. package/dist/src/waiting-dot.js.map +1 -0
  74. package/dist/tsconfig.tsbuildinfo +1 -0
  75. package/package.json +38 -0
@@ -0,0 +1,493 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React, { useState, useEffect, useRef, useCallback } from 'react';
3
+ import { Box, Text, useInput, useApp, useStdin, useStdout } from 'ink';
4
+ import { Header } from './header.js';
5
+ import { TabBar, TAB_IDS } from './tab-bar.js';
6
+ import { Footer } from './footer.js';
7
+ import { WaitingDot } from './waiting-dot.js';
8
+ import { EffortPicker, EFFORT_LEVELS } from './effort-picker.js';
9
+ import { ModePicker, MODE_LEVELS } from './mode-picker.js';
10
+ import { ApprovalPicker } from './approval-picker.js';
11
+ import { parseSlashCommand } from './slash-commands.js';
12
+ import { ProjectsTab } from './projects-tab.js';
13
+ import { StatsTab } from './stats-tab.js';
14
+ import { AgentsTab } from './agents-tab.js';
15
+ import { ChannelsTab } from './channels-tab.js';
16
+ // How many terminal rows a message occupies.
17
+ function messageRows(msg) {
18
+ const lines = msg.content.split('\n').length;
19
+ switch (msg.role) {
20
+ case 'user':
21
+ return 2 + lines; // top filler + lines + bottom filler
22
+ case 'assistant':
23
+ return 1 + lines; // top blank + lines
24
+ case 'tool':
25
+ return 1 + lines;
26
+ case 'tool-group':
27
+ return msg.content.split(' · ').filter(Boolean).length;
28
+ case 'decision':
29
+ return (msg.title ? 1 : 0) + lines;
30
+ case 'system':
31
+ return lines;
32
+ case 'heartbeat':
33
+ return 2 + lines; // border top + lines + border bottom
34
+ default:
35
+ return 1;
36
+ }
37
+ }
38
+ // Fixed row counts for chrome layout.
39
+ const HEADER_ROWS = 6;
40
+ const TABBAR_ROWS = 2;
41
+ const FOOTER_ROWS = 4;
42
+ const INPUT_BASE_ROWS = 1;
43
+ export function ChatSurface({ messages, model, approvalMode, effort, inputTokens = 0, outputTokens = 0, contextWindowSize = 200_000, project = 'homepage-refactor-0422', duration = '00:00:00', costUsd = 0, activeTab = 'assistant', status = 'idle', contextMode = 'CodeContext Zen', agent, onSubmit, onCancel, onInterrupt, onSlashCommand, onBashCommand, onEffortChange, onModeChange, theme, projects, agents, pendingApproval, onApprovalDecision, onSelectProject, channels, onChannelSelect, debug, }) {
44
+ const [inputText, setInputText] = useState('');
45
+ const [currentTab, setCurrentTab] = useState(activeTab);
46
+ React.useEffect(() => { setCurrentTab(activeTab); }, [activeTab]);
47
+ const [history, setHistory] = useState([]);
48
+ // Scrolling state.
49
+ const [scrollOffset, setScrollOffset] = useState(0);
50
+ const prevMsgLenRef = useRef(messages.length);
51
+ // historyIndex: null = not browsing (showing live draft); otherwise index
52
+ // into `history` from the end (0 = most recent).
53
+ const [historyIndex, setHistoryIndex] = useState(null);
54
+ const draftRef = React.useRef('');
55
+ const [exitHint, setExitHint] = useState(null);
56
+ const exitArmedRef = React.useRef(null);
57
+ const [approvalSelection, setApprovalSelection] = useState('allow');
58
+ useEffect(() => {
59
+ if (pendingApproval)
60
+ setApprovalSelection('allow');
61
+ }, [pendingApproval]);
62
+ const [effortPickerOpen, setEffortPickerOpen] = useState(false);
63
+ const [effortIndex, setEffortIndex] = useState(0);
64
+ const [modePickerOpen, setModePickerOpen] = useState(false);
65
+ const [modeIndex, setModeIndex] = useState(0);
66
+ const { exit } = useApp();
67
+ const { setRawMode } = useStdin();
68
+ const { stdout } = useStdout();
69
+ const [size, setSize] = useState({
70
+ rows: stdout?.rows ?? 30,
71
+ cols: stdout?.columns ?? 100,
72
+ });
73
+ useEffect(() => {
74
+ if (!stdout)
75
+ return;
76
+ const onResize = () => setSize({ rows: stdout.rows ?? 30, cols: stdout.columns ?? 100 });
77
+ stdout.on('resize', onResize);
78
+ return () => {
79
+ stdout.off('resize', onResize);
80
+ };
81
+ }, [stdout]);
82
+ useEffect(() => {
83
+ setRawMode(true);
84
+ return () => {
85
+ setRawMode(false);
86
+ };
87
+ }, [setRawMode]);
88
+ // Enable SGR mouse reporting so wheel events trigger terminal scrollback.
89
+ useEffect(() => {
90
+ if (!process.stdin?.isTTY)
91
+ return;
92
+ process.stdout.write('\x1b[?1000h\x1b[?1006h');
93
+ return () => {
94
+ process.stdout.write('\x1b[?1006l\x1b[?1000l');
95
+ };
96
+ }, []);
97
+ // Ask terminals that support the kitty keyboard protocol to send
98
+ // disambiguated escape codes — that's what makes Shift+Enter arrive as a
99
+ // distinct sequence (ESC[13;2u) instead of bare CR. Ink 7 parses CSI-u
100
+ // natively, so no raw-stdin listener is needed — double listeners produced
101
+ // two newlines per keypress.
102
+ useEffect(() => {
103
+ if (!process.stdin?.isTTY)
104
+ return;
105
+ process.stdout.write('\x1b[>1u');
106
+ return () => {
107
+ process.stdout.write('\x1b[<u');
108
+ };
109
+ }, []);
110
+ // Mouse wheel listener for scrolling the message area.
111
+ // SGR format: ESC[<Btn;Col;RowM — bit 6 set = scroll event, bit 0 = down (0=up, 1=down)
112
+ const scrollOffsetRef = useRef(scrollOffset);
113
+ const maxScrollOffsetRef = useRef(0);
114
+ const handleWheel = useCallback((data) => {
115
+ const str = data.toString();
116
+ const match = str.match(/\x1b\[<(\d+);(\d+);(\d+)M/);
117
+ if (!match)
118
+ return;
119
+ const btn = parseInt(match[1], 10);
120
+ if ((btn & 64) === 0)
121
+ return; // not a scroll event
122
+ // scroll-up (btn&1 === 0) → increase offset to show older msgs; scroll-down → decrease toward 0 (bottom)
123
+ const dir = (btn & 1) === 0 ? 1 : -1;
124
+ setScrollOffset(prev => {
125
+ const next = prev + dir * 3;
126
+ return Math.max(0, Math.min(maxScrollOffsetRef.current, next));
127
+ });
128
+ }, []);
129
+ useEffect(() => {
130
+ if (!process.stdin)
131
+ return;
132
+ process.stdin.on('data', handleWheel);
133
+ return () => {
134
+ process.stdin?.off('data', handleWheel);
135
+ };
136
+ }, [handleWheel]);
137
+ const scrollBy = useCallback((delta) => {
138
+ setScrollOffset(prev => Math.max(0, Math.min(maxScrollOffsetRef.current, prev + delta)));
139
+ }, []);
140
+ const inputLineCount = inputText.split('\n').length;
141
+ const shellHintRows = inputText.startsWith('!') ? 1 : 0;
142
+ const exitHintRows = exitHint ? 1 : 0;
143
+ const inputRows = Math.max(INPUT_BASE_ROWS, inputLineCount) + shellHintRows + exitHintRows;
144
+ const messageAreaRows = Math.max(4, size.rows - HEADER_ROWS - TABBAR_ROWS - FOOTER_ROWS - inputRows);
145
+ // Keep refs in sync for use inside the stdin listener.
146
+ scrollOffsetRef.current = scrollOffset;
147
+ // Auto-scroll: when messages grow, stay at bottom if we were there.
148
+ useEffect(() => {
149
+ const prevLen = prevMsgLenRef.current;
150
+ prevMsgLenRef.current = messages.length;
151
+ if (messages.length > prevLen && scrollOffset === 0) {
152
+ setScrollOffset(0);
153
+ }
154
+ }, [messages.length, scrollOffset]);
155
+ // Compute visible messages based on scroll offset.
156
+ // scrollOffset=0 → show tail (newest); scrollOffset>0 → scroll back into history.
157
+ const visibleMessages = (() => {
158
+ const rowsNeeded = status !== 'idle' && !pendingApproval && !effortPickerOpen && !modePickerOpen ? 1 : 0;
159
+ const availRows = messageAreaRows - rowsNeeded;
160
+ const msgRows = messages.map((m, i) => ({ msg: m, idx: i, rows: messageRows(m) }));
161
+ const totalRows = msgRows.reduce((s, m) => s + m.rows, 0);
162
+ const maxOffset = Math.max(0, totalRows - availRows);
163
+ maxScrollOffsetRef.current = maxOffset;
164
+ // clamp in case messages were removed and offset is now stale
165
+ const clampedOffset = Math.min(scrollOffset, maxOffset);
166
+ // skipRows = how many rows from the top to skip
167
+ const skipRows = maxOffset - clampedOffset;
168
+ const visible = [];
169
+ let used = 0, cumRows = 0;
170
+ for (const item of msgRows) {
171
+ if (cumRows < skipRows) {
172
+ cumRows += item.rows;
173
+ continue;
174
+ }
175
+ if (used >= availRows)
176
+ break;
177
+ used += item.rows;
178
+ visible.push(item);
179
+ }
180
+ return visible;
181
+ })();
182
+ useInput((char, key) => {
183
+ // Approval modal has the highest priority — blocks everything else.
184
+ if (pendingApproval) {
185
+ if (char === 'y' || char === 'Y') {
186
+ onApprovalDecision?.('allow');
187
+ return;
188
+ }
189
+ if (char === 'n' || char === 'N') {
190
+ onApprovalDecision?.('deny');
191
+ return;
192
+ }
193
+ if (key.escape) {
194
+ onApprovalDecision?.('deny');
195
+ return;
196
+ }
197
+ if (key.tab || key.leftArrow || key.rightArrow) {
198
+ setApprovalSelection(s => s === 'allow' ? 'deny' : 'allow');
199
+ return;
200
+ }
201
+ if (key.return) {
202
+ onApprovalDecision?.(approvalSelection);
203
+ return;
204
+ }
205
+ return;
206
+ }
207
+ // While the effort picker is open, it captures all input.
208
+ if (effortPickerOpen) {
209
+ if (key.escape) {
210
+ setEffortPickerOpen(false);
211
+ return;
212
+ }
213
+ if (key.tab) {
214
+ const dir = key.shift ? -1 : 1;
215
+ setEffortIndex(i => (i + dir + EFFORT_LEVELS.length) % EFFORT_LEVELS.length);
216
+ return;
217
+ }
218
+ if (key.upArrow) {
219
+ setEffortIndex(i => (i - 1 + EFFORT_LEVELS.length) % EFFORT_LEVELS.length);
220
+ return;
221
+ }
222
+ if (key.downArrow) {
223
+ setEffortIndex(i => (i + 1) % EFFORT_LEVELS.length);
224
+ return;
225
+ }
226
+ if (key.return) {
227
+ const chosen = EFFORT_LEVELS[effortIndex];
228
+ onEffortChange?.(chosen);
229
+ setEffortPickerOpen(false);
230
+ return;
231
+ }
232
+ // Ctrl+E toggles the picker closed as well
233
+ if (key.ctrl && char === 'e') {
234
+ setEffortPickerOpen(false);
235
+ return;
236
+ }
237
+ return; // swallow everything else
238
+ }
239
+ // While the mode picker is open, it captures all input.
240
+ if (modePickerOpen) {
241
+ // Ctrl+F closes the picker
242
+ if (key.ctrl && char === 'f') {
243
+ setModePickerOpen(false);
244
+ return;
245
+ }
246
+ if (key.escape) {
247
+ setModePickerOpen(false);
248
+ return;
249
+ }
250
+ if (key.tab) {
251
+ const dir = key.shift ? -1 : 1;
252
+ setModeIndex(i => (i + dir + MODE_LEVELS.length) % MODE_LEVELS.length);
253
+ return;
254
+ }
255
+ if (key.upArrow) {
256
+ setModeIndex(i => (i - 1 + MODE_LEVELS.length) % MODE_LEVELS.length);
257
+ return;
258
+ }
259
+ if (key.downArrow) {
260
+ setModeIndex(i => (i + 1) % MODE_LEVELS.length);
261
+ return;
262
+ }
263
+ if (key.return) {
264
+ const chosen = MODE_LEVELS[modeIndex];
265
+ onModeChange?.(chosen);
266
+ setModePickerOpen(false);
267
+ return;
268
+ }
269
+ return;
270
+ }
271
+ // Ctrl+E opens the effort picker.
272
+ if (key.ctrl && char === 'e') {
273
+ const current = EFFORT_LEVELS.indexOf(effort);
274
+ setEffortIndex(current >= 0 ? current : 0);
275
+ setEffortPickerOpen(true);
276
+ return;
277
+ }
278
+ // Ctrl+F opens the approval mode picker.
279
+ // (Ctrl+M = carriage return byte 0x0D — indistinguishable from Enter)
280
+ if (key.ctrl && char === 'f') {
281
+ const idx = MODE_LEVELS.indexOf(approvalMode);
282
+ setModeIndex(idx >= 0 ? idx : 0);
283
+ setModePickerOpen(true);
284
+ return;
285
+ }
286
+ // PageUp / Shift+Up — scroll up into history (half a page per press).
287
+ if (key.pageUp || (key.shift && key.upArrow)) {
288
+ scrollBy(Math.max(1, Math.floor(messageAreaRows / 2)));
289
+ return;
290
+ }
291
+ // PageDown / Shift+Down — scroll down toward bottom.
292
+ if (key.pageDown || (key.shift && key.downArrow)) {
293
+ scrollBy(-Math.max(1, Math.floor(messageAreaRows / 2)));
294
+ return;
295
+ }
296
+ if (key.escape) {
297
+ // ESC aborts the in-flight agent turn / shell command but does not
298
+ // quit the app. Use /exit, Ctrl+C×2, or Ctrl+D×2 to exit.
299
+ onInterrupt?.();
300
+ return;
301
+ }
302
+ if (key.tab) {
303
+ const idx = TAB_IDS.indexOf(currentTab);
304
+ const delta = key.shift ? -1 : 1;
305
+ const next = TAB_IDS[(idx + delta + TAB_IDS.length) % TAB_IDS.length];
306
+ setCurrentTab(next);
307
+ return;
308
+ }
309
+ if (currentTab === 'channels' && channels?.length && key.return) {
310
+ // Enter selects the first channel (ChannelsTab manages its own selection)
311
+ const first = channels[0];
312
+ if (first)
313
+ onChannelSelect?.(first.id);
314
+ return;
315
+ }
316
+ // Ctrl+D twice in quick succession exits. First press arms the sequence
317
+ // and shows a hint; a second Ctrl+D within 1500ms triggers the exit.
318
+ if (key.ctrl && char === 'd') {
319
+ const now = Date.now();
320
+ const armed = exitArmedRef.current;
321
+ if (armed && armed.key === 'd' && now < armed.expiresAt) {
322
+ exit();
323
+ onCancel();
324
+ return;
325
+ }
326
+ exitArmedRef.current = { key: 'd', expiresAt: now + 1500 };
327
+ setExitHint('Press Ctrl+D again to exit');
328
+ setTimeout(() => {
329
+ if (exitArmedRef.current && Date.now() >= exitArmedRef.current.expiresAt) {
330
+ exitArmedRef.current = null;
331
+ setExitHint(null);
332
+ }
333
+ }, 1600);
334
+ return;
335
+ }
336
+ if (currentTab === 'projects' || currentTab === 'stats' || currentTab === 'agents' || currentTab === 'channels')
337
+ return;
338
+ if (key.upArrow) {
339
+ // Walk back through submitted-command history.
340
+ if (history.length === 0)
341
+ return;
342
+ setHistoryIndex(prev => {
343
+ if (prev === null) {
344
+ draftRef.current = inputText;
345
+ const next = history.length - 1;
346
+ setInputText(history[next] ?? '');
347
+ return next;
348
+ }
349
+ const next = Math.max(0, prev - 1);
350
+ setInputText(history[next] ?? '');
351
+ return next;
352
+ });
353
+ return;
354
+ }
355
+ if (key.downArrow) {
356
+ if (historyIndex === null)
357
+ return;
358
+ setHistoryIndex(prev => {
359
+ if (prev === null)
360
+ return null;
361
+ const next = prev + 1;
362
+ if (next >= history.length) {
363
+ setInputText(draftRef.current);
364
+ return null;
365
+ }
366
+ setInputText(history[next] ?? '');
367
+ return next;
368
+ });
369
+ return;
370
+ }
371
+ if (key.return) {
372
+ // Shift+Enter or Alt+Enter insert a newline. Works only when the
373
+ // terminal emits a distinct sequence for the modifier (most modern
374
+ // terminals do; see the raw stdin listener below for CSI-u fallback).
375
+ if (key.shift || key.meta) {
376
+ setInputText(prev => prev + '\n');
377
+ return;
378
+ }
379
+ const text = inputText.trim();
380
+ if (text) {
381
+ setInputText('');
382
+ // Record in history, deduping consecutive repeats.
383
+ setHistory(prev => (prev[prev.length - 1] === text ? prev : [...prev, text]));
384
+ setHistoryIndex(null);
385
+ draftRef.current = '';
386
+ if (text.startsWith('!') && onBashCommand) {
387
+ const cmd = text.slice(1).trim();
388
+ if (cmd)
389
+ onBashCommand(cmd);
390
+ return;
391
+ }
392
+ const parsed = parseSlashCommand(text);
393
+ if (parsed && onSlashCommand) {
394
+ onSlashCommand(parsed);
395
+ }
396
+ else {
397
+ onSubmit(text);
398
+ }
399
+ }
400
+ return;
401
+ }
402
+ if (key.ctrl && char === 'c') {
403
+ const now = Date.now();
404
+ const armed = exitArmedRef.current;
405
+ if (armed && armed.key === 'c' && now < armed.expiresAt) {
406
+ exit();
407
+ // Trigger the app's onCancel so the host (CLI) can run any cleanup
408
+ // (e.g. restoring the terminal and printing the resume hint) even if
409
+ // Ink would otherwise keep the event loop alive.
410
+ onCancel();
411
+ return;
412
+ }
413
+ exitArmedRef.current = { key: 'c', expiresAt: now + 1500 };
414
+ setExitHint('Press Ctrl+C again to exit');
415
+ setTimeout(() => {
416
+ if (exitArmedRef.current && Date.now() >= exitArmedRef.current.expiresAt) {
417
+ exitArmedRef.current = null;
418
+ setExitHint(null);
419
+ }
420
+ }, 1600);
421
+ return;
422
+ }
423
+ if (key.backspace || key.delete) {
424
+ if (historyIndex !== null)
425
+ setHistoryIndex(null);
426
+ setInputText(prev => prev.slice(0, -1));
427
+ return;
428
+ }
429
+ if (char && !key.ctrl && !key.meta) {
430
+ if (historyIndex !== null)
431
+ setHistoryIndex(null);
432
+ setInputText(prev => prev + char);
433
+ }
434
+ });
435
+ const muted = theme?.muted || '#565f89';
436
+ const primary = theme?.primary || '#7aa2f7';
437
+ const warning = theme?.warning || '#e0af68';
438
+ const success = theme?.success || '#9ece6a';
439
+ const fg = theme?.foreground || '#a9b1d6';
440
+ const bg = theme?.background || '#1a1b26';
441
+ const totalTokens = inputTokens + outputTokens;
442
+ return (_jsxs(Box, { flexDirection: "column", width: "100%", height: size.rows, children: [_jsx(Header, { project: project, duration: duration, totalTokens: totalTokens, costUsd: costUsd, theme: theme }), _jsx(TabBar, { active: currentTab, theme: theme }), _jsx(Box, { flexDirection: "column", paddingX: 1, height: messageAreaRows, children: currentTab === 'projects' ? (_jsx(ProjectsTab, { projects: projects ?? [], theme: theme, isActive: currentTab === 'projects', onSelectProject: onSelectProject })) : currentTab === 'stats' ? (_jsx(StatsTab, { theme: theme, isActive: currentTab === 'stats', model: model, inputTokens: inputTokens, outputTokens: outputTokens, contextWindowSize: contextWindowSize })) : currentTab === 'channels' ? (_jsx(ChannelsTab, { channels: channels ?? [], theme: theme, isActive: currentTab === 'channels', onSelectChannel: onChannelSelect })) : currentTab === 'agents' ? (_jsx(AgentsTab, { agents: agents ?? new Map(), isActive: currentTab === 'agents', theme: theme })) : (_jsxs(_Fragment, { children: [pendingApproval && (_jsx(ApprovalPicker, { toolName: pendingApproval.toolName, input: pendingApproval.input, reason: pendingApproval.reason, selected: approvalSelection, theme: theme })), !pendingApproval && effortPickerOpen && (_jsx(EffortPicker, { selectedIndex: effortIndex, theme: theme })), !pendingApproval && modePickerOpen && (_jsx(ModePicker, { selectedIndex: modeIndex, theme: theme })), !pendingApproval && !effortPickerOpen && !modePickerOpen && visibleMessages.map(({ msg, idx }) => {
443
+ if (msg.role === 'user') {
444
+ // Row width after the outer paddingX={1} on the message area and
445
+ // the single-column left border. One leading space on every line
446
+ // creates a gap between the border and text that still carries
447
+ // the slab background.
448
+ const rowWidth = Math.max(1, size.cols - 3);
449
+ const gap = ' ';
450
+ const innerWidth = Math.max(1, rowWidth - gap.length);
451
+ const filler = gap + ' '.repeat(innerWidth);
452
+ const userBg = theme?.userBackground ?? bg;
453
+ const userFg = theme?.userForeground ?? fg;
454
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: primary, borderTop: false, borderRight: false, borderBottom: false, children: [_jsx(Text, { backgroundColor: userBg, children: filler }), msg.content.split('\n').map((line, li) => {
455
+ const pad = Math.max(0, innerWidth - line.length);
456
+ return (_jsx(Text, { backgroundColor: userBg, color: userFg, children: gap + line + ' '.repeat(pad) }, li));
457
+ }), _jsx(Text, { backgroundColor: userBg, children: filler })] }, idx));
458
+ }
459
+ if (msg.role === 'decision') {
460
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: warning, paddingX: 1, marginY: 1, children: [msg.title && (_jsx(Text, { color: warning, bold: true, children: msg.title })), _jsx(Text, { color: warning, children: msg.content })] }, idx));
461
+ }
462
+ if (msg.role === 'tool-group') {
463
+ // In debug mode, split by " · " and show each tool call on its own line.
464
+ if (debug) {
465
+ const tools = msg.content.split(' · ').map(s => s.trim()).filter(Boolean);
466
+ return (_jsx(Box, { flexDirection: "column", marginTop: 1, children: tools.map((t, ti) => (_jsx(Text, { color: muted, children: t }, ti))) }, idx));
467
+ }
468
+ return (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: muted, children: msg.content }) }, idx));
469
+ }
470
+ if (msg.role === 'tool') {
471
+ return (_jsx(Box, { flexDirection: "column", marginTop: 1, marginBottom: 1, children: _jsxs(Box, { children: [_jsx(Text, { color: success, children: '[✔] ' }), _jsx(Text, { color: fg, children: msg.content })] }) }, idx));
472
+ }
473
+ if (msg.role === 'heartbeat') {
474
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: success, paddingX: 1, marginY: 1, children: [_jsx(Text, { color: success, bold: true, children: '[heartbeat] ' + (msg.title ?? '') }), msg.content.split('\n').map((line, li) => (_jsx(Text, { color: fg, children: line }, li)))] }, idx));
475
+ }
476
+ if (msg.role === 'system') {
477
+ const isReminder = msg.content.startsWith('Hopper reminder:');
478
+ return (_jsx(Box, { children: _jsx(Text, { color: isReminder ? warning : muted, children: msg.content }) }, idx));
479
+ }
480
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { children: ' '.repeat(Math.max(10, size.cols - 4)) }), msg.content.split('\n').map((line, li) => (_jsx(Text, { color: fg, children: line }, li))), _jsx(Text, { children: ' '.repeat(Math.max(10, size.cols - 4)) })] }, idx));
481
+ }), !pendingApproval && !effortPickerOpen && !modePickerOpen && status !== 'idle' && (_jsx(Box, { marginTop: 1, children: _jsx(WaitingDot, { theme: theme }) }))] })) }), _jsxs(Box, { flexDirection: "column", paddingX: 1, children: [exitHint && (_jsx(Box, { children: _jsx(Text, { color: warning, children: exitHint }) })), inputText.startsWith('!') && (_jsx(Box, { children: _jsx(Text, { color: warning, children: "(shell mode \u2014 Enter to run, Shift/Alt+Enter for newline)" }) })), (() => {
482
+ const lines = inputText.split('\n');
483
+ const isShell = inputText.startsWith('!');
484
+ const promptColor = isShell ? warning : primary;
485
+ const promptGlyph = isShell ? '$' : '>';
486
+ return lines.map((line, li) => {
487
+ const isFirst = li === 0;
488
+ const isLast = li === lines.length - 1;
489
+ return (_jsxs(Box, { children: [_jsx(Text, { color: promptColor, children: isFirst ? `hopper-agent${promptGlyph} ` : ' ' }), _jsx(Text, { color: fg, children: line }), isLast && _jsx(Text, { color: fg, children: "_" })] }, li));
490
+ });
491
+ })()] }), _jsx(Footer, { status: status, mode: approvalMode, effort: effort, model: model, theme: theme })] }));
492
+ }
493
+ //# sourceMappingURL=chat-surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-surface.js","sourceRoot":"","sources":["../../src/chat-surface.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ThemeColors } from '../../render/src/themes.js';
2
+ export declare const EFFORT_LEVELS: readonly ["low", "medium", "high", "max", "auto"];
3
+ export type EffortLevel = typeof EFFORT_LEVELS[number];
4
+ interface EffortPickerProps {
5
+ selectedIndex: number;
6
+ theme?: ThemeColors;
7
+ }
8
+ export declare function EffortPicker({ selectedIndex, theme }: EffortPickerProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=effort-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effort-picker.d.ts","sourceRoot":"","sources":["../../src/effort-picker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,eAAO,MAAM,aAAa,mDAAoD,CAAC;AAC/E,MAAM,MAAM,WAAW,GAAG,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAEvD,UAAU,iBAAiB;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,iBAAiB,2CAuDvE"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ export const EFFORT_LEVELS = ['low', 'medium', 'high', 'max', 'auto'];
4
+ export function EffortPicker({ selectedIndex, theme }) {
5
+ const primary = theme?.primary || '#7aa2f7';
6
+ const muted = theme?.muted || '#565f89';
7
+ const border = theme?.border || '#414868';
8
+ const fg = theme?.foreground || '#a9b1d6';
9
+ const bg = theme?.background || '#1a1b26';
10
+ // Width of each row (content area inside the bordered panel).
11
+ const rowWidth = 22;
12
+ const title = 'Reasoning effort';
13
+ const hint = 'Tab · Enter save · Esc';
14
+ const centered = (text, width) => {
15
+ if (text.length >= width)
16
+ return text.slice(0, width);
17
+ const pad = width - text.length;
18
+ const left = Math.floor(pad / 2);
19
+ const right = pad - left;
20
+ return ' '.repeat(left) + text + ' '.repeat(right);
21
+ };
22
+ return (_jsx(Box, { justifyContent: "center", alignItems: "center", flexGrow: 1, children: _jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: primary, paddingX: 1, children: [_jsx(Text, { bold: true, color: primary, backgroundColor: bg, children: centered(title, rowWidth) }), _jsx(Text, { backgroundColor: bg, children: ' '.repeat(rowWidth) }), EFFORT_LEVELS.map((level, i) => {
23
+ const isActive = i === selectedIndex;
24
+ const marker = isActive ? ' › ' : ' ';
25
+ const label = `${marker}${level}`;
26
+ const padding = ' '.repeat(Math.max(0, rowWidth - label.length));
27
+ return (_jsx(Text, { color: isActive ? primary : fg, backgroundColor: isActive ? border : bg, bold: isActive, children: label + padding }, level));
28
+ }), _jsx(Text, { backgroundColor: bg, children: ' '.repeat(rowWidth) }), _jsx(Text, { color: muted, backgroundColor: bg, children: centered(hint, rowWidth) })] }) }));
29
+ }
30
+ //# sourceMappingURL=effort-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effort-picker.js","sourceRoot":"","sources":["../../src/effort-picker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ThemeColors } from '../../render/src/themes.js';
2
+ interface FooterProps {
3
+ status: string;
4
+ mode: string;
5
+ effort?: string;
6
+ model?: string;
7
+ theme?: ThemeColors;
8
+ }
9
+ export declare function Footer({ status, mode, effort, model, theme }: FooterProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=footer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../src/footer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,wBAAgB,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,2CAgDzE"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ export function Footer({ status, mode, effort, model, theme }) {
4
+ const primary = theme?.primary || '#7aa2f7';
5
+ const muted = theme?.muted || '#565f89';
6
+ const border = theme?.border || '#414868';
7
+ const fg = theme?.foreground || '#a9b1d6';
8
+ const warning = theme?.warning || '#e0af68';
9
+ return (_jsxs(Box, { flexDirection: "column", width: "100%", children: [_jsxs(Box, { borderStyle: "single", borderColor: border, paddingX: 1, justifyContent: "space-between", children: [_jsxs(Text, { color: fg, children: ["[STATUS: ", _jsx(Text, { color: warning, children: status.toUpperCase() }), "]", model ? (_jsxs(_Fragment, { children: [_jsx(Text, { color: muted, children: " | " }), "MODEL: ", _jsx(Text, { color: primary, children: model })] })) : null] }), _jsxs(Text, { color: fg, children: ["MODE: ", _jsx(Text, { color: primary, children: mode }), _jsx(Text, { color: muted, children: " | " }), "EFFORT ", _jsx(Text, { color: primary, children: effort ?? 'auto' })] })] }), _jsx(Box, { paddingX: 1, justifyContent: "flex-end", children: _jsxs(Text, { color: muted, children: [_jsx(Text, { color: fg, children: "/help" }), " - Help", ' ', _jsx(Text, { color: muted, children: "|" }), ' ', _jsx(Text, { color: fg, children: "Tab" }), " - Change tabs", ' ', _jsx(Text, { color: muted, children: "|" }), ' ', _jsx(Text, { color: fg, children: "Ctrl+F" }), " - Mode picker", ' ', _jsx(Text, { color: muted, children: "|" }), ' ', _jsx(Text, { color: fg, children: "Ctrl+E" }), " - Effort picker", ' ', _jsx(Text, { color: muted, children: "|" }), ' ', _jsx(Text, { color: fg, children: "/agent <prompt>" }), " - Run agent", ' ', _jsx(Text, { color: muted, children: "|" }), ' ', _jsx(Text, { color: fg, children: "Esc" }), " - Cancel"] }) })] }));
10
+ }
11
+ //# sourceMappingURL=footer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../src/footer.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAWhC,MAAM,UAAU,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAe;IACxE,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,SAAS,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,SAAS,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,SAAS,CAAC;IAC1C,MAAM,EAAE,GAAG,KAAK,EAAE,UAAU,IAAI,SAAS,CAAC;IAC1C,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,SAAS,CAAC;IAE5C,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,aACtC,MAAC,GAAG,IACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,aAE9B,MAAC,IAAI,IAAC,KAAK,EAAE,EAAE,0BACJ,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,YAAG,MAAM,CAAC,WAAW,EAAE,GAAQ,OAC3D,KAAK,CAAC,CAAC,CAAC,CACP,8BACE,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,sBAAc,aACzB,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,YAAG,KAAK,GAAQ,IAC1C,CACJ,CAAC,CAAC,CAAC,IAAI,IACH,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,EAAE,uBACP,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,YAAG,IAAI,GAAQ,EACzC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,sBAAc,aACzB,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,YAAG,MAAM,IAAI,MAAM,GAAQ,IACjD,IACH,EAEN,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAC,UAAU,YACzC,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,aAChB,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,sBAAc,aAAQ,GAAG,EACxC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,kBAAU,EAAC,GAAG,EAChC,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,oBAAY,oBAAe,GAAG,EAC7C,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,kBAAU,EAAC,GAAG,EAChC,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,uBAAe,oBAAe,GAAG,EAChD,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,kBAAU,EAAC,GAAG,EAChC,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,uBAAe,sBAAiB,GAAG,EAClD,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,kBAAU,EAAC,GAAG,EAChC,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,gCAA8B,kBAAa,GAAG,EAC7D,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,kBAAU,EAAC,GAAG,EAChC,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,oBAAY,iBACtB,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ThemeColors } from '../../render/src/themes.js';
2
+ interface HeaderProps {
3
+ project: string;
4
+ duration: string;
5
+ totalTokens: number;
6
+ costUsd: number;
7
+ theme?: ThemeColors;
8
+ }
9
+ export declare function Header({ project, duration, totalTokens, costUsd, theme }: HeaderProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=header.d.ts.map