@zooique/memora 2.0.3 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/CHANGELOG.md +1028 -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,82 +0,0 @@
1
- /**
2
- * 记忆召回 — 简化关键词搜索
3
- *
4
- * 设计哲学:每次用户发消息,从所有记忆中搜索最相关的几条注入上下文
5
- * 基于基元驱动模型,通过 source 开放字符串区分记忆来源,
6
- * 通过双通道(语义 + 关键词)召回,无需独立管理器
7
- *
8
- * 双通道融合排序算法在 hybridMerge.ts 中实现,与 memoryInspector.searchHybrid() 共享。
9
- *
10
- * 详见 ADR-004 · 记忆统一模型 + architecture_philosophy_rules.md §6 增量召回
11
- */
12
- import type { Memory } from '../memory/types.js';
13
- import type { IMemoryStorage } from '../memory/storageInterface.js';
14
- import type { IVectorStore } from '../memory/vectorStore.js';
15
- /** 一天对应的毫秒数 */
16
- export declare const ONE_DAY_MS: number;
17
- /**
18
- * 从文本中提取关键词(用于记忆召回)
19
- *
20
- * 基于 segmentText() 精确分词,叠加停用词过滤 + 英文词补充 + 去重。
21
- * 分词基础设施统一由 segmenter.ts 提供,避免重复实现。
22
- *
23
- * @param input - 输入文本
24
- * @returns 关键词数组(去重 + 停用词过滤)
25
- */
26
- export declare function extractKeywords(input: string): string[];
27
- /**
28
- * 召回选项
29
- */
30
- export interface RecallOptions {
31
- /** 返回数量上限(默认 5) */
32
- limit?: number;
33
- /** 排除的 source 标签(默认排除 persona、rule、skill——已单独注入 system prompt 的记忆) */
34
- excludeSources?: string[];
35
- /** 向量存储(可选,提供时启用语义搜索;接受任意 IVectorStore 实现) */
36
- vectorStore?: IVectorStore;
37
- /** 语义搜索相似度阈值(默认 0.3) */
38
- minSimilarity?: number;
39
- }
40
- /**
41
- * 从记忆存储中搜索相关记忆
42
- *
43
- * 双通道召回策略:
44
- * 1. 语义搜索(VectorStore 可用时):向量余弦相似度
45
- * 2. 关键词搜索(兜底):LIKE 匹配
46
- * 3. 两路结果合并去重,按 score + similarity 综合排序(委托给 hybridMerge)
47
- * 4. 排除已单独注入的记忆(persona、rule、skill)
48
- * 5. 返回 top N
49
- *
50
- * 融合排序算法已提取到 hybridMerge.ts,与 searchHybrid() 共享同一实现
51
- *
52
- * @param storage - 记忆存储实例
53
- * @param query - 搜索查询文本
54
- * @param options - 召回选项
55
- * @returns 匹配的记忆列表
56
- */
57
- export declare function recall(storage: IMemoryStorage, query: string, options?: RecallOptions): Promise<Memory[]>;
58
- /**
59
- * 批量持久化 boost 后的 score(FIX-P1-2:从 recall() 拆分出的显式写操作)
60
- *
61
- * 调用方在 recall() 后 fire-and-forget 调用本函数持久化 boost,不阻塞读路径。
62
- * 失败仅 log 不抛错,避免读路径因 boost 写入失败而中断。
63
- *
64
- * 设计权衡:
65
- * - 不在 recall() 内部 upsert:消除 IO 写耦合读路径(boost 是软指标,丢失影响小)
66
- * - 不引入 dirty 标记 + 治理调度器批量持久化:避免新增状态队列和跨模块依赖
67
- * - 立即持久化但 fire-and-forget:boost 数据不丢,读路径不阻塞
68
- *
69
- * @param storage 记忆存储实例
70
- * @param ids 待 boost 的记忆 id 列表(从 recall() 返回结果的 id 字段提取)
71
- * @param now 当前时间戳(可选,默认 nowIso())
72
- */
73
- export declare function boostScores(storage: IMemoryStorage, ids: string[], now?: string): Promise<void>;
74
- /**
75
- * 对单条记忆执行衰减计算
76
- *
77
- * @param memory - 要衰减的记忆
78
- * @param now - 当前时间(Date 对象)
79
- * @returns 是否实际发生了衰减
80
- */
81
- export declare function applyDecayToMemory(memory: Memory, now: Date): boolean;
82
- //# sourceMappingURL=recall.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/memory/recall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAe5D,eAAe;AACf,eAAO,MAAM,UAAU,QAAsB,CAAC;AAE9C;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAUvD;AAID;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,wBAAwB;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC,CA+DnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,MAAM,EAAE,EACb,GAAG,GAAE,MAAiB,GACrB,OAAO,CAAC,IAAI,CAAC,CAOf;AAkBD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAcrE"}
@@ -1,157 +0,0 @@
1
- import { logger } from '../logging/logger.js';
2
- import { SOURCE_LABELS } from '../memory/types.js';
3
- import { segmentLower, STOPWORDS } from '../utils/segmenter.js';
4
- import { nowIso } from '../utils/time.js';
5
- import { hybridMerge, RECALL_LIMIT_MULTIPLIER } from '../memory/hybridMerge.js';
6
- // 召回 score 提升量/上限/下限 + 衰减常量:使用治理共享常量(v2 REPEAT-2/REPEAT-3 闭环)
7
- // 衰减常量与宿主 SqliteStorage.decayScores 共用同一真理源,消除跨层重复硬编码
8
- import { BOOST_INCREMENT, SCORE_CEILING, DECAY_FLOOR, DECAY_AGE_DAYS, DECAY_AMOUNT } from '../memory/governance.js';
9
- // ─── 召回常量 ─────────────────────────────────────
10
- /** 语义搜索默认相似度阈值 */
11
- const DEFAULT_MIN_SIMILARITY = 0.3;
12
- /** 一天对应的毫秒数 */
13
- export const ONE_DAY_MS = 24 * 60 * 60 * 1000;
14
- /**
15
- * 从文本中提取关键词(用于记忆召回)
16
- *
17
- * 基于 segmentText() 精确分词,叠加停用词过滤 + 英文词补充 + 去重。
18
- * 分词基础设施统一由 segmenter.ts 提供,避免重复实现。
19
- *
20
- * @param input - 输入文本
21
- * @returns 关键词数组(去重 + 停用词过滤)
22
- */
23
- export function extractKeywords(input) {
24
- // 复用 segmenter.ts 的精确分词(Intl.Segmenter ICU 词典切分)
25
- const words = segmentLower(input);
26
- // 补充英文词(segmentText 可能遗漏连续英文大写缩写,如 APIKey → "apikey" 整词)
27
- const englishWords = input.match(/[a-z]{2,}/gi) || [];
28
- words.push(...englishWords.map((w) => w.toLowerCase()));
29
- // 去重 + 停用词过滤 + 最短长度
30
- return [...new Set(words)].filter((w) => w.length >= 2 && !STOPWORDS.has(w));
31
- }
32
- /**
33
- * 从记忆存储中搜索相关记忆
34
- *
35
- * 双通道召回策略:
36
- * 1. 语义搜索(VectorStore 可用时):向量余弦相似度
37
- * 2. 关键词搜索(兜底):LIKE 匹配
38
- * 3. 两路结果合并去重,按 score + similarity 综合排序(委托给 hybridMerge)
39
- * 4. 排除已单独注入的记忆(persona、rule、skill)
40
- * 5. 返回 top N
41
- *
42
- * 融合排序算法已提取到 hybridMerge.ts,与 searchHybrid() 共享同一实现
43
- *
44
- * @param storage - 记忆存储实例
45
- * @param query - 搜索查询文本
46
- * @param options - 召回选项
47
- * @returns 匹配的记忆列表
48
- */
49
- export async function recall(storage, query, options = {}) {
50
- const { limit = 5, excludeSources = [SOURCE_LABELS.PERSONA, SOURCE_LABELS.RULE, SOURCE_LABELS.SKILL], vectorStore, minSimilarity = DEFAULT_MIN_SIMILARITY, } = options;
51
- const merged = new Map();
52
- // ── 通道 1:语义搜索(VectorStore 可用时) ──
53
- if (vectorStore && vectorStore.size > 0) {
54
- try {
55
- const vectorResults = await vectorStore.search(query, limit * RECALL_LIMIT_MULTIPLIER, minSimilarity);
56
- for (const vr of vectorResults) {
57
- const memory = storage.getById(vr.id);
58
- if (memory && !excludeSources.includes(memory.source)) {
59
- merged.set(memory.id, { memory, vectorScore: vr.similarity });
60
- }
61
- }
62
- }
63
- catch (err) {
64
- logger.debug({ err }, '语义搜索失败,降级到关键词');
65
- }
66
- }
67
- // ── 通道 2:关键词搜索 ──
68
- const keywords = extractKeywords(query);
69
- if (keywords.length > 0) {
70
- // 关键词搜索失败时降级返回已收集的语义结果,与通道 1 降级策略对称
71
- try {
72
- // 使用提取后的关键词组合搜索,避免原始 query 中的停用词/噪声影响匹配
73
- const keywordResults = storage.search(keywords.join(' '), limit * RECALL_LIMIT_MULTIPLIER);
74
- for (const m of keywordResults) {
75
- if (!excludeSources.includes(m.source) && !merged.has(m.id)) {
76
- merged.set(m.id, { memory: m, vectorScore: 0 });
77
- }
78
- }
79
- }
80
- catch (err) {
81
- logger.debug({ err }, '关键词搜索失败,仅返回语义搜索结果');
82
- }
83
- }
84
- // ── 无任何结果 ──
85
- if (merged.size === 0)
86
- return [];
87
- // ── 综合排序:委托给 hybridMerge 纯函数 ──
88
- const sorted = hybridMerge(merged.values(), limit);
89
- // ── FIX-P1-2:拆分读/写,recall 只读 + boostScores 显式写 ──
90
- // 在副本上 boost,仅影响本轮上下文排序;持久化由调用方 fire-and-forget 调用 boostScores,
91
- // 不阻塞读路径,boost 写入失败不影响 chat 流程。
92
- const now = nowIso();
93
- const result = sorted.map(({ memory }) => {
94
- const copy = { ...memory };
95
- boostScore(copy, now);
96
- return copy;
97
- });
98
- return result;
99
- }
100
- /**
101
- * 批量持久化 boost 后的 score(FIX-P1-2:从 recall() 拆分出的显式写操作)
102
- *
103
- * 调用方在 recall() 后 fire-and-forget 调用本函数持久化 boost,不阻塞读路径。
104
- * 失败仅 log 不抛错,避免读路径因 boost 写入失败而中断。
105
- *
106
- * 设计权衡:
107
- * - 不在 recall() 内部 upsert:消除 IO 写耦合读路径(boost 是软指标,丢失影响小)
108
- * - 不引入 dirty 标记 + 治理调度器批量持久化:避免新增状态队列和跨模块依赖
109
- * - 立即持久化但 fire-and-forget:boost 数据不丢,读路径不阻塞
110
- *
111
- * @param storage 记忆存储实例
112
- * @param ids 待 boost 的记忆 id 列表(从 recall() 返回结果的 id 字段提取)
113
- * @param now 当前时间戳(可选,默认 nowIso())
114
- */
115
- export async function boostScores(storage, ids, now = nowIso()) {
116
- for (const id of ids) {
117
- // MIND2-L3:改用 incrementScore 原子操作,消除 read-modify-write 并发冲突
118
- // 原 getById → boostScore → upsert 三步合并为存储层一条原子更新,
119
- // 与 decayScores 同模式(避免与衰减/去重并发写时基于旧值覆盖)
120
- storage.incrementScore(id, BOOST_INCREMENT, now);
121
- }
122
- }
123
- // ─── Score 衰减机制 ─────────────────────────────────────
124
- /**
125
- * 召回时提升记忆的 score(上限 1.0)
126
- *
127
- * 每次被召回时,记忆的 score 略微提升,体现"越常用越重要"。
128
- *
129
- * @param memory - 被召回的记忆
130
- * @param now - 当前时间戳(ISO 8601)
131
- */
132
- // 模块私有(0 外部消费者,仅 recall.ts 内部调用,与 tokenizeKeywords 同模式)
133
- function boostScore(memory, now) {
134
- memory.score = Math.min(SCORE_CEILING, memory.score + BOOST_INCREMENT);
135
- memory.accessedAt = now ?? nowIso();
136
- }
137
- /**
138
- * 对单条记忆执行衰减计算
139
- *
140
- * @param memory - 要衰减的记忆
141
- * @param now - 当前时间(Date 对象)
142
- * @returns 是否实际发生了衰减
143
- */
144
- export function applyDecayToMemory(memory, now) {
145
- const accessedAt = new Date(memory.accessedAt);
146
- if (isNaN(accessedAt.getTime())) {
147
- return false; // 跳过无效日期的记忆
148
- }
149
- const daysSinceAccess = (now.getTime() - accessedAt.getTime()) / ONE_DAY_MS;
150
- if (daysSinceAccess <= DECAY_AGE_DAYS) {
151
- return false;
152
- }
153
- const periods = Math.floor(daysSinceAccess / DECAY_AGE_DAYS);
154
- memory.score = Math.max(DECAY_FLOOR, memory.score - DECAY_AMOUNT * periods);
155
- return true;
156
- }
157
- //# sourceMappingURL=recall.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/memory/recall.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,8DAA8D;AAC9D,sDAAsD;AACtD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEnH,iDAAiD;AAEjD,kBAAkB;AAClB,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,eAAe;AACf,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,iDAAiD;IACjD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAElC,yDAAyD;IACzD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAExD,oBAAoB;IACpB,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC;AAkBD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAuB,EACvB,KAAa,EACb,UAAyB,EAAE;IAE3B,MAAM,EACJ,KAAK,GAAG,CAAC,EACT,cAAc,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,EACjF,WAAW,EACX,aAAa,GAAG,sBAAsB,GACvC,GAAG,OAAO,CAAC;IAEZ,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmD,CAAC;IAE1E,mCAAmC;IACnC,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,MAAM,CAC5C,KAAK,EACL,KAAK,GAAG,uBAAuB,EAC/B,aAAa,CACd,CAAC;YACF,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACtC,IAAI,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;oBACtD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,oCAAoC;QACpC,IAAI,CAAC;YACH,wCAAwC;YACxC,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,uBAAuB,CAAC,CAAC;YAC3F,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;gBAC/B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,cAAc;IACd,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,iCAAiC;IACjC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;IAEnD,mDAAmD;IACnD,gEAAgE;IAChE,gCAAgC;IAChC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,MAAM,GAAa,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;QAC3B,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAuB,EACvB,GAAa,EACb,MAAc,MAAM,EAAE;IAEtB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,4DAA4D;QAC5D,kDAAkD;QAClD,wCAAwC;QACxC,OAAO,CAAC,cAAc,CAAC,EAAE,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,uDAAuD;AAEvD;;;;;;;GAOG;AACH,wDAAwD;AACxD,SAAS,UAAU,CAAC,MAAc,EAAE,GAAY;IAC9C,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC;IACvE,MAAM,CAAC,UAAU,GAAG,GAAG,IAAI,MAAM,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,GAAS;IAC1D,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,CAAC,YAAY;IAC5B,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;IAC5E,IAAI,eAAe,IAAI,cAAc,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,cAAc,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,GAAG,YAAY,GAAG,OAAO,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,95 +0,0 @@
1
- /**
2
- * 记忆关系存储接口 — 独立于 IMemoryStorage 的侧车接口
3
- *
4
- * 设计原则(ADR-014):
5
- * - 侧车模型:不侵入 Memory 7 字段基元,与 IMemoryStorage 平行存在
6
- * - 接口注入:内核提供接口,宿主项目注入实现(如 SqliteRelationStore)
7
- * - 零 native 依赖:内核不依赖 better-sqlite3 等 native 模块
8
- *
9
- * 宿主项目实现示例:
10
- * - SqliteRelationStore:扩展 memory_relations 表,依赖 better-sqlite3
11
- * - InMemoryRelationStore:测试用实现,纯内存数组
12
- *
13
- * 关系构建时机与层属(ADR-014 §5):
14
- * - 机制层(候选召回 + prompt 构建 + 关系写入 + 冲突检测)在内核
15
- * src/agent/managers/relationBuilder.ts,LLM 调用合并到 InsightExtractor
16
- * 单次 extract() 中,不增加 LLM 调用次数
17
- * - 宿主项目(Sprite 层)仅需注入 IMemoryRelationStore 实现
18
- * - 遵循降级优先(ADR-006):关系构建失败不阻塞对话,仅记录日志
19
- */
20
- import type { MemoryRelation, RelationDirection } from '../memory/types.js';
21
- /**
22
- * 记忆关系存储接口(侧车)
23
- *
24
- * 独立于 IMemoryStorage,不依赖 Memory 7 字段。
25
- * 宿主项目实现此接口并注入 Agent,用于:
26
- * - 冲突检测:getRelationsByType('contradicts')
27
- * - 召回增强:getRelations(memoryId, 'both')
28
- * - 拓扑可视化:getAllRelations()
29
- */
30
- export interface IMemoryRelationStore {
31
- /**
32
- * 添加关系
33
- *
34
- * sourceId+targetId+type 三元组唯一约束,重复添加应幂等(更新 weight/createdAt 或忽略)。
35
- *
36
- * @param relation 关系数据(sourceId/targetId/type/weight/createdAt)
37
- */
38
- addRelation(relation: MemoryRelation): void;
39
- /**
40
- * 查询某记忆的关系
41
- *
42
- * @param memoryId 记忆 ID
43
- * @param direction 方向过滤(默认 'both'):
44
- * - 'outgoing':只查 sourceId = memoryId 的关系(冲突检测用)
45
- * - 'incoming':只查 targetId = memoryId 的关系
46
- * - 'both':合并两个方向并去重(可视化/召回增强用)
47
- * @returns 匹配的关系列表
48
- */
49
- getRelations(memoryId: string, direction?: RelationDirection): MemoryRelation[];
50
- /**
51
- * 按关系类型查询
52
- *
53
- * 用于冲突检测:getRelationsByType('contradicts') 获取所有矛盾关系。
54
- *
55
- * @param type 关系类型(开放字符串,如 'contradicts'/'supports'/'follows')
56
- * @returns 匹配的关系列表
57
- */
58
- getRelationsByType(type: string): MemoryRelation[];
59
- /**
60
- * 获取全部关系
61
- *
62
- * 用于拓扑可视化构建节点+边图谱。
63
- * 数据量大时(>10000)可改为分页,但 Phase 1 不需要。
64
- *
65
- * @returns 全部关系列表
66
- */
67
- getAllRelations(): MemoryRelation[];
68
- /**
69
- * 删除指定关系
70
- *
71
- * sourceId+targetId+type 唯一定位,删除单条关系。
72
- * 用于关系修正(用户确认冲突后删除误判关系)。
73
- *
74
- * @param sourceId 关系起点
75
- * @param targetId 关系终点
76
- * @param type 关系类型
77
- */
78
- removeRelation(sourceId: string, targetId: string, type: string): void;
79
- /**
80
- * 删除某记忆的所有关系(不论方向)
81
- *
82
- * 删除 sourceId 或 targetId 等于 memoryId 的所有关系边。
83
- * 用于记忆删除/物理清除场景,防止 memory_relations 表残留孤儿边。
84
- *
85
- * 实现约束:
86
- * - 必须原子执行(单条 SQL DELETE WHERE sourceId=? OR targetId=?)
87
- * - 返回被删除的关系数量,便于审计
88
- * - 不存在的 memoryId 返回 0,不抛错
89
- *
90
- * @param memoryId 记忆 ID
91
- * @returns 被删除的关系数量
92
- */
93
- removeRelationsByMemoryId(memoryId: string): number;
94
- }
95
- //# sourceMappingURL=relationStore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"relationStore.d.ts","sourceRoot":"","sources":["../../src/memory/relationStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3E;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;OAMG;IACH,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAE5C;;;;;;;;;OASG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAEhF;;;;;;;OAOG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;IAEnD;;;;;;;OAOG;IACH,eAAe,IAAI,cAAc,EAAE,CAAC;IAEpC;;;;;;;;;OASG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvE;;;;;;;;;;;;;OAaG;IACH,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CACrD"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=relationStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"relationStore.js","sourceRoot":"","sources":["../../src/memory/relationStore.ts"],"names":[],"mappings":""}
@@ -1,71 +0,0 @@
1
- import { type Memory } from '../memory/types.js';
2
- /**
3
- * 文件存储类
4
- *
5
- * 每个 source 对应一个子目录(personas/rules/skills/…)
6
- * 读取时通过 inferSource() 从文件路径推断 source
7
- */
8
- export declare class FileStore {
9
- private readonly dataDir;
10
- constructor(dataDir: string);
11
- /**
12
- * 读取记忆文件
13
- *
14
- * @param source - 来源标签(如 'rule'、'persona')
15
- * @param name - 记忆名(不含扩展名)
16
- */
17
- read(source: string, name: string): Promise<Memory | null>;
18
- /**
19
- * 写入记忆文件
20
- *
21
- * frontmatter 包含标准字段(id/source/score/createdAt/accessedAt)
22
- * 和 memory.metadata 中的额外元数据(如 keywords/description)。
23
- */
24
- write(memory: Memory): Promise<void>;
25
- /**
26
- * 列出某个 source 下的所有记忆
27
- *
28
- * @param source - 来源标签(如 'rule'、'persona')
29
- * @returns 记忆名称列表(不含扩展名)
30
- */
31
- list(source: string): Promise<string[]>;
32
- /**
33
- * 获取文件路径
34
- */
35
- private getFilePath;
36
- /**
37
- * source 到目录名的映射
38
- *
39
- * 已知 source 使用预定义目录,未知 source 直接用 source 字符串作目录名。
40
- * 安全校验:调用 validateSource 拒绝路径遍历(`..`)、null 字节等危险字符,
41
- * 防止未知 source 被构造为恶意路径绕过 SOURCE_TO_DIR 白名单。
42
- */
43
- private sourceToDir;
44
- /**
45
- * 文件系统错误统一处理
46
- *
47
- * 区分两类错误:
48
- * - ENOENT(文件/目录不存在):正常情况,静默返回
49
- * - 其他错误(EACCES/EISDIR 等):真实故障,抛出异常让调用方感知
50
- *
51
- * 之前所有错误统一返回 null/[],导致磁盘故障伪装成"无数据",
52
- * 用户感知不到数据丢失。现区分:ENOENT 静默,其他抛错。
53
- *
54
- * @param err 捕获的异常
55
- * @param path 文件/目录路径(用于日志上下文)
56
- * @param label 日志标签(中文,如 "记忆文件读取失败")
57
- * @throws {NodeJS.ErrnoException} 非 ENOENT 错误时重新抛出
58
- */
59
- private handleFsError;
60
- /**
61
- * 解析记忆文件为 Memory 对象
62
- *
63
- * @param source - 来源标签
64
- * @param name - 记忆名
65
- * @param raw - 文件原始内容
66
- * @param filePath - 文件路径(用于 inferSource 回退)
67
- * @param mtime - 文件修改时间
68
- */
69
- private parseMemory;
70
- }
71
- //# sourceMappingURL=store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"AAQA,OAAO,EAAuC,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAmBrF;;;;;GAKG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAE5C;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkBhE;;;;;OAKG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB1C;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAc7C;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAanB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,aAAa;IAWrB;;;;;;;;OAQG;IACH,OAAO,CAAC,WAAW;CA4CpB"}
@@ -1,199 +0,0 @@
1
- /**
2
- * 记忆文件存储
3
- *
4
- * 冷热分离中的"热":文件承载记忆本体
5
- * 详见 ADR-002 · IMemoryStorage 接口与宿主注入模式
6
- */
7
- import { readFile, writeFile, mkdir, readdir, stat } from 'node:fs/promises';
8
- import { join, dirname } from 'node:path';
9
- import { SOURCE_LABELS, DEFAULT_MEMORY_SCORE } from '../memory/types.js';
10
- import { inferSource, validateSource } from '../memory/sourceValidation.js';
11
- import { parseFrontmatter, serializeFrontmatter as serializeFm } from '../utils/frontmatter.js';
12
- import { logger } from '../logging/logger.js';
13
- import { toError } from '../utils/toError.js';
14
- import { configError } from '../utils/errors.js';
15
- /**
16
- * 已知 source 到文件系统目录的映射
17
- *
18
- * 仅覆盖配置类记忆(启动时扫描的 persona/rule/skill);
19
- * 运行时产生的记忆(insight/profile/work-projection)不由 FileStore 管理
20
- */
21
- const SOURCE_TO_DIR = {
22
- [SOURCE_LABELS.PERSONA]: 'personas',
23
- [SOURCE_LABELS.RULE]: 'rules',
24
- [SOURCE_LABELS.SKILL]: 'skills',
25
- };
26
- /**
27
- * 文件存储类
28
- *
29
- * 每个 source 对应一个子目录(personas/rules/skills/…)
30
- * 读取时通过 inferSource() 从文件路径推断 source
31
- */
32
- export class FileStore {
33
- dataDir;
34
- constructor(dataDir) {
35
- this.dataDir = dataDir;
36
- }
37
- /**
38
- * 读取记忆文件
39
- *
40
- * @param source - 来源标签(如 'rule'、'persona')
41
- * @param name - 记忆名(不含扩展名)
42
- */
43
- async read(source, name) {
44
- const filePath = this.getFilePath(source, name);
45
- // 异步读取:文件不存在时 readFile 抛 ENOENT,handleFsError 对 ENOENT 静默返回(read 返回 null)
46
- // 其他错误(EACCES/EISDIR 等)由 handleFsError 重新抛出,让调用方感知故障
47
- let content;
48
- let fileStat;
49
- try {
50
- content = await readFile(filePath, 'utf-8');
51
- fileStat = await stat(filePath);
52
- }
53
- catch (err) {
54
- this.handleFsError(err, filePath, '记忆文件读取失败');
55
- return null; // 仅 ENOENT 到达此处(其他错误已在 handleFsError 抛出)
56
- }
57
- // 从文件路径推断 source(frontmatter 可覆盖)
58
- return this.parseMemory(source, name, content, filePath, fileStat.mtime);
59
- }
60
- /**
61
- * 写入记忆文件
62
- *
63
- * frontmatter 包含标准字段(id/source/score/createdAt/accessedAt)
64
- * 和 memory.metadata 中的额外元数据(如 keywords/description)。
65
- */
66
- async write(memory) {
67
- const filePath = this.getFilePath(memory.source, memory.name);
68
- await mkdir(dirname(filePath), { recursive: true });
69
- // 标准字段必须优先于 metadata:metadata 中可能含同名键(如恶意的 source='evil'),
70
- // 若后展开则劫持 source 语义绕过 sourceValidation。先展开 metadata,再显式覆盖标准字段;
71
- // 并过滤掉与标准字段同名的 metadata 键,避免写入重复行(如 source: evil\n source: normal)。
72
- const STANDARD_KEYS = new Set(['id', 'source', 'score', 'createdAt', 'accessedAt']);
73
- const safeMeta = {};
74
- for (const [k, v] of Object.entries(memory.metadata ?? {})) {
75
- if (!STANDARD_KEYS.has(k))
76
- safeMeta[k] = v;
77
- }
78
- const frontmatter = serializeFm({
79
- ...safeMeta,
80
- id: memory.id,
81
- source: memory.source,
82
- score: String(memory.score),
83
- createdAt: memory.createdAt,
84
- accessedAt: memory.accessedAt,
85
- });
86
- const content = `---\n${frontmatter}\n---\n\n${memory.content}`;
87
- await writeFile(filePath, content, 'utf-8');
88
- }
89
- /**
90
- * 列出某个 source 下的所有记忆
91
- *
92
- * @param source - 来源标签(如 'rule'、'persona')
93
- * @returns 记忆名称列表(不含扩展名)
94
- */
95
- async list(source) {
96
- const dir = join(this.dataDir, this.sourceToDir(source));
97
- // 异步读取:目录不存在时 readdir 抛 ENOENT,handleFsError 对 ENOENT 静默返回(list 返回 [])
98
- // 其他错误由 handleFsError 重新抛出,让调用方感知故障
99
- let files;
100
- try {
101
- files = await readdir(dir);
102
- }
103
- catch (err) {
104
- this.handleFsError(err, dir, '记忆目录读取失败');
105
- return []; // 仅 ENOENT 到达此处(其他错误已在 handleFsError 抛出)
106
- }
107
- return files.filter((f) => f.endsWith('.md')).map((f) => f.replace(/\.md$/, ''));
108
- }
109
- /**
110
- * 获取文件路径
111
- */
112
- getFilePath(source, name) {
113
- return join(this.dataDir, this.sourceToDir(source), `${name}.md`);
114
- }
115
- /**
116
- * source 到目录名的映射
117
- *
118
- * 已知 source 使用预定义目录,未知 source 直接用 source 字符串作目录名。
119
- * 安全校验:调用 validateSource 拒绝路径遍历(`..`)、null 字节等危险字符,
120
- * 防止未知 source 被构造为恶意路径绕过 SOURCE_TO_DIR 白名单。
121
- */
122
- sourceToDir(source) {
123
- const result = validateSource(source);
124
- if (result.severity === 'block') {
125
- // 路径遍历 / null 字节 / 空字符串等安全边界违规,必须拒绝
126
- throw configError('source 校验失败,拒绝映射到目录', result.warning, ['检查 source 字段是否包含路径遍历序列或特殊字符']);
127
- }
128
- return SOURCE_TO_DIR[source] ?? source;
129
- }
130
- /**
131
- * 文件系统错误统一处理
132
- *
133
- * 区分两类错误:
134
- * - ENOENT(文件/目录不存在):正常情况,静默返回
135
- * - 其他错误(EACCES/EISDIR 等):真实故障,抛出异常让调用方感知
136
- *
137
- * 之前所有错误统一返回 null/[],导致磁盘故障伪装成"无数据",
138
- * 用户感知不到数据丢失。现区分:ENOENT 静默,其他抛错。
139
- *
140
- * @param err 捕获的异常
141
- * @param path 文件/目录路径(用于日志上下文)
142
- * @param label 日志标签(中文,如 "记忆文件读取失败")
143
- * @throws {NodeJS.ErrnoException} 非 ENOENT 错误时重新抛出
144
- */
145
- handleFsError(err, path, label) {
146
- const error = toError(err);
147
- if (error.code === 'ENOENT') {
148
- // 文件/目录不存在是正常情况(首次启动、新项目等),静默返回
149
- return;
150
- }
151
- // 非 ENOENT 错误:记录警告并重新抛出,让调用方区分"无数据"与"故障"
152
- logger.warn({ path, code: error.code, err: error.message }, label);
153
- throw error;
154
- }
155
- /**
156
- * 解析记忆文件为 Memory 对象
157
- *
158
- * @param source - 来源标签
159
- * @param name - 记忆名
160
- * @param raw - 文件原始内容
161
- * @param filePath - 文件路径(用于 inferSource 回退)
162
- * @param mtime - 文件修改时间
163
- */
164
- parseMemory(source, name, raw, filePath, mtime) {
165
- const { frontmatter: meta, body } = parseFrontmatter(raw);
166
- // 从 frontmatter 读取 source(如有显式声明则覆盖)
167
- const resolvedSource = meta['source'] ?? inferSource(filePath, source);
168
- // 无 frontmatter 时,使用默认值
169
- if (Object.keys(meta).length === 0) {
170
- const now = mtime.toISOString();
171
- return {
172
- id: `${resolvedSource}:${name}`,
173
- content: raw,
174
- source: resolvedSource,
175
- name,
176
- createdAt: now,
177
- accessedAt: now,
178
- score: DEFAULT_MEMORY_SCORE,
179
- };
180
- }
181
- const now = mtime.toISOString();
182
- // 修复 #34:校验 score,防止 NaN/越界值违反校验规则(min(0).max(1))
183
- // frontmatter 中 score 字段若为非数字字符串(如 "abc"),Number 返回 NaN 会破坏后续写入
184
- const rawScore = Number(meta['score'] ?? DEFAULT_MEMORY_SCORE);
185
- const score = Number.isFinite(rawScore) && rawScore >= 0 && rawScore <= 1
186
- ? rawScore
187
- : DEFAULT_MEMORY_SCORE;
188
- return {
189
- id: meta['id'] ?? `${resolvedSource}:${name}`,
190
- content: body.trim(),
191
- source: resolvedSource,
192
- name,
193
- createdAt: meta['createdAt'] ?? now,
194
- accessedAt: meta['accessedAt'] ?? now,
195
- score,
196
- };
197
- }
198
- }
199
- //# sourceMappingURL=store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"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"}