@deepwhale/coding-agent 1.0.0 → 1.0.9

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/dist/modes/tui.js CHANGED
@@ -1,6 +1,18 @@
1
1
  /**
2
2
  * TUI 模式 — Sprint 1c-revive-4-D-20.3 P0-B (2026-06-05) v1.0 capability completion
3
3
  *
4
+ * @deprecated LEGACY — Sprint 1c-revive-2-D-24.3 (2026-06-06) v1.0.9:
5
+ * 1.0.9+ `deepwhale tui` mode 走 Ink 容器 (@deepwhale/tui-ink 1.0.9 bundle).
6
+ * 本文件保留仅作 source-install dev 路径保底, 不再是 default path.
7
+ * - bin/deepwhale.js 'tui' case → runTuiInkMode (D-24.3 dispatch)
8
+ * - 跟 D-24.1 §6 红线 1 一致: legacy 0 删, fallback 兜底
9
+ * - 现有 979 行 tui-smoke.test.ts 0 改动, 行为在 readline 容器仍验过
10
+ *
11
+ * 业务逻辑 0 重写: D-22 / D-23.1 / D-23.2 业务 1:1 搬到 tui-ink/, 跟本文件同形态.
12
+ * 不再维护 (sprint 1.1+): 计划完全删除本文件, 但保留 0 改动作 fallback.
13
+ *
14
+ * ---- 下方为 v1.0.0 - v1.0.8 readline 容器实现 ----
15
+ *
4
16
  * Minimal ANSI TUI. **不**装新依赖 (无 Ink), 用 node:readline + ANSI 转义码.
5
17
  *
6
18
  * 复用红线 (D-20.3 P0-B 拍板):
@@ -32,6 +44,9 @@
32
44
  */
33
45
  import { createInterface } from 'node:readline';
34
46
  import { stdin, stdout, stderr } from 'node:process';
47
+ import { homedir } from 'node:os';
48
+ import { mkdirSync, readFileSync, appendFileSync } from 'node:fs';
49
+ import { join, dirname } from 'node:path';
35
50
  import { SessionReader, SessionWriter } from '@deepwhale/core';
36
51
  import { isToolLoopError, loadSession, persistToolLoopSteps, runToolLoop, } from '../agent/index.js';
37
52
  import { createDefaultRegistry } from '../tools/registry.js';
@@ -57,9 +72,310 @@ const ANSI = {
57
72
  };
58
73
  /** 检测 TTY (跟 REPL 一样, 非 TTY 退回无色输出, 让 test 不依赖 ANSI) */
59
74
  const isTty = () => Boolean(stdout.isTTY);
