@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
@@ -0,0 +1,314 @@
1
+ /**
2
+ * 后台命令任务注册表(方案文档 §14 · 阶段 1)
3
+ *
4
+ * 职责单点:后台进程的**身份与生命周期**——`taskId` 寻址、完成回调、中途终止、终态结算。
5
+ * 进程治理本身(spawn 选项 / 输出内存护栏 / 杀树)在 `skillScriptRunner`,
6
+ * 本模块只持有句柄与状态,**不重复实现任何进程逻辑**。
7
+ *
8
+ * ⚠️ **实例,不是模块级单例**:单例会让多个 Agent 实例(多会话)共享同一张任务表,
9
+ * `kill_command` 就能杀掉别的会话起的进程——与「仅可杀本 turn 本 agent 起的后台任务」
10
+ * 定案(§14.1)直接冲突。故注册表挂在 Agent 实例上,按实例隔离。
11
+ *
12
+ * ⚠️ 公开面边界:只读投影类型(`BackgroundTask`)与状态词表(`BACKGROUND_TASK_STATUS_LABELS`)
13
+ * 经 `src/index.ts` 导出(宿主 UI 列表出口消费);注册表类 `BackgroundTaskRegistry`
14
+ * **不导出**——进程治理留在内核,宿主只能经门面方法 `listBackgroundTasks()` /
15
+ * `killBackgroundTask()` 操作(防跨会话 kill,§14.1 定案)。
16
+ */
17
+ import { logger } from '../logging/logger.js';
18
+ import { formatCommandResult, formatKilledCommandOutput, startBackgroundCommand, normalizeBackgroundTimeoutMs, } from '../skill/skillScriptRunner.js';
19
+ export class BackgroundTaskRegistry {
20
+ /** taskId → 条目;插入顺序 = 启动顺序 */
21
+ tasks = new Map();
22
+ /** taskId 序号(实例内自增,跨会话不冲突) */
23
+ seq = 0;
24
+ /** 完成监听(未注入 → 完成仅入表,不回流;不因缺监听而报错) */
25
+ listener = null;
26
+ /** exit 钩子是否已注销(Agent 实例终态 shutdown 后置真,钩子空转防重复收割) */
27
+ disposed = false;
28
+ /**
29
+ * 进程退出兜底钩子(构造注册 / shutdown 注销,**配对**——防多实例钩子堆积)
30
+ *
31
+ * ⚠️ 已知代价(台账 `MULTI-AGENT-1` D8):监听按**实例**注册 ⇒ 同进程**同时存活 >10 个**
32
+ * Agent 实例会触发 Node `MaxListenersExceededWarning`——仅警告、无功能损害(钩子 `disposed`
33
+ * 幂等空转,`close()`→`shutdown()` 配对注销即释放)。不引模块级共享钩子(= 回退单例、反 SSOT)、
34
+ * 不调 `setMaxListeners`(进程级调参有副作用);触发 = 真实出现 >10 个并发存活项目。
35
+ */
36
+ exitHook = () => {
37
+ if (this.disposed)
38
+ return; // Agent.close 已收割并注销,幂等空转
39
+ const killed = this.flushRunningSync();
40
+ if (killed > 0) {
41
+ logger.info({ count: killed }, '进程退出兜底:同步收割存活后台命令任务');
42
+ }
43
+ };
44
+ constructor() {
45
+ // 实例终态第二触发通路:Windows 正常关窗给扩展宿主的清理窗口实测仅 31ms,
46
+ // async close() 深处的 killAllRunning 跑不到——exit 钩子用同步杀树在进程消失前落地
47
+ // (定案锚:ADR-036;论证见 docs/方案-后台任务跨轮存活-20261004.md §4.2)。
48
+ process.on('exit', this.exitHook);
49
+ }
50
+ /**
51
+ * 注入完成监听器(单点 setter)
52
+ *
53
+ * 监听器抛错**吞掉并记日志**:它是回流通道的入口,一抛就污染进程治理路径,
54
+ * 而任务表状态结算不应受消费方失败影响。
55
+ */
56
+ setCompletionListener(listener) {
57
+ this.listener = listener;
58
+ }
59
+ /**
60
+ * 启动后台命令(**立即返回** taskId,不等进程结束)
61
+ *
62
+ * @param command 裸命令
63
+ * @param cwd 工作目录
64
+ * @param timeoutMs 收割时限(毫秒);**省略 = 不限时**(长构建 / 冷缓存安装 /
65
+ * 长驻服务是后台核心场景,不给它套同步上限;活过 turn 见 detachAll)
66
+ */
67
+ start(command, cwd, timeoutMs) {
68
+ this.seq += 1;
69
+ const taskId = `bg-${this.seq}`;
70
+ const entry = {
71
+ taskId,
72
+ command,
73
+ startedAt: Date.now(),
74
+ status: 'running',
75
+ // 占位:startBackgroundCommand 启动即失败时回调会同步触发,句柄随后覆盖
76
+ killNow: () => undefined,
77
+ killNowSync: () => undefined,
78
+ peek: () => ({ stdout: '', stderr: '', exitCode: -1, timedOut: false }),
79
+ };
80
+ this.tasks.set(taskId, entry);
81
+ const handle = startBackgroundCommand(command, cwd, timeoutMs === undefined ? null : normalizeBackgroundTimeoutMs(timeoutMs), (result) => this.settle(taskId, result));
82
+ entry.killNow = handle.killNow;
83
+ entry.killNowSync = handle.killNowSync;
84
+ entry.peek = handle.peek;
85
+ return taskId;
86
+ }
87
+ /** 按 taskId 取任务(不存在返回 null) */
88
+ get(taskId) {
89
+ const entry = this.tasks.get(taskId);
90
+ return entry ? this.projection(entry) : null;
91
+ }
92
+ /** 全部任务(含终态;供收尾报告 / UI 呈现) */
93
+ list() {
94
+ return [...this.tasks.values()].map((entry) => this.projection(entry));
95
+ }
96
+ /**
97
+ * 终止后台任务,返回**截至终止时的已捕获输出**(`kill_command` 兼任「放弃并看输出」)
98
+ *
99
+ * @returns 任务不存在 → `null`;否则返回终态 + 结果
100
+ */
101
+ kill(taskId) {
102
+ const entry = this.tasks.get(taskId);
103
+ if (!entry)
104
+ return null;
105
+ if (entry.status === 'running') {
106
+ this.terminate(entry, 'async');
107
+ }
108
+ return { status: entry.status, result: entry.result };
109
+ }
110
+ /**
111
+ * Agent 实例终态收割:**真杀全部仍在运行的任务**(仅 `Agent.close` 调用)
112
+ *
113
+ * 与 `detachAll` 的边界(两者各管一个生命周期终点,勿混用):
114
+ * - `detachAll` = **turn 终态**:不杀,进程跨轮存活(问答闭环不是进程容器);
115
+ * - `killAllRunning` = **Agent 实例终态**:杀。注册表按实例隔离是硬不变量,
116
+ * 实例销毁后任务不可寻址(`kill_command` 找不到、UI 快照变空表),不杀只会
117
+ * 制造无人可收的 OS 层孤儿。
118
+ *
119
+ * 真机依据(验收教程观察点 ⑧,2026-10-04):完全退出 VS Code 后 `ping.exe`
120
+ * 仍在运行而父进程(扩展宿主)已死——Windows 不回收脱离控制台的子进程,
121
+ * Job Object 兜底在此环境不成立。
122
+ *
123
+ * 同 `kill` 单点约定:**不回调 listener**(实例正在关闭,回流队列已无消费方);
124
+ * 终态条目保留在表内(关闭流程不读它,无谓清理)。
125
+ *
126
+ * @returns 实际收割的 running 任务数(已终态的不计)
127
+ */
128
+ killAllRunning() {
129
+ let count = 0;
130
+ for (const entry of this.tasks.values()) {
131
+ if (entry.status !== 'running')
132
+ continue;
133
+ this.terminate(entry, 'async');
134
+ count += 1;
135
+ }
136
+ return count;
137
+ }
138
+ /**
139
+ * Agent 实例终态**总出口**:收割全部 running + 注销 exit 兜底钩子(仅 `Agent.close` 链路调用)
140
+ *
141
+ * 为什么收割之外还要注销:exit 钩子是**进程级**事件监听,注册表是**实例级**对象——
142
+ * Agent 关闭后不注销 = 旧实例钩子残留(多实例场景堆积 + 闭包泄漏)。注销后若进程
143
+ * 随即退出,`exitHook` 经 `disposed` 判空转——close 已杀光,钩子无事可做(幂等)。
144
+ *
145
+ * @returns 实际收割的 running 任务数(与 `killAllRunning` 同口径)
146
+ */
147
+ shutdown() {
148
+ const killed = this.killAllRunning();
149
+ this.disposed = true;
150
+ process.removeListener('exit', this.exitHook);
151
+ return killed;
152
+ }
153
+ /**
154
+ * turn 终态**脱管**:把存活任务移出「本轮跟踪」,但**进程继续跑**
155
+ * (定案锚:ADR-036;论证见 `docs/方案-后台任务跨轮存活-20261004.md` §三)
156
+ *
157
+ * 为什么不杀(勿改回强杀):后台命令常需跨多轮存活(长构建 / 常驻服务);turn 是问答的
158
+ * 归档单元、不是进程容器,turn 结束就杀 = 用户没点终止的任务凭空死亡(真机实测:90 秒的
159
+ * ping 在 turn 6.3 秒结束时被杀,UI 显示「已终止」而用户从未操作)。
160
+ *
161
+ * 「脱管」的实际含义 = **什么都不做**:
162
+ * - 不杀进程(`killNow` 不调用)⇒ 进程继续跑,输出继续被捕获
163
+ * - 不改 status(仍是 `running`)⇒ `list()` / UI 条照常显示「运行中」
164
+ * - 不清注册表条目 ⇒ 用户随时可 `kill(taskId)` 取回截至当时的输出
165
+ *
166
+ * 脱管窗口的边界(如实写):
167
+ * - **无内核侧时限**:timeoutMs 省略时 startBackgroundCommand 收 null = 永不超时;
168
+ * `BACKGROUND_MAX_TIMEOUT_MS`(30min)只是「显式传值时的钳制上限」,缺省路径碰不到它。
169
+ * - 跨的是 turn,不是宿主寿命:**Agent 实例终态(`close` → `shutdown`)经
170
+ * `killAllRunning` 真杀**(注册表实例隔离,实例销毁后任务不可寻址,不杀即孤儿——
171
+ * 观察点 ⑧ 真机实锤:父进程退出后 `ping.exe` 仍在);close 清理窗口赶不上时由
172
+ * **exit 钩子同步兜底**(见构造函数)。唯一残留缺口:扩展崩溃 / 被 OS
173
+ * 强杀时两者都来不及执行,该场景不承诺清理。
174
+ *
175
+ * @returns 本轮结束时仍在运行的任务清单(供脱管报告);已终态的不计入
176
+ */
177
+ detachAll() {
178
+ const detached = [];
179
+ for (const entry of this.tasks.values()) {
180
+ if (entry.status !== 'running')
181
+ continue;
182
+ detached.push(this.projection(entry));
183
+ }
184
+ return detached;
185
+ }
186
+ // ── 内部 ──
187
+ /**
188
+ * 主动终止单点(`kill` 单个 / `killAllRunning` 实例终态收割 / exit 钩子兜底共用):
189
+ * 先取输出快照再杀树,随后置 `killed`。
190
+ *
191
+ * ⚠️ 刻意**不回调** listener:主动终止的输出已由调用方直接取得(`kill_command`
192
+ * 返回值 / 关闭流程不需要),再回流一次会让消费方收到同一份结果的第二份副本
193
+ * (重复消费)。自然终态的回调唯一入口是 `settle → notify`。
194
+ *
195
+ * @param mode 杀树原语档位,**必传**(缺省值语义 = 调用方对执行语境含糊,静默回落缺陷):
196
+ * `'async'` = 异步杀树(运行时收割,有完整事件处理);
197
+ * `'sync'` = 同步杀树(**仅** exit 钩子——钩子返回后 Node 即退出,异步 spawn 来不及落地)
198
+ */
199
+ terminate(entry, mode) {
200
+ // 先取快照再杀:杀完 stdio 关闭,此后拿不到已捕获内容
201
+ entry.result = entry.peek();
202
+ if (mode === 'sync') {
203
+ entry.killNowSync();
204
+ }
205
+ else {
206
+ entry.killNow();
207
+ }
208
+ entry.status = 'killed';
209
+ }
210
+ /**
211
+ * exit 钩子的同步收割体:真杀全部 running(同步原语),逐条独立执行
212
+ *
213
+ * 单条杀树失败(taskkill 权限不足等)由原语内部降级 `child.kill()`,**不抛出**——
214
+ * exit 钩子内抛错会中断监听器链,殃及后续清理;逐条循环本身就是故障隔离边界。
215
+ *
216
+ * @returns 实际收割的 running 任务数
217
+ */
218
+ flushRunningSync() {
219
+ let count = 0;
220
+ for (const entry of this.tasks.values()) {
221
+ if (entry.status !== 'running')
222
+ continue;
223
+ this.terminate(entry, 'sync');
224
+ count += 1;
225
+ }
226
+ return count;
227
+ }
228
+ /** 终局结算(由 startBackgroundCommand 的 onSettled 调用;只处理 running 态) */
229
+ settle(taskId, result) {
230
+ const entry = this.tasks.get(taskId);
231
+ if (!entry)
232
+ return;
233
+ // 已终态(多为 kill 先行标记)不覆盖:主动终止的语义优先于进程退出
234
+ if (entry.status !== 'running')
235
+ return;
236
+ entry.result = result;
237
+ // 自然终态只有 completed/timedOut(killed 只由主动 kill 写入,永不走本路径)
238
+ const status = result.timedOut ? 'timedOut' : 'completed';
239
+ entry.status = status;
240
+ this.notify(entry, status);
241
+ }
242
+ notify(entry, status) {
243
+ if (!this.listener)
244
+ return;
245
+ try {
246
+ // 显式带上窄状态:listener 契约只传自然终态,killed 永不经此通道
247
+ this.listener({ ...this.projection(entry), status });
248
+ }
249
+ catch (err) {
250
+ logger.error({ taskId: entry.taskId, err }, '后台任务完成回调抛错(已吞,不影响任务表)');
251
+ }
252
+ }
253
+ /** 只读投影:不泄漏 killNow/peek 等进程句柄 */
254
+ projection(entry) {
255
+ return {
256
+ taskId: entry.taskId,
257
+ command: entry.command,
258
+ startedAt: entry.startedAt,
259
+ status: entry.status,
260
+ ...(entry.result ? { result: entry.result } : {}),
261
+ };
262
+ }
263
+ }
264
+ /**
265
+ * 后台任务状态 → 中文标签(回流通知 / 收尾报告 / **宿主 UI** 共用一个词表)
266
+ *
267
+ * 公开导出:宿主 UI 直接消费本表渲染状态文案,**不自建第二套**(自建即双源漂移)。
268
+ * `Record` 穷尽键 ⇒ 新增状态忘补标签 = **编译期红闸**(同 `COMPRESS_TARGET_LABELS` 定案)。
269
+ */
270
+ export const BACKGROUND_TASK_STATUS_LABELS = {
271
+ running: '运行中',
272
+ completed: '已完成',
273
+ timedOut: '超时被终止',
274
+ killed: '已终止',
275
+ };
276
+ /**
277
+ * 后台任务状态 → 回流通知**首标签**(`[...]` 方括号内的系统事件标记)
278
+ *
279
+ * 与 `BACKGROUND_TASK_STATUS_LABELS` 分表的理由:两者句法位置不同——首标签进
280
+ * 方括号头(事件级措辞,如「后台命令超时」),状态标签跟在 `·` 后(状态级措辞,
281
+ * 如「超时被终止」);合并成一张表会让某一侧被迫迁就另一侧的句法。
282
+ * 独立穷尽表 ⇒ 每个状态的首标签必然存在且**不串档**:旧实现用三元表达式
283
+ * `status === 'killed' ? '已终止' : '完成'` 推导首标签,timedOut 被推导成
284
+ * 「[后台命令完成] · 超时被终止」(自相矛盾),running 也会被谎报成「完成」。
285
+ * `Record` 穷尽键 ⇒ 新增状态忘补 = **编译期红闸**(同 `COMPRESS_TARGET_LABELS` 定案)。
286
+ */
287
+ export const BACKGROUND_TASK_NOTICE_TAGS = {
288
+ running: '后台命令运行中',
289
+ completed: '后台命令完成',
290
+ timedOut: '后台命令超时',
291
+ killed: '后台命令已终止',
292
+ };
293
+ /**
294
+ * 后台任务终局 → 回流通知文案(**格式化单点**:loop 回流与收尾报告共用)
295
+ *
296
+ * 来源标记前置且显式(首标签 = `BACKGROUND_TASK_NOTICE_TAGS[task.status]`,穷尽表
297
+ * 逐态给出,杜绝三元推导把 timedOut/running 谎报成「完成」)——消费方是 LLM,
298
+ * 必须能让它分清「这是系统事件」而非「用户刚说了什么」(role 语义隔离,§14.2)。
299
+ * 超时文案不编造秒数:注册表不存时限,缺省即不限时(命令执行能力方案 §13.6-C)。
300
+ */
301
+ export function formatBackgroundTaskNotice(task) {
302
+ // 中间变量承载查表结果:模板串里保持 `[${noticeTag}]` 简单插值形态(嵌套下标
303
+ // `TAGS[task.status]` 直写进模板会让首标签截断判据看不清边界,且可读性差)
304
+ const noticeTag = BACKGROUND_TASK_NOTICE_TAGS[task.status];
305
+ const header = `[${noticeTag}] taskId=${task.taskId} · ${BACKGROUND_TASK_STATUS_LABELS[task.status]}`;
306
+ if (!task.result)
307
+ return `${header}\n命令:${task.command}\n(无已捕获输出)`;
308
+ // killed 态走专用格式化:被主动终止没有退出码,套三态会谎报成「命令执行失败」
309
+ const body = task.status === 'killed'
310
+ ? formatKilledCommandOutput(task.result)
311
+ : formatCommandResult(task.result);
312
+ return `${header}\n命令:${task.command}\n${body}`;
313
+ }
314
+ //# sourceMappingURL=backgroundTasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backgroundTasks.js","sourceRoot":"","sources":["../../src/agent/backgroundTasks.ts"],"names":[],"mappings":"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"}
@@ -17,7 +17,7 @@ export declare const DEFAULT_ANCHOR_ANSWER_FACTOR = 1;
17
17
  export declare const MIN_RUNNABLE_DIALOGUE_TOKENS = 128;
