@zooique/memora 2.0.3 → 3.0.1

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 (588) hide show
  1. package/CHANGELOG.md +1037 -0
  2. package/README.en.md +305 -272
  3. package/README.md +303 -260
  4. package/config.example.json +43 -0
  5. package/dist/agent/agent.d.ts +376 -408
  6. package/dist/agent/agent.d.ts.map +1 -1
  7. package/dist/agent/agent.js +1166 -926
  8. package/dist/agent/agent.js.map +1 -1
  9. package/dist/agent/assembler.d.ts +105 -43
  10. package/dist/agent/assembler.d.ts.map +1 -1
  11. package/dist/agent/assembler.js +543 -75
  12. package/dist/agent/assembler.js.map +1 -1
  13. package/dist/agent/budget.d.ts +131 -0
  14. package/dist/agent/budget.d.ts.map +1 -0
  15. package/dist/agent/budget.js +128 -0
  16. package/dist/agent/budget.js.map +1 -0
  17. package/dist/agent/builtinToolHandlers.d.ts +225 -38
  18. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  19. package/dist/agent/builtinToolHandlers.js +748 -132
  20. package/dist/agent/builtinToolHandlers.js.map +1 -1
  21. package/dist/agent/builtinTools.d.ts +198 -7
  22. package/dist/agent/builtinTools.d.ts.map +1 -1
  23. package/dist/agent/builtinTools.js +646 -14
  24. package/dist/agent/builtinTools.js.map +1 -1
  25. package/dist/agent/compaction.d.ts +93 -0
  26. package/dist/agent/compaction.d.ts.map +1 -0
  27. package/dist/agent/compaction.js +192 -0
  28. package/dist/agent/compaction.js.map +1 -0
  29. package/dist/agent/constants.d.ts +137 -20
  30. package/dist/agent/constants.d.ts.map +1 -1
  31. package/dist/agent/constants.js +152 -20
  32. package/dist/agent/constants.js.map +1 -1
  33. package/dist/agent/contextManager.d.ts +119 -77
  34. package/dist/agent/contextManager.d.ts.map +1 -1
  35. package/dist/agent/contextManager.js +192 -135
  36. package/dist/agent/contextManager.js.map +1 -1
  37. package/dist/agent/contextPreparer.d.ts +78 -0
  38. package/dist/agent/contextPreparer.d.ts.map +1 -0
  39. package/dist/agent/contextPreparer.js +128 -0
  40. package/dist/agent/contextPreparer.js.map +1 -0
  41. package/dist/agent/duplicateInterceptor.d.ts +67 -0
  42. package/dist/agent/duplicateInterceptor.d.ts.map +1 -0
  43. package/dist/agent/duplicateInterceptor.js +82 -0
  44. package/dist/agent/duplicateInterceptor.js.map +1 -0
  45. package/dist/agent/guardRail.d.ts +166 -0
  46. package/dist/agent/guardRail.d.ts.map +1 -0
  47. package/dist/agent/guardRail.js +333 -0
  48. package/dist/agent/guardRail.js.map +1 -0
  49. package/dist/agent/loop.d.ts +716 -295
  50. package/dist/agent/loop.d.ts.map +1 -1
  51. package/dist/agent/loop.js +2178 -664
  52. package/dist/agent/loop.js.map +1 -1
  53. package/dist/agent/managers/archiveCoordinator.d.ts +14 -171
  54. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  55. package/dist/agent/managers/archiveCoordinator.js +19 -287
  56. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  57. package/dist/agent/managers/chatLockManager.d.ts +20 -88
  58. package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
  59. package/dist/agent/managers/chatLockManager.js +31 -103
  60. package/dist/agent/managers/chatLockManager.js.map +1 -1
  61. package/dist/agent/managers/dedupManager.d.ts +31 -115
  62. package/dist/agent/managers/dedupManager.d.ts.map +1 -1
  63. package/dist/agent/managers/dedupManager.js +48 -136
  64. package/dist/agent/managers/dedupManager.js.map +1 -1
  65. package/dist/agent/managers/goalConsistencyChecker.d.ts +42 -0
  66. package/dist/agent/managers/goalConsistencyChecker.d.ts.map +1 -0
  67. package/dist/agent/managers/goalConsistencyChecker.js +178 -0
  68. package/dist/agent/managers/goalConsistencyChecker.js.map +1 -0
  69. package/dist/agent/managers/llmCaller.d.ts +124 -0
  70. package/dist/agent/managers/llmCaller.d.ts.map +1 -0
  71. package/dist/agent/managers/llmCaller.js +417 -0
  72. package/dist/agent/managers/llmCaller.js.map +1 -0
  73. package/dist/agent/managers/llmJudgeHelper.d.ts +8 -25
  74. package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -1
  75. package/dist/agent/managers/llmJudgeHelper.js +7 -24
  76. package/dist/agent/managers/llmJudgeHelper.js.map +1 -1
  77. package/dist/agent/managers/loopMetrics.d.ts +58 -0
  78. package/dist/agent/managers/loopMetrics.d.ts.map +1 -0
  79. package/dist/agent/managers/loopMetrics.js +68 -0
  80. package/dist/agent/managers/loopMetrics.js.map +1 -0
  81. package/dist/agent/managers/memoryAdvisor.d.ts +27 -120
  82. package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
  83. package/dist/agent/managers/memoryAdvisor.js +85 -207
  84. package/dist/agent/managers/memoryAdvisor.js.map +1 -1
  85. package/dist/agent/managers/memoryGovernance.d.ts +10 -42
  86. package/dist/agent/managers/memoryGovernance.d.ts.map +1 -1
  87. package/dist/agent/managers/memoryGovernance.js +19 -36
  88. package/dist/agent/managers/memoryGovernance.js.map +1 -1
  89. package/dist/agent/managers/memoryInspector.d.ts +59 -268
  90. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  91. package/dist/agent/managers/memoryInspector.js +91 -442
  92. package/dist/agent/managers/memoryInspector.js.map +1 -1
  93. package/dist/agent/managers/roundSummaryGenerator.d.ts +56 -0
  94. package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -0
  95. package/dist/agent/managers/roundSummaryGenerator.js +201 -0
  96. package/dist/agent/managers/roundSummaryGenerator.js.map +1 -0
  97. package/dist/agent/managers/sessionArchiver.d.ts +19 -68
  98. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  99. package/dist/agent/managers/sessionArchiver.js +76 -147
  100. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  101. package/dist/agent/managers/sessionManager.d.ts +286 -57
  102. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  103. package/dist/agent/managers/sessionManager.js +846 -85
  104. package/dist/agent/managers/sessionManager.js.map +1 -1
  105. package/dist/agent/managers/sessionNamer.d.ts +35 -0
  106. package/dist/agent/managers/sessionNamer.d.ts.map +1 -0
  107. package/dist/agent/managers/sessionNamer.js +104 -0
  108. package/dist/agent/managers/sessionNamer.js.map +1 -0
  109. package/dist/agent/managers/streamAccumulator.d.ts +8 -33
  110. package/dist/agent/managers/streamAccumulator.d.ts.map +1 -1
  111. package/dist/agent/managers/streamAccumulator.js +4 -29
  112. package/dist/agent/managers/streamAccumulator.js.map +1 -1
  113. package/dist/agent/managers/textPolishManager.d.ts +8 -44
  114. package/dist/agent/managers/textPolishManager.d.ts.map +1 -1
  115. package/dist/agent/managers/textPolishManager.js +9 -41
  116. package/dist/agent/managers/textPolishManager.js.map +1 -1
  117. package/dist/agent/managers/toolCallHelpers.d.ts +105 -0
  118. package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -0
  119. package/dist/agent/managers/toolCallHelpers.js +161 -0
  120. package/dist/agent/managers/toolCallHelpers.js.map +1 -0
  121. package/dist/agent/managers/workProjection.d.ts +55 -100
  122. package/dist/agent/managers/workProjection.d.ts.map +1 -1
  123. package/dist/agent/managers/workProjection.js +164 -268
  124. package/dist/agent/managers/workProjection.js.map +1 -1
  125. package/dist/agent/messageHistory.d.ts +134 -84
  126. package/dist/agent/messageHistory.d.ts.map +1 -1
  127. package/dist/agent/messageHistory.js +419 -133
  128. package/dist/agent/messageHistory.js.map +1 -1
  129. package/dist/agent/needsPlanning.d.ts +28 -0
  130. package/dist/agent/needsPlanning.d.ts.map +1 -0
  131. package/dist/agent/needsPlanning.js +68 -0
  132. package/dist/agent/needsPlanning.js.map +1 -0
  133. package/dist/agent/seed/index.d.ts +11 -0
  134. package/dist/agent/seed/index.d.ts.map +1 -0
  135. package/dist/agent/seed/index.js +10 -0
  136. package/dist/agent/seed/index.js.map +1 -0
  137. package/dist/agent/seed/orchestrator.d.ts +83 -0
  138. package/dist/agent/seed/orchestrator.d.ts.map +1 -0
  139. package/dist/agent/seed/orchestrator.js +260 -0
  140. package/dist/agent/seed/orchestrator.js.map +1 -0
  141. package/dist/agent/seed/prepare.d.ts +49 -0
  142. package/dist/agent/seed/prepare.d.ts.map +1 -0
  143. package/dist/agent/seed/prepare.js +107 -0
  144. package/dist/agent/seed/prepare.js.map +1 -0
  145. package/dist/agent/seed/types.d.ts +115 -0
  146. package/dist/agent/seed/types.d.ts.map +1 -0
  147. package/dist/agent/seed/types.js +15 -0
  148. package/dist/agent/seed/types.js.map +1 -0
  149. package/dist/agent/sessionStateMachine.d.ts +78 -0
  150. package/dist/agent/sessionStateMachine.d.ts.map +1 -0
  151. package/dist/agent/sessionStateMachine.js +182 -0
  152. package/dist/agent/sessionStateMachine.js.map +1 -0
  153. package/dist/agent/taskTableRenderer.d.ts +51 -0
  154. package/dist/agent/taskTableRenderer.d.ts.map +1 -0
  155. package/dist/agent/taskTableRenderer.js +115 -0
  156. package/dist/agent/taskTableRenderer.js.map +1 -0
  157. package/dist/agent/toolExecutor.d.ts +236 -10
  158. package/dist/agent/toolExecutor.d.ts.map +1 -1
  159. package/dist/agent/toolExecutor.js +932 -21
  160. package/dist/agent/toolExecutor.js.map +1 -1
  161. package/dist/agent/toolLedger.d.ts +120 -0
  162. package/dist/agent/toolLedger.d.ts.map +1 -0
  163. package/dist/agent/toolLedger.js +149 -0
  164. package/dist/agent/toolLedger.js.map +1 -0
  165. package/dist/agent/toolResultCache.d.ts +134 -0
  166. package/dist/agent/toolResultCache.d.ts.map +1 -0
  167. package/dist/agent/toolResultCache.js +243 -0
  168. package/dist/agent/toolResultCache.js.map +1 -0
  169. package/dist/agent/toolResultOffload.d.ts +59 -0
  170. package/dist/agent/toolResultOffload.d.ts.map +1 -0
  171. package/dist/agent/toolResultOffload.js +70 -0
  172. package/dist/agent/toolResultOffload.js.map +1 -0
  173. package/dist/agent/toolRunner.d.ts +59 -0
  174. package/dist/agent/toolRunner.d.ts.map +1 -0
  175. package/dist/agent/toolRunner.js +147 -0
  176. package/dist/agent/toolRunner.js.map +1 -0
  177. package/dist/agent/tracer.d.ts +99 -107
  178. package/dist/agent/tracer.d.ts.map +1 -1
  179. package/dist/agent/tracer.js +24 -69
  180. package/dist/agent/tracer.js.map +1 -1
  181. package/dist/agent/types.d.ts +510 -169
  182. package/dist/agent/types.d.ts.map +1 -1
  183. package/dist/agent/types.js +2 -51
  184. package/dist/agent/types.js.map +1 -1
  185. package/dist/code-exec/codeExecutionProvider.d.ts +16 -0
  186. package/dist/code-exec/codeExecutionProvider.d.ts.map +1 -0
  187. package/dist/code-exec/codeExecutionProvider.js +57 -0
  188. package/dist/code-exec/codeExecutionProvider.js.map +1 -0
  189. package/dist/code-exec/types.d.ts +37 -0
  190. package/dist/code-exec/types.d.ts.map +1 -0
  191. package/dist/code-exec/types.js +12 -0
  192. package/dist/code-exec/types.js.map +1 -0
  193. package/dist/config/expandEnvVars.d.ts +22 -0
  194. package/dist/config/expandEnvVars.d.ts.map +1 -0
  195. package/dist/config/expandEnvVars.js +38 -0
  196. package/dist/config/expandEnvVars.js.map +1 -0
  197. package/dist/config/loader.d.ts +27 -98
  198. package/dist/config/loader.d.ts.map +1 -1
  199. package/dist/config/loader.js +110 -223
  200. package/dist/config/loader.js.map +1 -1
  201. package/dist/index.d.ts +67 -77
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +90 -69
  204. package/dist/index.js.map +1 -1
  205. package/dist/llm/abortSignal.d.ts +2 -3
  206. package/dist/llm/abortSignal.d.ts.map +1 -1
  207. package/dist/llm/abortSignal.js +2 -3
  208. package/dist/llm/abortSignal.js.map +1 -1
  209. package/dist/llm/factory.d.ts +22 -32
  210. package/dist/llm/factory.d.ts.map +1 -1
  211. package/dist/llm/factory.js +29 -46
  212. package/dist/llm/factory.js.map +1 -1
  213. package/dist/llm/openaiCompatible.d.ts +25 -40
  214. package/dist/llm/openaiCompatible.d.ts.map +1 -1
  215. package/dist/llm/openaiCompatible.js +179 -120
  216. package/dist/llm/openaiCompatible.js.map +1 -1
  217. package/dist/llm/provider.d.ts +29 -42
  218. package/dist/llm/provider.d.ts.map +1 -1
  219. package/dist/llm/provider.js +11 -10
  220. package/dist/llm/provider.js.map +1 -1
  221. package/dist/llm/types.d.ts +54 -11
  222. package/dist/llm/types.d.ts.map +1 -1
  223. package/dist/llm/types.js +0 -5
  224. package/dist/llm/types.js.map +1 -1
  225. package/dist/logging/logger.d.ts +8 -31
  226. package/dist/logging/logger.d.ts.map +1 -1
  227. package/dist/logging/logger.js +28 -215
  228. package/dist/logging/logger.js.map +1 -1
  229. package/dist/logging/loggerInterface.d.ts +9 -8
  230. package/dist/logging/loggerInterface.d.ts.map +1 -1
  231. package/dist/memory/gcService.d.ts +164 -0
  232. package/dist/memory/gcService.d.ts.map +1 -0
  233. package/dist/memory/gcService.js +215 -0
  234. package/dist/memory/gcService.js.map +1 -0
  235. package/dist/memory/governance.d.ts +11 -44
  236. package/dist/memory/governance.d.ts.map +1 -1
  237. package/dist/memory/governance.js +11 -64
  238. package/dist/memory/governance.js.map +1 -1
  239. package/dist/memory/inMemoryRoundStore.d.ts +124 -0
  240. package/dist/memory/inMemoryRoundStore.d.ts.map +1 -0
  241. package/dist/memory/inMemoryRoundStore.js +216 -0
  242. package/dist/memory/inMemoryRoundStore.js.map +1 -0
  243. package/dist/memory/inMemorySessionStore.d.ts +92 -0
  244. package/dist/memory/inMemorySessionStore.d.ts.map +1 -0
  245. package/dist/memory/inMemorySessionStore.js +219 -0
  246. package/dist/memory/inMemorySessionStore.js.map +1 -0
  247. package/dist/memory/inMemorySessionViewLoader.d.ts +89 -0
  248. package/dist/memory/inMemorySessionViewLoader.d.ts.map +1 -0
  249. package/dist/memory/inMemorySessionViewLoader.js +183 -0
  250. package/dist/memory/inMemorySessionViewLoader.js.map +1 -0
  251. package/dist/memory/inMemoryStorage.d.ts +25 -175
  252. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  253. package/dist/memory/inMemoryStorage.js +32 -221
  254. package/dist/memory/inMemoryStorage.js.map +1 -1
  255. package/dist/memory/keywordsTouch.d.ts +20 -0
  256. package/dist/memory/keywordsTouch.d.ts.map +1 -0
  257. package/dist/memory/keywordsTouch.js +25 -0
  258. package/dist/memory/keywordsTouch.js.map +1 -0
  259. package/dist/memory/lockManager.d.ts +2 -2
  260. package/dist/memory/lockManager.d.ts.map +1 -1
  261. package/dist/memory/lockManager.js +6 -8
  262. package/dist/memory/lockManager.js.map +1 -1
  263. package/dist/memory/projectManager.d.ts +30 -129
  264. package/dist/memory/projectManager.d.ts.map +1 -1
  265. package/dist/memory/projectManager.js +39 -189
  266. package/dist/memory/projectManager.js.map +1 -1
  267. package/dist/memory/projectRegistry.d.ts +14 -62
  268. package/dist/memory/projectRegistry.d.ts.map +1 -1
  269. package/dist/memory/projectRegistry.js +27 -111
  270. package/dist/memory/projectRegistry.js.map +1 -1
  271. package/dist/memory/roundStore.d.ts +629 -0
  272. package/dist/memory/roundStore.d.ts.map +1 -0
  273. package/dist/memory/roundStore.js +116 -0
  274. package/dist/memory/roundStore.js.map +1 -0
  275. package/dist/memory/sessionStore.d.ts +70 -61
  276. package/dist/memory/sessionStore.d.ts.map +1 -1
  277. package/dist/memory/sessionStore.js +23 -1
  278. package/dist/memory/sessionStore.js.map +1 -1
  279. package/dist/memory/sessionViewLoader.d.ts +141 -0
  280. package/dist/memory/sessionViewLoader.d.ts.map +1 -0
  281. package/dist/memory/sessionViewLoader.js +65 -0
  282. package/dist/memory/sessionViewLoader.js.map +1 -0
  283. package/dist/memory/sourceValidation.d.ts +10 -12
  284. package/dist/memory/sourceValidation.d.ts.map +1 -1
  285. package/dist/memory/sourceValidation.js +16 -32
  286. package/dist/memory/sourceValidation.js.map +1 -1
  287. package/dist/memory/storageInterface.d.ts +44 -150
  288. package/dist/memory/storageInterface.d.ts.map +1 -1
  289. package/dist/memory/types.d.ts +65 -164
  290. package/dist/memory/types.d.ts.map +1 -1
  291. package/dist/memory/types.js +81 -83
  292. package/dist/memory/types.js.map +1 -1
  293. package/dist/project-search/projectSearchProvider.d.ts +29 -0
  294. package/dist/project-search/projectSearchProvider.d.ts.map +1 -0
  295. package/dist/project-search/projectSearchProvider.js +57 -0
  296. package/dist/project-search/projectSearchProvider.js.map +1 -0
  297. package/dist/project-search/terms.d.ts +14 -0
  298. package/dist/project-search/terms.d.ts.map +1 -0
  299. package/dist/project-search/terms.js +68 -0
  300. package/dist/project-search/terms.js.map +1 -0
  301. package/dist/project-search/types.d.ts +139 -0
  302. package/dist/project-search/types.d.ts.map +1 -0
  303. package/dist/project-search/types.js +8 -0
  304. package/dist/project-search/types.js.map +1 -0
  305. package/dist/role-pack/capabilityMap.d.ts +28 -0
  306. package/dist/role-pack/capabilityMap.d.ts.map +1 -0
  307. package/dist/role-pack/capabilityMap.js +56 -0
  308. package/dist/role-pack/capabilityMap.js.map +1 -0
  309. package/dist/role-pack/constants.d.ts +21 -0
  310. package/dist/role-pack/constants.d.ts.map +1 -0
  311. package/dist/role-pack/constants.js +21 -0
  312. package/dist/role-pack/constants.js.map +1 -0
  313. package/dist/role-pack/rolePackManager.d.ts +269 -0
  314. package/dist/role-pack/rolePackManager.d.ts.map +1 -0
  315. package/dist/role-pack/rolePackManager.js +1082 -0
  316. package/dist/role-pack/rolePackManager.js.map +1 -0
  317. package/dist/role-pack/strategyKeys.d.ts +100 -0
  318. package/dist/role-pack/strategyKeys.d.ts.map +1 -0
  319. package/dist/role-pack/strategyKeys.js +184 -0
  320. package/dist/role-pack/strategyKeys.js.map +1 -0
  321. package/dist/role-pack/strategyResolver.d.ts +109 -0
  322. package/dist/role-pack/strategyResolver.d.ts.map +1 -0
  323. package/dist/role-pack/strategyResolver.js +304 -0
  324. package/dist/role-pack/strategyResolver.js.map +1 -0
  325. package/dist/role-pack/types.d.ts +237 -0
  326. package/dist/role-pack/types.d.ts.map +1 -0
  327. package/dist/role-pack/types.js +8 -0
  328. package/dist/role-pack/types.js.map +1 -0
  329. package/dist/role-pack/validator.d.ts +38 -0
  330. package/dist/role-pack/validator.d.ts.map +1 -0
  331. package/dist/role-pack/validator.js +436 -0
  332. package/dist/role-pack/validator.js.map +1 -0
  333. package/dist/security/pathGuard.d.ts +69 -72
  334. package/dist/security/pathGuard.d.ts.map +1 -1
  335. package/dist/security/pathGuard.js +151 -131
  336. package/dist/security/pathGuard.js.map +1 -1
  337. package/dist/skill/skillLayer3.d.ts +91 -0
  338. package/dist/skill/skillLayer3.d.ts.map +1 -0
  339. package/dist/skill/skillLayer3.js +104 -0
  340. package/dist/skill/skillLayer3.js.map +1 -0
  341. package/dist/skill/skillManager.d.ts +136 -19
  342. package/dist/skill/skillManager.d.ts.map +1 -1
  343. package/dist/skill/skillManager.js +312 -61
  344. package/dist/skill/skillManager.js.map +1 -1
  345. package/dist/skill/skillScriptRunner.d.ts +97 -0
  346. package/dist/skill/skillScriptRunner.d.ts.map +1 -0
  347. package/dist/skill/skillScriptRunner.js +271 -0
  348. package/dist/skill/skillScriptRunner.js.map +1 -0
  349. package/dist/skill/types.d.ts +73 -16
  350. package/dist/skill/types.d.ts.map +1 -1
  351. package/dist/skill/types.js +5 -1
  352. package/dist/skill/types.js.map +1 -1
  353. package/dist/utils/array.d.ts +5 -6
  354. package/dist/utils/array.d.ts.map +1 -1
  355. package/dist/utils/array.js +6 -6
  356. package/dist/utils/array.js.map +1 -1
  357. package/dist/utils/atomicWrite.d.ts +8 -0
  358. package/dist/utils/atomicWrite.d.ts.map +1 -0
  359. package/dist/utils/atomicWrite.js +31 -0
  360. package/dist/utils/atomicWrite.js.map +1 -0
  361. package/dist/utils/backgroundTask.d.ts +38 -0
  362. package/dist/utils/backgroundTask.d.ts.map +1 -0
  363. package/dist/utils/backgroundTask.js +117 -0
  364. package/dist/utils/backgroundTask.js.map +1 -0
  365. package/dist/utils/configResourceManager.d.ts +40 -72
  366. package/dist/utils/configResourceManager.d.ts.map +1 -1
  367. package/dist/utils/configResourceManager.js +78 -76
  368. package/dist/utils/configResourceManager.js.map +1 -1
  369. package/dist/utils/errors.d.ts +44 -69
  370. package/dist/utils/errors.d.ts.map +1 -1
  371. package/dist/utils/errors.js +54 -71
  372. package/dist/utils/errors.js.map +1 -1
  373. package/dist/utils/eventEmitter.d.ts +104 -103
  374. package/dist/utils/eventEmitter.d.ts.map +1 -1
  375. package/dist/utils/eventEmitter.js +37 -45
  376. package/dist/utils/eventEmitter.js.map +1 -1
  377. package/dist/utils/fileSafe.d.ts +20 -0
  378. package/dist/utils/fileSafe.d.ts.map +1 -0
  379. package/dist/utils/fileSafe.js +56 -0
  380. package/dist/utils/fileSafe.js.map +1 -0
  381. package/dist/utils/frontmatter.d.ts +2 -3
  382. package/dist/utils/frontmatter.d.ts.map +1 -1
  383. package/dist/utils/frontmatter.js +2 -3
  384. package/dist/utils/frontmatter.js.map +1 -1
  385. package/dist/utils/hash.d.ts +12 -0
  386. package/dist/utils/hash.d.ts.map +1 -0
  387. package/dist/utils/hash.js +27 -0
  388. package/dist/utils/hash.js.map +1 -0
  389. package/dist/utils/http.d.ts +17 -0
  390. package/dist/utils/http.d.ts.map +1 -0
  391. package/dist/utils/http.js +29 -0
  392. package/dist/utils/http.js.map +1 -0
  393. package/dist/utils/json.d.ts +1 -1
  394. package/dist/utils/json.js +1 -1
  395. package/dist/utils/math.d.ts +25 -3
  396. package/dist/utils/math.d.ts.map +1 -1
  397. package/dist/utils/math.js +32 -16
  398. package/dist/utils/math.js.map +1 -1
  399. package/dist/utils/objects.d.ts +2 -3
  400. package/dist/utils/objects.d.ts.map +1 -1
  401. package/dist/utils/objects.js +2 -3
  402. package/dist/utils/objects.js.map +1 -1
  403. package/dist/utils/recallDefaults.d.ts +16 -0
  404. package/dist/utils/recallDefaults.d.ts.map +1 -0
  405. package/dist/utils/recallDefaults.js +16 -0
  406. package/dist/utils/recallDefaults.js.map +1 -0
  407. package/dist/utils/safeTimer.d.ts +8 -36
  408. package/dist/utils/safeTimer.d.ts.map +1 -1
  409. package/dist/utils/safeTimer.js +9 -37
  410. package/dist/utils/safeTimer.js.map +1 -1
  411. package/dist/utils/scanner.d.ts +97 -17
  412. package/dist/utils/scanner.d.ts.map +1 -1
  413. package/dist/utils/scanner.js +269 -47
  414. package/dist/utils/scanner.js.map +1 -1
  415. package/dist/utils/segmenter.d.ts +20 -19
  416. package/dist/utils/segmenter.d.ts.map +1 -1
  417. package/dist/utils/segmenter.js +230 -97
  418. package/dist/utils/segmenter.js.map +1 -1
  419. package/dist/utils/strings.d.ts +15 -32
  420. package/dist/utils/strings.d.ts.map +1 -1
  421. package/dist/utils/strings.js +25 -44
  422. package/dist/utils/strings.js.map +1 -1
  423. package/dist/utils/time.d.ts +37 -0
  424. package/dist/utils/time.d.ts.map +1 -1
  425. package/dist/utils/time.js +56 -0
  426. package/dist/utils/time.js.map +1 -1
  427. package/dist/utils/toError.d.ts +13 -1
  428. package/dist/utils/toError.d.ts.map +1 -1
  429. package/dist/utils/toError.js +18 -1
  430. package/dist/utils/toError.js.map +1 -1
  431. package/dist/web-fetch/fetchWebFetchProvider.d.ts +14 -0
  432. package/dist/web-fetch/fetchWebFetchProvider.d.ts.map +1 -0
  433. package/dist/web-fetch/fetchWebFetchProvider.js +69 -0
  434. package/dist/web-fetch/fetchWebFetchProvider.js.map +1 -0
  435. package/dist/web-fetch/types.d.ts +30 -0
  436. package/dist/web-fetch/types.d.ts.map +1 -0
  437. package/dist/web-fetch/types.js +7 -0
  438. package/dist/web-fetch/types.js.map +1 -0
  439. package/dist/web-fetch/webFetchProvider.d.ts +10 -0
  440. package/dist/web-fetch/webFetchProvider.d.ts.map +1 -0
  441. package/dist/web-fetch/webFetchProvider.js +28 -0
  442. package/dist/web-fetch/webFetchProvider.js.map +1 -0
  443. package/dist/web-search/fetchWebSearchProvider.d.ts +27 -0
  444. package/dist/web-search/fetchWebSearchProvider.d.ts.map +1 -0
  445. package/dist/web-search/fetchWebSearchProvider.js +199 -0
  446. package/dist/web-search/fetchWebSearchProvider.js.map +1 -0
  447. package/dist/web-search/types.d.ts +46 -0
  448. package/dist/web-search/types.d.ts.map +1 -0
  449. package/dist/web-search/types.js +2 -0
  450. package/dist/{persona → web-search}/types.js.map +1 -1
  451. package/dist/web-search/webSearchProvider.d.ts +10 -0
  452. package/dist/web-search/webSearchProvider.d.ts.map +1 -0
  453. package/dist/web-search/webSearchProvider.js +30 -0
  454. package/dist/web-search/webSearchProvider.js.map +1 -0
  455. package/docs/architecture/role-pack-authoring-guide.md +243 -0
  456. package/docs/architecture/role-pack-spec.md +767 -0
  457. package/docs/memora-api-reference.md +416 -476
  458. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +841 -806
  459. package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -0
  460. package/package.json +105 -100
  461. package/role-packs/README.md +41 -0
  462. package/role-packs/memora/345/212/251/346/211/213/manifest.json +12 -0
  463. package/role-packs/memora/345/212/251/346/211/213/persona.md +12 -0
  464. package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -0
  465. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +44 -0
  466. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -0
  467. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +15 -0
  468. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/character-sheet.md +34 -0
  469. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/core-extractor.md +37 -0
  470. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/craft-review.md +69 -0
  471. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/dialogue-craft.md +45 -0
  472. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -0
  473. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/empathy-craft.md +79 -0
  474. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -0
  475. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/hotspot-mapping.md +121 -0
  476. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/idea-lever.md +42 -0
  477. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/logline-craft.md +47 -0
  478. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/longform-guard.md +64 -0
  479. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/need-finder.md +40 -0
  480. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +46 -0
  481. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pacing-hook.md +34 -0
  482. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/polish-method.md +113 -0
  483. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pov-discipline.md +79 -0
  484. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/SKILL.md +112 -0
  485. 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 +441 -0
  486. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/relationship-web.md +47 -0
  487. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/scene-craft.md +46 -0
  488. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +60 -0
  489. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-structure.md +36 -0
  490. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/style-weaver.md +109 -0
  491. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/three-layer-check.md +27 -0
  492. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/world-builder.md +41 -0
  493. 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 +48 -0
  494. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/persona.md +73 -0
  495. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/rules.md +19 -0
  496. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/api-doc-writer.md +40 -0
  497. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/doc-planner.md +42 -0
  498. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/nutrient-search.md +28 -0
  499. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/seed-finder.md +28 -0
  500. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/ssot-audit.md +34 -0
  501. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/style-guide.md +40 -0
  502. package/dist/agent/guardrail.d.ts +0 -49
  503. package/dist/agent/guardrail.d.ts.map +0 -1
  504. package/dist/agent/guardrail.js +0 -59
  505. package/dist/agent/guardrail.js.map +0 -1
  506. package/dist/agent/managers/autoConfigRefiner.d.ts +0 -39
  507. package/dist/agent/managers/autoConfigRefiner.d.ts.map +0 -1
  508. package/dist/agent/managers/autoConfigRefiner.js +0 -146
  509. package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
  510. package/dist/agent/managers/configManager.d.ts +0 -209
  511. package/dist/agent/managers/configManager.d.ts.map +0 -1
  512. package/dist/agent/managers/configManager.js +0 -331
  513. package/dist/agent/managers/configManager.js.map +0 -1
  514. package/dist/agent/managers/insightExtractor.d.ts +0 -139
  515. package/dist/agent/managers/insightExtractor.d.ts.map +0 -1
  516. package/dist/agent/managers/insightExtractor.js +0 -401
  517. package/dist/agent/managers/insightExtractor.js.map +0 -1
  518. package/dist/agent/managers/memoryDecayScheduler.d.ts +0 -239
  519. package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
  520. package/dist/agent/managers/memoryDecayScheduler.js +0 -413
  521. package/dist/agent/managers/memoryDecayScheduler.js.map +0 -1
  522. package/dist/agent/managers/relationBuilder.d.ts +0 -131
  523. package/dist/agent/managers/relationBuilder.d.ts.map +0 -1
  524. package/dist/agent/managers/relationBuilder.js +0 -192
  525. package/dist/agent/managers/relationBuilder.js.map +0 -1
  526. package/dist/agent/personaMatcher.d.ts +0 -29
  527. package/dist/agent/personaMatcher.d.ts.map +0 -1
  528. package/dist/agent/personaMatcher.js +0 -60
  529. package/dist/agent/personaMatcher.js.map +0 -1
  530. package/dist/agent/userFactExtractor.d.ts +0 -25
  531. package/dist/agent/userFactExtractor.d.ts.map +0 -1
  532. package/dist/agent/userFactExtractor.js +0 -88
  533. package/dist/agent/userFactExtractor.js.map +0 -1
  534. package/dist/eval/evalRunner.d.ts +0 -94
  535. package/dist/eval/evalRunner.d.ts.map +0 -1
  536. package/dist/eval/evalRunner.js +0 -141
  537. package/dist/eval/evalRunner.js.map +0 -1
  538. package/dist/eval/evalTypes.d.ts +0 -148
  539. package/dist/eval/evalTypes.d.ts.map +0 -1
  540. package/dist/eval/evalTypes.js +0 -118
  541. package/dist/eval/evalTypes.js.map +0 -1
  542. package/dist/eval/scenarios.d.ts +0 -33
  543. package/dist/eval/scenarios.d.ts.map +0 -1
  544. package/dist/eval/scenarios.js +0 -109
  545. package/dist/eval/scenarios.js.map +0 -1
  546. package/dist/llm/embedding.d.ts +0 -79
  547. package/dist/llm/embedding.d.ts.map +0 -1
  548. package/dist/llm/embedding.js +0 -184
  549. package/dist/llm/embedding.js.map +0 -1
  550. package/dist/memory/hybridMerge.d.ts +0 -50
  551. package/dist/memory/hybridMerge.d.ts.map +0 -1
  552. package/dist/memory/hybridMerge.js +0 -51
  553. package/dist/memory/hybridMerge.js.map +0 -1
  554. package/dist/memory/inMemoryRelationStore.d.ts +0 -58
  555. package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
  556. package/dist/memory/inMemoryRelationStore.js +0 -80
  557. package/dist/memory/inMemoryRelationStore.js.map +0 -1
  558. package/dist/memory/loader.d.ts +0 -51
  559. package/dist/memory/loader.d.ts.map +0 -1
  560. package/dist/memory/loader.js +0 -100
  561. package/dist/memory/loader.js.map +0 -1
  562. package/dist/memory/recall.d.ts +0 -82
  563. package/dist/memory/recall.d.ts.map +0 -1
  564. package/dist/memory/recall.js +0 -157
  565. package/dist/memory/recall.js.map +0 -1
  566. package/dist/memory/relationStore.d.ts +0 -95
  567. package/dist/memory/relationStore.d.ts.map +0 -1
  568. package/dist/memory/relationStore.js +0 -2
  569. package/dist/memory/relationStore.js.map +0 -1
  570. package/dist/memory/store.d.ts +0 -71
  571. package/dist/memory/store.d.ts.map +0 -1
  572. package/dist/memory/store.js +0 -199
  573. package/dist/memory/store.js.map +0 -1
  574. package/dist/memory/userProfile.d.ts +0 -180
  575. package/dist/memory/userProfile.d.ts.map +0 -1
  576. package/dist/memory/userProfile.js +0 -381
  577. package/dist/memory/userProfile.js.map +0 -1
  578. package/dist/memory/vectorStore.d.ts +0 -179
  579. package/dist/memory/vectorStore.d.ts.map +0 -1
  580. package/dist/memory/vectorStore.js +0 -284
  581. package/dist/memory/vectorStore.js.map +0 -1
  582. package/dist/persona/personaManager.d.ts +0 -109
  583. package/dist/persona/personaManager.d.ts.map +0 -1
  584. package/dist/persona/personaManager.js +0 -315
  585. package/dist/persona/personaManager.js.map +0 -1
  586. package/dist/persona/types.d.ts +0 -32
  587. package/dist/persona/types.d.ts.map +0 -1
  588. package/dist/persona/types.js +0 -5
