@zooique/memora 3.0.1 → 5.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 (282) hide show
  1. package/CHANGELOG.md +161 -1033
  2. package/README.en.md +46 -39
  3. package/README.md +40 -35
  4. package/config.example.json +1 -8
  5. package/dist/agent/agent.d.ts +88 -80
  6. package/dist/agent/agent.d.ts.map +1 -1
  7. package/dist/agent/agent.js +272 -221
  8. package/dist/agent/agent.js.map +1 -1
  9. package/dist/agent/assembler.d.ts +22 -21
  10. package/dist/agent/assembler.d.ts.map +1 -1
  11. package/dist/agent/assembler.js +120 -46
  12. package/dist/agent/assembler.js.map +1 -1
  13. package/dist/agent/backgroundTasks.d.ts +194 -0
  14. package/dist/agent/backgroundTasks.d.ts.map +1 -0
  15. package/dist/agent/backgroundTasks.js +314 -0
  16. package/dist/agent/backgroundTasks.js.map +1 -0
  17. package/dist/agent/budget.d.ts +23 -5
  18. package/dist/agent/budget.d.ts.map +1 -1
  19. package/dist/agent/budget.js +8 -2
  20. package/dist/agent/budget.js.map +1 -1
  21. package/dist/agent/builtinToolHandlers.d.ts +29 -9
  22. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  23. package/dist/agent/builtinToolHandlers.js +53 -13
  24. package/dist/agent/builtinToolHandlers.js.map +1 -1
  25. package/dist/agent/builtinTools.d.ts +15 -1
  26. package/dist/agent/builtinTools.d.ts.map +1 -1
  27. package/dist/agent/builtinTools.js +111 -30
  28. package/dist/agent/builtinTools.js.map +1 -1
  29. package/dist/agent/constants.d.ts +31 -6
  30. package/dist/agent/constants.d.ts.map +1 -1
  31. package/dist/agent/constants.js +38 -8
  32. package/dist/agent/constants.js.map +1 -1
  33. package/dist/agent/contextManager.d.ts +8 -0
  34. package/dist/agent/contextManager.d.ts.map +1 -1
  35. package/dist/agent/contextManager.js +45 -3
  36. package/dist/agent/contextManager.js.map +1 -1
  37. package/dist/agent/contextPreparer.d.ts +1 -1
  38. package/dist/agent/contextPreparer.d.ts.map +1 -1
  39. package/dist/agent/contextPreparer.js +15 -10
  40. package/dist/agent/contextPreparer.js.map +1 -1
  41. package/dist/agent/guardRail.d.ts +12 -1
  42. package/dist/agent/guardRail.d.ts.map +1 -1
  43. package/dist/agent/guardRail.js +37 -2
  44. package/dist/agent/guardRail.js.map +1 -1
  45. package/dist/agent/loop.d.ts +319 -34
  46. package/dist/agent/loop.d.ts.map +1 -1
  47. package/dist/agent/loop.js +713 -110
  48. package/dist/agent/loop.js.map +1 -1
  49. package/dist/agent/managers/archiveCoordinator.d.ts +19 -4
  50. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  51. package/dist/agent/managers/archiveCoordinator.js +25 -4
  52. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  53. package/dist/agent/managers/chatLockManager.d.ts +3 -9
  54. package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
  55. package/dist/agent/managers/chatLockManager.js +7 -25
  56. package/dist/agent/managers/chatLockManager.js.map +1 -1
  57. package/dist/agent/managers/llmCaller.d.ts.map +1 -1
  58. package/dist/agent/managers/llmCaller.js +27 -1
  59. package/dist/agent/managers/llmCaller.js.map +1 -1
  60. package/dist/agent/managers/loopMetrics.d.ts +14 -0
  61. package/dist/agent/managers/loopMetrics.d.ts.map +1 -1
  62. package/dist/agent/managers/loopMetrics.js +15 -0
  63. package/dist/agent/managers/loopMetrics.js.map +1 -1
  64. package/dist/agent/managers/memoryInspector.d.ts +13 -15
  65. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  66. package/dist/agent/managers/memoryInspector.js +38 -49
  67. package/dist/agent/managers/memoryInspector.js.map +1 -1
  68. package/dist/agent/managers/roundSummaryGenerator.d.ts +31 -1
  69. package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -1
  70. package/dist/agent/managers/roundSummaryGenerator.js +81 -6
  71. package/dist/agent/managers/roundSummaryGenerator.js.map +1 -1
  72. package/dist/agent/managers/sessionArchiver.d.ts +35 -3
  73. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  74. package/dist/agent/managers/sessionArchiver.js +34 -3
  75. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  76. package/dist/agent/managers/sessionManager.d.ts +21 -88
  77. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  78. package/dist/agent/managers/sessionManager.js +94 -278
  79. package/dist/agent/managers/sessionManager.js.map +1 -1
  80. package/dist/agent/managers/toolCallHelpers.d.ts +109 -28
  81. package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -1
  82. package/dist/agent/managers/toolCallHelpers.js +93 -37
  83. package/dist/agent/managers/toolCallHelpers.js.map +1 -1
  84. package/dist/agent/messageHistory.d.ts.map +1 -1
  85. package/dist/agent/messageHistory.js +9 -5
  86. package/dist/agent/messageHistory.js.map +1 -1
  87. package/dist/agent/seed/orchestrator.d.ts +12 -1
  88. package/dist/agent/seed/orchestrator.d.ts.map +1 -1
  89. package/dist/agent/seed/orchestrator.js +15 -4
  90. package/dist/agent/seed/orchestrator.js.map +1 -1
  91. package/dist/agent/seed/prepare.d.ts.map +1 -1
  92. package/dist/agent/seed/prepare.js +9 -4
  93. package/dist/agent/seed/prepare.js.map +1 -1
  94. package/dist/agent/seed/types.d.ts +11 -4
  95. package/dist/agent/seed/types.d.ts.map +1 -1
  96. package/dist/agent/seed/types.js +2 -2
  97. package/dist/agent/textSanitize.d.ts +36 -0
  98. package/dist/agent/textSanitize.d.ts.map +1 -0
  99. package/dist/agent/textSanitize.js +55 -0
  100. package/dist/agent/textSanitize.js.map +1 -0
  101. package/dist/agent/toolExecutor.d.ts +97 -26
  102. package/dist/agent/toolExecutor.d.ts.map +1 -1
  103. package/dist/agent/toolExecutor.js +444 -78
  104. package/dist/agent/toolExecutor.js.map +1 -1
  105. package/dist/agent/toolLedger.d.ts +93 -41
  106. package/dist/agent/toolLedger.d.ts.map +1 -1
  107. package/dist/agent/toolLedger.js +114 -42
  108. package/dist/agent/toolLedger.js.map +1 -1
  109. package/dist/agent/toolResultCache.js +1 -1
  110. package/dist/agent/toolResultOffload.d.ts +8 -0
  111. package/dist/agent/toolResultOffload.d.ts.map +1 -1
  112. package/dist/agent/toolResultOffload.js +10 -3
  113. package/dist/agent/toolResultOffload.js.map +1 -1
  114. package/dist/agent/toolRunner.d.ts +16 -7
  115. package/dist/agent/toolRunner.d.ts.map +1 -1
  116. package/dist/agent/toolRunner.js +74 -29
  117. package/dist/agent/toolRunner.js.map +1 -1
  118. package/dist/agent/tracer.d.ts +13 -1
  119. package/dist/agent/tracer.d.ts.map +1 -1
  120. package/dist/agent/types.d.ts +74 -30
  121. package/dist/agent/types.d.ts.map +1 -1
  122. package/dist/code-exec/types.d.ts +9 -0
  123. package/dist/code-exec/types.d.ts.map +1 -1
  124. package/dist/index.d.ts +28 -41
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +65 -54
  127. package/dist/index.js.map +1 -1
  128. package/dist/logging/logger.d.ts +4 -1
  129. package/dist/logging/logger.d.ts.map +1 -1
  130. package/dist/logging/logger.js +5 -2
  131. package/dist/logging/logger.js.map +1 -1
  132. package/dist/memory/gcService.d.ts.map +1 -1
  133. package/dist/memory/gcService.js +3 -5
  134. package/dist/memory/gcService.js.map +1 -1
  135. package/dist/memory/inMemorySessionStore.d.ts +2 -2
  136. package/dist/memory/inMemorySessionStore.js +2 -2
  137. package/dist/memory/inMemoryStorage.d.ts +4 -3
  138. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  139. package/dist/memory/inMemoryStorage.js +2 -2
  140. package/dist/memory/inMemoryStorage.js.map +1 -1
  141. package/dist/memory/nodeSqliteStorage.d.ts +17 -0
  142. package/dist/memory/nodeSqliteStorage.d.ts.map +1 -0
  143. package/dist/memory/nodeSqliteStorage.js +393 -0
  144. package/dist/memory/nodeSqliteStorage.js.map +1 -0
  145. package/dist/memory/projectManager.d.ts +10 -20
  146. package/dist/memory/projectManager.d.ts.map +1 -1
  147. package/dist/memory/projectManager.js +27 -41
  148. package/dist/memory/projectManager.js.map +1 -1
  149. package/dist/memory/roundStore.d.ts +143 -82
  150. package/dist/memory/roundStore.d.ts.map +1 -1
  151. package/dist/memory/roundStore.js +4 -15
  152. package/dist/memory/roundStore.js.map +1 -1
  153. package/dist/memory/roundSummaryLookup.d.ts +26 -0
  154. package/dist/memory/roundSummaryLookup.d.ts.map +1 -0
  155. package/dist/memory/roundSummaryLookup.js +19 -0
  156. package/dist/memory/roundSummaryLookup.js.map +1 -0
  157. package/dist/memory/sessionStore.d.ts +19 -2
  158. package/dist/memory/sessionStore.d.ts.map +1 -1
  159. package/dist/memory/sessionStore.js.map +1 -1
  160. package/dist/memory/sourceValidation.d.ts +2 -13
  161. package/dist/memory/sourceValidation.d.ts.map +1 -1
  162. package/dist/memory/sourceValidation.js +5 -16
  163. package/dist/memory/sourceValidation.js.map +1 -1
  164. package/dist/memory/storageInterface.d.ts +26 -16
  165. package/dist/memory/storageInterface.d.ts.map +1 -1
  166. package/dist/memory/supersedeResolve.d.ts +39 -0
  167. package/dist/memory/supersedeResolve.d.ts.map +1 -0
  168. package/dist/memory/supersedeResolve.js +16 -0
  169. package/dist/memory/supersedeResolve.js.map +1 -0
  170. package/dist/memory/types.d.ts +10 -2
  171. package/dist/memory/types.d.ts.map +1 -1
  172. package/dist/memory/types.js +6 -1
  173. package/dist/memory/types.js.map +1 -1
  174. package/dist/role-pack/rolePackManager.d.ts +74 -33
  175. package/dist/role-pack/rolePackManager.d.ts.map +1 -1
  176. package/dist/role-pack/rolePackManager.js +112 -53
  177. package/dist/role-pack/rolePackManager.js.map +1 -1
  178. package/dist/role-pack/strategyKeys.d.ts +44 -0
  179. package/dist/role-pack/strategyKeys.d.ts.map +1 -1
  180. package/dist/role-pack/strategyKeys.js +55 -0
  181. package/dist/role-pack/strategyKeys.js.map +1 -1
  182. package/dist/role-pack/strategyResolver.d.ts +6 -1
  183. package/dist/role-pack/strategyResolver.d.ts.map +1 -1
  184. package/dist/role-pack/strategyResolver.js +20 -2
  185. package/dist/role-pack/strategyResolver.js.map +1 -1
  186. package/dist/role-pack/types.d.ts +5 -1
  187. package/dist/role-pack/types.d.ts.map +1 -1
  188. package/dist/security/confirmEntries.d.ts +44 -0
  189. package/dist/security/confirmEntries.d.ts.map +1 -0
  190. package/dist/security/confirmEntries.js +59 -0
  191. package/dist/security/confirmEntries.js.map +1 -0
  192. package/dist/security/pathGuard.d.ts +42 -6
  193. package/dist/security/pathGuard.d.ts.map +1 -1
  194. package/dist/security/pathGuard.js +126 -5
  195. package/dist/security/pathGuard.js.map +1 -1
  196. package/dist/skill/skillScriptRunner.d.ts +147 -15
  197. package/dist/skill/skillScriptRunner.d.ts.map +1 -1
  198. package/dist/skill/skillScriptRunner.js +479 -68
  199. package/dist/skill/skillScriptRunner.js.map +1 -1
  200. package/dist/utils/backgroundTask.d.ts +56 -34
  201. package/dist/utils/backgroundTask.d.ts.map +1 -1
  202. package/dist/utils/backgroundTask.js +130 -99
  203. package/dist/utils/backgroundTask.js.map +1 -1
  204. package/dist/utils/configResourceManager.d.ts +6 -2
  205. package/dist/utils/configResourceManager.d.ts.map +1 -1
  206. package/dist/utils/configResourceManager.js +8 -2
  207. package/dist/utils/configResourceManager.js.map +1 -1
  208. package/dist/utils/errors.d.ts +12 -2
  209. package/dist/utils/errors.d.ts.map +1 -1
  210. package/dist/utils/errors.js +12 -2
  211. package/dist/utils/errors.js.map +1 -1
  212. package/dist/utils/eventEmitter.d.ts +76 -23
  213. package/dist/utils/eventEmitter.d.ts.map +1 -1
  214. package/dist/utils/eventEmitter.js +23 -3
  215. package/dist/utils/eventEmitter.js.map +1 -1
  216. package/dist/utils/time.d.ts +8 -5
  217. package/dist/utils/time.d.ts.map +1 -1
  218. package/dist/utils/time.js +8 -5
  219. package/dist/utils/time.js.map +1 -1
  220. package/dist/utils/toError.d.ts +1 -1
  221. package/dist/utils/toError.js +1 -1
  222. package/dist/web-fetch/loginWall.d.ts +39 -0
  223. package/dist/web-fetch/loginWall.d.ts.map +1 -0
  224. package/dist/web-fetch/loginWall.js +78 -0
  225. package/dist/web-fetch/loginWall.js.map +1 -0
  226. package/dist/web-fetch/types.d.ts +8 -0
  227. package/dist/web-fetch/types.d.ts.map +1 -1
  228. package/dist/web-fetch/webFetchProvider.d.ts.map +1 -1
  229. package/dist/web-fetch/webFetchProvider.js +3 -1
  230. package/dist/web-fetch/webFetchProvider.js.map +1 -1
  231. package/dist/web-search/fetchWebSearchProvider.js +28 -23
  232. package/dist/web-search/fetchWebSearchProvider.js.map +1 -1
  233. package/docs/architecture/role-pack-authoring-guide.md +3 -1
  234. package/docs/architecture/role-pack-spec.md +2 -1
  235. package/docs/memora-api-reference.md +1349 -1175
  236. package/docs/memora-/345/215/207/347/272/247/346/214/207/345/215/227-4.x-/345/210/260-5.0.0.md +385 -0
  237. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +91 -52
  238. package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -148
  239. package/package.json +9 -4
  240. package/role-packs/README.md +41 -40
  241. package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -4
  242. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +1 -0
  243. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +1 -1
  244. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +1 -0
  245. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +1 -1
  246. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +1 -1
  247. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +32 -5
  248. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/scripts/init-novel-project.mjs +10 -6
  249. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +3 -1
  250. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/manifest.json +1 -0
  251. package/dist/agent/managers/dedupManager.d.ts +0 -85
  252. package/dist/agent/managers/dedupManager.d.ts.map +0 -1
  253. package/dist/agent/managers/dedupManager.js +0 -248
  254. package/dist/agent/managers/dedupManager.js.map +0 -1
  255. package/dist/agent/managers/goalConsistencyChecker.d.ts +0 -42
  256. package/dist/agent/managers/goalConsistencyChecker.d.ts.map +0 -1
  257. package/dist/agent/managers/goalConsistencyChecker.js +0 -178
  258. package/dist/agent/managers/goalConsistencyChecker.js.map +0 -1
  259. package/dist/agent/managers/llmJudgeHelper.d.ts +0 -21
  260. package/dist/agent/managers/llmJudgeHelper.d.ts.map +0 -1
  261. package/dist/agent/managers/llmJudgeHelper.js +0 -32
  262. package/dist/agent/managers/llmJudgeHelper.js.map +0 -1
  263. package/dist/agent/managers/memoryAdvisor.d.ts +0 -105
  264. package/dist/agent/managers/memoryAdvisor.d.ts.map +0 -1
  265. package/dist/agent/managers/memoryAdvisor.js +0 -322
  266. package/dist/agent/managers/memoryAdvisor.js.map +0 -1
  267. package/dist/agent/managers/memoryGovernance.d.ts +0 -24
  268. package/dist/agent/managers/memoryGovernance.d.ts.map +0 -1
  269. package/dist/agent/managers/memoryGovernance.js +0 -46
  270. package/dist/agent/managers/memoryGovernance.js.map +0 -1
  271. package/dist/memory/governance.d.ts +0 -17
  272. package/dist/memory/governance.d.ts.map +0 -1
  273. package/dist/memory/governance.js +0 -17
  274. package/dist/memory/governance.js.map +0 -1
  275. package/dist/memory/projectRegistry.d.ts +0 -47
  276. package/dist/memory/projectRegistry.d.ts.map +0 -1
  277. package/dist/memory/projectRegistry.js +0 -151
  278. package/dist/memory/projectRegistry.js.map +0 -1
  279. package/dist/utils/recallDefaults.d.ts +0 -16
  280. package/dist/utils/recallDefaults.d.ts.map +0 -1
  281. package/dist/utils/recallDefaults.js +0 -16
  282. package/dist/utils/recallDefaults.js.map +0 -1
