@zooique/memora 4.0.0 → 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 (239) hide show
  1. package/CHANGELOG.md +165 -1743
  2. package/README.en.md +43 -36
  3. package/README.md +308 -303
  4. package/dist/agent/agent.d.ts +46 -82
  5. package/dist/agent/agent.d.ts.map +1 -1
  6. package/dist/agent/agent.js +153 -220
  7. package/dist/agent/agent.js.map +1 -1
  8. package/dist/agent/assembler.d.ts +3 -16
  9. package/dist/agent/assembler.d.ts.map +1 -1
  10. package/dist/agent/assembler.js +46 -35
  11. package/dist/agent/assembler.js.map +1 -1
  12. package/dist/agent/backgroundTasks.d.ts +8 -1
  13. package/dist/agent/backgroundTasks.d.ts.map +1 -1
  14. package/dist/agent/backgroundTasks.js +8 -1
  15. package/dist/agent/backgroundTasks.js.map +1 -1
  16. package/dist/agent/budget.d.ts +23 -5
  17. package/dist/agent/budget.d.ts.map +1 -1
  18. package/dist/agent/budget.js +8 -2
  19. package/dist/agent/budget.js.map +1 -1
  20. package/dist/agent/builtinToolHandlers.d.ts +27 -8
  21. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  22. package/dist/agent/builtinToolHandlers.js +45 -9
  23. package/dist/agent/builtinToolHandlers.js.map +1 -1
  24. package/dist/agent/builtinTools.d.ts.map +1 -1
  25. package/dist/agent/builtinTools.js +4 -3
  26. package/dist/agent/builtinTools.js.map +1 -1
  27. package/dist/agent/constants.d.ts +0 -6
  28. package/dist/agent/constants.d.ts.map +1 -1
  29. package/dist/agent/constants.js +7 -8
  30. package/dist/agent/constants.js.map +1 -1
  31. package/dist/agent/contextManager.d.ts +8 -0
  32. package/dist/agent/contextManager.d.ts.map +1 -1
  33. package/dist/agent/contextManager.js +45 -3
  34. package/dist/agent/contextManager.js.map +1 -1
  35. package/dist/agent/contextPreparer.d.ts +1 -1
  36. package/dist/agent/contextPreparer.d.ts.map +1 -1
  37. package/dist/agent/contextPreparer.js +15 -10
  38. package/dist/agent/contextPreparer.js.map +1 -1
  39. package/dist/agent/guardRail.d.ts +1 -1
  40. package/dist/agent/guardRail.d.ts.map +1 -1
  41. package/dist/agent/guardRail.js +1 -1
  42. package/dist/agent/guardRail.js.map +1 -1
  43. package/dist/agent/loop.d.ts +46 -13
  44. package/dist/agent/loop.d.ts.map +1 -1
  45. package/dist/agent/loop.js +128 -25
  46. package/dist/agent/loop.js.map +1 -1
  47. package/dist/agent/managers/archiveCoordinator.d.ts +15 -3
  48. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  49. package/dist/agent/managers/archiveCoordinator.js +13 -7
  50. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  51. package/dist/agent/managers/chatLockManager.d.ts +3 -9
  52. package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
  53. package/dist/agent/managers/chatLockManager.js +7 -25
  54. package/dist/agent/managers/chatLockManager.js.map +1 -1
  55. package/dist/agent/managers/llmCaller.d.ts.map +1 -1
  56. package/dist/agent/managers/llmCaller.js +27 -1
  57. package/dist/agent/managers/llmCaller.js.map +1 -1
  58. package/dist/agent/managers/memoryInspector.d.ts +12 -7
  59. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  60. package/dist/agent/managers/memoryInspector.js +32 -19
  61. package/dist/agent/managers/memoryInspector.js.map +1 -1
  62. package/dist/agent/managers/roundSummaryGenerator.d.ts +3 -1
  63. package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -1
  64. package/dist/agent/managers/roundSummaryGenerator.js +14 -4
  65. package/dist/agent/managers/roundSummaryGenerator.js.map +1 -1
  66. package/dist/agent/managers/sessionArchiver.d.ts +20 -6
  67. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  68. package/dist/agent/managers/sessionArchiver.js +19 -5
  69. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  70. package/dist/agent/managers/sessionManager.d.ts +21 -88
  71. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  72. package/dist/agent/managers/sessionManager.js +77 -278
  73. package/dist/agent/managers/sessionManager.js.map +1 -1
  74. package/dist/agent/seed/orchestrator.d.ts.map +1 -1
  75. package/dist/agent/seed/orchestrator.js +3 -3
  76. package/dist/agent/seed/orchestrator.js.map +1 -1
  77. package/dist/agent/seed/prepare.d.ts.map +1 -1
  78. package/dist/agent/seed/prepare.js +9 -4
  79. package/dist/agent/seed/prepare.js.map +1 -1
  80. package/dist/agent/seed/types.d.ts +11 -4
  81. package/dist/agent/seed/types.d.ts.map +1 -1
  82. package/dist/agent/seed/types.js +2 -2
  83. package/dist/agent/toolExecutor.d.ts +51 -6
  84. package/dist/agent/toolExecutor.d.ts.map +1 -1
  85. package/dist/agent/toolExecutor.js +74 -9
  86. package/dist/agent/toolExecutor.js.map +1 -1
  87. package/dist/agent/toolResultCache.js +1 -1
  88. package/dist/agent/toolRunner.d.ts +4 -2
  89. package/dist/agent/toolRunner.d.ts.map +1 -1
  90. package/dist/agent/toolRunner.js +7 -4
  91. package/dist/agent/toolRunner.js.map +1 -1
  92. package/dist/agent/types.d.ts +8 -25
  93. package/dist/agent/types.d.ts.map +1 -1
  94. package/dist/index.d.ts +9 -20
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +35 -32
  97. package/dist/index.js.map +1 -1
  98. package/dist/logging/logger.d.ts +4 -1
  99. package/dist/logging/logger.d.ts.map +1 -1
  100. package/dist/logging/logger.js +5 -2
  101. package/dist/logging/logger.js.map +1 -1
  102. package/dist/memory/gcService.d.ts.map +1 -1
  103. package/dist/memory/gcService.js +3 -5
  104. package/dist/memory/gcService.js.map +1 -1
  105. package/dist/memory/inMemorySessionStore.d.ts +2 -2
  106. package/dist/memory/inMemorySessionStore.js +2 -2
  107. package/dist/memory/inMemoryStorage.d.ts +4 -3
  108. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  109. package/dist/memory/inMemoryStorage.js +2 -2
  110. package/dist/memory/inMemoryStorage.js.map +1 -1
  111. package/dist/memory/nodeSqliteStorage.d.ts +17 -0
  112. package/dist/memory/nodeSqliteStorage.d.ts.map +1 -0
  113. package/dist/memory/nodeSqliteStorage.js +393 -0
  114. package/dist/memory/nodeSqliteStorage.js.map +1 -0
  115. package/dist/memory/projectManager.d.ts +10 -20
  116. package/dist/memory/projectManager.d.ts.map +1 -1
  117. package/dist/memory/projectManager.js +27 -41
  118. package/dist/memory/projectManager.js.map +1 -1
  119. package/dist/memory/roundStore.d.ts +76 -1
  120. package/dist/memory/roundStore.d.ts.map +1 -1
  121. package/dist/memory/roundStore.js.map +1 -1
  122. package/dist/memory/roundSummaryLookup.d.ts +26 -0
  123. package/dist/memory/roundSummaryLookup.d.ts.map +1 -0
  124. package/dist/memory/roundSummaryLookup.js +19 -0
  125. package/dist/memory/roundSummaryLookup.js.map +1 -0
  126. package/dist/memory/sessionStore.d.ts +19 -2
  127. package/dist/memory/sessionStore.d.ts.map +1 -1
  128. package/dist/memory/sessionStore.js.map +1 -1
  129. package/dist/memory/sourceValidation.d.ts +2 -13
  130. package/dist/memory/sourceValidation.d.ts.map +1 -1
  131. package/dist/memory/sourceValidation.js +5 -16
  132. package/dist/memory/sourceValidation.js.map +1 -1
  133. package/dist/memory/storageInterface.d.ts +26 -16
  134. package/dist/memory/storageInterface.d.ts.map +1 -1
  135. package/dist/memory/supersedeResolve.d.ts +39 -0
  136. package/dist/memory/supersedeResolve.d.ts.map +1 -0
  137. package/dist/memory/supersedeResolve.js +16 -0
  138. package/dist/memory/supersedeResolve.js.map +1 -0
  139. package/dist/memory/types.d.ts +3 -2
  140. package/dist/memory/types.d.ts.map +1 -1
  141. package/dist/memory/types.js +2 -1
  142. package/dist/memory/types.js.map +1 -1
  143. package/dist/role-pack/rolePackManager.d.ts +33 -24
  144. package/dist/role-pack/rolePackManager.d.ts.map +1 -1
  145. package/dist/role-pack/rolePackManager.js +48 -42
  146. package/dist/role-pack/rolePackManager.js.map +1 -1
  147. package/dist/role-pack/strategyKeys.d.ts +8 -0
  148. package/dist/role-pack/strategyKeys.d.ts.map +1 -1
  149. package/dist/role-pack/strategyKeys.js +10 -0
  150. package/dist/role-pack/strategyKeys.js.map +1 -1
  151. package/dist/role-pack/strategyResolver.d.ts +6 -1
  152. package/dist/role-pack/strategyResolver.d.ts.map +1 -1
  153. package/dist/role-pack/strategyResolver.js +20 -2
  154. package/dist/role-pack/strategyResolver.js.map +1 -1
  155. package/dist/role-pack/types.d.ts +5 -1
  156. package/dist/role-pack/types.d.ts.map +1 -1
  157. package/dist/security/pathGuard.d.ts +1 -1
  158. package/dist/security/pathGuard.d.ts.map +1 -1
  159. package/dist/security/pathGuard.js +1 -1
  160. package/dist/security/pathGuard.js.map +1 -1
  161. package/dist/utils/backgroundTask.d.ts +56 -34
  162. package/dist/utils/backgroundTask.d.ts.map +1 -1
  163. package/dist/utils/backgroundTask.js +130 -99
  164. package/dist/utils/backgroundTask.js.map +1 -1
  165. package/dist/utils/errors.d.ts +3 -2
  166. package/dist/utils/errors.d.ts.map +1 -1
  167. package/dist/utils/errors.js +3 -2
  168. package/dist/utils/errors.js.map +1 -1
  169. package/dist/utils/eventEmitter.d.ts +20 -22
  170. package/dist/utils/eventEmitter.d.ts.map +1 -1
  171. package/dist/utils/eventEmitter.js +0 -3
  172. package/dist/utils/eventEmitter.js.map +1 -1
  173. package/dist/utils/time.d.ts +3 -3
  174. package/dist/utils/time.d.ts.map +1 -1
  175. package/dist/utils/time.js +3 -3
  176. package/dist/utils/time.js.map +1 -1
  177. package/dist/utils/toError.d.ts +1 -1
  178. package/dist/utils/toError.js +1 -1
  179. package/dist/web-fetch/loginWall.d.ts +39 -0
  180. package/dist/web-fetch/loginWall.d.ts.map +1 -0
  181. package/dist/web-fetch/loginWall.js +78 -0
  182. package/dist/web-fetch/loginWall.js.map +1 -0
  183. package/dist/web-fetch/types.d.ts +8 -0
  184. package/dist/web-fetch/types.d.ts.map +1 -1
  185. package/dist/web-fetch/webFetchProvider.d.ts.map +1 -1
  186. package/dist/web-fetch/webFetchProvider.js +3 -1
  187. package/dist/web-fetch/webFetchProvider.js.map +1 -1
  188. package/dist/web-search/fetchWebSearchProvider.js +28 -23
  189. package/dist/web-search/fetchWebSearchProvider.js.map +1 -1
  190. package/docs/architecture/role-pack-authoring-guide.md +3 -1
  191. package/docs/architecture/role-pack-spec.md +2 -1
  192. package/docs/memora-api-reference.md +1349 -1276
  193. 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
  194. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +87 -49
  195. package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -148
  196. package/package.json +9 -4
  197. package/role-packs/README.md +41 -40
  198. package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -4
  199. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +1 -0
  200. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -46
  201. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +16 -16
  202. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -46
  203. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -29
  204. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +73 -48
  205. 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 +445 -441
  206. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +62 -62
  207. 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
  208. package/dist/agent/managers/dedupManager.d.ts +0 -85
  209. package/dist/agent/managers/dedupManager.d.ts.map +0 -1
  210. package/dist/agent/managers/dedupManager.js +0 -248
  211. package/dist/agent/managers/dedupManager.js.map +0 -1
  212. package/dist/agent/managers/goalConsistencyChecker.d.ts +0 -42
  213. package/dist/agent/managers/goalConsistencyChecker.d.ts.map +0 -1
  214. package/dist/agent/managers/goalConsistencyChecker.js +0 -178
  215. package/dist/agent/managers/goalConsistencyChecker.js.map +0 -1
  216. package/dist/agent/managers/llmJudgeHelper.d.ts +0 -21
  217. package/dist/agent/managers/llmJudgeHelper.d.ts.map +0 -1
  218. package/dist/agent/managers/llmJudgeHelper.js +0 -32
  219. package/dist/agent/managers/llmJudgeHelper.js.map +0 -1
  220. package/dist/agent/managers/memoryAdvisor.d.ts +0 -105
  221. package/dist/agent/managers/memoryAdvisor.d.ts.map +0 -1
  222. package/dist/agent/managers/memoryAdvisor.js +0 -322
  223. package/dist/agent/managers/memoryAdvisor.js.map +0 -1
  224. package/dist/agent/managers/memoryGovernance.d.ts +0 -24
  225. package/dist/agent/managers/memoryGovernance.d.ts.map +0 -1
  226. package/dist/agent/managers/memoryGovernance.js +0 -46
  227. package/dist/agent/managers/memoryGovernance.js.map +0 -1
  228. package/dist/memory/governance.d.ts +0 -17
  229. package/dist/memory/governance.d.ts.map +0 -1
  230. package/dist/memory/governance.js +0 -17
  231. package/dist/memory/governance.js.map +0 -1
  232. package/dist/memory/projectRegistry.d.ts +0 -47
  233. package/dist/memory/projectRegistry.d.ts.map +0 -1
  234. package/dist/memory/projectRegistry.js +0 -151
  235. package/dist/memory/projectRegistry.js.map +0 -1
  236. package/dist/utils/recallDefaults.d.ts +0 -16
  237. package/dist/utils/recallDefaults.d.ts.map +0 -1
  238. package/dist/utils/recallDefaults.js +0 -16
  239. package/dist/utils/recallDefaults.js.map +0 -1
package/README.en.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
  ## 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. **v4.0.0 (first major)**: 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).
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,13 +260,10 @@ 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
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
 
@@ -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
 
@@ -287,7 +294,7 @@ npm run build # Compile to dist/
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 |