@@ -1,112 +1,127 @@
1
1
  /**
2
2
  * Agent 流式输出事件类型
3
3
  *
4
- * 核心库向上层 emit 结构化事件,让 CLI/Web/TUI 等宿主项目
5
- * 能区分"思考中"、"输出文本"、"调用工具"等阶段,给用户实时反馈。
6
- *
7
- * 自然生长原则:这是核心库的"机制"——所有宿主项目都需要进度反馈,
8
- * 不是 demo 的"策略"。
9
- *
10
- * thinking 事件的 phase 取值:
11
- * - 'recalling':正在召回会话记忆(recall 双通道:语义 + 关键词)
12
- * - 'processing':正在写入历史/注入技能 prompt
13
- * - 'archiving':正在归档用户画像/匹配角色/匹配技能
14
- *
15
- * error 事件:流式过程中发生错误(如 LLM 超时、连接断开),
16
- * 替代裸 throw 让宿主能优雅展示错误并清理 UI(避免未处理 rejection 静默卡死)。
17
- *
18
- * ─── agent/ 模块依赖图(最后更新:2026-07-16) ─────────────────
19
- * 如需精确依赖关系,请阅读各文件 import 语句。本图仅展示高层模块关系。
20
- *
21
- * agent.ts(门面,Agent 类)
22
- * ├─ assembler.ts(组件装配,init 阶段)
23
- * ├─ loop.ts(主循环,chat 阶段)
24
- * │ ├─ toolExecutor.ts(工具执行)
25
- * │ ├─ contextManager.ts(上下文窗口管理)
26
- * │ ├─ messageHistory.ts(历史消息存储)
27
- * │ ├─ guardrail.ts(护栏规则)
28
- * │ └─ tracer.ts(可观测性 span)
29
- * ├─ personaMatcher.ts(LLM 角色匹配,从 persona 迁入)
30
- * ├─ userFactExtractor.ts(用户事实提取,纯函数)
31
- * ├─ builtinToolHandlers.ts(内置工具处理器)
32
- * └─ managers/(12 个专职 Manager)
33
- * ├─ chatLockManager.ts(并发锁,token 机制)
34
- * ├─ configManager.ts(配置加载)
35
- * ├─ contextManager.ts(上下文管理)
36
- * ├─ insightExtractor.ts(LLM 提炼,prompt 独立函数)
37
- * ├─ memoryInspector.ts(记忆读写统一入口,ADR-014)
38
- * ├─ memoryDecayScheduler.ts(记忆衰减调度)
39
- * ├─ memoryAdvisor.ts(记忆建议)
40
- * ├─ relationBuilder.ts(记忆关系构建,ADR-014 侧车)
41
- * ├─ archiveCoordinator.ts(归档协调,emit archiveFailed)
42
- * ├─ sessionArchiver.ts(会话归档)
43
- * ├─ sessionManager.ts(会话状态)
44
- * ├─ textPolishManager.ts(文本润色)
45
- * ├─ autoConfigRefiner.ts(配置自动优化)
46
- * └─ workProjection.ts(作品投影)
47
- *
48
- * 分层依赖方向(ADR-008):
49
- * agent/ → memory/ → storage/(不可反向)
50
- * agent/ → persona/(不可反向,persona 不调 LLM)
51
- * agent/ → llm/(provider 注入)
52
- * agent/ → skill/(技能加载)
53
- * agent/ → config/(配置加载)
54
- * ──────────────────────────────────────────────────────────
4
+ * 核心库向上层 emit 结构化事件,让宿主区分思考/输出/调用工具等阶段——
5
+ * error 事件替代裸 throw,让宿主优雅展示错误并清理 UI(避免未处理 rejection 静默卡死)。
55
6
  */
