@zooique/memora 1.0.1 → 2.0.3

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 (274) hide show
  1. package/README.en.md +272 -0
  2. package/README.md +150 -38
  3. package/dist/agent/agent.d.ts +257 -115
  4. package/dist/agent/agent.d.ts.map +1 -1
  5. package/dist/agent/agent.js +747 -400
  6. package/dist/agent/agent.js.map +1 -1
  7. package/dist/agent/assembler.d.ts +32 -16
  8. package/dist/agent/assembler.d.ts.map +1 -1
  9. package/dist/agent/assembler.js +83 -47
  10. package/dist/agent/assembler.js.map +1 -1
  11. package/dist/agent/builtinToolHandlers.d.ts +27 -2
  12. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  13. package/dist/agent/builtinToolHandlers.js +78 -5
  14. package/dist/agent/builtinToolHandlers.js.map +1 -1
  15. package/dist/agent/constants.d.ts +4 -0
  16. package/dist/agent/constants.d.ts.map +1 -1
  17. package/dist/agent/constants.js +4 -0
  18. package/dist/agent/constants.js.map +1 -1
  19. package/dist/agent/contextManager.d.ts +8 -0
  20. package/dist/agent/contextManager.d.ts.map +1 -1
  21. package/dist/agent/contextManager.js +7 -2
  22. package/dist/agent/contextManager.js.map +1 -1
  23. package/dist/agent/guardrail.d.ts +4 -2
  24. package/dist/agent/guardrail.d.ts.map +1 -1
  25. package/dist/agent/guardrail.js +13 -5
  26. package/dist/agent/guardrail.js.map +1 -1
  27. package/dist/agent/loop.d.ts +137 -15
  28. package/dist/agent/loop.d.ts.map +1 -1
  29. package/dist/agent/loop.js +449 -270
  30. package/dist/agent/loop.js.map +1 -1
  31. package/dist/agent/managers/archiveCoordinator.d.ts +126 -22
  32. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  33. package/dist/agent/managers/archiveCoordinator.js +239 -44
  34. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  35. package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -1
  36. package/dist/agent/managers/autoConfigRefiner.js +4 -8
  37. package/dist/agent/managers/autoConfigRefiner.js.map +1 -1
  38. package/dist/agent/managers/chatLockManager.d.ts +116 -0
  39. package/dist/agent/managers/chatLockManager.d.ts.map +1 -0
  40. package/dist/agent/managers/chatLockManager.js +191 -0
  41. package/dist/agent/managers/chatLockManager.js.map +1 -0
  42. package/dist/agent/managers/configManager.d.ts +87 -3
  43. package/dist/agent/managers/configManager.d.ts.map +1 -1
  44. package/dist/agent/managers/configManager.js +139 -2
  45. package/dist/agent/managers/configManager.js.map +1 -1
  46. package/dist/agent/managers/dedupManager.d.ts +169 -0
  47. package/dist/agent/managers/dedupManager.d.ts.map +1 -0
  48. package/dist/agent/managers/dedupManager.js +336 -0
  49. package/dist/agent/managers/dedupManager.js.map +1 -0
  50. package/dist/agent/managers/insightExtractor.d.ts +31 -3
  51. package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
  52. package/dist/agent/managers/insightExtractor.js +130 -59
  53. package/dist/agent/managers/insightExtractor.js.map +1 -1
  54. package/dist/agent/managers/llmJudgeHelper.d.ts +38 -0
  55. package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -0
  56. package/dist/agent/managers/llmJudgeHelper.js +49 -0
  57. package/dist/agent/managers/llmJudgeHelper.js.map +1 -0
  58. package/dist/agent/managers/memoryAdvisor.d.ts +102 -2
  59. package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
  60. package/dist/agent/managers/memoryAdvisor.js +254 -10
  61. package/dist/agent/managers/memoryAdvisor.js.map +1 -1
  62. package/dist/agent/managers/memoryDecayScheduler.d.ts +127 -1
  63. package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -1
  64. package/dist/agent/managers/memoryDecayScheduler.js +283 -4
  65. package/dist/agent/managers/memoryDecayScheduler.js.map +1 -1
  66. package/dist/agent/managers/memoryGovernance.d.ts +56 -0
  67. package/dist/agent/managers/memoryGovernance.d.ts.map +1 -0
  68. package/dist/agent/managers/memoryGovernance.js +63 -0
  69. package/dist/agent/managers/memoryGovernance.js.map +1 -0
  70. package/dist/agent/managers/memoryInspector.d.ts +113 -30
  71. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  72. package/dist/agent/managers/memoryInspector.js +165 -32
  73. package/dist/agent/managers/memoryInspector.js.map +1 -1
  74. package/dist/agent/managers/relationBuilder.d.ts +4 -4
  75. package/dist/agent/managers/relationBuilder.d.ts.map +1 -1
  76. package/dist/agent/managers/relationBuilder.js +5 -4
  77. package/dist/agent/managers/relationBuilder.js.map +1 -1
  78. package/dist/agent/managers/sessionArchiver.d.ts +12 -1
  79. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  80. package/dist/agent/managers/sessionArchiver.js +87 -30
  81. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  82. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  83. package/dist/agent/managers/sessionManager.js +9 -17
  84. package/dist/agent/managers/sessionManager.js.map +1 -1
  85. package/dist/agent/managers/streamAccumulator.d.ts +45 -0
  86. package/dist/agent/managers/streamAccumulator.d.ts.map +1 -0
  87. package/dist/agent/managers/streamAccumulator.js +40 -0
  88. package/dist/agent/managers/streamAccumulator.js.map +1 -0
  89. package/dist/agent/managers/textPolishManager.d.ts +62 -0
  90. package/dist/agent/managers/textPolishManager.d.ts.map +1 -0
  91. package/dist/agent/managers/textPolishManager.js +96 -0
  92. package/dist/agent/managers/textPolishManager.js.map +1 -0
  93. package/dist/agent/managers/workProjection.d.ts +16 -1
  94. package/dist/agent/managers/workProjection.d.ts.map +1 -1
  95. package/dist/agent/managers/workProjection.js +48 -24
  96. package/dist/agent/managers/workProjection.js.map +1 -1
  97. package/dist/agent/personaMatcher.d.ts +29 -0
  98. package/dist/agent/personaMatcher.d.ts.map +1 -0
  99. package/dist/agent/personaMatcher.js +60 -0
  100. package/dist/agent/personaMatcher.js.map +1 -0
  101. package/dist/agent/toolExecutor.d.ts +24 -4
  102. package/dist/agent/toolExecutor.d.ts.map +1 -1
  103. package/dist/agent/toolExecutor.js +30 -4
  104. package/dist/agent/toolExecutor.js.map +1 -1
  105. package/dist/agent/tracer.d.ts +31 -0
  106. package/dist/agent/tracer.d.ts.map +1 -1
  107. package/dist/agent/tracer.js +31 -0
  108. package/dist/agent/tracer.js.map +1 -1
  109. package/dist/agent/types.d.ts +133 -0
  110. package/dist/agent/types.d.ts.map +1 -1
  111. package/dist/agent/types.js +38 -0
  112. package/dist/agent/types.js.map +1 -1
  113. package/dist/agent/userFactExtractor.d.ts.map +1 -1
  114. package/dist/agent/userFactExtractor.js +7 -0
  115. package/dist/agent/userFactExtractor.js.map +1 -1
  116. package/dist/config/loader.d.ts +124 -236
  117. package/dist/config/loader.d.ts.map +1 -1
  118. package/dist/config/loader.js +296 -118
  119. package/dist/config/loader.js.map +1 -1
  120. package/dist/eval/evalRunner.d.ts +94 -0
  121. package/dist/eval/evalRunner.d.ts.map +1 -0
  122. package/dist/eval/evalRunner.js +141 -0
  123. package/dist/eval/evalRunner.js.map +1 -0
  124. package/dist/eval/evalTypes.d.ts +21 -0
  125. package/dist/eval/evalTypes.d.ts.map +1 -1
  126. package/dist/eval/evalTypes.js +15 -0
  127. package/dist/eval/evalTypes.js.map +1 -1
  128. package/dist/eval/scenarios.d.ts +33 -0
  129. package/dist/eval/scenarios.d.ts.map +1 -0
  130. package/dist/eval/scenarios.js +109 -0
  131. package/dist/eval/scenarios.js.map +1 -0
  132. package/dist/index.d.ts +45 -6
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +45 -5
  135. package/dist/index.js.map +1 -1
  136. package/dist/llm/abortSignal.d.ts +27 -0
  137. package/dist/llm/abortSignal.d.ts.map +1 -0
  138. package/dist/llm/abortSignal.js +44 -0
  139. package/dist/llm/abortSignal.js.map +1 -0
  140. package/dist/llm/embedding.d.ts +13 -12
  141. package/dist/llm/embedding.d.ts.map +1 -1
  142. package/dist/llm/embedding.js +5 -17
  143. package/dist/llm/embedding.js.map +1 -1
  144. package/dist/llm/factory.d.ts +19 -5
  145. package/dist/llm/factory.d.ts.map +1 -1
  146. package/dist/llm/factory.js +19 -37
  147. package/dist/llm/factory.js.map +1 -1
  148. package/dist/llm/openaiCompatible.d.ts.map +1 -1
  149. package/dist/llm/openaiCompatible.js +17 -34
  150. package/dist/llm/openaiCompatible.js.map +1 -1
  151. package/dist/logging/logger.d.ts +3 -1
  152. package/dist/logging/logger.d.ts.map +1 -1
  153. package/dist/logging/logger.js +47 -50
  154. package/dist/logging/logger.js.map +1 -1
  155. package/dist/memory/governance.d.ts +50 -0
  156. package/dist/memory/governance.d.ts.map +1 -0
  157. package/dist/memory/governance.js +70 -0
  158. package/dist/memory/governance.js.map +1 -0
  159. package/dist/memory/hybridMerge.d.ts +0 -4
  160. package/dist/memory/hybridMerge.d.ts.map +1 -1
  161. package/dist/memory/hybridMerge.js +19 -4
  162. package/dist/memory/hybridMerge.js.map +1 -1
  163. package/dist/memory/inMemoryRelationStore.d.ts +7 -0
  164. package/dist/memory/inMemoryRelationStore.d.ts.map +1 -1
  165. package/dist/memory/inMemoryRelationStore.js +15 -0
  166. package/dist/memory/inMemoryRelationStore.js.map +1 -1
  167. package/dist/memory/inMemoryStorage.d.ts +36 -1
  168. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  169. package/dist/memory/inMemoryStorage.js +70 -19
  170. package/dist/memory/inMemoryStorage.js.map +1 -1
  171. package/dist/memory/loader.d.ts +2 -0
  172. package/dist/memory/loader.d.ts.map +1 -1
  173. package/dist/memory/loader.js +8 -1
  174. package/dist/memory/loader.js.map +1 -1
  175. package/dist/memory/lockManager.d.ts +7 -2
  176. package/dist/memory/lockManager.d.ts.map +1 -1
  177. package/dist/memory/lockManager.js +35 -17
  178. package/dist/memory/lockManager.js.map +1 -1
  179. package/dist/memory/projectManager.d.ts +8 -7
  180. package/dist/memory/projectManager.d.ts.map +1 -1
  181. package/dist/memory/projectManager.js +33 -15
  182. package/dist/memory/projectManager.js.map +1 -1
  183. package/dist/memory/projectRegistry.d.ts +34 -1
  184. package/dist/memory/projectRegistry.d.ts.map +1 -1
  185. package/dist/memory/projectRegistry.js +100 -31
  186. package/dist/memory/projectRegistry.js.map +1 -1
  187. package/dist/memory/recall.d.ts +16 -0
  188. package/dist/memory/recall.d.ts.map +1 -1
  189. package/dist/memory/recall.js +35 -20
  190. package/dist/memory/recall.js.map +1 -1
  191. package/dist/memory/relationStore.d.ts +20 -3
  192. package/dist/memory/relationStore.d.ts.map +1 -1
  193. package/dist/memory/sourceValidation.d.ts +17 -0
  194. package/dist/memory/sourceValidation.d.ts.map +1 -1
  195. package/dist/memory/sourceValidation.js +27 -3
  196. package/dist/memory/sourceValidation.js.map +1 -1
  197. package/dist/memory/storageInterface.d.ts +26 -1
  198. package/dist/memory/storageInterface.d.ts.map +1 -1
  199. package/dist/memory/store.d.ts +22 -1
  200. package/dist/memory/store.d.ts.map +1 -1
  201. package/dist/memory/store.js +58 -20
  202. package/dist/memory/store.js.map +1 -1
  203. package/dist/memory/types.d.ts +44 -31
  204. package/dist/memory/types.d.ts.map +1 -1
  205. package/dist/memory/types.js +63 -24
  206. package/dist/memory/types.js.map +1 -1
  207. package/dist/memory/userProfile.d.ts +32 -8
  208. package/dist/memory/userProfile.d.ts.map +1 -1
  209. package/dist/memory/userProfile.js +105 -44
  210. package/dist/memory/userProfile.js.map +1 -1
  211. package/dist/memory/vectorStore.d.ts +16 -8
  212. package/dist/memory/vectorStore.d.ts.map +1 -1
  213. package/dist/memory/vectorStore.js +49 -22
  214. package/dist/memory/vectorStore.js.map +1 -1
  215. package/dist/persona/personaManager.d.ts +38 -63
  216. package/dist/persona/personaManager.d.ts.map +1 -1
  217. package/dist/persona/personaManager.js +136 -202
  218. package/dist/persona/personaManager.js.map +1 -1
  219. package/dist/skill/skillManager.d.ts +11 -57
  220. package/dist/skill/skillManager.d.ts.map +1 -1
  221. package/dist/skill/skillManager.js +46 -141
  222. package/dist/skill/skillManager.js.map +1 -1
  223. package/dist/skill/types.d.ts +2 -3
  224. package/dist/skill/types.d.ts.map +1 -1
  225. package/dist/utils/array.d.ts +24 -0
  226. package/dist/utils/array.d.ts.map +1 -0
  227. package/dist/utils/array.js +24 -0
  228. package/dist/utils/array.js.map +1 -0
  229. package/dist/utils/configResourceManager.d.ts +111 -0
  230. package/dist/utils/configResourceManager.d.ts.map +1 -0
  231. package/dist/utils/configResourceManager.js +148 -0
  232. package/dist/utils/configResourceManager.js.map +1 -0
  233. package/dist/utils/errors.d.ts +27 -8
  234. package/dist/utils/errors.d.ts.map +1 -1
  235. package/dist/utils/errors.js +31 -9
  236. package/dist/utils/errors.js.map +1 -1
  237. package/dist/utils/eventEmitter.d.ts +88 -4
  238. package/dist/utils/eventEmitter.d.ts.map +1 -1
  239. package/dist/utils/eventEmitter.js +23 -0
  240. package/dist/utils/eventEmitter.js.map +1 -1
  241. package/dist/utils/frontmatter.d.ts.map +1 -1
  242. package/dist/utils/frontmatter.js +4 -2
  243. package/dist/utils/frontmatter.js.map +1 -1
  244. package/dist/utils/math.d.ts +11 -0
  245. package/dist/utils/math.d.ts.map +1 -1
  246. package/dist/utils/math.js +17 -0
  247. package/dist/utils/math.js.map +1 -1
  248. package/dist/utils/objects.d.ts +17 -0
  249. package/dist/utils/objects.d.ts.map +1 -0
  250. package/dist/utils/objects.js +19 -0
  251. package/dist/utils/objects.js.map +1 -0
  252. package/dist/utils/segmenter.d.ts +11 -10
  253. package/dist/utils/segmenter.d.ts.map +1 -1
  254. package/dist/utils/segmenter.js +23 -1
  255. package/dist/utils/segmenter.js.map +1 -1
  256. package/dist/utils/strings.d.ts +22 -1
  257. package/dist/utils/strings.d.ts.map +1 -1
  258. package/dist/utils/strings.js +29 -1
  259. package/dist/utils/strings.js.map +1 -1
  260. package/dist/utils/time.d.ts +18 -3
  261. package/dist/utils/time.d.ts.map +1 -1
  262. package/dist/utils/time.js +24 -8
  263. package/dist/utils/time.js.map +1 -1
  264. package/dist/utils/toError.d.ts +8 -4
  265. package/dist/utils/toError.d.ts.map +1 -1
  266. package/dist/utils/toError.js +25 -5
  267. package/dist/utils/toError.js.map +1 -1
  268. package/docs/memora-api-reference.md +1235 -0
  269. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +808 -0
  270. package/package.json +49 -22
  271. package/dist/agent/managers/memoryMutator.d.ts +0 -92
  272. package/dist/agent/managers/memoryMutator.d.ts.map +0 -1
  273. package/dist/agent/managers/memoryMutator.js +0 -94
  274. package/dist/agent/managers/memoryMutator.js.map +0 -1
