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.
- package/dist/adapter/AcodeSdkAdapter.d.ts +3 -0
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/AcodeSdkAdapter.js +9 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/OpencodeSdkAdapter.js +11 -3
- package/dist/adapter/types.d.ts +6 -0
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/routes/git.d.ts +42 -2
- package/dist/routes/git.d.ts.map +1 -1
- package/dist/routes/git.js +580 -61
- package/dist/routes/git.test.js +171 -6
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +175 -0
- package/package/acode/dist/runtime.d.ts.map +1 -1
- package/package/acode/dist/runtime.js +19 -5
- package/package/acode/dist/types.d.ts +6 -0
- package/package/acode/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +6 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +15 -0
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +4 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +69 -6
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +374 -105
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +12 -3
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +17 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +44 -8
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +49 -2
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +116 -14
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.js +82 -5
- package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +11 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +37 -11
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +10 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +16 -4
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +9 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
- package/package.json +1 -1
package/dist/routes/git.test.js
CHANGED
|
@@ -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
|
-
|
|
142
|
+
// 空响应走 sanitize 兜底
|
|
143
|
+
expect(result).toBe('chore: update staged changes');
|
|
143
144
|
});
|
|
144
|
-
it('should
|
|
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:
|
|
157
|
-
temperature: 0.
|
|
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":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAMxC,OAAO,EAEN,KAAK,oBAAoB,EAKzB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAO5B,MAAM,qBAAqB,CAAC;AAU7B,OAAO,EACN,KAAK,qBAAqB,EAK1B,MAAM,+BAA+B,CAAC;AAUvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,eAAO,MAAM,cAAc,4CAAW,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACnC;AAGD,eAAO,MAAM,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAa,CAAC;AAiCnE,MAAM,WAAW,kBAAkB;IAClC,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,0BAA0B,GACnC;IAAE,SAAS,EAAE,IAAI,CAAA;CAAE,GACnB;IAAE,SAAS,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAMxC,OAAO,EAEN,KAAK,oBAAoB,EAKzB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAO5B,MAAM,qBAAqB,CAAC;AAU7B,OAAO,EACN,KAAK,qBAAqB,EAK1B,MAAM,+BAA+B,CAAC;AAUvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,eAAO,MAAM,cAAc,4CAAW,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACnC;AAGD,eAAO,MAAM,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAa,CAAC;AAiCnE,MAAM,WAAW,kBAAkB;IAClC,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,0BAA0B,GACnC;IAAE,SAAS,EAAE,IAAI,CAAA;CAAE,GACnB;IAAE,SAAS,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAiJ3D,wBAAgB,iCAAiC,CAChD,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,OAAO,GACtB,0BAA0B,CAgB5B;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB,CAmBzE;AAED,wBAAgB,wBAAwB,CAAC,UAAU,CAAC,EAAE,uBAAuB;;;;cAiB5E;AAED,wBAAgB,+BAA+B,CAC9C,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,uBAAuB,GAClC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,uBAAuB,CAAA;CAAE,CAa1D;AA0BD,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,MAAM,EACf,GAAG,OAAa,GACd,MAAM,CAoBR;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAW/D;AAED,wBAAgB,kCAAkC,CACjD,UAAU,EAAE,MAAM,EAClB,SAAS,SAA+C,GACtD,MAAM,CAER;AAED,wBAAgB,oCAAoC,CACnD,SAAS,SAAyC,GAChD,MAAM,CAIR;AAcD;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIpE;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC5C,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,MAAM,CAQR;AAED;;GAEG;AACH,UAAU,qBAAqB;IAC9B,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,CAAC;CACxF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAC1C,QAAQ,SAAkC,GACxC,qBAAqB,CAYvB;AAoDD;;GAEG;AACH,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,qBAAqB,GAAG,WAAW,EAC5C,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,UAAQ,GACT,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CACjD,OAAO,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,GAAG,SAAS,CAmB3B;AAoDD;;;GAGG;AACH,wBAAgB,8BAA8B,CAC7C,aAAa,CAAC,EAAE,MAAM,EACtB,oBAAoB,CAAC,EAAE,MAAM,EAC7B,wBAAwB,CAAC,EAAE,MAAM,GAC/B,MAAM,CAkBR;AAED,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,YAAY,GAAG,aAAa,GAAG,UAAU,GAAG,qBAAqB,CAAC;CAC1E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC5C,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,EAC3C,YAAY,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAA0B,GACvD,6BAA6B,CAc/B;AAqCD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAErE;AAuPD,wBAAgB,eAAe,CAC9B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,EAAE,MAAM,CAAC,UAAU,EAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+BxB;AAYD;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAY5E;AAED,MAAM,WAAW,sBAAsB;IACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAC1C,iBAAiB,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EACvE,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3C,sBAAsB,CAyBxB;AAoDD;;;GAGG;AACH,wBAAgB,iCAAiC,CAChD,KAAK,EAAE,aAAa,GAClB,uBAAuB,GAAG,SAAS,CAyCrC;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CA4B7E;AAED,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,aAAa,GAClB,qBAAqB,CAavB;AA0QD,wBAAgB,qCAAqC,CACpD,KAAK,EAAE,aAAa,EACpB,oBAAoB,CAAC,EAAE,MAAM,GAE3B;IACA,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,uBAAuB,CAAC;CACpC,GACD,SAAS,CA6EX;AA6JD,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7D"}
|
package/dist/routes/terminal.js
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
|
|
919
|
-
|
|
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(
|
|
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":"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"}
|
|
@@ -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":"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
|
|
1
|
+
{"version":3,"file":"agent-client.d.ts","sourceRoot":"","sources":["../src/agent-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
/**
|