@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,14 +1,6 @@
1
1
  import { SOURCE_LABELS } from '../../memory/types.js';
2
2
  import { configError } from '../../utils/errors.js';
3
- import { nowIso } from '../../utils/time.js';
4
3
  import { truncate } from '../../utils/strings.js';
5
- import { logger } from '../../logging/logger.js';
6
- // 双通道融合排序算法 + 常量从 hybridMerge 导入(不再绕道 recall.ts)
7
- // 消除"agent 模块依赖 memory/recall.ts 内部常量"的分层违规
8
- import { hybridMerge, RECALL_LIMIT_MULTIPLIER, } from '../../memory/hybridMerge.js';
9
- // LLM 治理共享常量(v2 REPEAT-1/2 闭环,消除 5 处独立维护的治理源列表 + 2 处 score 常量重复)
10
- // MIND2-L3:SCORE_CEILING 不再需要(incrementScore 内部 clamp),仅保留 BOOST_INCREMENT
11
- import { BOOST_INCREMENT } from '../../memory/governance.js';
12
4
  // ─── 常量 ────────────────────────────────────────────────
13
5
  /** 工作记忆预览条数(最近 N 条) */
14
6
  const WORKING_PREVIEW = 5;
@@ -21,113 +13,52 @@ export class MemoryInspector {
21
13
  index;
22
14
  loop;
23
15
  history;
24
- /** 向量存储(可选,提供时 searchHybrid 启用语义搜索) */
25
- vectorStore = null;
26
- /** 关系存储(可选,ADR-014 侧车,未注入时关系方法静默降级) */
27
- relationStore;
28
16
  /**
29
- * FIX-P1-3(2026-07-24):移除 advisor 参数,sourceHealth/suggest 改由
30
- * Agent 直接委托 MemoryAdvisor(与 detectConflicts 同模式),消除 3 层代理。
31
- *
32
- * @param index - 记忆存储(用于读写操作)
33
- * @param loop - AgentLoop(用于获取工作记忆)
34
- * @param history - MessageHistory(用于获取当前会话信息)
35
- * @param relationStore - 关系存储侧车(可选,ADR-014,未注入时关系方法降级返回空/no-op)
17
+ * 构造记忆管理器。sourceHealth/suggest 由 Agent 门面直连 MemoryAdvisor,本类不持有 advisor(消除 3 层代理)。
36
18
  */
37
- constructor(index, loop, history, relationStore = null) {
19
+ constructor(index, loop, history) {
38
20
  this.index = index;
39
21
  this.loop = loop;
40
22
  this.history = history;
41
- this.relationStore = relationStore;
42
- }
43
- /**
44
- * 注入向量存储(由 Agent 在初始化后调用,解决构造时序)
45
- */
46
- setVectorStore(vs) {
47
- this.vectorStore = vs;
48
23
  }
49
24
  // ─── 只读查询(IMemoryStorage 透传) ───────────────────
50
- // 写操作以 writeXxx 前缀命名,集中在本类末尾的"写操作"section。
51
- /**
52
- * 列出回收站中的软删除记忆(只读查询)
53
- *
54
- * @param limit 返回数量上限。`limit <= 0` 或 `undefined` 表示不设上限(返回全部);
55
- * 正整数 N 表示返回最近 N 条。默认 undefined(全部)。
56
- * @returns 软删除记忆列表(按 deletedAt 降序)
57
- */
25
+ /** 列出回收站软删除记忆。limit<=0 或 undefined 表示不设上限,否则返回最近 N 条(默认 undefined=全部)。 */
58
26
  listDeleted(limit) {
59
27
  return this.index.listDeleted(limit);
60
28
  }
61
- /**
62
- * 按 ID 获取单条软删除记忆(只读查询)
63
- *
64
- * 用于 restore/purge 操作前的存在性校验,避免 listDeleted 默认 50 上限
65
- * 导致回收站超量时操作失效。
66
- *
67
- * @param id 记忆唯一标识
68
- * @returns 软删除记忆,不存在或未软删除时返回 null
69
- */
29
+ /** 按 ID 获取软删除记忆(用于 restore/purge 前存在性校验,单条精确查询免全量扫描) */
70
30
  getDeletedById(id) {
71
31
  return this.index.getDeletedById(id);
72
32
  }
73
- /**
74
- * 按 ID 获取单条活跃记忆(已软删除的返回 null)
75
- *
76
- * @param id 记忆唯一标识
77
- * @returns 记忆对象,不存在或已软删除时返回 null
78
- */
33
+ /** 按 ID 获取单条活跃记忆(已软删除的返回 null) */
79
34
  getById(id) {
80
35
  return this.index.getById(id);
81
36
  }
82
- /**
83
- * 按来源标签获取记忆列表
84
- *
85
- * @param source 来源标签(如 'persona'、'rule'、'insight')
86
- * @returns 该来源的所有记忆
87
- */
37
+ /** 按来源标签获取记忆列表(如 'persona'、'rule'、'round-summary') */
88
38
  getBySource(source) {
89
39
  return this.index.getBySource(source);
90
40
  }
91
41
  /**
92
- * 列出所有记忆(用于宿主项目的记忆管理面板)
93
- *
94
- * 与 search() 不同,本方法允许空查询,返回按 score 降序排列的记忆列表。
95
- * search() 拒绝空查询是为了防止"静默全量返回"的误用;
96
- * list() 则是显式声明"我要列出所有记忆"的意图。
97
- *
98
- * @param limit 返回数量上限(默认 50)
99
- * @returns 记忆列表(按 score 降序)
42
+ * 列出活跃记忆(供宿主记忆管理面板),按 accessedAt 降序。
43
+ * search() 拒绝空查询防"静默全量返回"误用;list() 是显式声明列举——但**默认仍带 50 条上限**
44
+ * (安全默认,与 listDeleted 的 undefined=全部 语义刻意不同)。需要全量的调用方须
45
+ * 显式传入上限(如 stats().total),否则静默截断。
100
46
  */
101
47
  list(limit = 50) {
102
48
  return this.index.search('', limit);
103
49
  }
104
50
  // ─── 快照 ─────────────────────────────────────────────
105
- /**
106
- * 统一查看记忆快照(3 层)
107
- *
108
- * 简化为 3 层(工作记忆 / Bootstrap / 归档记忆)。
109
- *
110
- * 设计原则:
111
- * - **纯只读**——不动任何组件状态
112
- * - **同步返回**——避免数据不一致(不调 LLM、不调 SQLite)
113
- * - **轻量**——每层只返回前 N 条 + 总数
114
- */
51
+ /** 统一查看记忆快照(3 层):纯只读、同步返回、每层只返回前 N 条 + 总数。 */
115
52
  snapshot() {
116
53
  // 第 1 层:工作记忆(AgentLoop 的 messages 数组)
117
54
  const workingFull = this.loop.getMessages();
118
55
  const workingTotal = workingFull.length;
119
56
  const working = workingFull.slice(-WORKING_PREVIEW);
120
- // 第 2 层:Bootstrap 记忆(永驻 + 领域)
121
- // 直接按 source 查询,避免 search('', 50) 全量扫描
122
- const rules = this.index.getBySource(SOURCE_LABELS.RULE);
123
- const personas = this.index.getBySource(SOURCE_LABELS.PERSONA);
124
- const skills = this.index.getBySource(SOURCE_LABELS.SKILL);
125
- const bootstrap = [...rules, ...personas, ...skills];
126
- // 第 3 层:归档记忆计数(insight + profile + work-projection)
127
- const insightCount = this.index.countBySource(SOURCE_LABELS.INSIGHT);
128
- const profileCount = this.index.countBySource(SOURCE_LABELS.PROFILE);
129
- const workProjectionCount = this.index.countBySource(SOURCE_LABELS.WORK_PROJECTION);
130
- const archiveTotal = insightCount + profileCount + workProjectionCount;
57
+ // 第 2 层 Bootstrap 恒空:设定记忆唯一归角色包,索引不再新增,rolePackPrompt 承载规则注入。
58
+ // 保留空壳形状。宿主治理面走 stats/list/searchByKeyword,不消费本层。
59
+ // 第 3 层:归档记忆计数(round-summary,记忆库唯一对话记忆)
60
+ const roundSummaryCount = this.index.countBySource(SOURCE_LABELS.ROUND_SUMMARY);
61
+ const archiveTotal = roundSummaryCount;
131
62
  return {
132
63
  working: {
133
64
  total: workingTotal,
@@ -138,35 +69,26 @@ export class MemoryInspector {
138
69
  })),
139
70
  },
140
71
  bootstrap: {
141
- total: bootstrap.length,
142
- items: bootstrap.map((m) => ({
143
- id: m.id,
144
- source: m.source,
145
- name: m.name,
146
- contentPreview: m.content.slice(0, CONTENT_PREVIEW_LEN),
147
- score: m.score,
148
- })),
72
+ total: 0,
73
+ items: [],
149
74
  },
150
75
  archive: {
151
76
  archiveCount: archiveTotal,
152
- // ADR-014 关系边总数(relationStore 未注入时为 0)
153
- relationCount: this.countRelations(),
154
77
  currentSession: this.history.session ?? '(none)',
155
78
  currentSessionName: this.history.currentSessionName ?? '(none)',
156
79
  hint: '调 listAllSessions() 获取文件清单',
157
80
  stats: {
158
- insight: insightCount,
159
- profile: profileCount,
160
- 'work-projection': workProjectionCount,
81
+ 'round-summary': roundSummaryCount,
161
82
  },
162
83
  },
163
84
  };
164
85
  }
