@deepwhale/coding-agent 1.0.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 (138) hide show
  1. package/bin/deepwhale.js +299 -0
  2. package/dist/agent/agent-compaction.d.ts +74 -0
  3. package/dist/agent/agent-compaction.d.ts.map +1 -0
  4. package/dist/agent/agent-compaction.js +145 -0
  5. package/dist/agent/agent-compaction.js.map +1 -0
  6. package/dist/agent/index.d.ts +16 -0
  7. package/dist/agent/index.d.ts.map +1 -0
  8. package/dist/agent/index.js +17 -0
  9. package/dist/agent/index.js.map +1 -0
  10. package/dist/agent/session-adapter.d.ts +177 -0
  11. package/dist/agent/session-adapter.d.ts.map +1 -0
  12. package/dist/agent/session-adapter.js +340 -0
  13. package/dist/agent/session-adapter.js.map +1 -0
  14. package/dist/agent/tool-loop.d.ts +123 -0
  15. package/dist/agent/tool-loop.d.ts.map +1 -0
  16. package/dist/agent/tool-loop.js +425 -0
  17. package/dist/agent/tool-loop.js.map +1 -0
  18. package/dist/env/load-project-env.d.ts +40 -0
  19. package/dist/env/load-project-env.d.ts.map +1 -0
  20. package/dist/env/load-project-env.js +80 -0
  21. package/dist/env/load-project-env.js.map +1 -0
  22. package/dist/index.d.ts +25 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +24 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/llm-factory.d.ts +47 -0
  27. package/dist/llm-factory.d.ts.map +1 -0
  28. package/dist/llm-factory.js +88 -0
  29. package/dist/llm-factory.js.map +1 -0
  30. package/dist/modes/index.d.ts +14 -0
  31. package/dist/modes/index.d.ts.map +1 -0
  32. package/dist/modes/index.js +14 -0
  33. package/dist/modes/index.js.map +1 -0
  34. package/dist/modes/print.d.ts +50 -0
  35. package/dist/modes/print.d.ts.map +1 -0
  36. package/dist/modes/print.js +236 -0
  37. package/dist/modes/print.js.map +1 -0
  38. package/dist/modes/rpc.d.ts +52 -0
  39. package/dist/modes/rpc.d.ts.map +1 -0
  40. package/dist/modes/rpc.js +316 -0
  41. package/dist/modes/rpc.js.map +1 -0
  42. package/dist/modes/tui.d.ts +54 -0
  43. package/dist/modes/tui.d.ts.map +1 -0
  44. package/dist/modes/tui.js +361 -0
  45. package/dist/modes/tui.js.map +1 -0
  46. package/dist/policy/args-digest.d.ts +13 -0
  47. package/dist/policy/args-digest.d.ts.map +1 -0
  48. package/dist/policy/args-digest.js +29 -0
  49. package/dist/policy/args-digest.js.map +1 -0
  50. package/dist/policy/chain.d.ts +19 -0
  51. package/dist/policy/chain.d.ts.map +1 -0
  52. package/dist/policy/chain.js +24 -0
  53. package/dist/policy/chain.js.map +1 -0
  54. package/dist/policy/sanitize-reason.d.ts +11 -0
  55. package/dist/policy/sanitize-reason.d.ts.map +1 -0
  56. package/dist/policy/sanitize-reason.js +24 -0
  57. package/dist/policy/sanitize-reason.js.map +1 -0
  58. package/dist/policy/static-rules.d.ts +32 -0
  59. package/dist/policy/static-rules.d.ts.map +1 -0
  60. package/dist/policy/static-rules.js +106 -0
  61. package/dist/policy/static-rules.js.map +1 -0
  62. package/dist/policy/types.d.ts +56 -0
  63. package/dist/policy/types.d.ts.map +1 -0
  64. package/dist/policy/types.js +13 -0
  65. package/dist/policy/types.js.map +1 -0
  66. package/dist/repl/repl-confirm.d.ts +49 -0
  67. package/dist/repl/repl-confirm.d.ts.map +1 -0
  68. package/dist/repl/repl-confirm.js +88 -0
  69. package/dist/repl/repl-confirm.js.map +1 -0
  70. package/dist/repl.d.ts +126 -0
  71. package/dist/repl.d.ts.map +1 -0
  72. package/dist/repl.js +734 -0
  73. package/dist/repl.js.map +1 -0
  74. package/dist/sandbox/docker-runner.d.ts +147 -0
  75. package/dist/sandbox/docker-runner.d.ts.map +1 -0
  76. package/dist/sandbox/docker-runner.js +426 -0
  77. package/dist/sandbox/docker-runner.js.map +1 -0
  78. package/dist/sandbox/env-gate.d.ts +28 -0
  79. package/dist/sandbox/env-gate.d.ts.map +1 -0
  80. package/dist/sandbox/env-gate.js +65 -0
  81. package/dist/sandbox/env-gate.js.map +1 -0
  82. package/dist/sandbox/local-runner.d.ts +29 -0
  83. package/dist/sandbox/local-runner.d.ts.map +1 -0
  84. package/dist/sandbox/local-runner.js +79 -0
  85. package/dist/sandbox/local-runner.js.map +1 -0
  86. package/dist/sandbox/types.d.ts +80 -0
  87. package/dist/sandbox/types.d.ts.map +1 -0
  88. package/dist/sandbox/types.js +25 -0
  89. package/dist/sandbox/types.js.map +1 -0
  90. package/dist/tools/bash.d.ts +35 -0
  91. package/dist/tools/bash.d.ts.map +1 -0
  92. package/dist/tools/bash.js +233 -0
  93. package/dist/tools/bash.js.map +1 -0
  94. package/dist/tools/edit-file.d.ts +22 -0
  95. package/dist/tools/edit-file.d.ts.map +1 -0
  96. package/dist/tools/edit-file.js +79 -0
  97. package/dist/tools/edit-file.js.map +1 -0
  98. package/dist/tools/find.d.ts +21 -0
  99. package/dist/tools/find.d.ts.map +1 -0
  100. package/dist/tools/find.js +168 -0
  101. package/dist/tools/find.js.map +1 -0
  102. package/dist/tools/grep.d.ts +19 -0
  103. package/dist/tools/grep.d.ts.map +1 -0
  104. package/dist/tools/grep.js +170 -0
  105. package/dist/tools/grep.js.map +1 -0
  106. package/dist/tools/index.d.ts +10 -0
  107. package/dist/tools/index.d.ts.map +1 -0
  108. package/dist/tools/index.js +10 -0
  109. package/dist/tools/index.js.map +1 -0
  110. package/dist/tools/read-file.d.ts +18 -0
  111. package/dist/tools/read-file.d.ts.map +1 -0
  112. package/dist/tools/read-file.js +52 -0
  113. package/dist/tools/read-file.js.map +1 -0
  114. package/dist/tools/registry.d.ts +39 -0
  115. package/dist/tools/registry.d.ts.map +1 -0
  116. package/dist/tools/registry.js +67 -0
  117. package/dist/tools/registry.js.map +1 -0
  118. package/dist/tools/write-file.d.ts +18 -0
  119. package/dist/tools/write-file.d.ts.map +1 -0
  120. package/dist/tools/write-file.js +47 -0
  121. package/dist/tools/write-file.js.map +1 -0
  122. package/dist/types.d.ts +89 -0
  123. package/dist/types.d.ts.map +1 -0
  124. package/dist/types.js +5 -0
  125. package/dist/types.js.map +1 -0
  126. package/dist/verify/format-report.d.ts +57 -0
  127. package/dist/verify/format-report.d.ts.map +1 -0
  128. package/dist/verify/format-report.js +128 -0
  129. package/dist/verify/format-report.js.map +1 -0
  130. package/dist/verify/index.d.ts +8 -0
  131. package/dist/verify/index.d.ts.map +1 -0
  132. package/dist/verify/index.js +8 -0
  133. package/dist/verify/index.js.map +1 -0
  134. package/dist/verify/verify-runner.d.ts +125 -0
  135. package/dist/verify/verify-runner.d.ts.map +1 -0
  136. package/dist/verify/verify-runner.js +524 -0
  137. package/dist/verify/verify-runner.js.map +1 -0
  138. package/package.json +30 -0
