aws-runtime-bridge 1.9.10 → 1.9.21

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 (132) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +40 -0
  2. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
  3. package/dist/adapter/AcodeSdkAdapter.js +376 -10
  4. package/dist/adapter/AcodeSdkAdapter.test.js +155 -8
  5. package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
  6. package/dist/adapter/ClaudeSdkAdapter.js +17 -1
  7. package/dist/adapter/CodexSdkAdapter.d.ts.map +1 -1
  8. package/dist/adapter/CodexSdkAdapter.js +15 -1
  9. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
  10. package/dist/adapter/OpencodeSdkAdapter.js +56 -4
  11. package/dist/adapter/instance-ai-config-resolver.d.ts +49 -0
  12. package/dist/adapter/instance-ai-config-resolver.d.ts.map +1 -0
  13. package/dist/adapter/instance-ai-config-resolver.js +46 -0
  14. package/dist/adapter/types.d.ts +29 -2
  15. package/dist/adapter/types.d.ts.map +1 -1
  16. package/dist/index.js +5 -1
  17. package/dist/routes/dashboard.d.ts.map +1 -1
  18. package/dist/routes/dashboard.js +749 -15
  19. package/dist/routes/events.d.ts +7 -0
  20. package/dist/routes/events.d.ts.map +1 -0
  21. package/dist/routes/events.js +22 -0
  22. package/dist/routes/file-browser.d.ts +1 -1
  23. package/dist/routes/file-browser.d.ts.map +1 -1
  24. package/dist/routes/file-browser.js +25 -9
  25. package/dist/routes/file-snapshot.d.ts +10 -0
  26. package/dist/routes/file-snapshot.d.ts.map +1 -0
  27. package/dist/routes/file-snapshot.js +156 -0
  28. package/dist/routes/git.d.ts +10 -0
  29. package/dist/routes/git.d.ts.map +1 -1
  30. package/dist/routes/git.js +405 -2
  31. package/dist/routes/git.test.js +39 -2
  32. package/dist/routes/instance.js +3 -1
  33. package/dist/routes/memory.d.ts +3 -0
  34. package/dist/routes/memory.d.ts.map +1 -1
  35. package/dist/routes/memory.js +3 -0
  36. package/dist/routes/terminal.d.ts +17 -3
  37. package/dist/routes/terminal.d.ts.map +1 -1
  38. package/dist/routes/terminal.js +464 -47
  39. package/dist/routes/terminal.test.js +37 -9
  40. package/dist/services/agent-event-store.d.ts +60 -0
  41. package/dist/services/agent-event-store.d.ts.map +1 -0
  42. package/dist/services/agent-event-store.js +68 -0
  43. package/dist/services/event-delta-pusher.d.ts +40 -0
  44. package/dist/services/event-delta-pusher.d.ts.map +1 -0
  45. package/dist/services/event-delta-pusher.js +95 -0
  46. package/dist/services/fileSnapshotStore.d.ts +96 -0
  47. package/dist/services/fileSnapshotStore.d.ts.map +1 -0
  48. package/dist/services/fileSnapshotStore.js +500 -0
  49. package/dist/services/instance-ai-config-service.d.ts +49 -0
  50. package/dist/services/instance-ai-config-service.d.ts.map +1 -0
  51. package/dist/services/instance-ai-config-service.js +174 -0
  52. package/dist/services/panel-auth.d.ts +8 -0
  53. package/dist/services/panel-auth.d.ts.map +1 -1
  54. package/dist/services/panel-auth.js +8 -0
  55. package/dist/services/ring-buffer.d.ts +67 -0
  56. package/dist/services/ring-buffer.d.ts.map +1 -0
  57. package/dist/services/ring-buffer.js +103 -0
  58. package/dist/services/session-output.d.ts +49 -3
  59. package/dist/services/session-output.d.ts.map +1 -1
  60. package/dist/services/session-output.js +115 -2
  61. package/dist/utils/instance-ai-config-debug-logger.d.ts +37 -0
  62. package/dist/utils/instance-ai-config-debug-logger.d.ts.map +1 -0
  63. package/dist/utils/instance-ai-config-debug-logger.js +63 -0
  64. package/dist/utils/logger.d.ts +18 -0
  65. package/dist/utils/logger.d.ts.map +1 -1
  66. package/dist/utils/logger.js +48 -4
  67. package/package/acode/dist/built-in-file-tools.d.ts +1 -1
  68. package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
  69. package/package/acode/dist/built-in-file-tools.js +5 -3
  70. package/package/acode/dist/builtins/commandArtifacts.d.ts +8 -1
  71. package/package/acode/dist/builtins/commandArtifacts.d.ts.map +1 -1
  72. package/package/acode/dist/builtins/commandArtifacts.js +24 -4
  73. package/package/acode/dist/builtins/shellCommandResult.d.ts +1 -0
  74. package/package/acode/dist/builtins/shellCommandResult.d.ts.map +1 -1
  75. package/package/acode/dist/builtins/shellCommandResult.js +3 -3
  76. package/package/acode/dist/builtins/shellCommandRunner.d.ts +1 -0
  77. package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +1 -1
  78. package/package/acode/dist/builtins/shellCommandRunner.js +1 -0
  79. package/package/acode/dist/builtins/shellOutputDecoder.d.ts +25 -2
  80. package/package/acode/dist/builtins/shellOutputDecoder.d.ts.map +1 -1
  81. package/package/acode/dist/builtins/shellOutputDecoder.js +69 -5
  82. package/package/acode/dist/cli.js +2 -0
  83. package/package/acode/dist/runtime.d.ts.map +1 -1
  84. package/package/acode/dist/runtime.js +156 -5
  85. package/package/acode/dist/types.d.ts +1 -0
  86. package/package/acode/dist/types.d.ts.map +1 -1
  87. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +10 -3
  88. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
  89. package/package/aws-client-agent-mcp/dist/agent-client.js +33 -11
  90. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
  91. package/package/aws-client-agent-mcp/dist/context-manager.d.ts +136 -0
  92. package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -0
  93. package/package/aws-client-agent-mcp/dist/context-manager.js +473 -0
  94. package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -0
  95. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +6 -0
  96. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +1 -0
  97. package/package/aws-client-agent-mcp/dist/context-manager.test.js +307 -0
  98. package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -0
  99. package/package/aws-client-agent-mcp/dist/http-client.d.ts +11 -0
  100. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
  101. package/package/aws-client-agent-mcp/dist/http-client.js +67 -0
  102. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
  103. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +166 -10
  104. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  105. package/package/aws-client-agent-mcp/dist/mcp-server.js +933 -41
  106. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  107. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +150 -130
  108. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  109. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +15 -1
  110. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
  111. package/package/aws-client-agent-mcp/dist/mcp-tools.js +62 -2
  112. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
  113. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +58 -1
  114. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
  115. package/package/aws-client-agent-mcp/dist/memory-store.js +246 -15
  116. package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
  117. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +8 -0
  118. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
  119. package/package/aws-client-agent-mcp/dist/memory-tools.js +106 -2
  120. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
  121. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +7 -1
  122. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
  123. package/package/aws-client-agent-mcp/dist/server-memory-store.js +18 -0
  124. package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
  125. package/package/aws-client-agent-mcp/dist/types.d.ts +103 -2
  126. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  127. package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
  128. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +27 -2
  129. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
  130. package/package/aws-client-agent-mcp/dist/websocket-client.js +123 -5
  131. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
  132. package/package.json +1 -1
