aws-runtime-bridge 1.6.14 → 1.7.1

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 (25) hide show
  1. package/dist/routes/terminal.d.ts.map +1 -1
  2. package/dist/routes/terminal.js +60 -9
  3. package/dist/services/terminal-persistence.d.ts.map +1 -1
  4. package/dist/services/terminal-persistence.js +9 -11
  5. package/dist/services/terminal-persistence.test.js +8 -1
  6. package/package/aws-client-agent-mcp/dist/http-client.d.ts +1 -1
  7. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
  8. package/package/aws-client-agent-mcp/dist/http-client.js +1 -1
  9. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
  10. package/package/aws-client-agent-mcp/dist/logger.d.ts.map +1 -1
  11. package/package/aws-client-agent-mcp/dist/logger.js +3 -1
  12. package/package/aws-client-agent-mcp/dist/logger.js.map +1 -1
  13. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +59 -0
  14. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  15. package/package/aws-client-agent-mcp/dist/mcp-server.js +202 -2
  16. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  17. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +236 -0
  18. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  19. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +32 -0
  20. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
  21. package/package/aws-client-agent-mcp/dist/mcp-tools.js +162 -0
  22. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
  23. package/package/aws-client-agent-mcp/dist/types.d.ts +1 -2
  24. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  25. package/package.json +1 -1
@@ -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;AAKxC,OAAO,EAEL,KAAK,oBAAoB,EAEzB,KAAK,aAAa,EAInB,MAAM,qBAAqB,CAAC;AAc7B,eAAO,MAAM,cAAc,4CAAW,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC9B,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;CACb;AAGD,eAAO,MAAM,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAa,CAAC;AAenE;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpE;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAMR;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,SAAkC,GAAG,WAAW,CAMnG;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,UAAQ,GAAG,MAAM,CAQnG;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAiB7F;AA0CD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAErE;AAyGD,wBAAgB,eAAe,CAC7B,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,GACrC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+BxB;AA8BD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAU7E;AAYD,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7D"}
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;AAKxC,OAAO,EAEL,KAAK,oBAAoB,EAEzB,KAAK,aAAa,EAInB,MAAM,qBAAqB,CAAC;AAc7B,eAAO,MAAM,cAAc,4CAAW,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC9B,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;CACb;AAGD,eAAO,MAAM,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAa,CAAC;AAgBnE;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpE;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAMR;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,SAAkC,GAAG,WAAW,CAMnG;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,UAAQ,GAAG,MAAM,CAQnG;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAiB7F;AAiED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAErE;AAyGD,wBAAgB,eAAe,CAC7B,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,GACrC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+BxB;AA8BD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAU7E;AAYD,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7D"}
@@ -17,11 +17,12 @@ import { getAgentProcessManager } from '../services/agent-process-manager.js';
17
17
  import { enqueueMcpLaunchBinding } from '../services/mcp-launch-binding-queue.js';
18
18
  import { findClaudeCodeProcesses } from '../services/process-detector.js';
19
19
  import { sendOutput, sendQuestionRequest, sendStatus } from '../services/session-output.js';
20
- import { removePersistedSession, removePersistedSessionByAgentId, savePersistedSessions, updatePersistedSessionAutoCommands, upsertPersistedSession, } from '../services/terminal-persistence.js';
20
+ import { findPersistedSessionByAgentId, removePersistedSession, savePersistedSessions, updatePersistedSessionAutoCommands, upsertPersistedSession, } from '../services/terminal-persistence.js';
21
21
  export const terminalRouter = Router();
22
22
  // 导出 SDK 会话存储,供其他模块使用(如 sessions.ts)
23
23
  export const sdkSessions = new Map();
24
24
  const TOOL_RESULT_PREVIEW_MAX_LENGTH = 4000;
25
+ const startingAgents = new Set();
25
26
  const terminalCommandStates = new Map();
26
27
  const DEFAULT_WINDOWS_TERMINAL_OUTPUT_ENCODING = 'gb18030';
27
28
  const DEFAULT_TERMINAL_OUTPUT_ENCODING = 'utf-8';
@@ -96,6 +97,27 @@ function getTerminalCommandState(entry) {
96
97
  terminalCommandStates.set(entry.sessionId, state);
97
98
  return state;
98
99
  }
