@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 @@
1
+ {"version":3,"file":"verify-runner.d.ts","sourceRoot":"","sources":["../../src/verify/verify-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,cAAc;AACd,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,YAAY;AACZ,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;AAE9F,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,YAAY;AACZ,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,yBAAyB,CAAC;IACzC,MAAM,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACzC,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa;IACb,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,MAAM,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACpC,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oCAAoC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAgCD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,CAKjG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAcT;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA8E3F"}
@@ -0,0 +1,524 @@
1
+ /**
2
+ * @deepwhale/coding-agent — Verify runner
3
+ *
4
+ * Sprint 1c-revive-2-D-11 (2026-06-04): `deepwhale --verify` 跟 REPL `/verify`
5
+ * 内部统一走 `runVerify()` — 跑 4 步真验证 (build / lint / typecheck / test),
6
+ * 不走 LLM, 不走 tool loop, 生成 `VerificationReport`.
7
+ *
8
+ * 设计拍板:
9
+ * - 4 步默认: corepack pnpm build / lint / typecheck / test
10
+ * - 用户可覆盖 checks (单测用) / cwd (单测 tmpdir) / signal (取消)
11
+ * - 每步 spawn child_process 同步等 exit, **不**用 stream (避免长 stdout 卡 session)
12
+ * - stdout/stderr 截断: 默认 4 KB 尾, 防止 session JSONL 撑爆
13
+ * - timeout 默认 5 min/步, 总 timeout 默认 30 min (build+lint+typecheck+test 全跑)
14
+ * - 任何一步 fail → 整体 fail, **不**继续后续步 (用户拍的 D-11 review: fail-fast
15
+ * 比继续跑节省时间, 而且后续步基于 build 产物, fail-fast 防止假绿)
16
+ * - 不读 .env, 不动 LLM, 不调 tool loop — 真·本地 CLI
17
+ *
18
+ * 不变量 (跟 D-10c 集成测语义 hotfix 一脉相承):
19
+ * - 不打印 / 不写 key 值
20
+ * - 不做 ASCII-only sanitize
21
+ * - 不读 .env 文件 (D-7 loadProjectEnv 是 caller 职责)
22
+ * - 不依赖 LLM client (跑 verify 不需要 key)
23
+ *
24
+ * @module @deepwhale/coding-agent/verify-runner
25
+ */
26
+ import { spawn } from 'node:child_process';
27
+ import process from 'node:process';
28
+ const DEFAULT_CHECKS = [
29
+ // 拍板: args[0] 是实际 spawn 的可执行 (e.g. 'corepack'), 后面是它的参数.
30
+ // 4 步 default 用 corepack 跑 pnpm, 跟用户日常工作流一致
31
+ // (corepack 自身 < 5MB, 启动 < 200ms, 不显著影响 verify 总耗时).
32
+ //
33
+ // Sprint 1c-revive-2-D-11-4 review P1 修复 (2026-06-04): args[0] 在 Windows 上
34
+ // 由 resolveRunner() 转成 'corepack.cmd'. 默认仍写 'corepack' (Linux/macOS 不变,
35
+ // 跟 1c 时代兼容性), 真 spawn 时再换. 单测可注入 platform = 'win32' 验证.
36
+ {
37
+ name: 'build',
38
+ command: 'corepack pnpm build',
39
+ args: ['corepack', 'pnpm', 'build'],
40
+ },
41
+ {
42
+ name: 'lint',
43
+ command: 'corepack pnpm lint',
44
+ args: ['corepack', 'pnpm', 'lint'],
45
+ },
46
+ {
47
+ name: 'typecheck',
48
+ command: 'corepack pnpm typecheck',
49
+ args: ['corepack', 'pnpm', 'typecheck'],
50
+ },
51
+ {
52
+ name: 'test',
53
+ command: 'corepack pnpm vitest run --exclude "packages/*/test/integration/**"',
54
+ args: ['corepack', 'pnpm', 'vitest', 'run', '--exclude', 'packages/*/test/integration/**'],
55
+ },
56
+ ];
57
+ /**
58
+ * Sprint 1c-revive-2-D-11-4 review P1 修复: Windows 上 `corepack` 在 PATH 解析不到
59
+ * (Node `spawn('corepack', ...)` 在 Win32 默认走 CreateProcessW, 不接 .cmd shim).
60
+ * 实际 `where corepack` 只返 `corepack.cmd`. 修复: Win32 上把 'corepack' → 'corepack.cmd'.
61
+ *
62
+ * 设计: 接受 platform 参数, 默认用 process.platform, 单测可注入 'win32' 验证.
63
+ * 仅在 args0 严格 === 'corepack' 时转换; 其它可执行 (node / bash / .exe) 透传,
64
+ * 跟单测里 mock 各种 runner 的行为兼容.
65
+ */
66
+ export function resolveRunner(args0, platform = process.platform) {
67
+ if (args0 === 'corepack' && platform === 'win32') {
68
+ return 'corepack.cmd';
69
+ }
70
+ return args0;
71
+ }
72
+ /**
73
+ * 判定 child close 时的 stderr / stdout 是不是 "启错" 文本 (Win32 shell:true
74
+ * 路径下, "命令不存在" / "No such file" 走 cmd.exe exit 1, 不会 sync spawn
75
+ * 抛). 跨 Win32 shell 启错模式: cmd.exe "X is not recognized" + PowerShell
76
+ * "term not recognized" + POSIX shell 偶发 (e.g. via /bin/sh -c) "No such
77
+ * file". 命中返 true, caller 报 'spawn-error' 跟 POSIX 语义对齐.
78
+ *
79
+ * 设计: 故意**不**用 ENOENT (Node child 不暴露), 也不查 PATH. 简单字符串匹配
80
+ * 几个高置信度关键词, 误伤率低. 留 D-20.8 用 stderr 双检 + Node fs.access
81
+ * 再强化.
82
+ *
83
+ * 拍板 (D-20.7.7, 2026-06-06): 保守匹配, 不命中普通命令 exit 1 (e.g. 编译失败,
84
+ * 测试 fail) 误报.
85
+ */
86
+ export function looksLikeSpawnError(stdout, stderr, exitCode) {
87
+ if (exitCode === 0)
88
+ return false;
89
+ const text = `${stdout}\n${stderr}`;
90
+ // 关键词按 Win32 cmd / PowerShell / POSIX /bin/sh 优先级排
91
+ const patterns = [
92
+ /is not recognized/i, // cmd.exe: 'X' is not recognized as an internal or external command
93
+ /not recognized as/i, // cmd.exe 长串前段
94
+ /No such file or directory/i, // POSIX /bin/sh -c
95
+ /No such file/i, // 短匹配, 兜底
96
+ /command not found/i, // POSIX bash
97
+ /cannot find the (path|file)/i, // cmd.exe 'The system cannot find the path specified'
98
+ /is not a (recognized|valid) command/i, // PowerShell
99
+ ];
100
+ return patterns.some((re) => re.test(text));
101
+ }
102
+ /**
103
+ * 跑 4 步验证 (默认), 返回 `VerificationReport`.
104
+ *
105
+ * 拍板 (D-11, 2026-06-04):
106
+ * - 任一 step 失败 → 整体 fail, **不**继续后续 step (fail-fast).
107
+ * 后续 step 基于 build 产物, 跑也是浪费; 而且 build fail 时 typecheck/test 必挂,
108
+ * 显式 fail-fast 比假绿更诚实.
109
+ * - 步骤间**不**共享 stdout/stderr buffer: 每步清零 Buffer 防止污染.
110
+ * - 返回的报告 `overallStatus` = 'failed' iff 任一 step status ∈ {failed, timed-out, spawn-error}.
111
+ * - summary / nextSuggestedAction 由调用方 (REPL/CLI/format-report) 写.
112
+ * runner 不写自然语言, 保持纯函数语义 (便于单测 / roundtrip).
113
+ */
114
+ export async function runVerify(options = {}) {
115
+ const checks = options.checks ?? DEFAULT_CHECKS;
116
+ const cwd = options.cwd ?? process.cwd();
117
+ const defaultTimeoutMs = options.defaultTimeoutMs ?? 300_000;
118
+ const stdoutCapBytes = options.stdoutCapBytes ?? 4096;
119
+ const continueOnError = options.continueOnError ?? false;
120
+ const overallStart = Date.now();
121
+ const results = [];
122
+ let aborted = false;
123
+ // 监听外部 signal: 任何 step 跑时如果外部 abort, 立即停止后续 step
124
+ const onAbort = () => {
125
+ aborted = true;
126
+ };
127
+ if (options.signal) {
128
+ if (options.signal.aborted) {
129
+ aborted = true;
130
+ }
131
+ else {
132
+ options.signal.addEventListener('abort', onAbort, { once: true });
133
+ }
134
+ }
135
+ try {
136
+ for (const check of checks) {
137
+ if (aborted) {
138
+ // 外部 signal 触发: 后续 step 全 mark 跳过, 不跑
139
+ const now = Date.now();
140
+ results.push({
141
+ name: check.name,
142
+ command: check.command,
143
+ status: 'spawn-error',
144
+ exitCode: null,
145
+ startedAt: now,
146
+ endedAt: now,
147
+ durationMs: 0,
148
+ stdoutTail: '',
149
+ stderrTail: '',
150
+ errorMessage: 'aborted by external signal',
151
+ });
152
+ if (!continueOnError)
153
+ break;
154
+ continue;
155
+ }
156
+ // Sprint 1c-revive-2-D-11-4 review P2 修复: 传 signal 进 runOneCheck 让
157
+ // 当前 child 在外部 abort 触发时被 kill, 跟"取消不能卡住"目标一致.
158
+ // 之前 signal 只在 runVerify 主循环设 aborted, **不**影响当前 child,
159
+ // 只能"等下 step 跳过" — race 时 child 跑完才看到 abort.
160
+ const result = await runOneCheck(check, {
161
+ cwd,
162
+ defaultTimeoutMs,
163
+ stdoutCapBytes,
164
+ ...(options.signal !== undefined ? { signal: options.signal } : {}),
165
+ });
166
+ results.push(result);
167
+ if (result.status !== 'passed' && !continueOnError) {
168
+ break;
169
+ }
170
+ }
171
+ }
172
+ finally {
173
+ if (options.signal) {
174
+ options.signal.removeEventListener('abort', onAbort);
175
+ }
176
+ }
177
+ const overallEnd = Date.now();
178
+ const overallFailed = results.some((r) => r.status !== 'passed');
179
+ const overallStatus = overallFailed ? 'failed' : 'passed';
180
+ return {
181
+ startedAt: overallStart,
182
+ endedAt: overallEnd,
183
+ durationMs: overallEnd - overallStart,
184
+ overallStatus,
185
+ checks: results,
186
+ // summary / nextSuggestedAction 由 caller 写 (保持 runner 纯函数)
187
+ summary: '',
188
+ nextSuggestedAction: '',
189
+ };
190
+ }
191
+ async function runOneCheck(check, opts) {
192
+ const start = Date.now();
193
+ const timeoutMs = check.timeoutMs ?? opts.defaultTimeoutMs;
194
+ const cwd = check.cwd ?? opts.cwd;
195
+ const cap = opts.stdoutCapBytes;
196
+ return new Promise((resolve) => {
197
+ let stdoutBuf = Buffer.alloc(0);
198
+ let stderrBuf = Buffer.alloc(0);
199
+ let resolved = false;
200
+ let child = null;
201
+ let timer = null;
202
+ // Sprint 1c-revive-2-D-11-4 review P2 修复: 独立于 runVerify 主循环的 aborted,
203
+ // 标 "当前 child 因外部 signal 被 kill". 避免跟 runVerify 的 "跳过下一 step" 语义混淆.
204
+ let childAborted = false;
205
+ // Sprint D-20.7.2 (2026-06-06): 标 timer-fired 状态. 不再在 timer fired 时
206
+ // 立刻 finalize, 改在 child.on('close') 判定 → 避免 Windows 上 child cwd
207
+ // 句柄没释放时 caller rmSync(workDir) EPERM.
208
+ let timedOut = false;
209
+ // Sprint D-20.7.7.1 (2026-06-06): hoist useShell 到外层, 让 try 块内 (line 363)
210
+ // 和 try 块**外**的 child.on('close') handler (line 524+) 都能闭包访问.
211
+ // 之前 try 块内 const, close handler 在 try 块外, ReferenceError. 拍板: useShell
212
+ // 是 "platform → boolean" 的纯计算, 无副作用, hoist 安全.
213
+ const useShell = process.platform === 'win32';
214
+ // Sprint 1c-revive-2-D-11-4 review P2 修复: signal abort 触发的 1s grace timer,
215
+ // 提前到 finalize 前声明 (闭包共享). child 不响应 SIGTERM 时用它兜底 SIGKILL.
216
+ let sigkillTimer = null;
217
+ // Sprint 1c-revive-2-D-11+4 review P2 修复 (2026-06-05): 闭包持有的 "child 已
218
+ // 退出" 标记. child.on('close', ...) 里设 true. 用这个代替 Node 内置 child.killed,
219
+ // 因为 child.killed 表示"信号已发送" 不是"进程已退出" — 后者才是 grace timer
220
+ // 判断要不要发 SIGKILL 兜底的依据.
221
+ let childClosed = false;
222
+ // Sprint 1c-revive-3-D-12 review P3 修复 (2026-06-05, 基于 fea52d1 review):
223
+ // 提到外层, 让 finalize() 能 removeEventListener 兜底 listener leak.
224
+ // 之前 onAbort 是 if 块内的 const, finalize 拿不到引用; listener 在
225
+ // addEventListener { once: true } 时 fire 后自动移除, 但**未 fire** 走
226
+ // (正常 step 跑完 + finalize) 时 listener 永远挂 signal 上. 多 checks /
227
+ // 自定义 checks 链路下 listener 累积, 主流程影响小, 但顺手收干净.
228
+ // 声明 () => void 而非 Event listener 签名, 避免 onAbort() 调用 TS2554.
229
+ let onAbort = null;
230
+ const finalize = (result) => {
231
+ if (resolved)
232
+ return;
233
+ resolved = true;
234
+ if (timer)
235
+ clearTimeout(timer);
236
+ // Sprint 1c-revive-2-D-11-4 review P2 修复: 清 sigkill grace timer, 避免
237
+ // child 已 close 后被 SIGKILL 错杀.
238
+ if (sigkillTimer) {
239
+ clearTimeout(sigkillTimer);
240
+ sigkillTimer = null;
241
+ }
242
+ if (opts.signal && onAbort) {
243
+ // Sprint 1c-revive-3-D-12 review P3 修复 (2026-06-05, 基于 fea52d1 review):
244
+ // 显式 removeEventListener 兜底. onAbort 在 spawn 成功后 addEventListener
245
+ // { once: true }, fire 后 Node 自动移除; 但**未 fire** 走 (正常 step
246
+ // 跑完 + finalize, 没触发外部 abort) 时 listener 永远挂 signal 上.
247
+ // 主流程影响小 (resolved guard 兜住重复 fire), 但多 checks 链路下
248
+ // listener 累积, 顺手收干净.
249
+ opts.signal.removeEventListener('abort', onAbort);
250
+ onAbort = null;
251
+ }
252
+ if (child && !childClosed) {
253
+ try {
254
+ child.kill('SIGKILL');
255
+ }
256
+ catch {
257
+ /* best-effort */
258
+ }
259
+ }
260
+ resolve(result);
261
+ };
262
+ try {
263
+ // 拍板 (D-11, 2026-06-04): 透传 args[0] 给 spawn, 不写死 corepack.
264
+ // 调用方可以传 'node' / 'bash' / 'corepack' / 任何 spawn 兼容的可执行.
265
+ // 4 步 default 用 corepack, 跟用户日常工作流一致.
266
+ // Sprint 1c-revive-2-D-11-4 review P1 修复: spawn 前用 resolveRunner 转换
267
+ // runner 字符串, Windows 上 'corepack' → 'corepack.cmd'.
268
+ const rawRunner = check.args[0];
269
+ if (typeof rawRunner !== 'string' || rawRunner.length === 0) {
270
+ throw new Error(`VerifyCheck '${check.name}' args[0] must be a non-empty string (the runner binary)`);
271
+ }
272
+ const runner = resolveRunner(rawRunner);
273
+ const subArgs = check.args.slice(1);
274
+ // useShell 必须在 try 块内声明, 但 close handler 在 try 块**外** (line 524+)
275
+ // 闭包共享. hoist 到 try 块前的外层 (line 335) 让两边都能访问. Sprint
276
+ // D-20.7.7.1 (2026-06-06): 修 useShell ReferenceError, 原代码 try 块内 const
277
+ // 闭包不外传, child.on('close') 报 'useShell is not defined' → 测全 fail.
278
+ // 不再重复声明.
279
+ child = spawn(runner, subArgs, {
280
+ cwd,
281
+ stdio: ['ignore', 'pipe', 'pipe'],
282
+ env: process.env, // 透传 env, 不注入任何东西 (loadProjectEnv 是 caller 职责)
283
+ shell: useShell,
284
+ });
285
+ }
286
+ catch (e) {
287
+ // spawn 同步失败 (e.g. corepack 不在 PATH)
288
+ const end = Date.now();
289
+ finalize({
290
+ name: check.name,
291
+ command: check.command,
292
+ status: 'spawn-error',
293
+ exitCode: null,
294
+ startedAt: start,
295
+ endedAt: end,
296
+ durationMs: end - start,
297
+ stdoutTail: '',
298
+ stderrTail: '',
299
+ errorMessage: e instanceof Error ? e.message : String(e),
300
+ });
301
+ return;
302
+ }
303
+ // Sprint 1c-revive-2-D-11-4 review P2 修复: spawn 成功后立刻注册 signal 监听,
304
+ // 外部 abort 触发时:
305
+ // 1. 设 childAborted = true (close handler 用它返回 status='aborted')
306
+ // 2. kill 当前 child (SIGTERM 优先, 1s grace 后 SIGKILL 兜底, sigkillTimer 见 Promise 开头声明)
307
+ // 之前不传 signal 进 runOneCheck, 当前 child 不被 kill, 只能"等下 step 跳过"
308
+ // — 跟"取消不能卡住"目标不一致, 也会造成资源泄漏.
309
+ //
310
+ // Sprint 1c-revive-2-D-11+4 review P2 修复 (2026-06-05): 改用 childClosed 闭包
311
+ // 变量判断"child 真的退出了", 不再用 child.killed (Node 标记"信号已发", 跟
312
+ // "进程已退出" 语义不同). 否则 child 忽略 SIGTERM (e.g. 阻塞 IO / 自定义
313
+ // handler trap) 时, 1s 后 grace timer 判 !child.killed = false 跳过 SIGKILL,
314
+ // 子进程仍卡到 timeout 之前的所有步骤.
315
+ if (opts.signal) {
316
+ onAbort = () => {
317
+ if (resolved)
318
+ return;
319
+ childAborted = true;
320
+ if (child && !childClosed) {
321
+ try {
322
+ child.kill('SIGTERM');
323
+ }
324
+ catch {
325
+ /* best-effort */
326
+ }
327
+ // 1s grace: 给 child 清理时间. 真不响应 (e.g. blocking IO) → SIGKILL.
328
+ // close 完成后 finalize 会清掉这个 timer (见下), 避免错杀.
329
+ sigkillTimer = setTimeout(() => {
330
+ if (child && !childClosed) {
331
+ try {
332
+ child.kill('SIGKILL');
333
+ }
334
+ catch {
335
+ /* best-effort */
336
+ }
337
+ }
338
+ }, 1000);
339
+ }
340
+ };
341
+ if (opts.signal.aborted) {
342
+ onAbort();
343
+ }
344
+ else {
345
+ opts.signal.addEventListener('abort', onAbort, { once: true });
346
+ }
347
+ }
348
+ // 装 stdout/stderr 流, 保留 cap bytes 尾.
349
+ // 用 Buffer.concat 重建 (subarray 共享内存但类型 Buffer<ArrayBufferLike> 不赋给
350
+ // Buffer<ArrayBuffer>, ts 5.x 严格模式抓得到, 改 Buffer.from(merged) 重新建独立 Buffer)
351
+ const capAppend = (buf, chunk) => {
352
+ const merged = Buffer.concat([buf, chunk]);
353
+ if (merged.length <= cap)
354
+ return merged;
355
+ return Buffer.from(merged.subarray(merged.length - cap));
356
+ };
357
+ child.stdout?.on('data', (chunk) => {
358
+ stdoutBuf = capAppend(stdoutBuf, chunk);
359
+ });
360
+ child.stderr?.on('data', (chunk) => {
361
+ stderrBuf = capAppend(stderrBuf, chunk);
362
+ });
363
+ // Sprint D-20.7.2 (2026-06-06): timer fired 不再立刻 finalize.
364
+ // 之前直接 resolve → Windows 上 child cwd 句柄还占着, 测里 rmSync(workDir)
365
+ // EPERM. 修法: 标 timedOut=true, 调 child.kill, 等 'close' 才 finalize.
366
+ // 双重保险: 5s 后 child 还没 close, 走 grace kill + 再 finalize (避免永远 hang).
367
+ timer = setTimeout(() => {
368
+ timedOut = true;
369
+ try {
370
+ if (child && !child.killed) {
371
+ // Windows 上 SIGTERM 等价 kill 进程, Node 内部走 TerminateProcess.
372
+ child.kill('SIGTERM');
373
+ }
374
+ }
375
+ catch {
376
+ // best-effort; 如果 kill 失败, 走 grace timer SIGKILL 兜底
377
+ }
378
+ // grace timer: 5s 内 child 没 close → SIGKILL
379
+ sigkillTimer = setTimeout(() => {
380
+ try {
381
+ if (child && !childClosed) {
382
+ child.kill('SIGKILL');
383
+ }
384
+ }
385
+ catch {
386
+ // best-effort
387
+ }
388
+ // grace 仍 timeout 时强制 finalize, 避免 caller 永远 hang
389
+ const end = Date.now();
390
+ finalize({
391
+ name: check.name,
392
+ command: check.command,
393
+ status: 'timed-out',
394
+ exitCode: null,
395
+ startedAt: start,
396
+ endedAt: end,
397
+ durationMs: end - start,
398
+ stdoutTail: stdoutBuf.toString('utf8'),
399
+ stderrTail: stderrBuf.toString('utf8'),
400
+ errorMessage: `timeout after ${timeoutMs}ms (grace SIGKILL fired, child still not closed)`,
401
+ });
402
+ }, 5_000);
403
+ }, timeoutMs);
404
+ child.on('close', (code, signal) => {
405
+ // Sprint 1c-revive-2-D-11+4 review P2 修复 (2026-06-05): close 触发 = child 真退出.
406
+ // sigkillTimer 内部据此判断, 不再依赖 child.killed (Node 标记语义不对).
407
+ childClosed = true;
408
+ const end = Date.now();
409
+ // Sprint D-20.7.2 (2026-06-06): timeout 路径优先于 signal 判定. 如果 timer
410
+ // 先 fired, 我们 kill 了 child, 那 close 触发时 timedOut=true 应当报 'timed-out',
411
+ // 不报 'spawn-error' (SIGTERM 误报) 或 'aborted' (跟外部 signal 混淆).
412
+ // 同时清 sigkillTimer, 避免 grace 错杀.
413
+ if (timedOut) {
414
+ if (sigkillTimer) {
415
+ clearTimeout(sigkillTimer);
416
+ sigkillTimer = null;
417
+ }
418
+ finalize({
419
+ name: check.name,
420
+ command: check.command,
421
+ status: 'timed-out',
422
+ exitCode: code,
423
+ startedAt: start,
424
+ endedAt: end,
425
+ durationMs: end - start,
426
+ stdoutTail: stdoutBuf.toString('utf8'),
427
+ stderrTail: stderrBuf.toString('utf8'),
428
+ errorMessage: `timeout after ${timeoutMs}ms (killed, child closed)`,
429
+ });
430
+ return;
431
+ }
432
+ // Sprint 1c-revive-2-D-11-4 review P2 修复: childAborted 优先, 返回 'aborted'
433
+ // 让 caller 知道是外部 signal 触发的 kill, 不是 child 自身崩溃.
434
+ if (childAborted) {
435
+ finalize({
436
+ name: check.name,
437
+ command: check.command,
438
+ status: 'aborted',
439
+ exitCode: code,
440
+ startedAt: start,
441
+ endedAt: end,
442
+ durationMs: end - start,
443
+ stdoutTail: stdoutBuf.toString('utf8'),
444
+ stderrTail: stderrBuf.toString('utf8'),
445
+ errorMessage: 'aborted by external signal during execution',
446
+ });
447
+ return;
448
+ }
449
+ // signal 触发 kill → 'spawn-error' (用户主动取消)
450
+ if (signal === 'SIGKILL' || signal === 'SIGTERM') {
451
+ finalize({
452
+ name: check.name,
453
+ command: check.command,
454
+ status: 'spawn-error',
455
+ exitCode: code,
456
+ startedAt: start,
457
+ endedAt: end,
458
+ durationMs: end - start,
459
+ stdoutTail: stdoutBuf.toString('utf8'),
460
+ stderrTail: stderrBuf.toString('utf8'),
461
+ errorMessage: `killed by signal ${signal}`,
462
+ });
463
+ return;
464
+ }
465
+ // Sprint D-20.7.7 (2026-06-06): Win32 shell:true 后, "命令不存在" 不再 sync
466
+ // spawn 抛, 而是 shell 跑完调不存在的 binary, exit=1 + stderr 'is not
467
+ // recognized'. 旧代码直接 'failed' 让语义边界乱: POSIX 走得到 'spawn-error',
468
+ // Win32 走不到. 修法: shell 用过的路径 (useShell=true) + 启错文本命中 →
469
+ // 'spawn-error', 跟 POSIX 行为对齐. 非 shell 路径不动 (Linux/macOS 默认
470
+ // shell:false, ENOENT 由 child.on('error') 接, 不会到这条分支).
471
+ //
472
+ // Sprint D-20.7.7.1 (2026-06-06): exitCode 归一为 null. POSIX 同步 spawn 抛
473
+ // (child.on('error') 路径) 不暴露 exit code (line 540+). Win32 shell 路径
474
+ // 现在也归一, 保持两路 shape 一致 — caller 不必区分 "启错 exit=1 vs 启错 sync 抛"
475
+ // 只看 status='spawn-error' + exitCode=null. D-20.7.7 初版留 code 实际值
476
+ // (e.g. 1), 测 expect null fail. 修法: 强制 null.
477
+ if (useShell &&
478
+ code !== 0 &&
479
+ looksLikeSpawnError(stdoutBuf.toString('utf8'), stderrBuf.toString('utf8'), code)) {
480
+ finalize({
481
+ name: check.name,
482
+ command: check.command,
483
+ status: 'spawn-error',
484
+ exitCode: null,
485
+ startedAt: start,
486
+ endedAt: end,
487
+ durationMs: end - start,
488
+ stdoutTail: stdoutBuf.toString('utf8'),
489
+ stderrTail: stderrBuf.toString('utf8'),
490
+ errorMessage: `command not found / not callable (shell detected: stderr contains "is not recognized" or "No such file")`,
491
+ });
492
+ return;
493
+ }
494
+ const status = code === 0 ? 'passed' : 'failed';
495
+ finalize({
496
+ name: check.name,
497
+ command: check.command,
498
+ status,
499
+ exitCode: code,
500
+ startedAt: start,
501
+ endedAt: end,
502
+ durationMs: end - start,
503
+ stdoutTail: stdoutBuf.toString('utf8'),
504
+ stderrTail: stderrBuf.toString('utf8'),
505
+ });
506
+ });
507
+ child.on('error', (e) => {
508
+ const end = Date.now();
509
+ finalize({
510
+ name: check.name,
511
+ command: check.command,
512
+ status: 'spawn-error',
513
+ exitCode: null,
514
+ startedAt: start,
515
+ endedAt: end,
516
+ durationMs: end - start,
517
+ stdoutTail: stdoutBuf.toString('utf8'),
518
+ stderrTail: stderrBuf.toString('utf8'),
519
+ errorMessage: e.message,
520
+ });
521
+ });
522
+ });
523
+ }
524
+ //# sourceMappingURL=verify-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-runner.js","sourceRoot":"","sources":["../../src/verify/verify-runner.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@deepwhale/coding-agent",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "bin": {
8
+ "deepwhale": "./bin/deepwhale.js"
9
+ },
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "bin"
19
+ ],
20
+ "dependencies": {
21
+ "@deepwhale/core": "^1.0.0",
22
+ "@deepwhale/edit-engine": "^1.0.0",
23
+ "@deepwhale/llm": "^1.0.0"
24
+ },
25
+ "scripts": {
26
+ "build": "tsc -b",
27
+ "dev": "tsc -b --watch",
28
+ "clean": "rm -rf dist .tsbuildinfo"
29
+ }
30
+ }