@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
@@ -5,6 +5,8 @@
5
5
  */
6
6
  import { SOURCE_LABELS, SUMMARY_TYPES, roundSummaryMemoryId, roundSummarySessionPrefix, } from '../../memory/types.js';
7
7
  import { extractEnhancedKeywords, calculateWeightedJaccard } from '../../utils/segmenter.js';
8
+ import { sha256Fingerprint } from '../../utils/hash.js';
9
+ import { hasActiveSuperseder } from '../../memory/supersedeResolve.js';
8
10
  import { logger } from '../../logging/logger.js';
9
11
  import { parseLlmJson } from '../../utils/json.js';
10
12
  import { nowIso } from '../../utils/time.js';
@@ -28,16 +30,42 @@ const SUPERSEDE_OVERLAP_THRESHOLD = 0.5;
28
30
  const SUPERSEDE_CANDIDATE_WINDOW = 20;
29
31
  /** LLM 温度参数(低温度确保摘要格式稳定) */
30
32
  const LLM_TEMPERATURE = 0.3;
33
+ /**
34
+ * 摘要原料指纹分隔符:不可见 NUL,用于拼接「输入 + 回复」后再哈希。
35
+ * 必须有分隔符——无分隔时 ("ab","c") 与 ("a","bc") 拼接结果相同,会把两个不同轮判成重复。
36
+ */
37
+ const FINGERPRINT_SEPARATOR = '\u0000';
38
+ /**
39
+ * 计算摘要原料指纹:sha256(输入原文 + NUL + 助手回复原文)。
40
+ *
41
+ * 取原文全文(非截断值):截断面内相同、截断面外不同 → 严格不等 → 放行生成
42
+ * (宁可放行一条轻微重复,不误杀——判据取严,仅铁重复时跳过)。
43
+ * 摘要生成器只吃这两个原料(上下文差异最终体现为回复差异),故原料全等 ⇒ 摘要无增量。
44
+ *
45
+ * @param input 用户输入原文(不截断)
46
+ * @param assistantContent 助手回复原文(不截断)
47
+ * @returns 64 位 hex 指纹
48
+ */
49
+ export function materialFingerprint(input, assistantContent) {
50
+ return sha256Fingerprint(`${input}${FINGERPRINT_SEPARATOR}${assistantContent}`);
51
+ }
31
52
  /**
32
53
  * 摘要 JSON 输出契约(内核硬契约,角色包不可替换):输出格式与 SummaryType 分类必须稳定
33
54
  * (摘要写路径读取 summaryType 顶层字段且宿主依赖),角色包只可替换「提炼视角」(判断值得记什么)。
55
+ *
56
+ * summary 允许 null = 写入侧判断权(2026-10-09 归还):判断器必须能说「本轮无值得沉淀的信息」,
57
+ * 否则纯后台/工具轮被强制挤出流水账摘要(P1-5 噪音根源)。
34
58
  */