@@ -0,0 +1,473 @@
1
+ /**
2
+ * 上下文管理器 — 会话级 Token 追踪、溢出检测与压缩
3
+ *
4
+ * 核心职责:
5
+ * 1. 追踪每轮会话的累计 token 消耗
6
+ * 2. 根据模型上下文窗口判断是否溢出
7
+ * 3. 提供 prune(裁剪旧工具输出)/ summarize(摘要化)两种压缩策略
8
+ * 4. 通过 MemoryStore(session_context) 持久化压缩后的摘要
9
+ *
10
+ * 设计思路(参考 OpenCode compaction.ts):
11
+ * - 保持 20K token 作为缓冲区,避免溢出前措手不及
12
+ * - Prune 从最旧消息开始累计工具输出,超过保护线后标记 compacted
13
+ * - Summarize 将早期对话结构化为摘要存入 session_context memory
14
+ *
15
+ * 关于模型上下文窗口大小:
16
+ * - 当前版本通过模型名查找表获取(见 MODEL_CONTEXT_LIMITS)
17
+ * - 查找不到时默认使用 128K(保守值)
18
+ * - 后续可通过服务端 AiSourceTemplate 扩展 contextLimit/maxOutput 字段
19
+ */
20
+ import { logger } from "./logger.js";
21
+ // ============ 常量 ============
22
+ /**
23
+ * 压缩缓冲区:保留这么多 token 的空闲空间,避免压缩过程中溢出。
24
+ */
25
+ const COMPACTION_BUFFER = 20_000;
26
+ /**
27
+ * Prune 保护线:从最新往旧遍历时,保留最近 PRUNE_PROTECT token 的工具输出完整。
28
+ */
29
+ const PRUNE_PROTECT = 40_000;
30
+ /**
31
+ * Prune 最小收益:累计可释放 token 不足此数时跳过修剪。
32
+ */
33
+ const PRUNE_MINIMUM = 20_000;
34
+ /**
35
+ * 默认保留的完整对话轮次(不被压缩)。
36
+ */
37
+ const DEFAULT_KEEP_TURNS = 3;
38
+ /**
39
+ * 默认上下文窗口上限(查找不到模型时使用)。保守取 128K。
40
+ */
41
+ const DEFAULT_CONTEXT_LIMIT = 128_000;
42
+ /**
43
+ * 默认最大输出 token。
44
+ */
45
+ const DEFAULT_MAX_OUTPUT = 8_192;
46
+ /**
47
+ * 知名模型的上下文窗口大小查找表。
48
+ * 覆盖主流模型。未在此表中的模型回退到 DEFAULT_CONTEXT_LIMIT。
49
+ * 数据来源:各模型官方文档。
50
+ */
51
+ const MODEL_CONTEXT_LIMITS = {
52
+ // Anthropic Claude
53
+ "claude-4": { contextLimit: 200_000, maxOutput: 8_192 },
54
+ "claude-sonnet-4": { contextLimit: 200_000, maxOutput: 8_192 },
55
+ "claude-3-5-sonnet": { contextLimit: 200_000, maxOutput: 8_192 },
56
+ "claude-3-opus": { contextLimit: 200_000, maxOutput: 8_192 },
57
+ "claude-3-haiku": { contextLimit: 200_000, maxOutput: 8_192 },
58
+ "claude-2": { contextLimit: 100_000, maxOutput: 4_096 },
59
+ // OpenAI GPT
60
+ "gpt-4o": { contextLimit: 128_000, maxOutput: 16_384 },
61
+ "gpt-4-turbo": { contextLimit: 128_000, maxOutput: 4_096 },
62
+ "gpt-4": { contextLimit: 8_192, maxOutput: 4_096 },
63
+ "gpt-3.5-turbo": { contextLimit: 16_384, maxOutput: 4_096 },
64
+ "o1": { contextLimit: 200_000, maxOutput: 100_000 },
65
+ "o3-mini": { contextLimit: 200_000, maxOutput: 100_000 },
66
+ // Google Gemini
67
+ "gemini-2.0-flash": { contextLimit: 1_048_576, maxOutput: 8_192 },
68
+ "gemini-2.5-pro": { contextLimit: 1_048_576, maxOutput: 8_192 },
69
+ "gemini-1.5-pro": { contextLimit: 2_097_152, maxOutput: 8_192 },
70
+ "gemini-1.5-flash": { contextLimit: 1_048_576, maxOutput: 8_192 },
71
+ // DeepSeek
72
+ "deepseek": { contextLimit: 64_000, maxOutput: 8_192 },
73
+ "deepseek-chat": { contextLimit: 64_000, maxOutput: 8_192 },
74
+ "deepseek-reasoner": { contextLimit: 64_000, maxOutput: 8_192 },
75
+ // Qwen
76
+ "qwen-max": { contextLimit: 32_000, maxOutput: 8_192 },
77
+ "qwen-plus": { contextLimit: 128_000, maxOutput: 8_192 },
78
+ "qwen-turbo": { contextLimit: 1_000_000, maxOutput: 8_192 },
79
+ // GLM
80
+ "glm-4": { contextLimit: 128_000, maxOutput: 4_096 },
81
+ // Yi
82
+ "yi-": { contextLimit: 200_000, maxOutput: 4_096 },
83
+ // Meta Llama
84
+ "llama-3": { contextLimit: 8_192, maxOutput: 4_096 },
85
+ "llama-2": { contextLimit: 4_096, maxOutput: 4_096 },
86
+ // Mistral
87
+ "mistral": { contextLimit: 32_000, maxOutput: 4_096 },
88
+ "mixtral": { contextLimit: 32_000, maxOutput: 4_096 },
89
+ "codestral": { contextLimit: 256_000, maxOutput: 8_192 },
90
+ // Grok
91
+ "grok": { contextLimit: 131_072, maxOutput: 4_096 },
92
+ // Amazon Nova
93
+ "nova-": { contextLimit: 200_000, maxOutput: 8_192 },
94
+ };
95
+ /**
96
+ * 根据模型名查找上下文窗口大小。
97
+ * 主流程:遍历查找表前缀匹配 → 找到返回 → 未找到返回默认值。
98
+ */
99
+ function lookupModelLimits(modelName) {
100
+ if (!modelName)
101
+ return { contextLimit: DEFAULT_CONTEXT_LIMIT, maxOutput: DEFAULT_MAX_OUTPUT };
102
+ const key = modelName.toLowerCase().trim();
103
+ // 精确匹配优先
104
+ if (MODEL_CONTEXT_LIMITS[key])
105
+ return MODEL_CONTEXT_LIMITS[key];
106
+ // 前缀匹配:按 key 长度降序排序,先匹配更具体的
107
+ const matches = Object.keys(MODEL_CONTEXT_LIMITS)
108
+ .filter((prefix) => key.startsWith(prefix))
109
+ .sort((a, b) => b.length - a.length);
110
+ if (matches.length > 0)
111
+ return MODEL_CONTEXT_LIMITS[matches[0]];
112
+ return { contextLimit: DEFAULT_CONTEXT_LIMIT, maxOutput: DEFAULT_MAX_OUTPUT };
113
+ }
114
+ /**
115
+ * Prune 白名单:这些工具的输出永远不会被裁剪。
116
+ */
117
+ const PRUNE_PROTECTED_TOOLS = new Set(["skill"]);
118
+ // ============ 上下文管理器 ============
119
+ export class ContextManager {
120
+ /** 内存态会话上下文记录,避免每次查询都读磁盘 */
121
+ sessions = new Map();
122
+ memoryStore;
123
+ constructor(memoryStore) {
124
+ this.memoryStore = memoryStore;
125
+ }
126
+ /**
127
+ * 根据模型名查找上下文窗口大小。
128
+ * 公开方法,供外部(如 mcp-server)使用。
129
+ */
130
+ lookupModelLimits(modelName) {
131
+ return lookupModelLimits(modelName);
132
+ }
133
+ // ============ Token 估算 ============
134
+ /**
135
+ * 粗略估算文本的 token 数。
136
+ * 不使用真实 tokenizer(太慢),基于字符数乘经验系数。
137
+ * 对纯 ASCII 约 4 字符/token,对中文约 1.5-2 字符/token。
138
+ */
139
+ estimateTokens(text) {
140
+ if (!text)
141
+ return 0;
142
+ // 区分中文字符(多字节字符)和 ASCII
143
+ let chineseCount = 0;
144
+ let asciiCount = 0;
145
+ for (const ch of text) {
146
+ if (ch > '\u00ff') {
147
+ chineseCount++;
148
+ }
149
+ else {
150
+ asciiCount++;
151
+ }
152
+ }
153
+ // 中文约 1.5 char/token,英文约 4 char/token
154
+ return Math.ceil(chineseCount / 1.5 + asciiCount / 4);
155
+ }
156
+ /**
157
+ * 从 TokenUsage 估算总 token 数。
158
+ */
159
+ estimateTotalUsage(tokens) {
160
+ return tokens.input + tokens.output + (tokens.reasoning ?? 0)
161
+ + (tokens.cache?.read ?? 0) + (tokens.cache?.write ?? 0);
162
+ }
163
+ // ============ 会话记录管理 ============
164
+ /**
165
+ * 获取或创建会话上下文记录。
166
+ */
167
+ async getOrCreateSession(sessionId) {
168
+ const existing = this.sessions.get(sessionId);
169
+ if (existing)
170
+ return existing;
171
+ // 尝试从 MemoryStore 加载
172
+ const loaded = await this.loadFromMemory(sessionId);
173
+ if (loaded) {
174
+ this.sessions.set(sessionId, loaded);
175
+ return loaded;
176
+ }
177
+ // 创建新记录
178
+ const record = {
179
+ sessionId,
180
+ tokens: { totalInput: 0, totalOutput: 0, totalReasoning: 0 },
181
+ lastActivity: new Date().toISOString(),
182
+ compactions: [],
183
+ overflowWarned: false,
184
+ messageCount: 0,
185
+ };
186
+ this.sessions.set(sessionId, record);
187
+ return record;
188
+ }
189
+ /**
190
+ * 记录一次 token 消耗。
191
+ */
192
+ async recordUsage(sessionId, tokens, modelInfo) {
193
+ const session = await this.getOrCreateSession(sessionId);
194
+ const total = this.estimateTotalUsage(tokens);
195
+ // 按比例估算 input/output,不精确但够用
196
+ // 如果没有明确拆分,按 in/out 各半估算
197
+ const inputTokens = tokens.input ?? Math.floor(total * 0.7);
198
+ const outputTokens = tokens.output ?? Math.floor(total * 0.3);
199
+ session.tokens.totalInput += inputTokens;
200
+ session.tokens.totalOutput += outputTokens;
201
+ session.tokens.totalReasoning += tokens.reasoning ?? 0;
202
+ session.lastActivity = new Date().toISOString();
203
+ session.messageCount++;
204
+ if (modelInfo) {
205
+ session.modelInfo = modelInfo;
206
+ }
207
+ // 异步持久化,不阻塞
208
+ this.saveToMemory(session).catch((err) => {
209
+ logger.error("[ContextManager] saveToMemory failed", err);
210
+ });
211
+ }
212
+ /**
213
+ * 判断当前会话是否上下文溢出。
214
+ * 逻辑参考 OpenCode SessionCompaction.isOverflow:
215
+ * - 已用 token >= (contextLimit - maxOutput - COMPACTION_BUFFER)
216
+ */
217
+ async isOverflow(sessionId, modelInfo) {
218
+ const session = await this.getOrCreateSession(sessionId);
219
+ const info = modelInfo ?? session.modelInfo;
220
+ if (!info || !info.contextLimit || info.contextLimit === 0)
221
+ return false;
222
+ const totalUsed = session.tokens.totalInput + session.tokens.totalOutput
223
+ + session.tokens.totalReasoning;
224
+ const maxOutput = info.maxOutput ?? 4096;
225
+ const reserved = Math.min(COMPACTION_BUFFER, maxOutput);
226
+ const usable = info.maxInput
227
+ ? info.maxInput - reserved
228
+ : info.contextLimit - maxOutput;
229
+ return totalUsed >= usable;
230
+ }
231
+ /**
232
+ * 获取当前会话的上下文统计。
233
+ */
234
+ async getStats(sessionId, modelInfo) {
235
+ const session = await this.getOrCreateSession(sessionId);
236
+ const info = modelInfo ?? session.modelInfo;
237
+ const totalUsed = session.tokens.totalInput + session.tokens.totalOutput
238
+ + session.tokens.totalReasoning;
239
+ const contextLimit = info?.contextLimit ?? 128_000;
240
+ const remaining = Math.max(0, contextLimit - totalUsed);
241
+ const usagePercent = contextLimit > 0
242
+ ? Math.round((totalUsed / contextLimit) * 100)
243
+ : 0;
244
+ return {
245
+ totalUsed,
246
+ totalInput: session.tokens.totalInput,
247
+ totalOutput: session.tokens.totalOutput,
248
+ contextLimit,
249
+ remaining,
250
+ usagePercent,
251
+ overflowWarning: await this.isOverflow(sessionId, info),
252
+ lastChecked: new Date().toISOString(),
253
+ };
254
+ }
255
+ // ============ Prune 策略 ============
256
+ /**
257
+ * Prune:从消息列表中裁剪旧工具的输出内容。
258
+ *
259
+ * 算法(参考 OpenCode compaction.ts:50-99):
260
+ * 1. 从最新消息往旧遍历
261
+ * 2. 跳过前 keepLastTurns 轮对话
262
+ * 3. 遇到已有 summary 标记的助手消息就停止
263
+ * 4. 累计已完成工具调用的输出 token
264
+ * 5. 超过 PRUNE_PROTECT 保护线的标记为 compacted
265
+ * 6. 只有收益超过 PRUNE_MINIMUM 才真正执行
266
+ *
267
+ * @param messages 消息列表(从旧到新)
268
+ * @param keepLastTurns 保留最近的完整轮次
269
+ * @returns 修剪结果
270
+ */
271
+ prune(messages, keepLastTurns = DEFAULT_KEEP_TURNS) {
272
+ if (messages.length === 0) {
273
+ return {
274
+ strategy: "prune",
275
+ freedTokens: 0,
276
+ preservedTurns: 0,
277
+ compactedMessages: 0,
278
+ remainingTokens: 0,
279
+ timestamp: new Date().toISOString(),
280
+ };
281
+ }
282
+ let totalFreed = 0;
283
+ let compactedCount = 0;
284
+ let turns = 0;
285
+ let protectedTokens = 0;
286
+ let toCompact = [];
287
+ // 从最新往旧遍历
288
+ for (let i = messages.length - 1; i >= 0; i--) {
289
+ const msg = messages[i];
290
+ // 简单计数:用户消息计为一轮
291
+ if (this.isUserMessage(msg))
292
+ turns++;
293
+ // 保留最近的 keepLastTurns 轮
294
+ if (turns <= keepLastTurns)
295
+ continue;
296
+ // 如果消息已经被 compacted,停止继续往旧遍历
297
+ if (msg.compacted)
298
+ break;
299
+ const estimatedTokens = this.estimateTokens(msg.content);
300
+ protectedTokens += estimatedTokens;
301
+ if (protectedTokens > PRUNE_PROTECT) {
302
+ totalFreed += estimatedTokens;
303
+ toCompact.push(msg);
304
+ }
305
+ }
306
+ // 收益不够大时不执行
307
+ if (totalFreed < PRUNE_MINIMUM) {
308
+ return {
309
+ strategy: "prune",
310
+ freedTokens: 0,
311
+ preservedTurns: Math.min(turns, keepLastTurns),
312
+ compactedMessages: 0,
313
+ remainingTokens: 0,
314
+ timestamp: new Date().toISOString(),
315
+ };
316
+ }
317
+ // 标记 compacted(实际调用者负责持久化)
318
+ for (const msg of toCompact) {
319
+ msg.compacted = true;
320
+ // 保留摘要信息
321
+ if (msg.content.length > 200) {
322
+ msg.compactionSummary = msg.content.slice(0, 200) + "...";
323
+ }
324
+ compactedCount++;
325
+ }
326
+ return {
327
+ strategy: "prune",
328
+ freedTokens: totalFreed,
329
+ preservedTurns: Math.min(turns, keepLastTurns),
330
+ compactedMessages: compactedCount,
331
+ remainingTokens: Math.max(0, protectedTokens - totalFreed),
332
+ timestamp: new Date().toISOString(),
333
+ };
334
+ }
335
+ /**
336
+ * 判断消息是否为"用户消息"(用于轮次计数)。
337
+ * 在 ACode 的上下文中,DirectMessage 我们都是"用户发给 Agent"或"Agent 间"的消息。
338
+ * 简单启发:判断是否有 requireReply 或消息较短(工具输出通常很长)。
339
+ */
340
+ isUserMessage(msg) {
341
+ // DirectMessage 如果没有 requireReply 且内容较短,可能是系统消息
342
+ if ("requireReply" in msg) {
343
+ // requireReply=true 通常是用户消息,或需要 Agent 回复的消息
344
+ // Agent 工具输出通常很长,这里用启发式判断
345
+ return msg.requireReply || msg.content.length < 500;
346
+ }
347
+ // GroupMessage 简单按内容长度判断
348
+ return msg.content.length < 500;
349
+ }
350
+ // ============ 获取压缩摘要 ============
351
+ /**
352
+ * 获取最后一次压缩的摘要(如有)。
353
+ */
354
+ async getCompactionSummary(sessionId) {
355
+ const session = await this.getOrCreateSession(sessionId);
356
+ if (session.compactions.length === 0)
357
+ return null;
358
+ // 读取最近一次摘要
359
+ const uri = `session://compacted/${sessionId}`;
360
+ const memory = await this.memoryStore.readMemory({ uri, memory_type: 'session_context' });
361
+ if (memory && typeof memory.content === 'string') {
362
+ try {
363
+ const parsed = JSON.parse(memory.content);
364
+ return parsed.summary ?? null;
365
+ }
366
+ catch {
367
+ return memory.content.length > 500
368
+ ? memory.content.slice(0, 500) + "..."
369
+ : memory.content;
370
+ }
371
+ }
372
+ return null;
373
+ }
374
+ // ============ 持久化 ============
375
+ /**
376
+ * 将会话上下文记录持久化到 MemoryStore。
377
+ */
378
+ async saveToMemory(session) {
379
+ const uri = `session://tokens/${session.sessionId}`;
380
+ const existing = await this.memoryStore.readMemory({ uri, memory_type: 'session_context' });
381
+ if (existing) {
382
+ await this.memoryStore.updateMemory({
383
+ uri,
384
+ memory_type: 'session_context',
385
+ old_string: existing.content,
386
+ new_string: JSON.stringify(session),
387
+ keywords: ['context', 'token-usage', session.sessionId],
388
+ });
389
+ }
390
+ else {
391
+ await this.memoryStore.createMemory({
392
+ uri,
393
+ memory_type: 'session_context',
394
+ content: JSON.stringify(session),
395
+ keywords: ['context', 'token-usage', session.sessionId],
396
+ });
397
+ }
398
+ }
399
+ /**
400
+ * 从 MemoryStore 加载会话上下文记录。
401
+ */
402
+ async loadFromMemory(sessionId) {
403
+ const uri = `session://tokens/${sessionId}`;
404
+ const memory = await this.memoryStore.readMemory({ uri, memory_type: 'session_context' });
405
+ if (!memory)
406
+ return null;
407
+ try {
408
+ return JSON.parse(memory.content);
409
+ }
410
+ catch {
411
+ logger.warn("[ContextManager] Failed to parse session context from memory", { sessionId });
412
+ return null;
413
+ }
414
+ }
415
+ /**
416
+ * 保存压缩结果到 MemoryStore。
417
+ */
418
+ async saveCompactionResult(sessionId, result) {
419
+ const session = await this.getOrCreateSession(sessionId);
420
+ session.compactions.push({
421
+ timestamp: result.timestamp,
422
+ strategy: result.strategy,
423
+ freedTokens: result.freedTokens,
424
+ messageCount: result.compactedMessages,
425
+ });
426
+ // 保存压缩摘要
427
+ if (result.summary) {
428
+ const uri = `session://compacted/${sessionId}`;
429
+ const existing = await this.memoryStore.readMemory({ uri, memory_type: 'session_context' });
430
+ const content = JSON.stringify({ summary: result.summary, timestamp: result.timestamp });
431
+ if (existing) {
432
+ await this.memoryStore.updateMemory({
433
+ uri,
434
+ memory_type: 'session_context',
435
+ old_string: existing.content,
436
+ new_string: content,
437
+ keywords: ['context', 'compacted', sessionId],
438
+ });
439
+ }
440
+ else {
441
+ await this.memoryStore.createMemory({
442
+ uri,
443
+ memory_type: 'session_context',
444
+ content,
445
+ keywords: ['context', 'compacted', sessionId],
446
+ });
447
+ }
448
+ }
449
+ // 重置溢出警告
450
+ session.overflowWarned = false;
451
+ await this.saveToMemory(session);
452
+ }
453
+ /**
454
+ * 重置溢出警告状态。
455
+ */
456
+ async resetOverflowWarning(sessionId) {
457
+ const session = await this.getOrCreateSession(sessionId);
458
+ session.overflowWarned = false;
459
+ await this.saveToMemory(session);
460
+ }
461
+ /**
462
+ * 清空内存态记录(进程退出或会话切换时调用)。
463
+ */
464
+ clearSession(sessionId) {
465
+ if (sessionId) {
466
+ this.sessions.delete(sessionId);
467
+ }
468
+ else {
469
+ this.sessions.clear();
470
+ }
471
+ }
472
+ }
473
+ //# sourceMappingURL=context-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../src/context-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 上下文管理器单元测试
3
+ * 验证 token 估算、溢出检测、prune 策略的核心逻辑
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=context-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manager.test.d.ts","sourceRoot":"","sources":["../src/context-manager.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}