@zooique/memora 3.0.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/CHANGELOG.md +161 -1033
  2. package/README.en.md +46 -39
  3. package/README.md +40 -35
  4. package/config.example.json +1 -8
  5. package/dist/agent/agent.d.ts +88 -80
  6. package/dist/agent/agent.d.ts.map +1 -1
  7. package/dist/agent/agent.js +272 -221
  8. package/dist/agent/agent.js.map +1 -1
  9. package/dist/agent/assembler.d.ts +22 -21
  10. package/dist/agent/assembler.d.ts.map +1 -1
  11. package/dist/agent/assembler.js +120 -46
  12. package/dist/agent/assembler.js.map +1 -1
  13. package/dist/agent/backgroundTasks.d.ts +194 -0
  14. package/dist/agent/backgroundTasks.d.ts.map +1 -0
  15. package/dist/agent/backgroundTasks.js +314 -0
  16. package/dist/agent/backgroundTasks.js.map +1 -0
  17. package/dist/agent/budget.d.ts +23 -5
  18. package/dist/agent/budget.d.ts.map +1 -1
  19. package/dist/agent/budget.js +8 -2
  20. package/dist/agent/budget.js.map +1 -1
  21. package/dist/agent/builtinToolHandlers.d.ts +29 -9
  22. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  23. package/dist/agent/builtinToolHandlers.js +53 -13
  24. package/dist/agent/builtinToolHandlers.js.map +1 -1
  25. package/dist/agent/builtinTools.d.ts +15 -1
  26. package/dist/agent/builtinTools.d.ts.map +1 -1
  27. package/dist/agent/builtinTools.js +111 -30
  28. package/dist/agent/builtinTools.js.map +1 -1
  29. package/dist/agent/constants.d.ts +31 -6
  30. package/dist/agent/constants.d.ts.map +1 -1
  31. package/dist/agent/constants.js +38 -8
  32. package/dist/agent/constants.js.map +1 -1
  33. package/dist/agent/contextManager.d.ts +8 -0
  34. package/dist/agent/contextManager.d.ts.map +1 -1
  35. package/dist/agent/contextManager.js +45 -3
  36. package/dist/agent/contextManager.js.map +1 -1
  37. package/dist/agent/contextPreparer.d.ts +1 -1
  38. package/dist/agent/contextPreparer.d.ts.map +1 -1
  39. package/dist/agent/contextPreparer.js +15 -10
  40. package/dist/agent/contextPreparer.js.map +1 -1
  41. package/dist/agent/guardRail.d.ts +12 -1
  42. package/dist/agent/guardRail.d.ts.map +1 -1
  43. package/dist/agent/guardRail.js +37 -2
  44. package/dist/agent/guardRail.js.map +1 -1
  45. package/dist/agent/loop.d.ts +319 -34
  46. package/dist/agent/loop.d.ts.map +1 -1
  47. package/dist/agent/loop.js +713 -110
  48. package/dist/agent/loop.js.map +1 -1
  49. package/dist/agent/managers/archiveCoordinator.d.ts +19 -4
  50. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  51. package/dist/agent/managers/archiveCoordinator.js +25 -4
  52. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  53. package/dist/agent/managers/chatLockManager.d.ts +3 -9
  54. package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
  55. package/dist/agent/managers/chatLockManager.js +7 -25
  56. package/dist/agent/managers/chatLockManager.js.map +1 -1
  57. package/dist/agent/managers/llmCaller.d.ts.map +1 -1
  58. package/dist/agent/managers/llmCaller.js +27 -1
  59. package/dist/agent/managers/llmCaller.js.map +1 -1
  60. package/dist/agent/managers/loopMetrics.d.ts +14 -0
  61. package/dist/agent/managers/loopMetrics.d.ts.map +1 -1
  62. package/dist/agent/managers/loopMetrics.js +15 -0
  63. package/dist/agent/managers/loopMetrics.js.map +1 -1
  64. package/dist/agent/managers/memoryInspector.d.ts +13 -15
  65. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  66. package/dist/agent/managers/memoryInspector.js +38 -49
  67. package/dist/agent/managers/memoryInspector.js.map +1 -1
  68. package/dist/agent/managers/roundSummaryGenerator.d.ts +31 -1
  69. package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -1
  70. package/dist/agent/managers/roundSummaryGenerator.js +81 -6
  71. package/dist/agent/managers/roundSummaryGenerator.js.map +1 -1
  72. package/dist/agent/managers/sessionArchiver.d.ts +35 -3
  73. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  74. package/dist/agent/managers/sessionArchiver.js +34 -3
  75. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  76. package/dist/agent/managers/sessionManager.d.ts +21 -88
  77. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  78. package/dist/agent/managers/sessionManager.js +94 -278
  79. package/dist/agent/managers/sessionManager.js.map +1 -1
  80. package/dist/agent/managers/toolCallHelpers.d.ts +109 -28
  81. package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -1
  82. package/dist/agent/managers/toolCallHelpers.js +93 -37
  83. package/dist/agent/managers/toolCallHelpers.js.map +1 -1
  84. package/dist/agent/messageHistory.d.ts.map +1 -1
  85. package/dist/agent/messageHistory.js +9 -5
  86. package/dist/agent/messageHistory.js.map +1 -1
  87. package/dist/agent/seed/orchestrator.d.ts +12 -1
  88. package/dist/agent/seed/orchestrator.d.ts.map +1 -1
  89. package/dist/agent/seed/orchestrator.js +15 -4
  90. package/dist/agent/seed/orchestrator.js.map +1 -1
  91. package/dist/agent/seed/prepare.d.ts.map +1 -1
  92. package/dist/agent/seed/prepare.js +9 -4
  93. package/dist/agent/seed/prepare.js.map +1 -1
  94. package/dist/agent/seed/types.d.ts +11 -4
  95. package/dist/agent/seed/types.d.ts.map +1 -1
  96. package/dist/agent/seed/types.js +2 -2
  97. package/dist/agent/textSanitize.d.ts +36 -0
  98. package/dist/agent/textSanitize.d.ts.map +1 -0
  99. package/dist/agent/textSanitize.js +55 -0
  100. package/dist/agent/textSanitize.js.map +1 -0
  101. package/dist/agent/toolExecutor.d.ts +97 -26
  102. package/dist/agent/toolExecutor.d.ts.map +1 -1
  103. package/dist/agent/toolExecutor.js +444 -78
  104. package/dist/agent/toolExecutor.js.map +1 -1
  105. package/dist/agent/toolLedger.d.ts +93 -41
  106. package/dist/agent/toolLedger.d.ts.map +1 -1
  107. package/dist/agent/toolLedger.js +114 -42
  108. package/dist/agent/toolLedger.js.map +1 -1
  109. package/dist/agent/toolResultCache.js +1 -1
  110. package/dist/agent/toolResultOffload.d.ts +8 -0
  111. package/dist/agent/toolResultOffload.d.ts.map +1 -1
  112. package/dist/agent/toolResultOffload.js +10 -3
  113. package/dist/agent/toolResultOffload.js.map +1 -1
  114. package/dist/agent/toolRunner.d.ts +16 -7
  115. package/dist/agent/toolRunner.d.ts.map +1 -1
  116. package/dist/agent/toolRunner.js +74 -29
  117. package/dist/agent/toolRunner.js.map +1 -1
  118. package/dist/agent/tracer.d.ts +13 -1
  119. package/dist/agent/tracer.d.ts.map +1 -1
  120. package/dist/agent/types.d.ts +74 -30
  121. package/dist/agent/types.d.ts.map +1 -1
  122. package/dist/code-exec/types.d.ts +9 -0
  123. package/dist/code-exec/types.d.ts.map +1 -1
  124. package/dist/index.d.ts +28 -41
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +65 -54
  127. package/dist/index.js.map +1 -1
  128. package/dist/logging/logger.d.ts +4 -1
  129. package/dist/logging/logger.d.ts.map +1 -1
  130. package/dist/logging/logger.js +5 -2
  131. package/dist/logging/logger.js.map +1 -1
  132. package/dist/memory/gcService.d.ts.map +1 -1
  133. package/dist/memory/gcService.js +3 -5
  134. package/dist/memory/gcService.js.map +1 -1
  135. package/dist/memory/inMemorySessionStore.d.ts +2 -2
  136. package/dist/memory/inMemorySessionStore.js +2 -2
  137. package/dist/memory/inMemoryStorage.d.ts +4 -3
  138. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  139. package/dist/memory/inMemoryStorage.js +2 -2
  140. package/dist/memory/inMemoryStorage.js.map +1 -1
  141. package/dist/memory/nodeSqliteStorage.d.ts +17 -0
  142. package/dist/memory/nodeSqliteStorage.d.ts.map +1 -0
  143. package/dist/memory/nodeSqliteStorage.js +393 -0
  144. package/dist/memory/nodeSqliteStorage.js.map +1 -0
  145. package/dist/memory/projectManager.d.ts +10 -20
  146. package/dist/memory/projectManager.d.ts.map +1 -1
  147. package/dist/memory/projectManager.js +27 -41
  148. package/dist/memory/projectManager.js.map +1 -1
  149. package/dist/memory/roundStore.d.ts +143 -82
  150. package/dist/memory/roundStore.d.ts.map +1 -1
  151. package/dist/memory/roundStore.js +4 -15
  152. package/dist/memory/roundStore.js.map +1 -1
  153. package/dist/memory/roundSummaryLookup.d.ts +26 -0
  154. package/dist/memory/roundSummaryLookup.d.ts.map +1 -0
  155. package/dist/memory/roundSummaryLookup.js +19 -0
  156. package/dist/memory/roundSummaryLookup.js.map +1 -0
  157. package/dist/memory/sessionStore.d.ts +19 -2
  158. package/dist/memory/sessionStore.d.ts.map +1 -1
  159. package/dist/memory/sessionStore.js.map +1 -1
  160. package/dist/memory/sourceValidation.d.ts +2 -13
  161. package/dist/memory/sourceValidation.d.ts.map +1 -1
  162. package/dist/memory/sourceValidation.js +5 -16
  163. package/dist/memory/sourceValidation.js.map +1 -1
  164. package/dist/memory/storageInterface.d.ts +26 -16
  165. package/dist/memory/storageInterface.d.ts.map +1 -1
  166. package/dist/memory/supersedeResolve.d.ts +39 -0
  167. package/dist/memory/supersedeResolve.d.ts.map +1 -0
  168. package/dist/memory/supersedeResolve.js +16 -0
  169. package/dist/memory/supersedeResolve.js.map +1 -0
  170. package/dist/memory/types.d.ts +10 -2
  171. package/dist/memory/types.d.ts.map +1 -1
  172. package/dist/memory/types.js +6 -1
  173. package/dist/memory/types.js.map +1 -1
  174. package/dist/role-pack/rolePackManager.d.ts +74 -33
  175. package/dist/role-pack/rolePackManager.d.ts.map +1 -1
  176. package/dist/role-pack/rolePackManager.js +112 -53
  177. package/dist/role-pack/rolePackManager.js.map +1 -1
  178. package/dist/role-pack/strategyKeys.d.ts +44 -0
  179. package/dist/role-pack/strategyKeys.d.ts.map +1 -1
  180. package/dist/role-pack/strategyKeys.js +55 -0
  181. package/dist/role-pack/strategyKeys.js.map +1 -1
  182. package/dist/role-pack/strategyResolver.d.ts +6 -1
  183. package/dist/role-pack/strategyResolver.d.ts.map +1 -1
  184. package/dist/role-pack/strategyResolver.js +20 -2
  185. package/dist/role-pack/strategyResolver.js.map +1 -1
  186. package/dist/role-pack/types.d.ts +5 -1
  187. package/dist/role-pack/types.d.ts.map +1 -1
  188. package/dist/security/confirmEntries.d.ts +44 -0
  189. package/dist/security/confirmEntries.d.ts.map +1 -0
  190. package/dist/security/confirmEntries.js +59 -0
  191. package/dist/security/confirmEntries.js.map +1 -0
  192. package/dist/security/pathGuard.d.ts +42 -6
  193. package/dist/security/pathGuard.d.ts.map +1 -1
  194. package/dist/security/pathGuard.js +126 -5
  195. package/dist/security/pathGuard.js.map +1 -1
  196. package/dist/skill/skillScriptRunner.d.ts +147 -15
  197. package/dist/skill/skillScriptRunner.d.ts.map +1 -1
  198. package/dist/skill/skillScriptRunner.js +479 -68
  199. package/dist/skill/skillScriptRunner.js.map +1 -1
  200. package/dist/utils/backgroundTask.d.ts +56 -34
  201. package/dist/utils/backgroundTask.d.ts.map +1 -1
  202. package/dist/utils/backgroundTask.js +130 -99
  203. package/dist/utils/backgroundTask.js.map +1 -1
  204. package/dist/utils/configResourceManager.d.ts +6 -2
  205. package/dist/utils/configResourceManager.d.ts.map +1 -1
  206. package/dist/utils/configResourceManager.js +8 -2
  207. package/dist/utils/configResourceManager.js.map +1 -1
  208. package/dist/utils/errors.d.ts +12 -2
  209. package/dist/utils/errors.d.ts.map +1 -1
  210. package/dist/utils/errors.js +12 -2
  211. package/dist/utils/errors.js.map +1 -1
  212. package/dist/utils/eventEmitter.d.ts +76 -23
  213. package/dist/utils/eventEmitter.d.ts.map +1 -1
  214. package/dist/utils/eventEmitter.js +23 -3
  215. package/dist/utils/eventEmitter.js.map +1 -1
  216. package/dist/utils/time.d.ts +8 -5
  217. package/dist/utils/time.d.ts.map +1 -1
  218. package/dist/utils/time.js +8 -5
  219. package/dist/utils/time.js.map +1 -1
  220. package/dist/utils/toError.d.ts +1 -1
  221. package/dist/utils/toError.js +1 -1
  222. package/dist/web-fetch/loginWall.d.ts +39 -0
  223. package/dist/web-fetch/loginWall.d.ts.map +1 -0
  224. package/dist/web-fetch/loginWall.js +78 -0
  225. package/dist/web-fetch/loginWall.js.map +1 -0
  226. package/dist/web-fetch/types.d.ts +8 -0
  227. package/dist/web-fetch/types.d.ts.map +1 -1
  228. package/dist/web-fetch/webFetchProvider.d.ts.map +1 -1
  229. package/dist/web-fetch/webFetchProvider.js +3 -1
  230. package/dist/web-fetch/webFetchProvider.js.map +1 -1
  231. package/dist/web-search/fetchWebSearchProvider.js +28 -23
  232. package/dist/web-search/fetchWebSearchProvider.js.map +1 -1
  233. package/docs/architecture/role-pack-authoring-guide.md +3 -1
  234. package/docs/architecture/role-pack-spec.md +2 -1
  235. package/docs/memora-api-reference.md +1349 -1175
  236. package/docs/memora-/345/215/207/347/272/247/346/214/207/345/215/227-4.x-/345/210/260-5.0.0.md +385 -0
  237. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +91 -52
  238. package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -148
  239. package/package.json +9 -4
  240. package/role-packs/README.md +41 -40
  241. package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -4
  242. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +1 -0
  243. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +1 -1
  244. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +1 -0
  245. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +1 -1
  246. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +1 -1
  247. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +32 -5
  248. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/scripts/init-novel-project.mjs +10 -6
  249. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +3 -1
  250. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/manifest.json +1 -0
  251. package/dist/agent/managers/dedupManager.d.ts +0 -85
  252. package/dist/agent/managers/dedupManager.d.ts.map +0 -1
  253. package/dist/agent/managers/dedupManager.js +0 -248
  254. package/dist/agent/managers/dedupManager.js.map +0 -1
  255. package/dist/agent/managers/goalConsistencyChecker.d.ts +0 -42
  256. package/dist/agent/managers/goalConsistencyChecker.d.ts.map +0 -1
  257. package/dist/agent/managers/goalConsistencyChecker.js +0 -178
  258. package/dist/agent/managers/goalConsistencyChecker.js.map +0 -1
  259. package/dist/agent/managers/llmJudgeHelper.d.ts +0 -21
  260. package/dist/agent/managers/llmJudgeHelper.d.ts.map +0 -1
  261. package/dist/agent/managers/llmJudgeHelper.js +0 -32
  262. package/dist/agent/managers/llmJudgeHelper.js.map +0 -1
  263. package/dist/agent/managers/memoryAdvisor.d.ts +0 -105
  264. package/dist/agent/managers/memoryAdvisor.d.ts.map +0 -1
  265. package/dist/agent/managers/memoryAdvisor.js +0 -322
  266. package/dist/agent/managers/memoryAdvisor.js.map +0 -1
  267. package/dist/agent/managers/memoryGovernance.d.ts +0 -24
  268. package/dist/agent/managers/memoryGovernance.d.ts.map +0 -1
  269. package/dist/agent/managers/memoryGovernance.js +0 -46
  270. package/dist/agent/managers/memoryGovernance.js.map +0 -1
  271. package/dist/memory/governance.d.ts +0 -17
  272. package/dist/memory/governance.d.ts.map +0 -1
  273. package/dist/memory/governance.js +0 -17
  274. package/dist/memory/governance.js.map +0 -1
  275. package/dist/memory/projectRegistry.d.ts +0 -47
  276. package/dist/memory/projectRegistry.d.ts.map +0 -1
  277. package/dist/memory/projectRegistry.js +0 -151
  278. package/dist/memory/projectRegistry.js.map +0 -1
  279. package/dist/utils/recallDefaults.d.ts +0 -16
  280. package/dist/utils/recallDefaults.d.ts.map +0 -1
  281. package/dist/utils/recallDefaults.js +0 -16
  282. package/dist/utils/recallDefaults.js.map +0 -1