60
- /** 染色 wrapper (非 TTY 时退化到原文) */
61
- function colorize(text, color) {
62
- return isTty() ? `${color}${text}${ANSI.reset}` : text;
75
+ export const THEMES = {
76
+ default: {
77
+ header: ANSI.bold,
78
+ model: ANSI.cyan + ANSI.bold,
79
+ divider: ANSI.dim,
80
+ prompt: ANSI.bold,
81
+ error: ANSI.red,
82
+ success: ANSI.green,
83
+ toolName: ANSI.magenta + ANSI.bold,
84
+ },
85
+ solarized: {
86
+ // 暖冷对比: divider yellow, model blue, prompt bold, error red, success green
87
+ header: ANSI.yellow + ANSI.bold,
88
+ model: ANSI.blue + ANSI.bold,
89
+ divider: ANSI.yellow,
90
+ prompt: ANSI.bold,
91
+ error: ANSI.red,
92
+ success: ANSI.green,
93
+ toolName: ANSI.magenta + ANSI.bold, // solarized 仍 magenta 突出 tool
94
+ },
95
+ monochrome: {
96
+ // 全黑白, 区分靠 dim/bold, 不刺眼
97
+ header: ANSI.bold,
98
+ model: ANSI.bold,
99
+ divider: ANSI.dim,
100
+ prompt: ANSI.bold,
101
+ error: ANSI.dim + ANSI.bold, // monochrome 无红, 仍用 dim+bold 强调错误
102
+ success: ANSI.bold,
103
+ toolName: ANSI.dim + ANSI.bold, // monochrome tool name 用 dim+bold
104
+ },
105
+ };
106
+ const VALID_THEME_NAMES = new Set(['default', 'solarized', 'monochrome']);
107
+ /**
108
+ * 解析 theme 来源 (env > 默认), 找不到或 invalid 时退化到 'default' + stderr warning.
109
+ * 不抛: 启动期不阻塞, 跟 env-gate 风格一致.
110
+ */
111
+ export function resolveTuiTheme(themeArg) {
112
+ const fromArg = themeArg ?? process.env.DEEPWHALE_TUI_THEME;
113
+ if (fromArg === undefined || fromArg === '')
114
+ return 'default';
115
+ if (VALID_THEME_NAMES.has(fromArg))
116
+ return fromArg;
117
+ // invalid: stderr 提醒, 退化
118
+ stderr.write(`warning: unknown TUI theme '${fromArg}', falling back to 'default' (valid: ${[...VALID_THEME_NAMES].join(', ')})\n`);
119
+ return 'default';
120
+ }
121
+ /**
122
+ * 染色 wrapper (D-23.1 改签名) — 用 role 查当前 theme.
123
+ * 非 TTY 时退化到原文, 让 CI/管道 log 不带 ANSI.
124
+ */
125
+ function colorize(text, role, theme = THEMES.default) {
126
+ if (!isTty())
127
+ return text;
128
+ return `${theme[role]}${text}${ANSI.reset}`;
129
+ }
130
+ // ---- 视觉元素 (D-21.2 轻量升级, 2026-06-06) ----
131
+ // 复用红线 (D-20.3 P0-B): 不装新依赖 (无 Ink), 仍用 readline + ANSI.
132
+ // 新增仅 2 个 helper, 替换 header 1 处 + status bar 1 处. 不动 prompt / onChunk /
133
+ // confirm / session 路径.
134
+ /**
135
+ * 画一条横线分隔符, 宽度按 `width` 截 (默认终端列宽, fallback 80).
136
+ * 配色 dim + cyan 拼接, 非 TTY 退化到 `─` 重复, 让 CI/管道 log 也可读.
137
+ */
138
+ function horizontalRule(width, theme = THEMES.default) {
139
+ const cols = width ?? (stdout.columns && stdout.columns > 20 ? stdout.columns : 80);
140
+ const w = Math.max(20, Math.min(cols - 4, 100));
141
+ const line = '─'.repeat(w);
142
+ return colorize(' ' + line, 'divider', theme);
143
+ }
144
+ /**
145
+ * 格式化状态栏 — D-21.2 升级:
146
+ * - 复用 formatUsageStatus 的 4 字段 (model / in / cached / out / cost)
147
+ * - 加分隔线 + 颜色 (key: cyan, value: 黄色 token, 灰色 cost)
148
+ * - 改成 1 行, 终端窄时(< 60 列) 截断不溢出
149
+ * - 非 TTY 退化到纯文本 (跟现状一样, 不破坏 test)
150
+ *
151
+ * @param usage - formatUsageStatus 返回的原始行, 已是 `tokens X · cached Y · out Z · cost $W` 形态
152
+ * @param model - 模型名, 走 formatUsageStatus 已含, 这里再拼前面 banner 用 cyan 加粗
153
+ */
154
+ function formatTuiStatusBar(usage, model, theme = THEMES.default) {
155
+ if (usage === null) {
156
+ return colorize(` ${model} · (no usage)`, 'divider', theme);
157
+ }
158
+ // formatUsageStatus 输出形如 "tokens 1.2k · cached 80% · out 200 · cost $0.0012"
159
+ // 我们把 model 提到前面 + 加色 + 末尾补分隔线
160
+ const bar = `${model} · ${usage}`;
161
+ // 终端窄时: 简单截断, 不做折行 (readline prompt 单行假设)
162
+ const cols = stdout.columns && stdout.columns > 20 ? stdout.columns : 80;
163
+ const max = Math.max(40, cols - 4);
164
+ const text = bar.length > max ? bar.slice(0, max - 1) + '…' : bar;
165
+ // 颜色: model 走 model role (theme 决定), usage 走 divider (跟 horizontalRule 一致)
166
+ return colorize(' ' + text, 'divider', theme);
167
+ }
168
+ // ---- D-23.2 语法高亮 (2026-06-06) ----
169
+ //
170
+ // 用户拍板 B: onChunk 来的 assistant stream 染色 (不染 readline input, 染 cursor 会乱).
171
+ // 4 类:
172
+ // 1. 工具名 (BashTool / ReadFileTool / WriteFileTool / EditTool / GlobTool / GrepTool) → toolName role
173
+ // 2. 数字 (整数 / 小数 / 百分号 / 倍数 / 货币) → success role
174
+ // 3. 文件路径 (./rel / /abs / node_modules/...) → model role
175
+ // 4. 其它 → 原样 (不染)
176
+ //
177
+ // 算法: 一次正则扫, 用 split-keep-separator 形式拼回原顺序. 非 TTY 退化到原 text (跟 colorize 一致).
178
+ //
179
+ // 风险: chunk content 是一次 fragment (e.g. "Hello, I "), 正则 match 走贪婪, 实际 chunk 长 50 chars 量级 OK.
180
+ // 跟 Fish / Starship prompt 染色同形态. 不动 readline input 路径.
181
+ /** 工具名白名单 (跟 registry.createDefaultRegistry 同步, 加新 tool 必加这里) */
182
+ const TOOL_NAME_RE = /\b(BashTool|ReadFileTool|WriteFileTool|EditTool|GlobTool|GrepTool|ListDirectoryTool|FileReadTool|FileWriteTool)\b/g;
183
+ /** 数字 (整数 / 小数 / 百分号 / 倍数 / 货币 / + 后缀 e.g. 100+) */
184
+ const NUMBER_RE = /(\$?\d+(?:\.\d+)?(?:\+|%|x|ms|s|kb|mb|k|m|gb)?)/g;
185
+ /** 文件路径 (./rel, /abs, 含 /) */
186
+ const PATH_RE = /((?:\.{1,2}\/|\/)[^\s,;:'"`]+)/g;
187
+ /**
188
+ * 语法高亮 chunk content. 非 TTY 退化到原 text (跟 colorize 行为一致, 跟 CI/管道 log 兼容).
189
+ *
190
+ * @param text - 单 chunk 文本 fragment
191
+ * @param theme - 当前 theme (从 runTuiMode 闭包传入)
192
+ * @param forceColor - D-23.2 测试 hook: 强制当 TTY (非默认) 用于 unit test 验证染色字节.
193
+ * 生产路径 (runTuiMode) 不传, 走 isTty() 自动判断.
194
+ * @returns 染色后文本 (含 ANSI escape) 或原 text (非 TTY)
195
+ */
196
+ export function highlightChunk(text, theme = THEMES.default, forceColor) {
197
+ if (!forceColor && !isTty())
198
+ return text;
199
+ if (text.length === 0)
200
+ return text;
201
+ // 用 1 个 split-keep 数组, 按出现顺序拼
202
+ // 简化: 用单个正则 union, 优先匹配顺序是 TOOL_NAME > PATH > NUMBER (用 capturing group).
203
+ // 但 4 类 union 互相覆盖 (path 含数字, 工具名可能跟 path 相邻), 改用"先标记后还原"算法:
204
+ // 1. 扫一遍, 收集 [start, end, role] 区间 (按优先级 tool > path > number)
205
+ // 2. 按顺序拼 (区间内用 theme 染色, 区间外原文)
206
+ // 这样避免 union 正则优先级错乱.
207
+ const ranges = [];
208
+ // 1) tool name (优先级最高, 因为是 word boundary, 不跟 path 重叠)
209
+ for (const m of text.matchAll(TOOL_NAME_RE)) {
210
+ if (m.index === undefined)
211
+ continue;
212
+ ranges.push({ start: m.index, end: m.index + m[0].length, role: 'toolName' });
213
+ }
214
+ // 2) path (跳过已被 tool 覆盖的区间)
215
+ for (const m of text.matchAll(PATH_RE)) {
216
+ if (m.index === undefined)
217
+ continue;
218
+ const start = m.index;
219
+ const end = m.index + m[0].length;
220
+ if (ranges.some((r) => start >= r.start && end <= r.end))
221
+ continue; // 在 tool 内, 跳过
222
+ ranges.push({ start, end, role: 'model' });
223
+ }
224
+ // 3) number (跳过已被 tool/path 覆盖)
225
+ for (const m of text.matchAll(NUMBER_RE)) {
226
+ if (m.index === undefined)
227
+ continue;
228
+ const start = m.index;
229
+ const end = m.index + m[0].length;
230
+ if (ranges.some((r) => start >= r.start && end <= r.end))
231
+ continue;
232
+ ranges.push({ start, end, role: 'success' });
233
+ }
234
+ if (ranges.length === 0)
235
+ return text;
236
+ // 按 start 排序, 拼回
237
+ ranges.sort((a, b) => a.start - b.start);
238
+ const parts = [];
239
+ let cursor = 0;
240
+ for (const r of ranges) {
241
+ if (r.start > cursor)
242
+ parts.push(text.slice(cursor, r.start));
243
+ parts.push(colorize(text.slice(r.start, r.end), r.role, theme));
244
+ cursor = r.end;
245
+ }
246
+ if (cursor < text.length)
247
+ parts.push(text.slice(cursor));
248
+ return parts.join('');
249
+ }
250
+ // ---- D-22.1 命令历史持久化 (2026-06-06) ----
251
+ //
252
+ // 复用红线 (D-20.3 P0-B): TUI-only feature, 不动 REPL/print mode.
253
+ // 复用红线 (D-19 复用 confirm controller): 历史加载在 runTuiMode 启动期, confirm 期间不动 history.
254
+ //
255
+ // 存储: ~/.deepwhale/tui-history (JSONL, 每行 1 条 raw prompt, 0o600 权限, max 1000 条 LRU).
256
+ // readline history 数组语义: 最新一条在尾部 (所以 load 时反序, append 时 push 后写尾).
257
+ const TUI_HISTORY_MAX = 1000;
258
+ function tuiHistoryPath() {
259
+ return join(homedir(), '.deepwhale', 'tui-history');
260
+ }
261
+ function tuiHistoryLoad() {
262
+ const p = tuiHistoryPath();
263
+ try {
264
+ const text = readFileSync(p, 'utf-8');
265
+ // JSONL: 1 行 = 1 个对象 { ts, line }
266
+ const lines = text.split('\n').filter((l) => l.trim().length > 0);
267
+ const out = [];
268
+ for (const l of lines) {
269
+ try {
270
+ const obj = JSON.parse(l);
271
+ if (typeof obj.line === 'string' && obj.line.length > 0) {
272
+ out.push(obj.line);
273
+ }
274
+ }
275
+ catch {
276
+ // 跳过坏行, 不破坏整个文件
277
+ }
278
+ }
279
+ // 保留最新 1000 条 (LRU 截断)
280
+ if (out.length > TUI_HISTORY_MAX) {
281
+ out.splice(0, out.length - TUI_HISTORY_MAX);
282
+ }
283
+ return out;
284
+ }
285
+ catch {
286
+ // 文件不存在 / 权限错 → 返空 (不抛, 不阻塞启动)
287
+ return [];
288
+ }
289
+ }
290
+ function tuiHistoryAppend(line) {
291
+ // 过滤空行 + 内建命令 (跟其它 shell history 一样, 跟 token 浪费)
292
+ if (line.length === 0)
293
+ return;
294
+ if (line.startsWith('/'))
295
+ return; // /help /verify /exit 不入历史
296
+ if (line === 'q' || line === 'exit' || line === 'quit')
297
+ return;
298
+ const p = tuiHistoryPath();
299
+ try {
300
+ // 0o700 权限父目录 + 0o600 文件 (跟 ~/.bash_history 一样, 仅用户可读)
301
+ mkdirSync(dirname(p), { mode: 0o700, recursive: true });
302
+ const entry = JSON.stringify({ ts: Date.now(), line }) + '\n';
303
+ appendFileSync(p, entry, { mode: 0o600 });
304
+ }
305
+ catch {
306
+ // best-effort, 不阻塞 turn 完成
307
+ }
308
+ }
309
+ // 暴露 tuiHistoryAppend 供测试用 (D-22.1 verification)
310
+ export { tuiHistoryAppend, tuiHistoryLoad, tuiHistoryPath, TUI_HISTORY_MAX };
311
+ // ---- D-22.2 流式 token spinner (2026-06-06) ----
312
+ //
313
+ // 5 帧: ⠋ ⠙ ⠹ ⠸ ⠼, 80ms / 帧. 走 \r carriage return + \x1b[K clear-to-end-of-line.
314
+ // Windows 兼容: cursorTo(0) + clearLine(1) 兜底 (Win10/11 终端对 \r 也支持).
315
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼'];
316
+ const SPINNER_INTERVAL_MS = 80;
317
+ const SPINNER_LABEL = 'thinking…';
318
+ class Spinner {
319
+ timer = null;
320
+ frame = 0;
321
+ active = false;
322
+ start(stream = stdout) {
323
+ if (this.active)
324
+ return;
325
+ if (!isTty())
326
+ return; // 非 TTY 不转 (跟 colorize 一致, 避免管道/重定向被转)
327
+ this.active = true;
328
+ this.frame = 0;
329
+ this.render(stream);
330
+ this.timer = setInterval(() => {
331
+ this.frame = (this.frame + 1) % SPINNER_FRAMES.length;
332
+ this.render(stream);
333
+ }, SPINNER_INTERVAL_MS);
334
+ }
335
+ stop(stream = stdout) {
336
+ if (!this.active)
337
+ return;
338
+ this.active = false;
339
+ if (this.timer) {
340
+ clearInterval(this.timer);
341
+ this.timer = null;
342
+ }
343
+ // 清除当前行 (覆盖 spinner 字符)
344
+ // Windows 兼容: cursorTo(0) + clearLine(1) 是 TTY 行为, stdout 在 isTTY 时有这俩方法.
345
+ // 非 TTY 走空格 + \r 兜底.
346
+ const ttyStream = stream;
347
+ if (typeof ttyStream.cursorTo === 'function' && typeof ttyStream.clearLine === 'function') {
348
+ try {
349
+ ttyStream.cursorTo(0);
350
+ ttyStream.clearLine(1);
351
+ }
352
+ catch {
353
+ stream.write('\r' + ' '.repeat(SPINNER_LABEL.length + 4) + '\r');
354
+ }
355
+ }
356
+ else {
357
+ stream.write('\r' + ' '.repeat(SPINNER_LABEL.length + 4) + '\r');
358
+ }
359
+ }
360
+ render(stream) {
361
+ const text = `${SPINNER_FRAMES[this.frame]} ${SPINNER_LABEL}`;
362
+ // \r 回行首, [K 清到行尾
363
+ stream.write(`\r${text}\x1b[K`);
364
+ }
365
+ }
366
+ // 暴露 Spinner 类供测试用 (D-22.2 verification)
367
+ export { Spinner, SPINNER_FRAMES, SPINNER_INTERVAL_MS, SPINNER_LABEL };
368
+ // ---- D-22.3 Multi-line input (2026-06-06) ----
369
+ //
370
+ // Hermes 风格: `\` 续行 + `\\` 转义. readline 维持 terminal: true 拿 ↑↓ history.
371
+ // 续行机制: 维护 `multiLineBuffer` 状态, 收到 `\` 结尾行不喂给 turn, 下次行追加.
372
+ // 全局单例 (TUI 单 stream), 在 runTuiMode 闭包内状态化.
373
+ function isContinuationLine(line) {
374
+ return line.endsWith('\\') && !line.endsWith('\\\\');
375
+ }
376
+ function joinContinuation(lines) {
377
+ // ["line1\\", "line2\\", "line3"] → "line1\nline2\nline3"
378
+ return lines.map((l) => l.replace(/\\$/, '')).join('\n');
63
379
  }
64
380
  // ---- TUI 主入口 ----
65
381
  export async function runTuiMode(options = {}) {
@@ -67,6 +383,10 @@ export async function runTuiMode(options = {}) {
67
383
  const err = options.errorOutput ?? stderr;
68
384
  const enableToolLoop = options.enableToolLoop ?? true;
69
385
  const sessionPath = options.sessionPath;
386
+ // D-23.1 (2026-06-06): 解析 theme. options.theme 优先 > DEEPWHALE_TUI_THEME env > 'default'.
387
+ // 解析里含 invalid → stderr warning + 退化, 不抛 (跟 env-gate 风格一致).
388
+ const themeName = resolveTuiTheme(options.theme);
389
+ const theme = THEMES[themeName];
70
390
  // sandbox env 解析 (跟 print mode / REPL 一致)
71
391
  const sandboxRunner = resolveSandboxRunnerFromEnv({ sandboxRoot: process.cwd() });
72
392
  const policyYes = options.yes ?? false;
@@ -111,7 +431,7 @@ export async function runTuiMode(options = {}) {
111
431
  const loaded = await loadSession(reader);
112
432
  workingMessages = [...loaded.messages];
113
433
  if (workingMessages.length > 0) {
114
- out.write(colorize(` ${loaded.messages.length} messages resumed from session\n`, ANSI.dim) + '\n');
434
+ out.write(colorize(` ${loaded.messages.length} messages resumed from session\n`, 'divider', theme) + '\n');
115
435
  }
116
436
  }
117
437
  catch (e) {
@@ -126,31 +446,47 @@ export async function runTuiMode(options = {}) {
126
446
  // 显式 silently no-op (minimal TUI 暂不接 compaction, 避免跟 P0 范围扩大).
127
447
  // 注: print mode 抛 warning (D-6 拍板), TUI 不抛 (minimal scope, 留扩展点).
128
448
  }
129
- // 顶部 header (D-20.3 TUI 标识)
449
+ // 顶部 header D-21.2 轻量升级: 横线分隔 + banner
130
450
  const initialClientState = tryCreateClient();
131
451
  const modelName = initialClientState.client?.model ?? 'not-configured';
132
452
  out.write('\n');
133
- out.write(colorize(' ╭─ deepwhale tui ', ANSI.bold) + colorize(modelName, ANSI.cyan + ANSI.bold) + colorize(' ─╮', ANSI.bold) + '\n');
134
- out.write(colorize(' type a prompt, /help, /verify, /exit (or q) │\n', ANSI.dim));
135
- out.write(colorize(' ╰──────────────────────────────────────────╯\n', ANSI.bold) + '\n');
453
+ out.write(horizontalRule(undefined, theme) + '\n');
454
+ out.write(colorize(' deepwhale tui ', 'header', theme) +
455
+ colorize(modelName, 'model', theme) +
456
+ colorize(' · type a prompt, /help, /verify, /exit (or q)\n', 'divider', theme));
457
+ out.write(horizontalRule(undefined, theme) + '\n\n');
136
458
  if (initialClientState.error) {
137
459
  err.write(`warning: API key not set, chat will fail until DEEPSEEK_API_KEY or ANTHROPIC_AUTH_TOKEN is set.\n`);
138
460
  }
139
- // readline (跟 REPL 同形态, terminal:false 跟 D-19 P2-Ctrl+C 拍板一致)
461
+ // readline (跟 REPL 同形态)
462
+ // D-22 (2026-06-06) 拍板: terminal: true 拿 ↑↓ history (D-22.1) + cursor (multi-line D-22.3).
463
+ // 复用红线: SIGINT 仍走 process.on('SIGINT', onSigint) (D-19 P2-Ctrl+C), readline 不接管
464
+ // (它 terminal mode 默认会按 Ctrl+C 抛 'SIGINT' 事件, 我们的 onSigint 仍 process 级别接收).
140
465
  const rl = createInterface({
141
466
  input: options.input ?? stdin,
142
- terminal: false,
467
+ terminal: true,
143
468
  output: out,
144
469
  });
470
+ // D-22.1: 加载历史到 readline (从老到新, 跟 readline 内部 history 数组语义一致)
471
+ // 注: Node 18+ readline 实例有 `.history: string[]` 字段, 但官方 .d.ts 没声明,
472
+ // 用 any cast 兜底.
473
+ const rlAny = rl;
474
+ rlAny.history = tuiHistoryLoad();
145
475
  return new Promise((resolve) => {
146
476
  let exiting = false;
147
477
  let turnInFlight = false;
148
478
  let pendingExit = false;
479
+ // D-22.3: multi-line input buffer (Hermes 风格 `\ 续行 + \\ 转义)
480
+ const multiLineBuffer = [];
481
+ // D-22.2: 流式 token spinner (assistant stream 期间)
482
+ const spinner = new Spinner();
149
483
  const finish = async (code) => {
150
484
  if (exiting)
151
485
  return;
152
486
  exiting = true;
153
487
  process.off('SIGINT', onSigint);
488
+ // D-22.2: 退出前停 spinner (兜底, 避免动画卡住 shell prompt)
489
+ spinner.stop(out);
154
490
  rl.close();
155
491
  if (writer) {
156
492
  try {
@@ -160,7 +496,7 @@ export async function runTuiMode(options = {}) {
160
496
  /* best-effort */
161
497
  }
162
498
  }
163
- out.write('\n' + colorize(' Goodbye!\n', ANSI.dim));
499
+ out.write('\n' + colorize(' Goodbye!\n', 'divider', theme));
164
500
  resolve(code);
165
501
  };
166
502
  // turn abort controller (D-19 P2-Ctrl+C 拍板)
@@ -175,11 +511,27 @@ export async function runTuiMode(options = {}) {
175
511
  };
176
512
  process.on('SIGINT', onSigint);
177
513
  const prompt = () => {
178
- out.write(colorize(' > ', ANSI.cyan + ANSI.bold));
514
+ out.write(colorize(' > ', 'prompt', theme));
179
515
  };
180
516
  prompt();
181
517
  rl.on('line', async (rawLine) => {
182
- const line = rawLine.trim();
518
+ // D-22.3 (2026-06-06): Hermes 风格多行输入.
519
+ // - 末尾 `\` 续行 (不喂给 turn, 攒入 multiLineBuffer)
520
+ // - 末尾 `\\` (转义) 不当续行, 当字面 `\` 处理
521
+ // - 空行 + 末尾 `\` → 取消续行, 提交空 prompt
522
+ const isCont = isContinuationLine(rawLine);
523
+ if (isCont) {
524
+ multiLineBuffer.push(rawLine);
525
+ // 续行提示 (跟 shell 类似 `> `)
526
+ out.write(colorize(' … ', 'divider', theme));
527
+ return;
528
+ }
529
+ // 收尾 (非续行), 把 buffer 最后一行 + 当前行合并
530
+ const assembled = multiLineBuffer.length > 0
531
+ ? joinContinuation([...multiLineBuffer, rawLine])
532
+ : rawLine;
533
+ multiLineBuffer.length = 0;
534
+ const line = assembled.trim();
183
535
  // D-19 拍板: confirm 期间 line 优先喂 confirm
184
536
  if (confirmController.hasPending()) {
185
537
  if (line === 'exit' || line === 'quit' || line === '/exit' || line === '/quit' || line === 'q') {
@@ -208,7 +560,7 @@ export async function runTuiMode(options = {}) {
208
560
  out.write(colorize('\n Commands:\n' +
209
561
  ' /help show this help\n' +
210
562
  ' /verify run build/lint/typecheck/test (no LLM needed)\n' +
211
- ' /exit, /quit, q exit TUI\n\n', ANSI.dim));
563
+ ' /exit, /quit, q exit TUI\n\n', 'divider', theme));
212
564
  prompt();
213
565
  return;
214
566
  }
@@ -240,7 +592,7 @@ export async function runTuiMode(options = {}) {
240
592
  }
241
593
  // 队列守卫 (跟 REPL D-19.5 拍板)
242
594
  if (turnInFlight) {
243
- out.write(colorize(' (turn in flight, please wait)\n', ANSI.dim));
595
+ out.write(colorize(' (turn in flight, please wait)\n', 'divider', theme));
244
596
  prompt();
245
597
  return;
246
598
  }
@@ -269,11 +621,16 @@ export async function runTuiMode(options = {}) {
269
621
  out.write('\n'); // user 跟 assistant 间空行
270
622
  let result;
271
623
  if (enableToolLoop) {
624
+ // D-22.2 (2026-06-06): turn 启动立刻启 spinner, content 来了就停
625
+ spinner.start(out);
272
626
  result = await runToolLoop(liveClient, turnMessages, {
273
627
  registry: createDefaultRegistry({ sandboxRunner }),
274
628
  onChunk: (chunk) => {
275
- if (chunk.content)
276
- out.write(chunk.content);
629
+ if (chunk.content) {
630
+ spinner.stop(out);
631
+ // D-23.2 (2026-06-06): 语法高亮 assistant stream (tool 名 / 数字 / path 染色)
632
+ out.write(highlightChunk(chunk.content, theme));
633
+ }
277
634
  },
278
635
  ...(options.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),
279
636
  policy: tuiPolicy,
@@ -290,10 +647,15 @@ export async function runTuiMode(options = {}) {
290
647
  }
291
648
  else {
292
649
  // --no-tool-loop 直发
650
+ // D-22.2 (2026-06-06): spinner 启, content 来了停
651
+ spinner.start(out);
293
652
  const streamResult = await liveClient.stream(turnMessages, {
294
653
  onChunk: (chunk) => {
295
- if (chunk.delta.content)
296
- out.write(chunk.delta.content);
654
+ if (chunk.delta.content) {
655
+ spinner.stop(out);
656
+ // D-23.2 (2026-06-06): 语法高亮 --no-tool-loop 直发 stream
657
+ out.write(highlightChunk(chunk.delta.content, theme));
658
+ }
297
659
  },
298
660
  });
299
661
  result = {
@@ -312,8 +674,8 @@ export async function runTuiMode(options = {}) {
312
674
  // TUI 格式化: tool call / result (跟 print mode printStepSummary 同形态, 但加 ANSI)
313
675
  for (const step of result.steps) {
314
676
  if (step.kind === 'tool') {
315
- const status = step.result.success ? colorize('✓', ANSI.green) : colorize('✗', ANSI.red);
316
- out.write(`\n ${status} ${colorize(step.tool_call.name, ANSI.magenta + ANSI.bold)} (${step.duration_ms}ms)\n`);
677
+ const status = step.result.success ? colorize('✓', 'success', theme) : colorize('✗', 'error', theme);
678
+ out.write(`\n ${status} ${colorize(step.tool_call.name, 'toolName', theme)} (${step.duration_ms}ms)\n`);
317
679
  }
318
680
  }
319
681
  // 持久化
@@ -329,16 +691,20 @@ export async function runTuiMode(options = {}) {
329
691
  workingMessages = [
330
692
  ...result.messages,
331
693
  ];
332
- // 状态栏 (复用 formatUsageStatus, 4 字段)
694
+ // 状态栏 (复用 formatUsageStatus, 4 字段) — D-21.2 轻量升级: 上下加横线分隔
333
695
  const usageLine = formatUsageStatus(result.final.usage);
334
696
  if (usageLine !== null) {
335
- out.write('\n' + colorize(' ' + usageLine + '\n', ANSI.dim));
697
+ out.write('\n' + horizontalRule() + '\n');
698
+ out.write(formatTuiStatusBar(usageLine, modelName) + '\n');
699
+ out.write(horizontalRule() + '\n');
336
700
  }
337
701
  else {
338
- out.write('\n');
702
+ out.write('\n' + horizontalRule() + '\n');
339
703
  }
340
704
  }
341
705
  catch (e) {
706
+ // D-22.2: 异常时停 spinner (兜底)
707
+ spinner.stop(out);
342
708
  if (isToolLoopError(e)) {
343
709
  err.write(`\nerror: tool loop hit max steps (${e.steps})\n`);
344
710
  }
@@ -347,6 +713,12 @@ export async function runTuiMode(options = {}) {
347
713
  }
348
714
  }
349
715
  finally {
716
+ // D-22.2: turn 完 (正常/异常/abort) 停 spinner
717
+ spinner.stop(out);
718
+ // D-22.1: turn 完 (非空, 非内建命令) append 历史
719
+ // 注意: 续行合并后 assembled 才是真 prompt, 但历史里只存 trimmed 单行
720
+ // (跟 bash history 一致, 多行 prompt 存 \n 不易)
721
+ tuiHistoryAppend(assembled);
350
722
  turnInFlight = false;
351
723
  if (pendingExit) {
352
724
  void finish(0);
@@ -1 +1 @@
1
- {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/modes/tui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/modes/tui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @deepwhale/coding-agent/policy — Tool call policy.
3
+ *
4
+ * Sprint 1c-revive-2-D-24.2 (2026-06-06): 新建 policy/index.ts 让顶层
5
+ * `export * from './policy/index.js'` 能 re-export (供 tui-ink 子包使用).
6
+ *
7
+ * 之前没有 index.ts — D-24.1 之前只有内部消费 (repl/print/rpc), 顶层不 export.
8
+ * D-24.2 tui-ink 走同样的 ToolPolicy 容器迁移, 需要顶层 import.
9
+ *
10
+ * 业务逻辑 0 重写: 单纯 barrel re-export, 跟其他 index.ts 一致.
11
+ */
12
+ export type { ToolPolicy, PolicyDecision, PolicyToolCall, PolicyContext } from './types.js';
13
+ export { staticToolPolicy } from './static-rules.js';
14
+ export { evaluatePolicy } from './chain.js';
15
+ export { computeArgsDigest } from './args-digest.js';
16
+ export { sanitizeReason } from './sanitize-reason.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA"}