@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
@@ -0,0 +1,385 @@
1
+ # 从 4.x 升级到 5.0.0
2
+
3
+ > 适用对象:直接 import `@zooique/memora` 的宿主 / 接入方。
4
+ > 本文只讲**你怎么改代码**,不讲内部决策过程;删除理由见 `CHANGELOG.md` 的 `[5.0.0]` 区,逐批拍板过程见 `tasks/待完成任务.md` 对应 ID 条目。
5
+ > 数据口径:4.0.0(npm 已发布)与 5.0.0(本仓库)的 `dist/index.d.ts` 导出面 —— 从 barrel
6
+ > 逐层解析到真实声明文件后**按 TypeScript AST 比对**(非正则、非记忆)。复现脚本见文末。
7
+
8
+ ---
9
+
10
+ ## 一句话
11
+
12
+ 5.0.0 是 major,删了 **23 个导出符号 + 32 个公开成员 + 3 个事件**。
13
+ 被删的东西分两类:
14
+
15
+ 1. **从未通电**(写了但没人调用、或调用后无效果);
16
+ 2. **结构性恒空**(代码路径上永远拿不到输入,配置什么都无效)。
17
+
18
+ **没有一条是「还在正常工作、且有真实消费方,却被砍掉」**——最接近的是记忆治理门面
19
+ (`agent.governance`):`sourceHealth()` 确实有效但零消费,另外三个方法恒空转,
20
+ 详见 §3.3。
21
+
22
+ ---
23
+
24
+ ## 30 秒自查
25
+
26
+ 回答三个问题,决定你要读哪几节:
27
+
28
+ | 你做过这些吗 | 去哪看 |
29
+ |---|---|
30
+ | `import { MemoryGovernance / ProjectRegistry / InMemoryStorage / safe* / truncate / toError ... }` | §2 符号级删除 |
31
+ | 调过 `agent.governance` / `agent.projects` / `agent.switchProject` / `agent.recover` / `agent.injectSystemMessage` / `agent.canContinueWithoutInput()` | §3 成员级删除 |
32
+ | 订阅过 `dedupCompleted` / `projectSwitched` / `goalDriftDetected` | §4 事件删除 |
33
+ | **都没有** → 直接升级,跑一次 `tsc --noEmit` 即可 | §6 核对清单 |
34
+
35
+ ---
36
+
37
+ ## §1 版本事实
38
+
39
+ | 项 | 4.0.0 | 5.0.0 | 差额 |
40
+ |---|---|---|---|
41
+ | 导出符号(含类型) | 156 | 136 | −23 删 / +3 新增 |
42
+ | `Agent` 公开成员 | 70 | 58 | −12 删 / 0 新增 |
43
+ | `SessionManager` 公开成员 | 50 | 36 | −14 删 / 0 新增 |
44
+ | `RolePackManager` 公开成员 | 32 | 31 | −1 删 |
45
+ | `AgentOptions` 字段 | 33 | 31 | −2 删 |
46
+ | `AgentEventMap` 事件键 | 28 | 25 | −3 删 |
47
+ | `SessionCheckpoint` 字段 | 12 | 9 | −3 删 |
48
+ | `FetchedPage` 字段 | 4 | 5 | +1 新增 |
49
+
50
+ **算术可自证**:`32 = 12(§3.1)+ 14(§3.2)+ 6(§3.4:RolePackManager 1 + AgentOptions 2 + SessionCheckpoint 3)`。
51
+
52
+ 口径:只数**消费者看得见**的成员(`private` / `protected` 在 d.ts 里留存但不计入)。
53
+
54
+ SemVer 定为 major 的依据:**编译期破坏**(删导出 + 删成员 + 改签名),不是行为悄悄变了。
55
+
56
+ ---
57
+
58
+ ## §2 符号级删除(23 个)
59
+
60
+ ### 2.1 有一对一替代(改 import 即可)
61
+
62
+ | 4.x 写法 | 5.0.0 改成 |
63
+ |---|---|
64
+ | `import { createLlmProvider } from '@zooique/memora'` | `import { createProviderFromConfig } from '@zooique/memora'`(本来就是规范入口,前者是重复包装) |
65
+ | `import { InMemoryStorage }` | 自己实现 `IMemoryStorage`(接口未变,15 方法);或 `createNodeSqliteStorage()`(§5) |
66
+ | `import { InMemorySessionStore }` | 自己实现 `ISessionStore`(接口未变,12 方法;`setSessionTitle` 可选) |
67
+ | `import { NOOP_TRACER }` | 不传 tracer 即可(`AgentOptions.tracer` 是可选注入,内核内部有缺省实现) |
68
+
69
+ > `InMemoryStorage` / `InMemorySessionStore` 的**类本体仍在内核内部使用**,只是不再挂公共面。
70
+ > 如果你之前 `new` 它们当作「默认实现」,现在请显式实现接口——这是有意的边界收紧。
71
+ >
72
+ > ⚠️ **只读容器场景别自己复刻检索语义**:若你原来用 `InMemoryStorage` 只是「装载一份数据 + 借用
73
+ > 内核的分词/排序/软删过滤」(典型 = 只读宿主),**不要**自己写第二套 `Map + 分词 + 排序`——
74
+ > 那会和内核并列、漂移后同一份数据搜出两种结果。直接用
75
+ > `createNodeSqliteStorage(dbPath, { readOnly: true })` 拿 `ReadOnlyMemoryStorage`
76
+ > (仅 9 个读方法,写方法在类型上就不存在),见 §5。
77
+ >
78
+ > 注意:只读模式**不建库**——库文件不存在时抛 `MemoraError{ errorCode: FILE_NOT_FOUND }`(5.0.0 起)。
79
+ > 请据此提示用户「先用写宿主打开一次工作区」,**不要**自己 `existsSync` 后再猜(判据散点)。
80
+
81
+ ### 2.2 内核内部工具,不再对外(能力不需要)
82
+
83
+ 这 11 个是内核自己用的通用小工具,**函数本体仍在**(内核内部照常调用),只是不导出:
84
+
85
+ `truncate` / `isPlainObject` / `safeSetTimeout` / `safeSetInterval` / `clearSafeTimeout` /
86
+ `clearSafeInterval` / `segmentText` / `escapeLike` / `escapeLikeSnippet` / `serializeFrontmatter` / `toError`
87
+
88
+ 改法:自己写。都是 3–10 行的东西:
89
+
90
+ ```ts
91
+ // toError
92
+ const toError = (e: unknown): Error => (e instanceof Error ? e : new Error(String(e)));
93
+
94
+ // truncate
95
+ const truncate = (s: string, max: number) =>
96
+ s.length <= max ? s : `${s.slice(0, max - 1)}…`;
97
+
98
+ // isPlainObject
99
+ const isPlainObject = (v: unknown): v is Record<string, unknown> =>
100
+ typeof v === 'object' && v !== null && Object.getPrototypeOf(v) === Object.prototype;
101
+ ```
102
+
103
+ `safeSetTimeout` 一族在 Node 下**不需要包装**:宿主进程生命周期由宿主自己管,
104
+ 内核不再替宿主兜「定时器阻止进程退出」。
105
+
106
+ > ⚠️ `escapeLike` 的**知识**不能丢:如果你自己实现 `IMemoryStorage` 的 SQLite 后端,
107
+ > 仍须转义 `%` / `_` 并写 `LIKE ? ESCAPE '\'`。规则写进了 `IMemoryStorage` 的接口注释。
108
+
109
+ ### 2.3 无替代(能力不再对外)
110
+
111
+ | 符号 | 为什么没替代 |
112
+ |---|---|
113
+ | `MemoryGovernance`(类) | 见 §3.3,整链退役 |
114
+ | `ProjectRegistry` | 跨项目注册表概念废止:一个 Agent = 一个项目,多项目由宿主各建实例 |
115
+ | `ProjectEntry`(类型) | 同上;`agent.projects.list` 的返回类型随之消失 |
116
+ | `LockManager` | 项目级 `.memora/.lock` 文件锁。**类本体仍在内核内部**(`projectManager` 写记忆库时加锁),只是不再导出——宿主本就不该直接操作锁文件,这是边界收紧而非能力丢失 |
117
+ | `safeFetch` / `safeExecuteCode` / `safeSearchProjectFiles` / `safeSearchProjectText` | 内核内部超时包装,宿主注入 provider 时由内核自己用 |
118
+
119
+ **`ProjectRegistry` 的迁移姿势**:
120
+
121
+ ```ts
122
+ // 4.x:宿主自己 new 一个注册表读写 projects.json
123
+ const reg = new ProjectRegistry(dir);
124
+
125
+ // 5.0.0:不管项目名单。每个项目一个 Agent,「切项目」= 换实例
126
+ const agents = new Map<string, Agent>();
127
+ function agentFor(projectPath: string) {
128
+ if (!agents.has(projectPath)) {
129
+ agents.set(projectPath, new Agent({ ...opts, dataDir: join(projectPath, '.memora') }));
130
+ }
131
+ return agents.get(projectPath)!;
132
+ }
133
+ ```
134
+
135
+ ---
136
+
137
+ ## §3 成员级删除(32 个)
138
+
139
+ ### 3.1 `Agent`(12 个)
140
+
141
+ | 4.x | 5.0.0 改成 |
142
+ |---|---|
143
+ | `agent.canContinueWithoutInput()` | **无替代,也不需要**。软暂停模型下暂停恒安全(无在途目标时暂停即收场)、空输入续跑由 waiting 原因位表达——「可否无输入续跑」不再需要向宿主暴露查询口(5.0.0 内翻案删除,见 CHANGELOG `PUB-API-PRUNE-5`) |
144
+ | `agent.appendPlanItem(desc, pack?)` | `agent.sessionManager.appendPlanItem(desc, pack?)` |
145
+ | `agent.triggerError(cause)` | `agent.sessionManager.triggerError(cause)` |
146
+ | `agent.recover()` | `agent.sessionManager.recover()` |
147
+ | `agent.injectSystemMessage(msg)` | **无公开替代**。它原本直通 `loop.injectSystemMessage`,属内核内部机制外漏;需要引导模型请在 `chat()` 输入或角色包 rules 里写 |
148
+ | `agent.getRecentToolExecutions()` | **无替代**。订阅 `tool_start` / `tool_result` 事件自己聚合——事件流才是可观测面 |
149
+ | `agent.getBackgroundTaskStats()` | **无公开替代**。⚠️ 别拿 `listBackgroundTasks()` 顶——那个是后台**命令**(shell 进程),这里是内核后台**副作用池**(摘要生成 / 记忆命中刷新 / 会话命名)。它的 `completed`/`failed` 只写不读、`pending` 仅服务 `close()` 的收尾等待(上限 5s),在途数不再对外暴露 |
150
+ | `agent.forceReleaseChatLock()` | **无替代**。锁释放只走 `release(token)` 与 `close()`;「无进展超时兜底」从未接线 |
151
+ | `agent.governance` | **无替代**,见 §3.3 |
152
+ | `agent.projects` | **无替代**。多项目 = 宿主多实例,见 §2.3 |
153
+ | `agent.switchProject(path/name)` | **无替代**。换项目请新建 Agent 实例 |
154
+ | `agent.rebuildComponents()` | **无替代**。内部装配细节,本就不该是公开面 |
155
+
156
+ ### 3.2 `SessionManager`(14 个)
157
+
158
+ | 4.x | 5.0.0 改成 |
159
+ |---|---|
160
+ | `isRunning()` | `status === 'running'` |
161
+ | `isPaused()` | `status === 'paused'` |
162
+ | `heartbeat()` | **直接删调用**。它只是私有 `touchCheckpoint` 的外漏,无观察者 |
163
+ | `loadSessionMessages(date, session)` | 由你的 `ISessionStore.loadMessages(date, session)` 直接读(**接口是同步返回**,不再有 Promise);要「切换并加载」用 `switchToSession()` |
164
+ | `restoreSession(date, session)` | `switchToSession(sessionId)` —— ⚠️ **签名不同**:前者两个参数,后者一个 `'YYYY-MM-DD-session'` 复合 ID。改法:`switchToSession(`${date}-${session}`)` |
165
+ | `restoreMostRecentSession()` | `switchToSession(meta.sessionId)`,最近会话从你自己的 store 取:`store.listSessionMetas()[0]`(降序契约,`[0]` 即最近活跃) |
166
+ | `updateGoal(goal)` | **无替代**。目标漂移检测整链退役,目标对齐交还「用户在环 + `ask_user`」 |
167
+ | `isPauseLimitReached()` / `getConsecutivePauseCount()` / `resetConsecutivePauseCount()` | **无替代**。连续暂停计数链从未通电(生产恒传 `lowRisk=true`,数组恒空) |
168
+ | `compensateTool(id)` / `compensateAllNonIdempotent()` | **无替代**。二者只生成文案 + warn,零状态变更 |
169
+ | `flushNow()` / `flushOnShutdown()` | **直接删调用**。二者是 no-op 清脏(检查点本就不落盘),保留只为语义边界 |
170
+
171
+ > `status` 的取值是 `'running' | 'paused' | 'error'`。**`error` 没有对应布尔**——
172
+ > 这正是删 `isRunning/isPaused` 的原因:三态被两个布尔吞掉一个,判不完整。
173
+
174
+ ### 3.3 唯一的能力退回:记忆治理门面
175
+
176
+ | 4.x | 5.0.0 |
177
+ |---|---|
178
+ | `agent.governance.deduplicate()` | 无(LLM 语义去重) |
179
+ | `agent.governance.detectConflicts()` | 无(冲突检测)——**冲突消解仍在**:写路径的 `supersede` + `supersededBy` 软指针 |
180
+ | `agent.governance.suggest(query)` | 无(关联推荐) |
181
+ | `agent.governance.sourceHealth()` | `agent.memory?.stats().bySource` —— ⚠️ **降级不是等价**:只剩 per-source 计数,原报告的 `daysSinceLastAccess` / `diagnosedAt` 没有替代(宿主从未消费这两个字段) |
182
+
183
+ **为什么删**:`deduplicate()` / `detectConflicts()` / `suggest()` 逐 `GOVERNANCE_SOURCES` 取样,
184
+ 而该常量在「设定记忆归角色包」后就是**字面量空数组、非注入项**——代码路径上永远拿不到输入。
185
+ 不是「暂时没人用」,是**没有可接线的地方**。留着只会让读者以为有这能力。
186
+
187
+ `sourceHealth()` 不受这条约束(它走 `getAllSources()`,本来有效),删它另有一条理由:
188
+ 零消费,且计数口径已由 `memory.stats()` 承担——留两个「健康度」入口必然算法漂移。
189
+
190
+ **能力对比**:
191
+
192
+ | | 4.x 实际行为 | 5.0.0 |
193
+ |---|---|---|
194
+ | 写时取代 | ✅ 生效 | ✅ 生效(未动) |
195
+ | 语义去重 | ❌ 恒空转 | 无入口(也不会再被误以为有) |
196
+ | 冲突检测 | ❌ 恒返回空报告(`skippedReason` 有值、`conflictCount: 0`) | 无入口 |
197
+ | 关联推荐 | ❌ 恒返回 `[]` | 无入口 |
198
+ | 源健康度 | ✅ 生效(但宿主零消费) | `memory.stats().bySource`(仅计数) |
199
+
200
+ ### 3.4 其它(6 个)
201
+
202
+ | 位置 | 删除项 | 改法 |
203
+ |---|---|---|
204
+ | `RolePackManager` | `tryBuildMeetingPlan(...)` | 用 `getActiveTeam()`(当前组)或 `getTeam(group)`(指定组)拿队伍快照,自己组 `{ description, rolePack? }[]`;内核内部的 `buildMeetingPlanSkeleton` 不对外 |
205
+ | `AgentOptions` | `fileConsistencyCheck` | 直接删该字段。它是**从未被读取**的僵尸字段(透传链路早已先删) |
206
+ | `AgentOptions` | `registryDir` | 直接删该字段。跨项目注册表废止,无消费方 |
207
+ | `SessionCheckpoint` | `mainGoal` / `currentGoal` / `goalChangeSeq` | 直接删。随目标漂移链退役 |
208
+
209
+ ---
210
+
211
+ ## §4 事件删除(3 个)
212
+
213
+ ```ts
214
+ // 4.x —— 这三个订阅在 5.0.0 全部失效,TypeScript 会直接报「事件键不存在」
215
+ agent.on('dedupCompleted', () => {}); // 随治理门面退役
216
+ agent.on('projectSwitched', () => {}); // 随跨项目切换退役
217
+ agent.on('goalDriftDetected', () => {});// 随目标漂移链退役
218
+ ```
219
+
220
+ 改法:**整段订阅与配套 UI 一起删**。这三个在 4.x 里也没有真实触发路径
221
+ (`projectSwitched` 只在被删的 `switchProject` 里 emit;`dedupCompleted` 的载荷恒为零值
222
+ ——`deduplicatedCount: 0` / `demotedIds: []`,因为去重链本来就扫不到候选;
223
+ `goalDriftDetected` 的检测器判据实测零区分度)。
224
+
225
+ ---
226
+
227
+ ## §5 新增能力(非破坏)
228
+
229
+ **新增导出符号(3 个)**:
230
+
231
+ | 符号 | 用途 |
232
+ |---|---|
233
+ | `createNodeSqliteStorage(dbPath)` | 可选 SQLite 存储实现(延迟加载 `node:sqlite`,**不用即不加载**)。装配:`new Agent({ storage: createNodeSqliteStorage('.../memories.db') })` |
234
+ | `createNodeSqliteStorage(dbPath, { readOnly: true })` | 同一符号的只读形态:返回 `ReadOnlyMemoryStorage`,写方法在类型上就不存在;**文件不存在直接抛错**,不做建库/迁移 |
235
+ | `ReadOnlyMemoryStorage`(类型) | `Pick<IMemoryStorage, 9 个只读方法>`,供 MCP 类只读宿主复用 |
236
+ | `hasActiveSuperseder()` | 悬空取代判据的唯一入口:`supersededBy` 指向的记忆若已被删/软删,旧摘要应回退为当前版本 |
237
+
238
+ > `createNodeSqliteStorage` 是**一个**符号的两种形态,上表 4 行 = 3 个符号。
239
+
240
+ **新增字段(1 处)**:`FetchedPage.fetchFailed?: true` —— 据此区分「抓取失败降级」与「成功但内容为空」。
241
+
242
+ > `Agent` 本身**没有任何新增公开成员**(70 → 58 全是删,见 §1 差额列)。
243
+
244
+ ---
245
+
246
+ ## §6 升级后核对清单
247
+
248
+ ```bash
249
+ # 1. 编译期:这一步能抓出 90% 的破坏
250
+ npx tsc --noEmit
251
+
252
+ # 2. 运行时:确认事件订阅没有静默失效(TypeScript 已挡,但 JS 项目要自己查)
253
+ grep -rn "dedupCompleted\|projectSwitched\|goalDriftDetected" src/
254
+
255
+ # 3. 行为:跑你自己的集成测试,重点看「会话切换 / 记忆检索 / 归档」三条链
256
+ npm test
257
+ ```
258
+
259
+ **JS(无类型检查)项目额外做一步**:全局搜 `agent.governance`、`agent.projects`、
260
+ `agent.switchProject`、`\.recover\(`、`\.isPaused\(`、`\.isRunning\(`——这些在 JS 里会静默变成
261
+ `undefined is not a function`。
262
+
263
+ ---
264
+
265
+ ## §7 已知的「不迁移」代价(诚实登记)
266
+
267
+ - **失去 deprecation 预警期**:这些符号在 4.0.0 里没有标 `@deprecated`,5.0.0 直接删。
268
+ 原因是 4.0.0 到 5.0.0 之间没有中间版本可承载预警(npm 上 4.0.0 是唯一 4.x 发布版)。
269
+ - **`agent.governance` 时代写过的代码需要重写语义**,不是改个名字:它的返回结构(`deduplicatedCount`
270
+ / `skippedReason` / `suggestions[]`)没有对等物。
271
+ - **`ProjectRegistry` 使用者要自己接管项目名单**:内核不再提供跨项目视图(多进程并发写无锁的
272
+ 风险也一并交回宿主)。
273
+
274
+ ---
275
+
276
+ ## 附:本文的数据来源
277
+
278
+ ```bash
279
+ # 4.0.0 真实产物(npm)
280
+ npm pack @zooique/memora@4.0.0 && tar -xzf zooique-memora-4.0.0.tgz
281
+ # 5.0.0 本地产物
282
+ npm run build
283
+ ```
284
+
285
+ 比对脚本(放在仓库根,`node .tmp-surface-diff.mjs <旧 dist 目录> <新 dist 目录>`):
286
+
287
+ ```js
288
+ import ts from 'typescript';
289
+ import fs from 'node:fs';
290
+ import path from 'node:path';
291
+
292
+ const MEMBER_KINDS = new Set([ts.SyntaxKind.PropertyDeclaration, ts.SyntaxKind.MethodDeclaration,
293
+ ts.SyntaxKind.GetAccessor, ts.SyntaxKind.SetAccessor]);
294
+ const cache = new Map();
295
+ const parse = (f) => cache.get(f) ?? cache.set(f, ts.createSourceFile(f,
296
+ fs.readFileSync(f, 'utf8'), ts.ScriptTarget.ESNext, true, ts.ScriptKind.TS)).get(f);
297
+
298
+ /** 导出面:d.ts barrel 顶层 `export` 声明的名字 + `export { … } from` 的具名转发 */
299
+ function exportsOf(file) {
300
+ const out = new Set();
301
+ for (const st of parse(file).statements) {
302
+ const mods = st.modifiers ?? [];
303
+ if (mods.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)) {
304
+ if (st.name) out.add(st.name.text);
305
+ if (ts.isVariableStatement(st)) {
306
+ for (const d of st.declarationList.declarations) if (d.name.text) out.add(d.name.text);
307
+ }
308
+ }
309
+ if (ts.isExportDeclaration(st) && st.exportClause && ts.isNamedExports(st.exportClause)) {
310
+ for (const el of st.exportClause.elements) out.add((el.name ?? el.propertyName).text);
311
+ }
312
+ }
313
+ return out;
314
+ }
315
+
316
+ // barrel 逐层解析:符号可能在 `export { X } from './y.js'` 的深层文件里
317
+ function findDecl(name, file, seen = new Set()) {
318
+ if (seen.has(file)) return null;
319
+ seen.add(file);
320
+ const sf = parse(file);
321
+ for (const st of sf.statements) {
322
+ if (st.name?.text === name) return st;
323
+ if (ts.isVariableStatement(st) && st.declarationList.declarations
324
+ .some((d) => d.name.text === name)) return st;
325
+ }
326
+ for (const st of sf.statements) {
327
+ if (!ts.isExportDeclaration(st) || !st.moduleSpecifier) continue;
328
+ const base = path.resolve(path.dirname(file), st.moduleSpecifier.text).replace(/\.js$/, '');
329
+ const mod = [`${base}.d.ts`, path.join(base, 'index.d.ts')].find((p) => fs.existsSync(p));
330
+ const hit = !st.exportClause || !ts.isNamedExports(st.exportClause) || st.exportClause.elements
331
+ .some((el) => (el.name ?? el.propertyName).text === name);
332
+ if (mod && hit) { const r = findDecl(name, mod, seen); if (r) return r; }
333
+ }
334
+ return null;
335
+ }
336
+
337
+ function members(st) {
338
+ const out = new Set();
339
+ if (!st) return out;
340
+ const list = ts.isInterfaceDeclaration(st) ? st.members
341
+ : ts.isTypeAliasDeclaration(st) && ts.isTypeLiteralNode(st.type) ? st.type.members
342
+ : ts.isClassDeclaration(st) ? st.members.filter((m) => MEMBER_KINDS.has(m.kind)
343
+ && !(m.modifiers ?? []).some((x) => x.kind === ts.SyntaxKind.PrivateKeyword
344
+ || x.kind === ts.SyntaxKind.ProtectedKeyword)) : [];
345
+ for (const m of list) {
346
+ // `#name` 是 ES private(无 private 修饰符),同样不该计入公开面
347
+ if (m.name && !ts.isPrivateIdentifier(m.name)) out.add(m.name.getText());
348
+ }
349
+ return out;
350
+ }
351
+
352
+ const [oldDist, newDist] = process.argv.slice(2);
353
+ const oldEntry = path.join(oldDist, 'index.d.ts');
354
+ const newEntry = path.join(newDist, 'index.d.ts');
355
+ const ea = exportsOf(oldEntry);
356
+ const eb = exportsOf(newEntry);
357
+ console.log(`EXPORTS 4.0.0=${ea.size} 5.0.0=${eb.size}`
358
+ + ` removed=${[...ea].filter((x) => !eb.has(x)).length}`
359
+ + ` added=${[...eb].filter((x) => !ea.has(x)).length}`);
360
+ for (const name of ['Agent', 'SessionManager', 'RolePackManager', 'AgentOptions',
361
+ 'AgentEventMap', 'SessionCheckpoint', 'FetchedPage', 'IMemoryStorage', 'ISessionStore']) {
362
+ const a = members(findDecl(name, oldEntry));
363
+ const b = members(findDecl(name, newEntry));
364
+ console.log(name, `${a.size}→${b.size}`,
365
+ '删:', [...a].filter((x) => !b.has(x)).join(',') || '-',
366
+ '增:', [...b].filter((x) => !a.has(x)).join(',') || '-');
367
+ }
368
+ ```
369
+
370
+ 口径:只数**导出面**与**消费者看得见的成员**——`private` / `protected` 在 d.ts 里留存但计入不 Breaking。
371
+
372
+ 本文首次成稿时的实测输出(脚本逐行还会打印「删:/增:」名单,此处只留计数):
373
+
374
+ ```text
375
+ EXPORTS 4.0.0=156 5.0.0=136 removed=23 added=3
376
+ Agent 70→58 SessionManager 50→36 RolePackManager 32→31
377
+ AgentOptions 33→31 AgentEventMap 28→25
378
+ SessionCheckpoint 12→9 FetchedPage 4→5
379
+ IMemoryStorage 15→15 ISessionStore 12→12
380
+ ```
381
+
382
+ > 时点注记:Agent 首次实测为 70→59(当时 `canContinueWithoutInput` 尚未删除);
383
+ > `PUB-API-PRUNE-5`(2026-10-19)删除该方法后终值 70→58,已按上文「以脚本结果为准并回改本文」原则回改。
384
+
385
+ > 这组数字与 §1 表格逐格对应——§1 若与你的重跑结果不一致,**以脚本结果为准并回改本文**。