@zooique/memora 0.1.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 (239) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -0
  3. package/dist/agent/agent.d.ts +343 -0
  4. package/dist/agent/agent.d.ts.map +1 -0
  5. package/dist/agent/agent.js +893 -0
  6. package/dist/agent/agent.js.map +1 -0
  7. package/dist/agent/assembler.d.ts +77 -0
  8. package/dist/agent/assembler.d.ts.map +1 -0
  9. package/dist/agent/assembler.js +115 -0
  10. package/dist/agent/assembler.js.map +1 -0
  11. package/dist/agent/builtinToolHandlers.d.ts +96 -0
  12. package/dist/agent/builtinToolHandlers.d.ts.map +1 -0
  13. package/dist/agent/builtinToolHandlers.js +388 -0
  14. package/dist/agent/builtinToolHandlers.js.map +1 -0
  15. package/dist/agent/builtinTools.d.ts +35 -0
  16. package/dist/agent/builtinTools.d.ts.map +1 -0
  17. package/dist/agent/builtinTools.js +75 -0
  18. package/dist/agent/builtinTools.js.map +1 -0
  19. package/dist/agent/constants.d.ts +67 -0
  20. package/dist/agent/constants.d.ts.map +1 -0
  21. package/dist/agent/constants.js +67 -0
  22. package/dist/agent/constants.js.map +1 -0
  23. package/dist/agent/contextManager.d.ts +130 -0
  24. package/dist/agent/contextManager.d.ts.map +1 -0
  25. package/dist/agent/contextManager.js +287 -0
  26. package/dist/agent/contextManager.js.map +1 -0
  27. package/dist/agent/loop.d.ts +288 -0
  28. package/dist/agent/loop.d.ts.map +1 -0
  29. package/dist/agent/loop.js +756 -0
  30. package/dist/agent/loop.js.map +1 -0
  31. package/dist/agent/managers/autoConfigRefiner.d.ts +39 -0
  32. package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -0
  33. package/dist/agent/managers/autoConfigRefiner.js +150 -0
  34. package/dist/agent/managers/autoConfigRefiner.js.map +1 -0
  35. package/dist/agent/managers/configManager.d.ts +114 -0
  36. package/dist/agent/managers/configManager.d.ts.map +1 -0
  37. package/dist/agent/managers/configManager.js +186 -0
  38. package/dist/agent/managers/configManager.js.map +1 -0
  39. package/dist/agent/managers/insightExtractor.d.ts +141 -0
  40. package/dist/agent/managers/insightExtractor.d.ts.map +1 -0
  41. package/dist/agent/managers/insightExtractor.js +420 -0
  42. package/dist/agent/managers/insightExtractor.js.map +1 -0
  43. package/dist/agent/managers/memoryAdvisor.d.ts +96 -0
  44. package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -0
  45. package/dist/agent/managers/memoryAdvisor.js +198 -0
  46. package/dist/agent/managers/memoryAdvisor.js.map +1 -0
  47. package/dist/agent/managers/memoryInspector.d.ts +231 -0
  48. package/dist/agent/managers/memoryInspector.d.ts.map +1 -0
  49. package/dist/agent/managers/memoryInspector.js +327 -0
  50. package/dist/agent/managers/memoryInspector.js.map +1 -0
  51. package/dist/agent/managers/sessionManager.d.ts +89 -0
  52. package/dist/agent/managers/sessionManager.d.ts.map +1 -0
  53. package/dist/agent/managers/sessionManager.js +178 -0
  54. package/dist/agent/managers/sessionManager.js.map +1 -0
  55. package/dist/agent/managers/userFactExtractor.d.ts +25 -0
  56. package/dist/agent/managers/userFactExtractor.d.ts.map +1 -0
  57. package/dist/agent/managers/userFactExtractor.js +81 -0
  58. package/dist/agent/managers/userFactExtractor.js.map +1 -0
  59. package/dist/agent/managers/workProjection.d.ts +117 -0
  60. package/dist/agent/managers/workProjection.d.ts.map +1 -0
  61. package/dist/agent/managers/workProjection.js +290 -0
  62. package/dist/agent/managers/workProjection.js.map +1 -0
  63. package/dist/agent/messageHistory.d.ts +157 -0
  64. package/dist/agent/messageHistory.d.ts.map +1 -0
  65. package/dist/agent/messageHistory.js +288 -0
  66. package/dist/agent/messageHistory.js.map +1 -0
  67. package/dist/agent/toolExecutor.d.ts +137 -0
  68. package/dist/agent/toolExecutor.d.ts.map +1 -0
  69. package/dist/agent/toolExecutor.js +209 -0
  70. package/dist/agent/toolExecutor.js.map +1 -0
  71. package/dist/agent/tracer.d.ts +122 -0
  72. package/dist/agent/tracer.d.ts.map +1 -0
  73. package/dist/agent/tracer.js +64 -0
  74. package/dist/agent/tracer.js.map +1 -0
  75. package/dist/agent/types.d.ts +98 -0
  76. package/dist/agent/types.d.ts.map +1 -0
  77. package/dist/agent/types.js +19 -0
  78. package/dist/agent/types.js.map +1 -0
  79. package/dist/config/loader.d.ts +229 -0
  80. package/dist/config/loader.d.ts.map +1 -0
  81. package/dist/config/loader.js +194 -0
  82. package/dist/config/loader.js.map +1 -0
  83. package/dist/eval/evalTypes.d.ts +118 -0
  84. package/dist/eval/evalTypes.d.ts.map +1 -0
  85. package/dist/eval/evalTypes.js +102 -0
  86. package/dist/eval/evalTypes.js.map +1 -0
  87. package/dist/index.d.ts +61 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +44 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/llm/embedding.d.ts +62 -0
  92. package/dist/llm/embedding.d.ts.map +1 -0
  93. package/dist/llm/embedding.js +162 -0
  94. package/dist/llm/embedding.js.map +1 -0
  95. package/dist/llm/factory.d.ts +39 -0
  96. package/dist/llm/factory.d.ts.map +1 -0
  97. package/dist/llm/factory.js +108 -0
  98. package/dist/llm/factory.js.map +1 -0
  99. package/dist/llm/openaiCompatible.d.ts +63 -0
  100. package/dist/llm/openaiCompatible.d.ts.map +1 -0
  101. package/dist/llm/openaiCompatible.js +340 -0
  102. package/dist/llm/openaiCompatible.js.map +1 -0
  103. package/dist/llm/provider.d.ts +91 -0
  104. package/dist/llm/provider.d.ts.map +1 -0
  105. package/dist/llm/provider.js +14 -0
  106. package/dist/llm/provider.js.map +1 -0
  107. package/dist/llm/types.d.ts +25 -0
  108. package/dist/llm/types.d.ts.map +1 -0
  109. package/dist/llm/types.js +7 -0
  110. package/dist/llm/types.js.map +1 -0
  111. package/dist/logging/logger.d.ts +39 -0
  112. package/dist/logging/logger.d.ts.map +1 -0
  113. package/dist/logging/logger.js +279 -0
  114. package/dist/logging/logger.js.map +1 -0
  115. package/dist/logging/loggerInterface.d.ts +33 -0
  116. package/dist/logging/loggerInterface.d.ts.map +1 -0
  117. package/dist/logging/loggerInterface.js +2 -0
  118. package/dist/logging/loggerInterface.js.map +1 -0
  119. package/dist/memory/inMemoryRelationStore.d.ts +51 -0
  120. package/dist/memory/inMemoryRelationStore.d.ts.map +1 -0
  121. package/dist/memory/inMemoryRelationStore.js +65 -0
  122. package/dist/memory/inMemoryRelationStore.js.map +1 -0
  123. package/dist/memory/inMemoryStorage.d.ts +97 -0
  124. package/dist/memory/inMemoryStorage.d.ts.map +1 -0
  125. package/dist/memory/inMemoryStorage.js +177 -0
  126. package/dist/memory/inMemoryStorage.js.map +1 -0
  127. package/dist/memory/loader.d.ts +49 -0
  128. package/dist/memory/loader.d.ts.map +1 -0
  129. package/dist/memory/loader.js +93 -0
  130. package/dist/memory/loader.js.map +1 -0
  131. package/dist/memory/projectManager.d.ts +182 -0
  132. package/dist/memory/projectManager.d.ts.map +1 -0
  133. package/dist/memory/projectManager.js +441 -0
  134. package/dist/memory/projectManager.js.map +1 -0
  135. package/dist/memory/recall.d.ts +77 -0
  136. package/dist/memory/recall.d.ts.map +1 -0
  137. package/dist/memory/recall.js +147 -0
  138. package/dist/memory/recall.js.map +1 -0
  139. package/dist/memory/relationStore.d.ts +78 -0
  140. package/dist/memory/relationStore.d.ts.map +1 -0
  141. package/dist/memory/relationStore.js +2 -0
  142. package/dist/memory/relationStore.js.map +1 -0
  143. package/dist/memory/sessionStore.d.ts +84 -0
  144. package/dist/memory/sessionStore.d.ts.map +1 -0
  145. package/dist/memory/sessionStore.js +2 -0
  146. package/dist/memory/sessionStore.js.map +1 -0
  147. package/dist/memory/storageInterface.d.ts +107 -0
  148. package/dist/memory/storageInterface.d.ts.map +1 -0
  149. package/dist/memory/storageInterface.js +2 -0
  150. package/dist/memory/storageInterface.js.map +1 -0
  151. package/dist/memory/store.d.ts +50 -0
  152. package/dist/memory/store.d.ts.map +1 -0
  153. package/dist/memory/store.js +160 -0
  154. package/dist/memory/store.js.map +1 -0
  155. package/dist/memory/types.d.ts +189 -0
  156. package/dist/memory/types.d.ts.map +1 -0
  157. package/dist/memory/types.js +230 -0
  158. package/dist/memory/types.js.map +1 -0
  159. package/dist/memory/userProfile.d.ts +156 -0
  160. package/dist/memory/userProfile.d.ts.map +1 -0
  161. package/dist/memory/userProfile.js +315 -0
  162. package/dist/memory/userProfile.js.map +1 -0
  163. package/dist/memory/vectorStore.d.ts +75 -0
  164. package/dist/memory/vectorStore.d.ts.map +1 -0
  165. package/dist/memory/vectorStore.js +144 -0
  166. package/dist/memory/vectorStore.js.map +1 -0
  167. package/dist/persona/personaManager.d.ts +121 -0
  168. package/dist/persona/personaManager.d.ts.map +1 -0
  169. package/dist/persona/personaManager.js +349 -0
  170. package/dist/persona/personaManager.js.map +1 -0
  171. package/dist/persona/types.d.ts +32 -0
  172. package/dist/persona/types.d.ts.map +1 -0
  173. package/dist/persona/types.js +5 -0
  174. package/dist/persona/types.js.map +1 -0
  175. package/dist/security/pathGuard.d.ts +121 -0
  176. package/dist/security/pathGuard.d.ts.map +1 -0
  177. package/dist/security/pathGuard.js +276 -0
  178. package/dist/security/pathGuard.js.map +1 -0
  179. package/dist/skill/skillManager.d.ts +82 -0
  180. package/dist/skill/skillManager.d.ts.map +1 -0
  181. package/dist/skill/skillManager.js +198 -0
  182. package/dist/skill/skillManager.js.map +1 -0
  183. package/dist/skill/types.d.ts +28 -0
  184. package/dist/skill/types.d.ts.map +1 -0
  185. package/dist/skill/types.js +5 -0
  186. package/dist/skill/types.js.map +1 -0
  187. package/dist/utils/errors.d.ts +86 -0
  188. package/dist/utils/errors.d.ts.map +1 -0
  189. package/dist/utils/errors.js +143 -0
  190. package/dist/utils/errors.js.map +1 -0
  191. package/dist/utils/eventEmitter.d.ts +87 -0
  192. package/dist/utils/eventEmitter.d.ts.map +1 -0
  193. package/dist/utils/eventEmitter.js +79 -0
  194. package/dist/utils/eventEmitter.js.map +1 -0
  195. package/dist/utils/frontmatter.d.ts +24 -0
  196. package/dist/utils/frontmatter.d.ts.map +1 -0
  197. package/dist/utils/frontmatter.js +44 -0
  198. package/dist/utils/frontmatter.js.map +1 -0
  199. package/dist/utils/json.d.ts +20 -0
  200. package/dist/utils/json.d.ts.map +1 -0
  201. package/dist/utils/json.js +65 -0
  202. package/dist/utils/json.js.map +1 -0
  203. package/dist/utils/loggerHolder.d.ts +37 -0
  204. package/dist/utils/loggerHolder.d.ts.map +1 -0
  205. package/dist/utils/loggerHolder.js +49 -0
  206. package/dist/utils/loggerHolder.js.map +1 -0
  207. package/dist/utils/math.d.ts +5 -0
  208. package/dist/utils/math.d.ts.map +1 -0
  209. package/dist/utils/math.js +19 -0
  210. package/dist/utils/math.js.map +1 -0
  211. package/dist/utils/path.d.ts +28 -0
  212. package/dist/utils/path.d.ts.map +1 -0
  213. package/dist/utils/path.js +33 -0
  214. package/dist/utils/path.js.map +1 -0
  215. package/dist/utils/safeTimer.d.ts +26 -0
  216. package/dist/utils/safeTimer.d.ts.map +1 -0
  217. package/dist/utils/safeTimer.js +49 -0
  218. package/dist/utils/safeTimer.js.map +1 -0
  219. package/dist/utils/scanner.d.ts +54 -0
  220. package/dist/utils/scanner.d.ts.map +1 -0
  221. package/dist/utils/scanner.js +115 -0
  222. package/dist/utils/scanner.js.map +1 -0
  223. package/dist/utils/segmenter.d.ts +30 -0
  224. package/dist/utils/segmenter.d.ts.map +1 -0
  225. package/dist/utils/segmenter.js +80 -0
  226. package/dist/utils/segmenter.js.map +1 -0
  227. package/dist/utils/strings.d.ts +18 -0
  228. package/dist/utils/strings.d.ts.map +1 -0
  229. package/dist/utils/strings.js +25 -0
  230. package/dist/utils/strings.js.map +1 -0
  231. package/dist/utils/time.d.ts +23 -0
  232. package/dist/utils/time.d.ts.map +1 -0
  233. package/dist/utils/time.js +31 -0
  234. package/dist/utils/time.js.map +1 -0
  235. package/dist/utils/toError.d.ts +13 -0
  236. package/dist/utils/toError.d.ts.map +1 -0
  237. package/dist/utils/toError.js +22 -0
  238. package/dist/utils/toError.js.map +1 -0
  239. package/package.json +73 -0