@@ -12,21 +12,59 @@
12
12
  */
13
13
  import * as childProcess from 'node:child_process';
14
14
  import { logger } from '../logging/logger.js';
15
+ import { sanitizeExternalText } from '../agent/textSanitize.js';
15
16
  /** 默认执行超时(毫秒):脚本常用交互/构建任务在 1 分钟内完成;超长任务由 LLM 传 timeoutMs */
16
17
  const DEFAULT_TIMEOUT_MS = 60_000;
17
- /** 最大执行超时(毫秒):适配脚本内 API 调用/批处理等长耗时任务 */
18
- const MAX_TIMEOUT_MS = 600_000;
19
18
  /**
20
- * 超时钳制真理源(SSOT):实际超时 = clamp(timeoutMs, 1s, MAX_TIMEOUT_MS)
19
+ * **同步**执行等待上限(毫秒):适配脚本内 API 调用/批处理等长耗时任务。
20
+ * 上限只保护「阻塞 LLM」的同步路径——防 LLM 传天文数字把会话挂死。
21
+ */
22
+ const SYNC_MAX_TIMEOUT_MS = 600_000;
23
+ /**
24
+ * **后台**收割时限上限(毫秒):长构建 / 冷缓存依赖安装是后台核心场景,600s 明显不够。
25
+ *
26
+ * 与 `SYNC_MAX_TIMEOUT_MS` **异义勿合并**(对齐 builtinToolHandlers「异义同值勿误合并」纪律):
27
+ * 两者风险性质不同(同步阻塞 LLM vs 后台不阻塞),各自独立演进,合并会让任一侧的
28
+ * 调整误伤另一侧。
29
+ */
30
+ const BACKGROUND_MAX_TIMEOUT_MS = 1_800_000;
31
+ /**
32
+ * 收集侧**内存护栏**上限(字节):stdout + stderr 共享该预算,超限停止拼接并累计丢弃量。
33
+ *
34
+ * 量纲纪律(勿改写成字符数):本常量防的是 **Node 进程内存膨胀**,量纲必须是字节;
35
+ * 上下文侧另有两层防线——调用方的 `sanitizeExternalText(x, 20_000)`(字符)与
36
+ * `appendToolMessage` 入口关的 `SINGLE_TOOL_RESULT_MAX_TOKENS`(token,含落盘)。
37
+ * 三者量纲各异、各司其职:**禁止**把本常量并入或对齐那两层(并列 = 双真源腐化)。
38
+ *
39
+ * 取值理由:2MB 对「脚本/命令刷屏」已是数量级冗余(下游上下文层只留 20_000 字符),
40
+ * 同时远低于 Node 默认堆上限,不会成为新的 OOM 面。
41
+ */
42
+ const MAX_COLLECTED_OUTPUT_BYTES = 2 * 1024 * 1024;
43
+ /**
44
+ * 超时钳制真理源(SSOT):实际超时 = clamp(timeoutMs, 1s, maxMs)
21
45
  *
22
- * 执行侧(spawn 的 timeout 选项)与文案侧(formatScriptResult 的「超过 Ns」)必须同源,
46
+ * 执行侧(计时器时长)与文案侧(formatScriptResult 的「超过 Ns」)必须同源,
23
47
  * 否则两处漂移会重现「实际 60s 超时却告知超过 600s」的谎报。
24
48
  *
49
+ * **上限由调用方按模式选常量**(同步 `SYNC_MAX_TIMEOUT_MS` / 后台
50
+ * `BACKGROUND_MAX_TIMEOUT_MS`),函数本身仍是单参纯函数——不按模式内部分支
51
+ * (分支 = 同一语义两套判定,属并列腐化)。
52
+ *
25
53
  * @param timeoutMs 调用方传入的超时(毫秒;toolExecutor 由 LLM 的 timeout_ms 秒值 ×1000 得到)
26
- * @returns 钳制后的实际超时(毫秒,落在 [1_000, MAX_TIMEOUT_MS] 区间内)
54
+ * @param maxMs 上限(默认同步上限)
55
+ * @returns 钳制后的实际超时(毫秒,落在 [1_000, maxMs] 区间内)
56
+ */
57
+ function normalizeTimeoutMs(timeoutMs, maxMs = SYNC_MAX_TIMEOUT_MS) {
58
+ return Math.min(Math.max(timeoutMs, 1_000), maxMs);
59
+ }
60
+ /**
61
+ * 后台收割时限钳制:与同步共用 `normalizeTimeoutMs` 同一实现,只换上限常量。
62
+ *
63
+ * 单点是刻意的:后台若另写一个 clamp,就会与同步侧的「1s 下限 / 上限语义」分叉,
64
+ * 两处漂移后难以判断哪边是真理源。
27
65
  */
