aws-runtime-bridge 1.9.21 → 1.9.30

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 (54) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +3 -0
  2. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
  3. package/dist/adapter/AcodeSdkAdapter.js +9 -0
  4. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
  5. package/dist/adapter/OpencodeSdkAdapter.js +11 -3
  6. package/dist/adapter/types.d.ts +6 -0
  7. package/dist/adapter/types.d.ts.map +1 -1
  8. package/dist/routes/git.d.ts +42 -2
  9. package/dist/routes/git.d.ts.map +1 -1
  10. package/dist/routes/git.js +580 -61
  11. package/dist/routes/git.test.js +171 -6
  12. package/dist/routes/terminal.d.ts.map +1 -1
  13. package/dist/routes/terminal.js +175 -0
  14. package/package/acode/dist/runtime.d.ts.map +1 -1
  15. package/package/acode/dist/runtime.js +19 -5
  16. package/package/acode/dist/types.d.ts +6 -0
  17. package/package/acode/dist/types.d.ts.map +1 -1
  18. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +6 -0
  19. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
  20. package/package/aws-client-agent-mcp/dist/agent-client.js +15 -0
  21. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
  22. package/package/aws-client-agent-mcp/dist/context-manager.test.js +4 -1
  23. package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -1
  24. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +69 -6
  25. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  26. package/package/aws-client-agent-mcp/dist/mcp-server.js +374 -105
  27. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  28. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +12 -3
  29. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  30. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +17 -1
  31. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
  32. package/package/aws-client-agent-mcp/dist/mcp-tools.js +44 -8
  33. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
  34. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +49 -2
  35. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
  36. package/package/aws-client-agent-mcp/dist/memory-store.js +116 -14
  37. package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
  38. package/package/aws-client-agent-mcp/dist/memory-store.test.js +82 -5
  39. package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -1
  40. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +11 -1
  41. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
  42. package/package/aws-client-agent-mcp/dist/memory-tools.js +37 -11
  43. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
  44. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +10 -1
  45. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
  46. package/package/aws-client-agent-mcp/dist/server-memory-store.js +16 -4
  47. package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
  48. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -1
  49. package/package/aws-client-agent-mcp/dist/status-reporter.js +0 -1
  50. package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -1
  51. package/package/aws-client-agent-mcp/dist/types.d.ts +9 -0
  52. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  53. package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
  54. package/package.json +1 -1
@@ -4,7 +4,7 @@ import { tmpdir } from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { promisify } from 'node:util';
6
6
  import { describe, expect, it, vi } from 'vitest';
7
- import { callAiForCommitMessage, createAgentsWorkStashSnapshotRef, createScopedFilePathspecArgs, createScopedGitPathspecArgs, mergeGitDiffSummaryFiles, normalizeGitCommitMessage, parseGitDiffSummary, parseGitStashListLine, parseGitStatusStagedPaths, parseLatestGitStash, persistAgentsWorkStashSnapshotRef, } from './git.js';
7
+ import { callAiForCommitMessage, createAgentsWorkStashSnapshotRef, createScopedFilePathspecArgs, createScopedGitPathspecArgs, extractOpenAiStreamDelta, mergeGitDiffSummaryFiles, normalizeGitCommitMessage, parseGitDiffSummary, parseGitStashListLine, sanitizeCommitMessage, streamAiForCommitMessage, parseGitStatusStagedPaths, parseLatestGitStash, persistAgentsWorkStashSnapshotRef, } from './git.js';
8
8
  const execFileAsync = promisify(execFile);