@@ -0,0 +1,96 @@
1
+ import type { IMemoryStorage } from '../../memory/storageInterface.js';
2
+ /** 记忆源健康状态 */
3
+ export type SourceHealthStatus = 'healthy' | 'warning' | 'critical';
4
+ /** 单个 source 的健康指标 */
5
+ export interface SourceHealthEntry {
6
+ /** 来源标签 */
7
+ source: string;
8
+ /** 记忆数量 */
9
+ count: number;
10
+ /** 平均 score(0-1) */
11
+ avgScore: number;
12
+ /** 距上次访问的天数(取该 source 中最近访问的记忆) */
13
+ daysSinceLastAccess: number;
14
+ /** 健康状态:healthy(score≥0.5 且 7 天内有访问)/ warning(score<0.5 或 7-30 天未访问)/ critical(score<0.2 或 30 天以上未访问) */
15
+ status: SourceHealthStatus;
16
+ }
17
+ /** 记忆源健康诊断报告 */
18
+ export interface SourceHealthReport {
19
+ /** 各 source 健康指标 */
20
+ sources: SourceHealthEntry[];
21
+ /** 整体健康状态(取最差 source 的状态) */
22
+ overallStatus: SourceHealthStatus;
23
+ /** 诊断时间(ISO 8601) */
24
+ diagnosedAt: string;
25
+ }
26
+ /** 关联推荐选项 */
27
+ export interface SuggestOptions {
28
+ /** 返回数量上限(默认 5) */
29
+ limit?: number;
30
+ /** 排除的 source 标签(默认排除 persona、rule、skill) */
31
+ excludeSources?: string[];
32
+ /** 时效性权重(0-1,默认 0.3):越高越偏好最近访问的记忆 */
33
+ recencyWeight?: number;
34
+ }
35
+ /** 关联推荐结果 */
36
+ export interface SuggestHit {
37
+ /** 记忆名称 */
38
+ name: string;
39
+ /** 来源标签 */
40
+ source: string;
41
+ /** 推荐分数(0-1,由 score + recency 综合计算) */
42
+ relevance: number;
43
+ /** 内容预览(截断到 120 字符) */
44
+ contentPreview: string;
45
+ /** 推荐理由 */
46
+ reason: string;
47
+ }
48
+ /**
49
+ * 记忆顾问
50
+ *
51
+ * 从 MemoryInspector 拆分(QC-R2-11),负责基于记忆数据的分析计算:
52
+ * - sourceHealth():记忆源健康诊断(数量、score、新鲜度)
53
+ * - suggest():关联推荐(基于 score + 时效性 + 多样性)
54
+ *
55
+ * 与 MemoryInspector 的分工:
56
+ * - MemoryInspector:直接数据查询(snapshot/search/stats/relations + 写操作代理)
57
+ * - MemoryAdvisor:分析计算(健康诊断 + 推荐排序)
58
+ */
59
+ export declare class MemoryAdvisor {
60
+ private readonly index;
61
+ /**
62
+ * @param index - 记忆存储(只读访问,用于健康诊断和推荐计算)
63
+ */
64
+ constructor(index: IMemoryStorage);
65
+ /**
66
+ * 记忆源健康诊断
67
+ *
68
+ * 为每个 source 计算健康指标(数量、平均 score、新鲜度、状态),
69
+ * 帮助宿主项目判断是否需要触发衰减、清理或补充。
70
+ *
71
+ * 健康状态判定:
72
+ * - healthy:avgScore ≥ 0.5 且 7 天内有访问
73
+ * - warning:avgScore < 0.5 或 7-30 天未访问
74
+ * - critical:avgScore < 0.2 或 30 天以上未访问
75
+ *
76
+ * 纯只读、同步、不调 LLM,与 stats() 互补(stats 只有数量,本方法有质量指标)。
77
+ * P2-2 优化:使用 getAllSources() 发现所有 source 标签,替代全量 search。
78
+ */
79
+ sourceHealth(): SourceHealthReport;
80
+ /**
81
+ * 关联推荐:基于已有记忆数据,推荐你可能感兴趣的记忆
82
+ *
83
+ * 不调 LLM,纯计算。综合 score(权重)+ accessedAt(时效性)+ source 多样性,
84
+ * 返回"与你当前关注点相关但尚未直接搜索到"的记忆。
85
+ *
86
+ * 适用场景:
87
+ * - 用户搜索后,展示"你可能还想看"
88
+ * - 对话开始时,展示"最近你可能关心的记忆"
89
+ * - 宿主程序构建个性化推荐面板
90
+ *
91
+ * @param query - 可选的搜索关键词(提供时结合搜索结果推荐,省略时基于全局热度推荐)
92
+ * @param options - 推荐选项
93
+ */
94
+ suggest(query?: string, options?: SuggestOptions): SuggestHit[];
95
+ }
96
+ //# sourceMappingURL=memoryAdvisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryAdvisor.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/memoryAdvisor.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAyBnE,cAAc;AACd,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpE,sBAAsB;AACtB,MAAM,WAAW,iBAAiB;IAChC,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yGAAyG;IACzG,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,gBAAgB;AAChB,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,6BAA6B;IAC7B,aAAa,EAAE,kBAAkB,CAAC;IAClC,qBAAqB;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,aAAa;AACb,MAAM,WAAW,cAAc;IAC7B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,aAAa;AACb,MAAM,WAAW,UAAU;IACzB,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAID;;;;;;;;;;GAUG;AACH,qBAAa,aAAa;IAIZ,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC;;OAEG;gBAC0B,KAAK,EAAE,cAAc;IAIlD;;;;;;;;;;;;;OAaG;IACH,YAAY,IAAI,kBAAkB;IAiElC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,UAAU,EAAE;CAmFpE"}
@@ -0,0 +1,198 @@
1
+ import { SOURCE_LABELS } from '../../memory/types.js';
2
+ import { ONE_DAY_MS } from '../../memory/recall.js';
3
+ // ─── 常量 ────────────────────────────────────────────────
4
+ /** 关联推荐:每个 source 采样 top-N 条 */
5
+ const SUGGEST_TOP_PER_SOURCE = 3;
6
+ /** 关联推荐:时效性衰减窗口(天),超过此天数归零 */
7
+ const SUGGEST_RECENCY_WINDOW_DAYS = 30;
8
+ /** 推荐结果内容预览字符数(与 MemoryInspector.SEARCH_PREVIEW_LEN 一致,独立维护以便各模块独立演进) */
9
+ const ADVISOR_PREVIEW_LEN = 120;
10
+ /** source 健康度阈值(低于此值或超期触发 critical/warning) */
11
+ const SOURCE_HEALTH_THRESHOLDS = {
12
+ /** 平均 score 低于此值 → critical */
13
+ CRITICAL_SCORE: 0.2,
14
+ /** 平均 score 低于此值 → warning */
15
+ WARNING_SCORE: 0.5,
16
+ /** 超过此天数未访问 → critical */
17
+ CRITICAL_DAYS: 30,
18
+ /** 超过此天数未访问 → warning */
19
+ WARNING_DAYS: 7,
20
+ };
21
+ // ─── 类 ──────────────────────────────────────────────────
22
+ /**
23
+ * 记忆顾问
24
+ *
25
+ * 从 MemoryInspector 拆分(QC-R2-11),负责基于记忆数据的分析计算:
26
+ * - sourceHealth():记忆源健康诊断(数量、score、新鲜度)
27
+ * - suggest():关联推荐(基于 score + 时效性 + 多样性)
28
+ *
29
+ * 与 MemoryInspector 的分工:
30
+ * - MemoryInspector:直接数据查询(snapshot/search/stats/relations + 写操作代理)
31
+ * - MemoryAdvisor:分析计算(健康诊断 + 推荐排序)
32
+ */
33
+ export class MemoryAdvisor {
34
+ index;
35
+ /**
36
+ * @param index - 记忆存储(只读访问,用于健康诊断和推荐计算)
37
+ */
38
+ constructor(index) {
39
+ this.index = index;
40
+ }
41
+ // ─── 源健康诊断 ─────────────────────────────────────────
42
+ /**
43
+ * 记忆源健康诊断
44
+ *
45
+ * 为每个 source 计算健康指标(数量、平均 score、新鲜度、状态),
46
+ * 帮助宿主项目判断是否需要触发衰减、清理或补充。
47
+ *
48
+ * 健康状态判定:
49
+ * - healthy:avgScore ≥ 0.5 且 7 天内有访问
50
+ * - warning:avgScore < 0.5 或 7-30 天未访问
51
+ * - critical:avgScore < 0.2 或 30 天以上未访问
52
+ *
53
+ * 纯只读、同步、不调 LLM,与 stats() 互补(stats 只有数量,本方法有质量指标)。
54
+ * P2-2 优化:使用 getAllSources() 发现所有 source 标签,替代全量 search。
55
+ */
56
+ sourceHealth() {
57
+ const now = Date.now();
58
+ // P2-2 使用 getAllSources() 获取所有有数据的 source 标签
59
+ const sourceMap = this.index.getAllSources();
60
+ const sourceSet = new Set();
61
+ for (const [source, count] of sourceMap) {
62
+ if (count > 0)
63
+ sourceSet.add(source);
64
+ }
65
+ // 逐 source 计算健康指标
66
+ const entries = [];
67
+ for (const source of sourceSet) {
68
+ const memories = this.index.getBySource(source);
69
+ const count = memories.length;
70
+ // 平均 score
71
+ const avgScore = count > 0
72
+ ? memories.reduce((sum, m) => sum + m.score, 0) / count
73
+ : 0;
74
+ // 最近访问时间(取该 source 中最新的 accessedAt)
75
+ const latestAccess = memories
76
+ .map((m) => new Date(m.accessedAt).getTime())
77
+ .filter((t) => !isNaN(t))
78
+ .sort((a, b) => b - a)[0] ?? 0;
79
+ const daysSinceLastAccess = latestAccess > 0
80
+ ? (now - latestAccess) / ONE_DAY_MS
81
+ : Infinity;
82
+ // 健康状态判定
83
+ let status;
84
+ if (avgScore < SOURCE_HEALTH_THRESHOLDS.CRITICAL_SCORE || daysSinceLastAccess > SOURCE_HEALTH_THRESHOLDS.CRITICAL_DAYS) {
85
+ status = 'critical';
86
+ }
87
+ else if (avgScore < SOURCE_HEALTH_THRESHOLDS.WARNING_SCORE || daysSinceLastAccess > SOURCE_HEALTH_THRESHOLDS.WARNING_DAYS) {
88
+ status = 'warning';
89
+ }
90
+ else {
91
+ status = 'healthy';
92
+ }
93
+ entries.push({
94
+ source,
95
+ count,
96
+ avgScore: Math.round(avgScore * 1000) / 1000,
97
+ daysSinceLastAccess: Math.round(daysSinceLastAccess * 10) / 10,
98
+ status,
99
+ });
100
+ }
101
+ // 整体状态取最差 source
102
+ const statusPriority = { healthy: 0, warning: 1, critical: 2 };
103
+ const overallStatus = entries.reduce((worst, e) => statusPriority[e.status] > statusPriority[worst] ? e.status : worst, 'healthy');
104
+ return {
105
+ sources: entries.sort((a, b) => statusPriority[b.status] - statusPriority[a.status]),
106
+ overallStatus,
107
+ diagnosedAt: new Date().toISOString(),
108
+ };
109
+ }
110
+ // ─── 关联推荐 ─────────────────────────────────────────
111
+ /**
112
+ * 关联推荐:基于已有记忆数据,推荐你可能感兴趣的记忆
113
+ *
114
+ * 不调 LLM,纯计算。综合 score(权重)+ accessedAt(时效性)+ source 多样性,
115
+ * 返回"与你当前关注点相关但尚未直接搜索到"的记忆。
116
+ *
117
+ * 适用场景:
118
+ * - 用户搜索后,展示"你可能还想看"
119
+ * - 对话开始时,展示"最近你可能关心的记忆"
120
+ * - 宿主程序构建个性化推荐面板
121
+ *
122
+ * @param query - 可选的搜索关键词(提供时结合搜索结果推荐,省略时基于全局热度推荐)
123
+ * @param options - 推荐选项
124
+ */
125
+ suggest(query, options = {}) {
126
+ const { limit = 5, excludeSources = [SOURCE_LABELS.PERSONA, SOURCE_LABELS.RULE, SOURCE_LABELS.SKILL], recencyWeight = 0.3, } = options;
127
+ const scoreWeight = 1 - recencyWeight;
128
+ const now = Date.now();
129
+ // 收集候选记忆
130
+ const candidates = new Map();
131
+ // 如果有 query,先搜索直接匹配的记忆(标记为 searchHit)
132
+ if (query && query.trim()) {
133
+ const directHits = this.index.search(query, limit * 3);
134
+ for (const m of directHits) {
135
+ if (!excludeSources.includes(m.source)) {
136
+ candidates.set(m.id, { memory: m, searchHit: true });
137
+ }
138
+ }
139
+ }
140
+ // 补充:按 source 分组采样,确保来源多样性
141
+ const knownSources = [SOURCE_LABELS.INSIGHT, SOURCE_LABELS.PROFILE, SOURCE_LABELS.WORK_PROJECTION];
142
+ for (const source of knownSources) {
143
+ const count = this.index.countBySource(source);
144
+ if (count > 0 && !excludeSources.includes(source)) {
145
+ const memories = this.index.getBySource(source);
146
+ // 取 score 最高的前 N 条
147
+ const top = memories.sort((a, b) => b.score - a.score).slice(0, SUGGEST_TOP_PER_SOURCE);
148
+ for (const m of top) {
149
+ if (!candidates.has(m.id)) {
150
+ candidates.set(m.id, { memory: m, searchHit: false });
151
+ }
152
+ }
153
+ }
154
+ }
155
+ if (candidates.size === 0)
156
+ return [];
157
+ // 计算综合推荐分数
158
+ const scored = [];
159
+ for (const { memory, searchHit } of candidates.values()) {
160
+ // 时效性分:窗口内线性衰减,超过窗口归零
161
+ const accessedAt = new Date(memory.accessedAt);
162
+ const daysSinceAccess = isNaN(accessedAt.getTime())
163
+ ? SUGGEST_RECENCY_WINDOW_DAYS
164
+ : (now - accessedAt.getTime()) / ONE_DAY_MS;
165
+ const recency = Math.max(0, 1 - daysSinceAccess / SUGGEST_RECENCY_WINDOW_DAYS);
166
+ const relevance = memory.score * scoreWeight + recency * recencyWeight;
167
+ // 生成推荐理由
168
+ let reason;
169
+ if (searchHit) {
170
+ reason = '与搜索相关';
171
+ }
172
+ else if (daysSinceAccess < 1) {
173
+ reason = '最近访问';
174
+ }
175
+ else if (memory.score >= 0.8) {
176
+ reason = '高频记忆';
177
+ }
178
+ else {
179
+ reason = `${memory.source} 推荐`;
180
+ }
181
+ scored.push({ memory, searchHit, relevance, reason });
182
+ }
183
+ // 排序:搜索命中优先,然后按 relevance 降序
184
+ scored.sort((a, b) => {
185
+ if (a.searchHit !== b.searchHit)
186
+ return a.searchHit ? -1 : 1;
187
+ return b.relevance - a.relevance;
188
+ });
189
+ return scored.slice(0, limit).map(({ memory, relevance, reason }) => ({
190
+ name: memory.name,
191
+ source: memory.source,
192
+ relevance: Math.round(relevance * 100) / 100,
193
+ contentPreview: memory.content.length > ADVISOR_PREVIEW_LEN ? memory.content.slice(0, ADVISOR_PREVIEW_LEN) + '...' : memory.content,
194
+ reason,
195
+ }));
196
+ }
197
+ }
198
+ //# sourceMappingURL=memoryAdvisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryAdvisor.js","sourceRoot":"","sources":["../../../src/agent/managers/memoryAdvisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * 记忆查看器 — 统一查看记忆快照 + 搜索 + 统计
3
+ *
4
+ * 从 Agent 拆分出来,负责只读记忆查询操作。
5
+ *
6
+ * 设计原则:
7
+ * - 纯只读——不动任何组件状态
8
+ * - 同步返回——避免数据不一致(不调 LLM、不调 SQLite 写入)
9
+ * - 轻量——每层只返回前 N 条 + 总数
10
+ */
11
+ import type { Memory } from '../../memory/types.js';
12
+ import type { IMemoryStorage } from '../../memory/storageInterface.js';
13
+ import type { IMemoryRelationStore } from '../../memory/relationStore.js';
14
+ import type { MemoryRelation, RelationDirection } from '../../memory/types.js';
15
+ import type { VectorStore } from '../../memory/vectorStore.js';
16
+ import type { MessageHistory } from '../../agent/messageHistory.js';
17
+ import type { AgentLoop } from '../../agent/loop.js';
18
+ import type { SourceHealthReport, SuggestOptions, SuggestHit } from '../../agent/managers/memoryAdvisor.js';
19
+ export type { SourceHealthStatus, SourceHealthEntry, SourceHealthReport, SuggestOptions, SuggestHit, } from '../../agent/managers/memoryAdvisor.js';
20
+ /** 记忆快照 */
21
+ export interface MemorySnapshot {
22
+ /** 第 1 层:工作记忆(messages 数组) */
23
+ working: WorkingMemorySnapshot;
24
+ /** 第 2 层:Bootstrap 记忆(永驻 + 领域) */
25
+ bootstrap: BootstrapSnapshot;
26
+ /** 第 3 层:归档洞察(insight 记忆) */
27
+ archive: ArchiveSnapshot;
28
+ }
29
+ /** 第 1 层:工作记忆快照 */
30
+ export interface WorkingMemorySnapshot {
31
+ total: number;
32
+ preview: Array<{
33
+ role: 'system' | 'user' | 'assistant' | 'tool';
34
+ contentPreview: string;
35
+ contentLength: number;
36
+ }>;
37
+ }
38
+ /** 第 2 层:Bootstrap 记忆快照 */
39
+ export interface BootstrapSnapshot {
40
+ total: number;
41
+ items: Array<{
42
+ id: string;
43
+ /** 来源标签(开放字符串) */
44
+ source: string;
45
+ name: string;
46
+ contentPreview: string;
47
+ /** 权重(0-1) */
48
+ score: number;
49
+ }>;
50
+ }
51
+ /** 第 3 层:归档记忆快照(insight + profile + work-projection) */
52
+ export interface ArchiveSnapshot {
53
+ /** 归档记忆总数(insight + profile + work-projection) */
54
+ archiveCount: number;
55
+ /** 关系边总数(ADR-014,relationStore 未注入时为 0) */
56
+ relationCount: number;
57
+ currentSession: string;
58
+ /** 当前会话全名(含日期前缀) */
59
+ currentSessionName: string;
60
+ hint: string;
61
+ /** 归档记忆来源分布 */
62
+ stats: {
63
+ insight: number;
64
+ profile: number;
65
+ 'work-projection': number;
66
+ };
67
+ }
68
+ /** Agent 记忆搜索结果(cli 友好的扁平结构) */
69
+ export interface AgentSearchHit {
70
+ /** 记忆唯一标识(${source}:${name} 格式,供 showMemory/deleteMemory 等操作使用) */
71
+ id: string;
72
+ /** 记忆名称 */
73
+ name: string;
74
+ /** 来源标签 */
75
+ source: string;
76
+ /** 权重(0-1) */
77
+ score: number;
78
+ /** 内容预览(截断到 120 字符) */
79
+ contentPreview: string;
80
+ /** 语义相似度(0-1,仅 searchHybrid 返回,纯关键词搜索时无此字段) */
81
+ similarity?: number;
82
+ /** 创建时间(ISO 8601,供 UI 层时间筛选/排序使用) */
83
+ createdAt?: string;
84
+ }
85
+ /** 记忆库统计数据 */
86
+ export interface AgentStats {
87
+ /** 按来源标签分组的记忆数量 */
88
+ bySource: Record<string, number>;
89
+ /** 记忆总数 */
90
+ total: number;
91
+ /** 关系边总数(ADR-014,relationStore 未注入时为 0) */
92
+ relationCount: number;
93
+ }
94
+ export declare class MemoryInspector {
95
+ private readonly index;
96
+ private readonly loop;
97
+ private readonly history;
98
+ /** 向量存储(可选,提供时 searchHybrid 启用语义搜索) */
99
+ private vectorStore;
100
+ /** 关系存储(可选,ADR-014 侧车,未注入时跳过关系查询) */
101
+ private readonly relationStore;
102
+ /** 记忆顾问(QC-R2-11:sourceHealth + suggest 委托) */
103
+ private readonly advisor;
104
+ /**
105
+ * @param index - 记忆存储(用于搜索 + 统计)
106
+ * @param loop - AgentLoop(用于获取工作记忆)
107
+ * @param history - MessageHistory(用于获取当前会话信息)
108
+ * @param relationStore - 关系存储侧车(可选,ADR-014,未注入时关系相关方法降级返回空)
109
+ */
110
+ constructor(index: IMemoryStorage, loop: AgentLoop, history: MessageHistory, relationStore?: IMemoryRelationStore | null);
111
+ /**
112
+ * 注入向量存储(由 Agent 在初始化后调用,解决构造时序)
113
+ */
114
+ setVectorStore(vs: VectorStore | null): void;
115
+ /**
116
+ * 插入或更新记忆
117
+ *
118
+ * @param memory 完整记忆对象
119
+ */
120
+ upsert(memory: Memory): void;
121
+ /**
122
+ * 删除记忆
123
+ *
124
+ * @param id 记忆唯一标识(${source}:${name} 格式)
125
+ */
126
+ delete(id: string): void;
127
+ /**
128
+ * 按 ID 获取单条记忆
129
+ *
130
+ * @param id 记忆唯一标识
131
+ * @returns 记忆对象,不存在时返回 null
132
+ */
133
+ getById(id: string): Memory | null;
134
+ /**
135
+ * 按来源标签获取记忆列表
136
+ *
137
+ * @param source 来源标签(如 'persona'、'rule'、'insight')
138
+ * @returns 该来源的所有记忆
139
+ */
140
+ getBySource(source: string): Memory[];
141
+ /**
142
+ * 列出所有记忆(用于宿主项目的记忆管理面板)
143
+ *
144
+ * 与 search() 不同,本方法允许空查询,返回按 score 降序排列的记忆列表。
145
+ * search() 拒绝空查询是为了防止"静默全量返回"的误用;
146
+ * list() 则是显式声明"我要列出所有记忆"的意图。
147
+ *
148
+ * @param limit 返回数量上限(默认 50)
149
+ * @returns 记忆列表(按 score 降序)
150
+ */
151
+ list(limit?: number): Memory[];
152
+ /**
153
+ * 统一查看记忆快照(3 层)
154
+ *
155
+ * 简化为 3 层(工作记忆 / Bootstrap / 归档记忆)。
156
+ *
157
+ * 设计原则:
158
+ * - **纯只读**——不动任何组件状态
159
+ * - **同步返回**——避免数据不一致(不调 LLM、不调 SQLite)
160
+ * - **轻量**——每层只返回前 N 条 + 总数
161
+ */
162
+ snapshot(): MemorySnapshot;
163
+ /**
164
+ * 搜索记忆(关键词 + FTS5 索引)
165
+ *
166
+ * 返回 CLI 友好的扁平结构(已处理内容截断)
167
+ */
168
+ search(query: string, limit?: number): AgentSearchHit[];
169
+ /**
170
+ * 混合搜索记忆(语义 + 关键词双通道)
171
+ *
172
+ * V-101:当 VectorStore 可用时,启用语义搜索通道,补强关键词召回的语义缺口。
173
+ * 向量搜索失败时静默降级到纯关键词(降级优先原则)。
174
+ *
175
+ * @returns 混合排序后的搜索结果(含相似度分数)
176
+ */
177
+ searchHybrid(query: string, limit?: number): Promise<AgentSearchHit[]>;
178
+ /**
179
+ * 记忆库统计
180
+ *
181
+ * 返回记忆来源分布、数据库大小等关键指标。
182
+ * P2-2 优化:使用 getAllSources() 一次查询替代多次 countBySource + 全量 search,
183
+ * 复杂度从 O(n*knownSources + n) 降为 O(distinctSources)。
184
+ */
185
+ stats(): AgentStats;
186
+ /**
187
+ * 查询指定记忆的关系边
188
+ *
189
+ * ADR-014 侧车模型:关系数据独立于 Memory 7 字段基元,存储在 IMemoryRelationStore。
190
+ * relationStore 未注入时返回空数组(向后兼容)。
191
+ *
192
+ * @param memoryId - 记忆 ID
193
+ * @param direction - 方向过滤:'outgoing'(出边)/ 'incoming'(入边)/ 'both'(双向,默认)
194
+ * @returns 关系边数组,按 createdAt 降序
195
+ */
196
+ getRelations(memoryId: string, direction?: RelationDirection): MemoryRelation[];
197
+ /**
198
+ * 查询全部关系边
199
+ *
200
+ * 用于宿主 UI 渲染拓扑可视化(阶段 2.4)。
201
+ * relationStore 未注入时返回空数组(向后兼容)。
202
+ *
203
+ * @returns 全部关系边数组
204
+ */
205
+ getAllRelations(): MemoryRelation[];
206
+ /**
207
+ * 统计关系边总数
208
+ *
209
+ * 用于 stats() 和 snapshot() 的 relationCount 字段。
210
+ * relationStore 未注入时返回 0(向后兼容)。
211
+ */
212
+ private countRelations;
213
+ /**
214
+ * 记忆源健康诊断(委托给 MemoryAdvisor)
215
+ *
216
+ * 为每个 source 计算健康指标(数量、平均 score、新鲜度、状态)。
217
+ * 实现已迁移至 MemoryAdvisor(QC-R2-11),此处保留委托以维持 API 契约。
218
+ */
219
+ sourceHealth(): SourceHealthReport;
220
+ /**
221
+ * 关联推荐(委托给 MemoryAdvisor)
222
+ *
223
+ * 基于 score + 时效性 + source 多样性推荐记忆。
224
+ * 实现已迁移至 MemoryAdvisor(QC-R2-11),此处保留委托以维持 API 契约。
225
+ *
226
+ * @param query - 可选的搜索关键词(提供时结合搜索结果推荐,省略时基于全局热度推荐)
227
+ * @param options - 推荐选项
228
+ */
229
+ suggest(query?: string, options?: SuggestOptions): SuggestHit[];
230
+ }
231
+ //# sourceMappingURL=memoryInspector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryInspector.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/memoryInspector.ts"],"names":[],"mappings":"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"}