@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,147 @@
1
+ import { logger } from '../logging/logger.js';
2
+ import { STOPWORDS, SOURCE_LABELS } from '../memory/types.js';
3
+ import { segmentText } from '../utils/segmenter.js';
4
+ // ─── 召回与衰减常量 ─────────────────────────────────────
5
+ /** 语义搜索默认相似度阈值 */
6
+ const DEFAULT_MIN_SIMILARITY = 0.3;
7
+ /** 语义搜索召回倍率(在最终 limit 基础上多召回一些,供后续融合排序) */
8
+ export const RECALL_LIMIT_MULTIPLIER = 2;
9
+ /** 综合排序时语义相似度权重 */
10
+ export const VECTOR_SCORE_WEIGHT = 0.6;
11
+ /** 综合排序时记忆 score 权重 */
12
+ export const MEMORY_SCORE_WEIGHT = 0.4;
13
+ /** 每次召回时 score 提升量 */
14
+ const BOOST_INCREMENT = 0.05;
15
+ /** score 上限 */
16
+ const SCORE_CEILING = 1.0;
17
+ /** 衰减:未访问天数阈值 */
18
+ const DECAY_AGE_DAYS = 7;
19
+ /** 衰减:每过一个周期 score 降低量 */
20
+ const DECAY_AMOUNT = 0.02;
21
+ /** 衰减:score 下限 */
22
+ const DECAY_FLOOR = 0.1;
23
+ /** 一天对应的毫秒数 */
24
+ export const ONE_DAY_MS = 24 * 60 * 60 * 1000;
25
+ /**
26
+ * 从文本中提取关键词(用于记忆召回)
27
+ *
28
+ * 基于 segmentText() 精确分词,叠加停用词过滤 + 英文词补充 + 去重。
29
+ * 分词基础设施统一由 segmenter.ts 提供,避免重复实现。
30
+ *
31
+ * @param input - 输入文本
32
+ * @returns 关键词数组(去重 + 停用词过滤)
33
+ */
34
+ export function extractKeywords(input) {
35
+ // 复用 segmenter.ts 的精确分词(Intl.Segmenter ICU 词典切分)
36
+ const words = segmentText(input).map((w) => w.toLowerCase());
37
+ // 补充英文词(segmentText 可能遗漏连续英文大写缩写,如 APIKey → "apikey" 整词)
38
+ const englishWords = input.match(/[a-z]{2,}/gi) || [];
39
+ words.push(...englishWords.map((w) => w.toLowerCase()));
40
+ // 去重 + 停用词过滤 + 最短长度
41
+ return [...new Set(words)].filter((w) => w.length >= 2 && !STOPWORDS.has(w));
42
+ }
43
+ /**
44
+ * 从记忆存储中搜索相关记忆
45
+ *
46
+ * 双通道召回策略:
47
+ * 1. 语义搜索(VectorStore 可用时):向量余弦相似度
48
+ * 2. 关键词搜索(兜底):LIKE 匹配
49
+ * 3. 两路结果合并去重,按 score + similarity 综合排序
50
+ * 4. 排除已单独注入的记忆(persona、rule)
51
+ * 5. 返回 top N
52
+ *
53
+ * @param storage - 记忆存储实例
54
+ * @param query - 搜索查询文本
55
+ * @param options - 召回选项
56
+ * @returns 匹配的记忆列表
57
+ */
58
+ export async function recall(storage, query, options = {}) {
59
+ const { limit = 5, excludeSources = [SOURCE_LABELS.PERSONA, SOURCE_LABELS.RULE, SOURCE_LABELS.SKILL], vectorStore, minSimilarity = DEFAULT_MIN_SIMILARITY, } = options;
60
+ const merged = new Map();
61
+ // ── 通道 1:语义搜索(VectorStore 可用时) ──
62
+ if (vectorStore && vectorStore.size > 0) {
63
+ try {
64
+ const vectorResults = await vectorStore.search(query, limit * RECALL_LIMIT_MULTIPLIER, minSimilarity);
65
+ for (const vr of vectorResults) {
66
+ const memory = storage.getById(vr.id);
67
+ if (memory && !excludeSources.includes(memory.source)) {
68
+ merged.set(memory.id, { memory, vectorScore: vr.similarity });
69
+ }
70
+ }
71
+ }
72
+ catch (err) {
73
+ logger.debug({ err }, '语义搜索失败,降级到关键词');
74
+ }
75
+ }
76
+ // ── 通道 2:关键词搜索 ──
77
+ const keywords = extractKeywords(query);
78
+ if (keywords.length > 0) {
79
+ // FD-23: 关键词搜索失败时降级返回已收集的语义结果,与通道 1 降级策略对称
80
+ try {
81
+ // 使用提取后的关键词组合搜索,避免原始 query 中的停用词/噪声影响匹配
82
+ const keywordResults = storage.search(keywords.join(' '), limit * RECALL_LIMIT_MULTIPLIER);
83
+ for (const m of keywordResults) {
84
+ if (!excludeSources.includes(m.source) && !merged.has(m.id)) {
85
+ merged.set(m.id, { memory: m, vectorScore: 0 });
86
+ }
87
+ }
88
+ }
89
+ catch (err) {
90
+ logger.debug({ err }, '关键词搜索失败,仅返回语义搜索结果');
91
+ }
92
+ }
93
+ // ── 无任何结果 ──
94
+ if (merged.size === 0)
95
+ return [];
96
+ // ── 综合排序:vectorScore(语义相关度)+ memory.score(权重) ──
97
+ const sorted = [...merged.values()].sort((a, b) => {
98
+ const scoreA = a.vectorScore * VECTOR_SCORE_WEIGHT + a.memory.score * MEMORY_SCORE_WEIGHT;
99
+ const scoreB = b.vectorScore * VECTOR_SCORE_WEIGHT + b.memory.score * MEMORY_SCORE_WEIGHT;
100
+ return scoreB - scoreA;
101
+ });
102
+ // ── 召回时提升 score ──
103
+ // 在副本上操作避免污染调用方持有的对象,boost 后写回存储
104
+ const now = new Date().toISOString();
105
+ const result = [];
106
+ for (const { memory } of sorted.slice(0, limit)) {
107
+ const copy = { ...memory };
108
+ boostScore(copy, now);
109
+ storage.upsert(copy); // 写回存储,持久化 score 提升
110
+ result.push(copy);
111
+ }
112
+ return result;
113
+ }
114
+ // ─── Score 衰减机制 ─────────────────────────────────────
115
+ /**
116
+ * 召回时提升记忆的 score(上限 1.0)
117
+ *
118
+ * 每次被召回时,记忆的 score 略微提升,体现"越常用越重要"。
119
+ *
120
+ * @param memory - 被召回的记忆
121
+ * @param now - 当前时间戳(ISO 8601)
122
+ */
123
+ export function boostScore(memory, now) {
124
+ memory.score = Math.min(SCORE_CEILING, memory.score + BOOST_INCREMENT);
125
+ memory.accessedAt = now ?? new Date().toISOString();
126
+ }
127
+ /**
128
+ * 对单条记忆执行衰减计算
129
+ *
130
+ * @param memory - 要衰减的记忆
131
+ * @param now - 当前时间(Date 对象)
132
+ * @returns 是否实际发生了衰减
133
+ */
134
+ export function applyDecayToMemory(memory, now) {
135
+ const accessedAt = new Date(memory.accessedAt);
136
+ if (isNaN(accessedAt.getTime())) {
137
+ return false; // 跳过无效日期的记忆
138
+ }
139
+ const daysSinceAccess = (now.getTime() - accessedAt.getTime()) / ONE_DAY_MS;
140
+ if (daysSinceAccess <= DECAY_AGE_DAYS) {
141
+ return false;
142
+ }
143
+ const periods = Math.floor(daysSinceAccess / DECAY_AGE_DAYS);
144
+ memory.score = Math.max(DECAY_FLOOR, memory.score - DECAY_AMOUNT * periods);
145
+ return true;
146
+ }
147
+ //# sourceMappingURL=recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/memory/recall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
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
+ * 关系构建时机(Sprite 层,不进内核):
14
+ * - InsightExtractor.extract() 完成后 fire-and-forget
15
+ * - 代码层召回 top-5 相关记忆 → LLM 判断关系类型 → 写入 IMemoryRelationStore
16
+ * - 遵循降级优先(ADR-006):关系构建失败不阻塞对话,仅记录日志
17
+ */
18
+ import type { MemoryRelation, RelationDirection } from '../memory/types.js';
19
+ /**
20
+ * 记忆关系存储接口(侧车)
21
+ *
22
+ * 独立于 IMemoryStorage,不依赖 Memory 7 字段。
23
+ * 宿主项目实现此接口并注入 Agent,用于:
24
+ * - 冲突检测:getRelationsByType('contradicts')
25
+ * - 召回增强:getRelations(memoryId, 'both')
26
+ * - 拓扑可视化:getAllRelations()
27
+ */
28
+ export interface IMemoryRelationStore {
29
+ /**
30
+ * 添加关系
31
+ *
32
+ * sourceId+targetId+type 三元组唯一约束,重复添加应幂等(更新 weight/createdAt 或忽略)。
33
+ *
34
+ * @param relation 关系数据(sourceId/targetId/type/weight/createdAt)
35
+ */
36
+ addRelation(relation: MemoryRelation): void;
37
+ /**
38
+ * 查询某记忆的关系
39
+ *
40
+ * @param memoryId 记忆 ID
41
+ * @param direction 方向过滤(默认 'both'):
42
+ * - 'outgoing':只查 sourceId = memoryId 的关系(冲突检测用)
43
+ * - 'incoming':只查 targetId = memoryId 的关系
44
+ * - 'both':合并两个方向并去重(可视化/召回增强用)
45
+ * @returns 匹配的关系列表
46
+ */
47
+ getRelations(memoryId: string, direction?: RelationDirection): MemoryRelation[];
48
+ /**
49
+ * 按关系类型查询
50
+ *
51
+ * 用于冲突检测:getRelationsByType('contradicts') 获取所有矛盾关系。
52
+ *
53
+ * @param type 关系类型(开放字符串,如 'contradicts'/'supports'/'follows')
54
+ * @returns 匹配的关系列表
55
+ */
56
+ getRelationsByType(type: string): MemoryRelation[];
57
+ /**
58
+ * 获取全部关系
59
+ *
60
+ * 用于拓扑可视化构建节点+边图谱。
61
+ * 数据量大时(>10000)可改为分页,但 Phase 1 不需要。
62
+ *
63
+ * @returns 全部关系列表
64
+ */
65
+ getAllRelations(): MemoryRelation[];
66
+ /**
67
+ * 删除指定关系
68
+ *
69
+ * sourceId+targetId+type 唯一定位,删除单条关系。
70
+ * 用于关系修正(用户确认冲突后删除误判关系)。
71
+ *
72
+ * @param sourceId 关系起点
73
+ * @param targetId 关系终点
74
+ * @param type 关系类型
75
+ */
76
+ removeRelation(sourceId: string, targetId: string, type: string): void;
77
+ }
78
+ //# sourceMappingURL=relationStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationStore.d.ts","sourceRoot":"","sources":["../../src/memory/relationStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;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;CACxE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=relationStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationStore.js","sourceRoot":"","sources":["../../src/memory/relationStore.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * 会话存储接口(ISessionStore)
3
+ *
4
+ * 宿主项目实现此接口,提供会话消息的持久化能力。
5
+ * memora 内核通过此接口读写会话记录,不直接依赖文件 I/O。
6
+ *
7
+ * 与 IMemoryStorage 的关系:
8
+ * - IMemoryStorage:记忆索引(SQLite),存储提取后的 insight
9
+ * - ISessionStore:会话记录,存储原始对话消息
10
+ *
11
+ * 设计原则:
12
+ * - 零依赖内核:memora 不实现文件 I/O,由宿主注入
13
+ * - 接口最小化:只暴露必要的读写操作
14
+ * - 向后兼容:不强制要求实现,不传则使用内存模式
15
+ *
16
+ * @example
17
+ * // 宿主实现(文件存储)
18
+ * class FileSessionStore implements ISessionStore {
19
+ * appendMessage(date, session, message) { ... }
20
+ * loadMessages(date, session) { ... }
21
+ * listSessions() { ... }
22
+ * }
23
+ *
24
+ * // 注入到 Agent
25
+ * const agent = new Agent({
26
+ * sessionStore: new FileSessionStore('./sessions'),
27
+ * ...
28
+ * });
29
+ */
30
+ export interface ISessionStore {
31
+ /**
32
+ * 追加消息到指定会话
33
+ *
34
+ * @param date - 会话日期 YYYY-MM-DD
35
+ * @param session - 会话标识
36
+ * @param message - 消息对象
37
+ */
38
+ appendMessage(date: string, session: string, message: SessionMessage): void;
39
+ /**
40
+ * 加载指定会话的消息列表
41
+ *
42
+ * @param date - 会话日期 YYYY-MM-DD
43
+ * @param session - 会话标识
44
+ * @returns 消息列表,不存在则返回空数组
45
+ */
46
+ loadMessages(date: string, session: string): SessionMessage[];
47
+ /**
48
+ * 列出所有会话标识
49
+ *
50
+ * @returns 会话标识列表(格式:YYYY-MM-DD-session)
51
+ */
52
+ listSessions(): string[];
53
+ /**
54
+ * 复制会话:将源会话的全部消息复制到目标会话
55
+ *
56
+ * 实现要求:
57
+ * - 原子操作:要么全部复制成功,要么不产生副作用
58
+ * - 保留时间戳:消息的 timestamp 不修改
59
+ * - 幂等:若目标会话已存在,覆盖(而非追加)
60
+ * - 若源会话不存在,静默返回(不抛出)
61
+ *
62
+ * @param sourceDate - 源会话日期
63
+ * @param sourceSession - 源会话标识
64
+ * @param targetDate - 目标会话日期
65
+ * @param targetSession - 目标会话标识
66
+ */
67
+ copySession?(sourceDate: string, sourceSession: string, targetDate: string, targetSession: string): void;
68
+ }
69
+ /**
70
+ * 会话消息类型
71
+ *
72
+ * 与 LLM Message 的区别:
73
+ * - SessionMessage 包含时间戳,用于持久化
74
+ * - Message 不含时间戳,用于 LLM 通信
75
+ */
76
+ export interface SessionMessage {
77
+ /** 消息角色 */
78
+ role: 'user' | 'assistant' | 'system';
79
+ /** 消息内容 */
80
+ content: string;
81
+ /** 时间戳(ISO 8601) */
82
+ timestamp: string;
83
+ }
84
+ //# sourceMappingURL=sessionStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionStore.d.ts","sourceRoot":"","sources":["../../src/memory/sessionStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAE5E;;;;;;OAMG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;IAE9D;;;;OAIG;IACH,YAAY,IAAI,MAAM,EAAE,CAAC;IAEzB;;;;;;;;;;;;;OAaG;IACH,WAAW,CAAC,CACV,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,IAAI,CAAC;CACT;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sessionStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionStore.js","sourceRoot":"","sources":["../../src/memory/sessionStore.ts"],"names":[],"mappings":""}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * 记忆存储接口 — Memora 内核与具体数据库实现的解耦边界
3
+ *
4
+ * 设计目标:
5
+ * - Memora 内核(agent/ + memory/ + persona/ + skill/)不依赖任何具体数据库
6
+ * - 宿主项目(如泊文 Electron 主进程)持有 better-sqlite3 实例,实现此接口后注入 Agent
7
+ * - 测试环境可使用 InMemoryStorage(零依赖、零 IO)
8
+ * - 不注入时 Agent 内部使用 InMemoryStorage 作为 fallback(数据重启后丢失)
9
+ *
10
+ * 分层约束(ADR-002 v0.7):
11
+ * 泊文宿主 → 持有 better-sqlite3,实现 IMemoryStorage,注入 Agent
12
+ * Memora 内核 → 纯业务逻辑,仅依赖此接口(零 native 依赖)
13
+ *
14
+ * 方法签名保持同步语义(与 better-sqlite3 一致),
15
+ * 调用方已有的 `await` 调用仍然安全(await 同步值 = 立即返回)。
16
+ */
17
+ import type { Memory } from '../memory/types.js';
18
+ /**
19
+ * 记忆存储接口
20
+ *
21
+ * 所有方法均为同步(与 better-sqlite3 API 对齐),
22
+ * 调用方已有的 `await` 调用仍然安全(await 同步值 = 立即返回)。
23
+ * 未来如需支持异步存储后端(如 IndexedDB),可新增 IAsyncMemoryStorage 接口。
24
+ */
25
+ export interface IMemoryStorage {
26
+ /**
27
+ * 插入或更新记忆
28
+ *
29
+ * source 字段为开放字符串,无校验限制
30
+ */
31
+ upsert(memory: Memory): void;
32
+ /**
33
+ * 删除记忆
34
+ */
35
+ delete(id: string): void;
36
+ /**
37
+ * 按 ID 获取单条记忆
38
+ */
39
+ getById(id: string): Memory | null;
40
+ /**
41
+ * 按来源标签获取记忆
42
+ *
43
+ * @param source - 来源标签(如 'persona'、'rule'、'insight')
44
+ * @returns 该来源的所有记忆
45
+ */
46
+ getBySource(source: string): Memory[];
47
+ /**
48
+ * 关键词搜索记忆
49
+ *
50
+ * 搜索逻辑(宿主实现):
51
+ * 1. 从 query 中提取关键词(推荐使用 Intl.Segmenter 分词 + 停用词过滤)
52
+ * 2. 用 LIKE 关键词匹配 content 和 name 字段
53
+ * 3. 按 score 降序排列
54
+ * 4. 返回 top N 结果
55
+ *
56
+ * InMemoryStorage 使用 segmentText() 规范分词 + includes 匹配(与 SqliteStorage 行为一致)。
57
+ *
58
+ * @param query - 搜索查询文本
59
+ * @param limit - 返回数量上限(默认 10)
60
+ * @returns 匹配的记忆列表
61
+ */
62
+ search(query: string, limit?: number): Memory[];
63
+ /**
64
+ * 统计记忆总数
65
+ *
66
+ * 比 search('', largeLimit).length 更高效,避免全量加载数据。
67
+ * 宿主实现应使用 COUNT(*) 等数据库原生计数。
68
+ */
69
+ count(): number;
70
+ /**
71
+ * 按来源标签统计记忆数量
72
+ *
73
+ * 比 getBySource(source).length 更高效,避免全量加载对象。
74
+ * 宿主实现应使用 COUNT(*) WHERE source = ? 等数据库原生计数。
75
+ */
76
+ countBySource(source: string): number;
77
+ /**
78
+ * 衰减指定来源的记忆 score(自然遗忘机制)
79
+ *
80
+ * 长时间未访问的记忆 score 逐渐降低。
81
+ * 宿主实现(SqliteStorage)可用一条 SQL UPDATE 批量完成,
82
+ * 避免内核逐条全量加载。
83
+ *
84
+ * @param sources - 要衰减的来源标签列表(如 ['insight', 'profile'])
85
+ * @param now - 当前时间
86
+ * @returns 受影响的记忆数量
87
+ */
88
+ decayScores(sources: string[], now: Date): number;
89
+ /**
90
+ * 获取所有 source 标签及其记忆数量
91
+ *
92
+ * P2-2 优化:替代 stats()/sourceHealth() 中的全量 search + 逐条遍历,
93
+ * 宿主实现应使用 SQL `SELECT source, COUNT(*) FROM memories GROUP BY source`,
94
+ * InMemoryStorage 维护增量更新的 source→count 缓存。
95
+ *
96
+ * @returns source 标签到数量的映射(如 { persona: 3, insight: 12, ... })
97
+ */
98
+ getAllSources(): Map<string, number>;
99
+ /**
100
+ * 关闭存储连接(可选)
101
+ *
102
+ * 宿主注入的实现可能不需要关闭(如共享数据库连接),
103
+ * 所以此方法是可选的。
104
+ */
105
+ close?(): void;
106
+ }
107
+ //# sourceMappingURL=storageInterface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storageInterface.d.ts","sourceRoot":"","sources":["../../src/memory/storageInterface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAEnC;;;;;OAKG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEtC;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEhD;;;;;OAKG;IACH,KAAK,IAAI,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAEtC;;;;;;;;;;OAUG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,CAAC;IAElD;;;;;;;;OAQG;IACH,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAErC;;;;;OAKG;IACH,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=storageInterface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storageInterface.js","sourceRoot":"","sources":["../../src/memory/storageInterface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
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
+ write(memory: Memory): Promise<void>;
22
+ /**
23
+ * 列出某个 source 下的所有记忆
24
+ *
25
+ * @param source - 来源标签(如 'rule'、'persona')
26
+ * @returns 记忆名称列表(不含扩展名)
27
+ */
28
+ list(source: string): Promise<string[]>;
29
+ /**
30
+ * 获取文件路径
31
+ */
32
+ private getFilePath;
33
+ /**
34
+ * source 到目录名的映射
35
+ *
36
+ * 已知 source 使用预定义目录,未知 source 直接用 source 字符串作目录名
37
+ */
38
+ private sourceToDir;
39
+ /**
40
+ * 解析记忆文件为 Memory 对象
41
+ *
42
+ * @param source - 来源标签
43
+ * @param name - 记忆名
44
+ * @param raw - 文件原始内容
45
+ * @param filePath - 文件路径(用于 inferSource 回退)
46
+ * @param mtime - 文件修改时间
47
+ */
48
+ private parseMemory;
49
+ }
50
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"AAQA,OAAO,EAA8B,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAoB5E;;;;;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;IAqBhE;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1C;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiB7C;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;;;;OAQG;IACH,OAAO,CAAC,WAAW;CA4CpB"}