package/README.en.md ADDED
@@ -0,0 +1,272 @@
1
+ # Memora
2
+
3
+ > Universal Agent Memory Kernel — Local-first, Private, Domain-agnostic. Everything is Memory.
4
+
5
+ [![npm](https://img.shields.io/npm/v/@zooique/memora)](https://www.npmjs.com/package/@zooique/memora)
6
+ [![Node.js](https://img.shields.io/badge/Node.js-22%20LTS-339933)](https://nodejs.org)
7
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue)](https://www.typescriptlang.org)
8
+ [![Coverage](https://img.shields.io/badge/coverage-90%25-brightgreen)](https://vitest.dev)
9
+ [![Tests](https://img.shields.io/badge/tests-1715%20passed-brightgreen)](https://vitest.dev)
10
+ [![Dependencies](https://img.shields.io/badge/runtime%20deps-0-yellowgreen)](package.json)
11
+ [![License](https://img.shields.io/badge/license-MIT-yellow)](LICENSE)
12
+
13
+ **中文** → [README.md](./README.md)
14
+
15
+ ---
16
+
17
+ ## What is this?
18
+
19
+ Memora is an **Agent memory infrastructure** — it gives your AI Agent persistent, cross-session long-term memory.
20
+
21
+ It solves one core problem: **LLMs are stateless, but user tasks are continuous.**
22
+
23
+ Memora builds continuous evolution on top of stateless inference: memory persistence, intelligent recall, natural decay, semantic deduplication, conflict detection — a complete memory lifecycle, all running locally. Your data never leaves your machine.
24
+
25
+ ## Design Philosophy
26
+
27
+ > **Everything is Memory.**
28
+ >
29
+ > Persona is "I remember who I am." Rules are "I remember how to behave." Skills are "I remember how to do certain things." Conversation history is "I remember what we talked about."
30
+
31
+ Memora is a **brain kernel that cannot run standalone** — it has interfaces but no "form." A CLI, WebUI, desktop sprite, or novel generator can be its "host." The host gives it a body (UI), blood vessels (Provider), and neural circuits (event loops).
32
+
33
+ ## Core Capabilities
34
+
35
+ | Capability | Description |
36
+ |-----------|-------------|
37
+ | **Long-term Memory** | Cross-session, cross-topic memory persistence with intelligent recall |
38
+ | **Dual-channel Recall** | Semantic vector search + keyword search, hybridMerge fusion ranking |
39
+ | **Memory Governance L1-L4** | L1 semantic dedup → L2 timeliness eval → L3 conflict detection → L4 scheduled decay |
40
+ | **Relation Graph** | contradicts / supports / follows / refines / caused — five relation types |
41
+ | **Agent-Persona Separation** | Agent is a pure memory engine; persona is a personality vessel. Switch personas without losing memories |
42
+ | **Unified Memory Model** | Everything is a "Memory" primitive, distinguished by open-string `source` — no closed enums |
43
+ | **Domain-agnostic** | Same architecture, different memory configs → different domains |
44
+ | **Zero-dependency Kernel** | No third-party runtime dependencies; persistence injected by host via interfaces |
45
+ | **Content Guardrails** | Regex rules + block/warn actions, bidirectional input/output checking |
46
+ | **Observability** | ITracer interface + structured spans, plug into any APM |
47
+
48
+ ## Quick Start
49
+
50
+ ### Install
51
+
52
+ ```bash
53
+ npm install @zooique/memora
54
+ ```
55
+
56
+ ### Create an Agent
57
+
58
+ ```typescript
59
+ import { Agent, createLlmProvider } from '@zooique/memora';
60
+
61
+ // Host responsibility: create an LLM Provider
62
+ // Works with any OpenAI Chat Completions-compatible service
63
+ const provider = createLlmProvider({
64
+ provider: 'openaiCompatible',
65
+ apiKey: process.env.LLM_API_KEY!,
66
+ baseUrl: 'https://api.deepseek.com/v1',
67
+ model: 'deepseek-chat',
68
+ });
69
+
70
+ // Create Agent
71
+ const agent = new Agent({
72
+ projectPath: '/path/to/project',
73
+ provider,
74
+ configDir: '/path/to/agent-config', // personas / rules / skills
75
+ dataDir: '.memora', // memory data directory
76
+ });
77
+
78
+ await agent.init();
79
+ ```
80
+
81
+ ### Chat (Streaming)
82
+
83
+ ```typescript
84
+ for await (const chunk of agent.chat('Hi, remember that I love TypeScript')) {
85
+ if (chunk.type === 'text') {
86
+ process.stdout.write(chunk.content);
87
+ }
88
+ }
89
+
90
+ // Next session — the agent automatically recalls "loves TypeScript"
91
+ const reply = await agent.chatSync('What language do I like?');
92
+ // → Answers based on recalled memory
93
+ ```
94
+
95
+ ### Memory Management
96
+
97
+ ```typescript
98
+ // Search memories (hybrid: semantic + keyword)
99
+ const hits = await agent.memory.searchHybrid('TypeScript preference', { limit: 5 });
100
+
101
+ // Governance: semantic deduplication
102
+ const report = await agent.deduplicateMemories();
103
+ console.log(`Deduplicated ${report.deduplicatedCount} memories`);
104
+
105
+ // Governance: timeliness evaluation
106
+ const timeliness = await agent.evaluateTimeliness();
107
+
108
+ // Governance: conflict detection
109
+ const conflicts = await agent.detectConflicts();
110
+
111
+ // Manual decay trigger
112
+ await agent.runMemoryDecayOnce();
113
+ ```
114
+
115
+ ### Cleanup
116
+
117
+ ```typescript
118
+ await agent.close();
119
+ ```
120
+
121
+ ## Architecture
122
+
123
+ ```
124
+ ┌────────────────────────────────────────────────────────────┐
125
+ │ Host Application (CLI / Desktop Sprite / WebUI / Game) │
126
+ │ ┌─────────────────┐ ┌──────────────────┐ │
127
+ │ │ LLM Provider │◄───│ API Key / baseUrl │ ← Host job │
128
+ │ └────────┬────────┘ └──────────────────┘ │
129
+ │ │ inject │
130
+ │ ▼ │
131
+ │ ┌──────────────────────────────────────────┐ │
132
+ │ │ Memora Kernel (Agent) │ │
133
+ │ │ - chat(input) → streaming response │ │
134
+ │ │ - Dual-channel recall (semantic+keyword)│ │
135
+ │ │ - Governance L1-L4 (dedup/age/conflict) │ │
136
+ │ │ - Persona matching / Skill matching │ │
137
+ │ │ - Tool registration / execution │ │
138
+ │ │ - Session archive / Insight extraction │ │
139
+ │ └──────────────────────────────────────────┘ │
140
+ └────────────────────────────────────────────────────────────┘
141
+ ```
142
+
143
+ ### Six Injectable Interfaces
144
+
145
+ The kernel interacts with the outside world through interfaces. Hosts inject implementations as needed:
146
+
147
+ | Interface | Responsibility | Built-in Implementation |
148
+ |-----------|---------------|------------------------|
149
+ | `IMemoryStorage` | Memory CRUD + search + decay | `InMemoryStorage` |
150
+ | `IVectorStore` | Semantic vector index | `JsonVectorStore` |
151
+ | `IMemoryRelationStore` | Memory relation graph | `InMemoryRelationStore` |
152
+ | `ISessionStore` | Session history persistence | None (host implements) |
153
+ | `ILogger` | Logging output | console fallback |
154
+ | `ITracer` | Observability spans | `NOOP_TRACER` |
155
+
156
+ ## Project Structure
157
+
158
+ ```
159
+ src/
160
+ ├── index.ts # Library exports (pure types + interfaces, no CLI)
161
+ ├── agent/ # Agent facade + AgentLoop execution engine
162
+ │ ├── agent.ts # Facade class (single entry point for hosts)
163
+ │ ├── loop.ts # Core loop (reason → tool call → reflection retry)
164
+ │ ├── assembler.ts # Component assembler (pure factory, stateless)
165
+ │ ├── toolExecutor.ts # Tool registration & execution
166
+ │ ├── contextManager.ts # Context window management (truncation + summary)
167
+ │ ├── guardrail.ts # Content guardrails (regex + block/warn)
168
+ │ └── managers/ # 15 specialized Managers
169
+ │ ├── archiveCoordinator.ts # Archive coordination
170
+ │ ├── memoryInspector.ts # Memory read/write (CRUD + search + stats)
171
+ │ ├── memoryGovernance.ts # Governance unified facade (L1-L4)
172
+ │ ├── dedupManager.ts # L1 semantic deduplication
173
+ │ ├── memoryDecayScheduler.ts # L4 scheduled decay + L2 timeliness
174
+ │ ├── memoryAdvisor.ts # L3 conflict detection + health diagnosis
175
+ │ ├── insightExtractor.ts # Conversation insight extraction
176
+ │ ├── relationBuilder.ts # Memory relation building (ADR-014)
177
+ │ ├── sessionManager.ts # Session management (fork/switch)
178
+ │ ├── sessionArchiver.ts # Session content archiving
179
+ │ ├── configManager.ts # Config management (hot-reload rules/skills)
180
+ │ ├── autoConfigRefiner.ts # Self-evolving config suggestions
181
+ │ ├── workProjection.ts # Work projection management
182
+ │ ├── textPolishManager.ts # Text polishing
183
+ │ └── chatLockManager.ts # Chat concurrency lock
184
+ ├── memory/ # Memory engine
185
+ │ ├── types.ts # Memory primitive (8 fields) + relation types
186
+ │ ├── storageInterface.ts # IMemoryStorage interface (16 methods)
187
+ │ ├── recall.ts # Dual-channel recall (semantic + keyword)
188
+ │ ├── hybridMerge.ts # Fusion ranking algorithm
189
+ │ ├── vectorStore.ts # IVectorStore + JsonVectorStore
190
+ │ ├── relationStore.ts # IMemoryRelationStore interface
191
+ │ ├── governance.ts # Governance shared constants (decay/boost/ceiling)
192
+ │ ├── userProfile.ts # User profile management
193
+ │ └── projectManager.ts # Multi-project registry + lock management
194
+ ├── llm/ # LLM adapter layer
195
+ │ ├── provider.ts # LlmProvider abstract class
196
+ │ ├── openaiCompatible.ts # OpenAI-compatible protocol implementation
197
+ │ ├── embedding.ts # EmbeddingProvider (/embeddings endpoint)
198
+ │ └── factory.ts # createLlmProvider factory
199
+ ├── persona/ # Persona management (pure files + in-memory cache)
200
+ ├── skill/ # Skill management (keyword matching + per-turn injection)
201
+ ├── security/ # Security (two-level permissions + path whitelist + audit)
202
+ ├── config/ # Config loading (JSON + env variable interpolation)
203
+ ├── logging/ # Logging (ILogger interface + lazy initialization)
204
+ ├── eval/ # Eval framework (EvalScenario + EvalRunner, for CI)
205
+ └── utils/ # Utilities (event emitter / segmenter / errors / timers)
206
+ ```
207
+
208
+ ## Tech Stack
209
+
210
+ | Category | Choice | Rationale |
211
+ |----------|--------|-----------|
212
+ | Runtime | Node.js ≥ 22 LTS + TypeScript 5 strict + ESM | ADR-001 |
213
+ | Data Layer | IMemoryStorage interface (host injects persistence) | ADR-002 |
214
+ | LLM Protocol | OpenAI Chat Completions compatible (streaming SSE + Tool Calling) | ADR-003 |
215
+ | Memory Model | Open-string source primitive ("Everything is Memory" v2) | ADR-004 |
216
+ | Vector Search | IVectorStore interface + built-in JsonVectorStore (pure JS cosine similarity) | ADR-002 |
217
+ | Relation Graph | IMemoryRelationStore sidecar model (non-invasive to Memory primitive) | ADR-014 |
218
+ | Form Factor | Pure logic library (zero native deps, CLI/UI provided by host) | ADR-002 |
219
+ | Security | Two-level permissions + path whitelist + audit log | ADR-006 |
220
+ | Testing | Vitest + MSW Mock LLM + InMemoryStorage | ADR-007 |
221
+
222
+ ## Engineering Quality
223
+
224
+ | Metric | Value |
225
+ |--------|-------|
226
+ | Source | 82 files / 17,459 lines |
227
+ | Tests | 75 files / 23,042 lines (test code > production code) |
228
+ | Tests Passing | 1,715+ |
229
+ | Statement Coverage | 89.3% |
230
+ | Branch Coverage | 81.7% |
231
+ | Function Coverage | 91.7% |
232
+ | Runtime Dependencies | **0** |
233
+ | Architecture Decision Records | 25 ADRs |
234
+
235
+ ## Development
236
+
237
+ ```bash
238
+ npm test # Run tests
239
+ npm run test:cov # Run tests + coverage
240
+ npm run typecheck # TypeScript type checking
241
+ npm run lint # ESLint
242
+ npm run build # Compile to dist/
243
+ ```
244
+
245
+ ## Documentation
246
+
247
+ - [Integration Guide](docs/memora-接入指南.md) — Complete host developer onboarding manual (Chinese)
248
+ - [API Reference](docs/memora-api-reference.md) — Public API quick reference (Chinese)
249
+ - [Config Example](config.example.json) — LLM / Embedding / Security config template
250
+
251
+ ## Host Project
252
+
253
+ [memora-sprite](hosts/memora-sprite/) — An Electron-based desktop sprite host (v1.5.0), demonstrating a complete Memora integration: SQLite persistence, vector indexing, system tray, global shortcuts, and memory graph visualization.
254
+
255
+ ## Why Memora?
256
+
257
+ | | Memora | Cloud memory services | Framework memory modules |
258
+ |---|---|---|---|
259
+ | Data privacy | ✅ 100% local | ❌ Cloud-dependent | ⚠️ Varies |
260
+ | Runtime deps | ✅ Zero | N/A (SaaS) | ❌ Heavy |
261
+ | Memory lifecycle | ✅ Full (dedup/decay/conflict) | ⚠️ Partial | ❌ CRUD only |
262
+ | Domain-agnostic | ✅ Open-string source | ⚠️ Opinionated | ⚠️ Framework-locked |
263
+ | Embeddable | ✅ Any Node.js host | ❌ API calls only | ⚠️ Framework-bound |
264
+ | Relation graph | ✅ Built-in sidecar | ❌ Rare | ❌ Rare |
265
+
266
+ ## Contributing
267
+
268
+ This project follows the "Big Tree Model" engineering philosophy. Architecture Decision Records (ADRs) are in `.trae/decisions/`.
269
+
270
+ ## License
271
+
272
+ [MIT](LICENSE)
package/README.md CHANGED
@@ -1,27 +1,49 @@
1
1
  # Memora
2
2
 
3
- > 通用 Agent 内核 — 本地、私有、领域无关,万物皆记忆
3
+ > 通用 Agent 记忆内核 — 本地、私有、领域无关,万物皆记忆
4
4
 
5
5
  [![npm](https://img.shields.io/npm/v/@zooique/memora)](https://www.npmjs.com/package/@zooique/memora)
6
6
  [![Node.js](https://img.shields.io/badge/Node.js-22%20LTS-339933)](https://nodejs.org)
7
7
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue)](https://www.typescriptlang.org)
8
+ [![Coverage](https://img.shields.io/badge/coverage-90%25-brightgreen)](https://vitest.dev)
9
+ [![Tests](https://img.shields.io/badge/tests-1715%20passed-brightgreen)](https://vitest.dev)
10
+ [![Dependencies](https://img.shields.io/badge/runtime%20deps-0-yellowgreen)](package.json)
8
11
  [![License](https://img.shields.io/badge/license-MIT-yellow)](LICENSE)
9
12
 
13
+ **English** → [README.en.md](./README.en.md)
14
+
15
+ ---
16
+
17
+ ## 这是什么?
18
+
19
+ Memora 是一个 **Agent 记忆基础设施**——让你的 AI Agent 拥有跨会话、跨话题的长期记忆能力。
20
+
21
+ 它解决一个核心问题:**LLM 是无状态的,但用户的任务是连续的。**
22
+
23
+ Memora 在无状态推理之上构建连续演化能力:记忆沉淀、智能召回、自然衰减、语义去重、冲突检测——完整的记忆生命周期管理,全部在本地完成,数据不出你的机器。
24
+
10
25
  ## 设计哲学
11
26
 
12
27
  > **万物皆是记忆。**
13
28
  >
14
- > 除了用户当前直接输入的提示词内容,Agent 的一切都是记忆——人格是"我记得我是谁",规则是"我记得该怎么做事",技能是"我记得怎么做某类事",对话历史是"我记得之前聊过什么"。
29
+ > 人格是"我记得我是谁",规则是"我记得该怎么做事",技能是"我记得怎么做某类事",对话历史是"我记得之前聊过什么"。
15
30
 
16
31
  Memora 是一个**无法独立运行**的智能大脑内核——它只有接口,没有"形态"。CLI、WebUI、桌面精灵、小说生成器都是它的"宿主",宿主负责给它身体(UI)、血管(Provider)、神经网络(事件回路)。
17
32
 
18
33
  ## 核心能力
19
34
 
20
- - **长期记忆沉淀**——跨会话、跨话题的记忆持久化与智能召回
21
- - **Agent 与角色分离**——Agent 是纯记忆引擎,角色是人格载体。换角色不丢记忆
22
- - **记忆统一模型**——角色、规则、技能、对话历史全部统一为「记忆」,通过 `source` 开放字符串区分
23
- - **领域可插拔**——同一套架构,加载不同记忆配置即可适配不同领域
24
- - **零依赖内核**——核心层仅依赖 `zod`,持久化由宿主通过接口注入
35
+ | 能力 | 说明 |
36
+ |------|------|
37
+ | **长期记忆沉淀** | 跨会话、跨话题的记忆持久化与智能召回 |
38
+ | **双通道召回** | 语义向量搜索 + 关键词搜索,hybridMerge 融合排序 |
39
+ | **记忆治理 L1-L4** | L1 语义去重 → L2 时效评估 → L3 冲突检测 → L4 定时衰减 |
40
+ | **记忆关系图谱** | contradicts / supports / follows / refines / caused 五种关系类型 |
41
+ | **Agent 与角色分离** | Agent 是纯记忆引擎,角色是人格载体。换角色不丢记忆 |
42
+ | **统一记忆模型** | 一切统一为「记忆」,通过 `source` 开放字符串区分,无封闭枚举 |
43
+ | **领域可插拔** | 同一套架构,加载不同记忆配置即可适配不同领域 |
44
+ | **零依赖内核** | 核心层无任何第三方运行时依赖,持久化由宿主通过接口注入 |
45
+ | **内容护栏** | 正则规则 + block/warn 双动作,输入输出双向检查 |
46
+ | **可观测性** | ITracer 接口 + 结构化 span,宿主可接入任意 APM |
25
47
 
26
48
  ## 快速开始
27
49
 
@@ -36,7 +58,7 @@ npm install @zooique/memora
36
58
  ```typescript
37
59
  import { Agent, createLlmProvider } from '@zooique/memora';
38
60
 
39
- // 宿主职责:创建 LLM Provider
61
+ // 宿主职责:创建 LLM Provider(兼容所有 OpenAI Chat Completions 协议的服务)
40
62
  const provider = createLlmProvider({
41
63
  provider: 'openaiCompatible',
42
64
  apiKey: process.env.LLM_API_KEY!,
@@ -49,25 +71,44 @@ const agent = new Agent({
49
71
  projectPath: '/path/to/project',
50
72
  provider,
51
73
  configDir: '/path/to/agent-config', // personas / rules / skills
52
- // dataDir 默认为 '~/.memora',此处显式指定项目级目录
53
- dataDir: '.memora',
74
+ dataDir: '.memora', // 记忆数据存储目录
54
75
  });
55
76
 
56
77
  await agent.init();
57
78
  ```
58
79
 
59
- ### 对话
80
+ ### 对话(流式)
60
81
 
61
82
  ```typescript
62
- // 流式对话
63
- for await (const chunk of agent.chat('你好')) {
83
+ for await (const chunk of agent.chat('你好,记住我喜欢 TypeScript')) {
64
84
  if (chunk.type === 'text') {
65
85
  process.stdout.write(chunk.content);
66
86
  }
67
87
  }
68
88
 
69
- // 同步对话(测试用)
70
- const reply = await agent.chatSync('你好');
89
+ // 下一次对话,Agent 会自动召回"喜欢 TypeScript"这条记忆
90
+ const reply = await agent.chatSync('我喜欢什么语言?');
91
+ // → 基于召回的记忆回答
92
+ ```
93
+
94
+ ### 记忆管理
95
+
96
+ ```typescript
97
+ // 搜索记忆
98
+ const hits = await agent.memory.searchHybrid('TypeScript 偏好', { limit: 5 });
99
+
100
+ // 记忆治理:语义去重
101
+ const report = await agent.deduplicateMemories();
102
+ console.log(`去重 ${report.deduplicatedCount} 条`);
103
+
104
+ // 记忆治理:时效性评估
105
+ const timeliness = await agent.evaluateTimeliness();
106
+
107
+ // 记忆治理:冲突检测
108
+ const conflicts = await agent.detectConflicts();
109
+
110
+ // 手动触发衰减
111
+ await agent.runMemoryDecayOnce();
71
112
  ```
72
113
 
73
114
  ### 关闭
@@ -89,41 +130,107 @@ await agent.close();
89
130
  │ ┌──────────────────────────────────────────┐ │
90
131
  │ │ Memora 内核(Agent) │ │
91
132
  │ │ - chat(input) → 流式响应 │ │
92
- │ │ - 记忆搜索 / 归档 / 挂载 │ │
93
- │ │ - 角色匹配 / 技能匹配 │ │
94
- │ │ - 工具注册 / 工具执行 │ │
133
+ │ │ - 双通道记忆召回(语义 + 关键词) │ │
134
+ │ │ - 记忆治理 L1-L4(去重/时效/冲突/衰减) │ │
135
+ │ │ - 角色匹配 / 技能匹配 / 护栏检查 │ │
136
+ │ │ - 工具注册 / 工具执行 / 反思重试 │ │
137
+ │ │ - 会话归档 / 洞察提取 / 关系构建 │ │
95
138
  │ └──────────────────────────────────────────┘ │
96
139
  └────────────────────────────────────────────────────────────┘
97
140
  ```
98
141
 
142
+ ### 六大注入接口
143
+
144
+ 内核通过接口与外部世界交互,宿主按需注入:
145
+
146
+ | 接口 | 职责 | 内置实现 |
147
+ |------|------|----------|
148
+ | `IMemoryStorage` | 记忆 CRUD + 搜索 + 衰减 | `InMemoryStorage` |
149
+ | `IVectorStore` | 语义向量索引 | `JsonVectorStore` |
150
+ | `IMemoryRelationStore` | 记忆关系图谱 | `InMemoryRelationStore` |
151
+ | `ISessionStore` | 会话历史持久化 | 无(宿主实现) |
152
+ | `ILogger` | 日志输出 | console fallback |
153
+ | `ITracer` | 可观测性 span | `NOOP_TRACER` |
154
+
99
155
  ## 项目结构
100
156
 
101
157
  ```
102
158
  src/
103
- ├── index.ts # 库导出入口(纯类型 + 接口导出,无 CLI)
104
- ├── agent/ # Agent 门面 + AgentLoop + 工具执行 + managers/(9 个专职 Manager)
105
- ├── memory/ # 记忆引擎(IMemoryStorage + IMemoryRelationStore + 召回 + 向量存储)
106
- ├── persona/ # 角色管理
107
- ├── skill/ # 技能管理
108
- ├── llm/ # LLM 适配层
109
- ├── security/ # 安全策略
110
- ├── config/ # 配置加载
111
- ├── logging/ # 日志
112
- ├── eval/ # 评估框架(Mock Eval / Agent 行为回归测试)
113
- └── utils/ # 工具函数
159
+ ├── index.ts # 库导出入口(纯类型 + 接口导出,无 CLI)
160
+ ├── agent/ # Agent 门面 + AgentLoop 执行引擎
161
+ │ ├── agent.ts # 门面类(宿主唯一入口)
162
+ │ ├── loop.ts # 核心循环(推理 → 工具调用 → 反思重试)
163
+ │ ├── assembler.ts # 组件组装器(纯工厂,不持有状态)
164
+ │ ├── toolExecutor.ts # 工具注册与执行
165
+ │ ├── contextManager.ts # 上下文窗口管理(截断 + 摘要)
166
+ │ ├── guardrail.ts # 内容护栏(正则 + block/warn)
167
+ │ └── managers/ # 15 个专职 Manager
168
+ │ ├── archiveCoordinator.ts # 归档协调(会话归档 + 洞察提取)
169
+ │ ├── memoryInspector.ts # 记忆读写(CRUD + 搜索 + 统计)
170
+ │ ├── memoryGovernance.ts # 治理统一门面(L1-L4)
171
+ │ ├── dedupManager.ts # L1 语义去重
172
+ │ ├── memoryDecayScheduler.ts # L4 定时衰减 + L2 时效评估
173
+ │ ├── memoryAdvisor.ts # L3 冲突检测 + 健康诊断
174
+ │ ├── insightExtractor.ts # 对话洞察提取
175
+ │ ├── relationBuilder.ts # 记忆关系构建(ADR-014)
176
+ │ ├── sessionManager.ts # 会话管理(分叉/切换)
177
+ │ ├── sessionArchiver.ts # 会话内容归档
178
+ │ ├── configManager.ts # 配置管理(规则/技能热加载)
179
+ │ ├── autoConfigRefiner.ts # 自进化配置建议
180
+ │ ├── workProjection.ts # 作品投影管理
181
+ │ ├── textPolishManager.ts # 文本润色
182
+ │ └── chatLockManager.ts # 对话并发锁
183
+ ├── memory/ # 记忆引擎
184
+ │ ├── types.ts # Memory 基元(8 字段)+ 关系类型
185
+ │ ├── storageInterface.ts # IMemoryStorage 接口(16 方法)
186
+ │ ├── recall.ts # 双通道召回(语义 + 关键词)
187
+ │ ├── hybridMerge.ts # 融合排序算法
188
+ │ ├── vectorStore.ts # IVectorStore + JsonVectorStore
189
+ │ ├── relationStore.ts # IMemoryRelationStore 接口
190
+ │ ├── governance.ts # 治理共享常量(衰减/提升/上限)
191
+ │ ├── userProfile.ts # 用户画像管理
192
+ │ └── projectManager.ts # 多项目注册 + 锁管理
193
+ ├── llm/ # LLM 适配层
194
+ │ ├── provider.ts # LlmProvider 抽象类
195
+ │ ├── openaiCompatible.ts # OpenAI 兼容协议实现
196
+ │ ├── embedding.ts # EmbeddingProvider(/embeddings 端点)
197
+ │ └── factory.ts # createLlmProvider 工厂
198
+ ├── persona/ # 角色管理(纯文件 + 内存缓存)
199
+ ├── skill/ # 技能管理(关键词匹配 + 当轮注入)
200
+ ├── security/ # 安全策略(两级权限 + 路径白名单 + 审计)
201
+ ├── config/ # 配置加载(JSON + 环境变量插值)
202
+ ├── logging/ # 日志(ILogger 接口 + 懒初始化)
203
+ ├── eval/ # 评估框架(EvalScenario + EvalRunner,CI 用)
204
+ └── utils/ # 工具函数(事件系统/分词/分片/错误/定时器)
114
205
  ```
115
206
 
116
207
  ## 技术栈
117
208
 
118
- | 类别 | 选型 | 决策 |
119
- |------|------|------|
209
+ | 类别 | 选型 | 决策依据 |
210
+ |------|------|----------|
120
211
  | 运行时 | Node.js ≥ 22 LTS + TypeScript 5 strict + ESM | ADR-001 |
121
212
  | 数据层 | IMemoryStorage 接口(宿主注入持久化实现) | ADR-002 |
122
- | LLM | OpenAI Chat Completions 兼容协议 | ADR-003 |
123
- | 形态 | 纯逻辑库(CLI 由宿主提供) | ADR-002 |
124
- | 安全 | 两级权限 + 路径白名单 | ADR-006 |
213
+ | LLM 协议 | OpenAI Chat Completions 兼容(流式 SSE + Tool Calling) | ADR-003 |
214
+ | 记忆模型 | source 开放字符串基元驱动(万物皆记忆 v2) | ADR-004 |
215
+ | 向量检索 | IVectorStore 接口 + 内置 JsonVectorStore(纯 JS 余弦相似度) | ADR-002 |
216
+ | 关系图谱 | IMemoryRelationStore 侧车模型(不侵入 Memory 基元) | ADR-014 |
217
+ | 形态 | 纯逻辑库(零 native 依赖,CLI/UI 由宿主提供) | ADR-002 |
218
+ | 安全 | 两级权限 + 路径白名单 + 审计日志 | ADR-006 |
125
219
  | 测试 | Vitest + MSW Mock LLM + InMemoryStorage | ADR-007 |
126
220
 
221
+ ## 工程质量
222
+
223
+ | 指标 | 数值 |
224
+ |------|------|
225
+ | 源码 | 82 文件 / 19,060 行 |
226
+ | 测试 | 75 文件 / 23,748 行(测试代码量 > 生产代码量) |
227
+ | 测试通过 | 1,716+ |
228
+ | 语句覆盖 | 89.3% |
229
+ | 分支覆盖 | 81.7% |
230
+ | 函数覆盖 | 91.7% |
231
+ | 运行时依赖 | **0** |
232
+ | 架构决策记录 | 25 个 ADR |
233
+
127
234
  ## 开发命令
128
235
 
129
236
  ```bash
@@ -131,18 +238,23 @@ npm test # 运行测试
131
238
  npm run test:cov # 运行测试 + 覆盖率
132
239
  npm run typecheck # TypeScript 类型检查
133
240
  npm run lint # ESLint 检查
241
+ npm run build # 编译到 dist/
134
242
  ```
135
243
 
136
244
  ## 文档
137
245
 
138
- 详细接入指南与 API 参考文档随源码提供。本包核心使用方式见上文「快速开始」。
246
+ - [接入指南](docs/memora-接入指南.md) — 宿主项目开发者完整接入手册
247
+ - [API 参考](docs/memora-api-reference.md) — 公共 API 速查
248
+ - [配置示例](config.example.json) — LLM / Embedding / 安全配置模板
249
+
250
+ ## 宿主项目
139
251
 
140
- 技术决策记录(ADR)目前为内部文档,不随 npm 包分发。
252
+ [memora-sprite](hosts/memora-sprite/) — 基于 Electron 的桌面精灵宿主(v1.5.0),展示 Memora 内核的完整接入方式:SQLite 持久化、向量索引、系统托盘、全局快捷键、记忆图谱可视化。
141
253
 
142
254
  ## 贡献
143
255
 
144
- 本项目遵循"大树模型"工程哲学。
256
+ 本项目遵循"大树模型"工程哲学。技术决策记录(ADR)位于 `.trae/decisions/`。
145
257
 
146
258
  ## 许可证
147
259
 
148
- MIT
260
+ [MIT](LICENSE)