7
+ /** 工具调用元素契约(OpenAI 协议结构)——单一真源,供 ChatMessage.toolCalls 引用 */
8
+ import type { ToolCall } from '../llm/types.js';
56
9
  /** thinking 事件的阶段标识 */
57
- export type ThinkingPhase = 'recalling' | 'processing' | 'archiving';
58
- /**
59
- * 召回记忆摘要(用于 UI 展示"召回透明度")
60
- *
61
- * 仅暴露 UI 展示所需字段,不包含 content(避免向 UI 层泄露完整记忆内容)。
62
- * - name:可读名称,点击跳转记忆详情
63
- * - score:相似度分数(0-1),展示召回质量
64
- * - source:来源标签,可选展示(如 rule/insight/profile)
65
- */
66
- export interface RecalledMemorySummary {
67
- /** 记忆唯一标识(source:name 格式,用于前端精准跳转详情) */
68
- id: string;
69
- /** 记忆可读名称(点击跳转记忆详情用) */
70
- name: string;
71
- /** 相似度分数(0-1) */
72
- score: number;
73
- /** 来源标签(开放字符串,如 'rule'、'insight'、'profile') */
74
- source: string;
75
- }
76
- export type AgentChunk = {
77
- type: 'recall';
78
- memories: RecalledMemorySummary[];
79
- } | {
10
+ export type ThinkingPhase = 'assembling' | 'processing' | 'archiving' | 'llm_calling';
11
+ /** turn 归属标记:chunk 携带所在 turn roundId(SSOT:过程事件归属由内核唯一提供,
12
+ * 宿主据此把 ProcessEvent 落盘到正确的 Round,不再依赖「roundIds 末尾」推断当前轮) */
13
+ export type RoundTagged = {
14
+ roundId?: string;
15
+ };
16
+ export type AgentChunk = ({
80
17
  type: 'thinking';
81
18
  phase: ThinkingPhase;
82
19
  } | {
83
20
  type: 'text';
84
21
  content: string;
85
22
  /**
86
- * 护栏阻断标志(结构化信号)
87
- *
88
- * 当输入/输出被护栏规则阻断时为 true,让 eval 框架和宿主 UI
89
- * 能通过结构化字段判断护栏触发,而非依赖文案子串匹配。
90
- * 非护栏场景的普通 text chunk 不携带此字段(undefined 等同 false)。
23
+ * 文本阶段标识:'self_review' 为自审查应答(机制层区分,供宿主分段渲染——
24
+ * 自审查输出与最终回答分离展示,不再混入同一消息流);缺省/'answer' 为正常交付。
25
+ * 仅标识不改变内容语义,历史落库仍按整轮拼接。
91
26
  */
92
- guardrailBlocked?: boolean;
93
- } | {
27
+ stage?: TextChunkStage;
28
+ }
29
+ /**
30
+ * 工具调用开始(Runtime 确定执行、参数已完成)。stepIndex = 所属 step 的轮内序号(与 thought
31
+ * 同构,loop 单点打标);tool_result **不重复盖章**——经 toolCallId 归属本条(事实单点,防双写)。
32
+ */
33
+ | {
94
34
  type: 'tool_start';
95
35
  toolCallId: string;
96
36
  name: string;
97
37
  args?: string;
38
+ stepIndex?: number;
98
39
  } | {
99
40
  type: 'tool_result';
100
41
  toolCallId: string;
101
42
  name: string;
102
43
  ok: boolean;
103
44
  summary?: string;
104
- } | {
45
+ /**
46
+ * 策略拦截标记:工具被内核确定性拒绝(如 web_search 达硬上限),
47
+ * 未实际执行。ok=false + blocked=true:区别于「执行失败」,UI 显示「已拦截」,
48
+ * 不计成功数亦不计失败数;LLM 收到的是拒绝文案而非真实结果。
49
+ */
50
+ blocked?: boolean;
51
+ }
52
+ /**
53
+ * 模型思考内容流:LLM 的 reasoning_content 增量片段。
54
+ * 仅供宿主折叠展示,**不进正文/记忆**(CoT 防护);落盘走 ProcessEvent(roundStore.ts
55
+ * `type: 'thought'` 成员),重启重放可见。瞬态流:中断不补发。命名用 thought,与多模型
56
+ * 路由任务类型 `TaskType='reasoning'`、ProcessEvent 既有相位 `type:'thinking'` 语义分离。
57
+ * stepIndex = 本条思考所属 step(一次 LLM 调用 + 可选工具执行)的轮内序号,由 loop 打标
58
+ * (withStepIndex 单点),随内容落盘供「一个 step 一个思考折叠块」分桶;缺省 = 无归属。
59
+ */
60
+ | {
61
+ type: 'thought';
62
+ content: string;
63
+ stepIndex?: number;
64
+ }
65
+ /**
66
+ * 工具意图预告:LLM 流式生成 tool_call 参数期间(name 一成形即触发),
67
+ * 工具**尚未执行**。与 tool_start 的区别:start 表示 Runtime 确定要执行(参数已完成);
68
+ * pending 让宿主提前渲染「准备中」工具行,消除大参数工具(如 write_file 全量写入)
69
+ * 数十秒参数生成段的 UI 真空。瞬态展示轨:**不落 ProcessEvent、不进正文/记忆**,
70
+ * 中断或收尾后由折叠区重建自然消失。非流式 name 缺失时 toolCallId 可为空串。
71
+ */
72
+ | {
73
+ type: 'tool_pending';
74
+ toolCallId?: string;
75
+ name: string;
76
+ }
77
+ /**
78
+ * 过程叙述:LLM 在工具迭代前产出的行动叙述文本
79
+ * (如「让我先查看所有文档」「现在逐一读取它们的内容」)。
80
+ * 与 text(回答正文)语义分离:narrate 只供宿主渲染「过程叙述」折叠行,
81
+ * 不进入最终回答正文(consumeExecutionStream 不将其拼入 content)。
82
+ */
83
+ | {
84
+ type: 'narrate';
85
+ content: string;
86
+ /**
87
+ * 回抽:content 中曾逐字流式进正文区的那一段**原文**。
88
+ *
89
+ * 成因:首轮(无工具史)消息级分类前无法预判是否工具轮,为保 TTFT 零损失,文本先实时
90
+ * 流式进正文;收到 toolCalls 后才确认为过程叙述。本字段让消费者先把该段从正文
91
+ * 撤回(内核扣持久化正文 / 宿主移正文渲染),再按叙述渲染 content——首轮与后续轮同构。
92
+ * 契约:该段为「最近追加的正文文本」(后缀),消费者按后缀精确匹配撤回。
93
+ *
94
+ * 仅运行时消费(瞬态):不落 ProcessEvent、不持久化;重放的一致由 Round.assistantMessage
95
+ * 已在持久化侧扣除该段保证(consumer = Agent.consumeExecutionStream)。
96
+ */
97
+ withdrawn?: string;
98
+ }
99
+ /**
100
+ * 中断(aborted chunk 的语义分类)
101
+ *
102
+ * stopReason 由内核在产生点按真实触因唯一判定,宿主按语义映射友好文案(与 error.category 同构):
103
+ * - 'user':宿主 signal / 插话控制器真 abort(用户主动停止或插话介入)
104
+ * - 'timeout':chat 锁超时 / LLM 无响应超时中断(signal.reason 为 TimeoutError,区别于用户取消)
105
+ * - 'interrupted':预留语义(流式中断;当前无产生点,未来场景分化时启用)
106
+ * - 'connection':预留语义(连接中断已由 error chunk category:'connection' 捕获,不在此重复)
107
+ * 无 stopReason(旧数据/直接构造)时宿主回退 reason 原文,保持兼容。
108
+ */
109
+ | {
105
110
  type: 'aborted';
106
111
  reason: string;
107
- } | {
112
+ stopReason?: AbortStopReason;
113
+ }
114
+ /**
115
+ * 流式错误(error chunk 的分类字段)
116
+ *
117
+ * 类别由内核唯一判定(Signal 未 abort 却抛 AbortError = 'connection' 等),
118
+ * 宿主按 category 映射友好展示文案;无 category(null)时宿主回退原始 message,
119
+ * 保留调试可追溯性。不承载裸前缀(如 `[连接中断]`)——语义分类走结构化字段。
120
+ */
121
+ | {
108
122
  type: 'error';
109
123
  message: string;
124
+ category?: LlmErrorCategory;
110
125
  } | {
111
126
  type: 'retry';
112
127
  attempt: number;
@@ -114,78 +129,346 @@ export type AgentChunk = {
114
129
  delayMs: number;
115
130
  error: string;
116
131
  } | {
117
- type: 'done';
118
- };
132
+ type: 'paused';
133
+ }
134
+ /**
135
+ * 主动提问(ask_user 工具):LLM 调 ask_user 时 yield,
136
+ * Agent 暂停等用户在提问框回答;用户回答经 answerQuestion 回填后 continueAfterPause 续跑(非 Trigger)。
137
+ */
138
+ | {
139
+ type: 'question_pending';
140
+ questions: AskQuestion[];
141
+ }
142
+ /**
143
+ * 自审查终审开始信号:注入自审查提示前 emit(单次终审,无轮次参数)
144
+ */
145
+ | {
146
+ type: 'selfReview';
147
+ }
148
+ /**
149
+ * 任务项级折叠边界:迭代完成且 active 任务项**推进**时 emit。
150
+ * 宿主据此把后续过程事件(narrate/tool/问答)归到对应任务项分组下渲染;无任务表不产。
151
+ * planItemId 为推进到的新 active 任务项 ID,title 为该任务项标题(供分组 summary 展示)。
152
+ */
153
+ | {
154
+ type: 'plan_item_boundary';
155
+ planItemId?: string;
156
+ title?: string;
157
+ }
119
158
  /**
120
- * 宿主可覆盖的 UI 消息文本
159
+ * 迭代边界(迭代原子落盘):**一次 LLM 迭代结束**时无条件 emit。
160
+ *
161
+ * 与 `plan_item_boundary` 的关系(两个信号各归其阵营,术语不撞车):
162
+ * - `plan_item_boundary` = **任务项推进**(有任务表且 active 任务项变化才产,无任务表静默),职责是
163
+ * webview 任务项级折叠的**分组依据**;
164
+ * - `step_boundary` = **迭代完成**(与有无任务表、有无工具无关),职责是宿主**增量落盘的时机信号**
165
+ * (落盘不能只挂在 plan_item_boundary 上——无任务表的长工具循环会零增量落盘,该场景由本信号覆盖)。
121
166
  *
122
- * 核心库内置英文默认值,宿主可通过 AgentOptions.messages
123
- * 覆盖为任意语言(中文/日文/自定义)。
167
+ * 顺序契约(定案锚 ADR-034):`plan_item_boundary` 产于**迭代开始**(它所罩住的思考与工具
168
+ * 之前),本 chunk 产于**迭代尾** → 二者天然保持先后序,保证宿主本轮落盘快照已含该任务项
169
+ * 折叠边界,崩溃重放不错位。若二者同产在迭代尾,每个任务项的首个迭代会掉出折叠块。
170
+ *
171
+ * 瞬态信号:**不落 ProcessEvent**(不是历史内容,只是「此刻该落盘」的触发点),
172
+ * `Round.processEvents` / schema 零改动。
173
+ */
174
+ | {
175
+ type: 'step_boundary';
176
+ } | {
177
+ type: 'done';
178
+ }) & RoundTagged;
179
+ /**
180
+ * 中断语义分类:'user' = 用户主动停止/插话;'interrupted'/'connection' 为预留语义(当前无产生点)。
181
+ */
182
+ export type AbortStopReason = 'user' | 'timeout' | 'interrupted' | 'connection';
183
+ /**
184
+ * 流式错误语义分类(error chunk 的 category 字段)—— **具名类型 = 跨层单一真理源**。
124
185
  *
125
- * 遵循领域无关原则:核心库不耦合特定语言。
186
+ * 两个消费面共用同一份字面量集合,故必须同名同源(各写一份会静默漂移):
187
+ * 1. 实时:`AgentChunk.error.category`(本文件)→ 宿主映射友好文案;
188
+ * 2. 重放:`ProcessEvent` 的 `error` 变体(`memory/roundStore.ts`)→ 回看历史时呈现失败原因。
189
+ * 与 `AbortStopReason` 的分工:aborted 答「谁让它停的」(signal 触因),error 答「出了什么错」,
190
+ * 两者语义不同、**禁互相承载**(见上方 aborted 的 'connection' 预留说明)。
191
+ */
192
+ export type LlmErrorCategory = 'connection' | 'timeout' | 'unknown';
193
+ /**
194
+ * 文本块阶段标识:供宿主区分正常交付与自审查应答,做独立分段展示。
195
+ * - 'answer':正常回答(缺省值)
196
+ * - 'self_review':自审查轮应答(满意确认或修订输出)
197
+ */
198
+ export type TextChunkStage = 'answer' | 'self_review';
199
+ /**
200
+ * 宿主可覆盖的 UI 消息文本。核心库内置英文默认值,宿主通过 AgentOptions.messages
201
+ * 覆盖为任意语言(领域无关原则:核心库不耦合特定语言)。
126
202
  */
127
203
  export interface UIMessages {
128
204
  /** 对话取消提示(默认 "User cancelled the conversation") */
129
205
  abortedByUser?: string;
206
+ /** 锁超时/LLM 无响应中断提示(默认 "LLM request timed out (no response)") */
207
+ abortedByTimeout?: string;
130
208
  /** 达到最大迭代次数提示(默认 "\n\n[Max iterations reached]") */
131
209
  maxIterationsReached?: string;
132
- /**
133
- * 流式中断标记(默认 "\n\n[已中断]")
134
- *
135
- * 流式输出被用户中断时,已生成的部分文本仍会写入历史,
136
- * 此标记追加到文本末尾,让下一轮 LLM 上下文和历史归档能识别中断响应。
137
- * 与 maxIterationsReached 性质相同(对话末尾状态标记)。
138
- */
210
+ /** 流式中断标记(默认 "\n\n[已中断]"):中断时已生成文本仍写历史,此标记追加到末尾供下轮识别 */
139
211
  interrupted?: string;
140
- /**
141
- * 上下文窗口截断提示生成函数
142
- * @param skipped 被裁剪的消息数
143
- * @param kept 保留的消息数
144
- * @returns 系统消息内容
145
- */
212
+ /** 上下文窗口截断提示生成函数 */
146
213
  contextTruncated?: (skipped: number, kept: number) => string;
214
+ /** 软上限收尾信号(默认内置中文提示):摘要层达容量上限时注入,让 LLM 收敛产出最终交付 */
215
+ softLimitWrapup?: string;
147
216
  /** 最近对话标签(默认 "[Recent conversation]") */
148
217
  recentConversationLabel?: string;
149
218
  /** 用户角色标签(默认 "User") */
150
219
  userLabel?: string;
151
220
  /** 助手角色标签(默认 "Assistant") */
152
221
  assistantLabel?: string;
153
- /** 护栏阻断提示模板({rule} 会被替换为规则名) */
154
- inputBlockedByGuard?: (rule: string) => string;
155
- /** 护栏警告前缀(默认 "[Guardrail Warning]") */
156
- guardrailWarningPrefix?: string;
157
- /** 输出被护栏阻断提示模板 */
158
- outputBlockedByGuard?: (rule: string) => string;
222
+ /** Reflection 提示生成函数:工具调用失败且可重试时追加,帮 LLM 聚焦修正 */
223
+ reflectionHint?: (remaining: number) => string;
224
+ /** 自审查提示生成函数:注入后让 LLM 审查自身回复质量(单次终审:一轮即止,无需轮次参数) */
225
+ selfReviewPrompt?: () => string;
226
+ /** 重复工具调用负反馈提示:连续多次相同工具+参数时注入,防止死循环 */
227
+ duplicateToolCallWarning?: (threshold: number) => string;
228
+ /** LLM 空响应兜底提示(无文本无工具调用时使用,默认英文) */
229
+ emptyResponseFallback?: string;
159
230
  /**
160
- * Reflection(反思/自修正)提示生成函数
161
- *
162
- * 工具调用失败且错误可重试时,在 LLM 上下文中追加此提示,帮助 LLM 聚焦于修正而非放弃。
163
- *
164
- * @param remaining 剩余反思次数
165
- * @returns 系统消息内容
231
+ * LLM 空响应兜底提示 · 截断型生成函数(默认英文)。
232
+ * 判据:空响应且末次尝试 finishReason='length'(思考/生成吃满输出预算)——与瞬态型
233
+ * (无 finishReason 或非 'length',中转不回传即降级此口径)分型展示,文案可指导动作。
234
+ * @param attempts 空响应结论前的 chat 尝试总数(1 次首试 + N 次自动重试)——文案口径用
235
+ * 「尝试 N 次」(勿写「重试 N 次」:重试次数 = attempts - 1,写「重试」恒多报 1)
166
236
  */
167
- reflectionHint?: (remaining: number) => string;
237
+ emptyResponseFallbackTruncated?: (attempts: number) => string;
168
238
  }
169
239
  /**
170
- * Agent 归档模式三态控制
171
- *
172
- * 详见 ADR-015-archive-mode.md。
173
- *
174
- * - `full`(默认):profile facts + insight + 对话原始内容(会话归档预留)全部自动归档
175
- * - `insights-only`:profile facts + insight 自动归档,对话原始内容需手动归档
176
- * - `manual`:所有归档都需手动触发,postProcess 跳过所有自动归档分支
240
+ * 归档模式二态:'full'(默认,content 在会话切换前自动归档)/'manual'(全部手动触发,
241
+ * postProcess 跳过所有自动归档分支)。
242
+ */
243
+ export type ArchiveMode = 'full' | 'manual';
244
+ /** 会话状态(三态状态机) */
245
+ export type SessionStatus = 'running' | 'paused' | 'error';
246
+ /** 计划中单个任务项,用于目标漂移检测(文本相似度)和进度追踪 */
247
+ export interface PlanItem {
248
+ /** 任务项唯一标识 */
249
+ id: string;
250
+ /** 任务项描述 */
251
+ description: string;
252
+ /** 任务项状态 */
253
+ status: 'pending' | 'active' | 'done' | 'blocked';
254
+ /** 执行顺序(从 0 开始) */
255
+ order: number;
256
+ /**
257
+ * 会议用:该任务项的表层装配角色(组长或组员)。仅会议内临时生效,不改 activePack——
258
+ * prepare 期经 RolePackManager.resolveRoundAssemblyRole 范围校验(∈ {组长} ∪ {组员},越界忽略 + warning)。
259
+ * 缺失/旧检查点走缺省 undefined(非会议)。
260
+ */
261
+ rolePack?: string;
262
+ }
263
+ /** 一次 LLM 迭代(step)的执行结果,注入时标「非当前指令」防 LLM 误执行 */
264
+ export interface PlanItemOutcome {
265
+ /** 关联任务项 ID(可为空 = 自由对话的迭代推进) */
266
+ planItemId?: string;
267
+ /** step 摘要(LLM 单句或截断) */
268
+ summary: string;
269
+ /** 完成时间戳 */
270
+ completedAt: number;
271
+ }
272
+ /** 暂停来源(唯一真源):供 PauseMeta 与 SessionStateMachine 共用,防类型级双轨漂移 */
273
+ export type PauseSource = 'user' | 'agent' | 'system';
274
+ /** 暂停上下文,用于渲染层展示和恢复决策 */
275
+ export interface PauseMeta {
276
+ /** 暂停原因 */
277
+ reason: string;
278
+ /** 暂停来源(引用 PauseSource,与 SessionStateMachine 同源) */
279
+ source: PauseSource;
280
+ }
281
+ /**
282
+ * 工具幂等性级别:
283
+ * - 'idempotent':写后状态确定、可安全重跑(如 task_table_update),跳过回喂缓存摘要
284
+ * - 'idempotent-key':依赖业务唯一键实现幂等(写操作,如 write_file / register_work)
285
+ * - 'non-idempotent':非幂等,需补偿机制兜底;另承担「禁止跳过」语义
286
+ * - 'read-only':读/查询类,目标态可被外部改动(写工具/时间),永不跳过——跳过回喂
287
+ * 陈旧结果会误导 LLM;重跑无害且无需去重持久化
288
+ */
289
+ export type IdempotencyLevel = 'idempotent' | 'idempotent-key' | 'non-idempotent' | 'read-only';
290
+ /** 记录已执行的工具调用,以工具名+参数签名唯一标识;恢复时检查 outbox 模式避免重复执行 */
291
+ export interface ToolExecutionRecord {
292
+ /** 工具名称 */
293
+ name: string;
294
+ /** 参数签名(JSON 字符串化,用于精确匹配) */
295
+ argsSignature: string;
296
+ /** 执行时间戳 */
297
+ executedAt: number;
298
+ /** 执行结果摘要(前 100 字符) */
299
+ resultSummary: string;
300
+ /** 工具执行是否成功 */
301
+ ok: boolean;
302
+ /** 幂等级别(决定恢复时是否跳过重复执行) */
303
+ idempotent?: IdempotencyLevel;
304
+ }
305
+ /**
306
+ * 热记忆中的聊天消息,结构对齐 LLM Message(不含时间戳,与 SessionMessage 区分),
307
+ * 仅保留 role + content 用于 LLM 上下文注入。role 从 memory/types.ts 导入(SSOT)。
308
+ */
309
+ export interface ChatMessage {
310
+ /** 消息角色 */
311
+ role: MessageRole;
312
+ /** 消息内容 */
313
+ content: string;
314
+ /** 来源名称(与 LLM Message.name 对齐) */
315
+ name?: string;
316
+ /** 工具调用(assistant 消息)——形状真源 llm/types.ToolCall(与 toolRunner 同源,单契约) */
317
+ toolCalls?: Array<ToolCall>;
318
+ /** 工具调用 ID(tool 消息) */
319
+ toolCallId?: string;
320
+ }
321
+ /**
322
+ * 会话检查点,不中断工作模型的核心状态载体。纯内存态快照(
323
+ * 不落盘、无序列化/恢复路径——中止/断电走「中断轮补全为完整 turn」,运行时暂停同 turn 内存续跑)。
324
+ * 三态:running / paused(主动暂停)/ error(异常,独立可见不自动转 PAUSED,保留 cause 供检查,
325
+ * 恢复前须校验 error.recovered===true 且 cause 已解除)。
326
+ */
327
+ export interface SessionCheckpoint {
328
+ /** 会话唯一标识 */
329
+ sessionId: string;
330
+ /** 三态状态(ERROR 独立可见) */
331
+ status: SessionStatus;
332
+ /** 异常原因(仅 status==='error' 时有值,恢复前校验 recovered) */
333
+ error?: {
334
+ /** 异常原因描述 */
335
+ cause: string;
336
+ /** 异常发生时间戳(毫秒) */
337
+ at: number;
338
+ /** 是否已恢复(ERROR→RUNNING 前须为 true) */
339
+ recovered: boolean;
340
+ };
341
+ /** 原始目标(防漂移锚点,不随迭代改变) */
342
+ mainGoal: string;
343
+ /** 当前迭代目标(可随 plan 推进更新) */
344
+ currentGoal: string;
345
+ /**
346
+ * 目标变更事件序号(每次 currentGoal 变更递增,goalDriftDetected 事件载荷)。
347
+ * 仅作事件序号,不承担版本一致性校验——漂移碰撞由文本相似度完成,勿误用为版本校验。
348
+ */
349
+ goalChangeSeq: number;
350
+ /** 执行计划任务项列表 */
351
+ plan: PlanItem[];
352
+ /**
353
+ * 工具执行日志(outbox 模式):FIFO,超上限时优先丢弃「幂等或已补偿」的最早记录,
354
+ * 非幂等未补偿记录永不丢弃。
355
+ */
356
+ completedToolCalls?: ToolExecutionRecord[];
357
+ /** step 推进日志(LLM 迭代级时间轴,FIFO cap 10-12 条;任务项状态见 plan) */
358
+ planItemLog?: PlanItemOutcome[];
359
+ /** 暂停元数据 */
360
+ pauseMeta?: PauseMeta;
361
+ /** 心跳时间戳(毫秒),防僵尸会话 */
362
+ lastHeartbeat: number;
363
+ /**
364
+ * 暂停起点时间戳(毫秒),与 lastHeartbeat 解耦:lastHeartbeat 承载「检查点写入时间」
365
+ * (任何变更都刷新);本字段仅由 pause() 在进入 paused 时写,暂停后不被触碰。
366
+ * 暂停超时判定以此为准,否则 touchCheckpoint 会刷新心跳、无限推迟超时判定。
367
+ * 可选:缺失时超时判定回退到 lastHeartbeat。
368
+ */
369
+ pausedAt?: number;
370
+ }
371
+ /** 状态机显式状态转换方法(pause/resume/triggerError/recover 等)的返回值 */
372
+ export interface StatusTransition {
373
+ /** 转换前状态 */
374
+ from: 'running' | 'paused' | 'error';
375
+ /** 转换后状态 */
376
+ to: 'running' | 'paused' | 'error';
377
+ /** 转换原因(如 "用户暂停") */
378
+ reason: string;
379
+ /** 转换是否被允许 */
380
+ allowed: boolean;
381
+ }
382
+ /**
383
+ * 结构化主动提问(ask_user 内置工具解析产物)
177
384
  *
178
- * 设计原则:profile facts 与 insight 同属"提炼类记忆"(从输入加工得到,非原始对话),
179
- * 归档行为保持一致——`insights-only` 下都自动,`manual` 下都需手动。
385
+ * 唯一「提问后暂停」形态:LLM 调 ask_user 工具(question + 可选 options/allowCustom),
386
+ * loop 检出后挂起,用户答案以 tool result 回填(对齐 Claude Code AskUserQuestion 机制)。
180
387
  */
181
- export type ArchiveMode = 'full' | 'insights-only' | 'manual';
388
+ export interface AskQuestion {
389
+ /** 溯源槽位(当前恒为 'ask',为未来扩展保留) */
390
+ slot: string;
391
+ /** 问题文本 */
392
+ question: string;
393
+ /** 候选选项(ask_user 工具 options 参数,宿主渲染可点击选项) */
394
+ options?: string[];
395
+ /** 是否允许用户在选项外自由输入(ask_user 工具 allowCustom 参数,默认 false) */
396
+ allowCustom?: boolean;
397
+ }
182
398
  import type { LlmProvider } from '../llm/provider.js';
183
- import type { IVectorStore } from '../memory/vectorStore.js';
184
399
  import type { IMemoryStorage } from '../memory/storageInterface.js';
185
- import type { IMemoryRelationStore } from '../memory/relationStore.js';
186
400
  import type { ISessionStore } from '../memory/sessionStore.js';
401
+ import type { IRoundStore } from '../memory/roundStore.js';
187
402
  import type { ITracer } from '../agent/tracer.js';
188
403
  import type { ProjectContext } from '../memory/projectManager.js';
404
+ import type { MessageRole } from '../memory/types.js';
405
+ import type { IWebSearchProvider } from '../web-search/types.js';
406
+ import type { IFetchProvider } from '../web-fetch/types.js';
407
+ import type { ICodeExecutionProvider } from '../code-exec/types.js';
408
+ import type { IProjectSearchProvider } from '../project-search/types.js';
409
+ import type { ProviderRouter } from '../llm/types.js';
410
+ import type { BehaviorStrategy } from '../role-pack/types.js';
411
+ import type { RolePackTeam } from '../role-pack/types.js';
412
+ /**
413
+ * 文件层前置条件断言回调:注入时 deleteRule/deleteSkill/updateRule 入口先校验宿主是否已完成
414
+ * 文件操作。expected='absent'/'exists' 分别校验已删/已写。id 格式 `rule:NAME` 或 `skill:NAME`。
415
+ */
416
+ export type FileConsistencyCheck = (id: string, expected: 'exists' | 'absent') => boolean;
417
+ /**
418
+ * 工具执行前检查的三态结果(所有工具调用统一入口,由 preExecutionCheck 做执行前检查):
419
+ * - 放行(skip=false):允许执行,可选 overrideArgs 改写参数(审计/参数改写)
420
+ * - 跳过(skip=true, 无 denied):不执行,返回 previousResult 让 LLM 继续(幂等去重)
421
+ * - 拒绝(skip=true, denied=true):阻止工具意图(工具批准否决/白名单/只读拦截)
422
+ */
423
+ export interface PreExecutionResult {
424
+ /** 是否跳过执行(true = 跳过或拒绝) */
425
+ skip: boolean;
426
+ /** 跳过时返回的已有结果(幂等去重场景) */
427
+ previousResult?: string;
428
+ /** 放行时可改写后的参数 JSON 字符串 */
429
+ overrideArgs?: string;
430
+ /** 拒绝标记(比 skip 更硬:阻止工具意图并阻止其重试) */
431
+ denied?: boolean;
432
+ /** 拒绝原因(回传给 LLM 让其调整策略而非重试) */
433
+ reason?: string;
434
+ }
435
+ /** 重复工具调用检测的判定结果:'ok' 正常 / 'warn' 注入负反馈提醒改策略 / 'block' 直接返回兜底文本 */
436
+ export type DuplicateCheckVerdict = 'ok' | 'warn' | 'block';
437
+ /**
438
+ * 重复工具调用拦截器接口(宿主扩展点)。策略参数化:将「如何判定重复、触发什么」从
439
+ * AgentLoop 剥离,宿主可注入自定义拦截器(如按场景调阈值、按工具名白名单、语义重复检测)。
440
+ * 默认实现 DefaultDuplicateCallInterceptor 基于工具名+参数哈希机械检测。
441
+ */
442
+ export interface DuplicateCallInterceptor {
443
+ /** 检查本轮工具调用是否构成重复死循环 */
444
+ check(toolCalls: readonly {
445
+ id: string;
446
+ function: {
447
+ name: string;
448
+ arguments: string;
449
+ };
450
+ }[], context: DuplicateCheckContext): DuplicateCheckVerdict;
451
+ /** 拦截器唯一标识(用于日志/调试,可选但建议实现) */
452
+ readonly name?: string;
453
+ /**
454
+ * 当前阈值(可选)。宿主注入自定义拦截器时,loop 的失败硬闸 / 警告文案 / `context.threshold`
455
+ * 都应取**本拦截器**的阈值,而非 loop 自身硬编码。未实现则回落默认 3。
456
+ */
457
+ getThreshold?(): number;
458
+ }
459
+ /** 提供给拦截器的只读运行时信息,供宿主策略做精确判定 */
460
+ export interface DuplicateCheckContext {
461
+ /** 当前轮次索引(从 1 开始) */
462
+ readonly iteration: number;
463
+ /** 本轮已连续相同调用的次数 */
464
+ readonly duplicateCount: number;
465
+ /** 上一轮工具调用哈希 */
466
+ readonly lastHash: string;
467
+ /** 当前工具调用哈希 */
468
+ readonly currentHash: string;
469
+ /** 当前阈值(默认 3) */
470
+ readonly threshold: number;
471
+ }
189
472
  /** Agent 构造选项 */
190
473
  export interface AgentOptions {
191
474
  /** 项目路径(必须) */
@@ -194,75 +477,133 @@ export interface AgentOptions {
194
477
  provider: LlmProvider;
195
478
  /** 后台 LLM Provider(可选,用于投影等后台操作,不配时复用前台) */
196
479
  backgroundProvider?: LlmProvider;
480
+ /** Provider 路由:按任务类型返回对应 Provider;不配时全部使用同一 Provider(向后兼容) */
481
+ providerRouter?: ProviderRouter;
197
482
  /** 配置目录(personas/rules/skills) */
198
483
  configDir?: string;
199
- /** 记忆数据目录(由宿主显式注入) */
200
- dataDir?: string;
201
- /** 项目注册表目录(默认与 dataDir 相同)。设为用户级路径可避免每项目重复存储 */
484
+ /**
485
+ * 启动时激活的角色包名(宿主装配级,既有键,语义扩展):宿主持久化的用户选择。
486
+ * §4.1 解析链第一层——有效则生效;失效(包不存在)落兜底包(builtinFallbackRole ?? BUILTIN_FALLBACK_PACK),
487
+ * 不回退 items[0]。
488
+ */
489
+ activeRolePack?: string;
490
+ /**
491
+ * 组(宿主装配级):组长角色包 + 组员名单。会议名单容器,非选择对象。
492
+ * 组长身份唯一(一个角色包只能是一个组的组长);组员可被多组引用;成员名单非空;
493
+ * 组员仅作小组会议参与者(会议内表层装配),不用于日常。
494
+ */
495
+ rolePackTeams?: RolePackTeam[];
496
+ /** 程序级内置兜底角色(可选):覆盖内核常量 BUILTIN_FALLBACK_PACK;覆盖值须指向存在的包,否则回退内核常量 */
497
+ builtinFallbackRole?: string;
498
+ /**
499
+ * 宿主装配级**策略覆盖**(可选):经 resolveActiveStrategy 压过角色包声明,表达宿主产品能力边界。
500
+ * 只影响 override 声明过的键;是「宿主策略层」通用覆盖,不新增任何独立开关。
501
+ *(无内置示例键;角色包无自动匹配链,本机制保留供宿主能力边界使用)
502
+ */
503
+ strategyOverride?: Partial<BehaviorStrategy>;
504
+ /**
505
+ * 记忆数据目录(宿主必填)。内核不提供默认值——目录位置与其层级语义(项目级 / 用户级)
506
+ * 是宿主的产品决策,内核不置喙,也不假设其下的文件形态。
507
+ */
508
+ dataDir: string;
509
+ /**
510
+ * 项目注册表目录(可选,缺省随 dataDir)。注册表存在的意义是**跨项目按名解析**,
511
+ * 故只有多项目共用同一 dataDir(或显式指定共同的 registryDir)时才真正兑现;
512
+ * 若 dataDir 是项目级目录,注册表随之落进各项目内、只含项目自身条目,按名切换不成立。
513
+ */
202
514
  registryDir?: string;
203
515
  /** 最大上下文 token 数(默认 120000) */
204
516
  maxContextTokens?: number;
205
- /** 默认角色名 */
206
- persona?: string;
517
+ /**
518
+ * per-LLM 输出预算默认值(token,可选):宿主 per-LLM 配置(配置面板「输出上限」)透传,
519
+ * 请求体携带 max_tokens。背景(EMPTY-RESP-1 根因):推理模型 thinking 与正文共享输出预算,
520
+ * thinking 吃满服务端默认上限会把正文挤空(空响应)——显式配置消除盲区。
521
+ * undefined = 不传(回服务端默认,盲区语义与 contextWindow 同构)。
522
+ * 裁决:与角色包策略 act.outputLimit **取更小值**(两者都是「上限」性质,须同时满足;
523
+ * 对齐上下文窗口 min(provider 窗口, 角色包 contextLimit) 的语义)——buildChatOptions 单点裁决,
524
+ * 宿主只经 `Agent.getEffectiveMaxTokens()` 读取生效值,不得自行重算。未声明侧缺位时取另一侧。
525
+ * 请求层只做形态归一(openaiCompatible.normalizeMaxTokens:
526
+ * 非正整数不传);上限不裁决——超模型能力的值原样透传、由服务端可见报错,不被内核静默替换
527
+ * (与 contextWindow 同哲学:集成方 UI 护栏是输入边界的唯一可见裁决点)。
528
+ */
529
+ maxTokens?: number;
207
530
  /** 安全权限 */
208
531
  permission?: 'owner' | 'guest';
209
532
  /** 允许的路径白名单 */
210
533
  allowedPaths?: string[];
211
534
  /** 写入确认 */
212
535
  confirmWrites?: boolean;
213
- /** 向量存储(可选,提供时启用语义搜索召回;宿主可注入任意 IVectorStore 实现) */
214
- vectorStore?: IVectorStore;
215
- /** 召回时排除的 source 标签(默认 ['persona', 'rule', 'skill'],这些已由 bootstrap 注入) */
216
- recallExcludeSources?: string[];
217
- /** 外部注入的存储实例(可选,不传则内部创建 InMemoryStorage) */
536
+ /** 脚本/代码执行确认(独立于写入确认;true 时 run_code/run_project_script 执行前弹窗,默认 false 不弹窗) */
537
+ confirmScripts?: boolean;
538
+ /** 外部注入的存储实例(不传则内部创建 InMemoryStorage) */
218
539
  storage?: IMemoryStorage;
219
- /** 外部注入的记忆关系存储(可选,ADR-014 侧车模型,不传则跳过关系构建) */
220
- relationStore?: IMemoryRelationStore;
221
- /** 外部注入的会话存储(可选,不传则仅在内存中保存) */
540
+ /** 外部注入的会话存储(round-based 唯一模式;未注入则消息仅内存保存) */
222
541
  sessionStore?: ISessionStore;
223
- /** 可观测性 Tracer(可选,不传则使用 NoopTracer 静默丢弃所有 span) */
542
+ /** 外部注入的问答闭环存储(round-based 唯一模式;与 sessionStore 成对注入,未注入则消息仅内存保存) */
543
+ roundStore?: IRoundStore;
544
+ /** 可观测性 Tracer(不传则 NoopTracer 静默丢弃) */
224
545
  tracer?: ITracer;
225
- /** 宿主可覆盖的 UI 消息文本(默认英文,宿主覆盖为中文等) */
546
+ /** 宿主可覆盖的 UI 消息文本(默认英文) */
226
547
  messages?: UIMessages;
227
- /** 上下文超限时是否自动生成摘要(默认 true,开启后首次截断时增加 ~1-2s 延迟) */
548
+ /** 上下文超限时是否自动生成摘要(默认 true;开启后首次截断增 ~1-2s 延迟) */
228
549
  enableContextSummary?: boolean;
550
+ /** 归档模式(默认 'full') */
551
+ archiveMode?: ArchiveMode;
552
+ /** 网络搜索提供者(可选,不配则不启用网络搜索) */
553
+ webSearchProvider?: IWebSearchProvider;
554
+ /** 网页抓取提供者(可选,不配则不启用 web_fetch;与 webSearchProvider 构成搜索→抓取闭环) */
555
+ fetchProvider?: IFetchProvider;
556
+ /** 代码执行提供者(可选,不配则不启用 run_code;执行器与隔离等级由宿主实现) */
557
+ codeExecutionProvider?: ICodeExecutionProvider;
558
+ /** 项目搜索提供者(可选,不配则不启用 search_project;等价 IDE 全局搜索,由宿主实现) */
559
+ projectSearchProvider?: IProjectSearchProvider;
229
560
  /**
230
- * 归档模式(ADR-015,默认 'full')
561
+ * node 可执行文件路径(可选):宿主注入真实 node 路径
562
+ * (如 IDE 内置 node / 用户配置的 node)给 L3 脚本执行器(run_skill_script /
563
+ * run_project_script 的 node runtime 分支)。缺省走 'node'(PATH 查找);
564
+ * 宿主机无独立 node 时注入可避免 .js/.mjs 脚本 ENOENT。
565
+ */
566
+ scriptNodePath?: string;
567
+ /**
568
+ * 禁用的技能名清单(可选):宿主配置形态启停——命中的技能
569
+ * 从 L1 清单消失、L2/L3 访问(read_skill/read_resource/run_skill_script)不可用。
570
+ * 对 LLM 语义 = 技能不存在(不暴露「禁用」细节);宿主 UI 依据同名设置标注「已禁用」徽章。
571
+ * 缺省空 = 全量技能可用(向后兼容)。
572
+ */
573
+ disabledSkills?: string[];
574
+ /** 文件层前置条件断言回调(可选,未注入则完全降级为现状) */
575
+ fileConsistencyCheck?: FileConsistencyCheck;
576
+ /**
577
+ * 工具执行前检查回调(宿主审批/审计/参数改写通道):装配时与内部幂等检查组合为单点入口。
231
578
  *
232
- * - 'full':profile facts + insight 自动归档(对话原始内容待会话归档实现后自动)
233
- * - 'insights-only':profile facts + insight 自动归档,对话原始内容需手动
234
- * - 'manual':所有归档都需手动触发
579
+ * ⚠️ 单用户桌面场景可省略(内核自动降级为仅内部幂等检查),
580
+ * 多用户/服务端部署 **必须注入** 真实审批策略(基于权限、路径白名单、只读模式等做 denied/skip 判定)。
581
+ * 省略不是「忘记实现」——是「单用户信任模型下不需要」的显式决策。
235
582
  */
236
- archiveMode?: ArchiveMode;
583
+ preExecutionCheck?: (name: string, args: string) => PreExecutionResult;
237
584
  }
238
585
  /** Agent 初始化后暴露的运行时上下文 */
239
586
  export type AgentContext = ProjectContext;
240
- /** Agent 项目条目(来自 ProjectManager 注册表) */
241
- export interface AgentProjectEntry {
242
- name: string;
243
- path: string;
244
- lastOpened: string;
245
- }
246
- /** Agent 内部配置(构造参数分组) */
247
- export interface AgentConfig {
587
+ /**
588
+ * Agent 内部配置(构造参数解析默认值后的形态)。派生自 AgentOptions:
589
+ * Omit 掉「不进入内部配置」的字段;覆盖「构造时 `?? 默认值` 解析后必填」的字段;
590
+ * 其余继承既有的必填/可选性。新增 AgentOptions 字段若有默认值解析,需加入 Omit 列表并覆盖类型。
591
+ */
592
+ export type AgentConfig = Omit<AgentOptions, 'provider' | 'backgroundProvider' | 'providerRouter' | 'dataDir' | 'maxContextTokens' | 'permission' | 'allowedPaths' | 'confirmWrites' | 'confirmScripts' | 'enableContextSummary' | 'archiveMode'> & {
248
593
  dataDir: string;
249
- registryDir: string | undefined;
250
594
  maxContextTokens: number;
251
- personaName: string | undefined;
252
595
  permission: 'owner' | 'guest';
253
596
  allowedPaths: string[];
254
597
  confirmWrites: boolean;
255
- vectorStore: IVectorStore | undefined;
256
- recallExcludeSources: string[];
257
- storage: IMemoryStorage | undefined;
258
- relationStore: IMemoryRelationStore | undefined;
259
- sessionStore: ISessionStore | undefined;
260
- projectPath: string;
261
- configDir: string | undefined;
262
- tracer: ITracer | undefined;
263
- messages: UIMessages | undefined;
598
+ /** 脚本/代码执行确认开关(AgentOptions.confirmScripts 的默认值解析结果) */
599
+ confirmScripts: boolean;
264
600
  enableContextSummary: boolean;
265
- /** 归档模式(ADR-015,默认 'full') */
266
601
  archiveMode: ArchiveMode;
267
- }
602
+ /**
603
+ * 组(会议名单容器):内部运行态必选——外部 AgentOptions 可选(不配 = 无团队),
604
+ * Agent 构造时 `?? []` 归一化后恒为数组。
605
+ * 收紧内部契约保证 AssembleInput 必传,防「可选性假约束」吞掉团队数据(team 启动缺口教训)。
606
+ */
607
+ rolePackTeams: RolePackTeam[];
608
+ };
268
609
  //# sourceMappingURL=types.d.ts.map