165
86
  // ─── 搜索 ─────────────────────────────────────────────
166
87
  /**
167
- * 搜索记忆(关键词 + FTS5 索引)
168
- *
169
- * 返回 CLI 友好的扁平结构(已处理内容截断)
88
+ * @deprecated 本同步通道已退役,功能由 `searchByKeyword()` 承担(后者含
89
+ * superseded 过滤 / excludeRoundIds 互斥 / accessedAt + 溯源揭示)。当前无生产/宿主消费方,
90
+ * 勿新增调用。
91
+ * 搜索记忆(关键词 + FTS5 索引),返回 CLI 友好扁平结构(已截断)。
170
92
  */
171
93
  search(query, limit = 10) {
172
94
  // 空 query 会让 search() 退化为"返回所有",对宿主程序是静默误导
@@ -186,26 +108,30 @@ export class MemoryInspector {
186
108
  id: m.id,
187
109
  name: m.name,
188
110
  source: m.source,
189
- score: m.score,
190
111
  // 截断长内容到搜索预览长度
191
112
  contentPreview: truncate(m.content, SEARCH_PREVIEW_LEN),
192
113
  createdAt: m.createdAt,
193
114
  }));
194
115
  }
195
116
  /**
196
- * 混合搜索记忆(语义 + 关键词双通道)
117
+ * 搜索记忆(纯关键词单通道,无向量通道、无融合排序)。
197
118
  *
198
- * 当 VectorStore 可用时,启用语义搜索通道,补强关键词召回的语义缺口。
199
- * 向量搜索失败时静默降级到纯关键词(降级优先原则)。
119
+ * 边界声明(分层分轨):searchByKeyword 是「记忆搜索工具」,不是召回管线——不应用 L1/L2 分层、
120
+ * 不进池策略(preference 无条件进池 / intent 排除)、不做 cap 内分配(capTokens / minSemanticShare)。
121
+ * 分层分轨原属「召回编排」`recall()`;**现行实现中已无任何召回编排**,
122
+ * 搜索工具只暴露过滤后的结果,供宿主/上层按需自取(见 memory-as-summary §4.5 边界标注)。
200
123
  *
201
- * 融合排序算法已提取到 hybridMerge.ts,与 recall() 共享同一实现,
202
- * 避免跨模块常量依赖。
124
+ * 无语义(向量)通道:embedding 写端缺失导致语义通道在生产从未生效,
125
+ * 属于「宣称能力零消费」的僵尸;且主流 agent(Anthropic Memory tool / Claude Code / Librarian Pattern)
126
+ * 已实证「LLM 消费者 + 小语料」下纯关键词足用——LLM 会自主改述重试(工具描述已提示)。向量语义检索
127
+ * 的 cache 形态方案记入探索期文档候选,等真实「关键词搜不到」复现再按缓存重算形态补回。
203
128
  *
204
- * @returns 混合排序后的搜索结果(含相似度分数)
129
+ * @param excludeRoundIds 排除的轮次 ID 集合(可选):这些轮次的 round-summary 已被装配期载入正文,
130
+ * 不重复返回(工具召回与装配期正文互斥,§5.1);缺省不过滤。
205
131
  */
