surfcode 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +325 -2
  3. package/assets/surfcode-logo.gif +0 -0
  4. package/dist/cli/auth.js +315 -0
  5. package/dist/cli/auth.js.map +1 -0
  6. package/dist/cli/config.js +228 -0
  7. package/dist/cli/config.js.map +1 -0
  8. package/dist/cli/headless.js +355 -0
  9. package/dist/cli/headless.js.map +1 -0
  10. package/dist/cli/inspect.js +462 -0
  11. package/dist/cli/inspect.js.map +1 -0
  12. package/dist/cli/interactive.js +130 -0
  13. package/dist/cli/interactive.js.map +1 -0
  14. package/dist/cli/sessions.js +170 -0
  15. package/dist/cli/sessions.js.map +1 -0
  16. package/dist/cli/sync.js +190 -0
  17. package/dist/cli/sync.js.map +1 -0
  18. package/dist/cli/util.js +345 -0
  19. package/dist/cli/util.js.map +1 -0
  20. package/dist/cli.js +485 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/core/agent.js +298 -0
  23. package/dist/core/agent.js.map +1 -0
  24. package/dist/core/agents.js +55 -0
  25. package/dist/core/agents.js.map +1 -0
  26. package/dist/core/auth.js +107 -0
  27. package/dist/core/auth.js.map +1 -0
  28. package/dist/core/catalog.js +306 -0
  29. package/dist/core/catalog.js.map +1 -0
  30. package/dist/core/chat/anthropic.js +222 -0
  31. package/dist/core/chat/anthropic.js.map +1 -0
  32. package/dist/core/chat/common.js +367 -0
  33. package/dist/core/chat/common.js.map +1 -0
  34. package/dist/core/chat/google.js +180 -0
  35. package/dist/core/chat/google.js.map +1 -0
  36. package/dist/core/chat/index.js +80 -0
  37. package/dist/core/chat/index.js.map +1 -0
  38. package/dist/core/chat/openai.js +164 -0
  39. package/dist/core/chat/openai.js.map +1 -0
  40. package/dist/core/chat/types.js +2 -0
  41. package/dist/core/chat/types.js.map +1 -0
  42. package/dist/core/clipboard.js +34 -0
  43. package/dist/core/clipboard.js.map +1 -0
  44. package/dist/core/compact.js +39 -0
  45. package/dist/core/compact.js.map +1 -0
  46. package/dist/core/config.js +211 -0
  47. package/dist/core/config.js.map +1 -0
  48. package/dist/core/delegate.js +184 -0
  49. package/dist/core/delegate.js.map +1 -0
  50. package/dist/core/effort.js +80 -0
  51. package/dist/core/effort.js.map +1 -0
  52. package/dist/core/errors.js +32 -0
  53. package/dist/core/errors.js.map +1 -0
  54. package/dist/core/free.js +21 -0
  55. package/dist/core/free.js.map +1 -0
  56. package/dist/core/github.js +445 -0
  57. package/dist/core/github.js.map +1 -0
  58. package/dist/core/paths.js +51 -0
  59. package/dist/core/paths.js.map +1 -0
  60. package/dist/core/prompt.js +95 -0
  61. package/dist/core/prompt.js.map +1 -0
  62. package/dist/core/provider.js +298 -0
  63. package/dist/core/provider.js.map +1 -0
  64. package/dist/core/session.js +159 -0
  65. package/dist/core/session.js.map +1 -0
  66. package/dist/core/sync.js +126 -0
  67. package/dist/core/sync.js.map +1 -0
  68. package/dist/core/types.js +2 -0
  69. package/dist/core/types.js.map +1 -0
  70. package/dist/core/usage.js +127 -0
  71. package/dist/core/usage.js.map +1 -0
  72. package/dist/core/workspace.js +70 -0
  73. package/dist/core/workspace.js.map +1 -0
  74. package/dist/data/models.json +1 -0
  75. package/dist/sync/server.js +179 -0
  76. package/dist/sync/server.js.map +1 -0
  77. package/dist/tools/diff.js +21 -0
  78. package/dist/tools/diff.js.map +1 -0
  79. package/dist/tools/files.js +227 -0
  80. package/dist/tools/files.js.map +1 -0
  81. package/dist/tools/github.js +238 -0
  82. package/dist/tools/github.js.map +1 -0
  83. package/dist/tools/index.js +34 -0
  84. package/dist/tools/index.js.map +1 -0
  85. package/dist/tools/search.js +231 -0
  86. package/dist/tools/search.js.map +1 -0
  87. package/dist/tools/shell.js +118 -0
  88. package/dist/tools/shell.js.map +1 -0
  89. package/dist/tools/todos.js +50 -0
  90. package/dist/tools/todos.js.map +1 -0
  91. package/dist/tools/webfetch.js +108 -0
  92. package/dist/tools/webfetch.js.map +1 -0
  93. package/dist/tui/App.js +2984 -0
  94. package/dist/tui/App.js.map +1 -0
  95. package/dist/tui/ansi.js +151 -0
  96. package/dist/tui/ansi.js.map +1 -0
  97. package/dist/tui/commands.js +61 -0
  98. package/dist/tui/commands.js.map +1 -0
  99. package/dist/tui/explorer.js +152 -0
  100. package/dist/tui/explorer.js.map +1 -0
  101. package/dist/tui/icons.js +21 -0
  102. package/dist/tui/icons.js.map +1 -0
  103. package/dist/tui/layout.js +324 -0
  104. package/dist/tui/layout.js.map +1 -0
  105. package/dist/tui/markdown.js +355 -0
  106. package/dist/tui/markdown.js.map +1 -0
  107. package/dist/tui/overlays.js +316 -0
  108. package/dist/tui/overlays.js.map +1 -0
  109. package/dist/tui/render.js +234 -0
  110. package/dist/tui/render.js.map +1 -0
  111. package/dist/tui/theme.js +148 -0
  112. package/dist/tui/theme.js.map +1 -0
  113. package/dist/tui/types.js +73 -0
  114. package/dist/tui/types.js.map +1 -0
  115. package/dist/version.js +3 -0
  116. package/dist/version.js.map +1 -0
  117. package/package.json +75 -4