@@ -0,0 +1,316 @@
1
+ /**
2
+ * RPC 模式 — Sprint 1a stub
3
+ *
4
+ * NDJSON over stdio(Codex / oh-my-pi 借鉴):每行 = 1 个 JSON object。
5
+ * - request: { id, method, params }
6
+ * - response: { id, result | error }
7
+ * - notification: { method, params } // server push,无 id
8
+ *
9
+ * Sprint 1a stub 范围:
10
+ * - 实现 NDJSON line parser + writer
11
+ * - 实现 1 个 method: 'chat'(复用 runPrintMode 逻辑)
12
+ * - 拒绝其他 method 返回 "method not found"
13
+ * - Ctrl-C 优雅退出
14
+ *
15
+ * Sprint 1b 扩展:
16
+ * - initialize / cancel / shutdown
17
+ * - session 加载/恢复/分支
18
+ * - streaming 增量推送(sse-like notifications)
19
+ */
20
+ import process from 'node:process';
21
+ import { createInterface } from 'node:readline';
22
+ import { isLLMError } from '@deepwhale/llm';
23
+ import { SessionReader, SessionWriter } from '@deepwhale/core';
24
+ import { isToolLoopError, loadSession, persistToolLoopSteps, runToolLoop, runToolLoopWithCompaction, } from '../agent/index.js';
25
+ import { CompactionState } from '@deepwhale/core';
26
+ import { createDefaultRegistry } from '../tools/registry.js';
27
+ import { createDefaultClient } from '../llm-factory.js';
28
+ import { resolveSandboxRunnerFromEnv } from '../sandbox/env-gate.js';
29
+ import { staticToolPolicy } from '../policy/static-rules.js';
30
+ export async function runRpcMode(options) {
31
+ // Sprint 1c-revive-2-D-5+ (review P2, 2026-06-04): rpc 改走 createDefaultClient
32
+ // factory, 跟 print/repl 拍板一致 (env 推断 + flag 显式覆盖). 旧实现写死
33
+ // DeepSeekClient 拍 P2 bug: --provider anthropic 走 rpc 仍用 deepseek.
34
+ const client = options.client ??
35
+ createDefaultClient({
36
+ ...(options.provider !== undefined ? { provider: options.provider } : {}),
37
+ ...(options.model !== undefined ? { model: options.model } : {}),
38
+ });
39
+ const sessionPath = options.sessionPath;
40
+ // Sprint 1c-revive-3-D-12 review P1 修复 (2026-06-05): 入口解析 sandbox env.
41
+ // 未知值 throw (fail-closed), 由 CLI `main().catch` 写到 stderr + exit 1.
42
+ const sandboxRunner = resolveSandboxRunnerFromEnv({ sandboxRoot: process.cwd() });
43
+ // Sprint 1c-revive-3-D-13: rpc 拍板 isInteractive=false (D-15 扩 confirmedTools 协议).
44
+ const policyYes = options.yes ?? false;
45
+ // session
46
+ let workingMessages = [];
47
+ const writer = sessionPath ? new SessionWriter(sessionPath) : null;
48
+ const reader = sessionPath ? new SessionReader(sessionPath) : null;
49
+ if (writer && reader) {
50
+ try {
51
+ await writer.open();
52
+ const loaded = await loadSession(reader);
53
+ workingMessages = [...loaded.messages];
54
+ }
55
+ catch (e) {
56
+ sendError('session_load_failed', `could not load session: ${String(e)}`, '');
57
+ }
58
+ }
59
+ // Sprint 1c-revive-2-D-6 (review P1 修复, 2026-06-04): CompactionState 闭包持有,
60
+ // 跨 chat request 持续累计 failures / paused 状态. 跟 startRepl 拍板一致.
61
+ let compactionConfig = null;
62
+ if (options.compactionConfig && writer) {
63
+ compactionConfig = {
64
+ ...options.compactionConfig,
65
+ writer,
66
+ state: new CompactionState(options.compactionConfig.pauseAfterFailures ?? 2),
67
+ };
68
+ }
69
+ else if (options.compactionConfig && !writer) {
70
+ sendError('compaction_requires_session', 'compactionConfig requires sessionPath; falling back to baseline (no compaction).', '');
71
+ }
72
+ process.stderr.write('deepwhale rpc mode (Sprint 1a stub)\n');
73
+ process.stderr.write(' methods: chat { prompt, stream? }\n');
74
+ process.stderr.write(' notifications: stderr only\n');
75
+ const rl = createInterface({
76
+ input: options.input ?? process.stdin,
77
+ terminal: false,
78
+ });
79
+ let exiting = false;
80
+ // Sprint 1a follow-up:readline line event 不会 await handler,并发 dispatch 会让 workingMessages race。
81
+ // 维护一个 in-flight chain,保证 request 串行处理,workingMessages 累积语义稳定。
82
+ //
83
+ // P1 follow-up:close/SIGINT 路径必须先 await chain,否则正在跑的 chat 写到一半就被 rl.close 砍掉,
84
+ // chat.delta notification / response 都会被截断,响应"晚到"或直接丢。
85
+ // 协议契约:close 触发后,已收到的 request 仍要完整处理完,只有 stdin 已关且 chain 排空才能 finish。
86
+ let chain = Promise.resolve();
87
+ // 标记"想退出",但不立刻 finish。close handler 会 await chain 再 finish。
88
+ let shouldExit = false;
89
+ let exitSignal = 0;
90
+ const finish = async () => {
91
+ if (exiting)
92
+ return;
93
+ exiting = true;
94
+ rl.close();
95
+ if (writer) {
96
+ try {
97
+ await writer.close();
98
+ }
99
+ catch {
100
+ /* best-effort */
101
+ }
102
+ }
103
+ };
104
+ const requestShutdown = (code) => {
105
+ if (shouldExit)
106
+ return; // 已经处于 shutdown 流程,不要重复 signal
107
+ shouldExit = true;
108
+ exitSignal = code;
109
+ };
110
+ rl.on('line', (line) => {
111
+ chain = chain.then(async () => {
112
+ const trimmed = line.trim();
113
+ if (!trimmed)
114
+ return;
115
+ let req;
116
+ try {
117
+ const parsed = JSON.parse(trimmed);
118
+ if (typeof parsed !== 'object' ||
119
+ parsed === null ||
120
+ typeof parsed.id !== 'string' ||
121
+ typeof parsed.method !== 'string') {
122
+ sendError('invalid_request', 'expected {id, method, params?}', '');
123
+ return;
124
+ }
125
+ req = parsed;
126
+ }
127
+ catch (e) {
128
+ sendError('parse_error', `invalid JSON: ${String(e)}`, '');
129
+ return;
130
+ }
131
+ try {
132
+ const result = await dispatch(client, req, workingMessages, writer, options, compactionConfig, sandboxRunner, policyYes);
133
+ sendOk(req.id, result);
134
+ }
135
+ catch (e) {
136
+ if (isToolLoopError(e)) {
137
+ sendError('tool_loop_limit', e.message, req.id);
138
+ }
139
+ else if (isLLMError(e)) {
140
+ sendError('llm_error', e.message, req.id);
141
+ }
142
+ else {
143
+ sendError('internal_error', e instanceof Error ? e.message : String(e), req.id);
144
+ }
145
+ }
146
+ });
147
+ });
148
+ rl.on('close', () => {
149
+ // stdin 关闭 → 标记退出,但不立刻 finish。finish 由 chain 排空触发。
150
+ // Sprint 1a follow-up #3:signal handler 走的是 "rl.close() 触发此 close handler" 路径,
151
+ // 所以 SIGINT/SIGTERM 也走这里 drain — 保证 in-flight chat 能写完响应。
152
+ requestShutdown(0);
153
+ });
154
+ // Sprint 1a follow-up #3: 之前 SIGINT/SIGTERM 只 requestShutdown(0) 但不 rl.close(),
155
+ // 若 stdin 还开着 (例如纯 RPC 模式无 stdin 数据), 进程永远等 close 事件 → 挂住。
156
+ // 修法: signal handler 主动 rl.close(), 走和 stdin close 一样的 drain 路径。
157
+ // exitSignal 反映是被 signal 干掉 (128 + 信号编号), 让 caller 决定退出码 130/143。
158
+ const watchSignals = options.watchSignals ?? ['SIGINT', 'SIGTERM'];
159
+ const signalHandlers = [];
160
+ for (const sig of watchSignals) {
161
+ const handler = () => {
162
+ // 128 + 信号编号 是 POSIX 约定 (130 = SIGINT, 143 = SIGTERM, ...)
163
+ const code = sig === 'SIGINT' ? 130 : sig === 'SIGTERM' ? 143 : 128;
164
+ requestShutdown(code);
165
+ // 主动触发 close, 走和 stdin close 完全一样的 drain 路径
166
+ rl.close();
167
+ };
168
+ process.on(sig, handler);
169
+ signalHandlers.push({ sig, handler });
170
+ }
171
+ // 阻塞直到 stdin 关闭。close 之后,等 chain 排空再 cleanup。
172
+ await new Promise((resolve) => rl.once('close', () => resolve()));
173
+ // P1 follow-up:等 chain 排空 + finish,才能保证 close 之后排队的 request 完整写完 stdout。
174
+ await chain;
175
+ await finish();
176
+ // 卸载 signal handler 避免 leak: 同一进程多次调用 runRpcMode 不能重复挂 signal。
177
+ for (const { sig, handler } of signalHandlers) {
178
+ process.off(sig, handler);
179
+ }
180
+ return exitSignal;
181
+ }
182
+ async function dispatch(client, req, workingMessages, writer, options, compactionConfig,
183
+ // Sprint 1c-revive-3-D-12 review P1 修复: 透传 sandboxRunner 进 dispatch,
184
+ // 让 chat request 内的 tool loop 跟 env 配置一致.
185
+ sandboxRunner,
186
+ // Sprint 1c-revive-3-D-13: 透传 yes 进 dispatch.
187
+ yes) {
188
+ switch (req.method) {
189
+ case 'chat': {
190
+ const prompt = req.params?.['prompt'];
191
+ if (typeof prompt !== 'string') {
192
+ throw new Error('chat: params.prompt must be a string');
193
+ }
194
+ const stream = req.params?.['stream'] === true;
195
+ if (writer) {
196
+ const userEvent = { kind: 'user', ts: Date.now(), content: prompt };
197
+ await writer.append(userEvent);
198
+ }
199
+ // 构造 turn 消息:历史 + 本轮 user。Sprint 1a 修 P1 — user 必须进 LLM。
200
+ const turnMessages = [...workingMessages, { role: 'user', content: prompt }];
201
+ // Sprint 1c-revive-2-D-6 (review P1 修复, 2026-06-04): compactionConfig 存在
202
+ // 走 runToolLoopWithCompaction, 跨 chat request 复用 CompactionState (paused
203
+ // / failures 跨 request 持续, 跟 test 1c-revive-2-D-5-2 拍板).
204
+ const summaryFn = compactionConfig
205
+ ? makeLlmSummarizeFn(client, compactionConfig.protocol)
206
+ : null;
207
+ const result = await (async () => {
208
+ if (compactionConfig !== null && summaryFn !== null) {
209
+ return runToolLoopWithCompaction(client, turnMessages, {
210
+ registry: createDefaultRegistry({ sandboxRunner }),
211
+ ...(options.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),
212
+ ...(stream
213
+ ? {
214
+ onChunk: (chunk) => {
215
+ if (chunk.content) {
216
+ const notif = {
217
+ method: 'chat.delta',
218
+ params: { content: chunk.content },
219
+ };
220
+ process.stdout.write(`${JSON.stringify(notif)}\n`);
221
+ }
222
+ },
223
+ }
224
+ : {}),
225
+ policy: staticToolPolicy,
226
+ isInteractive: false, // rpc 拍板非交互 (D-13)
227
+ yes,
228
+ ...(writer ? { writer } : {}),
229
+ }, compactionConfig, summaryFn);
230
+ }
231
+ return runToolLoop(client, turnMessages, {
232
+ registry: createDefaultRegistry({ sandboxRunner }),
233
+ ...(options.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),
234
+ ...(stream
235
+ ? {
236
+ onChunk: (chunk) => {
237
+ if (chunk.content) {
238
+ const notif = {
239
+ method: 'chat.delta',
240
+ params: { content: chunk.content },
241
+ };
242
+ process.stdout.write(`${JSON.stringify(notif)}\n`);
243
+ }
244
+ },
245
+ }
246
+ : {}),
247
+ policy: staticToolPolicy,
248
+ isInteractive: false, // rpc 拍板非交互 (D-13)
249
+ yes,
250
+ ...(writer ? { writer } : {}),
251
+ });
252
+ })();
253
+ if (writer) {
254
+ try {
255
+ await persistToolLoopSteps(writer, result.steps);
256
+ }
257
+ catch {
258
+ /* best-effort */
259
+ }
260
+ }
261
+ // 跑完回写 workingMessages,下一个 request 拿到的是包含本轮 assistant 步骤的 history。
262
+ // 修 Sprint 1a follow-up: 之前不写回,后续 chat 永远基于空历史。
263
+ workingMessages.length = 0;
264
+ workingMessages.push(...result.messages);
265
+ // Sprint 1b: 顶层暴露 cache_hit_rate / cost_turn, 让 RPC caller 不用 deep dive 到 usage
266
+ // (跟 print/REPL 状态栏对齐: 关键可观测性 1 层扁平访问)
267
+ const resultObj = {
268
+ content: result.final.content,
269
+ usage: result.final.usage,
270
+ steps: result.steps.length,
271
+ };
272
+ if (result.final.usage?.cache_hit_rate !== undefined) {
273
+ resultObj['cache_hit_rate'] = result.final.usage.cache_hit_rate;
274
+ }
275
+ if (result.final.usage?.cost_turn !== undefined) {
276
+ resultObj['cost_turn'] = result.final.usage.cost_turn;
277
+ }
278
+ return resultObj;
279
+ }
280
+ default:
281
+ throw new Error(`method not found: '${req.method}'`);
282
+ }
283
+ }
284
+ function sendOk(id, result) {
285
+ const resp = { id, result };
286
+ process.stdout.write(`${JSON.stringify(resp)}\n`);
287
+ }
288
+ function sendError(code, message, id) {
289
+ const resp = { id, error: { code, message } };
290
+ process.stdout.write(`${JSON.stringify(resp)}\n`);
291
+ }
292
+ /**
293
+ * 生成 LLM summary callback (Sprint 1c-revive-2-D-6).
294
+ * 跟 startRepl / runPrintMode 同形态 helper 拍板一致. 跨 openai/anthropic
295
+ * 同形态 (走 LLMClient 统一契约).
296
+ */
297
+ function makeLlmSummarizeFn(client, _protocol) {
298
+ return async (toSummarize) => {
299
+ const summaryMessages = [
300
+ {
301
+ role: 'system',
302
+ content: 'You are a concise summarizer. Compress the following conversation into 1 short paragraph ' +
303
+ '(max 200 words). Preserve key arithmetic results, tool calls, and final answers.',
304
+ },
305
+ {
306
+ role: 'user',
307
+ content: toSummarize
308
+ .map((m, i) => `[${i}] ${m.role}: ${m.content ?? '(empty)'}`)
309
+ .join('\n'),
310
+ },
311
+ ];
312
+ const r = await client.chat(summaryMessages, {});
313
+ return r.content;
314
+ };
315
+ }
316
+ //# sourceMappingURL=rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/modes/rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * TUI 模式 — Sprint 1c-revive-4-D-20.3 P0-B (2026-06-05) v1.0 capability completion
3
+ *
4
+ * Minimal ANSI TUI. **不**装新依赖 (无 Ink), 用 node:readline + ANSI 转义码.
5
+ *
6
+ * 复用红线 (D-20.3 P0-B 拍板):
7
+ * - 复用 runToolLoop + staticToolPolicy (不绕过 ToolPolicy)
8
+ * - 复用 createReplConfirm (D-19 串行化, 不重建 2 套 confirm)
9
+ * - 复用 SessionWriter (不绕过 session audit, 跟 REPL/print mode 同形态)
10
+ * - 复用 formatUsageStatus (REPL 状态栏 4 字段, 风格统一)
11
+ *
12
+ * 必须实现 (用户红线):
13
+ * 1. `deepwhale tui` 启动
14
+ * 2. 用户可输入 prompt
15
+ * 3. assistant stream 可显示
16
+ * 4. tool call / result 可显示
17
+ * 5. destructive tool 触发 y/N confirm (走 createReplConfirm)
18
+ * 6. y 执行, n/empty 拒绝
19
+ * 7. /exit 或 q 退出
20
+ * 8. session 不损坏 (走 D-19.5 finish 路径, writer.close)
21
+ * 9. TUI 路径复用 ToolPolicy / SessionWriter / runToolLoop
22
+ *
23
+ * Minimal scope (v1.0):
24
+ * - ANSI 颜色: 标题 / 用户 prompt / tool call / tool result / 状态栏
25
+ * - 不做: 多行 / 自动补全 / 主题 / 鼠标 / 文件树 / syntax highlight
26
+ *
27
+ * NOT covered (defer to v1.1):
28
+ * - 全屏 IDE-style TUI
29
+ * - 主题切换
30
+ * - 多 session 切换
31
+ * - Plan mode / recovery
32
+ */
33
+ import type { LLMClient } from '@deepwhale/llm';
34
+ import { type AgentCompactionConfig } from '../agent/index.js';
35
+ import { type Provider } from '../llm-factory.js';
36
+ export interface TuiModeOptions {
37
+ sessionPath?: string;
38
+ enableToolLoop?: boolean;
39
+ maxSteps?: number;
40
+ client?: LLMClient;
41
+ provider?: Provider;
42
+ model?: string;
43
+ yes?: boolean;
44
+ /** 注入输入流(默认 stdin)。单测用。 */
45
+ input?: NodeJS.ReadableStream;
46
+ /** 注入输出流(默认 stdout)。单测用。 */
47
+ output?: NodeJS.WritableStream;
48
+ /** 注入错误流(默认 stderr)。单测用。 */
49
+ errorOutput?: NodeJS.WritableStream;
50
+ /** compaction config 跟 print mode 同形态 */
51
+ compactionConfig?: Omit<AgentCompactionConfig, 'writer' | 'state'> | null;
52
+ }
53
+ export declare function runTuiMode(options?: TuiModeOptions): Promise<number>;
54
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/modes/tui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EAKL,KAAK,qBAAqB,EAE3B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAuB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAkCvE,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACpC,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3E;AAID,wBAAsB,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuT9E"}