@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,361 @@
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 { createInterface } from 'node:readline';
34
+ import { stdin, stdout, stderr } from 'node:process';
35
+ import { SessionReader, SessionWriter } from '@deepwhale/core';
36
+ import { isToolLoopError, loadSession, persistToolLoopSteps, runToolLoop, } from '../agent/index.js';
37
+ import { createDefaultRegistry } from '../tools/registry.js';
38
+ import { formatUsageStatus } from '../repl.js';
39
+ import { createDefaultClient } from '../llm-factory.js';
40
+ import { resolveSandboxRunnerFromEnv } from '../sandbox/env-gate.js';
41
+ import { staticToolPolicy } from '../policy/static-rules.js';
42
+ import { createReplConfirm } from '../repl/repl-confirm.js'; // D-19: 复用 REPL confirm controller
43
+ // ---- ANSI 颜色 (no dependency, 直接 escape) ----
44
+ const ANSI = {
45
+ reset: '\x1b[0m',
46
+ bold: '\x1b[1m',
47
+ dim: '\x1b[2m',
48
+ // 前景
49
+ cyan: '\x1b[36m',
50
+ green: '\x1b[32m',
51
+ yellow: '\x1b[33m',
52
+ red: '\x1b[31m',
53
+ blue: '\x1b[34m',
54
+ magenta: '\x1b[35m',
55
+ // 背景
56
+ bgBlue: '\x1b[44m',
57
+ };
58
+ /** 检测 TTY (跟 REPL 一样, 非 TTY 退回无色输出, 让 test 不依赖 ANSI) */
59
+ const isTty = () => Boolean(stdout.isTTY);
60
+ /** 染色 wrapper (非 TTY 时退化到原文) */
61
+ function colorize(text, color) {
62
+ return isTty() ? `${color}${text}${ANSI.reset}` : text;
63
+ }
64
+ // ---- TUI 主入口 ----
65
+ export async function runTuiMode(options = {}) {
66
+ const out = options.output ?? stdout;
67
+ const err = options.errorOutput ?? stderr;
68
+ const enableToolLoop = options.enableToolLoop ?? true;
69
+ const sessionPath = options.sessionPath;
70
+ // sandbox env 解析 (跟 print mode / REPL 一致)
71
+ const sandboxRunner = resolveSandboxRunnerFromEnv({ sandboxRoot: process.cwd() });
72
+ const policyYes = options.yes ?? false;
73
+ // lazy client (跟 REPL D-11-4 拍板一致: 无 key 不阻塞启动, 首次 chat 才报错)
74
+ const clientFromOptions = options.client;
75
+ let client = clientFromOptions ?? null;
76
+ let clientError = null;
77
+ const tryCreateClient = () => {
78
+ if (clientFromOptions)
79
+ return { client: clientFromOptions, error: null };
80
+ if (client !== null || clientError !== null) {
81
+ return { client, error: clientError };
82
+ }
83
+ try {
84
+ const c = createDefaultClient({
85
+ ...(options.provider !== undefined ? { provider: options.provider } : {}),
86
+ ...(options.model !== undefined ? { model: options.model } : {}),
87
+ });
88
+ client = c;
89
+ clientError = null;
90
+ return { client: c, error: null };
91
+ }
92
+ catch (e) {
93
+ const err0 = e instanceof Error ? e : new Error(String(e));
94
+ clientError = err0;
95
+ return { client: null, error: err0 };
96
+ }
97
+ };
98
+ // D-19 复用 confirm controller
99
+ const confirmController = createReplConfirm({ output: out });
100
+ const tuiPolicy = {
101
+ ...staticToolPolicy,
102
+ confirm: confirmController.confirm,
103
+ };
104
+ // session 加载
105
+ let workingMessages = [];
106
+ const writer = sessionPath ? new SessionWriter(sessionPath) : null;
107
+ const reader = sessionPath ? new SessionReader(sessionPath) : null;
108
+ if (writer && reader) {
109
+ try {
110
+ await writer.open();
111
+ const loaded = await loadSession(reader);
112
+ workingMessages = [...loaded.messages];
113
+ if (workingMessages.length > 0) {
114
+ out.write(colorize(` ${loaded.messages.length} messages resumed from session\n`, ANSI.dim) + '\n');
115
+ }
116
+ }
117
+ catch (e) {
118
+ err.write(`warning: could not load session: ${String(e)}\n`);
119
+ }
120
+ }
121
+ // Sprint 1c-revive-4-D-20.3 P0-B (2026-06-05): TUI minimal scope 不接 compaction
122
+ // (跟 minimal 拍板一致: D-20.3 P0 只做启动/输入/stream/confirm/exit/session 闭环).
123
+ // Compaction 是 D-20.3 P2, 留 v1.1. options.compactionConfig 字段保留 (跟 print mode
124
+ // 同接口), 但当前 implementation 不消费. 这样 binary 接口稳定, 后续 sprint 直接接.
125
+ if (options.compactionConfig && writer) {
126
+ // 显式 silently no-op (minimal TUI 暂不接 compaction, 避免跟 P0 范围扩大).
127
+ // 注: print mode 抛 warning (D-6 拍板), TUI 不抛 (minimal scope, 留扩展点).
128
+ }
129
+ // 顶部 header (D-20.3 TUI 标识)
130
+ const initialClientState = tryCreateClient();
131
+ const modelName = initialClientState.client?.model ?? 'not-configured';
132
+ 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');
136
+ if (initialClientState.error) {
137
+ err.write(`warning: API key not set, chat will fail until DEEPSEEK_API_KEY or ANTHROPIC_AUTH_TOKEN is set.\n`);
138
+ }
139
+ // readline (跟 REPL 同形态, terminal:false 跟 D-19 P2-Ctrl+C 拍板一致)
140
+ const rl = createInterface({
141
+ input: options.input ?? stdin,
142
+ terminal: false,
143
+ output: out,
144
+ });
145
+ return new Promise((resolve) => {
146
+ let exiting = false;
147
+ let turnInFlight = false;
148
+ let pendingExit = false;
149
+ const finish = async (code) => {
150
+ if (exiting)
151
+ return;
152
+ exiting = true;
153
+ process.off('SIGINT', onSigint);
154
+ rl.close();
155
+ if (writer) {
156
+ try {
157
+ await writer.close();
158
+ }
159
+ catch {
160
+ /* best-effort */
161
+ }
162
+ }
163
+ out.write('\n' + colorize(' Goodbye!\n', ANSI.dim));
164
+ resolve(code);
165
+ };
166
+ // turn abort controller (D-19 P2-Ctrl+C 拍板)
167
+ let turnAbortController = new AbortController();
168
+ const onSigint = () => {
169
+ if (confirmController.hasPending()) {
170
+ confirmController.dismiss();
171
+ }
172
+ if (!turnAbortController.signal.aborted) {
173
+ turnAbortController.abort();
174
+ }
175
+ };
176
+ process.on('SIGINT', onSigint);
177
+ const prompt = () => {
178
+ out.write(colorize(' > ', ANSI.cyan + ANSI.bold));
179
+ };
180
+ prompt();
181
+ rl.on('line', async (rawLine) => {
182
+ const line = rawLine.trim();
183
+ // D-19 拍板: confirm 期间 line 优先喂 confirm
184
+ if (confirmController.hasPending()) {
185
+ if (line === 'exit' || line === 'quit' || line === '/exit' || line === '/quit' || line === 'q') {
186
+ confirmController.dismiss();
187
+ pendingExit = true;
188
+ return;
189
+ }
190
+ const consumed = confirmController.offerLine(line);
191
+ if (consumed)
192
+ return;
193
+ }
194
+ // 内建命令
195
+ if (line === '') {
196
+ prompt();
197
+ return;
198
+ }
199
+ if (line === 'q' || line === 'exit' || line === 'quit' || line === '/exit' || line === '/quit') {
200
+ if (turnInFlight) {
201
+ pendingExit = true;
202
+ return;
203
+ }
204
+ await finish(0);
205
+ return;
206
+ }
207
+ if (line === '/help') {
208
+ out.write(colorize('\n Commands:\n' +
209
+ ' /help show this help\n' +
210
+ ' /verify run build/lint/typecheck/test (no LLM needed)\n' +
211
+ ' /exit, /quit, q exit TUI\n\n', ANSI.dim));
212
+ prompt();
213
+ return;
214
+ }
215
+ if (line === '/verify') {
216
+ // 跟 REPL /verify 同语义 — 调 runVerify, 写 verification event
217
+ try {
218
+ const { runVerify, formatReport, buildSummaryAndNext } = await import('../verify/index.js');
219
+ const report = await runVerify();
220
+ const filled = buildSummaryAndNext(report);
221
+ const text = formatReport({ ...report, summary: filled.summary, nextSuggestedAction: filled.nextSuggestedAction });
222
+ out.write(text + '\n');
223
+ if (writer) {
224
+ const { appendVerificationEvent } = await import('../agent/index.js');
225
+ const failedCount = report.checks.filter((c) => c.status !== 'passed').length;
226
+ await appendVerificationEvent(writer, {
227
+ status: report.overallStatus,
228
+ durationMs: report.durationMs,
229
+ commandCount: report.checks.length,
230
+ failedCount,
231
+ summary: filled.summary,
232
+ });
233
+ }
234
+ }
235
+ catch (e) {
236
+ err.write(`error: verify failed: ${e instanceof Error ? e.message : String(e)}\n\n`);
237
+ }
238
+ prompt();
239
+ return;
240
+ }
241
+ // 队列守卫 (跟 REPL D-19.5 拍板)
242
+ if (turnInFlight) {
243
+ out.write(colorize(' (turn in flight, please wait)\n', ANSI.dim));
244
+ prompt();
245
+ return;
246
+ }
247
+ turnInFlight = true;
248
+ turnAbortController = new AbortController();
249
+ // lazy client
250
+ const c = clientFromOptions ? { client: clientFromOptions, error: null } : tryCreateClient();
251
+ if (c.client === null) {
252
+ err.write(`error: API key not set. set DEEPSEEK_API_KEY or ANTHROPIC_AUTH_TOKEN.\n\n`);
253
+ turnInFlight = false;
254
+ prompt();
255
+ return;
256
+ }
257
+ const liveClient = c.client;
258
+ try {
259
+ // 持久化 user input
260
+ if (writer) {
261
+ const userEvent = { kind: 'user', ts: Date.now(), content: line };
262
+ await writer.append(userEvent);
263
+ }
264
+ // 构造 turn messages
265
+ const turnMessages = [
266
+ ...workingMessages,
267
+ { role: 'user', content: line },
268
+ ];
269
+ out.write('\n'); // user 跟 assistant 间空行
270
+ let result;
271
+ if (enableToolLoop) {
272
+ result = await runToolLoop(liveClient, turnMessages, {
273
+ registry: createDefaultRegistry({ sandboxRunner }),
274
+ onChunk: (chunk) => {
275
+ if (chunk.content)
276
+ out.write(chunk.content);
277
+ },
278
+ ...(options.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),
279
+ policy: tuiPolicy,
280
+ isInteractive: true, // TUI = 交互
281
+ yes: policyYes,
282
+ // Sprint 1c-revive-5-D-20.6.4 review-fix (2026-06-06): 透传 turnAbortController.signal
283
+ // 给 runToolLoop, 让 SIGINT (onSigint) abort 时透传到 LLM stream / tool exec /
284
+ // policy.confirm. 跟 repl.ts:509 对齐. 之前漏传, SIGINT 只 abort controller
285
+ // 不往下传, 工具循环在 tool execution / confirm 等关键点收不到 abort,
286
+ // hang 住, 跟 D-19 Ctrl+C/cleanup 链路不完整.
287
+ signal: turnAbortController.signal,
288
+ ...(writer ? { writer } : {}),
289
+ });
290
+ }
291
+ else {
292
+ // --no-tool-loop 直发
293
+ const streamResult = await liveClient.stream(turnMessages, {
294
+ onChunk: (chunk) => {
295
+ if (chunk.delta.content)
296
+ out.write(chunk.delta.content);
297
+ },
298
+ });
299
+ result = {
300
+ messages: [...turnMessages, { role: 'assistant', content: streamResult.content }],
301
+ final: streamResult,
302
+ steps: [
303
+ {
304
+ kind: 'assistant',
305
+ ts: Date.now(),
306
+ message: { role: 'assistant', content: streamResult.content },
307
+ result: streamResult,
308
+ },
309
+ ],
310
+ };
311
+ }
312
+ // TUI 格式化: tool call / result (跟 print mode printStepSummary 同形态, 但加 ANSI)
313
+ for (const step of result.steps) {
314
+ 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`);
317
+ }
318
+ }
319
+ // 持久化
320
+ if (writer) {
321
+ try {
322
+ await persistToolLoopSteps(writer, result.steps);
323
+ }
324
+ catch {
325
+ /* best-effort */
326
+ }
327
+ }
328
+ // 更新 working messages (跟 REPL 一致, 加 user + 所有 steps 消息)
329
+ workingMessages = [
330
+ ...result.messages,
331
+ ];
332
+ // 状态栏 (复用 formatUsageStatus, 4 字段)
333
+ const usageLine = formatUsageStatus(result.final.usage);
334
+ if (usageLine !== null) {
335
+ out.write('\n' + colorize(' ' + usageLine + '\n', ANSI.dim));
336
+ }
337
+ else {
338
+ out.write('\n');
339
+ }
340
+ }
341
+ catch (e) {
342
+ if (isToolLoopError(e)) {
343
+ err.write(`\nerror: tool loop hit max steps (${e.steps})\n`);
344
+ }
345
+ else {
346
+ err.write(`\nerror: ${e instanceof Error ? e.message : String(e)}\n`);
347
+ }
348
+ }
349
+ finally {
350
+ turnInFlight = false;
351
+ if (pendingExit) {
352
+ void finish(0);
353
+ }
354
+ else {
355
+ prompt();
356
+ }
357
+ }
358
+ });
359
+ });
360
+ }
361
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/modes/tui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Sprint 1c-revive-3-D-13 (2026-06-05)
3
+ *
4
+ * 稳定 JSON (key 排序) + sha256 前 12 位. 不存原始 args.
5
+ *
6
+ * 用户拍板 (2026-06-05): "argsDigest 不存原始 args, 先用稳定 JSON + sha256 前 12 位;
7
+ * reason 可以写自然语言, 但不能包含完整文件内容或 secret"
8
+ *
9
+ * 注: stable JSON 自己实现, 不引 fast-json-stable-stringify 等 dep, MVP 范围.
10
+ * 实现注意: 走 string 拼接避免大量递归 JSON.parse/stringify 调用.
11
+ */
12
+ export declare function computeArgsDigest(args: Record<string, unknown>): string;
13
+ //# sourceMappingURL=args-digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args-digest.d.ts","sourceRoot":"","sources":["../../src/policy/args-digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAgBH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAIvE"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Sprint 1c-revive-3-D-13 (2026-06-05)
3
+ *
4
+ * 稳定 JSON (key 排序) + sha256 前 12 位. 不存原始 args.
5
+ *
6
+ * 用户拍板 (2026-06-05): "argsDigest 不存原始 args, 先用稳定 JSON + sha256 前 12 位;
7
+ * reason 可以写自然语言, 但不能包含完整文件内容或 secret"
8
+ *
9
+ * 注: stable JSON 自己实现, 不引 fast-json-stable-stringify 等 dep, MVP 范围.
10
+ * 实现注意: 走 string 拼接避免大量递归 JSON.parse/stringify 调用.
11
+ */
12
+ import { createHash } from 'node:crypto';
13
+ function stableStringify(value) {
14
+ if (value === null || typeof value !== 'object') {
15
+ return JSON.stringify(value);
16
+ }
17
+ if (Array.isArray(value)) {
18
+ return '[' + value.map(stableStringify).join(',') + ']';
19
+ }
20
+ const obj = value;
21
+ const keys = Object.keys(obj).sort();
22
+ return '{' + keys.map((k) => JSON.stringify(k) + ':' + stableStringify(obj[k])).join(',') + '}';
23
+ }
24
+ export function computeArgsDigest(args) {
25
+ const json = stableStringify(args);
26
+ const hash = createHash('sha256').update(json, 'utf8').digest('hex');
27
+ return `sha256:${hash.slice(0, 12)}`;
28
+ }
29
+ //# sourceMappingURL=args-digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args-digest.js","sourceRoot":"","sources":["../../src/policy/args-digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC1D,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAA6B;IAC7D,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,UAAU,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Sprint 1c-revive-3-D-13 (2026-06-05)
3
+ *
4
+ * chain 串 static + caller-supplied ToolPolicy.
5
+ *
6
+ * Sprint 1c-revive-3-D-13 review P1(b) 修复 (2026-06-05):
7
+ * 拍板 (用户 2026-06-05): "保持 PolicyDecision 简洁, 在 tool-loop.ts 里保留 raw decision".
8
+ * 实现: chain.ts **不**做 yes bypass, 直接透传 policy.evaluate 结果. yes bypass 在
9
+ * tool-loop.ts 里处理 (调 evaluatePolicy 拿到 raw decision, 自己判断 yes 走 user_approved
10
+ * 审计 + bypass 路径).
11
+ *
12
+ * 拍板红线 (用户 2026-06-05):
13
+ * - yes=true 移出 chain (在 tool-loop 处理),保持 PolicyDecision union 简洁 (3 kind)
14
+ * - allow 不在 chain 后续层 reject (first allow wins; 但 static 拍 board 只有 allow / deny / require_confirmation 3 个)
15
+ * - deny 永远不 bypass (拍板红线)
16
+ */
17
+ import type { PolicyDecision, PolicyContext, PolicyToolCall, ToolPolicy } from './types.js';
18
+ export declare function evaluatePolicy(toolCall: PolicyToolCall, ctx: PolicyContext, policy?: ToolPolicy): PolicyDecision;
19
+ //# sourceMappingURL=chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/policy/chain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG5F,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,aAAa,EAClB,MAAM,GAAE,UAA6B,GACpC,cAAc,CAKhB"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Sprint 1c-revive-3-D-13 (2026-06-05)
3
+ *
4
+ * chain 串 static + caller-supplied ToolPolicy.
5
+ *
6
+ * Sprint 1c-revive-3-D-13 review P1(b) 修复 (2026-06-05):
7
+ * 拍板 (用户 2026-06-05): "保持 PolicyDecision 简洁, 在 tool-loop.ts 里保留 raw decision".
8
+ * 实现: chain.ts **不**做 yes bypass, 直接透传 policy.evaluate 结果. yes bypass 在
9
+ * tool-loop.ts 里处理 (调 evaluatePolicy 拿到 raw decision, 自己判断 yes 走 user_approved
10
+ * 审计 + bypass 路径).
11
+ *
12
+ * 拍板红线 (用户 2026-06-05):
13
+ * - yes=true 移出 chain (在 tool-loop 处理),保持 PolicyDecision union 简洁 (3 kind)
14
+ * - allow 不在 chain 后续层 reject (first allow wins; 但 static 拍 board 只有 allow / deny / require_confirmation 3 个)
15
+ * - deny 永远不 bypass (拍板红线)
16
+ */
17
+ import { staticToolPolicy } from './static-rules.js';
18
+ export function evaluatePolicy(toolCall, ctx, policy = staticToolPolicy) {
19
+ // 拍板 (P1 b 修复): chain 只做 policy 评估 + 透传, yes bypass 在 tool-loop.ts 处理.
20
+ // 这样 tool-loop 拿到的 decision 就是 policy.evaluate 原始结果, 不会被 yes 抹平
21
+ // (raw decision 保留, 才能落 user_approved 审计).
22
+ return policy.evaluate(toolCall, ctx);
23
+ }
24
+ //# sourceMappingURL=chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.js","sourceRoot":"","sources":["../../src/policy/chain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,UAAU,cAAc,CAC5B,QAAwB,EACxB,GAAkB,EAClB,SAAqB,gBAAgB;IAErC,uEAAuE;IACvE,gEAAgE;IAChE,2CAA2C;IAC3C,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Sprint 1c-revive-3-D-13 (2026-06-05)
3
+ *
4
+ * 用户拍板 (2026-06-05): "reason 可以写自然语言, 但不能包含完整文件内容或 secret"
5
+ * D-13 MVP 拍板: 长度上限 200 + 换行折叠 + 去 NUL. 真正的 secret detection 留给 D-15.
6
+ *
7
+ * 拍板红线: sanitized reason 进 SessionEvent policy_decision 落盘, 一旦写错字段
8
+ * 整个 session 不可读. 拍 board 安全优先.
9
+ */
10
+ export declare function sanitizeReason(reason: string): string;
11
+ //# sourceMappingURL=sanitize-reason.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-reason.d.ts","sourceRoot":"","sources":["../../src/policy/sanitize-reason.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWrD"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Sprint 1c-revive-3-D-13 (2026-06-05)
3
+ *
4
+ * 用户拍板 (2026-06-05): "reason 可以写自然语言, 但不能包含完整文件内容或 secret"
5
+ * D-13 MVP 拍板: 长度上限 200 + 换行折叠 + 去 NUL. 真正的 secret detection 留给 D-15.
6
+ *
7
+ * 拍板红线: sanitized reason 进 SessionEvent policy_decision 落盘, 一旦写错字段
8
+ * 整个 session 不可读. 拍 board 安全优先.
9
+ */
10
+ const MAX_REASON_LEN = 200;
11
+ const TRUNCATED_MARKER = '…[truncated]'; // 13 chars (ellipsis counts as 1 utf-16 unit)
12
+ export function sanitizeReason(reason) {
13
+ // 1. 折叠换行 (\r?\n → ' / '), 单行显示
14
+ let r = reason.replace(/\r?\n/g, ' / ');
15
+ // 2. 去 NUL (JSON 写入安全, 防 null byte 注入)
16
+ // eslint-disable-next-line no-control-regex
17
+ r = r.replace(/\u0000/g, '');
18
+ // 3. 长度上限 + 标 truncated
19
+ if (r.length > MAX_REASON_LEN) {
20
+ r = r.slice(0, MAX_REASON_LEN - TRUNCATED_MARKER.length) + TRUNCATED_MARKER;
21
+ }
22
+ return r;
23
+ }
24
+ //# sourceMappingURL=sanitize-reason.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-reason.js","sourceRoot":"","sources":["../../src/policy/sanitize-reason.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,gBAAgB,GAAG,cAAc,CAAC,CAAC,8CAA8C;AAEvF,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,gCAAgC;IAChC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACxC,uCAAuC;IACvC,4CAA4C;IAC5C,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC7B,wBAAwB;IACxB,IAAI,CAAC,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QAC9B,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC;IAC9E,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Sprint 1c-revive-3-D-13 (2026-06-05): 默认静态规则.
3
+ * Sprint 1c-revive-3-D-13 review P1 修复 (2026-06-05):
4
+ * - 合并 command + args 成 1 条字符串再 regex match (解决 `mv a b` / `cp a b` 等
5
+ * command-only regex 漏判的问题). 不引 shlex dep, 拍板 MVP 接受 edge case 漏判.
6
+ * - 拍板 (用户 2026-06-05 review): "v1.0 红线是'未经确认不 mv', 不只是 /etc/系统路径;
7
+ * cp 一起收, 宁可多弹确认". 加 mv / cp 全部 → require_confirmation.
8
+ *
9
+ * 拍板 (用户 2026-06-05):
10
+ * - A1: 默认规则 (read/find/grep 全 allow, write/edit 全 require_confirmation)
11
+ * - B1: bash 用 regex/argv-light 检测危险模式 → require_confirmation (不直接 deny,
12
+ * 误判只是多弹确认, 比 deny 漏判安全)
13
+ * - R-1: race 接受为 MVP 风险, D-15 用 inotify / mutex 收
14
+ * - R-2: bash 漏判 (e.g. shlex quote 拆分) 接受, 走 require_confirmation 而非 deny
15
+ *
16
+ * 不做 (D-15):
17
+ * - 用户 config 注入 (ToolPolicy 透传, D-13 默认走 static)
18
+ * - 路径白名单/黑名单
19
+ * - Bash argv deep parse (e.g. shlex)
20
+ * - Secret 强检测 (redact API key in reason)
21
+ */
22
+ import type { PolicyDecision, ToolPolicy } from './types.js';
23
+ /**
24
+ * bash regex 危险模式 — 暴露给 tool-loop 在 bash 工具自身层也用 (双重防线)
25
+ *
26
+ * Sprint 1c-revive-3-D-13 review P1 修复 (2026-06-05):
27
+ * 拍板 (用户 2026-06-05): "bash 检测先轻量合并 command + args"
28
+ * 不引 shlex dep, MVP 接受 quote 拆分漏判 (R-2 拍板).
29
+ */
30
+ export declare function evaluateBashCommand(cmd: string, args: ReadonlyArray<string>): PolicyDecision;
31
+ export declare const staticToolPolicy: ToolPolicy;
32
+ //# sourceMappingURL=static-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-rules.d.ts","sourceRoot":"","sources":["../../src/policy/static-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAiC,UAAU,EAAE,MAAM,YAAY,CAAC;AAwC5F;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,cAAc,CAa5F;AAyBD,eAAO,MAAM,gBAAgB,EAAE,UAK9B,CAAC"}