@@ -0,0 +1,316 @@
1
+ import { ICONS } from './icons.js';
2
+ import { FREE_API_LABEL } from '../core/free.js';
3
+ import { renderMarkdown, sanitizeTerminal } from './markdown.js';
4
+ import { formatDuration } from './render.js';
5
+ import { chalk, dim, fg, fit, gradient, truncate, visibleWidth, wrap } from './ansi.js';
6
+ import { renderHelp } from './layout.js';
7
+ export function renderPicker(options) {
8
+ const { width, height, theme, items, selected } = options;
9
+ const lines = [];
10
+ if (height < 5 || width < 20) {
11
+ return items.slice(0, Math.max(0, height)).map((item, index) => `${index === selected ? ICONS.selected : ' '} ${truncate(item.label, width - 4)}`);
12
+ }
13
+ const title = `─ ${chalk.bold(gradient(options.title.toUpperCase(), theme.gradient))} `;
14
+ const border = fg(theme.border, '─');
15
+ const topFill = Math.max(0, width - visibleWidth(title) - 2);
16
+ lines.push(`${fg(theme.border, '╭')}${title}${border.repeat(topFill)}${fg(theme.border, '╮')}`);
17
+ if (options.subtitle) {
18
+ lines.push(`${fg(theme.border, '│')} ${fit(dim(options.subtitle), width - 4)} ${fg(theme.border, '│')}`);
19
+ lines.push(`${fg(theme.border, '├')}${border.repeat(width - 2)}${fg(theme.border, '┤')}`);
20
+ }
21
+ const headerRows = options.subtitle ? 3 : 1;
22
+ const footerRows = 1;
23
+ const visibleRows = Math.max(1, height - headerRows - footerRows - 1);
24
+ const start = Math.max(0, Math.min(selected - Math.floor(visibleRows / 2), Math.max(0, items.length - visibleRows)));
25
+ const page = items.slice(start, start + visibleRows);
26
+ const contentWidth = Math.max(5, width - 4);
27
+ if (page.length === 0) {
28
+ lines.push(`${fg(theme.border, '│')} ${fit(dim(options.emptyText ?? 'No matches. Try a different search.'), contentWidth)} ${fg(theme.border, '│')}`);
29
+ }
30
+ for (const [index, item] of page.entries()) {
31
+ const absolute = start + index;
32
+ const active = absolute === selected;
33
+ const marker = active ? fg(theme.accent, ICONS.selected) : ' ';
34
+ const dot = item.configured === undefined
35
+ ? ''
36
+ : item.configured
37
+ ? fg(theme.success, ICONS.done)
38
+ : fg(theme.dim, ICONS.pending);
39
+ const freeBadge = item.freeApi ? fg(theme.success, FREE_API_LABEL) : '';
40
+ const badge = item.badge ? fg(theme.faint, `[${item.badge}]`) : '';
41
+ const badges = [freeBadge, badge].filter(Boolean).join(' ');
42
+ const right = item.right ? dim(item.right) : '';
43
+ const rightWidth = Math.min(visibleWidth(right), Math.floor(contentWidth * 0.4));
44
+ const labelWidth = Math.max(5, contentWidth - rightWidth - (right ? 2 : 0) - (dot ? 2 : 0) - (badges ? visibleWidth(badges) + 1 : 0) - 2);
45
+ let label = fit(item.label, labelWidth);
46
+ if (active)
47
+ label = chalk.bold(fg(theme.text, item.label.length > labelWidth ? truncate(item.label, labelWidth - 1) + '…' : item.label));
48
+ const left = `${marker} ${dot ? `${dot} ` : ''}${label}${badges ? ` ${badges}` : ''}`;
49
+ const row = `${fit(left, contentWidth - rightWidth - (right ? 1 : 0))}${right ? ` ${fit(right, rightWidth, 'right')}` : ''}`;
50
+ lines.push(`${fg(active ? theme.accent : theme.border, '│')} ${fit(row, contentWidth)} ${fg(active ? theme.accent : theme.border, '│')}`);
51
+ }
52
+ while (lines.length < height - 1) {
53
+ lines.push(`${fg(theme.border, '│')} ${' '.repeat(width - 4)} ${fg(theme.border, '│')}`);
54
+ }
55
+ const footerText = options.footer ?? `${items.length === 0 ? 0 : start + 1}–${Math.min(start + visibleRows, items.length)} of ${items.length}`;
56
+ const footer = truncate(dim(footerText), Math.max(1, width - 6));
57
+ lines.push(`${fg(theme.border, '╰─')} ${fit(footer, Math.max(1, width - 6))} ${fg(theme.border, '─╯')}`);
58
+ return lines.slice(0, height);
59
+ }
60
+ export function renderThemePicker(options) {
61
+ const items = options.themes.map((theme) => ({
62
+ id: theme.name,
63
+ label: theme.label,
64
+ sublabel: theme.description,
65
+ right: `${theme.gradient.map((color) => fg(color, '■')).join('')} ${theme.description}`,
66
+ configured: theme.name === options.active.name,
67
+ badge: theme.name === options.active.name ? 'active' : undefined
68
+ }));
69
+ return renderPicker({
70
+ title: 'themes',
71
+ subtitle: 'Pick a palette. The whole terminal is the canvas.',
72
+ items,
73
+ selected: options.selected,
74
+ width: options.width,
75
+ height: options.height,
76
+ theme: options.active,
77
+ footer: 'ctrl+t cycles themes anywhere'
78
+ });
79
+ }
80
+ /**
81
+ * Docked two-pane file explorer. The tree is lazy (only expanded folders are
82
+ * loaded); the lower pane previews the highlighted file. It is always rendered
83
+ * beside the chat, not as a modal overlay.
84
+ */
85
+ export function renderExplorer(options) {
86
+ const { width, height, theme, entries, selected } = options;
87
+ if (width < 24 || height < 4) {
88
+ return entries
89
+ .slice(0, Math.max(0, height))
90
+ .map((entry, index) => `${index === selected ? ICONS.selected : ' '} ${truncate(entry.path, width - 3)}`);
91
+ }
92
+ const innerWidth = width - 2;
93
+ const borderColor = options.focused ? theme.accent2 : theme.border;
94
+ const showPreview = Boolean(options.preview || options.previewError) && height >= 12;
95
+ const previewRows = showPreview ? Math.max(3, Math.min(18, Math.floor((height - 4) * 0.42))) : 0;
96
+ const treeRows = Math.max(1, height - 3 - (showPreview ? previewRows + 1 : 0));
97
+ const lines = [];
98
+ const title = `─ ${chalk.bold(gradient('EXPLORER', theme.gradient))} ${dim(truncate(options.cwd, Math.max(8, width - 22)))} `;
99
+ lines.push(`${fg(borderColor, '╭')}${title}${fg(borderColor, '─').repeat(Math.max(0, width - visibleWidth(title) - 2))}${fg(borderColor, '╮')}`);
100
+ const row = (content) => {
101
+ const padded = fit(content, innerWidth);
102
+ return `${fg(borderColor, '│')}${padded}${fg(borderColor, '│')}`;
103
+ };
104
+ if (options.loading && entries.length === 0) {
105
+ lines.push(row(` ${fg(theme.accent2, ICONS.active)} ${dim('reading workspace…')}`));
106
+ }
107
+ else if (entries.length === 0) {
108
+ lines.push(row(` ${dim('empty directory')}`));
109
+ }
110
+ else {
111
+ const start = Math.max(0, Math.min(selected - Math.floor(treeRows / 2), Math.max(0, entries.length - treeRows)));
112
+ for (let index = start; index < Math.min(entries.length, start + treeRows); index += 1) {
113
+ const entry = entries[index];
114
+ const active = index === selected;
115
+ const open = entry.kind === 'directory' && options.expanded.includes(entry.path);
116
+ const icon = entry.kind === 'directory' ? (open ? '▾' : '▸') : '·';
117
+ const marker = active ? fg(theme.accent, ICONS.selected) : ' ';
118
+ const indent = ' '.repeat(entry.depth);
119
+ const name = `${entry.name}${entry.kind === 'directory' ? '/' : ''}`;
120
+ const color = active ? theme.text : entry.kind === 'directory' ? theme.accent2 : theme.muted;
121
+ const label = `${indent}${fg(entry.kind === 'directory' ? theme.accent3 : theme.faint, icon)} ${fg(color, name)}`;
122
+ lines.push(row(` ${marker} ${truncate(label, innerWidth - 3)}`));
123
+ }
124
+ }
125
+ while (lines.length < 1 + treeRows)
126
+ lines.push(row(''));
127
+ if (showPreview) {
128
+ const previewTitle = options.preview?.path ?? 'preview';
129
+ const suffix = options.preview?.truncated ? dim(' · truncated') : '';
130
+ const header = `─ ${chalk.bold(fg(theme.accent, 'preview'))} ${dim(truncate(previewTitle, Math.max(8, width - 24)))}${suffix} `;
131
+ lines.push(`${fg(borderColor, '├')}${header}${fg(borderColor, '─').repeat(Math.max(0, width - visibleWidth(header) - 2))}${fg(borderColor, '┤')}`);
132
+ if (options.previewError) {
133
+ lines.push(row(` ${fg(theme.error, ICONS.error)} ${fg(theme.error, truncate(options.previewError, innerWidth - 5))}`));
134
+ }
135
+ else if (options.preview?.binary) {
136
+ lines.push(row(` ${dim('binary file · not previewed')}`));
137
+ }
138
+ else if (!options.preview || options.preview.lines.length === 0) {
139
+ lines.push(row(` ${dim('(empty file)')}`));
140
+ }
141
+ else {
142
+ const gutter = String(options.preview.lines.length).length;
143
+ for (let index = 0; index < previewRows; index += 1) {
144
+ const line = options.preview.lines[index];
145
+ if (line === undefined) {
146
+ lines.push(row(''));
147
+ continue;
148
+ }
149
+ const number = dim(String(index + 1).padStart(gutter));
150
+ lines.push(row(` ${number} ${sanitizeTerminal(line)}`));
151
+ }
152
+ }
153
+ // Reserve the final two rows for the hint and the bottom border.
154
+ while (lines.length < height - 2)
155
+ lines.push(row(''));
156
+ }
157
+ const hint = options.loading
158
+ ? options.focused
159
+ ? 'reading… · esc prompt'
160
+ : 'reading workspace…'
161
+ : options.focused
162
+ ? '↑↓ · enter/a attach · [ ] resize · esc prompt'
163
+ : 'ctrl+o focus · ctrl+←→ resize';
164
+ lines.push(row(` ${options.focused ? fg(theme.accent2, hint) : dim(hint)}`));
165
+ lines.push(`${fg(borderColor, '╰')}${fg(borderColor, '─').repeat(Math.max(1, width - 2))}${fg(borderColor, '╯')}`);
166
+ return lines.slice(0, height);
167
+ }
168
+ export function renderGithubInfo(options) {
169
+ const { width, height, theme } = options;
170
+ const content = [];
171
+ if (options.configured) {
172
+ content.push(`${fg(theme.success, ICONS.done)} ${fg(theme.text, 'GitHub token saved')} ${dim(`· ${options.source ?? 'auth.json'}${options.masked ? ` · ${options.masked}` : ''}`)}`);
173
+ }
174
+ else {
175
+ content.push(`${fg(theme.warning, ICONS.pending)} ${fg(theme.text, 'No GitHub token yet')}`);
176
+ }
177
+ content.push('');
178
+ content.push(`${dim('Create a token')} ${fg(theme.accent2, 'github.com/settings/tokens')}`);
179
+ content.push(`${dim('Classic scope')} ${fg(theme.text, 'repo')}`);
180
+ content.push(`${dim('Fine-grained')} ${fg(theme.text, 'Contents')} ${dim('read/write ·')} ${fg(theme.text, 'Administration')} ${dim('read/write for repo creation')}`);
181
+ content.push('');
182
+ content.push(dim('The token is stored in auth.json with mode 600.'));
183
+ content.push(dim('GITHUB_TOKEN or GH_TOKEN also works. It is never shown in full,'));
184
+ content.push(dim('written to config, added to a remote URL, or printed in command lines.'));
185
+ content.push('');
186
+ content.push(`${fg(theme.faint, 'Try:')} ${dim('“create a private repo for this project and upload everything”')}`);
187
+ const boxWidth = Math.min(width - 2, 82);
188
+ const lines = box('github', content, boxWidth, theme.accent, theme);
189
+ const horizontal = Math.max(0, Math.floor((width - boxWidth) / 2));
190
+ const topPad = height > lines.length ? Math.min(2, Math.floor((height - lines.length) / 2)) : 0;
191
+ return [
192
+ ...Array.from({ length: topPad }, () => ''),
193
+ ...lines
194
+ .slice(0, Math.max(1, height - topPad))
195
+ .map((line) => `${' '.repeat(horizontal)}${line}`)
196
+ ];
197
+ }
198
+ export function renderPermission(request, width, height, theme) {
199
+ const boxWidth = Math.min(width - 2, 78);
200
+ const riskColor = request.risk === 'high' ? theme.error : request.risk === 'medium' ? theme.warning : theme.dim;
201
+ const risk = `${request.risk === 'high' ? 'high risk' : request.risk === 'medium' ? 'medium risk' : 'low risk'}`;
202
+ const detailLines = request.detail ? wrap(request.detail, boxWidth - 6) : [];
203
+ const maxDetail = Math.max(1, height - 9);
204
+ const content = [];
205
+ content.push(`${fg(theme.warning, ICONS.warning)} ${chalk.bold(fg(theme.text, request.title))} ${fg(riskColor, `${ICONS.bullet} ${risk}`)}`);
206
+ if (detailLines.length > 0) {
207
+ content.push('');
208
+ for (const line of detailLines.slice(0, maxDetail)) {
209
+ content.push(`${fg(theme.faint, '│')} ${fg(request.risk === 'high' ? theme.error : theme.text, line)}`);
210
+ }
211
+ if (detailLines.length > maxDetail)
212
+ content.push(dim(`… ${detailLines.length - maxDetail} more lines`));
213
+ }
214
+ content.push('');
215
+ content.push(`${dim('action')} ${fg(theme.accent2, request.action)} ${dim('rule')} ${truncate(request.rule ?? 'once', Math.max(10, boxWidth - 28))}`);
216
+ content.push('');
217
+ content.push(`${chalk.bold(fg(theme.success, '[y]'))} allow once ${chalk.bold(fg(theme.accent, '[a]'))} always ${chalk.bold(fg(theme.error, '[n]'))} deny`);
218
+ const lines = box('approval needed', content, boxWidth, theme.warning, theme);
219
+ const topPad = height > lines.length ? Math.min(2, Math.floor((height - lines.length) / 2)) : 0;
220
+ const horizontal = Math.max(0, Math.floor((width - boxWidth) / 2));
221
+ const padded = Array.from({ length: topPad }, () => '');
222
+ for (const line of lines)
223
+ padded.push(`${' '.repeat(horizontal)}${line}`);
224
+ return padded;
225
+ }
226
+ export function renderConnectInfo(providerName, envName, modelCount, width, height, theme) {
227
+ const content = [
228
+ `${fg(theme.success, ICONS.done)} ${fg(theme.text, providerName)}`,
229
+ '',
230
+ `${dim('API key')} ${envName ? fg(theme.accent2, envName) : fg(theme.dim, 'not required for local providers')}`,
231
+ `${dim('Catalog')} ${modelCount} models`,
232
+ '',
233
+ dim('The key is stored locally with mode 600 in'),
234
+ dim('~/.config/surfcode/auth.json. Environment keys work too.'),
235
+ '',
236
+ `${fg(theme.faint, 'Tip:')} ${dim('keys are never written to sessions or logs.')}`
237
+ ];
238
+ const boxWidth = Math.min(width - 2, 74);
239
+ const lines = box(`connect ${providerName.toLowerCase()}`, content, boxWidth, theme.accent, theme);
240
+ const horizontal = Math.max(0, Math.floor((width - boxWidth) / 2));
241
+ const topPad = height > lines.length ? Math.min(2, Math.floor((height - lines.length) / 2)) : 0;
242
+ return [
243
+ ...Array.from({ length: topPad }, () => ''),
244
+ ...lines
245
+ .slice(0, Math.max(1, height - topPad))
246
+ .map((line) => `${' '.repeat(horizontal)}${line}`)
247
+ ];
248
+ }
249
+ export function renderHelpOverlay(width, height, theme) {
250
+ const lines = renderHelp(width, theme);
251
+ return lines.slice(0, Math.max(1, height));
252
+ }
253
+ /**
254
+ * Ephemeral side-question panel. The question and answer never enter the
255
+ * session; closing the panel discards both.
256
+ */
257
+ export function renderBtwOverlay(view, width, height, theme, spinner) {
258
+ const boxWidth = Math.max(20, Math.min(width - 2, 92));
259
+ const content = [];
260
+ content.push(`${fg(theme.accent2, '?')} ${chalk.bold(fg(theme.text, sanitizeTerminal(view.question)))}`);
261
+ content.push('');
262
+ if (view.error) {
263
+ content.push(`${fg(theme.error, ICONS.error)} ${fg(theme.error, sanitizeTerminal(view.error))}`);
264
+ }
265
+ else if (view.answer) {
266
+ content.push(...renderMarkdown(view.answer, Math.max(10, boxWidth - 4), theme));
267
+ if (!view.done)
268
+ content.push(dim('…'));
269
+ }
270
+ else {
271
+ content.push(`${fg(theme.accent2, spinner)} ${dim(view.done ? 'no answer' : 'thinking…')}`);
272
+ }
273
+ content.push('');
274
+ const elapsed = formatDuration(Math.max(0, (view.now ?? Date.now()) - view.startedAt));
275
+ content.push(dim(`ephemeral · not saved to the session · ${elapsed} · ${view.done ? 'esc close' : 'esc cancel'}`));
276
+ const lines = box('btw', content, boxWidth, theme.accent2, theme);
277
+ const horizontal = Math.max(0, Math.floor((width - boxWidth) / 2));
278
+ return lines
279
+ .slice(0, Math.max(1, height))
280
+ .map((line) => `${' '.repeat(horizontal)}${line}`);
281
+ }
282
+ export function renderSuggestions(items, selected, width, theme) {
283
+ if (items.length === 0)
284
+ return [];
285
+ const lines = [];
286
+ for (const [index, item] of items.entries()) {
287
+ const active = index === selected;
288
+ const marker = active ? fg(theme.accent, ICONS.selected) : ' ';
289
+ const label = active ? chalk.bold(fg(theme.text, item.label)) : fg(theme.accent, item.label);
290
+ const desc = item.description ? dim(item.description) : '';
291
+ const labelWidth = Math.min(24, Math.max(12, width - 10));
292
+ lines.push(` ${marker} ${fit(label, labelWidth)} ${truncate(desc, Math.max(5, width - labelWidth - 5))}`);
293
+ }
294
+ return lines;
295
+ }
296
+ export function renderSystemInfo(title, rows, width, height, theme) {
297
+ const content = rows.map(([key, value]) => `${dim(key.padEnd(12))} ${fg(theme.text, value)}`);
298
+ const boxWidth = Math.min(width - 2, 78);
299
+ const lines = box(title, content, boxWidth, theme.accent2, theme);
300
+ return lines.slice(0, Math.max(1, height));
301
+ }
302
+ function box(title, content, width, color, theme) {
303
+ const border = fg(theme.border, '─');
304
+ const topLabel = `─ ${fg(color, title)} `;
305
+ const topFill = Math.max(0, width - visibleWidth(topLabel) - 2);
306
+ const lines = [`${fg(theme.border, '╭')}${topLabel}${border.repeat(topFill)}${fg(theme.border, '╮')}`];
307
+ for (const line of content) {
308
+ const wrapped = wrap(line, width - 4);
309
+ for (const segment of wrapped) {
310
+ lines.push(`${fg(theme.border, '│')} ${fit(segment, width - 4)} ${fg(theme.border, '│')}`);
311
+ }
312
+ }
313
+ lines.push(`${fg(theme.border, '╰')}${border.repeat(Math.max(1, width - 2))}${fg(theme.border, '╯')}`);
314
+ return lines;
315
+ }
316
+ //# sourceMappingURL=overlays.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlays.js","sourceRoot":"","sources":["../../src/tui/overlays.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ import { ICONS } from './icons.js';
2
+ import { renderMarkdown, sanitizeTerminal } from './markdown.js';
3
+ import { chalk, dim, fit, fg, gradient, italic, truncate, visibleWidth, wrap } from './ansi.js';
4
+ export function renderTimeline(timeline, width, theme, options) {
5
+ const lines = [];
6
+ for (const item of timeline) {
7
+ if (lines.length > 0)
8
+ lines.push('');
9
+ if (item.type === 'user')
10
+ lines.push(...renderUser(item, width, theme));
11
+ else if (item.type === 'assistant')
12
+ lines.push(...renderAssistant(item, width, theme, options));
13
+ else
14
+ lines.push(...renderNotice(item, width, theme));
15
+ }
16
+ return lines;
17
+ }
18
+ export function renderLive(live, width, theme, options) {
19
+ const now = options.now ?? Date.now();
20
+ const elapsed = formatDuration(now - live.startedAt);
21
+ const label = `${fg(theme.accent, ICONS.assistant)} ${chalk.bold(gradient('SURFCODE', theme.gradient))}`;
22
+ const status = live.phase === 'thinking'
23
+ ? `${fg(theme.accent2, options.spinner)} ${dim('thinking…')}`
24
+ : live.phase === 'tool'
25
+ ? `${fg(theme.accent2, options.spinner)} ${dim(`running ${live.activeTool ?? 'tool'}…`)}`
26
+ : `${fg(theme.success, ICONS.done)} ${dim('streaming')}`;
27
+ const right = dim(`${status} ${elapsed}`);
28
+ const lines = [` ${fit(label, Math.max(5, width - 2 - visibleWidth(right)))}${right}`];
29
+ const visible = options.streaming !== false;
30
+ if (live.reasoning && visible && options.showReasoning) {
31
+ const reasoningLines = renderMarkdown(live.reasoning, Math.max(10, width - 6), theme);
32
+ lines.push(` ${dim(ICONS.reasoning)} ${dim(italic('thinking'))}`);
33
+ for (const line of reasoningLines)
34
+ lines.push(` ${dim('│')} ${dim(line)}`);
35
+ lines.push('');
36
+ }
37
+ if (live.preamble && visible) {
38
+ const contentWidth = Math.max(10, width - 4);
39
+ for (const line of renderMarkdown(live.preamble, contentWidth, theme))
40
+ lines.push(` ${line}`);
41
+ if (live.tools.length > 0)
42
+ lines.push('');
43
+ }
44
+ if (live.tools.length > 0) {
45
+ for (const tool of live.tools)
46
+ lines.push(...renderToolView(tool, width, theme, options));
47
+ }
48
+ if (live.content && visible) {
49
+ if (live.tools.length > 0)
50
+ lines.push('');
51
+ const contentWidth = Math.max(10, width - 4);
52
+ for (const line of renderMarkdown(live.content, contentWidth, theme))
53
+ lines.push(` ${line}`);
54
+ if (live.phase !== 'tool')
55
+ lines.push(` ${fg(theme.accent, ICONS.user)}`);
56
+ }
57
+ else if (!visible && (live.content || live.preamble || live.reasoning) && live.phase !== 'tool') {
58
+ lines.push(` ${dim('│')} ${dim(italic('composing reply…'))}`);
59
+ }
60
+ else if (!live.preamble && live.tools.length === 0) {
61
+ // Never reveal reasoning text unless the user opted in with /thinking.
62
+ const message = live.phase === 'thinking' ? 'thinking…' : 'warming up';
63
+ lines.push(` ${dim('│')} ${dim(italic(message))}`);
64
+ }
65
+ return lines;
66
+ }
67
+ function renderUser(item, width, theme) {
68
+ const lines = [` ${fg(theme.user, ICONS.user)} ${chalk.bold(fg(theme.user, 'you'))}`];
69
+ const contentWidth = Math.max(10, width - 4);
70
+ const rendered = renderMarkdown(item.content, contentWidth, theme);
71
+ for (const line of rendered)
72
+ lines.push(` ${fg(theme.user, ICONS.user)} ${line}`);
73
+ return lines;
74
+ }
75
+ function renderAssistant(item, width, theme, options) {
76
+ const duration = item.durationMs ? dim(formatDuration(item.durationMs)) : '';
77
+ const label = `${fg(theme.assistant, ICONS.assistant)} ${chalk.bold(gradient('SURFCODE', theme.gradient))}`;
78
+ const lines = [` ${fit(label, Math.max(5, width - 2 - visibleWidth(duration)))}${duration}`];
79
+ if (item.reasoning) {
80
+ if (options.showReasoning) {
81
+ lines.push(` ${dim(ICONS.reasoning)} ${dim(italic('reasoning'))}`);
82
+ for (const line of renderMarkdown(item.reasoning, Math.max(10, width - 6), theme)) {
83
+ lines.push(` ${dim('│')} ${dim(line)}`);
84
+ }
85
+ lines.push('');
86
+ }
87
+ else {
88
+ lines.push(` ${dim(ICONS.reasoning)} ${dim(`thought process hidden · /thinking to show`)}`);
89
+ }
90
+ }
91
+ if (item.preamble) {
92
+ for (const line of renderMarkdown(item.preamble, Math.max(10, width - 4), theme)) {
93
+ lines.push(` ${line}`);
94
+ }
95
+ if (item.toolViews?.length)
96
+ lines.push('');
97
+ }
98
+ if (item.toolViews && item.toolViews.length > 0) {
99
+ for (const tool of item.toolViews)
100
+ lines.push(...renderToolView(tool, width, theme, options));
101
+ }
102
+ if (item.content) {
103
+ if (item.toolViews?.length || item.reasoning)
104
+ lines.push('');
105
+ for (const line of renderMarkdown(item.content, Math.max(10, width - 4), theme))
106
+ lines.push(` ${line}`);
107
+ }
108
+ return lines;
109
+ }
110
+ function renderNotice(item, width, theme) {
111
+ const color = item.level === 'error'
112
+ ? theme.error
113
+ : item.level === 'warning'
114
+ ? theme.warning
115
+ : item.level === 'success'
116
+ ? theme.success
117
+ : theme.dim;
118
+ const icon = item.level === 'error'
119
+ ? ICONS.error
120
+ : item.level === 'warning'
121
+ ? ICONS.warning
122
+ : item.level === 'success'
123
+ ? ICONS.success
124
+ : ICONS.info;
125
+ const lines = wrap(item.content, Math.max(10, width - 5));
126
+ return lines.map((line, index) => ` ${index === 0 ? fg(color, icon) : ' '} ${fg(color, line)}`);
127
+ }
128
+ export function renderToolView(view, width, theme, options) {
129
+ const icon = view.pending
130
+ ? fg(theme.accent2, options.spinner)
131
+ : view.result?.isError
132
+ ? fg(theme.error, ICONS.error)
133
+ : fg(theme.success, ICONS.success);
134
+ const name = fg(theme.accent2, view.call.name);
135
+ const title = truncate(sanitizeTerminal(toolTitle(view)), Math.max(8, width - 25));
136
+ const summary = view.pending
137
+ ? dim('running')
138
+ : fg(view.result?.isError ? theme.error : theme.dim, [view.result?.display?.summary, view.durationMs ? formatDuration(view.durationMs) : undefined]
139
+ .filter(Boolean)
140
+ .join(' · '));
141
+ const left = `${icon} ${name} ${fg(theme.text, title)}`;
142
+ const available = Math.max(10, width - 2);
143
+ const summaryWidth = Math.min(visibleWidth(summary), Math.floor(available * 0.45));
144
+ const clippedSummary = summaryWidth > 0 ? fit(summary, summaryWidth, 'right') : '';
145
+ const leftWidth = Math.max(5, available - summaryWidth - (summaryWidth > 0 ? 1 : 0));
146
+ const lines = [` ${fit(left, leftWidth)}${clippedSummary ? ` ${clippedSummary}` : ''}`];
147
+ if (view.result)
148
+ lines.push(...renderToolDetails(view, width, theme, options));
149
+ return lines;
150
+ }
151
+ function renderToolDetails(view, width, theme, options) {
152
+ const result = view.result;
153
+ const prefix = ` ${fg(theme.faint, '│')} `;
154
+ const detailWidth = Math.max(8, width - 4);
155
+ const output = sanitizeTerminal(result.output);
156
+ const details = [];
157
+ if (result.display?.todos) {
158
+ const todos = result.display.todos;
159
+ const marks = {
160
+ pending: fg(theme.dim, ICONS.pending),
161
+ in_progress: fg(theme.warning, ICONS.active),
162
+ completed: fg(theme.success, ICONS.done)
163
+ };
164
+ for (const todo of todos.slice(0, options.verboseTools ? 30 : 8)) {
165
+ details.push(`${marks[todo.status]} ${todo.status === 'completed' ? dim(todo.content) : todo.content}`);
166
+ }
167
+ return details.map((line) => `${prefix}${truncate(line, detailWidth)}`);
168
+ }
169
+ if (result.display?.diff) {
170
+ const limit = options.verboseTools ? 80 : 14;
171
+ const diffLines = result.display.diff.split('\n');
172
+ for (const line of diffLines.slice(0, limit)) {
173
+ let rendered = line;
174
+ if (line.startsWith('@@'))
175
+ rendered = fg(theme.accent2, line);
176
+ else if (line.startsWith('+'))
177
+ rendered = fg(theme.success, line);
178
+ else if (line.startsWith('-'))
179
+ rendered = fg(theme.error, line);
180
+ else
181
+ rendered = fg(theme.dim, line);
182
+ details.push(truncate(rendered, detailWidth));
183
+ }
184
+ if (diffLines.length > limit)
185
+ details.push(dim(`… ${diffLines.length - limit} more diff lines`));
186
+ return details.map((line, index) => `${prefix}${index === details.length - 1 && !line.startsWith('\u001b') ? dim(line) : line}`);
187
+ }
188
+ if (result.isError || view.call.name === 'bash') {
189
+ const lines = output.split('\n');
190
+ const cleaned = view.call.name === 'bash' ? lines.slice(2) : lines;
191
+ const limit = options.verboseTools ? 24 : 5;
192
+ for (const line of cleaned.slice(0, limit)) {
193
+ details.push(fg(result.isError ? theme.error : theme.muted, line));
194
+ }
195
+ if (cleaned.length > limit)
196
+ details.push(dim(`… ${cleaned.length - limit} more lines`));
197
+ }
198
+ if (details.length === 0 && result.display?.truncated) {
199
+ details.push(dim('output truncated'));
200
+ }
201
+ return details.map((line) => `${prefix}${truncate(line, detailWidth)}`);
202
+ }
203
+ export function toolTitle(view) {
204
+ const args = view.call.arguments;
205
+ switch (view.call.name) {
206
+ case 'bash':
207
+ return String(args.command ?? '');
208
+ case 'read':
209
+ case 'write':
210
+ case 'edit':
211
+ case 'ls':
212
+ return String(args.path ?? '.');
213
+ case 'glob':
214
+ return String(args.pattern ?? '');
215
+ case 'grep':
216
+ return `${String(args.pattern ?? '')}${args.path ? ` in ${String(args.path)}` : ''}`;
217
+ case 'webfetch':
218
+ return String(args.url ?? '');
219
+ case 'todo_write':
220
+ return 'update plan';
221
+ default:
222
+ return String(args.path ?? args.pattern ?? args.command ?? '');
223
+ }
224
+ }
225
+ export function formatDuration(ms) {
226
+ if (ms < 1000)
227
+ return `${Math.max(0, Math.round(ms))}ms`;
228
+ if (ms < 60_000)
229
+ return `${(ms / 1000).toFixed(1)}s`;
230
+ const minutes = Math.floor(ms / 60_000);
231
+ const seconds = Math.round((ms % 60_000) / 1000);
232
+ return `${minutes}m ${seconds}s`;
233
+ }
234
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/tui/render.ts"],"names":[],"mappings":"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"}