package/README.en.md CHANGED
@@ -1,4 +1,4 @@
1
- # Memora
1
+ # Memora
2
2
 
3
3
  > **Agent Memory Kernel with Governance** — Local-first, Private, Zero-dep. Not a framework, a kernel.
4
4
 
@@ -6,7 +6,7 @@
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
8
  [![Coverage](https://img.shields.io/badge/coverage-covered-brightgreen)](https://vitest.dev)
9
- [![Tests](https://img.shields.io/badge/tests-2700%2B%20passed-brightgreen)](https://vitest.dev)
9
+ [![Tests](https://img.shields.io/badge/tests-passing-brightgreen)](https://vitest.dev)
10
10
  [![Dependencies](https://img.shields.io/badge/runtime%20deps-0-yellowgreen)](package.json)
11
11
  [![License](https://img.shields.io/badge/license-MIT-yellow)](LICENSE)
12
12
 
@@ -17,7 +17,7 @@
17
17
  ## What problem are you facing?
18
18
 
19
19
  - **LLM forgets everything between sessions** — Your users remember what they said, your agent doesn't
20
- - **Existing memory solutions are either too heavy (framework-bound) or too shallow (CRUD only)** — No dedup, conflict detection, or write-time supersede
20
+ - **Existing memory solutions are either too heavy (framework-bound) or too shallow (CRUD only)** — No write-time supersede: either decay-only forgetting, or old and new memories coexist and contradict each other
21
21
  - **Memory and persona are tangled** — Switch personas and lose your history
22
22
  - **You don't want to send data to the cloud** — Need a local, private memory layer with zero external dependencies
23
23
 
@@ -25,7 +25,7 @@
25
25
 
26
26
  Memora is an **Agent memory kernel** — framework-agnostic, cloud-independent, focused on one thing: **giving your agent cross-session, cross-topic long-term memory that stays clean.**
27
27
 
28
- "Clean" means: semantic deduplication, conflict detection, write-time supersede, and last-used refresh (accessedAt, used for ordering) — no importance weighting, and not just stuffing history into the context window.
28
+ "Clean" means: write-time supersede (soft `supersededBy` pointer, traceable) and last-used refresh (accessedAt, used for ordering) — no importance weighting, and not just stuffing history into the context window. **Governance happens at write time only**: there is no subscription-style post-hoc sweep (dedup / conflict detection / related suggestions were retired as a whole in 5.0.0 — see the Core Capabilities table).
29
29
 
30
30
  ```typescript
31
31
  import { Agent, createProviderFromConfig } from '@zooique/memora';
@@ -50,11 +50,6 @@ for await (const chunk of agent.chat('I love TypeScript')) {
50
50
  // Next session — the LLM can call search_memories to retrieve this memory
51
51
  const reply = await agent.chatSync('What language do I like?');
52
52
 
53
- // Memory governance — dedup / conflict detection / source health
54
- await agent.governance.deduplicate();
55
- await agent.governance.detectConflicts();
56
- const health = agent.governance.sourceHealth();
57
-
58
53
  await agent.close();
59
54
  ```
60
55
 
@@ -66,14 +61,14 @@ await agent.close();
66
61
 
67
62
  | | Memora | Vector memory libs (agent-memory, MemStack) | Framework-builtin memory (Mastra, LangGraph) |
68
63
  |---|---|---|---|
69
- | **Memory governance** | ✅ Dedup+conflict+write-time supersede | ⚠️ Decay only or none | ⚠️ Partial |
64
+ | **Memory governance** | ✅ Write-time supersede (soft `supersededBy`, traceable) | ⚠️ Decay only or none | ⚠️ Partial |
70
65
  | **Framework lock-in** | ✅ Zero — pure kernel | ✅ Standalone | ❌ Tied to framework |
71
66
  | **Data privacy** | ✅ 100% local | ✅ Local | ⚠️ Partially cloud |
72
67
  | **Runtime deps** | ✅ Zero (node:* only) | ❌ SQLite / better-sqlite3 | ❌ Heavy |
73
68
  | **Persona/memory separation** | ✅ Role-pack boundary discipline | ❌ No persona concept | ⚠️ Simple prompt |
74
69
  | **Embeddable** | ✅ Any Node.js host | ✅ Standalone lib | ❌ Framework-internal |
75
70
 
76
- **One-line positioning**: If you want a **framework-agnostic, governance-capable, zero-dependency** memory layer, Memora is currently the only option on npm.
71
+ **One-line positioning**: If you want a **framework-agnostic, governance-capable (write-time supersede), zero-dependency** memory layer, Memora is currently the only option on npm.
77
72
 
78
73
  ---
79
74
 
@@ -85,7 +80,7 @@ await agent.close();
85
80
 
86
81
  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).
87
82
 
88
- > **Version positioning (v3.0.0)**: **Node.js-only · Zero third-party runtime deps Agent kernel**. v3.0.0 is the first stable baseline after architecture convergence.
83
+ > **Version positioning (v5.0.0)**: **Node.js-only · Zero third-party runtime deps Agent kernel**. **v5.0.0 (current)**: major public surface pruning (23 exports + 32 public members + 3 events removed) + multi-project shape finalized (one Agent = one project) + three never-live chains retired (goal-drift detection / memory governance facade / checkpoint fake-flushing) + a `node:*` built-in SQLite storage implementation added (`createNodeSqliteStorage`) — see the [upgrade guide](docs/memora-升级指南-4.x-到-5.0.0.md) for per-item migration. **v4.0.0**: public export surface collapsed (54 exports removed; full list in the `[4.0.0]` section of [CHANGELOG](./CHANGELOG.md)) + `agent.memory.search()` removed (`searchByKeyword()` is the sole entry).
89
84
 
90
85
  ---
91
86
 
@@ -95,7 +90,7 @@ Memora is a **brain kernel that cannot run standalone** — it has interfaces bu
95
90
  |-----------|-------------|
96
91
  | **Long-term Memory** | Cross-session, cross-topic memory persistence with tool-based recall (`search_memories`; no automatic injection) |
97
92
  | **Memory Search Tool** | Keyword-only retrieval (`search_memories`), refreshes `accessedAt` on hit (semantic vector channel removed via B0, 2026-09-18) |
98
- | **Memory Governance** | Write-time supersede + last-used refresh (`accessedAt` used for ordering; no importance weighting) + semantic dedup + conflict detection via `agent.governance` facade (dedup / conflict judged by LLM) |
93
+ | **Memory Governance** | **Write-time governance only**: write-time supersede + last-used refresh (`accessedAt` used for ordering; no importance weighting). Subscription-style post-hoc governance (dedup / conflict detection / related suggestions) was retired as a whole in 5.0.0 |
99
94
  | **Agent-Persona Separation** | Agent is a pure memory engine; persona is a personality vessel. Switch personas without losing memories |
100
95
  | **Unified Memory Model** | Everything is a "Memory" primitive, distinguished by open-string `source` — no closed enums |
101
96
  | **Domain-agnostic** | Same architecture, different memory configs → different domains |
@@ -119,8 +114,7 @@ import { Agent, createProviderFromConfig } from '@zooique/memora';
119
114
  // Host responsibility: create an LLM Provider
120
115
  // Works with any OpenAI Chat Completions-compatible service
121
116
  // createProviderFromConfig is the canonical entry (baseUrl+model+apiKey → validated creation; provider
122
- // selection is the host's responsibility). createLlmProvider(loadConfig()) is only a config-file convenience
123
- // (active selection resolved inside the kernel) when you delegate the whole Config to it.
117
+ // selection is the host's responsibility).
124
118
  const provider = createProviderFromConfig('primary', {
125
119
  provider: 'openaiCompatible',
126
120
  apiKey: process.env.LLM_API_KEY!,
@@ -159,15 +153,15 @@ const reply = await agent.chatSync('What language do I like?');
159
153
  // Search memories (keyword-only; semantic vector channel removed via B0, 2026-09-18), limit is a number
160
154
  const hits = await agent.memory.searchByKeyword('TypeScript preference', 5);
161
155
 
162
- // Governance (exposed via agent.governance facade, LLM-judged)
163
- const report = await agent.governance.deduplicate();
164
- console.log(`Deduplicated ${report.deduplicatedCount} memories`);
165
-
166
- const conflicts = await agent.governance.detectConflicts();
156
+ // Source health diagnosis (pure computation, no LLM): sources are discovered dynamically
157
+ // via getAllSources(); per-source count / days since last access
158
+ const stats = agent.memory.stats();
159
+ console.log(stats.bySource);
167
160
 
168
- // Source health diagnosis (pure computation, no LLM): per-source count / days since last access (score retired → factual observation only)
169
- const health = agent.governance.sourceHealth();
170
- console.log(health?.sources);
161
+ // Write-time governance is handled by supersede: a new memory replaces the old one and
162
+ // leaves a soft `supersededBy` pointer (nothing is deleted, history stays traceable).
163
+ // Subscription-style post-hoc governance (dedup / conflict detection / related
164
+ // suggestions) was retired as a whole in 5.0.0 - see the note in API reference §4.
171
165
  ```
172
166
 
173
167
  ### Cleanup
@@ -189,8 +183,8 @@ await agent.close();
189
183
  │ ┌──────────────────────────────────────────┐ │
190
184
  │ │ Memora Kernel (Agent) │ │
191
185
  │ │ - chat(input) → streaming response │ │
192
- │ │ - Keyword-only search (semantic vector channel removed via B0)│ │
193
- │ │ - Memory governance (dedup/conflict/supersede) │ │
186
+ │ │ - Keyword-only search │ │
187
+ │ │ - Write-time governance (supersede) │ │
194
188
  │ │ - Role pack matching / Skill matching │ │
195
189
  │ │ - Tool registration / execution │ │
196
190
  │ │ - Session archive / round persistence │ │
@@ -204,10 +198,25 @@ The kernel interacts with the outside world through interfaces. Hosts inject imp
204
198
 
205
199
  | Interface | Responsibility | Built-in Implementation |
206
200
  |-----------|---------------|------------------------|
207
- | `IMemoryStorage` | Memory CRUD + search + query by source | `InMemoryStorage` |
201
+ | `IMemoryStorage` | Memory CRUD + search + query by source | Built-in in-memory default (placeholder, non-persistent; internal class, not on the public surface — PUB-API-PRUNE-2) + optional persistent impl `createNodeSqliteStorage(dbPath)` (built-in `node:sqlite`, zero third-party deps) | Host picks the backend: create SQLite via the kernel factory, or implement its own (JSON / own SQLite) |
208
202
  | `ISessionStore` | Session history persistence | None (host implements) |
209
203
  | `ILogger` | Logging output | console fallback |
210
- | `ITracer` | Observability spans | `NOOP_TRACER` |
204
+ | `ITracer` | Observability spans | Internal noop (not on the public surface; omit `tracer` for zero overhead) |
205
+
206
+ ### Multi-project and Agent boundaries (settled model)
207
+
208
+ **One Agent binds to one project** — `projectPath` + one storage + one session domain. For multiple projects, the **host** creates one Agent instance per project; the kernel neither switches projects nor maintains a cross-project registry.
209
+
210
+ | Dimension | Model |
211
+ |-----------|-------|
212
+ | One project (one Agent) | May own N sessions (`switchSession` / `switchToSession` / `forkSession`), but **only one runs at a time** |
213
+ | N projects (N Agent instances) | Run **in parallel**, each with its own memory store / sessions / project lock |
214
+ | Parallelism | **Counted by project, not by session** |
215
+ | Sessions within a project | **Share one memory store** (search has no session filter) ⇒ experience carries across sessions |
216
+
217
+ > **Trade-off (stated explicitly)**: this model deliberately does **not** mirror the mainstream "one session = one Agent instance" design. The cost: **two sessions cannot run in parallel within the same project** (mainstream tools just open two terminals). This is known and accepted, tracked as `MULTI-SESS-1` (observation only) — it is revisited only if a real need for "two parallel tasks in one repo" appears.
218
+ > **Rationale**: the memory store belongs to the **project**; a session is just a conversation thread inside it. Drawing the identity boundary at the project (not the session) is what lets experience carry across sessions.
219
+ > See the [integration guide](docs/memora-接入指南.md) ("多项目怎么办") for wiring details and data layout.
211
220
 
212
221
  ## Project Structure
213
222
 
@@ -220,8 +229,8 @@ src/
220
229
  │ ├── assembler.ts # Component assembler (pure factory)
221
230
  │ ├── contextManager.ts / contextPreparer.ts / toolExecutor.ts / toolRunner.ts ···
222
231
  │ ├── seed/ # Minimal execution loop (prepare → act/difficulty → reflect, incl. external task outer loop)
223
- │ └── managers/ # 16 specialized Managers/service classes (memoryInspector / memoryGovernance / roundSummaryGenerator / sessionManager / sessionArchiver / archiveCoordinator / workProjection / textPolishManager / chatLockManager, etc.)
224
- ├── memory/ # Memory engine (IMemoryStorage + InMemoryStorage + keyword recall / fusion ranking / governance constants)
232
+ │ └── managers/ # Specialized Managers/service classes (memoryInspector / roundSummaryGenerator / sessionManager / sessionArchiver / archiveCoordinator / workProjection / textPolishManager / chatLockManager, etc.)
233
+ ├── memory/ # Memory engine (IMemoryStorage + InMemoryStorage + optional SQLite store + keyword recall / supersede resolution)
225
234
  ├── role-pack/ # Role packs (manifest parsing + validator + strategyResolver + capability mapping)
226
235
  ├── skill/ # Skill management (global pool + role-pack binding, progressive disclosure + skillScriptRunner)
227
236
  ├── llm/ # LLM adapter layer (provider + openaiCompatible + factory)
@@ -251,15 +260,12 @@ src/
251
260
 
252
261
  | Metric | Value |
253
262
  |--------|-------|
254
- | Source | 117 production files (src/, zero third-party runtime deps) |
255
- | Tests | Dual vitest suites (kernel + host), run by the root vitest config (100+ files) |
256
- | Tests Passing | 2700+ passed / 1 skipped |
257
- | Statement Coverage | 90.65% |
258
- | Branch Coverage | 84.83% |
259
- | Function Coverage | 92.41% |
260
- | Line Coverage | 91.79% |
263
+ | Source | All production files under src/ (zero third-party runtime deps; no count listed — any count is a point-in-time snapshot) |
264
+ | Tests | Dual vitest suites (kernel + host), run by the root vitest config |
265
+ | Tests Passing | All passing (pass/skip counts as measured by pre-release CI — point-in-time snapshots, not recorded here) |
266
+ | Test Coverage | Statement / branch / function / line coverage: run `npm run test:cov` for current values (no percentages recorded here — they are point-in-time snapshots) |
261
267
  | Runtime Dependencies | **0** |
262
- | Architecture Decision Records | 26 ADRs |
268
+ | Architecture Decision Records | In-repo `.trae/decisions/` directory (see its `README.md` for the index; no count listed here — any count is a point-in-time snapshot) |
263
269
 
264
270
  ## Development
265
271
 
@@ -274,6 +280,7 @@ npm run build # Compile to dist/
274
280
  ## Documentation
275
281
 
276
282
  - [Integration Guide](docs/memora-接入指南.md) — Complete host developer onboarding manual (Chinese)
283
+ - [**Upgrading from 4.x to 5.0.0**](docs/memora-升级指南-4.x-到-5.0.0.md) — What was removed and how to migrate each item (Chinese; required for the major upgrade)
277
284
  - [API Reference](docs/memora-api-reference.md) — Public API quick reference (Chinese)
278
285
  - [Config Example](config.example.json) — LLM / Security config template
279
286
 
@@ -281,13 +288,13 @@ npm run build # Compile to dist/
281
288
 
282
289
  [memora-vscode](https://github.com/zooique/memora/tree/main/hosts/memora-vscode) — The VS Code extension host (primary host), demonstrating a complete Memora integration: JSON file persistence (`.memora/memories.json`), keyword-only search, role pack management, and memory views.
283
290
 
284
- ## Why Memora?
291
+ ## Why not cloud or framework memory?
285
292
 
286
293
  | | Memora | Cloud memory services | Framework memory modules |
287
294
  |---|---|---|---|
288
295
  | Data privacy | ✅ 100% local | ❌ Cloud-dependent | ⚠️ Varies |
289
296
  | Runtime deps | ✅ Zero | N/A (SaaS) | ❌ Heavy |
290
- | Memory lifecycle | ✅ Full (dedup/conflict/supersede) | ⚠️ Partial | ❌ CRUD only |
297
+ | Memory lifecycle | ✅ Write-time supersede | ⚠️ Partial | ❌ CRUD only |
291
298
  | Domain-agnostic | ✅ Open-string source | ⚠️ Opinionated | ⚠️ Framework-locked |
292
299
  | Embeddable | ✅ Any Node.js host | ❌ API calls only | ⚠️ Framework-bound |
293
300
  | Relation graph | ✅ Built-in sidecar | ❌ Rare | ❌ Rare |
package/README.md CHANGED
@@ -6,7 +6,7 @@
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
8
  [![Coverage](https://img.shields.io/badge/coverage-covered-brightgreen)](https://vitest.dev)
9
- [![Tests](https://img.shields.io/badge/tests-2700%2B%20passed-brightgreen)](https://vitest.dev)
9
+ [![Tests](https://img.shields.io/badge/tests-passing-brightgreen)](https://vitest.dev)
10
10
  [![Dependencies](https://img.shields.io/badge/runtime%20deps-0-yellowgreen)](package.json)
11
11
  [![License](https://img.shields.io/badge/license-MIT-yellow)](LICENSE)
12
12
 
@@ -17,7 +17,7 @@
17
17
  ## 你遇到了什么问题?
18
18
 
19
19
  - **LLM 每次对话都从零开始** — 用户记得上次聊过什么,Agent 不记得
20
- - **现有记忆方案要么太重(框架绑定)要么太浅(只有 CRUD)** — 缺少去重、冲突检测、写时取代等治理能力
20
+ - **现有记忆方案要么太重(框架绑定)要么太浅(只有 CRUD)** — 缺少写时取代(supersede)这类确定性治理:要么只有衰减式遗忘,要么让新旧记忆并存互相打架
21
21
  - **记忆和角色混在一起** — 换个角色人格,历史记忆也跟着丢了
22
22
  - **数据不想上云** — 需要一个本地、私有、不依赖外部服务的记忆层
23
23
 
@@ -25,7 +25,7 @@
25
25
 
26
26
  Memora 是一个 **Agent 记忆内核**——不绑定任何框架,不依赖任何云服务,专注于一件事:**让 Agent 拥有跨会话、跨话题的长期记忆,并且记忆是干净的。**
27
27
 
28
- "干净"意味着:语义去重、冲突检测、写时取代(supersede)、命中即刷新最近使用(`accessedAt`,参与排序)——**不对记忆做重要度加权**,也不是简单地把历史堆进上下文窗口。
28
+ "干净"意味着:写时取代(supersede,`supersededBy` 软指针,可回溯)、命中即刷新最近使用(`accessedAt`,参与排序)——**不对记忆做重要度加权**,也不是简单地把历史堆进上下文窗口。**治理只发生在写入那一刻**,不做订阅式的后备巡检(去重 / 冲突检测 / 关联推荐已于 5.0.0 整链退役,见「核心能力」表)。
29
29
 
30
30
  ```typescript
31
31
  import { Agent, createProviderFromConfig } from '@zooique/memora';
@@ -50,11 +50,6 @@ for await (const chunk of agent.chat('我喜欢 TypeScript')) {
50
50
  // 下次对话 — LLM 可自行调用 search_memories 取回这条记忆
51
51
  const reply = await agent.chatSync('我喜欢什么语言?');
52
52
 
53
- // 记忆治理 — 语义去重 / 冲突检测 / 来源健康诊断
54
- await agent.governance.deduplicate();
55
- await agent.governance.detectConflicts();
56
- const health = agent.governance.sourceHealth();
57
-
58
53
  await agent.close();
59
54
  ```
60
55
 
@@ -68,7 +63,7 @@ await agent.close();
68
63
 
69
64
  | | Memora | 向量记忆库 (agent-memory, MemStack) | 框架内置记忆 (Mastra, LangGraph) |
70
65
  |---|---|---|---|
71
- | **记忆治理** | ✅ 去重+冲突+写时取代 | ⚠️ 仅衰减或无治理 | ⚠️ 部分支持 |
66
+ | **记忆治理** | ✅ 写时取代(可回溯) | ⚠️ 仅衰减或无治理 | ⚠️ 部分支持 |
72
67
  | **框架绑定** | ✅ 零绑定,纯内核 | ✅ 独立 | ❌ 绑定特定框架 |
73
68
  | **数据隐私** | ✅ 100% 本地 | ✅ 本地 | ⚠️ 部分云端 |
74
69
  | **运行时依赖** | ✅ 零(仅 node:*) | ❌ SQLite / better-sqlite3 | ❌ 重依赖 |
@@ -77,7 +72,7 @@ await agent.close();
77
72
 
78
73
  **一句话定位**:如果你想要一个**不绑定框架、有治理能力、零依赖**的 memory + agent 内核,Memora 有清晰的差异化——它不是一个记忆 server / CLI / MCP 工具,而是一个可嵌入宿主、含完整执行闭环(loop / 工具 / 上下文 / 角色包 / 记忆即摘要)的纯逻辑内核。
79
74
 
80
- > **生态定位(2026-09-21 实证)**:npm 上 agent 类包已分两轴——**引擎轴**(loop/工具执行:`@ownware/loom`、`@hbbio/nanoagent`、`@imzx/imzx`、`thoth-agent` 等)与**记忆层轴**(`@agentmemory/agentmemory`、`mem0`、`flair`、`honcho`、`engram`、`agentic-memory` 等)。Memora 同时触及两轴,但**具体组合无人占据**:① 引擎轴同等竞品均有运行时依赖或绑定特定 runtime(loom=7 deps、imzx=11 deps、nanoagent 绑定 bun),而 Memora 是**纯 Node 零第三方运行时依赖**;② 记忆层包(engram / agentic-memory 等)只做记忆,**不提供执行内核**;③ 引擎轴包(loom 等)只做**会话内**上下文 / checkpoint,**没有跨会话被治理的长期记忆**(内存治理:去重 / 冲突检测 / supersede 写时取代 / 角色包隔离)。**护城河 = 治理型长期记忆 + 角色包隔离,以纯 Node 零依赖、宿主内嵌形态交付**。引擎轴上有 [loom](https://www.npmjs.com/package/@ownware/loom) 这样的强对手,不应与其在「引擎」轴上对拼;竞争力聚焦在「被治理的记忆 + 角色包」这一 layer。
75
+ > **生态定位(2026-09-21 实证)**:npm 上 agent 类包已分两轴——**引擎轴**(loop/工具执行:`@ownware/loom`、`@hbbio/nanoagent`、`@imzx/imzx`、`thoth-agent` 等)与**记忆层轴**(`@agentmemory/agentmemory`、`mem0`、`flair`、`honcho`、`engram`、`agentic-memory` 等)。Memora 同时触及两轴,但**具体组合无人占据**:① 引擎轴同等竞品均有运行时依赖或绑定特定 runtime(loom=7 deps、imzx=11 deps、nanoagent 绑定 bun),而 Memora 是**纯 Node 零第三方运行时依赖**;② 记忆层包(engram / agentic-memory 等)只做记忆,**不提供执行内核**;③ 引擎轴包(loom 等)只做**会话内**上下文 / checkpoint,**没有跨会话被治理的长期记忆**(治理 = supersede 写时取代 / 角色包隔离)。**护城河 = 确定性写时治理 + 角色包隔离,以纯 Node 零依赖、宿主内嵌形态交付**。引擎轴上有 [loom](https://www.npmjs.com/package/@ownware/loom) 这样的强对手,不应与其在「引擎」轴上对拼;竞争力聚焦在「被治理的记忆 + 角色包」这一 layer。
81
76
 
82
77
  > **可被复用去开发 Agent(是)**:Memora 生来就是**宿主注入型的内核库**——`Agent` 门面 + `loop` 执行闭环 + 工具注入接口(web_search / web_fetch / run_code / search_project)+ `createProviderFromConfig`(可接任意 OpenAI 兼容 LLM),任何 Node.js 宿主都能用它搭出**带记忆和角色的自有 Agent**(聊天框、桌面精灵、文档助理、运算 worker……)。这正是设计意图:它只有接口、没有形态,形态由宿主定义。唯一前提是宿主需提供持久化 / 沙箱 / UI 等外围(内核不内置 sink)。
83
78
 
@@ -91,7 +86,7 @@ await agent.close();
91
86
 
92
87
  Memora 是一个**无法独立运行**的智能大脑内核——它只有接口,没有"形态"。CLI、WebUI、桌面精灵、小说生成器都是它的"宿主",宿主负责给它身体(UI)、血管(Provider)、神经网络(事件回路)。
93
88
 
94
- > **版本定位(v3.0.0)**:**Node.js 专属 · 零第三方运行时依赖的 Agent 内核**。3.0.0 是架构收敛后的第一个稳定基线,API 与结构以 3.0.0 为准。
89
+ > **版本定位(v5.0.0)**:**Node.js 专属 · 零第三方运行时依赖的 Agent 内核**。**5.0.0(当前)**:公开面大收面(删 23 个导出符号 + 32 个公开成员 + 3 个事件)+ 多项目形态定案(一个 Agent = 一个项目)+ 三套空转机制退役(目标漂移检测 / 记忆治理门面 / 检查点假落盘)+ SQLite 存储实现(`createNodeSqliteStorage`)——破坏性变更逐条改法见 [升级指南](docs/memora-升级指南-4.x-到-5.0.0.md)。**4.0.0**:导出面收敛(移除 54 个公共导出,逐条清单见 [CHANGELOG](./CHANGELOG.md) 的 `[4.0.0]` 区)+ `agent.memory.search()` 退役(唯一入口 `searchByKeyword()`)。
95
90
 
96
91
  ---
97
92
 
@@ -101,7 +96,7 @@ Memora 是一个**无法独立运行**的智能大脑内核——它只有接口
101
96
  |------|------|
102
97
  | **长期记忆沉淀** | 跨会话、跨话题的记忆持久化 + 工具化召回(`search_memories`;**不自动注入**) |
103
98
  | **记忆检索工具** | 纯关键词检索(`search_memories`),命中刷新 `accessedAt`(语义向量通道已随 B0 收编,2026-09-18) |
104
- | **记忆治理** | supersede 写时取代 + 命中刷新(`accessedAt` 参与排序,**不做重要度加权**)+ 语义去重 + 冲突检测,经 `agent.governance` 门面暴露(去重 / 冲突由 LLM 判断) |
99
+ | **记忆治理** | 只有**写时治理**:supersede 写时取代 + 命中刷新(`accessedAt` 参与排序,**不做重要度加权**)。订阅式事后治理(去重 / 冲突检测 / 关联推荐)已于 5.0.0 整链退役 |
105
100
  | **Agent 与角色分离** | Agent 是纯记忆引擎,角色是人格载体。换角色不丢记忆 |
106
101
  | **统一记忆模型** | 一切统一为「记忆」,通过 `source` 开放字符串区分,无封闭枚举 |
107
102
  | **领域可插拔** | 同一套架构,加载不同记忆配置即可适配不同领域 |
@@ -123,8 +118,7 @@ npm install @zooique/memora
123
118
  import { Agent, createProviderFromConfig } from '@zooique/memora';
124
119
 
125
120
  // 宿主职责:创建 LLM Provider(兼容所有 OpenAI Chat Completions 协议的服务)
126
- // createProviderFromConfig 是唯一规范入口(baseUrl+model+apiKey → 校验后创建,provider 选择策略归宿主);
127
- // createLlmProvider(loadConfig()) 仅当你把整份 Config 托管给内核时用作便利(active 选择在内核侧)。
121
+ // createProviderFromConfig 是唯一规范入口(baseUrl+model+apiKey → 校验后创建,provider 选择策略归宿主)。
128
122
  const provider = createProviderFromConfig('primary', {
129
123
  provider: 'openaiCompatible',
130
124
  apiKey: process.env.LLM_API_KEY!,
@@ -163,15 +157,13 @@ const reply = await agent.chatSync('我喜欢什么语言?');
163
157
  // 搜索记忆(limit 为数字)
164
158
  const hits = await agent.memory.searchByKeyword('TypeScript 偏好', 5);
165
159
 
166
- // 记忆治理(经 agent.governance 门面委托暴露,LLM 判断)
167
- const report = await agent.governance.deduplicate();
168
- console.log(`去重 ${report.deduplicatedCount} 条`);
169
-
170
- const conflicts = await agent.governance.detectConflicts();
160
+ // 来源分布(纯计算,不调 LLM):逐 source 统计活跃记忆数
161
+ const stats = agent.memory.stats();
162
+ console.log(stats.bySource);
171
163
 
172
- // 来源健康诊断(纯计算,不调 LLM):逐 source 统计数量 / 距最近访问天数(score 退役后仅存事实观测)
173
- const health = agent.governance.sourceHealth();
174
- console.log(health?.sources);
164
+ // 写时治理由 supersede(写时取代)承担:新记忆写入时取代旧记忆,旧记忆留
165
+ // supersededBy 软指针(不删除,可回溯)。订阅式事后治理(去重 / 冲突检测 /
166
+ // 关联推荐)已于 5.0.0 整链退役,详见 API 参考手册 §四 注记。
175
167
  ```
176
168
 
177
169
  ### 关闭
@@ -194,7 +186,7 @@ await agent.close();
194
186
  │ │ Memora 内核(Agent) │ │
195
187
  │ │ - chat(input) → 流式响应 │ │
196
188
  │ │ - 纯关键词记忆检索(search_memories) │ │
197
- │ │ - 记忆治理机制(去重/冲突/写时取代) │ │
189
+ │ │ - 记忆治理机制(supersede 写时取代) │ │
198
190
  │ │ - 角色 / 技能匹配(渐进披露) │ │
199
191
  │ │ - 工具注册 / 工具执行 / 反思重试 │ │
200
192
  │ │ - 会话归档 / 轮次持久化 │ │
@@ -208,10 +200,25 @@ await agent.close();
208
200
 
209
201
  | 接口 | 职责 | 内置实现 | 宿主注意 |
210
202
  |------|------|----------|----------|
211
- | `IMemoryStorage` | 记忆 CRUD + 搜索 + 按 source 查询 | `InMemoryStorage`(**仅内存占位,不持久化**) | 生产须宿主实现持久化(如 SQLite);重启后数据依赖宿主实现 |
203
+ | `IMemoryStorage` | 记忆 CRUD + 搜索 + 按 source 查询 | 内置内存默认实现(**仅内存占位,不持久化**;内部类,不挂公共面——PUB-API-PRUNE-2 收面)+ **可选落盘实现** `createNodeSqliteStorage(dbPath)`(基于 `node:*` 内建模块,零第三方依赖) | 持久化后端由宿主选:经内核工厂建 SQLite,或自实现(JSON / 自有 SQLite);重启后数据依赖所选实现 |
212
204
  | `ISessionStore` | 会话历史 + 标题元数据持久化 | 无(宿主实现) | **不含检查点持久化**(2026-09-10 减法:跨重启恢复链整体退役)——中止/断电一律把未完成 turn 补全为完整 turn 身份、下次会话按历史加载;运行时暂停是同 turn 内续跑(内存态),无需跨进程载体 |
213
205
  | `ILogger` | 日志输出 | console fallback | 无 |
214
- | `ITracer` | 可观测性 span | `NOOP_TRACER` | 无 |
206
+ | `ITracer` | 可观测性 span | 内核内部 Noop 实现(不挂公共面;不传 `tracer` 即零开销) | 无 |
207
+
208
+ ### 多项目与 Agent 边界(形态定案)
209
+
210
+ **一个 Agent 绑定一个项目**——`projectPath` + 一套存储 + 一个会话域。多项目由**宿主**为每个项目各创建一个 Agent 实例;内核既不做跨项目切换,也不维护跨项目名单。
211
+
212
+ | 维度 | 形态 |
213
+ |------|------|
214
+ | 一个项目(一个 Agent) | 可拥有 N 个会话(`switchSession` / `switchToSession` / `forkSession`),**同一时刻只跑一个** |
215
+ | N 个项目(N 个 Agent 实例) | **并行**运行,各自独立的记忆库 / 会话 / 项目锁 |
216
+ | 并行度 | **按项目计,不按会话计** |
217
+ | 项目内多会话 | **共享同一个记忆库**(检索无会话过滤)⇒ 经验跨会话连续 |
218
+
219
+ > **取舍(明写)**:本形态**不对标主流「一个会话 = 一个 Agent 实例」**。代价是**同一项目内不能并行跑两个会话**(主流可开两个终端各推各的任务)——已知并接受,登记 `MULTI-SESS-1`(观察,不修),仅当出现「同一仓库要并行两个任务」的真实需求时才重议。
220
+ > **理由**:记忆库归**项目**所有,会话只是项目内的对话线程——把身份边界画在项目而非会话,才能让同一项目的经验跨会话连续。
221
+ > 接入细节、数据落点与历史演进见 [接入指南](docs/memora-接入指南.md)「多项目怎么办」。
215
222
 
216
223
  ## 项目结构
217
224
 
@@ -224,8 +231,8 @@ src/
224
231
  │ ├── assembler.ts # 组件组装器(纯工厂)
225
232
  │ ├── contextManager.ts / contextPreparer.ts / toolExecutor.ts / toolRunner.ts ···
226
233
  │ ├── seed/ # turn(prepare → act/difficulty → reflect,含多 turn 任务编排)
227
- │ └── managers/ # 16 个专职 Manager/服务类(memoryInspector / memoryGovernance / roundSummaryGenerator / sessionManager / sessionArchiver / archiveCoordinator / workProjection / textPolishManager / chatLockManager 等)
228
- ├── memory/ # 记忆引擎(IMemoryStorage + InMemoryStorage + 纯关键词召回 / 融合排序 / 治理常量)
234
+ │ └── managers/ # 专职 Manager/服务类(memoryInspector / roundSummaryGenerator / sessionManager / sessionArchiver / archiveCoordinator / workProjection / textPolishManager / chatLockManager 等)
235
+ ├── memory/ # 记忆引擎(IMemoryStorage + InMemoryStorage + 可选 SQLite 落盘实现 + 纯关键词召回 / 融合排序 / 治理常量)
229
236
  ├── role-pack/ # 角色包(manifest 解析 + validator + strategyResolver + 能力映射)
230
237
  ├── skill/ # 技能管理(全局池 + 角色包绑定,渐进披露 + skillScriptRunner)
231
238
  ├── llm/ # LLM 适配层(provider + openaiCompatible + factory)
@@ -255,15 +262,12 @@ src/
255
262
 
256
263
  | 指标 | 数值 |
257
264
  |------|------|
258
- | 源码 | 117 个生产文件(src/,零第三方运行时依赖) |
259
- | 测试 | 内核 + 宿主双套 vitest,根配置统一跑(100+ 文件) |
260
- | 测试通过 | 2700+ 通过 / 1 skip |
261
- | 语句覆盖 | 90.65% |
262
- | 分支覆盖 | 84.83% |
263
- | 函数覆盖 | 92.41% |
264
- | 行覆盖 | 91.79% |
265
+ | 源码 | src/ 全量生产文件(零第三方运行时依赖;此处不登记个数——计数是时点快照) |
266
+ | 测试 | 内核 + 宿主双套 vitest,根配置统一跑 |
267
+ | 测试通过 | 全量通过(条数 / skipped 数以发版前 CI 实测为准——计数是时点快照,此处不落账) |
268
+ | 测试覆盖率 | 语句 / 分支 / 函数 / 行覆盖率以 `npm run test:cov` 实测为准(此处不登记百分比——数值是时点快照) |
265
269
  | 运行时依赖 | **0** |
266
- | 架构决策记录 | 26 个 ADR |
270
+ | 架构决策记录 | 仓库 `.trae/decisions/` 目录(索引见该目录下的 `README.md`;此处不登记条数——计数是时点快照,每次新增即过期) |
267
271
 
268
272
  ## 开发命令
269
273
 
@@ -278,6 +282,7 @@ npm run build # 编译到 dist/
278
282
  ## 文档
279
283
 
280
284
  - [接入指南](docs/memora-接入指南.md) — 宿主项目开发者完整接入手册
285
+ - [**从 4.x 升级到 5.0.0**](docs/memora-升级指南-4.x-到-5.0.0.md) — 删了哪些 API、每项怎么改(major 升级必读)
281
286
  - [API 参考](docs/memora-api-reference.md) — 公共 API 速查
282
287
  - [角色包开放键指南](docs/role-pack-开放键指南.md) — manifest.json 开放键使用指南(三层消费方 + 速查)
283
288
  - [配置示例](config.example.json) — LLM / 安全配置模板
@@ -22,14 +22,7 @@
22
22
  "supportsStructuredOutput": true
23
23
  }
24
24
  },
25
- "active": "mimimo",
26
- "background": {
27
- "provider": "doubao",
28
- "model": "doubao-pro",
29
- "apiKey": "${MEMORA_BACKGROUND_API_KEY}",
30
- "baseUrl": "https://ark.cn-beijing.volces.com/api/v3",
31
- "temperature": 0.5
32
- }
25
+ "active": "mimimo"
33
26
  },
34
27
  "memory": {
35
28
  "dataDir": "~/.memora",