35
59
  const SUMMARY_JSON_CONTRACT = `请以 JSON 格式输出:
36
60
  {
37
- "summary": "摘要内容(1-3 句话,不超过 500 字)",
61
+ "summary": "摘要内容(1-3 句话,不超过 500 字),或 null",
38
62
  "type": "摘要类型(preference|fact|decision|intent|general)"
39
63
  }
40
64
 
65
+ summary 判空纪律:
66
+ - 本轮若为纯工具执行 / 后台任务、无用户实质意图或结论 → summary 输出 null
67
+ - 只要用户有实质提问或实质回答,summary 必须为非空字符串,不得偷懒返回 null
68
+
41
69
  类型说明:
42
70
  - preference: 用户表达的个人偏好或喜好
43
71
  - fact: 客观事实信息
@@ -82,7 +110,8 @@ export class RoundSummaryGenerator {
82
110
  setBackgroundProvider(provider) {
83
111
  this.provider = provider ?? this.defaultProvider;
84
112
  }
85
- /** 记忆写入回调(memoryAdded 事件出口):摘要即记忆,新摘要写入后通知宿主「已沉淀」 */
113
+ /** 记忆写入回调(memoryAdded 事件出口):摘要即记忆,新摘要写入后通知宿主「已沉淀」。
114
+ * content = 记忆正文(宿主提示按用户心智显示内容,回退 name) */
86
115
  _onMemoryAdded = null;
87
116
  /** 绑定记忆写入回调(Agent.init 调用);传 null 解除绑定 */
88
117
  setOnMemoryAdded(fn) {
@@ -90,10 +119,23 @@ export class RoundSummaryGenerator {
90
119
  }
91
120
  /**
92
121
  * 生成并持久化轮次摘要。异步 fire-and-forget,内部捕获异常,仅记警告不阻塞主对话流程。
122
+ *
123
+ * 写入前三态(P1-5a,各态日志可区分,杜绝静默跳过):
124
+ * ① 原料指纹全等(重复轮)→ 跳过,不调 LLM;② LLM 判 summary=null(不值得记)→ 不写入;
125
+ * ③ 正常沉淀 → upsert + memoryAdded 事件。②③ 之外事件链照走(宿主解锁不依赖写入与否)。
126
+ *
93
127
  * @param focus 角色包提炼视角(prepare.summaryFocus,undefined=通用浓缩);存在时以其视角替换「值得记什么」判断主体,JSON 契约固定保留。
94
128
  */
95
129
  async generate(input, assistantContent, roundId, sessionName, focus) {
96
130
  try {
131
+ // ── 前置精确去重(P1-5a):原料全等 ⇒ 摘要无增量,不调 LLM 直接跳过 ──
132
+ // 判据取原文全文 + 字符串全等(确定性),仅铁重复时跳过;近似重复留给下游 supersedeSimilar。
133
+ // 存量条目无 materialFingerprint(不参与匹配),只拦新增重复。
134
+ const fingerprint = materialFingerprint(input, assistantContent);
135
+ if (this.isDuplicateMaterial(fingerprint)) {
136
+ logger.debug({ roundId, sessionName }, '轮次摘要跳过:原料与存量摘要全等(重复轮)');
137
+ return;
138
+ }
97
139
  // 有关注点则以角色包提炼视角替换通用视角,JSON 契约固定保留
98
140
  const userMessage = `用户输入:${truncate(input, USER_INPUT_LIMIT)}\n\n助手回复:${truncate(assistantContent, ASSISTANT_LIMIT)}`;
99
141
  const systemContent = focus ? SUMMARY_PERSPECTIVE_PROMPT(focus) : SUMMARY_SYSTEM_PROMPT;
@@ -103,7 +145,16 @@ export class RoundSummaryGenerator {
103
145
  ];
104
146
  const raw = await accumulateStream(this.provider, messages, { temperature: LLM_TEMPERATURE });
105
147
  const result = parseLlmJson(raw);
106
- if (!result || !result.summary) {
148
+ if (!result) {
149
+ logger.warn({ roundId }, '轮次摘要生成失败:LLM 返回无效 JSON');
150
+ return;
151
+ }
152
+ // 判断权归还:summary 为 null = 判断器认定「本轮无值得沉淀的信息」(合法结论,非错误)
153
+ if (result.summary === null) {
154
+ logger.debug({ roundId, sessionName }, '轮次摘要判为不值得记(summary=null),不写入');
155
+ return;
156
+ }
157
+ if (!result.summary) {
107
158
  logger.warn({ roundId }, '轮次摘要生成失败:LLM 返回无效 JSON');
108
159
  return;
109
160
  }
@@ -126,10 +177,16 @@ export class RoundSummaryGenerator {
126
177
  summaryType,
127
178
  sessionName,
128
179
  roundId,
180
+ materialFingerprint: fingerprint,
129
181
  };
130
182
  this.storage.upsert(memory);
131
183
  // memoryAdded 事件出口:宿主「已沉淀」提示的可观测通道
132
- this._onMemoryAdded?.({ id: memory.id, source: memory.source, name: memory.name });
184
+ this._onMemoryAdded?.({
185
+ id: memory.id,
186
+ source: memory.source,
187
+ name: memory.name,
188
+ content: memory.content,
189
+ });
133
190
  // 写路径取代检测:仅对「同 session 最近 N 条」摘要做取代判定(收敛重叠计算面,避免对全库摘要逐一计算)
134
191
  this.supersedeSimilar(memory, this.getSessionCandidates(memory));
135
192
  logger.debug({ memoryId, summaryType, sessionName, roundId }, '轮次摘要已生成');
@@ -138,6 +195,21 @@ export class RoundSummaryGenerator {
138
195
  logger.warn({ err, roundId }, '轮次摘要生成失败');
139
196
  }
140
197
  }
198
+ /**
199
+ * 前置精确去重判定:存量 round-summary 中是否已有原料指纹全等的条目。
200
+ *
201
+ * 全库比对(不限 session):精确重复无跨会话例外——同原料在哪个会话产生同一份摘要,
202
+ * 与语义近似取代(supersedeSimilar,刻意仅同 session)是两套判据,勿混。
203
+ * 软删条目经 getBySource 被过滤(活跃面才挡),用户已删的不复活也不拦新轮。
204
+ *
205
+ * @param fingerprint 本轮原料指纹
206
+ * @returns true = 存量已有全等原料摘要,本轮应跳过
207
+ */
208
+ isDuplicateMaterial(fingerprint) {
209
+ return this.storage
210
+ .getBySource(SOURCE_LABELS.ROUND_SUMMARY)
211
+ .some((m) => m.materialFingerprint === fingerprint);
212
+ }
141
213
  /**
142
214
  * 构造取代检测候选:同 session 且未被取代的摘要,按时间倒序取最近 N 条(SUPERSEDE_CANDIDATE_WINDOW)。
143
215
  * 取代语义是"本 session 内新决策替换旧同主题决策"——收敛到同 session 近期摘要,
@@ -152,9 +224,12 @@ export class RoundSummaryGenerator {
152
224
  return [];
153
225
  const sessionPrefix = roundSummarySessionPrefix(sessionName);
154
226
  const all = this.storage.getBySource(SOURCE_LABELS.ROUND_SUMMARY);
155
- // 同 session + 未取代(排除自身):按 createdAt 降序,取最近 N 条作候选
227
+ // 同 session + 未被「现存且活跃」摘要取代(排除自身):悬空指针(替代物已移除/软删)视为未取代,
228
+ // 该旧摘要回退为当前版本、仍可再被取代(判据见 hasActiveSuperseder)。按 createdAt 降序取最近 N 条。
156
229
  return all
157
- .filter((old) => old.id.startsWith(sessionPrefix) && !old.supersededBy && old.id !== newMemory.id)
230
+ .filter((old) => old.id.startsWith(sessionPrefix) &&
231
+ !hasActiveSuperseder(old, this.storage) &&
232
+ old.id !== newMemory.id)
158
233
  .sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt))
159
234
  .slice(0, SUPERSEDE_CANDIDATE_WINDOW);
160
235
  }
@@ -1 +1 @@
1
- {"version":3,"file":"roundSummaryGenerator.js","sourceRoot":"","sources":["../../../src/agent/managers/roundSummaryGenerator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"roundSummaryGenerator.js","sourceRoot":"","sources":["../../../src/agent/managers/roundSummaryGenerator.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,11 @@
1
1
  /**
2
2
  * 会话归档器(SessionMeta 归档):将原始对话归纳为元数据,LLM 生成 summary/keyTopics/autoName 供搜索索引。
3
- * 触发时机:full 模式在会话切换前自动归档;manual 模式用户手动触发(Agent.archiveSession)。
3
+ * 触发时机(三类自动 + 手动):
4
+ * - 会话切走(sessionSwitched,switchToSession 后旧会话离场);
5
+ * - 分叉离场(sessionForked,源会话脱离当前态);
6
+ * - 暂停超时(sessionPauseTimedOut,30min watchdog);
7
+ * 三类自动触发经 ArchiveCoordinator 统一入口(archiveMode=manual 时跳过);手动调用不受模式
8
+ * 门控(是否防重由 `skipIfUnchanged` 单独表达,宿主「移入留存区」等便捷手势显式传 true)。
4
9
  * 降级:LLM 不可用/消息为空/sessionStore 未注入时静默跳过或返回空结果,不阻塞会话切换(best-effort)。
5
10
  */
6
11
  import type { LlmProvider } from '../../llm/provider.js';
@@ -14,6 +19,22 @@ export interface SessionArchiveResult {
14
19
  /** 归档的消息数量 */
15
20
  messageCount: number;
16
21
  }
22
+ /** 归档触发选项 */
23
+ export interface SessionArchiveOptions {
24
+ /**
25
+ * 内容未变则跳过:对比上次**实际完成归档**时的消息数,相同即跳过 LLM 调用。
26
+ *
27
+ * 判据可靠性:对话记录 append-only(单条消息不删)⇒ 消息数相同 = 内容未变;
28
+ * 反之只要又聊过(消息数必增)就一定重新归档 —— **防重 ≠ 防更新**。
29
+ *
30
+ * 调用形态(2026-10-19 起):自动触发默认带;手动触发**默认不带**(用户意图优先、
31
+ * 无条件重归档),但宿主便捷手势可显式传 true 享同一判据(见 ArchiveTriggerOptions)。
32
+ *
33
+ * 判据本体在本类(内存 Map + `SessionMeta.archivedMessageCount` 落盘副本双源,
34
+ * 跨进程存活),比较对象是 `messages.length`。
35
+ */
36
+ skipIfUnchanged?: boolean;
37
+ }
17
38
  /** 会话归档器:将会话原始对话归档为 SessionMeta 元数据 */
18
39
  export declare class SessionArchiver {
19
40
  /** 当前使用的 Provider(后台优先,降级到默认) */
@@ -22,14 +43,25 @@ export declare class SessionArchiver {
22
43
  private readonly defaultProvider;
23
44
  /** 会话存储(加载原始对话消息 + 写入 SessionMeta) */
24
45
  private sessionStore;
46
+ /**
47
+ * 已归档会话的消息数快照(防重判据):sessionLabel → 上次**实际完成归档**时的消息数。
48
+ *
49
+ * **双源**(顺序不可换):本内存 Map 优先(同进程内准确、零 I/O);未命中则回退落盘副本
50
+ * `SessionMeta.archivedMessageCount`(跨进程存活)。
51
+ *
52
+ * 为何必须双源:纯内存态随进程销毁清零 ⇒ 重启后首次触发会对「内容未变、早归档过」的会话
53
+ * **重复烧一次 LLM**;手动归档入口(manual 模式「移入留存区」)落地后该重复变成用户可见
54
+ * 的开销。写入成功后**两源同写**(见 archiveSession 末段),故重启不丢判据。
55
+ */
56
+ private lastArchivedMessageCount;
25
57
  constructor(provider: LlmProvider, sessionStore: ISessionStore | undefined);
26
58
  /** 注入后台 Provider(Agent.setBackgroundProvider 调用);null 表示回退到默认 Provider */
27
59
  setBackgroundProvider(provider: LlmProvider | null): void;
28
60
  /**
29
- * 归档指定会话:加载消息 → 消息过少(<2)跳过 → LLM 生成摘要/主题 → 写入 SessionMeta。
61
+ * 归档指定会话:加载消息 → 消息过少(<2)跳过 → [防重] → LLM 生成摘要/主题 → 写入 SessionMeta。
30
62
  * 错误传播:sessionStore 未注入/消息过少/LLM 判无价值返回空结果(非错误);LLM 异常/写入失败向上抛给 ArchiveCoordinator 统一 catch。
31
63
  */
32
- archiveSession(date: string, session: string): Promise<SessionArchiveResult>;
64
+ archiveSession(date: string, session: string, options?: SessionArchiveOptions): Promise<SessionArchiveResult>;
33
65
  /**
34
66
  * 调用 LLM 生成会话元数据(summary/keyTopics/autoName),从"简单摘要"升级为"综合提炼"(L4 归档压缩增强)。
35
67
  * @returns 生成的元数据,无摘要价值返回 null
@@ -1 +1 @@
1
- {"version":3,"file":"sessionArchiver.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/sessionArchiver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,0BAA0B,CAAC;AAG9E,aAAa;AACb,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc;IACd,YAAY,EAAE,MAAM,CAAC;CACtB;AAiBD,uCAAuC;AACvC,qBAAa,eAAe;IAC1B,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAc;IAC9B,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAc;IAC9C,sCAAsC;IACtC,OAAO,CAAC,YAAY,CAA4B;gBAEpC,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,GAAG,SAAS;IAM1E,0EAA0E;IAC1E,qBAAqB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAIzD;;;OAGG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgElF;;;OAGG;YACW,mBAAmB;CAkFlC"}
1
+ {"version":3,"file":"sessionArchiver.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/sessionArchiver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,0BAA0B,CAAC;AAG9E,aAAa;AACb,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc;IACd,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,aAAa;AACb,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAiBD,uCAAuC;AACvC,qBAAa,eAAe;IAC1B,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAc;IAC9B,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAc;IAC9C,sCAAsC;IACtC,OAAO,CAAC,YAAY,CAA4B;IAChD;;;;;;;;;OASG;IACH,OAAO,CAAC,wBAAwB,CAA6B;gBAEjD,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,GAAG,SAAS;IAM1E,0EAA0E;IAC1E,qBAAqB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAIzD;;;OAGG;IACG,cAAc,CAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;IAoFhC;;;OAGG;YACW,mBAAmB;CAkFlC"}
@@ -1,6 +1,11 @@
1
1
  /**
2
2
  * 会话归档器(SessionMeta 归档):将原始对话归纳为元数据,LLM 生成 summary/keyTopics/autoName 供搜索索引。
3
- * 触发时机:full 模式在会话切换前自动归档;manual 模式用户手动触发(Agent.archiveSession)。
3
+ * 触发时机(三类自动 + 手动):
4
+ * - 会话切走(sessionSwitched,switchToSession 后旧会话离场);
5
+ * - 分叉离场(sessionForked,源会话脱离当前态);
6
+ * - 暂停超时(sessionPauseTimedOut,30min watchdog);
7
+ * 三类自动触发经 ArchiveCoordinator 统一入口(archiveMode=manual 时跳过);手动调用不受模式
8
+ * 门控(是否防重由 `skipIfUnchanged` 单独表达,宿主「移入留存区」等便捷手势显式传 true)。
4
9
  * 降级:LLM 不可用/消息为空/sessionStore 未注入时静默跳过或返回空结果,不阻塞会话切换(best-effort)。
5
10
  */
6
11
  import { logger } from '../../logging/logger.js';
@@ -28,6 +33,17 @@ export class SessionArchiver {
28
33
  defaultProvider;
29
34
  /** 会话存储(加载原始对话消息 + 写入 SessionMeta) */
30
35
  sessionStore;
36
+ /**
37
+ * 已归档会话的消息数快照(防重判据):sessionLabel → 上次**实际完成归档**时的消息数。
38
+ *
39
+ * **双源**(顺序不可换):本内存 Map 优先(同进程内准确、零 I/O);未命中则回退落盘副本
40
+ * `SessionMeta.archivedMessageCount`(跨进程存活)。
41
+ *
42
+ * 为何必须双源:纯内存态随进程销毁清零 ⇒ 重启后首次触发会对「内容未变、早归档过」的会话
43
+ * **重复烧一次 LLM**;手动归档入口(manual 模式「移入留存区」)落地后该重复变成用户可见
44
+ * 的开销。写入成功后**两源同写**(见 archiveSession 末段),故重启不丢判据。
45
+ */
46
+ lastArchivedMessageCount = new Map();
31
47
  constructor(provider, sessionStore) {
32
48
  this.provider = provider;
33
49
  this.defaultProvider = provider;
@@ -38,10 +54,10 @@ export class SessionArchiver {
38
54
  this.provider = provider ?? this.defaultProvider;
39
55
  }
40
56
  /**
41
- * 归档指定会话:加载消息 → 消息过少(<2)跳过 → LLM 生成摘要/主题 → 写入 SessionMeta。
57
+ * 归档指定会话:加载消息 → 消息过少(<2)跳过 → [防重] → LLM 生成摘要/主题 → 写入 SessionMeta。
42
58
  * 错误传播:sessionStore 未注入/消息过少/LLM 判无价值返回空结果(非错误);LLM 异常/写入失败向上抛给 ArchiveCoordinator 统一 catch。
43
59
  */
44
- async archiveSession(date, session) {
60
+ async archiveSession(date, session, options) {
45
61
  const sessionLabel = `${date}-${session}`;
46
62
  const emptyResult = {
47
63
  updatedFields: [],
@@ -58,6 +74,16 @@ export class SessionArchiver {
58
74
  logger.debug({ sessionLabel, messageCount: messages.length }, 'SessionArchiver: 消息过少,跳过');
59
75
  return { ...emptyResult, messageCount: messages.length };
60
76
  }
77
+ // 自动触发防重:消息数与上次实际归档时相同 → 内容未变,跳过 LLM 调用。
78
+ // 判据双源:内存快照优先,未命中回退落盘 SessionMeta.archivedMessageCount(跨进程存活,
79
+ // 否则重启后对「内容未变、早归档过」的会话会重复烧一次 LLM)。两者都是同一语义的单点
80
+ // 副本,不存在第二套判据。
81
+ const lastCount = this.lastArchivedMessageCount.get(sessionLabel) ??
82
+ this.sessionStore.getSessionMeta?.(sessionLabel)?.archivedMessageCount;
83
+ if (options?.skipIfUnchanged && lastCount !== undefined && lastCount === messages.length) {
84
+ logger.debug({ sessionLabel, messageCount: messages.length }, 'SessionArchiver: 内容未变(消息数同上次归档),跳过自动归档');
85
+ return { ...emptyResult, messageCount: messages.length };
86
+ }
61
87
  // LLM 异常向上抛出,由 ArchiveCoordinator 统一 catch
62
88
  const meta = await this.generateSessionMeta(messages);
63
89
  if (!meta) {
@@ -81,7 +107,12 @@ export class SessionArchiver {
81
107
  updatedFields.push('autoName');
82
108
  }
83
109
  if (updatedFields.length > 0) {
110
+ // 防重快照同批落盘(与 summary/keyTopics 一次写入):内存态供本进程、落盘副本供跨进程,
111
+ // 两源同一值、同一写入点(无第二套判据)。
112
+ partialMeta.archivedMessageCount = messages.length;
84
113
  this.sessionStore.updateSessionMeta?.(sessionLabel, partialMeta);
114
+ // 写入成功才记防重快照:LLM 判无价值/写入失败不记,下次自动触发仍会重试
115
+ this.lastArchivedMessageCount.set(sessionLabel, messages.length);
85
116
  }
86
117
  logger.info({ sessionLabel, messageCount: messages.length, updatedFields }, 'SessionArchiver: 会话内容归档完成');
87
118
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"sessionArchiver.js","sourceRoot":"","sources":["../../../src/agent/managers/sessionArchiver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessionArchiver.js","sourceRoot":"","sources":["../../../src/agent/managers/sessionArchiver.ts"],"names":[],"mappings":"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"}
@@ -5,11 +5,9 @@
5
5
  */
6
6
  import type { AgentLoop } from '../../agent/loop.js';
7
7
  import type { MessageHistory, ForkResult } from '../../agent/messageHistory.js';
8
- import type { SessionMessage } from '../../memory/sessionStore.js';
9
8
  import type { ISessionStore, SessionMeta } from '../../memory/sessionStore.js';
10
9
  import { type AgentEventName } from '../../utils/eventEmitter.js';
11
10
  import type { SessionCheckpoint, SessionStatus, PlanItem, ToolExecutionRecord, PauseMeta, PauseSource } from '../../agent/types.js';
12
- import type { GoalConsistencyResult } from '../../agent/managers/goalConsistencyChecker.js';
13
11
  /**
14
12
  * 分叉操作结果(round-based 模式)
15
13
  *
@@ -33,17 +31,6 @@ export declare class SessionManager {
33
31
  private stateMachine;
34
32
  /** 当前会话检查点(运行时状态快照) */
35
33
  private checkpoint;
36
- /** 检查点脏标记(内存态收口):touchCheckpoint 置位、settleCheckpoint 清理(纯内存态,不落盘) */
37
- private checkpointDirty;
38
- /** 目标一致性校验器(目标版本一致性校验) */
39
- private readonly consistencyChecker;
40
- /**
41
- * 连续暂停时间戳数组(防滥用窗口):每次高风险暂停记录时间戳,窗口(1 小时)内连续 2 次则强制降为低风险暂停。
42
- * ⚠ 进程内状态,不入 SessionCheckpoint——重启归零是设计(反滥用卫生状态,非执行状态);1h 窗口自愈防线,勿引入持久化。
43
- */
44
- private consecutivePauseTimestamps;
45
- /** 连续暂停时间窗口(毫秒),1 小时前的暂停不计入连续计数 */
46
- private static readonly CONSECUTIVE_PAUSE_WINDOW_MS;
47
34
  /** 暂停超时检测定时器(只在 paused 状态时运行) */
48
35
  private _pauseTimeoutTimer;
49
36
  /** 暂停超时检测间隔(毫秒),30 秒检查一次心跳 */
@@ -63,10 +50,6 @@ export declare class SessionManager {
63
50
  reason: string;
64
51
  source: PauseSource;
65
52
  } | null;
66
- /** 检查是否处于暂停态 */
67
- isPaused(): boolean;
68
- /** 检查是否处于运行态 */
69
- isRunning(): boolean;
70
53
  /** 待处理暂停请求是否在等待中 */
71
54
  isPausePending(): boolean;
72
55
  /**
@@ -85,9 +68,17 @@ export declare class SessionManager {
85
68
  cancelPendingPause(): void;
86
69
  /**
87
70
  * 会话替换 chokepoint:作废所有会话级派生缓存。
88
- * 任何替换 loop 工作记忆(switch/fork/restore)入口都必须经此,新增派生缓存在此注册一处避免"对称的另一半没写完"。
71
+ * 任何替换 loop 工作记忆(switch/fork/load)入口都必须经此,新增派生缓存在此注册一处避免"对称的另一半没写完"。
89
72
  */
90
73
  private invalidateSessionDerivedState;
74
+ /**
75
+ * 会话替换前置闸(SSOT 收口):任何替换 loop 工作记忆(switch/fork/load)的入口都必须经此。
76
+ * 合并「对话进行中」繁忙闸 + 「非 running 态拒绝」状态闸,消除 switch 有状态闸而
77
+ * fork/restore/load 漏闸的对称性缺口(原 switchSession 注释谎称「与 fork/restore 繁忙守卫同构」,
78
+ * 实际 fork/restore/load 无状态闸——属注释与实现不符的带伤,本次修复)。
79
+ * 暂停/错误态替换语义未定义,保守拒绝;宿主未就绪/暂停态触发由宿主 try/catch 兜底转错误通知。
80
+ */
81
+ private assertSessionReplaceable;
91
82
  /** 切换当前会话。底层 MessageHistory.switchSession 为纯同步操作,不引入无意义 async 包装。 */
92
83
  switchSession(newSession: string): string;
93
84
  /**
@@ -117,68 +108,32 @@ export declare class SessionManager {
117
108
  * @param targetSession - 可选,自定义新会话名;不传则自动生成
118
109
  */
119
110
  forkSession(roundId?: string, targetSession?: string): AgentForkResult;
120
- /**
121
- * 恢复最近活跃会话:经 ISessionStore 加载最近消息到工作记忆;宿主未注入则返回 0。
122
- *
123
- * 会话管理纯度:会话一律手动创建(宿主标题条「+」唯一入口),
124
- * 本方法只做「恢复」、绝不隐式创建会话——无按天归档隐式语义
125
- * (「今天-main 优先」类规则),也无 preferredSession 参数。最近活跃的唯一时间序真理源 = listSessionMetas[0](updatedAt 降序)。
126
- *
127
- * @returns 恢复的消息条数(0 = 无可恢复会话)
128
- */
129
- restoreMostRecentSession(): Promise<number>;
130
- /** 恢复指定会话的对话 */
131
- restoreSession(date: string, session: string): Promise<number>;
132
- /** 对外暴露的 loadSessionMessages 委托。⚠ 会切换当前会话(更新 currentDate/currentSession),加载后下一条 chat 写入被加载会话 */
133
- loadSessionMessages(date: string, session: string): Promise<SessionMessage[]>;
134
111
  /** 将会话消息恢复到 AgentLoop 工作记忆 */
135
112
  private applySessionToLoop;
136
- /**
137
- * 检查点必需字段默认值工厂(默认值单一真理源)。
138
- * 仅 createCheckpoint 新建/合并时使用——反序列化采用严格模式,不做静默补齐。
139
- * 必须返回新实例:数组/对象默认值共享引用会让不同检查点互相污染(一个 push 计划任务项另一凭空多出)。
140
- */
141
- private static checkpointDefaults;
142
113
  /** 从当前运行时状态创建检查点:快照消息历史与会话标识生成 SessionCheckpoint(纯内存态,
143
114
  * 不落盘——中止/断电走中断轮补全,运行时暂停同 turn 内存续跑) */
144
- createCheckpoint(mainGoal?: string): SessionCheckpoint;
115
+ createCheckpoint(): SessionCheckpoint;
145
116
  /**
146
- * 标记检查点已变更(内存写点统一入口)。刷新心跳并置脏标记。
147
- * 所有修改 this.checkpoint 的方法都必须调用本方法,不得直接赋值 lastHeartbeat——否则变更不被后续清脏感知,内存与清脏链路静默分叉。
117
+ * 刷新检查点心跳(内存写点统一入口)。所有修改 `this.checkpoint` 的方法都必须调用本方法,
118
+ * 不得直接赋值 `lastHeartbeat`——心跳是暂停超时判定的兜底依据,绕过本方法会让超时判定读到陈旧值。
119
+ * ⚠️ 检查点不落盘:本方法**只刷心跳,无脏标记**(脏标记随 2026-10-14 CHKPT-3 减法删除——
120
+ * 曾经的 `checkpointDirty` 无外部消费者,属纯内耗)。
148
121
  */
149
122
  private touchCheckpoint;
150
- /**
151
- * 检查点脏标记清理(**纯内存态**):
152
- * `SessionCheckpoint` 不落盘——中止/断电走「中断轮补全为完整 turn」而非跨重启恢复,
153
- * 运行时暂停是同 turn 内续跑(内存态),无跨进程载体需求。故本方法仅清理脏标记,
154
- * 不再写存储层(保留方法语义边界,避免为纯净化波及 40+ 处调用点)。
155
- */
156
- private settleCheckpoint;
157
123
  /** 获取当前检查点快照;未创建返回 null */
158
124
  getCheckpoint(): SessionCheckpoint | null;
159
- /**
160
- * 暂停会话(用户/Agent/系统均可触发)。暂停前自动创建检查点;高风险暂停计入连续计数(防滥用),低风险不计。
161
- * @param lowRisk 低风险暂停不计连续计数(默认 false)
162
- */
163
- pause(reason: string, source?: PauseSource, lowRisk?: boolean): boolean;
125
+ /** 暂停会话(用户/Agent/系统均可触发)。暂停前自动创建检查点。 */
126
+ pause(reason: string, source?: PauseSource): boolean;
164
127
  /** 恢复会话:从 PAUSED 恢复到 RUNNING。超时会话需重新开始,不能恢复 */
165
128
  resume(): boolean;
166
129
  /** 触发异常(仅 RUNNING 态)。异常时自动创建检查点;createCheckpoint 会从状态机投影 status/error,不再手工赋值避免并列真理源 */
167
130
  triggerError(cause: string): boolean;
168
- /** 清理过期暂停时间戳(窗口过滤):移除超过窗口(1 小时)的旧时间戳,仅保留窗口内暂停;每次查询计数时自动调用 */
169
- private pruneStalePauseTimestamps;
170
- /** 检查连续暂停是否已达上限(防滥用):先清理窗口外时间戳,再查窗口内暂停≥2 次则强制降为低风险暂停。低风险不计数 */
171
- isPauseLimitReached(): boolean;
172
- /** 获取当前连续暂停计数:先清理窗口外时间戳,返回窗口内有效暂停数 */
173
- getConsecutivePauseCount(): number;
174
- /** 重置连续暂停计数(防滥用):暂停超时处理后调用。与 resume() 分离,防回答前过早清零致防滥用失效 */
175
- resetConsecutivePauseCount(): void;
176
131
  /**
177
132
  * 放弃当前暂停检查点(宿主 stop 语义的内核出口)
178
133
  *
179
134
  * 语义 = 用户决定**彻底放弃**暂停执行,不再 resume。清理内容:
180
135
  * 1. 停暂停超时定时器(防止已放弃的 checkpoint 继续被超时清理)
181
- * 2. 清内存态 checkpoint + checkpointDirty + pauseMeta
136
+ * 2. 清内存态 checkpoint + pauseMeta
182
137
  * 3. 状态机 resetToRunning(回到 idle 之前的 running 基础态,下次 chat() 正常)
183
138
  *
184
139
  * 与 resume() 的区别:resume = 想继续跑暂停点;discardCheckpoint = 不想了,检查点作废。
@@ -188,12 +143,6 @@ export declare class SessionManager {
188
143
  discardCheckpoint(): boolean;
189
144
  /** 从异常恢复:标记 error.recovered=true 并经 stateMachine.recover 校验。检查点不落盘,恢复仅活在内存态 */
190
145
  recover(): boolean;
191
- /**
192
- * 更新检查点目标版本:递增 goalChangeSeq 触发漂移检测。漂移处置由内核自兜底不依赖宿主:
193
- * drift 级内核直接低风险暂停强制确认;minor 级仅发射事件+日志不打断执行。
194
- * goalDriftDetected 事件为可观测性出口,宿主可选订阅,不订阅不影响正确性。
195
- */
196
- updateGoal(newGoal: string): GoalConsistencyResult | null;
197
146
  /** 全量替换计划任务项(与 appendPlanItem 仅追加正交;保留已有任务项 id/status)。唯一生产点:task_table_write mode='replace' */
198
147
  updatePlan(plan: PlanItem[]): void;
199
148
  /** 追加计划任务项:在 plan 末尾追加新任务项,不重排已有 order。rolePack 为会议表层装配角色(可选) */
@@ -212,8 +161,7 @@ export declare class SessionManager {
212
161
  rolePack?: string;
213
162
  }>): PlanItem[];
214
163
  /**
215
- * 更新计划任务项状态(plan 任务项状态的唯一写点)。必须经此写点置 checkpointDirty,
216
- * 否则状态变更可能丢失标脏,计划变更与标脏在此原子完成。
164
+ * 更新计划任务项状态(plan 任务项状态的唯一写点)。
217
165
  *
218
166
  * 写完后自动 ensureActivePlanItem:如果变更导致 active 空缺(如把 active 标记为 done/blocked),
219
167
  * 则推进下一个 pending → active。这保证任何时刻 plan 中恰好有一个 active 任务项。
@@ -233,9 +181,8 @@ export declare class SessionManager {
233
181
  /**
234
182
  * 是否存在「在途计划」= 有未完成任务项(pending 或 active)。
235
183
  *
236
- * SSOT:全库该命题唯一实现。消费方三处——会议骨架预置守卫(prepare,判断续会不重开)、
237
- * 任务表 nudge 跳过(loop,已有在途表则不再诱导建表)、canContinueWithoutInput(agent,
238
- * 可续跑信号)。禁任一消费方自行内联谓词。
184
+ * SSOT:全库该命题唯一实现。消费方两处——会议骨架预置守卫(prepare,判断续会不重开)、
185
+ * 任务表 nudge 跳过(loop,已有在途表则不再诱导建表)。禁任一消费方自行内联谓词。
239
186
  *
240
187
  * 口径取 pending||active(非仅 active):与 ensureActivePlanItem 的补偿语义对齐——
241
188
  * plan 非空时恒有一个 active(见 :826 场景 1/2),全 done/blocked 时无 active(场景 3),
@@ -272,7 +219,7 @@ export declare class SessionManager {
272
219
  private appendPlanItemLog;
273
220
  /** 卸载运行态挂载物:任务流结束/转 idle 时清空 plan/planItemLog(SSOT 资源层 vs 状态层模型),回到"空闲=无挂载物"常态;与 updatePlan(运行态维护)正交 */
274
221
  clearPlan(): void;
275
- /** 设置暂停元数据;传 undefined 清除。写后必须清脏(清除也清脏,纯内存态无磁盘残留) */
222
+ /** 设置暂停元数据;传 undefined 清除。写后刷心跳(纯内存态无磁盘残留) */
276
223
  setPauseMeta(meta: PauseMeta | undefined): void;
277
224
  /**
278
225
  * 计划是否全部阻塞(预判短路收窄专用判定):仅全 blocked 视为真停滞。
@@ -287,17 +234,10 @@ export declare class SessionManager {
287
234
  getActivePlanItem(): PlanItem | null;
288
235
  /**
289
236
  * 记录工具执行:追加到检查点日志(append-only,内存态)。
290
- * 标脏策略:仅标脏不即时清脏(completePlanItem step 边界统一清脏、createCheckpoint 暂停/异常强制清脏)。
291
237
  * 检查点纯内存态不落盘:completedToolCalls 仅内存态,回合中途崩溃即整体丢弃、走中断轮补全恢复;
292
238
  * 「工具重跑排重」仅在单进程存活期内有效,无跨重启持久化。
293
239
  */
294
240
  logToolExecution(record: ToolExecutionRecord): void;
295
- /** 记录非幂等工具执行(补偿降级后仅日志):不再逐副作用执行补偿,仅记录事实供宿主/人工排查 */
296
- compensateTool(record: ToolExecutionRecord): string;
297
- /** 记录所有非幂等工具执行(补偿降级后仅日志):直接记录所有非幂等工具,每条生成一条日志 */
298
- compensateAllNonIdempotent(): string[];
299
- /** 发送心跳,防僵尸会话 */
300
- heartbeat(): void;
301
241
  /**
302
242
  * 标记会话暂停超时(超时事实唯一写点)。广播式:超时信息经事件载荷传递,多监听器并行消费互不干扰。
303
243
  * 由 checkPauseTimeout 调用(唯一调用点,启动路径无跨重启恢复)。
@@ -310,13 +250,6 @@ export declare class SessionManager {
310
250
  private stopPauseTimeoutTimer;
311
251
  /** 检查暂停超时并在超时时自动清理:清理检查点、重置状态机、发射事件并停止定时器 */
312
252
  private checkPauseTimeout;
313
- /** 关闭时清脏(纯内存,无落盘):Agent 关闭、destroy 前调用。检查点不落盘,
314
- * 本方法为保留语义边界的 no-op 清脏(无持久化动作) */
315
- flushOnShutdown(): void;
316
- /** 立即清脏(纯内存,无落盘):非只读工具完成后调用。⚠️ 检查点不落盘,completedToolCalls 仅内存态——
317
- * 「工具重跑排重」仅在单进程存活期内生效,进程崩溃/重启后失效(走中断轮补全)。无落盘设计,
318
- * 本方法为保留语义边界的 no-op 清脏 */
319
- flushNow(): void;
320
253
  /** 销毁 SessionManager,清理所有定时器(防阻止进程退出或悬空回调) */
321
254
  destroy(): void;
322
255
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sessionManager.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/sessionManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessionManager.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/sessionManager.ts"],"names":[],"mappings":"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"}