9
9
  async function runGit(cwd, args) {
10
10
  const result = await execFileAsync('git', [...args], { cwd });
@@ -134,14 +134,24 @@ describe('callAiForCommitMessage', () => {
134
134
  const result = await callAiForCommitMessage('https://api.openai.com/v1', 'sk-test-key', 'gpt-4o', 'diff content here');
135
135
  expect(result).toBe('feat(readme): add new section');
136
136
  });
137
- it('should return fallback message when AI response content is empty', async () => {
137
+ it('should return fallback commit message when AI response content is empty', async () => {
138
138
  const mockResponse = { data: { choices: [{ message: { content: '' } }] } };
139
139
  const axiosModule = await import('axios');
140
140
  vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce(mockResponse);
141
141
  const result = await callAiForCommitMessage('https://api.openai.com/v1', 'sk-test-key', 'gpt-4o', 'diff content here');
142
- expect(result).toBe('AI 生成失败:返回内容为空');
142
+ // 空响应走 sanitize 兜底
143
+ expect(result).toBe('chore: update staged changes');
143
144
  });
144
- it('should use correct API endpoint and headers', async () => {
145
+ it('should sanitize away meta-language prefixes from AI response', async () => {
146
+ const mockResponse = {
147
+ data: { choices: [{ message: { content: '我们被问到根据 diff 生成提交信息:feat(readme): 新增 README 章节' } }] }
148
+ };
149
+ const axiosModule = await import('axios');
150
+ vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce(mockResponse);
151
+ const result = await callAiForCommitMessage('https://api.openai.com/v1', 'sk-test-key', 'gpt-4o', 'diff content here');
152
+ expect(result).toBe('feat(readme): 新增 README 章节');
153
+ });
154
+ it('should use correct API endpoint, headers and tightened limits', async () => {
145
155
  const axiosModule = await import('axios');
146
156
  const postSpy = vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce({
147
157
  data: { choices: [{ message: { content: 'test message' } }] },
@@ -149,12 +159,13 @@ describe('callAiForCommitMessage', () => {
149
159
  await callAiForCommitMessage('https://custom.ai.com/api/v1', 'sk-custom-key', 'custom-model', 'test diff');
150
160
  expect(postSpy).toHaveBeenCalledWith('https://custom.ai.com/api/v1/chat/completions', expect.objectContaining({
151
161
  model: 'custom-model',
162
+ stream: false,
152
163
  messages: expect.arrayContaining([
153
164
  expect.objectContaining({ role: 'system' }),
154
165
  expect.objectContaining({ role: 'user' }),
155
166
  ]),
156
- max_tokens: 300,
157
- temperature: 0.3,
167
+ max_tokens: 200,
168
+ temperature: 0.2,
158
169
  }), expect.objectContaining({
159
170
  headers: expect.objectContaining({
160
171
  'Content-Type': 'application/json',
@@ -163,3 +174,157 @@ describe('callAiForCommitMessage', () => {
163
174
  }));
164
175
  });
165
176
  });
177
+ describe('sanitizeCommitMessage', () => {
178
+ it('returns a clean commit message unchanged', () => {
179
+ expect(sanitizeCommitMessage('feat(api): 增加用户登录接口')).toBe('feat(api): 增加用户登录接口');
180
+ });
181
+ it('strips "我们被问到" style meta-language prefix', () => {
182
+ expect(sanitizeCommitMessage('我们被问到根据 diff 生成提交信息:feat(api): 增加用户登录接口'))
183
+ .toBe('feat(api): 增加用户登录接口');
184
+ });
185
+ it('strips "好的" / "Sure" / "Here is" prefixes', () => {
186
+ expect(sanitizeCommitMessage('好的,以下是提交信息:feat(api): xxx')).toBe('feat(api): xxx');
187
+ expect(sanitizeCommitMessage('Sure, here is your commit message:\nfeat(api): xxx'))
188
+ .toBe('feat(api): xxx');
189
+ });
190
+ it('strips "根据" / "以下是" Chinese meta-language prefixes', () => {
191
+ expect(sanitizeCommitMessage('根据您提供的 diff,以下是符合 conventional commit 规范的提交信息:feat(api): xxx'))
192
+ .toBe('feat(api): xxx');
193
+ expect(sanitizeCommitMessage('以下是生成的提交信息:fix(api): xxx')).toBe('fix(api): xxx');
194
+ });
195
+ it('strips markdown code block fences', () => {
196
+ expect(sanitizeCommitMessage('```text\nfeat(api): xxx\n```')).toBe('feat(api): xxx');
197
+ });
198
+ it('truncates at first blank line to drop meta-language body', () => {
199
+ expect(sanitizeCommitMessage('feat(api): xxx\n\n我们刚才生成的提交信息是上面这一行'))
200
+ .toBe('feat(api): xxx');
201
+ });
202
+ it('keeps only the first line when the first line is suspiciously long', () => {
203
+ const long = 'a'.repeat(150);
204
+ expect(sanitizeCommitMessage(`${long}\n\nbody content`)).toBe(long);
205
+ });
206
+ it('returns fallback when input is empty after sanitization', () => {
207
+ expect(sanitizeCommitMessage('')).toBe('chore: update staged changes');
208
+ expect(sanitizeCommitMessage(' \n\n ')).toBe('chore: update staged changes');
209
+ });
210
+ it('returns fallback for pure meta-language output', () => {
211
+ // 反复剥离前缀后为空 → 兜底
212
+ expect(sanitizeCommitMessage('我们被问到根据 diff 生成提交信息,好的以下是:'))
213
+ .toBe('chore: update staged changes');
214
+ });
215
+ it('handles loose type style without scope', () => {
216
+ expect(sanitizeCommitMessage('fix: 修复登录问题')).toBe('fix: 修复登录问题');
217
+ expect(sanitizeCommitMessage('feat: 新增用户功能')).toBe('feat: 新增用户功能');
218
+ });
219
+ it('handles loose type style without space after colon', () => {
220
+ expect(sanitizeCommitMessage('chore:更新依赖')).toBe('chore:更新依赖');
221
+ });
222
+ it('preserves Chinese-only description without conventional type', () => {
223
+ expect(sanitizeCommitMessage('添加用户登录功能')).toBe('添加用户登录功能');
224
+ expect(sanitizeCommitMessage('修复登录页面样式问题')).toBe('修复登录页面样式问题');
225
+ });
226
+ it('preserves English commit description without conventional type', () => {
227
+ expect(sanitizeCommitMessage('Add user login feature')).toBe('Add user login feature');
228
+ expect(sanitizeCommitMessage('Fix login page styling')).toBe('Fix login page styling');
229
+ });
230
+ it('strips meta prefix before loose type pattern', () => {
231
+ expect(sanitizeCommitMessage('我们被问到根据 diff 生成提交信息,以下是:fix: 修复 bug'))
232
+ .toBe('fix: 修复 bug');
233
+ });
234
+ it('strips meta prefix before Chinese-only description', () => {
235
+ expect(sanitizeCommitMessage('我们被问到根据 diff 生成的提交信息是:添加新功能'))
236
+ .toBe('添加新功能');
237
+ expect(sanitizeCommitMessage('好的,以下是:更新用户配置'))
238
+ .toBe('更新用户配置');
239
+ });
240
+ });
241
+ describe('extractOpenAiStreamDelta', () => {
242
+ it('extracts content from a single SSE data line', () => {
243
+ const chunk = 'data: {"choices":[{"delta":{"content":"feat"}}]}';
244
+ expect(extractOpenAiStreamDelta(chunk)).toBe('feat');
245
+ });
246
+ it('returns empty string for [DONE] sentinel', () => {
247
+ expect(extractOpenAiStreamDelta('data: [DONE]')).toBe('');
248
+ });
249
+ it('skips non-data lines and aggregates multiple data lines', () => {
250
+ const chunk = [
251
+ 'event: message',
252
+ 'data: {"choices":[{"delta":{"content":"feat"}}]}',
253
+ 'data: {"choices":[{"delta":{"content":"(api)"}}]}',
254
+ '',
255
+ ].join('\n');
256
+ expect(extractOpenAiStreamDelta(chunk)).toBe('feat(api)');
257
+ });
258
+ it('skips invalid JSON lines without throwing', () => {
259
+ const chunk = 'data: not-valid-json\ndata: {"choices":[{"delta":{"content":"x"}}]}';
260
+ expect(extractOpenAiStreamDelta(chunk)).toBe('x');
261
+ });
262
+ it('returns empty when no data lines present', () => {
263
+ expect(extractOpenAiStreamDelta('event: foo\n')).toBe('');
264
+ });
265
+ });
266
+ describe('streamAiForCommitMessage', () => {
267
+ it('emits deltas and returns sanitized final message', async () => {
268
+ const { Readable } = await import('node:stream');
269
+ const sseChunks = [
270
+ 'data: {"choices":[{"delta":{"content":"feat"}}]}\n\n',
271
+ 'data: {"choices":[{"delta":{"content":"(api):"}}]}\n\n',
272
+ 'data: {"choices":[{"delta":{"content":" 增加用户登录"}}]}\n\n',
273
+ 'data: [DONE]\n\n',
274
+ ];
275
+ const stream = Readable.from(sseChunks.map(c => Buffer.from(c, 'utf8')));
276
+ const axiosModule = await import('axios');
277
+ vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce({ data: stream });
278
+ const deltas = [];
279
+ const final = await streamAiForCommitMessage('https://api.openai.com/v1', 'sk-test', 'gpt-4o', 'diff', (delta) => { deltas.push(delta); });
280
+ expect(deltas.join('')).toBe('feat(api): 增加用户登录');
281
+ expect(final).toBe('feat(api): 增加用户登录');
282
+ });
283
+ it('returns fallback when stream produces no content', async () => {
284
+ const { Readable } = await import('node:stream');
285
+ const stream = Readable.from([
286
+ Buffer.from('data: [DONE]\n\n', 'utf8'),
287
+ ]);
288
+ const axiosModule = await import('axios');
289
+ vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce({ data: stream });
290
+ const final = await streamAiForCommitMessage('https://api.openai.com/v1', 'sk-test', 'gpt-4o', 'diff', () => { });
291
+ expect(final).toBe('chore: update staged changes');
292
+ });
293
+ it('strips meta-language prefix from accumulated stream', async () => {
294
+ const { Readable } = await import('node:stream');
295
+ // 模型边输出边"思考",先说废话,后输出真实 commit
296
+ const sseChunks = [
297
+ 'data: {"choices":[{"delta":{"content":"我们被问到"}}]}\n\n',
298
+ 'data: {"choices":[{"delta":{"content":"根据 diff"}}]}\n\n',
299
+ 'data: {"choices":[{"delta":{"content":",feat(api): 增加用户"}}]}\n\n',
300
+ 'data: [DONE]\n\n',
301
+ ];
302
+ const stream = Readable.from(sseChunks.map(c => Buffer.from(c, 'utf8')));
303
+ const axiosModule = await import('axios');
304
+ vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce({ data: stream });
305
+ const accumulatedMessages = [];
306
+ const final = await streamAiForCommitMessage('https://api.openai.com/v1', 'sk-test', 'gpt-4o', 'diff', (_delta, accumulated) => { accumulatedMessages.push(accumulated); });
307
+ // 最终应只剩 commit message
308
+ expect(final).toBe('feat(api): 增加用户');
309
+ // 倒数几次 onDelta 调用中应该已经能拿到清洗后的结果
310
+ expect(accumulatedMessages[accumulatedMessages.length - 1]).toBe('feat(api): 增加用户');
311
+ });
312
+ it('uses streaming parameters in the request', async () => {
313
+ const { Readable } = await import('node:stream');
314
+ const stream = Readable.from([Buffer.from('data: [DONE]\n\n', 'utf8')]);
315
+ const axiosModule = await import('axios');
316
+ const postSpy = vi.spyOn(axiosModule.default, 'post').mockResolvedValueOnce({ data: stream });
317
+ await streamAiForCommitMessage('https://api.openai.com/v1', 'sk-test', 'gpt-4o', 'diff', () => { });
318
+ expect(postSpy).toHaveBeenCalledWith('https://api.openai.com/v1/chat/completions', expect.objectContaining({
319
+ model: 'gpt-4o',
320
+ stream: true,
321
+ max_tokens: 200,
322
+ temperature: 0.2,
323
+ }), expect.objectContaining({
324
+ responseType: 'stream',
325
+ headers: expect.objectContaining({
326
+ Accept: 'text/event-stream',
327
+ }),
328
+ }));
329
+ });
330
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"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"}
@@ -56,6 +56,129 @@ function sanitizeInstanceAiConfig(value) {
56
56
  }
57
57
  const AI_REQUEST_HEADERS_MARKER = "\n\n请求头:\n";
58
58
  const startingAgents = new Set();
59
+ // ============ 启动记忆加载 ============
60
+ /**
61
+ * 从工作区的 .agentswork/memory/ 目录加载 task_list 和 recently_memory,
62
+ * 格式化为可注入 System 3 的文本。
63
+ *
64
+ * 主流程:遍历目录下所有 domain JSON 文件 -> 提取 task_list/recently_memory 记录 ->
65
+ * 按类型分组排序 -> 返回格式化文本;目录不存在或解析失败时返回 undefined。
66
+ */
67
+ async function loadAgentStartupMemories(workspacePath, options) {
68
+ // 收集记录
69
+ const taskList = [];
70
+ const recentMemories = [];
71
+ // 1) 尝试从本地 .agentswork/memory/ 加载
72
+ const memoryDir = path.join(workspacePath, ".agentswork", "memory");
73
+ try {
74
+ const entries = await fs.readdir(memoryDir);
75
+ const jsonFiles = entries.filter(e => e.endsWith(".json"));
76
+ // 并行读取所有 JSON 文件,消除 N+1 串行 I/O
77
+ const parsedResults = await Promise.all(jsonFiles.map(async (entry) => {
78
+ try {
79
+ const raw = await fs.readFile(path.join(memoryDir, entry), "utf-8");
80
+ return JSON.parse(raw);
81
+ }
82
+ catch {
83
+ log.warn("[loadAgentStartupMemories] Failed to parse memory file: %s", path.join(memoryDir, entry));
84
+ return null;
85
+ }
86
+ }));
87
+ // 汇总解析结果
88
+ for (const parsed of parsedResults) {
89
+ if (!parsed?.by_uri)
90
+ continue;
91
+ for (const record of Object.values(parsed.by_uri)) {
92
+ const type = record.memory_type || "memory";
93
+ const content = (record.content || "").trim();
94
+ if (!content)
95
+ continue;
96
+ if (type === "task_list") {
97
+ taskList.push({ title: record.title, content, uri: record.uri || "" });
98
+ }
99
+ else if (type === "recently_memory") {
100
+ recentMemories.push({ title: record.title, content, uri: record.uri || "" });
101
+ }
102
+ }
103
+ }
104
+ }
105
+ catch {
106
+ // 目录不存在(首次启动正常)或权限拒绝等错误,记录 debug 日志便于排障
107
+ log.debug("[loadAgentStartupMemories] 无法读取记忆目录: %s", memoryDir);
108
+ }
109
+ // 2) 本地未找到且 server 地址可用时,尝试从 server MCP 加载
110
+ if (taskList.length === 0 && recentMemories.length === 0
111
+ && options?.schedulerBaseUrl && options?.runtimeAccessToken && options?.agentId) {
112
+ const mcpUrl = `${options.schedulerBaseUrl.replace(/\/+$/, "")}/mcp/call`;
113
+ const headers = {
114
+ "Content-Type": "application/json",
115
+ "X-Runtime-Token": options.runtimeAccessToken,
116
+ Authorization: `Bearer ${options.runtimeAccessToken}`,
117
+ };
118
+ // 并行请求 task_list 和 recently_memory
119
+ const typesToFetch = ["task_list", "recently_memory"];
120
+ const results = await Promise.allSettled(typesToFetch.map((memoryType) => fetch(mcpUrl, {
121
+ method: "POST",
122
+ headers,
123
+ body: JSON.stringify({
124
+ tool: "list_memories",
125
+ arguments: { agentId: options.agentId, memory_type: memoryType },
126
+ }),
127
+ }).then((r) => {
128
+ if (!r.ok)
129
+ throw new Error(`Server returned ${r.status}`);
130
+ return r.json();
131
+ })));
132
+ for (let i = 0; i < results.length; i++) {
133
+ const settled = results[i];
134
+ if (settled.status !== "fulfilled")
135
+ continue;
136
+ const records = settled.value;
137
+ if (!Array.isArray(records))
138
+ continue;
139
+ const target = typesToFetch[i] === "task_list" ? taskList : recentMemories;
140
+ for (const r of records) {
141
+ const content = (r.content || "").trim();
142
+ if (!content)
143
+ continue;
144
+ target.push({ title: r.title, content, uri: r.uri || "" });
145
+ }
146
+ }
147
+ if (taskList.length > 0 || recentMemories.length > 0) {
148
+ log.info(`[loadAgentStartupMemories] Loaded ${taskList.length} task(s) and ${recentMemories.length} memory(s) from server for ${options.agentId}`);
149
+ }
150
+ }
151
+ // 3) 格式化输出
152
+ const MAX_PER_TYPE = 10;
153
+ taskList.sort((a, b) => b.uri.localeCompare(a.uri));
154
+ recentMemories.sort((a, b) => b.uri.localeCompare(a.uri));
155
+ const sections = [];
156
+ if (taskList.length > 0) {
157
+ const items = taskList.slice(0, MAX_PER_TYPE);
158
+ const lines = items.map((t, i) => {
159
+ const titleLine = t.title ? `【${t.title}】` : `待办 ${i + 1}`;
160
+ return `${titleLine}\n${t.content}`;
161
+ });
162
+ sections.push(`【短期任务清单】\n${lines.join("\n\n")}`);
163
+ if (taskList.length > MAX_PER_TYPE) {
164
+ sections.push(`... 及另外 ${taskList.length - MAX_PER_TYPE} 条任务`);
165
+ }
166
+ }
167
+ if (recentMemories.length > 0) {
168
+ const items = recentMemories.slice(0, MAX_PER_TYPE);
169
+ const lines = items.map((t) => {
170
+ const titleLine = t.title ? `【${t.title}】` : "";
171
+ return titleLine ? `${titleLine}\n${t.content}` : t.content;
172
+ });
173
+ sections.push(`【近期记忆】\n${lines.join("\n\n")}`);
174
+ if (recentMemories.length > MAX_PER_TYPE) {
175
+ sections.push(`... 及另外 ${recentMemories.length - MAX_PER_TYPE} 条近期记忆`);
176
+ }
177
+ }
178
+ if (sections.length === 0)
179
+ return undefined;
180
+ return sections.join("\n\n");
181
+ }
59
182
  export function resolveRuntimeContextResetSupport(providerId, hasResetContext) {
60
183
  if (providerId !== "acode") {
61
184
  return {
@@ -1297,6 +1420,10 @@ terminalRouter.post("/start", validateToken, async (req, res) => {
1297
1420
  */
1298
1421
  async function startSdkSession(req, res) {
1299
1422
  const { agentId, workspacePath, command, autoAccept = true, initialPrompt,
1423
+ // 系统提示词(SDK 原生注入为 role=system,不再混入 initialPrompt)
1424
+ systemPrompt,
1425
+ // 三层 system messages(ACode 使用独立字段,三方 SDK 合并为 systemPrompt)
1426
+ globalPrompt, rolePrompt, memory,
1300
1427
  // MCP 配置 - 加载 aws-client-agent-mcp
1301
1428
  mcpConfigPath, extraMcpServers, envOverrides,
1302
1429
  // 空闲命令配置
@@ -1449,6 +1576,50 @@ async function startSdkSession(req, res) {
1449
1576
  },
1450
1577
  });
1451
1578
  }
1579
+ // 三层 system messages 路由:
1580
+ // ACode → 作为独立字段传入,runtime 构造三条 system 消息
1581
+ // 三方 SDK → 合并到 systemPrompt 一条字符串
1582
+ let resolvedSystemPrompt = systemPrompt || undefined;
1583
+ let resolvedGlobalPrompt;
1584
+ let resolvedRolePrompt;
1585
+ let resolvedMemory;
1586
+ if (providerId === "acode") {
1587
+ // ACode:分传三个字段(memory 自动从工作区加载)
1588
+ resolvedGlobalPrompt = typeof globalPrompt === "string" ? globalPrompt.trim() || undefined : undefined;
1589
+ resolvedRolePrompt = typeof rolePrompt === "string" ? rolePrompt.trim() || undefined : undefined;
1590
+ if (typeof memory === "string" && memory.trim()) {
1591
+ resolvedMemory = memory.trim();
1592
+ }
1593
+ else {
1594
+ // 未显式传入 memory 时,从工作区自动加载短期记忆和近期记忆
1595
+ const autoMemory = await loadAgentStartupMemories(workspacePath, {
1596
+ schedulerBaseUrl: requestedSchedulerBaseUrl,
1597
+ runtimeAccessToken,
1598
+ agentId: normalizedAgentId,
1599
+ });
1600
+ if (autoMemory) {
1601
+ resolvedMemory = autoMemory;
1602
+ log.info(`[startSdkSession] Auto-loaded memories for ACode agent ${normalizedAgentId}`);
1603
+ }
1604
+ }
1605
+ }
1606
+ else {
1607
+ // 三方 SDK:如果传入了结构化字段则合并到 systemPrompt
1608
+ const hasExtraPrompts = typeof globalPrompt === "string" && globalPrompt.trim() ||
1609
+ typeof rolePrompt === "string" && rolePrompt.trim() ||
1610
+ typeof memory === "string" && memory.trim();
1611
+ if (hasExtraPrompts) {
1612
+ const mergedParts = [
1613
+ globalPrompt,
1614
+ rolePrompt,
1615
+ memory,
1616
+ systemPrompt,
1617
+ ]
1618
+ .filter((p) => typeof p === "string" && p.trim().length > 0)
1619
+ .map((p) => p.trim());
1620
+ resolvedSystemPrompt = mergedParts.length > 0 ? mergedParts.join("\n\n") : undefined;
1621
+ }
1622
+ }
1452
1623
  // 构建SDK配置
1453
1624
  const config = {
1454
1625
  command: command || "acode",
@@ -1456,6 +1627,10 @@ async function startSdkSession(req, res) {
1456
1627
  agentId: normalizedAgentId,
1457
1628
  autoAccept: Boolean(autoAccept),
1458
1629
  initialPrompt,
1630
+ systemPrompt: resolvedSystemPrompt,
1631
+ ...(resolvedGlobalPrompt !== undefined ? { globalPrompt: resolvedGlobalPrompt } : {}),
1632
+ ...(resolvedRolePrompt !== undefined ? { rolePrompt: resolvedRolePrompt } : {}),
1633
+ ...(resolvedMemory !== undefined ? { memory: resolvedMemory } : {}),
1459
1634
  model: resolvedModel,
1460
1635
  // MCP 配置:不再默认注入 aws-mcp;由用户在面板中安装/配置
1461
1636
  // ACode 场景下,per-instance acode.json 已由 instance-ai-config-service 写入
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmB3C,OAAO,KAAK,EAOV,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAksCpB,qBAAa,YAAa,SAAQ,YAAY;IAsChC,OAAO,CAAC,QAAQ,CAAC,MAAM;IArCnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,mBAAmB,CAAqB;IAEhD,OAAO,CAAC,KAAK,CAoBX;IAEF,OAAO,CAAC,eAAe,CAAgC;IAEvD,OAAO,CAAC,WAAW,CAAoC;IAEvD,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;gBAExB,MAAM,EAAE,kBAAkB;IAevD,OAAO,CAAC,cAAc;IAatB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoG5B;;;;OAIG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5C;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC,OAAO,CAAC,gBAAgB;YAIV,aAAa;IAoO3B,oDAAoD;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,uCAAuC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B3B,OAAO,CAAC,kBAAkB;YAaZ,YAAY;YAyJZ,qBAAqB;YAmLrB,wBAAwB;YA8ExB,eAAe;YAqSf,sBAAsB;IA6CpC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;YAQX,oCAAoC;IAsBlD,OAAO,CAAC,uBAAuB;YAuBjB,iBAAiB;IA2C/B,OAAO,CAAC,kBAAkB;YA2BZ,oBAAoB;CAiBnC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmB3C,OAAO,KAAK,EAOV,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAksCpB,qBAAa,YAAa,SAAQ,YAAY;IAsChC,OAAO,CAAC,QAAQ,CAAC,MAAM;IArCnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,mBAAmB,CAAqB;IAEhD,OAAO,CAAC,KAAK,CAoBX;IAEF,OAAO,CAAC,eAAe,CAAgC;IAEvD,OAAO,CAAC,WAAW,CAAoC;IAEvD,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;gBAExB,MAAM,EAAE,kBAAkB;IAevD,OAAO,CAAC,cAAc;IAatB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqH5B;;;;OAIG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5C;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC,OAAO,CAAC,gBAAgB;YAIV,aAAa;IAoO3B,oDAAoD;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,uCAAuC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B3B,OAAO,CAAC,kBAAkB;YAaZ,YAAY;YAyJZ,qBAAqB;YAmLrB,wBAAwB;YA8ExB,eAAe;YAqSf,sBAAsB;IA6CpC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;YAQX,oCAAoC;IAsBlD,OAAO,CAAC,uBAAuB;YAuBjB,iBAAiB;IA2C/B,OAAO,CAAC,kBAAkB;YA2BZ,oBAAoB;CAiBnC"}
@@ -911,13 +911,27 @@ export class ACodeRuntime extends EventEmitter {
911
911
  const commandRegistry = new ACodeCommandRegistry(commands);
912
912
  const skillPrompt = buildSkillPrompt(skills);
913
913
  const commandPrompt = buildCommandPrompt(commands);
914
- const systemPrompt = [provider.systemPrompt, skillPrompt, commandPrompt]
914
+ // 构造多条 system 消息:
915
+ // System 1: globalPrompt(全局提示词)
916
+ // System 2: rolePrompt(角色提示词)
917
+ // System 3: memory(短期+近期记忆)
918
+ // System 4: provider.systemPrompt + skillPrompt + commandPrompt(合并的运行时指令)
919
+ const runtimePrompt = [provider.systemPrompt, skillPrompt, commandPrompt]
915
920
  .map((item) => item?.trim())
916
921
  .filter((item) => Boolean(item))
917
922
  .join("\n\n");
918
- const initialConversation = systemPrompt
919
- ? [{ role: "system", content: systemPrompt }]
920
- : [];
923
+ // 辅助函数:将非空文本构造为 system role 消息,消除重复的 spread+ternary 模式
924
+ const makeSystem = (content) => content?.trim() ? [{ role: 'system', content: content.trim() }] : [];
925
+ const initialConversation = [
926
+ ...makeSystem(this.config.globalPrompt),
927
+ ...makeSystem(this.config.rolePrompt),
928
+ ...makeSystem(this.config.memory),
929
+ ...(runtimePrompt ? [{ role: 'system', content: runtimePrompt }] : []),
930
+ ];
931
+ const systemMessagesPlainText = initialConversation
932
+ .map((m) => m.content)
933
+ .filter(Boolean)
934
+ .join("\n\n");
921
935
  this.initialConversation = cloneChatConversation(initialConversation);
922
936
  this.state = {
923
937
  started: true,
@@ -941,7 +955,7 @@ export class ACodeRuntime extends EventEmitter {
941
955
  workingDirectory: this.config.workingDirectory,
942
956
  model: provider.model,
943
957
  commandCount: commands.length,
944
- estimatedContextTokens: estimateContextTokens(systemPrompt, exposedTools),
958
+ estimatedContextTokens: estimateContextTokens(systemMessagesPlainText, exposedTools),
945
959
  });
946
960
  this.emitAcodeEvent("mcp_status", {
947
961
  configPath: this.config.configPath,
@@ -93,6 +93,12 @@ export interface ACodeRuntimeConfig {
93
93
  initialPrompt?: string;
94
94
  model?: string;
95
95
  systemPrompt?: string;
96
+ /** 全局提示词(System 1) */
97
+ globalPrompt?: string;
98
+ /** 角色提示词(System 2) */
99
+ rolePrompt?: string;
100
+ /** 记忆内容(System 3) */
101
+ memory?: string;
96
102
  env?: Record<string, string>;
97
103
  commandDirs?: string[];
98
104
  hooks?: ACodeHookHandler[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE;QACT,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,EACN;QACE,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;YAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;YACjB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;YAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;YAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;YAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC;YACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;SACxB,CAAC;QACF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CACF,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,YAAY,GACZ,gBAAgB,GAChB,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,YAAY,GACZ,cAAc,GACd,SAAS,GACT,eAAe,GACf,kBAAkB,GAClB,OAAO,CAAC;AAEZ,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,mBAAmB,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,MAAM,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,KAAK,EAAE,cAAc,KAClB,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;AAExE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACrC;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,OAAO,CAAC;CAC7B"}
@@ -83,6 +83,12 @@ export declare class AgentClient {
83
83
  sendGroupMessage(content: string, projectName?: string, roomId?: string): Promise<SendMessageResult>;
84
84
  /**
85
85
  * 发送私信
86
+ *
87
+ * waitReply=true(调用式)时使用 callToolOnce 替代 callTool,原因:
88
+ * - callTool 的全局 HTTP 超时固定为 120s(DEFAULT_MCP_HTTP_REQUEST_TIMEOUT_MS),
89
+ * 无法匹配服务端 sendCallAndWaitReply 的较长等待时间
90
+ * - callTool 的重试循环(累计最多重试 30s)在服务端排队 503 时还可能额外拖累
91
+ * - callToolOnce 无自动重试、支持自定义超时,与服务端阻塞等待语义一致
86
92
  */
87
93
  sendDirectMessage(targetId: string, content: string, waitReply?: boolean, replyToCallId?: string, timeoutMs?: number): Promise<SendDmResult>;
88
94
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"agent-client.d.ts","sourceRoot":"","sources":["../src/agent-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-client.d.ts","sourceRoot":"","sources":["../src/agent-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EACV,WAAW,EAEX,aAAa,EAEb,iBAAiB,EACjB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EAGpB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,oBAAoB,EAEpB,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;AAE5D,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,mBAAmB,CAA6B;IAExD;;;OAGG;IACH,OAAO,CAAC,aAAa,CAA4B;;IAW3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBjC,OAAO,CAAC,uBAAuB;IAuC/B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAUzC,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;YACW,2BAA2B;IAuCzC;;OAEG;YACW,kBAAkB;IAsChC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBjC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IASvD;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAUvD;;;OAGG;IACG,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAW3E;;;OAGG;IACG,mBAAmB,CACvB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,eAAe,CAAC;IAW3B;;;OAGG;IACG,mBAAmB,CAAC,CAAC,GAAG,OAAO,EACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;IAQb;;;OAGG;IACG,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE;;;;;OAKG;IACG,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC;IAgB7B;;;;;;;;OAQG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,UAAQ,EACjB,aAAa,CAAC,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;IAkCxB;;OAEG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,SAAQ,GAChB,OAAO,CAAC,aAAa,CAAC;IAgBzB;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC;IAIxB;;OAEG;IACG,YAAY,CAChB,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,SAAK,EACV,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC;IAgB7B;;OAEG;IACG,eAAe,CACnB,KAAK,SAAK,EACV,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC;IAwDhC;;;;OAIG;IACG,mBAAmB,CACvB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,oBAAoB,CAAC;IAmEhC;;;;;OAKG;YACW,+BAA+B;IAsB7C;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAUlC;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;YAa1B,mBAAmB;IAQjC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAOtC;;;OAGG;IACG,yBAAyB,CAC7B,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,OAAO,CAAC;IAYnB;;OAEG;IACG,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC;IASnB;;;OAGG;IACG,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQpE;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQtE;;OAEG;IACG,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQxE;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASlE;;OAEG;IACG,aAAa,CACjB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC;IAWnB;;OAEG;IACH,KAAK,CACH,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,cAAc,CAAA;KAAE,GAChE,IAAI;IAsCP;;OAEG;IACH,IAAI,IAAI,IAAI;YASE,WAAW;IAazB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,mBAAmB;IAO3B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;YA6BX,cAAc;IAyC5B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,KAAK;IAMb;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIzC,QAAQ;;;;;;;IAUR,cAAc,IAAI,WAAW;IAI7B,YAAY,IAAI,IAAI;IAQpB;;;OAGG;IACH,iBAAiB,IAAI,IAAI;IAKzB;;;OAGG;IACH,gBAAgB,IAAI,IAAI;IAKxB;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;;OAGG;IACG,6BAA6B,CACjC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAyDhB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAuBhC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,iBAAiB,IAAI,cAAc,GAAG,IAAI;CAG3C"}
@@ -249,6 +249,12 @@ export class AgentClient {
249
249
  }
250
250
  /**
251
251
  * 发送私信
252
+ *
253
+ * waitReply=true(调用式)时使用 callToolOnce 替代 callTool,原因:
254
+ * - callTool 的全局 HTTP 超时固定为 120s(DEFAULT_MCP_HTTP_REQUEST_TIMEOUT_MS),
255
+ * 无法匹配服务端 sendCallAndWaitReply 的较长等待时间
256
+ * - callTool 的重试循环(累计最多重试 30s)在服务端排队 503 时还可能额外拖累
257
+ * - callToolOnce 无自动重试、支持自定义超时,与服务端阻塞等待语义一致
252
258
  */
253
259
  async sendDirectMessage(targetId, content, waitReply = false, replyToCallId, timeoutMs) {
254
260
  this.ensureRegistered();
@@ -263,6 +269,15 @@ export class AgentClient {
263
269
  if (typeof timeoutMs === "number" && timeoutMs > 0) {
264
270
  args.timeoutMs = timeoutMs;
265
271
  }
272
+ if (waitReply) {
273
+ // 调用式:使用 callToolOnce 避免全局 120s 超时截断服务端等待。
274
+ // HTTP 超时 = 用户指定的 timeoutMs + 30s 缓冲,确保服务端正常返回前不会提前 abort;
275
+ // 用户未指定时默认 5 分钟(与服务端默认阻塞超时大致对齐)。
276
+ const httpTimeoutMs = typeof timeoutMs === "number" && timeoutMs > 0
277
+ ? timeoutMs + 30_000
278
+ : 300_000;
279
+ return await this.httpClient.callToolOnce("send_dm", args, httpTimeoutMs);
280
+ }
266
281
  return await this.httpClient.callTool("send_dm", args);
267
282
  }
268
283
  /**