@zooique/memora 0.1.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/LICENSE +21 -0
  2. package/README.md +148 -0
  3. package/dist/agent/agent.d.ts +343 -0
  4. package/dist/agent/agent.d.ts.map +1 -0
  5. package/dist/agent/agent.js +893 -0
  6. package/dist/agent/agent.js.map +1 -0
  7. package/dist/agent/assembler.d.ts +77 -0
  8. package/dist/agent/assembler.d.ts.map +1 -0
  9. package/dist/agent/assembler.js +115 -0
  10. package/dist/agent/assembler.js.map +1 -0
  11. package/dist/agent/builtinToolHandlers.d.ts +96 -0
  12. package/dist/agent/builtinToolHandlers.d.ts.map +1 -0
  13. package/dist/agent/builtinToolHandlers.js +388 -0
  14. package/dist/agent/builtinToolHandlers.js.map +1 -0
  15. package/dist/agent/builtinTools.d.ts +35 -0
  16. package/dist/agent/builtinTools.d.ts.map +1 -0
  17. package/dist/agent/builtinTools.js +75 -0
  18. package/dist/agent/builtinTools.js.map +1 -0
  19. package/dist/agent/constants.d.ts +67 -0
  20. package/dist/agent/constants.d.ts.map +1 -0
  21. package/dist/agent/constants.js +67 -0
  22. package/dist/agent/constants.js.map +1 -0
  23. package/dist/agent/contextManager.d.ts +130 -0
  24. package/dist/agent/contextManager.d.ts.map +1 -0
  25. package/dist/agent/contextManager.js +287 -0
  26. package/dist/agent/contextManager.js.map +1 -0
  27. package/dist/agent/loop.d.ts +288 -0
  28. package/dist/agent/loop.d.ts.map +1 -0
  29. package/dist/agent/loop.js +756 -0
  30. package/dist/agent/loop.js.map +1 -0
  31. package/dist/agent/managers/autoConfigRefiner.d.ts +39 -0
  32. package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -0
  33. package/dist/agent/managers/autoConfigRefiner.js +150 -0
  34. package/dist/agent/managers/autoConfigRefiner.js.map +1 -0
  35. package/dist/agent/managers/configManager.d.ts +114 -0
  36. package/dist/agent/managers/configManager.d.ts.map +1 -0
  37. package/dist/agent/managers/configManager.js +186 -0
  38. package/dist/agent/managers/configManager.js.map +1 -0
  39. package/dist/agent/managers/insightExtractor.d.ts +141 -0
  40. package/dist/agent/managers/insightExtractor.d.ts.map +1 -0
  41. package/dist/agent/managers/insightExtractor.js +420 -0
  42. package/dist/agent/managers/insightExtractor.js.map +1 -0
  43. package/dist/agent/managers/memoryAdvisor.d.ts +96 -0
  44. package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -0
  45. package/dist/agent/managers/memoryAdvisor.js +198 -0
  46. package/dist/agent/managers/memoryAdvisor.js.map +1 -0
  47. package/dist/agent/managers/memoryInspector.d.ts +231 -0
  48. package/dist/agent/managers/memoryInspector.d.ts.map +1 -0
  49. package/dist/agent/managers/memoryInspector.js +327 -0
  50. package/dist/agent/managers/memoryInspector.js.map +1 -0
  51. package/dist/agent/managers/sessionManager.d.ts +89 -0
  52. package/dist/agent/managers/sessionManager.d.ts.map +1 -0
  53. package/dist/agent/managers/sessionManager.js +178 -0
  54. package/dist/agent/managers/sessionManager.js.map +1 -0
  55. package/dist/agent/managers/userFactExtractor.d.ts +25 -0
  56. package/dist/agent/managers/userFactExtractor.d.ts.map +1 -0
  57. package/dist/agent/managers/userFactExtractor.js +81 -0
  58. package/dist/agent/managers/userFactExtractor.js.map +1 -0
  59. package/dist/agent/managers/workProjection.d.ts +117 -0
  60. package/dist/agent/managers/workProjection.d.ts.map +1 -0
  61. package/dist/agent/managers/workProjection.js +290 -0
  62. package/dist/agent/managers/workProjection.js.map +1 -0
  63. package/dist/agent/messageHistory.d.ts +157 -0
  64. package/dist/agent/messageHistory.d.ts.map +1 -0
  65. package/dist/agent/messageHistory.js +288 -0
  66. package/dist/agent/messageHistory.js.map +1 -0
  67. package/dist/agent/toolExecutor.d.ts +137 -0
  68. package/dist/agent/toolExecutor.d.ts.map +1 -0
  69. package/dist/agent/toolExecutor.js +209 -0
  70. package/dist/agent/toolExecutor.js.map +1 -0
  71. package/dist/agent/tracer.d.ts +122 -0
  72. package/dist/agent/tracer.d.ts.map +1 -0
  73. package/dist/agent/tracer.js +64 -0
  74. package/dist/agent/tracer.js.map +1 -0
  75. package/dist/agent/types.d.ts +98 -0
  76. package/dist/agent/types.d.ts.map +1 -0
  77. package/dist/agent/types.js +19 -0
  78. package/dist/agent/types.js.map +1 -0
  79. package/dist/config/loader.d.ts +229 -0
  80. package/dist/config/loader.d.ts.map +1 -0
  81. package/dist/config/loader.js +194 -0
  82. package/dist/config/loader.js.map +1 -0
  83. package/dist/eval/evalTypes.d.ts +118 -0
  84. package/dist/eval/evalTypes.d.ts.map +1 -0
  85. package/dist/eval/evalTypes.js +102 -0
  86. package/dist/eval/evalTypes.js.map +1 -0
  87. package/dist/index.d.ts +61 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +44 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/llm/embedding.d.ts +62 -0
  92. package/dist/llm/embedding.d.ts.map +1 -0
  93. package/dist/llm/embedding.js +162 -0
  94. package/dist/llm/embedding.js.map +1 -0
  95. package/dist/llm/factory.d.ts +39 -0
  96. package/dist/llm/factory.d.ts.map +1 -0
  97. package/dist/llm/factory.js +108 -0
  98. package/dist/llm/factory.js.map +1 -0
  99. package/dist/llm/openaiCompatible.d.ts +63 -0
  100. package/dist/llm/openaiCompatible.d.ts.map +1 -0
  101. package/dist/llm/openaiCompatible.js +340 -0
  102. package/dist/llm/openaiCompatible.js.map +1 -0
  103. package/dist/llm/provider.d.ts +91 -0
  104. package/dist/llm/provider.d.ts.map +1 -0
  105. package/dist/llm/provider.js +14 -0
  106. package/dist/llm/provider.js.map +1 -0
  107. package/dist/llm/types.d.ts +25 -0
  108. package/dist/llm/types.d.ts.map +1 -0
  109. package/dist/llm/types.js +7 -0
  110. package/dist/llm/types.js.map +1 -0
  111. package/dist/logging/logger.d.ts +39 -0
  112. package/dist/logging/logger.d.ts.map +1 -0
  113. package/dist/logging/logger.js +279 -0
  114. package/dist/logging/logger.js.map +1 -0
  115. package/dist/logging/loggerInterface.d.ts +33 -0
  116. package/dist/logging/loggerInterface.d.ts.map +1 -0
  117. package/dist/logging/loggerInterface.js +2 -0
  118. package/dist/logging/loggerInterface.js.map +1 -0
  119. package/dist/memory/inMemoryRelationStore.d.ts +51 -0
  120. package/dist/memory/inMemoryRelationStore.d.ts.map +1 -0
  121. package/dist/memory/inMemoryRelationStore.js +65 -0
  122. package/dist/memory/inMemoryRelationStore.js.map +1 -0
  123. package/dist/memory/inMemoryStorage.d.ts +97 -0
  124. package/dist/memory/inMemoryStorage.d.ts.map +1 -0
  125. package/dist/memory/inMemoryStorage.js +177 -0
  126. package/dist/memory/inMemoryStorage.js.map +1 -0
  127. package/dist/memory/loader.d.ts +49 -0
  128. package/dist/memory/loader.d.ts.map +1 -0
  129. package/dist/memory/loader.js +93 -0
  130. package/dist/memory/loader.js.map +1 -0
  131. package/dist/memory/projectManager.d.ts +182 -0
  132. package/dist/memory/projectManager.d.ts.map +1 -0
  133. package/dist/memory/projectManager.js +441 -0
  134. package/dist/memory/projectManager.js.map +1 -0
  135. package/dist/memory/recall.d.ts +77 -0
  136. package/dist/memory/recall.d.ts.map +1 -0
  137. package/dist/memory/recall.js +147 -0
  138. package/dist/memory/recall.js.map +1 -0
  139. package/dist/memory/relationStore.d.ts +78 -0
  140. package/dist/memory/relationStore.d.ts.map +1 -0
  141. package/dist/memory/relationStore.js +2 -0
  142. package/dist/memory/relationStore.js.map +1 -0
  143. package/dist/memory/sessionStore.d.ts +84 -0
  144. package/dist/memory/sessionStore.d.ts.map +1 -0
  145. package/dist/memory/sessionStore.js +2 -0
  146. package/dist/memory/sessionStore.js.map +1 -0
  147. package/dist/memory/storageInterface.d.ts +107 -0
  148. package/dist/memory/storageInterface.d.ts.map +1 -0
  149. package/dist/memory/storageInterface.js +2 -0
  150. package/dist/memory/storageInterface.js.map +1 -0
  151. package/dist/memory/store.d.ts +50 -0
  152. package/dist/memory/store.d.ts.map +1 -0
  153. package/dist/memory/store.js +160 -0
  154. package/dist/memory/store.js.map +1 -0
  155. package/dist/memory/types.d.ts +189 -0
  156. package/dist/memory/types.d.ts.map +1 -0
  157. package/dist/memory/types.js +230 -0
  158. package/dist/memory/types.js.map +1 -0
  159. package/dist/memory/userProfile.d.ts +156 -0
  160. package/dist/memory/userProfile.d.ts.map +1 -0
  161. package/dist/memory/userProfile.js +315 -0
  162. package/dist/memory/userProfile.js.map +1 -0
  163. package/dist/memory/vectorStore.d.ts +75 -0
  164. package/dist/memory/vectorStore.d.ts.map +1 -0
  165. package/dist/memory/vectorStore.js +144 -0
  166. package/dist/memory/vectorStore.js.map +1 -0
  167. package/dist/persona/personaManager.d.ts +121 -0
  168. package/dist/persona/personaManager.d.ts.map +1 -0
  169. package/dist/persona/personaManager.js +349 -0
  170. package/dist/persona/personaManager.js.map +1 -0
  171. package/dist/persona/types.d.ts +32 -0
  172. package/dist/persona/types.d.ts.map +1 -0
  173. package/dist/persona/types.js +5 -0
  174. package/dist/persona/types.js.map +1 -0
  175. package/dist/security/pathGuard.d.ts +121 -0
  176. package/dist/security/pathGuard.d.ts.map +1 -0
  177. package/dist/security/pathGuard.js +276 -0
  178. package/dist/security/pathGuard.js.map +1 -0
  179. package/dist/skill/skillManager.d.ts +82 -0
  180. package/dist/skill/skillManager.d.ts.map +1 -0
  181. package/dist/skill/skillManager.js +198 -0
  182. package/dist/skill/skillManager.js.map +1 -0
  183. package/dist/skill/types.d.ts +28 -0
  184. package/dist/skill/types.d.ts.map +1 -0
  185. package/dist/skill/types.js +5 -0
  186. package/dist/skill/types.js.map +1 -0
  187. package/dist/utils/errors.d.ts +86 -0
  188. package/dist/utils/errors.d.ts.map +1 -0
  189. package/dist/utils/errors.js +143 -0
  190. package/dist/utils/errors.js.map +1 -0
  191. package/dist/utils/eventEmitter.d.ts +87 -0
  192. package/dist/utils/eventEmitter.d.ts.map +1 -0
  193. package/dist/utils/eventEmitter.js +79 -0
  194. package/dist/utils/eventEmitter.js.map +1 -0
  195. package/dist/utils/frontmatter.d.ts +24 -0
  196. package/dist/utils/frontmatter.d.ts.map +1 -0
  197. package/dist/utils/frontmatter.js +44 -0
  198. package/dist/utils/frontmatter.js.map +1 -0
  199. package/dist/utils/json.d.ts +20 -0
  200. package/dist/utils/json.d.ts.map +1 -0
  201. package/dist/utils/json.js +65 -0
  202. package/dist/utils/json.js.map +1 -0
  203. package/dist/utils/loggerHolder.d.ts +37 -0
  204. package/dist/utils/loggerHolder.d.ts.map +1 -0
  205. package/dist/utils/loggerHolder.js +49 -0
  206. package/dist/utils/loggerHolder.js.map +1 -0
  207. package/dist/utils/math.d.ts +5 -0
  208. package/dist/utils/math.d.ts.map +1 -0
  209. package/dist/utils/math.js +19 -0
  210. package/dist/utils/math.js.map +1 -0
  211. package/dist/utils/path.d.ts +28 -0
  212. package/dist/utils/path.d.ts.map +1 -0
  213. package/dist/utils/path.js +33 -0
  214. package/dist/utils/path.js.map +1 -0
  215. package/dist/utils/safeTimer.d.ts +26 -0
  216. package/dist/utils/safeTimer.d.ts.map +1 -0
  217. package/dist/utils/safeTimer.js +49 -0
  218. package/dist/utils/safeTimer.js.map +1 -0
  219. package/dist/utils/scanner.d.ts +54 -0
  220. package/dist/utils/scanner.d.ts.map +1 -0
  221. package/dist/utils/scanner.js +115 -0
  222. package/dist/utils/scanner.js.map +1 -0
  223. package/dist/utils/segmenter.d.ts +30 -0
  224. package/dist/utils/segmenter.d.ts.map +1 -0
  225. package/dist/utils/segmenter.js +80 -0
  226. package/dist/utils/segmenter.js.map +1 -0
  227. package/dist/utils/strings.d.ts +18 -0
  228. package/dist/utils/strings.d.ts.map +1 -0
  229. package/dist/utils/strings.js +25 -0
  230. package/dist/utils/strings.js.map +1 -0
  231. package/dist/utils/time.d.ts +23 -0
  232. package/dist/utils/time.d.ts.map +1 -0
  233. package/dist/utils/time.js +31 -0
  234. package/dist/utils/time.js.map +1 -0
  235. package/dist/utils/toError.d.ts +13 -0
  236. package/dist/utils/toError.d.ts.map +1 -0
  237. package/dist/utils/toError.js +22 -0
  238. package/dist/utils/toError.js.map +1 -0
  239. package/package.json +73 -0
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Agent 模块常量集合
3
+ *
4
+ * 集中管理 agent.ts 与 loop.ts 中的 magic numbers,便于统一调整与审查。
5
+ * 按模块分两个命名空间,不创建全局 constants(避免垃圾桶反模式)。
6
+ *
7
+ * 触发提取的决策记录:A-006(原"暂缓"判断已失效——10 个 magic number 分布在 2 文件,已达提取阈值)。
8
+ */
9
+ /**
10
+ * Agent 门面层常量
11
+ *
12
+ * 用于 agent.ts 中的并发锁、输入限制、记忆衰减周期等。
13
+ */
14
+ export const AGENT_CONSTANTS = {
15
+ /**
16
+ * chat() 并发锁超时(毫秒)。超时后中断 generator 并释放锁。
17
+ *
18
+ * BUG-STREAM-05 修复:原值 300_000(5 分钟)与超时体系不匹配:
19
+ * - chunk 级读超时 30s(openaiCompatible parseSseStream)
20
+ * - LLM 请求超时 120s(LLM_TIMEOUT_MS)
21
+ * - 宿主层无进展兜底 60s(chatHandlers STREAM_NO_PROGRESS_TIMEOUT_MS)
22
+ * 现调整为 180s(LLM 120s + 60s 缓冲),作为所有超时失败后的最后兜底。
23
+ */
24
+ CHAT_LOCK_TIMEOUT_MS: 180_000,
25
+ /** chat() 输入最大长度(字节)。128KB。 */
26
+ CHAT_INPUT_MAX_LENGTH: 128 * 1024,
27
+ /** 记忆衰减执行间隔(毫秒)。1 小时。 */
28
+ DECAY_INTERVAL_MS: 3_600_000,
29
+ /** AgentConfig.maxContextTokens 默认值。120K tokens。 */
30
+ DEFAULT_MAX_CONTEXT_TOKENS: 120_000,
31
+ /** recallExcludeSources 默认值——永久记忆不参与增量召回。 */
32
+ DEFAULT_RECALL_EXCLUDE_SOURCES: ['persona', 'rule', 'skill'],
33
+ };
34
+ /**
35
+ * AgentLoop 引擎层常量
36
+ *
37
+ * 用于 loop.ts 中的 token 估算、召回上下文长度、LLM 重试、循环限制等。
38
+ *
39
+ * 注意:AgentLoop 构造选项中的默认值(maxIterations ?? 20 等)保留在 loop.ts 原地,
40
+ * 因为它们是 API 契约的一部分——调用方期望"未传入时使用默认值"。
41
+ * 这里只提取与 UI/重试/估算相关的纯常量。
42
+ */
43
+ export const LOOP_CONSTANTS = {
44
+ /** 粗略 token 估算:每 token 约 3 字符(非精确 tokenizer)。 */
45
+ CHARS_PER_TOKEN: 3,
46
+ /** 召回记忆注入到上下文的最大字符数。超出会截断。 */
47
+ RECALL_CONTEXT_MAX_CHARS: 2000,
48
+ /** LLM 调用最大重试次数(不含首次调用)。 */
49
+ MAX_LLM_RETRIES: 2,
50
+ /** LLM 重试基础延迟(毫秒),指数退避 base。 */
51
+ RETRY_BASE_DELAY_MS: 1000,
52
+ /** 单次 LLM 请求超时(毫秒)。120 秒。超时后可重试。 */
53
+ LLM_TIMEOUT_MS: 120_000,
54
+ /** 上下文截断时给 LLM 响应预留的缓冲比例。0.9 = 留 10% 给响应。 */
55
+ CONTEXT_TOKENS_BUFFER_RATIO: 0.9,
56
+ /** 摘要缓存 TTL:消息数增长超过此值时缓存过期,需重新生成摘要。 */
57
+ SUMMARY_CACHE_TTL_MSGS: 10,
58
+ /** 召回记忆内容注入上下文时的截断长度(字符)。 */
59
+ RECALL_CONTENT_SLICE: 200,
60
+ /** 上下文摘要:参与摘要的最近消息条数。 */
61
+ SUMMARY_MSG_COUNT: 6,
62
+ /** 上下文摘要:单条消息内容截断长度(字符)。 */
63
+ SUMMARY_CONTENT_SLICE: 200,
64
+ /** 上下文摘要:LLM 调用 maxTokens 参数。 */
65
+ SUMMARY_MAX_TOKENS: 150,
66
+ };
67
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/agent/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B;;;;;;;;OAQG;IACH,oBAAoB,EAAE,OAAO;IAE7B,+BAA+B;IAC/B,qBAAqB,EAAE,GAAG,GAAG,IAAI;IAEjC,yBAAyB;IACzB,iBAAiB,EAAE,SAAS;IAE5B,oDAAoD;IACpD,0BAA0B,EAAE,OAAO;IAEnC,6CAA6C;IAC7C,8BAA8B,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAU;CAC7D,CAAC;AAEX;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,iDAAiD;IACjD,eAAe,EAAE,CAAC;IAElB,8BAA8B;IAC9B,wBAAwB,EAAE,IAAI;IAE9B,4BAA4B;IAC5B,eAAe,EAAE,CAAC;IAElB,gCAAgC;IAChC,mBAAmB,EAAE,IAAI;IAEzB,oCAAoC;IACpC,cAAc,EAAE,OAAO;IAEvB,6CAA6C;IAC7C,2BAA2B,EAAE,GAAG;IAEhC,uCAAuC;IACvC,sBAAsB,EAAE,EAAE;IAE1B,6BAA6B;IAC7B,oBAAoB,EAAE,GAAG;IAEzB,yBAAyB;IACzB,iBAAiB,EAAE,CAAC;IAEpB,4BAA4B;IAC5B,qBAAqB,EAAE,GAAG;IAE1B,iCAAiC;IACjC,kBAAkB,EAAE,GAAG;CACf,CAAC"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * 上下文窗口管理器(从 AgentLoop 提取的独立职责)
3
+ *
4
+ * 职责:
5
+ * 1. token 估算(estimateTokens)
6
+ * 2. 消息截断(truncateMessages)—— 保留下方、裁中间、提取关键消息
7
+ * 3. 关键消息提取(extractKeyMessages)—— 按重要性权重贪心选取
8
+ * 4. 上下文摘要生成(generateContextSummary)—— LLM 生成"遗忘补偿"
9
+ * 5. 摘要缓存管理(getOrCreateSummary)—— 缓存 TTL + 过期重生成
10
+ *
11
+ * 设计理由(QC-R2-08):AgentLoop 1151 行超阈值,上下文管理是独立职责,
12
+ * 拆分后 AgentLoop 聚焦对话循环,ContextManager 聚焦上下文窗口管理。
13
+ *
14
+ * 自然生长原则:ContextManager 不持有 messages 引用(避免与 AgentLoop 状态耦合),
15
+ * 所有方法接收 messages 作为参数,是无状态的纯计算 + 缓存。
16
+ */
17
+ import type { LlmProvider, Message } from '../llm/provider.js';
18
+ /** ContextManager 构造选项 */
19
+ export interface ContextManagerOptions {
20
+ /** 上下文窗口 token 上限 */
21
+ readonly maxContextTokens: number;
22
+ /** LLM Provider(用于生成上下文摘要) */
23
+ readonly provider: LlmProvider;
24
+ /** 截断时生成占位消息的文案函数(来自 UIMessages.contextTruncated) */
25
+ readonly contextTruncatedFn: (skipped: number, kept: number) => string;
26
+ }
27
+ /**
28
+ * 上下文窗口管理器
29
+ *
30
+ * 管理 token 估算、消息截断、摘要生成与缓存。
31
+ * 从 AgentLoop 提取,保持无状态设计(不持有 messages 引用)。
32
+ */
33
+ export declare class ContextManager {
34
+ /** 上下文窗口 token 上限(readonly,构造时传入) */
35
+ private readonly maxContextTokens;
36
+ /** LLM Provider(用于 generateContextSummary) */
37
+ private readonly provider;
38
+ /** 截断占位消息文案函数 */
39
+ private readonly contextTruncatedFn;
40
+ /** 上下文摘要缓存(首次截断后生成,后续截断复用) */
41
+ private contextSummary;
42
+ /** 摘要缓存生成时的消息数量,用于判断缓存是否过期 */
43
+ private contextSummaryMsgCount;
44
+ /** 截断次数统计(truncateMessages 实际触发截断 +1,供 getMetrics 读取) */
45
+ private _truncationCount;
46
+ constructor(opts: ContextManagerOptions);
47
+ /** 截断次数(供 AgentLoop.getMetrics 读取) */
48
+ get truncationCount(): number;
49
+ /**
50
+ * 估算消息数组的 token 数
51
+ *
52
+ * 粗略估算:总字符数 / CHARS_PER_TOKEN(默认 3)。
53
+ * toolCalls 的 JSON 序列化字符数也计入。
54
+ *
55
+ * @param messages 消息数组
56
+ * @returns 估算的 token 数
57
+ */
58
+ estimateTokens(messages: readonly Message[]): number;
59
+ /**
60
+ * 检查是否需要截断(token 超阈值 + 消息数 > 3)
61
+ *
62
+ * @param messages 消息数组
63
+ * @returns 是否需要截断
64
+ */
65
+ shouldTruncate(messages: readonly Message[]): boolean;
66
+ /**
67
+ * 截断消息数组以适配上下文窗口
68
+ *
69
+ * 策略:保留下方、裁中间、提取关键消息。
70
+ * - messages[0](system prompt)始终保留(这是 Agent 的"灵魂")
71
+ * - 从尾部向前取最近的消息对(user + assistant + tool),直到估算 token 接近上限
72
+ * - 从被裁剪的消息中按重要性权重提取关键用户消息,插入到 placeholder 之前
73
+ * - 头部被裁剪的消息替换为一条摘要占位消息
74
+ *
75
+ * 重要性权重:user 消息 > tool 结果 > assistant 回复
76
+ * 被裁剪的用户消息中,内容较长的(信息量大)优先保留
77
+ *
78
+ * 如果 system prompt 本身就超过 maxContextTokens,不做截断(让 LLM API 报错,
79
+ * 开发者需要缩减 bootstrapMemories 或 toolDefinitions)。
80
+ *
81
+ * @param messages 完整消息数组
82
+ * @param summary 可选的上下文摘要(注入到 system prompt 和 placeholder 之间)
83
+ * @returns 截断后的消息数组(可能是原数组引用,无修改时)
84
+ */
85
+ truncateMessages(messages: readonly Message[], summary?: string): readonly Message[];
86
+ /**
87
+ * 从被裁剪的消息中按重要性提取关键消息
88
+ *
89
+ * 重要性权重:
90
+ * - user 消息:权重 3(用户输入信息量最高)
91
+ * - tool 消息:权重 2(工具结果有参考价值)
92
+ * - assistant 消息:权重 1(助手回复可从上下文推断)
93
+ *
94
+ * 贪心选取:按权重降序 + 内容长度降序排列,逐条选取直到 token 用完。
95
+ * 最终按原始顺序返回(保持时间线一致性)。
96
+ *
97
+ * @param cutMessages 被裁剪的消息数组
98
+ * @param availableTokens 可用 token 数
99
+ * @returns 提取的关键消息数组(按原始顺序)
100
+ */
101
+ private extractKeyMessages;
102
+ /**
103
+ * 评估单条消息的重要性权重
104
+ *
105
+ * @param msg 消息
106
+ * @returns 权重值(user=3, tool=2, assistant=1)
107
+ */
108
+ private messageImportance;
109
+ /**
110
+ * 获取或创建上下文摘要(带缓存管理)
111
+ *
112
+ * 缓存 TTL:消息数增长超过 SUMMARY_CACHE_TTL_MSGS 时缓存过期,需重新生成。
113
+ * 首次调用时生成摘要并缓存,后续调用复用缓存直到过期。
114
+ *
115
+ * @param messages 当前消息数组(用于生成摘要和判断缓存过期)
116
+ * @returns 摘要字符串(失败时返回空字符串,降级为无摘要)
117
+ */
118
+ getOrCreateSummary(messages: readonly Message[]): Promise<string>;
119
+ /**
120
+ * 生成上下文摘要(enableContextSummary 时调用)
121
+ *
122
+ * 在首次截断时,提取即将被裁剪的消息中最近几条用户/助手对话,
123
+ * 调用 provider 生成一句摘要,作为"遗忘补偿"注入到 system prompt 中。
124
+ *
125
+ * @param messages 当前消息数组
126
+ * @returns 摘要字符串(失败时返回空字符串,降级为无摘要)
127
+ */
128
+ private generateContextSummary;
129
+ }
130
+ //# sourceMappingURL=contextManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextManager.d.ts","sourceRoot":"","sources":["../../src/agent/contextManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAI9D,0BAA0B;AAC1B,MAAM,WAAW,qBAAqB;IACpC,qBAAqB;IACrB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACxE;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,iBAAiB;IACjB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA4C;IAE/E,8BAA8B;IAC9B,OAAO,CAAC,cAAc,CAAuB;IAC7C,8BAA8B;IAC9B,OAAO,CAAC,sBAAsB,CAAa;IAC3C,yDAAyD;IACzD,OAAO,CAAC,gBAAgB,CAAa;gBAEzB,IAAI,EAAE,qBAAqB;IAMvC,sCAAsC;IACtC,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED;;;;;;;;OAQG;IACH,cAAc,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM;IAapD;;;;;OAKG;IACH,cAAc,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO;IAIrD;;;;;;;;;;;;;;;;;;OAkBG;IACH,gBAAgB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE;IA8FpF;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;;;;;;;OAQG;IACG,kBAAkB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBvE;;;;;;;;OAQG;YACW,sBAAsB;CAoCrC"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * 上下文窗口管理器(从 AgentLoop 提取的独立职责)
3
+ *
4
+ * 职责:
5
+ * 1. token 估算(estimateTokens)
6
+ * 2. 消息截断(truncateMessages)—— 保留下方、裁中间、提取关键消息
7
+ * 3. 关键消息提取(extractKeyMessages)—— 按重要性权重贪心选取
8
+ * 4. 上下文摘要生成(generateContextSummary)—— LLM 生成"遗忘补偿"
9
+ * 5. 摘要缓存管理(getOrCreateSummary)—— 缓存 TTL + 过期重生成
10
+ *
11
+ * 设计理由(QC-R2-08):AgentLoop 1151 行超阈值,上下文管理是独立职责,
12
+ * 拆分后 AgentLoop 聚焦对话循环,ContextManager 聚焦上下文窗口管理。
13
+ *
14
+ * 自然生长原则:ContextManager 不持有 messages 引用(避免与 AgentLoop 状态耦合),
15
+ * 所有方法接收 messages 作为参数,是无状态的纯计算 + 缓存。
16
+ */
17
+ import { LOOP_CONSTANTS } from '../agent/constants.js';
18
+ import { logger } from '../logging/logger.js';
19
+ /**
20
+ * 上下文窗口管理器
21
+ *
22
+ * 管理 token 估算、消息截断、摘要生成与缓存。
23
+ * 从 AgentLoop 提取,保持无状态设计(不持有 messages 引用)。
24
+ */
25
+ export class ContextManager {
26
+ /** 上下文窗口 token 上限(readonly,构造时传入) */
27
+ maxContextTokens;
28
+ /** LLM Provider(用于 generateContextSummary) */
29
+ provider;
30
+ /** 截断占位消息文案函数 */
31
+ contextTruncatedFn;
32
+ /** 上下文摘要缓存(首次截断后生成,后续截断复用) */
33
+ contextSummary = null;
34
+ /** 摘要缓存生成时的消息数量,用于判断缓存是否过期 */
35
+ contextSummaryMsgCount = 0;
36
+ /** 截断次数统计(truncateMessages 实际触发截断 +1,供 getMetrics 读取) */
37
+ _truncationCount = 0;
38
+ constructor(opts) {
39
+ this.maxContextTokens = opts.maxContextTokens;
40
+ this.provider = opts.provider;
41
+ this.contextTruncatedFn = opts.contextTruncatedFn;
42
+ }
43
+ /** 截断次数(供 AgentLoop.getMetrics 读取) */
44
+ get truncationCount() {
45
+ return this._truncationCount;
46
+ }
47
+ /**
48
+ * 估算消息数组的 token 数
49
+ *
50
+ * 粗略估算:总字符数 / CHARS_PER_TOKEN(默认 3)。
51
+ * toolCalls 的 JSON 序列化字符数也计入。
52
+ *
53
+ * @param messages 消息数组
54
+ * @returns 估算的 token 数
55
+ */
56
+ estimateTokens(messages) {
57
+ let totalChars = 0;
58
+ for (const m of messages) {
59
+ // 消息本身的内容字符数
60
+ totalChars += m.content.length;
61
+ // toolCalls 的 JSON 序列化字符数
62
+ if (m.toolCalls) {
63
+ totalChars += JSON.stringify(m.toolCalls).length;
64
+ }
65
+ }
66
+ return Math.ceil(totalChars / LOOP_CONSTANTS.CHARS_PER_TOKEN);
67
+ }
68
+ /**
69
+ * 检查是否需要截断(token 超阈值 + 消息数 > 3)
70
+ *
71
+ * @param messages 消息数组
72
+ * @returns 是否需要截断
73
+ */
74
+ shouldTruncate(messages) {
75
+ return this.estimateTokens(messages) > this.maxContextTokens && messages.length > 3;
76
+ }
77
+ /**
78
+ * 截断消息数组以适配上下文窗口
79
+ *
80
+ * 策略:保留下方、裁中间、提取关键消息。
81
+ * - messages[0](system prompt)始终保留(这是 Agent 的"灵魂")
82
+ * - 从尾部向前取最近的消息对(user + assistant + tool),直到估算 token 接近上限
83
+ * - 从被裁剪的消息中按重要性权重提取关键用户消息,插入到 placeholder 之前
84
+ * - 头部被裁剪的消息替换为一条摘要占位消息
85
+ *
86
+ * 重要性权重:user 消息 > tool 结果 > assistant 回复
87
+ * 被裁剪的用户消息中,内容较长的(信息量大)优先保留
88
+ *
89
+ * 如果 system prompt 本身就超过 maxContextTokens,不做截断(让 LLM API 报错,
90
+ * 开发者需要缩减 bootstrapMemories 或 toolDefinitions)。
91
+ *
92
+ * @param messages 完整消息数组
93
+ * @param summary 可选的上下文摘要(注入到 system prompt 和 placeholder 之间)
94
+ * @returns 截断后的消息数组(可能是原数组引用,无修改时)
95
+ */
96
+ truncateMessages(messages, summary) {
97
+ const estimated = this.estimateTokens(messages);
98
+ if (estimated <= this.maxContextTokens || messages.length <= 3) {
99
+ return messages; // 未超阈值,无需截断
100
+ }
101
+ // system prompt 单独保留
102
+ const systemMsg = messages[0];
103
+ if (!systemMsg || systemMsg.role !== 'system') {
104
+ return messages; // 异常:没有 system prompt,不截断
105
+ }
106
+ const systemTokens = this.estimateTokens([systemMsg]);
107
+ if (systemTokens >= this.maxContextTokens) {
108
+ // system prompt 本身就超了——这是配置问题,不应该截断
109
+ logger.warn({ systemTokens, maxContextTokens: this.maxContextTokens }, 'system prompt 已超过上下文窗口上限,请缩减 bootstrapMemories 或 toolDefinitions');
110
+ return messages;
111
+ }
112
+ // 剩余可用 token 数(留 10% 缓冲给 LLM 响应)
113
+ const availableTokens = Math.floor(this.maxContextTokens * LOOP_CONSTANTS.CONTEXT_TOKENS_BUFFER_RATIO) - systemTokens;
114
+ // 从尾部向前收集消息(最近的最重要)
115
+ const tail = [];
116
+ let tailTokens = 0;
117
+ let cutIndex = messages.length; // 被裁剪区域的起始索引
118
+ for (let i = messages.length - 1; i >= 1; i--) {
119
+ // QC-17 移除非空断言:循环条件保证索引有效,null 检查兜底
120
+ const msg = messages[i];
121
+ if (!msg)
122
+ break;
123
+ const msgTokens = this.estimateTokens([msg]);
124
+ if (tailTokens + msgTokens > availableTokens) {
125
+ cutIndex = i + 1; // cutIndex 是第一条被保留的尾部消息
126
+ break; // 再加这条就超了
127
+ }
128
+ tail.unshift(msg); // 保持顺序:从尾部取,但插入时保持时间顺序
129
+ tailTokens += msgTokens;
130
+ cutIndex = i;
131
+ }
132
+ // 计算被裁剪的消息
133
+ const skipped = cutIndex - 1; // -1 是 system prompt
134
+ if (skipped <= 0) {
135
+ return messages; // 全部保留
136
+ }
137
+ // 截断次数统计:确实发生了截断(skipped > 0)
138
+ this._truncationCount++;
139
+ // 从被裁剪的消息中按重要性提取关键消息
140
+ // 重要性权重:user > tool > assistant;内容较长的用户消息优先
141
+ const cutMessages = messages.slice(1, cutIndex);
142
+ const keyMessages = this.extractKeyMessages(cutMessages, availableTokens - tailTokens);
143
+ // 构造一条占位消息,让 LLM 知道有历史被裁剪了
144
+ const placeholder = {
145
+ role: 'system',
146
+ content: this.contextTruncatedFn(skipped, tail.length),
147
+ };
148
+ const truncated = [systemMsg];
149
+ // 如果有摘要,插入到 system prompt 和 placeholder 之间
150
+ if (summary) {
151
+ truncated.push({ role: 'system', content: summary });
152
+ }
153
+ // 插入从被裁剪区域提取的关键消息
154
+ truncated.push(...keyMessages);
155
+ truncated.push(placeholder);
156
+ truncated.push(...tail);
157
+ const newEstimated = this.estimateTokens(truncated);
158
+ logger.info({
159
+ originalCount: messages.length,
160
+ truncatedCount: truncated.length,
161
+ skipped,
162
+ keyExtracted: keyMessages.length,
163
+ originalTokens: estimated,
164
+ newTokens: newEstimated,
165
+ }, '上下文窗口截断完成');
166
+ return truncated;
167
+ }
168
+ /**
169
+ * 从被裁剪的消息中按重要性提取关键消息
170
+ *
171
+ * 重要性权重:
172
+ * - user 消息:权重 3(用户输入信息量最高)
173
+ * - tool 消息:权重 2(工具结果有参考价值)
174
+ * - assistant 消息:权重 1(助手回复可从上下文推断)
175
+ *
176
+ * 贪心选取:按权重降序 + 内容长度降序排列,逐条选取直到 token 用完。
177
+ * 最终按原始顺序返回(保持时间线一致性)。
178
+ *
179
+ * @param cutMessages 被裁剪的消息数组
180
+ * @param availableTokens 可用 token 数
181
+ * @returns 提取的关键消息数组(按原始顺序)
182
+ */
183
+ extractKeyMessages(cutMessages, availableTokens) {
184
+ if (availableTokens <= 0 || cutMessages.length === 0)
185
+ return [];
186
+ // 计算每条消息的权重和 token 数
187
+ const weighted = cutMessages.map((msg, index) => ({
188
+ msg,
189
+ index, // 原始顺序索引
190
+ weight: this.messageImportance(msg),
191
+ tokens: this.estimateTokens([msg]),
192
+ }));
193
+ // 按权重降序 + 内容长度降序排列
194
+ weighted.sort((a, b) => {
195
+ if (b.weight !== a.weight)
196
+ return b.weight - a.weight;
197
+ return b.msg.content.length - a.msg.content.length;
198
+ });
199
+ // 贪心选取,直到 token 用完
200
+ const selected = [];
201
+ let usedTokens = 0;
202
+ for (const item of weighted) {
203
+ if (usedTokens + item.tokens > availableTokens)
204
+ break;
205
+ selected.push(item);
206
+ usedTokens += item.tokens;
207
+ }
208
+ // 恢复原始顺序(保持时间线一致性)
209
+ selected.sort((a, b) => a.index - b.index);
210
+ return selected.map((item) => item.msg);
211
+ }
212
+ /**
213
+ * 评估单条消息的重要性权重
214
+ *
215
+ * @param msg 消息
216
+ * @returns 权重值(user=3, tool=2, assistant=1)
217
+ */
218
+ messageImportance(msg) {
219
+ if (msg.role === 'user')
220
+ return 3;
221
+ if (msg.role === 'tool')
222
+ return 2;
223
+ return 1;
224
+ }
225
+ /**
226
+ * 获取或创建上下文摘要(带缓存管理)
227
+ *
228
+ * 缓存 TTL:消息数增长超过 SUMMARY_CACHE_TTL_MSGS 时缓存过期,需重新生成。
229
+ * 首次调用时生成摘要并缓存,后续调用复用缓存直到过期。
230
+ *
231
+ * @param messages 当前消息数组(用于生成摘要和判断缓存过期)
232
+ * @returns 摘要字符串(失败时返回空字符串,降级为无摘要)
233
+ */
234
+ async getOrCreateSummary(messages) {
235
+ // 检查缓存是否有效
236
+ const summaryExpired = this.contextSummary !== null &&
237
+ messages.length - this.contextSummaryMsgCount > LOOP_CONSTANTS.SUMMARY_CACHE_TTL_MSGS;
238
+ if (this.contextSummary && !summaryExpired) {
239
+ return this.contextSummary;
240
+ }
241
+ // 生成新摘要
242
+ const summary = await this.generateContextSummary(messages);
243
+ this.contextSummary = summary;
244
+ this.contextSummaryMsgCount = messages.length;
245
+ return summary;
246
+ }
247
+ /**
248
+ * 生成上下文摘要(enableContextSummary 时调用)
249
+ *
250
+ * 在首次截断时,提取即将被裁剪的消息中最近几条用户/助手对话,
251
+ * 调用 provider 生成一句摘要,作为"遗忘补偿"注入到 system prompt 中。
252
+ *
253
+ * @param messages 当前消息数组
254
+ * @returns 摘要字符串(失败时返回空字符串,降级为无摘要)
255
+ */
256
+ async generateContextSummary(messages) {
257
+ const messagesToSummarize = messages.slice(1);
258
+ const recentMessages = messagesToSummarize
259
+ .filter((m) => m.role === 'user' || (m.role === 'assistant' && typeof m.content === 'string'))
260
+ .slice(-LOOP_CONSTANTS.SUMMARY_MSG_COUNT)
261
+ .map((m) => `${m.role}: ${typeof m.content === 'string' ? m.content.substring(0, LOOP_CONSTANTS.SUMMARY_CONTENT_SLICE) : '[tool]'}`)
262
+ .join('\n');
263
+ if (!recentMessages)
264
+ return '';
265
+ try {
266
+ const stream = this.provider.chat([
267
+ {
268
+ role: 'system',
269
+ content: 'Summarize the following conversation excerpt in 1-2 sentences. Focus on key facts, decisions, and user preferences. Be concise.',
270
+ },
271
+ { role: 'user', content: recentMessages },
272
+ ], { maxTokens: LOOP_CONSTANTS.SUMMARY_MAX_TOKENS, temperature: 0 });
273
+ let summary = '';
274
+ for await (const chunk of stream) {
275
+ if (chunk.content)
276
+ summary += chunk.content;
277
+ }
278
+ logger.info({ summaryLength: summary.length }, '上下文摘要已生成');
279
+ return `[Context summary of earlier conversation]\n${summary}`;
280
+ }
281
+ catch (err) {
282
+ logger.warn({ err }, '上下文摘要生成失败,降级为无摘要');
283
+ return '';
284
+ }
285
+ }
286
+ }
287
+ //# sourceMappingURL=contextManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextManager.js","sourceRoot":"","sources":["../../src/agent/contextManager.ts"],"names":[],"mappings":"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"}