206
- async searchHybrid(query, limit = 10) {
132
+ async searchByKeyword(query, limit = 10, excludeRoundIds) {
207
133
  if (!query || query.trim() === '') {
208
- throw configError('搜索关键词为空', 'searchHybrid() 需要非空 query', [
134
+ throw configError('搜索关键词为空', 'searchByKeyword() 需要非空 query', [
209
135
  '传入非空字符串关键词',
210
136
  ]);
211
137
  }
@@ -214,374 +140,97 @@ export class MemoryInspector {
214
140
  '使用 limit = 10(默认值)',
215
141
  ]);
216
142
  }
217
- const merged = new Map();
218
- // ── 通道 1:语义搜索(VectorStore 可用时) ──
219
- if (this.vectorStore && this.vectorStore.size > 0) {
220
- try {
221
- const vectorResults = await this.vectorStore.search(query, limit * RECALL_LIMIT_MULTIPLIER, 0.3);
222
- for (const vr of vectorResults) {
223
- const memory = this.index.getById(vr.id);
224
- if (memory) {
225
- merged.set(memory.id, { memory, vectorScore: vr.similarity });
226
- }
227
- }
228
- }
229
- catch (err) {
230
- logger.debug({ err }, '语义搜索失败,降级到关键词');
231
- }
232
- }
233
- // ── 通道 2:关键词搜索(补齐语义通道未覆盖的) ──
234
- const keywordResults = this.index.search(query, limit * RECALL_LIMIT_MULTIPLIER);
235
- for (const m of keywordResults) {
236
- if (!merged.has(m.id)) {
237
- merged.set(m.id, { memory: m, vectorScore: 0 });
238
- }
239
- }
240
- // ── 综合排序:委托给 hybridMerge 纯函数(与 recall() 共享) ──
241
- const sorted = hybridMerge(merged.values(), limit);
242
- return sorted.map(({ memory, vectorScore }) => ({
143
+ // 单个通道:纯关键词搜索(无向量通道、无融合排序,FTS 索引已按相关性返回)
144
+ const keywordResults = this.index.search(query, limit);
145
+ // 前置 superseded 过滤:被 supersededBy 取代的摘要不作为当前事实
146
+ // 返回(仍保留可回溯,trace_summary 可精确取原文)。在截断前过滤,避免占据 top-N 槽位挤掉有效命中。
147
+ const active = keywordResults.filter((m) => !m.supersededBy);
148
+ // 工具召回与装配期内容互斥(§5.1):排除「正文或摘要已在眼前」轮次的 round-summary,
149
+ // 避免 LLM 拿回眼前内容的摘要重复(excludeRoundIds 由调用方按 loop.getExclusionRoundIds 精确派生,
150
+ // = 视图内 ∪ 被替换 ∪ 在途,天然不含当轮)。
151
+ // 被排除者不补位(工具语义):返回更聚焦的结果即可,不强制凑满 limit。
152
+ const unexcluded = excludeRoundIds && excludeRoundIds.size > 0
153
+ ? active.filter((m) => !m.roundId || !excludeRoundIds.has(m.roundId))
154
+ : active;
155
+ // 截断到 limit;不引入 accessedAt 时间主序(§5.2 定案)——
156
+ // accessedAt 只作为事实字段揭示(工具命中 touch 刷新),优先级判断归 LLM 结合任务定夺。
157
+ const result = unexcluded.slice(0, limit);
158
+ return result.map((memory) => ({
243
159
  id: memory.id,
244
160
  name: memory.name,
245
161
  source: memory.source,
246
- score: memory.score,
247
- similarity: vectorScore,
248
162
  contentPreview: truncate(memory.content, SEARCH_PREVIEW_LEN),
249
163
  createdAt: memory.createdAt,
164
+ accessedAt: memory.accessedAt,
165
+ // 结构化溯源(§3.3「返回」行):round-summary 命中项显式附 sessionId/roundId,
166
+ // 与 trace_summary 参数直通——LLM 零解析直用,不得隐式编码进 name 字段。
167
+ // 字段值源:round-summary 顶层持久化 sessionName(= YYYY-MM-DD-sessionName,即 trace_summary 的 sessionId)
168
+ // + roundId;metadata 不在存储契约的保证范围内,故不从 metadata 读。
169
+ sessionId: memory.sessionName,
170
+ roundId: memory.roundId,
250
171
  }));
251
172
  }
252
173
  // ─── 统计 ─────────────────────────────────────────────
253
- /**
254
- * 记忆库统计
255
- *
256
- * 返回记忆来源分布、数据库大小等关键指标。
257
- * 优化:使用 getAllSources() 一次查询替代多次 countBySource + 全量 search,
258
- * 复杂度从 O(n*knownSources + n) 降为 O(distinctSources)。
259
- */
174
+ /** 记忆库统计:用 getAllSources() 一次查询来源分布(含宿主自定义标签),避免逐 source 多次 count */
260
175
  stats() {
261
176
  const total = this.index.count();
262
- // 直接使用 getAllSources() 获取所有 source 分布(含宿主自定义标签)
263
177
  const sourceMap = this.index.getAllSources();
264
178
  const bySource = {};
265
179
  for (const [source, count] of sourceMap) {
266
180
  if (count > 0)
267
181
  bySource[source] = count;
268
182
  }
269
- return { bySource, total, relationCount: this.countRelations() };
270
- }
271
- // ─── 关系查询(ADR-014 侧车) ───────────────────────────
272
- /**
273
- * 查询指定记忆的关系边
274
- *
275
- * ADR-014 侧车模型:关系数据独立于 Memory 7 字段基元,存储在 IMemoryRelationStore。
276
- * relationStore 未注入时返回空数组(向后兼容)。
277
- *
278
- * @param memoryId - 记忆 ID
279
- * @param direction - 方向过滤:'outgoing'(出边)/ 'incoming'(入边)/ 'both'(双向,默认)
280
- * @returns 关系边数组,按 createdAt 降序
281
- */
282
- getRelations(memoryId, direction = 'both') {
283
- if (!this.relationStore)
284
- return [];
285
- return this.relationStore.getRelations(memoryId, direction);
183
+ return { bySource, total };
286
184
  }
287
- /**
288
- * 查询全部关系边
289
- *
290
- * 用于宿主 UI 渲染拓扑可视化(阶段 2.4)。
291
- * relationStore 未注入时返回空数组(向后兼容)。
292
- *
293
- * @returns 全部关系边数组
294
- */
295
- getAllRelations() {
296
- if (!this.relationStore)
297
- return [];
298
- return this.relationStore.getAllRelations();
299
- }
300
- // 关系写操作以 writeAddRelation / writeRemoveRelation 命名,见本类末尾"写操作"section。
301
- /**
302
- * 记忆关系路径追溯(ADR-014 扩展,Phase 5.1)
303
- *
304
- * 从指定记忆出发,沿关系边追溯来源或去向,返回完整路径。
305
- * 用于宿主 UI 展示记忆的演化脉络(如 insight-a → refines → insight-b → follows → insight-c)。
306
- *
307
- * 防环设计:使用 visited Set 记录已访问节点,防止环导致无限递归。
308
- * 深度限制:maxDepth 控制最大追溯步数,防止路径过长。
309
- *
310
- * relationStore 未注入时返回仅含起点节点的数组(向后兼容,ADR-014 降级优先)。
311
- *
312
- * @param memoryId - 起点记忆 ID
313
- * @param maxDepth - 最大追溯深度(默认 5,防止路径过长)
314
- * @param direction - 追溯方向:'incoming'(追溯来源,默认)/ 'outgoing'(追溯去向) / 'both'
315
- * @returns 路径节点列表,按 depth 升序(起点在前)
316
- */
317
- getRelationPath(memoryId, maxDepth = 5, direction = 'incoming') {
318
- // 起点节点(无论 relationStore 是否注入都返回)
319
- const startMemory = this.index.getById(memoryId);
320
- const path = [
321
- {
322
- memoryId,
323
- memoryName: startMemory?.name ?? '(unknown)',
324
- memorySource: startMemory?.source ?? '(unknown)',
325
- relationType: null,
326
- relationWeight: null,
327
- depth: 0,
328
- },
329
- ];
330
- // relationStore 未注入时仅返回起点(降级优先,ADR-014)
331
- if (!this.relationStore)
332
- return path;
333
- // BFS 遍历,visited 防环
334
- const visited = new Set([memoryId]);
335
- const queue = [
336
- { id: memoryId, depth: 0, relationType: '', relationWeight: 0 },
337
- ];
338
- while (queue.length > 0) {
339
- const current = queue.shift();
340
- if (current.depth >= maxDepth)
341
- continue;
342
- const relations = this.relationStore.getRelations(current.id, direction);
343
- for (const rel of relations) {
344
- // 根据每条边的实际方向判断邻居,不依赖 direction 参数
345
- // (direction='both' 时返回的边可能 incoming 也可能 outgoing,
346
- // 旧实现按 direction 取 neighborId 会漏掉 incoming 邻居)
347
- const neighborId = rel.sourceId === current.id ? rel.targetId : rel.sourceId;
348
- if (visited.has(neighborId))
349
- continue;
350
- visited.add(neighborId);
351
- const neighborMemory = this.index.getById(neighborId);
352
- path.push({
353
- memoryId: neighborId,
354
- memoryName: neighborMemory?.name ?? '(unknown)',
355
- memorySource: neighborMemory?.source ?? '(unknown)',
356
- relationType: rel.type,
357
- relationWeight: rel.weight,
358
- depth: current.depth + 1,
359
- });
360
- queue.push({
361
- id: neighborId,
362
- depth: current.depth + 1,
363
- relationType: rel.type,
364
- relationWeight: rel.weight,
365
- });
366
- }
367
- }
368
- return path;
369
- }
370
- /**
371
- * 记忆关系邻居查询(ADR-014 扩展,Phase 5.2)
372
- *
373
- * 返回与指定记忆直接关联的记忆列表,含关系类型和方向。
374
- * 用于宿主 UI 展示某记忆的直接关联记忆(如冲突记忆、支持记忆、后续记忆等)。
375
- *
376
- * relationStore 未注入时返回空数组(向后兼容,ADR-014 降级优先)。
377
- *
378
- * @param memoryId - 基准记忆 ID
379
- * @param limit - 返回数量上限(默认 10,防止过多邻居导致 UI 拥挤)
380
- * @returns 邻居记忆列表,含关系类型/权重/方向
381
- */
382
- getRelationNeighbors(memoryId, limit = 10) {
383
- // relationStore 未注入时返回空数组(降级优先,ADR-014)
384
- if (!this.relationStore)
385
- return [];
386
- const neighbors = [];
387
- const seen = new Set(); // 去重(同一邻居可能有多条关系)
388
- // outgoing:memoryId 是 sourceId,邻居是 targetId
389
- const outgoing = this.relationStore.getRelations(memoryId, 'outgoing');
390
- for (const rel of outgoing) {
391
- if (seen.has(rel.targetId))
392
- continue;
393
- seen.add(rel.targetId);
394
- const neighborMemory = this.index.getById(rel.targetId);
395
- neighbors.push({
396
- memoryId: rel.targetId,
397
- memoryName: neighborMemory?.name ?? '(unknown)',
398
- memorySource: neighborMemory?.source ?? '(unknown)',
399
- memoryScore: neighborMemory?.score ?? 0,
400
- relationType: rel.type,
401
- relationWeight: rel.weight,
402
- direction: 'outgoing',
403
- });
404
- }
405
- // incoming:memoryId 是 targetId,邻居是 sourceId
406
- const incoming = this.relationStore.getRelations(memoryId, 'incoming');
407
- for (const rel of incoming) {
408
- if (seen.has(rel.sourceId))
409
- continue;
410
- seen.add(rel.sourceId);
411
- const neighborMemory = this.index.getById(rel.sourceId);
412
- neighbors.push({
413
- memoryId: rel.sourceId,
414
- memoryName: neighborMemory?.name ?? '(unknown)',
415
- memorySource: neighborMemory?.source ?? '(unknown)',
416
- memoryScore: neighborMemory?.score ?? 0,
417
- relationType: rel.type,
418
- relationWeight: rel.weight,
419
- direction: 'incoming',
420
- });
421
- }
422
- return neighbors.slice(0, limit);
423
- }
424
- /**
425
- * 统计关系边总数
426
- *
427
- * 用于 stats() 和 snapshot() 的 relationCount 字段。
428
- * relationStore 未注入时返回 0(向后兼容)。
429
- */
430
- countRelations() {
431
- if (!this.relationStore)
432
- return 0;
433
- return this.relationStore.getAllRelations().length;
434
- }
435
- // ─── 源健康诊断 + 关联推荐 ───
436
- //
437
- // FIX-P1-3(2026-07-24):sourceHealth() / suggest() 已从此处删除。
438
- // 调用方应通过 Agent 门面访问:
439
- // - agent.sourceHealth() → MemoryAdvisor.sourceHealth()
440
- // - agent.suggest(...) → MemoryAdvisor.suggest(...)
441
- // 与 detectConflicts 同模式(agent.detectConflicts → advisor.detectConflicts),
442
- // 消除"inspector 三层纯转发"的设计气味。
443
- // ─── 写操作(writeXxx 前缀,IMemoryStorage / IMemoryRelationStore 透传) ───
444
- /**
445
- * 插入或更新记忆
446
- *
447
- * @param memory 完整记忆对象
448
- */
185
+ // ─── 写操作(writeXxx 前缀,IMemoryStorage 透传) ───
186
+ /** 插入或更新记忆 */
449
187
  writeUpsert(memory) {
450
188
  this.index.upsert(memory);
451
189
  }
452
- /**
453
- * 提升记忆的 score(L2 采纳反哺内核)
454
- *
455
- * 用户在补全模块采纳某条候选后,通过 IPC 调用此方法反哺到内核 Memory.score。
456
- * 与 recall.ts 的 boostScore 路径语义一致("越常用越重要"),但触发源不同:
457
- * - recall.ts boostScore:召回时触发(被动)
458
- * - writeBoost:用户主动采纳时触发(主动)
459
- *
460
- * 设计原则:
461
- * - score 上限 1.0(与 recall.ts SCORE_CEILING 一致)
462
- * - 同步更新 accessedAt,避免被衰减机制误降级
463
- * - 记忆不存在时静默返回 false(补全候选可能来自对话历史,无对应记忆)
464
- *
465
- * @param id 记忆唯一标识(${source}:${name} 格式)
466
- * @param increment score 提升量(默认 0.05,与 recall.ts BOOST_INCREMENT 一致)
467
- * @returns 是否成功提升(记忆不存在时返回 false)
468
- */
469
- writeBoost(id, increment = BOOST_INCREMENT) {
470
- // MIND2-L3:改用 incrementScore 原子操作,消除 read-modify-write 并发冲突
471
- // 原 getById → spread → boostScore → upsert 四步合并为存储层一条原子更新
472
- return this.index.incrementScore(id, increment, nowIso());
473
- }
474
- /**
475
- * 软删除记忆(写入 deletedAt)
476
- *
477
- * @param id 记忆唯一标识(${source}:${name} 格式)
478
- */
190
+ /** 软删除记忆(写入 deletedAt) */
479
191
  writeDelete(id) {
480
192
  this.index.delete(id);
481
193
  }
482
194
  /**
483
- * 恢复软删除的记忆(清除 deletedAt)
195
+ * 随问答闭环删除的摘要记忆软删:Round 引用归 0 被物理删除后联动。
484
196
  *
485
- * @param id 记忆唯一标识
197
+ * 软删即脱钩:命中 roundId 的 round-summary 清空溯源(sessionName/roundId)后再软删——
198
+ * 原会话/轮已不存在(物理回收),溯源悬空无意义;恢复后即为「无需溯源的独立记忆」。
199
+ * metadata 不在存储契约的保证范围内,故不用标记位,直接清顶层溯源字段最简。
200
+ * 治理页单条软删(writeDelete)不清溯源:误删恢复仍保留关联。
201
+ *
202
+ * @param roundIds 被物理删除(引用归 0)的 Round ID 集合
203
+ * @returns 软删的摘要数量(0 = 无可联动记忆)
486
204
  */
205
+ softDeleteRoundSummaries(roundIds) {
206
+ if (roundIds.length === 0)
207
+ return 0;
208
+ const idSet = new Set(roundIds);
209
+ let count = 0;
210
+ for (const memory of this.index.getBySource(SOURCE_LABELS.ROUND_SUMMARY)) {
211
+ if (memory.roundId && idSet.has(memory.roundId)) {
212
+ // 脱钩溯源(覆盖写为无溯源副本,仅清除顶层字段不动内容/权重)→ 软删进回收站
213
+ this.index.upsert({ ...memory, sessionName: undefined, roundId: undefined });
214
+ this.index.delete(memory.id);
215
+ count++;
216
+ }
217
+ }
218
+ return count;
219
+ }
220
+ /** 恢复软删除记忆(清除 deletedAt) */
487
221
  writeRestore(id) {
488
222
  this.index.restore(id);
489
223
  }
490
224
  /**
491
- * 物理删除记忆(不可恢复,用于回收站彻底删除)
492
- *
493
- * @param id 记忆唯一标识
225
+ * 物理删除记忆(不可恢复)。IMemoryStorage.purge 为同步 void(无返回值、无异步弧),
226
+ * 宿主经 IPC 同步消费——无 fire-and-forget/catch 可言,注释按事实陈述。
494
227
  */
495
228
  writePurge(id) {
496
229
  this.index.purge(id);
497
230
  }
498
- /**
499
- * 清理过期的软删除记忆(FIX-P0-2:统一编排关系清理)
500
- *
501
- * 物理删除所有 deletedAt 早于 before 的记忆,并同步清理这些记忆的关系边。
502
- * 由宿主项目的定时器调用(默认 30 天保留期)。
503
- *
504
- * FIX-P0-2 修复说明:
505
- * 原实现仅调用 `index.purgeExpired(before)` 物理删除记忆,不清理 memory_relations
506
- * 表中的关系边,导致孤儿边残留。手动 purge 路径会清理关系,但自动清理路径遗漏。
507
- * 本方法是统一协调点(已持有 relationStore 引用),先查询待清理记忆 → 逐个清理关系边
508
- * → 再物理删除记忆,保证两侧数据一致。
509
- *
510
- * 容错策略:
511
- * - relationStore 未注入时跳过关系清理,仅物理删除记忆(向后兼容)
512
- * - 单条关系清理失败不阻塞整体流程,记录 warn 日志后继续
513
- *
514
- * @param before 时间阈值,deletedAt 早于此值的记忆将被物理删除
515
- * @returns 被清理的记忆数量
516
- */
231
+ /** 清理 deletedAt 早于 before 的软删除记忆(宿主定时器调用,默认 30 天保留期) */
517
232
  writePurgeExpired(before) {
518
- // 1. 先查询待清理的软删除记忆(listDeleted 不传 limit = 全部)
519
- // 用 before 时间戳过滤,避免清理未过期的记忆
520
- const beforeMs = before.getTime();
521
- const candidates = this.index
522
- .listDeleted()
523
- .filter((m) => m.deletedAt && new Date(m.deletedAt).getTime() < beforeMs);
524
- // 2. 关系清理:在物理删除前移除关系边,防止 memory_relations 残留孤儿边
525
- // relationStore 未注入时跳过(ADR-014 降级优先)
526
- if (this.relationStore && candidates.length > 0) {
527
- for (const m of candidates) {
528
- try {
529
- const removed = this.relationStore.removeRelationsByMemoryId(m.id);
530
- if (removed > 0) {
531
- logger.debug({ memoryId: m.id, removedRelations: removed }, '自动清理过期记忆时清理了关系边');
532
- }
533
- }
534
- catch (err) {
535
- // 单条关系清理失败不阻塞整体流程,记忆仍会被物理删除
536
- // 孤儿边比记忆残留更可控(后续可由关系图谱治理任务清理)
537
- logger.warn({ err, memoryId: m.id }, '清理过期记忆的关系边失败,可能残留孤儿边');
538
- }
539
- }
540
- }
541
- // 3. 物理删除记忆(IMemoryStorage.purgeExpired 返回被清理的数量)
542
233
  return this.index.purgeExpired(before);
543
234
  }
544
- /**
545
- * 添加记忆关系(透传 relationStore)
546
- *
547
- * 用于宿主 UI 手动创建关系(关系图右键菜单 → 连线 → 创建关系)。
548
- * relationStore 未注入时静默降级(不阻塞)。
549
- *
550
- * @param relation 关系边数据
551
- */
552
- writeAddRelation(relation) {
553
- if (!this.relationStore)
554
- return;
555
- this.relationStore.addRelation(relation);
556
- }
557
- /**
558
- * 删除记忆关系(透传 relationStore)
559
- *
560
- * 用于宿主 UI 手动删除关系(关系图右键菜单 → 编辑关系 → 删除)。
561
- * relationStore 未注入时静默降级(不阻塞)。
562
- *
563
- * @param sourceId 关系起点
564
- * @param targetId 关系终点
565
- * @param type 关系类型
566
- */
567
- writeRemoveRelation(sourceId, targetId, type) {
568
- if (!this.relationStore)
569
- return;
570
- this.relationStore.removeRelation(sourceId, targetId, type);
571
- }
572
- /**
573
- * 删除某记忆的所有关系边(透传 relationStore)
574
- *
575
- * 用于记忆软删除/物理删除场景,防止 memory_relations 表残留孤儿边。
576
- * relationStore 未注入时静默降级(不阻塞记忆删除主流程)。
577
- *
578
- * @param memoryId 记忆 ID
579
- * @returns 被删除的关系数量(relationStore 未注入时返回 0)
580
- */
581
- writeRemoveRelationsByMemoryId(memoryId) {
582
- if (!this.relationStore)
583
- return 0;
584
- return this.relationStore.removeRelationsByMemoryId(memoryId);
585
- }
586
235
  }
587
236
  //# sourceMappingURL=memoryInspector.js.map