100
+ function findActiveSdkSessionByAgentId(agentId) {
101
+ for (const entry of sdkSessions.values()) {
102
+ if (entry.agentId === agentId) {
103
+ return entry;
104
+ }
105
+ }
106
+ return undefined;
107
+ }
108
+ async function buildExistingSessionResponse(entry) {
109
+ const adapter = adapterRegistry.get(entry.providerId || 'claude-code');
110
+ return {
111
+ sessionId: entry.sessionId,
112
+ status: adapter.getSessionStatus(entry.sessionId) || 'running',
113
+ agentId: entry.agentId,
114
+ workspacePath: entry.workspacePath,
115
+ command: entry.config.command,
116
+ mode: 'sdk',
117
+ providerSessionId: adapter.getProviderSessionId(entry.sessionId),
118
+ reused: true,
119
+ };
120
+ }
99
121
  function stopTerminalCommandProcess(sessionId) {
100
122
  const state = terminalCommandStates.get(sessionId);
101
123
  if (!state?.runningProcess) {
@@ -374,9 +396,38 @@ async function startSdkSession(req, res) {
374
396
  // 空闲命令配置
375
397
  idleInputAutoCommand, nonInputAutoCommand, } = req.body || {};
376
398
  let sessionId = null;
377
- let agentForCleanup = null;
399
+ const normalizedAgentId = String(agentId || '').trim();
378
400
  try {
379
401
  ensureAdapterInitialized();
402
+ if (!normalizedAgentId) {
403
+ res.status(400).json({ error: 'agentId is required' });
404
+ return;
405
+ }
406
+ const activeSession = findActiveSdkSessionByAgentId(normalizedAgentId);
407
+ if (activeSession) {
408
+ res.json(await buildExistingSessionResponse(activeSession));
409
+ return;
410
+ }
411
+ const persistedSession = await findPersistedSessionByAgentId(normalizedAgentId);
412
+ if (persistedSession) {
413
+ res.json({
414
+ sessionId: persistedSession.sessionId,
415
+ status: persistedSession.status,
416
+ agentId: persistedSession.agentId,
417
+ workspacePath: persistedSession.workspacePath,
418
+ command: persistedSession.command,
419
+ mode: persistedSession.mode || 'sdk',
420
+ pid: persistedSession.pid,
421
+ reused: true,
422
+ persistedOnly: true,
423
+ });
424
+ return;
425
+ }
426
+ if (startingAgents.has(normalizedAgentId)) {
427
+ res.status(409).json({ error: 'SDK session is already starting for this agent' });
428
+ return;
429
+ }
430
+ startingAgents.add(normalizedAgentId);
380
431
  // 根据命令选择对应的 adapter
381
432
  const normalizedCommand = (command || 'claude').toLowerCase();
382
433
  const providerId = resolveSdkProviderId(command);
@@ -384,7 +435,6 @@ async function startSdkSession(req, res) {
384
435
  console.log(`[Runtime] ★★★ SDK启动 ★★★ command="${command}", normalizedCommand="${normalizedCommand}", providerId="${providerId}"`);
385
436
  const adapter = adapterRegistry.get(providerId);
386
437
  sessionId = uuidv4();
387
- agentForCleanup = agentId;
388
438
  // 构建SDK配置
389
439
  const config = {
390
440
  command: command || 'claude',
@@ -398,7 +448,7 @@ async function startSdkSession(req, res) {
398
448
  };
399
449
  // 存储会话信息
400
450
  sdkSessions.set(sessionId, {
401
- agentId,
451
+ agentId: normalizedAgentId,
402
452
  workspacePath,
403
453
  sessionId,
404
454
  config,
@@ -447,7 +497,7 @@ async function startSdkSession(req, res) {
447
497
  if (sdkPid) {
448
498
  const processManager = getAgentProcessManager();
449
499
  await processManager.startProcess({
450
- agentId,
500
+ agentId: normalizedAgentId,
451
501
  sessionId,
452
502
  pid: sdkPid,
453
503
  mode: 'sdk',
@@ -477,12 +527,14 @@ async function startSdkSession(req, res) {
477
527
  sdkSessions.delete(sessionId);
478
528
  await removePersistedSession(sessionId);
479
529
  }
480
- if (agentForCleanup) {
481
- await removePersistedSessionByAgentId(agentForCleanup);
482
- }
483
530
  const errorMessage = error instanceof Error ? error.message : String(error);
484
531
  res.status(500).json({ error: `Failed to start SDK session: ${errorMessage}` });
485
532
  }
533
+ finally {
534
+ if (normalizedAgentId) {
535
+ startingAgents.delete(normalizedAgentId);
536
+ }
537
+ }
486
538
  }
487
539
  // ============ SDK 专用路由 ============
488
540
  /**
@@ -800,7 +852,6 @@ terminalRouter.post('/stop', validateToken, async (req, res) => {
800
852
  sdkSessions.delete(sessionId);
801
853
  stopTerminalCommandProcess(sessionId);
802
854
  await removePersistedSession(sessionId);
803
- await removePersistedSessionByAgentId(agentId);
804
855
  const processManager = getAgentProcessManager();
805
856
  await processManager.removeProcess(agentId);
806
857
  await sendStatus(agentId, null, 'stopped');
@@ -1 +1 @@
1
- {"version":3,"file":"terminal-persistence.d.ts","sourceRoot":"","sources":["../../src/services/terminal-persistence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA6BpD;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAOzE;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvF;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrF;AAED;;;;GAIG;AACH,wBAAsB,kCAAkC,CACtD,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;IAAE,oBAAoB,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB7E;AAED;;;;;GAKG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAGvC;AAED;;;;;GAKG;AACH,wBAAsB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpF"}
1
+ {"version":3,"file":"terminal-persistence.d.ts","sourceRoot":"","sources":["../../src/services/terminal-persistence.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA8BpD;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAOzE;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvF;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQrF;AAED;;;;GAIG;AACH,wBAAsB,kCAAkC,CACtD,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;IAAE,oBAAoB,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB7E;AAED;;;;;GAKG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAKvC;AAED;;;;;GAKG;AACH,wBAAsB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpF"}
@@ -3,9 +3,9 @@
3
3
  *
4
4
  * 管理终端会话元数据的持久化存储
5
5
  */
6
- import path from 'node:path';
7
- import os from 'node:os';
8
6
  import { promises as fs } from 'node:fs';
7
+ import os from 'node:os';
8
+ import path from 'node:path';
9
9
  import { atomicWriteJsonFile, withFileLock } from '../utils/file-utils.js';
10
10
  import { createLogger } from '../utils/logger.js';
11
11
  const log = createLogger('terminal-persistence');
@@ -69,14 +69,10 @@ export async function savePersistedSessions(sessions) {
69
69
  */
70
70
  export async function upsertPersistedSession(session) {
71
71
  await updatePersistedSessions((sessions) => {
72
- const runningSessions = sessions.filter(s => s.status === 'running');
73
- const index = runningSessions.findIndex(s => s.sessionId === session.sessionId);
74
- if (index >= 0) {
75
- runningSessions[index] = session;
76
- }
77
- else {
78
- runningSessions.push(session);
79
- }
72
+ const runningSessions = sessions
73
+ .filter(s => s.status === 'running')
74
+ .filter(s => s.sessionId !== session.sessionId && s.agentId !== session.agentId);
75
+ runningSessions.push(session);
80
76
  return runningSessions;
81
77
  });
82
78
  }
@@ -129,7 +125,9 @@ export async function removePersistedSession(sessionId) {
129
125
  */
130
126
  export async function findPersistedSessionByAgentId(agentId) {
131
127
  const sessions = await loadPersistedSessions();
132
- return sessions.find(s => s.agentId === agentId);
128
+ return sessions
129
+ .filter(s => s.agentId === agentId)
130
+ .sort((a, b) => String(b.startedAt || '').localeCompare(String(a.startedAt || '')))[0];
133
131
  }
134
132
  /**
135
133
  * 根据 agentId 移除持久化会话
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Terminal Persistence 服务单元测试
3
3
  */
4
- import path from 'node:path';
5
4
  import { promises as fs } from 'node:fs';
5
+ import path from 'node:path';
6
6
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
7
7
  const tmpRoot = path.join(process.cwd(), '.tmp-vitest-terminal-persistence');
8
8
  vi.mock('node:os', () => ({
@@ -110,6 +110,13 @@ describe('terminal-persistence service', () => {
110
110
  };
111
111
  expect(parseSessions('invalid json')).toEqual([]);
112
112
  });
113
+ it('keeps a single running session per agent when upserting', async () => {
114
+ await persistence.upsertPersistedSession(makeSession('session-old', 'agent-1'));
115
+ await persistence.upsertPersistedSession(makeSession('session-new', 'agent-1'));
116
+ const sessions = await persistence.loadPersistedSessions();
117
+ expect(sessions).toHaveLength(1);
118
+ expect(sessions[0].sessionId).toBe('session-new');
119
+ });
113
120
  it('serializes concurrent upserts without losing sessions', async () => {
114
121
  await Promise.all([
115
122
  persistence.upsertPersistedSession(makeSession('session-1', 'agent-1')),
@@ -3,7 +3,7 @@
3
3
  * 封装 MCP Tool 的 HTTP 调用
4
4
  */
5
5
  import type { ServerConfig } from "./types.js";
6
- export interface McpToolResponse<T = unknown> {
6
+ export interface McpToolResponse {
7
7
  error?: string;
8
8
  [key: string]: unknown;
9
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA4CD,qBAAa,UAAU;IACrB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,UAAU,CAAS;gBAEf,YAAY,EAAE,YAAY;IAKtC;;OAEG;IACG,QAAQ,CAAC,CAAC,GAAG,OAAO,EACxB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;YAqCC,wBAAwB;IAwCtC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,aAAa,IAAI,MAAM;CAGxB"}
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA4CD,qBAAa,UAAU;IACrB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,UAAU,CAAS;gBAEf,YAAY,EAAE,YAAY;IAKtC;;OAEG;IACG,QAAQ,CAAC,CAAC,GAAG,OAAO,EACxB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;YAqCC,wBAAwB;IAwCtC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,aAAa,IAAI,MAAM;CAGxB"}
@@ -58,7 +58,7 @@ export class HttpClient {
58
58
  };
59
59
  if (this.serverConfig.runtimeAccessToken) {
60
60
  headers["X-Runtime-Token"] = this.serverConfig.runtimeAccessToken;
61
- headers["Authorization"] =
61
+ headers.Authorization =
62
62
  `Bearer ${this.serverConfig.runtimeAccessToken}`;
63
63
  }
64
64
  const response = await fetch(this.mcpHttpUrl, {
@@ -1 +1 @@
1
- {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAWjD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAYzD;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQ1E;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOlE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,IAAI,CAAC;CACf,GAAG,MAAM,CAOd;AAED,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,IAAI,CAsBxD;AAoCD,eAAO,MAAM,MAAM;oBACD,OAAO,EAAE,KAAG,IAAI;oBAChB,OAAO,EAAE,KAAG,IAAI;qBACf,OAAO,EAAE,KAAG,IAAI;CAClC,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAWjD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAYzD;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQ1E;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CASlE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,IAAI,CAAC;CACf,GAAG,MAAM,CAOd;AAED,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,IAAI,CAsBxD;AAoCD,eAAO,MAAM,MAAM;oBACD,OAAO,EAAE,KAAG,IAAI;oBAChB,OAAO,EAAE,KAAG,IAAI;qBACf,OAAO,EAAE,KAAG,IAAI;CAClC,CAAC"}
@@ -30,8 +30,10 @@ export function getStartupPathName(startupPath) {
30
30
  return parts[parts.length - 1] || "workspace";
31
31
  }
32
32
  export function sanitizeLogFileNameSegment(segment) {
33
+ const controlCharactersPattern = new RegExp(`[${String.fromCharCode(0)}-${String.fromCharCode(31)}]`, "g");
33
34
  const sanitized = segment
34
- .replace(/[<>:"/\\|?*\x00-\x1F]/g, "_")
35
+ .replace(/[<>:"/\\|?*]/g, "_")
36
+ .replace(controlCharactersPattern, "_")
35
37
  .replace(/\s+/g, " ")
36
38
  .trim()
37
39
  .replace(/[. ]+$/g, "");
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export declare class McpServer {
6
6
  private server;
7
7
  private agentClient;
8
8
  private messageBuffer;
9
+ private memoryStore;
9
10
  constructor();
10
11
  private setupHandlers;
11
12
  /**
@@ -16,6 +17,64 @@ export declare class McpServer {
16
17
  * 执行具体的工具调用
17
18
  */
18
19
  private executeToolCall;
20
+ private static readonly MEMORY_TYPES;
21
+ private static readonly MEMORY_TOOL_NAMES;
22
+ /**
23
+ * 解析本地记忆文件路径。
24
+ * 主流程:优先使用 AWS_MEMORY_STORE_PATH 显式配置,否则落到当前 Agent 工作区的 .agentswork/memory.json。
25
+ */
26
+ private static resolveMemoryStorePath;
27
+ private getRequiredString;
28
+ private getOptionalString;
29
+ private getOptionalNumber;
30
+ private getOptionalMemoryType;
31
+ private parseMemoryType;
32
+ private isMemoryType;
33
+ /**
34
+ * 生成安全的工具状态上报参数。
35
+ * 主流程:memory 工具只上报元数据,避免 content/query/old_string/new_string/append 离开本地记忆边界。
36
+ */
37
+ private sanitizeToolUseArgs;
38
+ /**
39
+ * 创建本地记忆。
40
+ * 主流程:校验必填字段 -> 交给 MemoryStore 规范化 URI 和类型 -> 返回创建后的记录。
41
+ */
42
+ private handleCreateMemory;
43
+ /**
44
+ * 读取本地记忆。
45
+ * 主流程:按 uri 读取;如果传入 memory_type,则由 MemoryStore 执行类型一致性校验。
46
+ */
47
+ private handleReadMemory;
48
+ /**
49
+ * 更新本地记忆。
50
+ * 主流程:要求至少一种变更方式 -> 交给 MemoryStore 执行精确替换/追加和版本递增。
51
+ */
52
+ private handleUpdateMemory;
53
+ /**
54
+ * 删除本地记忆。
55
+ * 主流程:按 uri 删除;如果传入 memory_type,则先校验分类,最后返回 deleted 布尔值。
56
+ */
57
+ private handleDeleteMemory;
58
+ /**
59
+ * 搜索本地记忆。
60
+ * 主流程:校验 query -> MemoryStore 对 uri/content 做大小写不敏感匹配和排序。
61
+ */
62
+ private handleSearchMemory;
63
+ /**
64
+ * 列出短期类型记忆。
65
+ * 主流程:只允许 task_list/recently_memory,由 MemoryStore 阻止长期 memory 的全量列出。
66
+ */
67
+ private handleListMemories;
68
+ /**
69
+ * 移除任务清单记忆。
70
+ * 主流程:按 uri 读取并校验 task_list 类型后删除,避免误删长期记忆。
71
+ */
72
+ private handleRemoveTaskListMemory;
73
+ /**
74
+ * 归档近期记忆。
75
+ * 主流程:将 recently_memory 原地转换为长期 memory,并递增版本号。
76
+ */
77
+ private handleArchiveRecentlyMemory;
19
78
  private handleSendGroup;
20
79
  private handleHireColleague;
21
80
  private handleHireColleaguesBatch;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6BH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAgB;;IAqBrC,OAAO,CAAC,aAAa;IAqCrB;;OAEG;YACW,cAAc;IA4B5B;;OAEG;YACW,eAAe;YA0Ef,eAAe;YAWf,mBAAmB;YAOnB,yBAAyB;YA0BzB,iBAAiB;YAgBjB,iBAAiB;IAuC/B;;OAEG;YACW,gBAAgB;IAkB9B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;YAmDf,gBAAgB;IAiB9B;;;OAGG;YACW,6BAA6B;YAiC7B,kBAAkB;YAQlB,qBAAqB;YAUrB,sBAAsB;YAetB,eAAe;YASf,gBAAgB;YAYhB,mBAAmB;IAejC;;OAEG;YACW,qBAAqB;IAiBnC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAUnC;;;OAGG;IACH,OAAO,CAAC,cAAc;IAMtB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAK9B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAcnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBd,YAAY;IAyC1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,KAAK;CAGd"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuCH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;;IAsBjC,OAAO,CAAC,aAAa;IAqCrB;;OAEG;YACW,cAAc;IA4B5B;;OAEG;YACW,eAAe;IAkG7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAIlC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAStC;IAEH;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAUrC,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA2B3B;;;OAGG;YACW,kBAAkB;IAShC;;;OAGG;YACW,gBAAgB;IAQ9B;;;OAGG;YACW,kBAAkB;IAsBhC;;;OAGG;YACW,kBAAkB;IAShC;;;OAGG;YACW,kBAAkB;IAShC;;;OAGG;YACW,kBAAkB;IAIhC;;;OAGG;YACW,0BAA0B;IAKxC;;;OAGG;YACW,2BAA2B;YAI3B,eAAe;YAWf,mBAAmB;YAOnB,yBAAyB;YA0BzB,iBAAiB;YAgBjB,iBAAiB;IAuC/B;;OAEG;YACW,gBAAgB;IAkB9B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;YAmDf,gBAAgB;IAiB9B;;;OAGG;YACW,6BAA6B;YAiC7B,kBAAkB;YAQlB,qBAAqB;YAUrB,sBAAsB;YAetB,eAAe;YASf,gBAAgB;YAYhB,mBAAmB;IAejC;;OAEG;YACW,qBAAqB;IAiBnC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAUnC;;;OAGG;IACH,OAAO,CAAC,cAAc;IAMtB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAK9B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAcnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBd,YAAY;IAyC1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,KAAK;CAGd"}
@@ -2,21 +2,25 @@
2
2
  * MCP Server 实现
3
3
  * 提供 MCP Tools 供 AI Agent 调用
4
4
  */
5
+ import path from "node:path";
5
6
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
6
7
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
8
  import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
8
9
  import { AgentClient } from "./agent-client.js";
9
10
  import { MCP_SERVER_NAME, MCP_SERVER_VERSION, REGISTER_RETRY_INTERVAL_MS, } from "./constants.js";
10
- import { MessageBuffer } from "./message-buffer.js";
11
11
  import { logger } from "./logger.js";
12
12
  import { MCP_TOOLS } from "./mcp-tools.js";
13
+ import { MessageBuffer } from "./message-buffer.js";
14
+ import { MemoryStore, } from "./memory-store.js";
13
15
  export class McpServer {
14
16
  server;
15
17
  agentClient;
16
18
  messageBuffer;
19
+ memoryStore;
17
20
  constructor() {
18
21
  this.agentClient = new AgentClient();
19
22
  this.messageBuffer = new MessageBuffer();
23
+ this.memoryStore = new MemoryStore(McpServer.resolveMemoryStorePath());
20
24
  this.server = new Server({
21
25
  name: MCP_SERVER_NAME,
22
26
  version: MCP_SERVER_VERSION,
@@ -65,7 +69,7 @@ export class McpServer {
65
69
  // 报告工具调用状态
66
70
  const statusReporter = this.agentClient.getStatusReporter();
67
71
  if (statusReporter) {
68
- statusReporter.reportToolUse(name, args);
72
+ statusReporter.reportToolUse(name, this.sanitizeToolUseArgs(name, args));
69
73
  }
70
74
  try {
71
75
  const result = await this.executeToolCall(name, args);
@@ -123,11 +127,207 @@ export class McpServer {
123
127
  return await this.handleRejectTask(args);
124
128
  case "terminate_task":
125
129
  return await this.handleTerminateTask(args);
130
+ case "create_memory":
131
+ return await this.handleCreateMemory(args);
132
+ case "read_memory":
133
+ return await this.handleReadMemory(args);
134
+ case "update_memory":
135
+ return await this.handleUpdateMemory(args);
136
+ case "delete_memory":
137
+ return await this.handleDeleteMemory(args);
138
+ case "search_memory":
139
+ return await this.handleSearchMemory(args);
140
+ case "list_memories":
141
+ return await this.handleListMemories(args);
142
+ case "remove_task_list_memory":
143
+ return await this.handleRemoveTaskListMemory(args);
144
+ case "archive_recently_memory":
145
+ return await this.handleArchiveRecentlyMemory(args);
126
146
  default:
127
147
  throw new Error(`未知工具: ${name}`);
128
148
  }
129
149
  }
130
150
  // ============ 工具处理方法 ============
151
+ static MEMORY_TYPES = [
152
+ "task_list",
153
+ "recently_memory",
154
+ "memory",
155
+ ];
156
+ static MEMORY_TOOL_NAMES = new Set([
157
+ "create_memory",
158
+ "read_memory",
159
+ "update_memory",
160
+ "delete_memory",
161
+ "search_memory",
162
+ "list_memories",
163
+ "remove_task_list_memory",
164
+ "archive_recently_memory",
165
+ ]);
166
+ /**
167
+ * 解析本地记忆文件路径。
168
+ * 主流程:优先使用 AWS_MEMORY_STORE_PATH 显式配置,否则落到当前 Agent 工作区的 .agentswork/memory.json。
169
+ */
170
+ static resolveMemoryStorePath() {
171
+ const configuredPath = String(process.env.AWS_MEMORY_STORE_PATH || "").trim();
172
+ if (configuredPath) {
173
+ return configuredPath;
174
+ }
175
+ const workspacePath = process.env.AWS_WORKSPACE_PATH || process.cwd();
176
+ return path.join(workspacePath, ".agentswork", "memory.json");
177
+ }
178
+ getRequiredString(args, key) {
179
+ const value = args[key];
180
+ if (typeof value !== "string" || value.trim().length === 0) {
181
+ throw new Error(`${key} 参数是必需的`);
182
+ }
183
+ return value;
184
+ }
185
+ getOptionalString(args, key) {
186
+ const value = args[key];
187
+ return typeof value === "string" ? value : undefined;
188
+ }
189
+ getOptionalNumber(args, key) {
190
+ const value = args[key];
191
+ return typeof value === "number" ? value : undefined;
192
+ }
193
+ getOptionalMemoryType(args) {
194
+ const value = args.memory_type;
195
+ if (value === undefined) {
196
+ return undefined;
197
+ }
198
+ return this.parseMemoryType(value);
199
+ }
200
+ parseMemoryType(value) {
201
+ if (typeof value !== "string") {
202
+ throw new Error(`Invalid memory_type: ${String(value)}`);
203
+ }
204
+ const normalized = value.trim();
205
+ if (!this.isMemoryType(normalized)) {
206
+ throw new Error(`Invalid memory_type: ${value}`);
207
+ }
208
+ return normalized;
209
+ }
210
+ isMemoryType(value) {
211
+ return McpServer.MEMORY_TYPES.some((memoryType) => memoryType === value);
212
+ }
213
+ /**
214
+ * 生成安全的工具状态上报参数。
215
+ * 主流程:memory 工具只上报元数据,避免 content/query/old_string/new_string/append 离开本地记忆边界。
216
+ */
217
+ sanitizeToolUseArgs(name, args) {
218
+ if (!McpServer.MEMORY_TOOL_NAMES.has(name)) {
219
+ return args;
220
+ }
221
+ const sanitized = {};
222
+ const uri = this.getOptionalString(args, "uri");
223
+ const memoryType = this.getOptionalString(args, "memory_type");
224
+ const limit = this.getOptionalNumber(args, "limit");
225
+ if (uri) {
226
+ sanitized.uri = uri;
227
+ }
228
+ if (memoryType) {
229
+ sanitized.memory_type = memoryType;
230
+ }
231
+ if (typeof limit === "number") {
232
+ sanitized.limit = limit;
233
+ }
234
+ if (name === "search_memory") {
235
+ sanitized.queryProvided = typeof args.query === "string" && args.query.length > 0;
236
+ }
237
+ return sanitized;
238
+ }
239
+ /**
240
+ * 创建本地记忆。
241
+ * 主流程:校验必填字段 -> 交给 MemoryStore 规范化 URI 和类型 -> 返回创建后的记录。
242
+ */
243
+ async handleCreateMemory(args) {
244
+ const input = {
245
+ memory_type: this.parseMemoryType(this.getRequiredString(args, "memory_type")),
246
+ uri: this.getRequiredString(args, "uri"),
247
+ content: this.getRequiredString(args, "content"),
248
+ };
249
+ return await this.memoryStore.createMemory(input);
250
+ }
251
+ /**
252
+ * 读取本地记忆。
253
+ * 主流程:按 uri 读取;如果传入 memory_type,则由 MemoryStore 执行类型一致性校验。
254
+ */
255
+ async handleReadMemory(args) {
256
+ const input = {
257
+ uri: this.getRequiredString(args, "uri"),
258
+ memory_type: this.getOptionalMemoryType(args),
259
+ };
260
+ return await this.memoryStore.readMemory(input);
261
+ }
262
+ /**
263
+ * 更新本地记忆。
264
+ * 主流程:要求至少一种变更方式 -> 交给 MemoryStore 执行精确替换/追加和版本递增。
265
+ */
266
+ async handleUpdateMemory(args) {
267
+ const hasReplace = typeof args.old_string === "string" || typeof args.new_string === "string";
268
+ const hasCompleteReplace = typeof args.old_string === "string" && typeof args.new_string === "string";
269
+ const append = this.getOptionalString(args, "append");
270
+ if (hasReplace && !hasCompleteReplace) {
271
+ throw new Error("old_string 和 new_string 必须同时提供");
272
+ }
273
+ if (!hasCompleteReplace && (typeof append !== "string" || append.length === 0)) {
274
+ throw new Error("必须提供 old_string/new_string 或 append 中的至少一种更新方式");
275
+ }
276
+ const input = {
277
+ uri: this.getRequiredString(args, "uri"),
278
+ memory_type: this.getOptionalMemoryType(args),
279
+ old_string: this.getOptionalString(args, "old_string"),
280
+ new_string: this.getOptionalString(args, "new_string"),
281
+ append,
282
+ };
283
+ return await this.memoryStore.updateMemory(input);
284
+ }
285
+ /**
286
+ * 删除本地记忆。
287
+ * 主流程:按 uri 删除;如果传入 memory_type,则先校验分类,最后返回 deleted 布尔值。
288
+ */
289
+ async handleDeleteMemory(args) {
290
+ const input = {
291
+ uri: this.getRequiredString(args, "uri"),
292
+ memory_type: this.getOptionalMemoryType(args),
293
+ };
294
+ const deleted = await this.memoryStore.deleteMemory(input);
295
+ return { deleted };
296
+ }
297
+ /**
298
+ * 搜索本地记忆。
299
+ * 主流程:校验 query -> MemoryStore 对 uri/content 做大小写不敏感匹配和排序。
300
+ */
301
+ async handleSearchMemory(args) {
302
+ const input = {
303
+ query: this.getRequiredString(args, "query"),
304
+ limit: this.getOptionalNumber(args, "limit"),
305
+ memory_type: this.getOptionalMemoryType(args),
306
+ };
307
+ return await this.memoryStore.searchMemory(input);
308
+ }
309
+ /**
310
+ * 列出短期类型记忆。
311
+ * 主流程:只允许 task_list/recently_memory,由 MemoryStore 阻止长期 memory 的全量列出。
312
+ */
313
+ async handleListMemories(args) {
314
+ return await this.memoryStore.listByType(this.getRequiredString(args, "memory_type"));
315
+ }
316
+ /**
317
+ * 移除任务清单记忆。
318
+ * 主流程:按 uri 读取并校验 task_list 类型后删除,避免误删长期记忆。
319
+ */
320
+ async handleRemoveTaskListMemory(args) {
321
+ const removed = await this.memoryStore.removeTaskListMemory(this.getRequiredString(args, "uri"));
322
+ return { removed };
323
+ }
324
+ /**
325
+ * 归档近期记忆。
326
+ * 主流程:将 recently_memory 原地转换为长期 memory,并递增版本号。
327
+ */
328
+ async handleArchiveRecentlyMemory(args) {
329
+ return await this.memoryStore.archiveRecentlyMemory(this.getRequiredString(args, "uri"));
330
+ }
131
331
  async handleSendGroup(args) {
132
332
  if (!args.content || typeof args.content !== "string") {
133
333
  throw new Error("content 参数是必需的");