28
- function normalizeTimeoutMs(timeoutMs) {
29
- return Math.min(Math.max(timeoutMs, 1_000), MAX_TIMEOUT_MS);
66
+ export function normalizeBackgroundTimeoutMs(timeoutMs) {
67
+ return normalizeTimeoutMs(timeoutMs, BACKGROUND_MAX_TIMEOUT_MS);
30
68
  }
31
69
  /**
32
70
  * Windows 平台 shell 档脚本守卫
@@ -61,23 +99,361 @@ export function guardWindowsShellScript(scriptPath, runtime, platform) {
61
99
  : '(shell 档在 Windows 依赖 sh/bash 解释器——本机无 Git Bash 时会静默空跑:退出码 0 但 stdout/stderr 全空,不是执行成功)。') +
62
100
  '请改用跨平台脚本 .mjs/.js/.py;确需 Windows 批处理用 .bat/.cmd。');
63
101
  }
102
+ /**
103
+ * taskkill 参数构造(同步 / 异步两形态**同源**单一处)
104
+ *
105
+ * 为什么抽出来:异步原语(运行时收割)与同步原语(进程退出钩子兜底)都要打同一组参数,
106
+ * 各写一份 = 第二真理源(改一处漏一处,无测试报警)。
107
+ */
108
+ function buildTaskkillArgs(pid) {
109
+ return ['/pid', String(pid), '/T', '/F'];
110
+ }
111
+ /**
112
+ * 进程树强杀原语(跨平台,零新依赖)
113
+ *
114
+ * 缺口事实:Node spawn 的 `timeout` 选项到期只 kill **直接子进程**——`cmd /c npm test`
115
+ * 这类经 shell 派发的场景,孙进程(npm/node/vitest)变孤儿继续跑(占端口 / 锁文件)。
116
+ * 故不再依赖 spawn timeout,改为手动计时 + 本原语(同步与后台路径统一)。
117
+ *
118
+ * - Windows:`taskkill /pid <pid> /T /F`(/T = 进程树);taskkill 自身失败(权限不足 /
119
+ * 进程已退出)降级为 `child.kill()`——只及直接子进程,属**降级**而非等价,如实记录。
120
+ * - POSIX:spawn 时 `detached: true` 使子进程自成进程组(pgid == pid),
121
+ * 故 `process.kill(-pid, 'SIGKILL')` 杀整组;失败降级同上。
122
+ *
123
+ * ⚠️ 本原语是**私有**实现:宿主 codeExecutor 属另一进程上下文,够不着本函数;其同款缺口
124
+ * (`child.kill()` 单杀)已独立登记立项(方案文档 命令执行能力方案 §13.6 未决一)——**禁止**在宿主侧复制
125
+ * 一份实现(双轨各造 = 并列腐化),要么阶段 2 一起提成内核内部共享原语,要么维持登记。
126
+ */
127
+ function killProcessTree(child) {
128
+ const pid = child.pid;
129
+ if (pid === undefined)
130
+ return;
131
+ if (process.platform === 'win32') {
132
+ const killer = childProcess.spawn('taskkill', buildTaskkillArgs(pid), {
133
+ windowsHide: true,
134
+ stdio: 'ignore',
135
+ });
136
+ killer.on('error', (err) => {
137
+ logger.warn({ pid, err }, 'taskkill 启动失败,降级为 kill 直接子进程');
138
+ child.kill();
139
+ });
140
+ killer.on('close', (code) => {
141
+ if (code === 128) {
142
+ // 128 = ERROR_PROC_NOT_FOUND(Windows taskkill 语义):目标进程已退出——
143
+ // 强杀目标已达成(正常竞态:探活与 taskkill 之间进程自然结束),
144
+ // 静默结束,不当降级也不打 WARN(2026-10-03 实锤:门禁日志噪音源)。
145
+ // 主 pid 已死时孙进程成孤儿无人收割——child.kill 够不着,属残余边界
146
+ // (Windows pid 复用窗口下的 taskkill 误杀风险同样在此,见 命令执行能力方案 §13.6-A 登记)。
147
+ return;
148
+ }
149
+ if (code !== 0) {
150
+ logger.warn({ pid, code }, 'taskkill 未成功结束进程树,降级为 kill 直接子进程');
151
+ child.kill();
152
+ }
153
+ });
154
+ return;
155
+ }
156
+ try {
157
+ process.kill(-pid, 'SIGKILL');
158
+ }
159
+ catch (err) {
160
+ logger.warn({ pid, err }, '进程组强杀失败,降级为 kill 直接子进程');
161
+ child.kill('SIGKILL');
162
+ }
163
+ }
164
+ /**
165
+ * 同步杀树原语——**专供** `process.on('exit')` 钩子(`BackgroundTaskRegistry` 兜底收割)
166
+ *
167
+ * 为什么必须同步(与 `killProcessTree` 并存的原因,不是冗余双轨):
168
+ * exit 钩子返回后 Node 立即退出,异步 `spawn` 的 fork 由 libuv 线程池派发,
169
+ * 可能**来不及完成** taskkill 就随宿主进程消失——杀树静默失败(假阴性)。
170
+ * `execFileSync` 在当前进程内同步等 taskkill 执行完,钩子返回前杀树已落地。
171
+ *
172
+ * - Windows:`execFileSync('taskkill', …)`;退出码 128(目标已退出)= 强杀已达成,静默;
173
+ * 其他失败(权限不足等)降级 `child.kill()` 并记 WARN。
174
+ * - POSIX:`process.kill(-pid, 'SIGKILL')` 本就是同步系统调用,语义与异步版一致。
175
+ *
176
+ * 调用纪律:只在 exit 钩子(或等价的「进程即将终止、无后续异步机会」语境)使用;
177
+ * 常规运行时收割仍走 `killProcessTree`(异步版有完整 error/close 事件处理)。
178
+ */
179
+ export function killProcessTreeSync(child) {
180
+ const pid = child.pid;
181
+ if (pid === undefined)
182
+ return;
183
+ if (process.platform === 'win32') {
184
+ try {
185
+ childProcess.execFileSync('taskkill', buildTaskkillArgs(pid), {
186
+ windowsHide: true,
187
+ stdio: 'ignore',
188
+ });
189
+ }
190
+ catch (err) {
191
+ const code = err.status;
192
+ if (code === 128)
193
+ return; // 目标已退出 = 强杀已达成(与异步版 128 语义同源)
194
+ logger.warn({ pid, code }, 'exit 兜底 taskkill 未成功,降级为 kill 直接子进程');
195
+ child.kill();
196
+ }
197
+ return;
198
+ }
199
+ try {
200
+ process.kill(-pid, 'SIGKILL');
201
+ }
202
+ catch (err) {
203
+ logger.warn({ pid, err }, 'exit 兜底进程组强杀失败,降级为 kill 直接子进程');
204
+ child.kill('SIGKILL');
205
+ }
206
+ }
207
+ /**
208
+ * 输出收集器(内存护栏):stdout/stderr **共享**一个字节预算,超限即停止拼接并累计丢弃量。
209
+ *
210
+ * 只在收集侧生效。**不做「头尾保留」**:尾部保留在此处是无效复杂度——下游
211
+ * `sanitizeExternalText` 的头截断会把尾部抹掉(方案文档 命令执行能力方案 §13.6-B / 缺口 D)。
212
+ */
213
+ function createOutputCollector(limitBytes) {
214
+ let collected = 0;
215
+ let discarded = 0;
216
+ return {
217
+ /** 追加一个 chunk,返回**应当拼入**的部分(已超限返回空串) */
218
+ push(chunk) {
219
+ const size = Buffer.byteLength(chunk, 'utf-8');
220
+ const remaining = limitBytes - collected;
221
+ if (remaining <= 0) {
222
+ discarded += size;
223
+ return '';
224
+ }
225
+ if (size <= remaining) {
226
+ collected += size;
227
+ return chunk;
228
+ }
229
+ // 部分容纳:按字节精确切分后回退到 UTF-8 字符边界(续字节形如 0b10xxxxxx),
230
+ // 避免切出半个多字节字符产生 U+FFFD 污染脚本输出
231
+ const buf = Buffer.from(chunk, 'utf-8');
232
+ let end = remaining;
233
+ while (end > 0 && ((buf[end] ?? 0) & 0xc0) === 0x80)
234
+ end--;
235
+ const kept = buf.subarray(0, end).toString('utf-8');
236
+ const keptBytes = Buffer.byteLength(kept, 'utf-8');
237
+ collected += keptBytes;
238
+ discarded += size - keptBytes;
239
+ return kept;
240
+ },
241
+ get discardedBytes() {
242
+ return discarded;
243
+ },
244
+ get truncated() {
245
+ return discarded > 0;
246
+ },
247
+ };
248
+ }
249
+ /**
250
+ * 统一的 spawn 选项(进程治理同源)
251
+ *
252
+ * 同步与后台共用一份:防止「同步一套选项 / 后台另一套」的漂移——一旦漂移,
253
+ * 杀树 / detached / 禁色 / windowsHide 会各自演化出不同行为。
254
+ */
255
+ function buildSpawnOptions(cwd) {
256
+ return {
257
+ // ⚠️ 不用 spawn 原生 `timeout` 选项:它到期只 kill **直接子进程**,
258
+ // 经 shell 派发(`cmd /c npm test`)时孙进程会变孤儿继续跑。改为手动计时
259
+ // + `killProcessTree` 强杀整棵树(方案文档 命令执行能力方案 §13.6-A)。
260
+ // POSIX `detached`:子进程自成进程组(pgid == pid),收割按 -pid 杀组;
261
+ // Windows 不需要 detached(走 taskkill /T /F)。
262
+ ...(process.platform === 'win32' ? {} : { detached: true }),
263
+ // 继承宿主用户环境变量(不走 PATH/HOME 最小白名单——
264
+ // 项目脚本读用户环境(API KEY/PATH/工作区变量)是合理需求;密钥默认经
265
+ // SecretStorage→config 不经 env,env 回退模式下 key 在 env 属 owner 信任
266
+ // 语义(见文件头安全模型)。对齐宿主 codeExecutor 持久会话环境语义)
267
+ // 禁子进程彩色输出:FORCE_COLOR:0/NO_COLOR:1 源头禁色(对齐宿主 codeExecutor
268
+ // 同构);回流净化由 toolExecutor sanitizeExternalText 兜底剥残留 ANSI——
269
+ // 源头禁根因 + 通用防御两层不冲突
270
+ env: { ...process.env, FORCE_COLOR: '0', NO_COLOR: '1' },
271
+ stdio: ['ignore', 'pipe', 'pipe'],
272
+ // 隐藏子进程窗口(Windows):不传则每次执行弹 conhost 黑框(对齐宿主
273
+ // codeExecutor 既有 windowsHide 语义 + 大厂仅隐藏子进程回流输出共识)
274
+ windowsHide: true,
275
+ // cwd 缺省时由 node 决定(当前进程目录);仅显式传入时指定
276
+ ...(cwd ? { cwd } : {}),
277
+ };
278
+ }
279
+ /**
280
+ * 给已 spawn 的子进程挂上**统一治理**:输出收集(内存护栏)+ 超时杀树 + 终局回调。
281
+ *
282
+ * 同步(await 终局)与后台(不 await,监听终局)两条路径共用同一实现——
283
+ * 「同步一套 / 后台另一套」是并列腐化,进程治理必须只有一处。
284
+ */
285
+ function attachGovernance(child, opts) {
286
+ let stdout = '';
287
+ let stderr = '';
288
+ let timedOut = false;
289
+ let enoent = false;
290
+ /** 是否已结算(超时强杀与 close/error 竞争时的单点守卫) */
291
+ let settled = false;
292
+ /** 收集侧内存护栏:stdout/stderr 共享字节预算(方案文档 命令执行能力方案 §13.6-B) */
293
+ const collector = createOutputCollector(MAX_COLLECTED_OUTPUT_BYTES);
294
+ child.stdout?.on('data', (data) => {
295
+ stdout += collector.push(data.toString('utf-8'));
296
+ });
297
+ child.stderr?.on('data', (data) => {
298
+ stderr += collector.push(data.toString('utf-8'));
299
+ });
300
+ const snapshot = (exitCode) => ({
301
+ stdout,
302
+ stderr,
303
+ exitCode,
304
+ timedOut,
305
+ enoent,
306
+ truncated: collector.truncated,
307
+ discardedBytes: collector.discardedBytes,
308
+ });
309
+ // 硬超时:到点强杀**进程树**并立即结算——对齐宿主 codeExecutor 的 killer 形态
310
+ // (不等 close,避免 taskkill 异步失败 / 子进程僵死时终局永不发生)
311
+ let killer;
312
+ if (opts.timeoutMs !== null) {
313
+ killer = setTimeout(() => {
314
+ if (settled)
315
+ return;
316
+ settled = true;
317
+ timedOut = true;
318
+ logger.warn({ logLabel: opts.logLabel, timeoutMs: opts.timeoutMs }, '子进程执行超时,已强杀进程树');
319
+ killProcessTree(child);
320
+ opts.resolve(snapshot(-1));
321
+ }, opts.timeoutMs);
322
+ // 定时器不阻塞宿主进程退出(对齐宿主 codeExecutor 的 killer.unref 语义)
323
+ if (typeof killer.unref === 'function')
324
+ killer.unref();
325
+ }
326
+ child.on('error', (err) => {
327
+ // ENOENT = 命令不存在(Windows python 9009 场景:现代 Python 只装 py 启动器)
328
+ // 记标记供 L2 fallback,其余错误原样返回
329
+ enoent = err.code === 'ENOENT';
330
+ logger.error({ logLabel: opts.logLabel, err }, '子进程执行错误');
331
+ if (settled)
332
+ return;
333
+ settled = true;
334
+ if (killer)
335
+ clearTimeout(killer);
336
+ opts.resolve({ ...snapshot(-1), stderr: stderr || String(err) });
337
+ });
338
+ child.on('close', (code) => {
339
+ if (settled)
340
+ return;
341
+ settled = true;
342
+ if (killer)
343
+ clearTimeout(killer);
344
+ opts.resolve(snapshot(code ?? 0));
345
+ });
346
+ // 中途快照(后台 kill_command 需要「截至终止时的已捕获输出」):
347
+ // 退出码在进程未退出时取 -1,timedOut / 护栏标记随当时状态
348
+ return { peek: () => snapshot(child.exitCode ?? -1) };
349
+ }
350
+ /**
351
+ * 裸命令 → shell 派发形态(纯函数,平台参数化可测)
352
+ *
353
+ * Windows 经 `cmd /c`,类 Unix 经 `sh -c`。**不在此引入 powershell/bash 第二档**——
354
+ * 那是宿主 shell 选型的议题,内核只做「命令 → 平台默认 shell」的单点映射。
355
+ *
356
+ * ⚠️ **本函数是「命令实际派发到哪个 shell」的唯一真源**(2026-10-03 审查 P0 锚点):
357
+ * 宿主把该事实注入 system prompt「## 运行环境 · 默认 Shell」段供模型避坑,
358
+ * 两侧若不一致 = 对模型说假话(曾发生:宿主报 `PowerShell` 而此处是 `cmd`,
359
+ * 模型写 PowerShell 语法却由 cmd 执行,每次必败)。
360
+ * 宿主环境快照的 `shell` 字段经公开导出**直接消费本函数派生**(environmentProvider)——
361
+ * 单一真源无镜像副本,改映射即两侧同步生效(与 `run_command` / `run_project_script`
362
+ * 的 shell 档共用此派发形态)。
363
+ */
364
+ export function resolveShellCommand(command, platform = process.platform) {
365
+ return platform === 'win32'
366
+ ? { command: 'cmd', args: ['/c', command] }
367
+ : { command: 'sh', args: ['-c', command] };
368
+ }
369
+ /**
370
+ * 执行裸 shell 命令(**同步**):与脚本执行共用同一套进程治理(命令执行能力方案 §13.6-A/B),
371
+ * 只多一层「命令 → shell 派发」解析。后台形态见 `backgroundTasks` 注册表——
372
+ * 同一治理实现的另一条消费路径,不是另一套实现。
373
+ */
374
+ export async function runShellCommand(command, cwd, timeoutMs = DEFAULT_TIMEOUT_MS) {
375
+ const { command: shell, args } = resolveShellCommand(command);
376
+ return new Promise((resolve) => {
377
+ let child;
378
+ try {
379
+ child = childProcess.spawn(shell, args, buildSpawnOptions(cwd));
380
+ }
381
+ catch (err) {
382
+ logger.error({ command, err }, '启动命令进程失败');
383
+ resolve({
384
+ stdout: '',
385
+ stderr: `启动失败: ${err.message}`,
386
+ exitCode: -1,
387
+ timedOut: false,
388
+ });
389
+ return;
390
+ }
391
+ attachGovernance(child, {
392
+ timeoutMs: normalizeTimeoutMs(timeoutMs),
393
+ logLabel: command,
394
+ resolve,
395
+ });
396
+ });
397
+ }
398
+ /**
399
+ * 启动**后台**裸命令(立即返回,不等待进程结束)
400
+ *
401
+ * @param command 裸命令
402
+ * @param cwd 工作目录
403
+ * @param timeoutMs 收割时限(**null = 不限时**;后台任务可活过 turn,见
404
+ * `BackgroundTaskRegistry.detachAll`);由调用方按
405
+ * `BACKGROUND_MAX_TIMEOUT_MS` 钳制后传入(钳制真源不在本函数内分支)
406
+ * @param onSettled 终局回调(完成 / 超时 / 出错均经此,**只调用一次**)
407
+ * @returns 句柄:killNow = 中途终止(异步杀树原语,运行时收割用);
408
+ * killNowSync = 同步杀树原语(**仅** exit 钩子兜底用,见 `killProcessTreeSync`)
409
+ */
410
+ export function startBackgroundCommand(command, cwd, timeoutMs, onSettled) {
411
+ const { command: shell, args } = resolveShellCommand(command);
412
+ let child;
413
+ try {
414
+ child = childProcess.spawn(shell, args, buildSpawnOptions(cwd));
415
+ }
416
+ catch (err) {
417
+ logger.error({ command, err }, '启动后台命令进程失败');
418
+ onSettled({
419
+ stdout: '',
420
+ stderr: `启动失败: ${err.message}`,
421
+ exitCode: -1,
422
+ timedOut: false,
423
+ });
424
+ return {
425
+ killNow: () => undefined,
426
+ killNowSync: () => undefined,
427
+ peek: () => ({ stdout: '', stderr: '', exitCode: -1, timedOut: false }),
428
+ };
429
+ }
430
+ const governance = attachGovernance(child, {
431
+ timeoutMs,
432
+ logLabel: command,
433
+ resolve: onSettled,
434
+ });
435
+ return {
436
+ killNow: () => killProcessTree(child),
437
+ killNowSync: () => killProcessTreeSync(child),
438
+ peek: governance.peek,
439
+ };
440
+ }
64
441
  /**
65
442
  * 执行技能脚本:在隔离子进程中运行,收集 stdout/stderr/exitCode/timedOut
66
443
  *
67
444
  * @param scriptPath 脚本绝对路径
68
445
  * @param runtime 运行时(node/python/shell 白名单三档)
69
446
  * @param args 传给脚本的参数数组
70
- * @param timeoutMs 超时(毫秒,限制在 [1s, MAX_TIMEOUT_MS] 内)
447
+ * @param timeoutMs 超时(毫秒,限制在 [1s, SYNC_MAX_TIMEOUT_MS] 内)
71
448
  * @param cwd 子进程工作目录(可选;run_project_script 以项目根为 cwd,
72
449
  * 使项目脚本可加载项目本地依赖/相对数据文件)
73
- * @param nodePath node 可执行文件路径(可选,缺省 'node' 走 PATH)——供宿主注入真实
74
- * node 路径用。
75
- * ⚠️ 宿主尚未接入——`hosts/memora-vscode` 零注入点,故实际恒走缺省 `'node'`。
76
- * 且真解不止「传个路径」:Electron 宿主(VS Code)的
77
- * `process.execPath` 指向应用二进制,需配 `ELECTRON_RUN_AS_NODE` 一类环境变量才能以
78
- * node 语义执行 `.mjs` **文件**,而内核只收路径、不收环境(边界铁律:内核不持有平台知识)。
79
- * ⇒ 真解 = 接口扩展(宿主上报运行时环境,内核零解释转发),留待与宿主 shell 选型同批。
80
- * 此处保留该可选参数:接入点已就绪,扩展时无须再动调用链。
450
+ * @param nodePath node 可执行文件路径(可选,缺省 'node' 走 PATH)——宿主经
451
+ * `AgentOptions.scriptNodePath` 注入用户显式配置(VS Code 宿主读
452
+ * `memora.scriptNodePath` 工作区设置,未配置传 undefined 走缺省)。
453
+ * ⚠️ 若宿主想自动注入 `process.execPath`(Electron 宿主该路径指向应用二进制),
454
+ * 需配 `ELECTRON_RUN_AS_NODE` 一类环境变量才能以 node 语义执行 `.mjs` **文件**,
455
+ * 而内核只收路径、不收环境(边界铁律:内核不持有平台知识)——故内核只留路径
456
+ * 注入点,运行时探测与环境变量配齐是宿主侧职责。
81
457
  */
82
458
  export async function runSkillScript(scriptPath, runtime, args = [], timeoutMs = DEFAULT_TIMEOUT_MS, cwd, nodePath) {
83
459
  // win32 + shell + 非 .bat/.cmd → 在 spawn 前显式拒绝,
@@ -86,7 +462,8 @@ export async function runSkillScript(scriptPath, runtime, args = [], timeoutMs =
86
462
  if (guardError) {
87
463
  return { stdout: '', stderr: guardError, exitCode: -1, timedOut: false };
88
464
  }
89
- // 超时限制在 [1s, MAX_TIMEOUT_MS] 内(与超时文案同源,见 normalizeTimeoutMs)
465
+ // 超时限制在 [1s, SYNC_MAX_TIMEOUT_MS] 内(与超时文案同源,见 normalizeTimeoutMs;
466
+ // 后台走 BACKGROUND_MAX_TIMEOUT_MS,见 normalizeBackgroundTimeoutMs)
90
467
  const effectiveTimeout = normalizeTimeoutMs(timeoutMs);
91
468
  const { command, args: cmdArgs } = resolveCommand(runtime, scriptPath, args, nodePath);
92
469
  /**
@@ -95,27 +472,9 @@ export async function runSkillScript(scriptPath, runtime, args = [], timeoutMs =
95
472
  * @returns 执行结果 + enoent 标记(命令不存在 → 供调用方判定 L2 fallback 重试)
96
473
  */
97
474
  const runOnce = (cmd, runArgs) => new Promise((resolve) => {
98
- /** ENOENT 标记:spawn 命令不存在(如 Windows 缺 python 命令,仅 python runtime 场景用) */
99
- let enoent = false;
100
475
  let child;
101
476
  try {
102
- child = childProcess.spawn(cmd, runArgs, {
103
- timeout: effectiveTimeout,
104
- // 继承宿主用户环境变量(不走 PATH/HOME 最小白名单——
105
- // 项目脚本读用户环境(API KEY/PATH/工作区变量)是合理需求;密钥默认经
106
- // SecretStorage→config 不经 env,env 回退模式下 key 在 env 属 owner 信任
107
- // 语义(见文件头安全模型)。对齐宿主 codeExecutor 持久会话环境语义)
108
- // 禁子进程彩色输出:FORCE_COLOR:0/NO_COLOR:1 源头禁色(对齐宿主 codeExecutor
109
- // 同构);回流净化由 toolExecutor sanitizeExternalText 兜底剥残留 ANSI——
110
- // 源头禁根因 + 通用防御两层不冲突
111
- env: { ...process.env, FORCE_COLOR: '0', NO_COLOR: '1' },
112
- stdio: ['ignore', 'pipe', 'pipe'],
113
- // 隐藏子进程窗口(Windows):不传则每次执行弹 conhost 黑框(对齐宿主
114
- // codeExecutor 既有 windowsHide 语义 + 大厂仅隐藏子进程回流输出共识)
115
- windowsHide: true,
116
- // cwd 缺省时由 node 决定(当前进程目录);仅显式传入时指定
117
- ...(cwd ? { cwd } : {}),
118
- });
477
+ child = childProcess.spawn(cmd, runArgs, buildSpawnOptions(cwd));
119
478
  }
120
479
  catch (err) {
121
480
  logger.error({ scriptPath, runtime, err }, '启动脚本进程失败');
@@ -128,34 +487,11 @@ export async function runSkillScript(scriptPath, runtime, args = [], timeoutMs =
128
487
  });
129
488
  return;
130
489
  }
131
- let stdout = '';
132
- let stderr = '';
133
- let timedOut = false;
134
- child.stdout?.on('data', (data) => {
135
- stdout += data.toString('utf-8');
136
- });
137
- child.stderr?.on('data', (data) => {
138
- stderr += data.toString('utf-8');
139
- });
140
- child.on('error', (err) => {
141
- // ENOENT = 命令不存在(Windows python 9009 场景:现代 Python 只装 py 启动器)
142
- // 记标记供 L2 fallback,其余错误原样返回
143
- enoent = err.code === 'ENOENT';
144
- logger.error({ scriptPath, err }, '脚本进程执行错误');
145
- resolve({ stdout, stderr: stderr || String(err), exitCode: -1, timedOut: false, enoent });
146
- });
147
- child.on('close', (code, signal) => {
148
- if (signal === 'SIGTERM' || signal === 'SIGKILL') {
149
- timedOut = true;
150
- logger.warn({ scriptPath, effectiveTimeout }, '脚本执行超时,已被终止');
151
- }
152
- resolve({
153
- stdout,
154
- stderr,
155
- exitCode: code ?? 0,
156
- timedOut,
157
- enoent,
158
- });
490
+ // 治理挂载(单点):输出收集 + 超时杀树 + 终局回调,与后台命令同一实现
491
+ attachGovernance(child, {
492
+ timeoutMs: effectiveTimeout,
493
+ logLabel: scriptPath,
494
+ resolve,
159
495
  });
160
496
  });
161
497
  const result = await runOnce(command, cmdArgs);
@@ -239,18 +575,23 @@ function resolveCommand(runtime, scriptPath, args, nodePath) {
239
575
  * @returns 格式化后的可读字符串(供工具返回值注入 LLM 上下文)
240
576
  */
241
577
  export function formatExecutionResult(result, labels) {
578
+ // 截断诚实化:收集侧内存护栏生效时必须显式告知丢弃量——静默截断会让 LLM 以为
579
+ // 所见即完整输出(假阴性;与 read_file 分段脚注「已显示第 X–Y 行」同一纪律)
580
+ const truncatedNote = result.truncated
581
+ ? `\n[OUTPUT_TRUNCATED] 输出超过收集侧内存上限,已停止收集(丢弃 ${result.discardedBytes ?? 0} 字节,所见非完整输出)`
582
+ : '';
242
583
  if (result.timedOut) {
243
- return `[${labels.kind}_TIMEOUT] ${labels.timeoutDetail}\nstdout: ${result.stdout}\nstderr: ${result.stderr}`;
584
+ return `[${labels.kind}_TIMEOUT] ${labels.timeoutDetail}\nstdout: ${result.stdout}\nstderr: ${result.stderr}${truncatedNote}`;
244
585
  }
245
586
  if (result.exitCode !== 0) {
246
- return `[${labels.kind}_ERROR] ${labels.errorDetail}(退出码: ${result.exitCode})\nstdout: ${result.stdout}\nstderr: ${result.stderr}`;
587
+ return `[${labels.kind}_ERROR] ${labels.errorDetail}(退出码: ${result.exitCode})\nstdout: ${result.stdout}\nstderr: ${result.stderr}${truncatedNote}`;
247
588
  }
248
589
  // 成功:优先 stdout,stderr 附加
249
590
  const output = result.stdout || '(无输出)';
250
591
  if (result.stderr) {
251
- return `${output}\n[stderr] ${result.stderr}`;
592
+ return `${output}\n[stderr] ${result.stderr}${truncatedNote}`;
252
593
  }
253
- return output;
594
+ return `${output}${truncatedNote}`;
254
595
  }
255
596
  /**
256
597
  * 格式化脚本执行结果为可读字符串(供 tool 返回值):formatExecutionResult 的 SCRIPT 变体
@@ -268,4 +609,74 @@ export function formatScriptResult(result, timeoutMs = DEFAULT_TIMEOUT_MS) {
268
609
  errorDetail: '脚本执行失败',
269
610
  });
270
611
  }
612
+ /**
613
+ * 同步命令的**实际生效超时**(毫秒):run_command 同步路径的钳制真源入口。
614
+ *
615
+ * 存在的理由是「执行侧与文案侧同源」这条硬约束:`runShellCommand` 内部钳制,
616
+ * 若文案侧自行 clamp 就会重演「实际 60s 超时却告知超过 600s」的谎报。
617
+ * 调用方拿本值同时喂给执行与格式化,两侧恒等。
618
+ *
619
+ * @param timeoutMs LLM 传入值(undefined/非法 → 取默认 60s)
620
+ */
621
+ export function resolveCommandTimeoutMs(timeoutMs) {
622
+ return normalizeTimeoutMs(typeof timeoutMs === 'number' && Number.isFinite(timeoutMs) ? timeoutMs : DEFAULT_TIMEOUT_MS);
623
+ }
624
+ /**
625
+ * 命令结果进入上下文的**定长真源**(字符层)+ 格式化收口
626
+ *
627
+ * **定长为何住在格式化层而非调用方**:命令结果有**两个消费面**——① `run_command` 的工具
628
+ * 返回值 ② 后台命令完成的回流通知(`formatBackgroundTaskNotice`)。上限若住在
629
+ * toolExecutor 的模块私有常量里,第二个消费面就看不到它 ⇒ 回流路径无上限
630
+ * (2MB 内存护栏放行的输出可直灌上下文)。定义在两者的**共同下游**,两个消费面
631
+ * 自动一致、无法漏配。
632
+ *
633
+ * 量纲纪律:与 `MAX_COLLECTED_OUTPUT_BYTES`(**字节**,防 Node 进程内存膨胀)、
634
+ * `SINGLE_TOOL_RESULT_MAX_TOKENS`(**token**,入口关落盘)三者各异,**禁止互相对齐或合并**。
635
+ *
636
+ * 超时文案用**调用方传入的本次实际生效超时**(`resolveCommandTimeoutMs` 的产物);
637
+ * 传 undefined 表示本次未设收割时限(后台缺省),此时只说「超时」不编造秒数——
638
+ * 报一个不存在的秒数比不报更坏(LLM 会据此误判该等多久)。
639
+ */
640
+ const COMMAND_RESULT_MAX_CHARS = 20_000;
641
+ /** 命令结果尾部保留(缺口 D 同款:构建/测试失败原因常在尾部) */
642
+ const COMMAND_RESULT_TAIL_CHARS = 4_000;
643
+ /**
644
+ * 格式化命令执行结果为可读字符串(run_command 同步 / kill_command 回传 / 后台回流共用)
645
+ *
646
+ * **定长真源在此**(见 `COMMAND_RESULT_MAX_CHARS`):本函数是命令结果进上下文的唯一收口,
647
+ * 调用方**不要**再各自套一层上限——那会让「限了多少」在两处漂移。
648
+ *
649
+ * 超时文案用**调用方传入的本次实际生效超时**(`resolveCommandTimeoutMs` 的产物);
650
+ * 传 undefined 表示本次未设收割时限(后台缺省),此时只说「超时」不编造秒数——
651
+ * 报一个不存在的秒数比不报更坏(LLM 会据此误判该等多久)。
652
+ */
653
+ export function formatCommandResult(result, effectiveTimeoutMs) {
654
+ return sanitizeExternalText(formatExecutionResult(result, {
655
+ kind: 'COMMAND',
656
+ timeoutDetail: effectiveTimeoutMs === undefined
657
+ ? '命令执行超时'
658
+ : `命令执行超时(超过 ${Math.round(effectiveTimeoutMs / 1000)}s)`,
659
+ errorDetail: '命令执行失败',
660
+ }), COMMAND_RESULT_MAX_CHARS, COMMAND_RESULT_TAIL_CHARS);
661
+ }
662
+ /**
663
+ * 格式化「被主动终止」的命令输出(kill_command 专用)
664
+ *
665
+ * ⚠️ 刻意**不走** `formatCommandResult`:进程被强杀时**没有退出码**——
666
+ * `peek()` 取的 -1 意思是「尚未退出」,不是「退出码 -1」。丢给三态格式化会被判成
667
+ * `[COMMAND_ERROR] 命令执行失败(退出码: -1)`,与 kill_command 头部的「已终止」
668
+ * 自相矛盾(对 LLM 是谎报:它会以为命令自己挂了,而不是被我们停掉)。
669
+ *
670
+ * 因此这里只如实列出截至终止时已捕获的输出,不声称任何退出状态。定长口径与
671
+ * `formatCommandResult` **同源**(同一对常量)——两个函数对「多少字进上下文」的
672
+ * 判断若有差异,LLM 就会在同一会话里看到两种长度 policy。
673
+ */
674
+ export function formatKilledCommandOutput(result) {
675
+ const stdout = result.stdout || '(无输出)';
676
+ const stderr = result.stderr ? `\n[stderr] ${result.stderr}` : '';
677
+ const truncatedNote = result.truncated
678
+ ? `\n[OUTPUT_TRUNCATED] 输出超过收集侧内存上限,已停止收集(丢弃 ${result.discardedBytes ?? 0} 字节,所见非完整输出)`
679
+ : '';
680
+ return sanitizeExternalText(`stdout: ${stdout}${stderr}${truncatedNote}`, COMMAND_RESULT_MAX_CHARS, COMMAND_RESULT_TAIL_CHARS);
681
+ }
271
682
  //# sourceMappingURL=skillScriptRunner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skillScriptRunner.js","sourceRoot":"","sources":["../../src/skill/skillScriptRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skillScriptRunner.js","sourceRoot":"","sources":["../../src/skill/skillScriptRunner.ts"],"names":[],"mappings":"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"}