18
18
  /** 预算计算入参 */
19
19
  export interface ContextBudgetInput {
20
- /** 上下文窗口容量(token):唯一真理源 = 宿主在构造内核前经 resolveContextWindow(window) 解析注入的单一数字(per-LLM 窗口,缺失回退默认 120K)。内核预算路径只消费单一数字,不认 provider/用户双层来源 */
20
+ /** 上下文窗口容量(token):唯一真理源 = 宿主在构造内核前经 resolveContextWindow(window) 解析注入的单一数字(per-LLM 窗口,缺失回退 = AGENT_CONSTANTS.DEFAULT_MAX_CONTEXT_TOKENS,数字以该常量为真源、不在此落账)。内核预算路径只消费单一数字,不认 provider/用户双层来源 */
21
21
  readonly windowTokens: number;
22
22
  /** 固定开销(system+persona+rules+技能L1+工具schema,token) */
23
23
  readonly fixedOverheadTokens: number;
@@ -32,7 +32,8 @@ export interface ContextBudgetInput {
32
32
  * 解析有效上下文窗口(SSOT 单源公式,宿主在构造内核 Agent 前调用)。
33
33
  *
34
34
  * 唯一真理源 = 用户 per-LLM 配置的上下文上限(宿主装配时传入);未配置 → 回退内核默认
35
- * DEFAULT_MAX_CONTEXT_TOKENS(120_000)。内核预算路径只吃单一数字 maxContextTokens,
35
+ * AGENT_CONSTANTS.DEFAULT_MAX_CONTEXT_TOKENS(数字以该常量为真源,不在此落账——真源改值时
36
+ * 注释不跟随会变撒谎)。内核预算路径只吃单一数字 maxContextTokens,
36
37
  * 不认 provider/用户双来源、不施加全局封顶——用户对自己填写的参数负责。
37
38
  */
38
39
  export declare function resolveContextWindow(window?: number): number;
@@ -50,8 +51,11 @@ export interface ContextBudget {
50
51
  /**
51
52
  * 上下文占用快照(真实用量,供输入区指示器展示;与 `ContextBudget` 的「预算上限」互补)。
52
53
  *
53
- * 设计:各段为 prepare 期**实际占用** token,互斥分段拼满整个窗口容量 `totalTokens`:
54
- * 角色包基础设定(system) | 完整对话 | 当前输入锚点 | 输出预留 | 剩余。
54
+ * 设计:各段为当前工作记忆的**实际占用** token,互斥分段拼满整个窗口容量 `totalTokens`:
55
+ * 角色包基础设定(system) | 动态注入(system) | 完整对话 | 当前输入锚点 | 输出预留 | 剩余。
56
+ * 「动态注入」= `messages[0]` 之外的**全部** system 消息(最近对话块 / 情报区 / 任务表 /
57
+ * 软上限与压力提示 / 搜索收敛提示 / 反思与自审查提示等运行时注入)——必须计入占用,
58
+ * 否则 free 系统性偏大、指示器偏乐观(用户按圆环判断"还能贴多少"必踩坑)。
55
59
  * 单一真理源 = 内核 prepare 计算(contextPreparer 经 loop.recordOccupancy 写入),
56
60
  * 宿主/webview 只渲染、不重算。free 非负收敛(窗口过小/输入过大时各段归零,free 不出现负值)。
57
61
  */
@@ -60,7 +64,14 @@ export interface ContextOccupancy {
60
64
  readonly totalTokens: number;
61
65
  /** 角色包/系统基础设定占用(system prompt:persona + rules + 技能 L1 + 工具 schema) */
62
66
  readonly rolePackBaseTokens: number;
63
- /** 完整对话层实际占用(最近轮次注入正文 token) */
67
+ /**
68
+ * 动态注入占用(`messages[0]` 之外的 system 消息:最近对话块 / 情报区 / 任务表 /
69
+ * 软上限与压力提示 / 搜索收敛提示 / 反思与自审查提示等运行时注入)。
70
+ *
71
+ * 此前该段未计入任何分段、被静默算进 free ⇒ 指示器偏乐观(P1-1 修复)。
72
+ */
73
+ readonly dynamicSystemTokens: number;
74
+ /** 完整对话层实际占用(全量 user+assistant 问答闭环 token) */
64
75
  readonly dialogueTokens: number;
65
76
  /** 完整对话层注入的对话条数(user+assistant 消息总数;条数与 token 并存供宿主 hover 明细展示) */
66
77
  readonly dialogueCount: number;
@@ -77,6 +88,13 @@ export interface EstimateOccupancyInput {
77
88
  readonly totalTokens: number;
78
89
  /** 角色包/系统基础设定占用(system prompt 固定开销) */
79
90
  readonly rolePackBaseTokens: number;
91
+ /**
92
+ * 动态注入占用(`messages[0]` 之外的 system 消息)。
93
+ *
94
+ * **必填**(非可选默认 0):漏填即 free 系统性偏大、指示器偏乐观——正是本段要根治的伤。
95
+ * 运行时路径由 `loop.getDynamicSystemTokens()` 提供;历史会话重算(无系统注入)显式传 0。
96
+ */
97
+ readonly dynamicSystemTokens: number;
80
98
  /** 完整对话层 token */
81
99
  readonly dialogueTokens: number;
82
100
  /** 完整对话层条数 */
@@ -1 +1 @@
1
- {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/agent/budget.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/agent/budget.ts"],"names":[],"mappings":"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"}
@@ -39,7 +39,8 @@ export const MIN_RUNNABLE_DIALOGUE_TOKENS = 128;
39
39
  * 解析有效上下文窗口(SSOT 单源公式,宿主在构造内核 Agent 前调用)。
40
40
  *
41
41
  * 唯一真理源 = 用户 per-LLM 配置的上下文上限(宿主装配时传入);未配置 → 回退内核默认
42
- * DEFAULT_MAX_CONTEXT_TOKENS(120_000)。内核预算路径只吃单一数字 maxContextTokens,
42
+ * AGENT_CONSTANTS.DEFAULT_MAX_CONTEXT_TOKENS(数字以该常量为真源,不在此落账——真源改值时
43
+ * 注释不跟随会变撒谎)。内核预算路径只吃单一数字 maxContextTokens,
43
44
  * 不认 provider/用户双来源、不施加全局封顶——用户对自己填写的参数负责。
44
45
  */
45
46
  export function resolveContextWindow(window) {
@@ -56,11 +57,16 @@ export function resolveContextWindow(window) {
56
57
  export function estimateOccupancy(input) {
57
58
  const outputReserveRatio = input.outputReserveRatio ?? DEFAULT_OUTPUT_RESERVE_RATIO;
58
59
  const outputReserveTokens = Math.floor(input.totalTokens * outputReserveRatio);
59
- const usedBeforeFree = input.rolePackBaseTokens + input.dialogueTokens + input.inputAnchorTokens + outputReserveTokens;
60
+ const usedBeforeFree = input.rolePackBaseTokens +
61
+ input.dynamicSystemTokens +
62
+ input.dialogueTokens +
63
+ input.inputAnchorTokens +
64
+ outputReserveTokens;
60
65
  const freeTokens = Math.max(0, input.totalTokens - usedBeforeFree);
61
66
  return {
62
67
  totalTokens: input.totalTokens,
63
68
  rolePackBaseTokens: input.rolePackBaseTokens,
69
+ dynamicSystemTokens: input.dynamicSystemTokens,
64
70
  dialogueTokens: input.dialogueTokens,
65
71
  dialogueCount: input.dialogueCount,
66
72
  inputAnchorTokens: input.inputAnchorTokens,
@@ -1 +1 @@
1
- {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/agent/budget.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/agent/budget.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ import type { SecurityGuard } from '../security/pathGuard.js';
2
2
  import type { IMemoryStorage } from '../memory/storageInterface.js';
3
3
  import type { ISessionStore } from '../memory/sessionStore.js';
4
4
  import type { WriteExtensions } from '../agent/toolExecutor.js';
5
+ import type { BackgroundTaskScheduler } from '../utils/backgroundTask.js';
6
+ import type { AgentEventMap } from '../utils/eventEmitter.js';
5
7
  import type { MemoryInspector } from '../agent/managers/memoryInspector.js';
6
8
  import type { LlmProvider } from '../llm/provider.js';
7
9
  /**
@@ -44,9 +46,17 @@ export declare class BuiltinToolHandlers {
44
46
  constructor(projectPath: string, security: SecurityGuard, memoryIndex: IMemoryStorage, sessionStore?: ISessionStore | undefined);
45
47
  /** 记忆搜索器(search_memories 语义后端,装配期注入;未注入时回退关键词 memoryIndex.search) */
46
48
  private memoryInspector;
49
+ /**
50
+ * 后台任务槽位调度器(装配期注入,与 SeedDeps 的调度器**同一实例**):
51
+ * search_memories 命中即 touch 经此 fire-and-forget,共享 Agent 实例的 5 槽限流,
52
+ * 并纳入 close() 单点等待。未注入时 touch 静默跳过(与 onMemoryRecalled?.() 同款可选链,
53
+ * 保持「内置工具可被测试/脚本直调、无宿主即 no-op」语义)。
54
+ */
55
+ private backgroundTasks;
47
56
  /** 当前会话「正文或摘要已在眼前」的轮次提供者(装配期注入;search_memories 用它与装配期内容互斥) */
48
57
  private exclusionRoundIdsProvider;
49
- /** memoryRecalled 事件发射回调(宿主感知「LLM 查询记忆命中 N 条」;装配期注入,缺省不发射) */
58
+ /** memoryRecalled 事件发射回调(宿主感知「LLM 查询记忆命中 N 条」;装配期注入,缺省不发射)。
59
+ * 载荷类型引用 AgentEventMap 单一真源(不内联复制,防与 eventEmitter 定义漂移)。 */
50
60
  private onMemoryRecalled;
51
61
  /**
52
62
  * 注入 MemoryInspector,启用 search_memories 的纯关键词搜索后端(memory-tool-recall-design §3.3)。
@@ -60,10 +70,7 @@ export declare class BuiltinToolHandlers {
60
70
  * **唯一触发位**:全库仅本类 emit memoryRecalled(无其他发射点)。
61
71
  * 缺省不注入则静默跳过(内置工具也可被测试/脚本直调,无宿主时 no-op)。
62
72
  */
63
- setOnMemoryRecalled(callback: (info: {
64
- count: number;
65
- query: string;
66
- }) => void): void;
73
+ setOnMemoryRecalled(callback: (info: AgentEventMap['memoryRecalled']) => void): void;
67
74
  /**
68
75
  * 注入召回互斥排除集提供者(memory-tool-recall-design §5.1 工具互斥)。
69
76
  * search_memories 用它排除「正文或摘要已在眼前」轮次的 round-summary,避免与装配期内容重复。
@@ -72,6 +79,14 @@ export declare class BuiltinToolHandlers {
72
79
  * 缺省不注入则不过滤(保持测试/独立调用可直接触发)。
73
80
  */
74
81
  setExclusionRoundIdsProvider(provider: () => ReadonlySet<string>): void;
82
+ /**
83
+ * 注入后台任务槽位调度器(装配期注入,与 SeedDeps 的调度器同一实例)。
84
+ * 装配依赖 loop/history,toolExec 在 assembler 中先于它构造,故用「构造后注入」而非构造参数。
85
+ * 注入后 search_memories 命中 touch 走实例级限流,并纳入 Agent.close() 等待;未注入则 touch 静默跳过。
86
+ *
87
+ * @param scheduler Agent 实例级后台任务调度器
88
+ */
89
+ setBackgroundTaskScheduler(scheduler: BackgroundTaskScheduler): void;
75
90
  /**
76
91
  * 解析相对路径为绝对路径
77
92
  *
@@ -215,14 +230,18 @@ export declare class BuiltinToolHandlers {
215
230
  * @param query 搜索关键词
216
231
  * @param limitStr 返回数量上限
217
232
  * @param modeStr 搜索模式:"match"(任一命中,默认)或 "near"(全部命中)
233
+ * @param toolCallId 本次 tool_call 唯一 ID(可选 · 宿主配对通道,MEM-EVENT-2):原样透传进
234
+ * memoryRecalled 载荷,供宿主把命中明细挂回对应工具折叠块。缺省 = 载荷不带该字段,
235
+ * 宿主回退轮次级兜底落位(测试/直调均可省略,不新造默认值)。
218
236
  */
219
- searchMemories(query: string, limitStr: string, modeStr: string): Promise<string>;
237
+ searchMemories(query: string, limitStr: string, modeStr: string, toolCallId?: string): Promise<string>;
220
238
  /**
221
239
  * 命中即 touch:fire-and-forget 刷新命中记忆的 accessedAt(不涉及任何重要度字段)。
222
240
  *
223
241
  * 收敛到 keywordsTouch.ts 的单一真理源 touchScores(§5.2 只 touch 不加权,内部只调 storage.touch)——
224
- * 不为工具命中另造写分路径。backgroundTask 保证 fire-and-forget 不阻塞搜索返回,
225
- * 且统一并发限流;失败兜底记日志即可(touch 是排序副作用,非主线流程)。
242
+ * 不为工具命中另造写分路径。实例级调度器保证 fire-and-forget 不阻塞搜索返回,
243
+ * 且统一并发限流(同一 Agent 实例 5 槽);失败兜底记日志即可(touch 是排序副作用,非主线流程)。
244
+ * 调度器未注入(测试/独立调用)→ 静默跳过 touch,不另造无主 Promise。
226
245
  *
227
246
  * @param hits 搜索命中项(取其 id 定位,实际写入交由 touchScores 收敛)
228
247
  */
@@ -267,7 +286,8 @@ export declare class BuiltinToolHandlers {
267
286
  * (会话级路标不进记忆库)。本工具是「粗定位 → 细取证」闭环的第一环:
268
287
  * 返回最近 N 个会话的路标,LLM 据此挑目标,再用 trace_summary(sessionId) 取该会话轮次摘要。
269
288
  *
270
- * 路标滞后说明:SessionArchiver 在**会话切换前**触发,故当前会话的摘要可能落后于最新对话。
289
+ * 路标滞后说明:会话级摘要在**会话切走/分叉离场/暂停超时**时由 SessionArchiver 归档生成,
290
+ * 故当前会话(尚未离场)的摘要可能落后于最新对话。
271
291
  * 本工具按 updatedAt 降序返回,历史会话路标准确;当前会话以实际上下文为准,不依赖路标。
272
292
  *
273
293
  * @param limitStr 返回条数上限(默认 "10",最大 "30")
@@ -1 +1 @@
1
- {"version":3,"file":"builtinToolHandlers.d.ts","sourceRoot":"","sources":["../../src/agent/builtinToolHandlers.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAM7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,0BAA0B,CAAC;AAS3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI/D,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAO3F,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AA0D9D;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAO9C,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAGrE;AAED;;;;;GAKG;AACH,qBAAa,mBAAmB;IAW5B,QAAQ,CAAC,WAAW,EAAE,MAAM;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAbhC,oDAAoD;IACpD,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAqB;IAEzE;;;;;OAKG;gBAEQ,WAAW,EAAE,MAAM,EACX,QAAQ,EAAE,aAAa,EACvB,WAAW,EAAE,cAAc,EAC3B,YAAY,CAAC,EAAE,aAAa,YAAA;IAG/C,qEAAqE;IACrE,OAAO,CAAC,eAAe,CAAgC;IAEvD,8DAA8D;IAC9D,OAAO,CAAC,yBAAyB,CAA4C;IAE7E,8DAA8D;IAC9D,OAAO,CAAC,gBAAgB,CAAmE;IAE3F;;;;OAIG;IACH,kBAAkB,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAIpD;;;;;OAKG;IACH,mBAAmB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI;IAIrF;;;;;;OAMG;IACH,4BAA4B,CAAC,QAAQ,EAAE,MAAM,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;IAMvE;;;;;;OAMG;IACH,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAI7C;;;OAGG;IACH,gBAAgB,CACd,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,SAAS,GAAG,QAAQ,GAAG,QAAoB,GAClD,IAAI;IAkBP;;;;;;;;;;OAUG;YACW,gBAAgB;IAyB9B;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4DtF;;;;OAIG;YACW,cAAc;IAe5B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,qBAAqB;IA0D7B;;;;;;;;OAQG;IACG,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwD3D;;;;;;;;;;;OAWG;IACG,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA6EvD;;;;;;;;;;;;;;;;;;OAkBG;IACG,SAAS,CACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,eAAe,EAC5B,IAAI,GAAE,MAAoB,EAC1B,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;IAkMlB;;;;;;;;;OASG;IACH,OAAO,CAAC,mBAAmB;IAuG3B;;;;;;;OAOG;IACG,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+D/F;;OAEG;YACW,OAAO;IA8CrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;;;;;OAMG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiFvF;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAUjB;;;;;;;;OAQG;YACW,uBAAuB;IAqBrC;;;;;;;;;;OAUG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiE3F;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;IAyB5B;;;;;;;;;;;;OAYG;IACG,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAqDvD;AA+BD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,sCAAsC;IACtC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IACtF,gEAAgE;IAChE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,yCAAyC;IACzC,QAAQ,EAAE,WAAW,CAAC;IACtB,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,MAAM,CAAC,CA2DlB"}
1
+ {"version":3,"file":"builtinToolHandlers.d.ts","sourceRoot":"","sources":["../../src/agent/builtinToolHandlers.ts"],"names":[],"mappings":"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"}