aws-runtime-bridge 1.0.3 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/adapter.test.js +4 -4
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/adapter/types.js +0 -7
- package/dist/adapter/types.test.js +5 -53
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +4 -0
- package/dist/routes/instance.d.ts.map +1 -1
- package/dist/routes/instance.js +36 -0
- package/dist/routes/runtime-binding.d.ts.map +1 -1
- package/dist/routes/runtime-binding.js +45 -0
- package/dist/routes/sessions.js +1 -1
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +48 -14
- package/dist/routes/terminal.test.js +6 -2
- package/dist/services/agent-process-manager.js +4 -4
- package/dist/services/auto-register.d.ts +9 -0
- package/dist/services/auto-register.d.ts.map +1 -1
- package/dist/services/auto-register.js +190 -32
- package/dist/services/aws-client-agent-mcp.test.js +3 -0
- package/dist/services/mcp-launch-binding-queue.d.ts +36 -0
- package/dist/services/mcp-launch-binding-queue.d.ts.map +1 -0
- package/dist/services/mcp-launch-binding-queue.js +92 -0
- package/dist/services/mcp-launch-binding-queue.test.d.ts +2 -0
- package/dist/services/mcp-launch-binding-queue.test.d.ts.map +1 -0
- package/dist/services/mcp-launch-binding-queue.test.js +107 -0
- package/dist/services/orphan-monitor.js +1 -1
- package/dist/services/process-detector.d.ts +1 -1
- package/dist/services/process-detector.d.ts.map +1 -1
- package/dist/services/process-detector.js +2 -11
- package/dist/services/process-registry.d.ts +1 -0
- package/dist/services/process-registry.d.ts.map +1 -1
- package/dist/services/process-registry.js +129 -108
- package/dist/services/terminal-persistence.d.ts.map +1 -1
- package/dist/services/terminal-persistence.js +47 -37
- package/dist/services/terminal-persistence.test.js +47 -1
- package/dist/utils/file-utils.d.ts +3 -0
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +32 -0
- package/package/aws-client-agent-mcp/README.md +288 -288
- package/package.json +76 -76
- package/dist/routes/aws-mcp.d.ts +0 -10
- package/dist/routes/aws-mcp.d.ts.map +0 -1
- package/dist/routes/aws-mcp.js +0 -74
- package/dist/routes/aws-mcp.test.d.ts +0 -2
- package/dist/routes/aws-mcp.test.d.ts.map +0 -1
- package/dist/routes/aws-mcp.test.js +0 -42
- package/dist/routes/memory.d.ts +0 -13
- package/dist/routes/memory.d.ts.map +0 -1
- package/dist/routes/memory.js +0 -429
- package/dist/services/aws-mcp-http.d.ts +0 -11
- package/dist/services/aws-mcp-http.d.ts.map +0 -1
- package/dist/services/aws-mcp-http.js +0 -225
- package/dist/services/aws-mcp-http.test.d.ts +0 -2
- package/dist/services/aws-mcp-http.test.d.ts.map +0 -1
- package/dist/services/aws-mcp-http.test.js +0 -27
- package/dist/services/easytier-manager.d.ts +0 -106
- package/dist/services/easytier-manager.d.ts.map +0 -1
- package/dist/services/easytier-manager.js +0 -331
- package/dist/services/easytier-manager.test.d.ts +0 -5
- package/dist/services/easytier-manager.test.d.ts.map +0 -1
- package/dist/services/easytier-manager.test.js +0 -98
- package/dist/services/memory-service.d.ts +0 -195
- package/dist/services/memory-service.d.ts.map +0 -1
- package/dist/services/memory-service.js +0 -650
- package/dist/services/session-lookup.d.ts +0 -20
- package/dist/services/session-lookup.d.ts.map +0 -1
- package/dist/services/session-lookup.js +0 -43
- package/dist/services/user-api-key-service.d.ts +0 -28
- package/dist/services/user-api-key-service.d.ts.map +0 -1
- package/dist/services/user-api-key-service.js +0 -75
- package/node_modules/@cc-switch/sdk/dist/adapters/common.d.ts +0 -38
- package/node_modules/@cc-switch/sdk/dist/adapters/common.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/common.js +0 -47
- package/node_modules/@cc-switch/sdk/dist/adapters/index.d.ts +0 -5
- package/node_modules/@cc-switch/sdk/dist/adapters/index.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/index.js +0 -28
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.d.ts +0 -10
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.js +0 -39
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.d.ts +0 -10
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.js +0 -40
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.d.ts +0 -18
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.js +0 -63
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.d.ts +0 -2
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.js +0 -86
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.d.ts +0 -9
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.js +0 -14
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.d.ts +0 -10
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.js +0 -51
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.d.ts +0 -10
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.js +0 -51
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.d.ts +0 -10
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.js +0 -51
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.d.ts +0 -9
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.js +0 -14
- package/node_modules/@cc-switch/sdk/dist/services/instance-service.d.ts +0 -78
- package/node_modules/@cc-switch/sdk/dist/services/instance-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/instance-service.js +0 -180
- package/package/cc-switch-sdk/dist/adapters/common.d.ts +0 -38
- package/package/cc-switch-sdk/dist/adapters/common.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/common.js +0 -47
- package/package/cc-switch-sdk/dist/adapters/index.d.ts +0 -5
- package/package/cc-switch-sdk/dist/adapters/index.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/index.js +0 -28
- package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts +0 -10
- package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/mcp-claude.js +0 -39
- package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts +0 -10
- package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.js +0 -40
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts +0 -18
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.js +0 -63
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts +0 -2
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.js +0 -86
- package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts +0 -9
- package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.js +0 -14
- package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts +0 -10
- package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/skill-claude.js +0 -51
- package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts +0 -10
- package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/skill-claudecode.js +0 -51
- package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts +0 -10
- package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/skill-opencode.js +0 -51
- package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts +0 -9
- package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/adapters/skill-placeholder.js +0 -14
- package/package/cc-switch-sdk/dist/services/instance-service.d.ts +0 -78
- package/package/cc-switch-sdk/dist/services/instance-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/instance-service.js +0 -180
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Adapter 类型定义测试
|
|
3
3
|
*/
|
|
4
|
-
import { describe,
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
5
|
import { getToolActionInfo } from '../adapter/types.js';
|
|
6
6
|
describe('Adapter Types', () => {
|
|
7
7
|
it('should define valid SessionStatus values', () => {
|
|
@@ -172,9 +172,9 @@ describe('Adapter Types', () => {
|
|
|
172
172
|
actionDetail: 'aws-mcp/send_group',
|
|
173
173
|
});
|
|
174
174
|
expect(getToolActionInfo('poll_message', {})).toEqual({
|
|
175
|
-
actionType: '
|
|
176
|
-
actionLabel: '
|
|
177
|
-
actionDetail: '
|
|
175
|
+
actionType: 'mcp',
|
|
176
|
+
actionLabel: '调用MCP',
|
|
177
|
+
actionDetail: 'aws-mcp/poll_message',
|
|
178
178
|
});
|
|
179
179
|
});
|
|
180
180
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapter/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,YAAY,GACZ,eAAe,GACf,WAAW,GACX,YAAY,GACZ,OAAO,CAAC;AAIZ,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,UAAU,GACV,gBAAgB,GAChB,cAAc,GACd,oBAAoB,GACpB,mBAAmB,GACnB,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,OAAO,CAAC;AAIZ;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,KAAK,GACL,MAAM,GACN,WAAW,GACX,YAAY,GACZ,WAAW,GACX,MAAM,GACN,QAAQ,GACR,KAAK,GACL,KAAK,GACL,UAAU,GACV,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,UAAU,EAAE,cAAc,CAAC;IAC3B,iBAAiB;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA6BD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,QAAQ,CAAC,EAAE,YAAY,GACtB,cAAc,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapter/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,YAAY,GACZ,eAAe,GACf,WAAW,GACX,YAAY,GACZ,OAAO,CAAC;AAIZ,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,UAAU,GACV,gBAAgB,GAChB,cAAc,GACd,oBAAoB,GACpB,mBAAmB,GACnB,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,OAAO,CAAC;AAIZ;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,KAAK,GACL,MAAM,GACN,WAAW,GACX,YAAY,GACZ,WAAW,GACX,MAAM,GACN,QAAQ,GACR,KAAK,GACL,KAAK,GACL,UAAU,GACV,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,UAAU,EAAE,cAAc,CAAC;IAC3B,iBAAiB;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA6BD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,QAAQ,CAAC,EAAE,YAAY,GACtB,cAAc,CAmPhB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE;QACJ,0CAA0C;QAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,0CAA0C;QAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,kEAAkE;QAClE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,2BAA2B;QAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,6BAA6B;QAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,8BAA8B;QAC9B,KAAK,CAAC,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC;QACtD,4BAA4B;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,iCAAiC;QACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,4BAA4B;QAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,4BAA4B;QAC5B,SAAS,CAAC,EAAE,KAAK,CAAC;YAChB,QAAQ,EAAE,MAAM,CAAC;YACjB,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,OAAO,CAAC,EAAE,KAAK,CAAC;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,WAAW,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;YACzD,QAAQ,CAAC,EAAE,OAAO,CAAC;SACpB,CAAC,CAAC;QACH,6BAA6B;QAC7B,UAAU,CAAC,EAAE,cAAc,CAAC;QAC5B,+BAA+B;QAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,6BAA6B;QAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAID,MAAM,WAAW,oBAAoB;IACnC,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,gBAAgB,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,uBAAuB,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/C,mBAAmB;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa;IACb,YAAY,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,aAAa;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa;IACb,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,iBAAiB;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,iBAAiB;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe;IACf,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CAClC;AAID,MAAM,WAAW,cAAc;IAC7B,cAAc;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW;IACX,MAAM,EAAE,aAAa,CAAC;IACtB,aAAa;IACb,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,WAAW;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB;IAClB,UAAU,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAE1D,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,wBAAwB;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACzD,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;CACJ;AAID;;;;;;;;;;;;;GAaG;AACH,8BAAsB,mBAAoB,SAAQ,YAAY;IAC5D,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAErC,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAEtC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAErF;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEvE;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAE5E;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/F;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAEnH;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAE3D;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAE3D;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,CACrB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAElE;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAE/C;;OAEG;IACH,QAAQ,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAEpE;;OAEG;IACH,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAEvE;;OAEG;IACH,QAAQ,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAE9D;;OAEG;IACH,QAAQ,CAAC,OAAO,IAAI,IAAI;CACzB"}
|
package/dist/adapter/types.js
CHANGED
|
@@ -78,13 +78,6 @@ export function getToolActionInfo(toolName, toolInput, metadata) {
|
|
|
78
78
|
// 调试日志:记录工具名
|
|
79
79
|
console.log(`[getToolActionInfo] toolName="${toolName}", name="${name}"`);
|
|
80
80
|
const loadSkills = normalizeSkillList(toolInput?.load_skills);
|
|
81
|
-
if (matchesToolName('poll_message')) {
|
|
82
|
-
return {
|
|
83
|
-
actionType: 'idle',
|
|
84
|
-
actionLabel: '空闲等待消息',
|
|
85
|
-
actionDetail: 'Agent 正在等待新消息',
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
81
|
if ((name === 'task' || name === 'task()') && loadSkills.length > 0) {
|
|
89
82
|
return {
|
|
90
83
|
actionType: 'skill',
|
|
@@ -1,59 +1,11 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
2
|
import { getToolActionInfo } from './types.js';
|
|
3
3
|
describe('getToolActionInfo', () => {
|
|
4
|
-
it('
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
it('reports poll_message as a normal MCP tool call', () => {
|
|
5
|
+
expect(getToolActionInfo('poll_message')).toEqual({
|
|
6
|
+
actionType: 'mcp',
|
|
7
|
+
actionLabel: '调用MCP',
|
|
8
|
+
actionDetail: 'aws-mcp/poll_message',
|
|
7
9
|
});
|
|
8
|
-
expect(info).toEqual({
|
|
9
|
-
actionType: 'skill',
|
|
10
|
-
actionLabel: '调用Skill',
|
|
11
|
-
actionDetail: 'frontend-design'
|
|
12
|
-
});
|
|
13
|
-
});
|
|
14
|
-
it('classifies slashcommand skill invocations as skill actions', () => {
|
|
15
|
-
const info = getToolActionInfo('slashcommand', {
|
|
16
|
-
command: 'frontend-design',
|
|
17
|
-
user_message: 'build a polished page'
|
|
18
|
-
});
|
|
19
|
-
expect(info).toEqual({
|
|
20
|
-
actionType: 'skill',
|
|
21
|
-
actionLabel: '调用Skill',
|
|
22
|
-
actionDetail: 'frontend-design'
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
it('classifies camelCase loadSkills invocations as skill actions', () => {
|
|
26
|
-
const info = getToolActionInfo('loadSkills', {
|
|
27
|
-
skills: ['brainstorming', 'writing-plans']
|
|
28
|
-
});
|
|
29
|
-
expect(info).toEqual({
|
|
30
|
-
actionType: 'skill',
|
|
31
|
-
actionLabel: '调用Skill',
|
|
32
|
-
actionDetail: 'brainstorming, writing-plans'
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
it('classifies explicit skill loading as skill actions', () => {
|
|
36
|
-
const info = getToolActionInfo('load_skills', {
|
|
37
|
-
skills: ['brainstorming', 'writing-plans']
|
|
38
|
-
});
|
|
39
|
-
expect(info).toEqual({
|
|
40
|
-
actionType: 'skill',
|
|
41
|
-
actionLabel: '调用Skill',
|
|
42
|
-
actionDetail: 'brainstorming, writing-plans'
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
it('keeps mcp tools classified as mcp actions', () => {
|
|
46
|
-
const info = getToolActionInfo('mcp__aws__send_private', {
|
|
47
|
-
targetId: 'agent-1'
|
|
48
|
-
});
|
|
49
|
-
expect(info.actionType).toBe('mcp');
|
|
50
|
-
expect(info.actionLabel).toBe('调用MCP');
|
|
51
|
-
expect(info.actionDetail).toBe('aws__send_private');
|
|
52
|
-
});
|
|
53
|
-
it('does not misclassify mcp-related skill strings as skill actions', () => {
|
|
54
|
-
const info = getToolActionInfo('mcp_skill_bridge', {
|
|
55
|
-
name: 'bridge'
|
|
56
|
-
});
|
|
57
|
-
expect(info.actionType).not.toBe('skill');
|
|
58
10
|
});
|
|
59
11
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAmC/D;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,IAAI,CAqBN"}
|
package/dist/middleware/auth.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { allowDefaultRuntimeToken, runtimeToken } from "../config.js";
|
|
7
7
|
import { hasRuntimeBinding, validateRuntimeBindingToken, } from "../services/runtime-binding.js";
|
|
8
|
+
import { getConfiguredConnectionKeys } from "../services/auto-register.js";
|
|
8
9
|
function extractRuntimeToken(req) {
|
|
9
10
|
const headerToken = req.header("X-Runtime-Token");
|
|
10
11
|
if (headerToken) {
|
|
@@ -18,6 +19,9 @@ function validateConfiguredToken(token) {
|
|
|
18
19
|
if (!token) {
|
|
19
20
|
return false;
|
|
20
21
|
}
|
|
22
|
+
if (getConfiguredConnectionKeys().includes(token)) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
21
25
|
if (process.env.AWS_RUNTIME_CALLBACK_TOKEN) {
|
|
22
26
|
return token === runtimeToken;
|
|
23
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/routes/instance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/routes/instance.ts"],"names":[],"mappings":"AA0BA,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAC/D,IAAI,CAEN;AAED,eAAO,MAAM,cAAc,4CAAW,CAAC"}
|
package/dist/routes/instance.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Router } from "express";
|
|
2
2
|
import axios from "axios";
|
|
3
|
+
import { createHash, timingSafeEqual } from "node:crypto";
|
|
3
4
|
import { validateToken } from "../middleware/auth.js";
|
|
4
5
|
import { schedulerBaseUrl, runtimeToken } from "../config.js";
|
|
5
6
|
import { loadInstanceState, saveInstanceState, } from "../services/instance-state.js";
|
|
6
7
|
import { initInstance } from "../services/instance-init-service.js";
|
|
7
8
|
import { detectToolStatuses, ensureToolsInstalled, SUPPORTED_INSTALLABLE_TOOLS, } from "../services/tool-installer.js";
|
|
9
|
+
import { getConfiguredConnectionKeys } from "../services/auto-register.js";
|
|
8
10
|
import { createLogger } from "../utils/logger.js";
|
|
9
11
|
const log = createLogger("instance");
|
|
10
12
|
// ★★★ 导出 gracefulShutdown 的触发函数
|
|
@@ -14,12 +16,46 @@ export function setGracefulShutdownFn(fn) {
|
|
|
14
16
|
gracefulShutdownFn = fn;
|
|
15
17
|
}
|
|
16
18
|
export const instanceRouter = Router();
|
|
19
|
+
function md5Hex(value) {
|
|
20
|
+
return createHash("md5").update(value, "utf8").digest("hex");
|
|
21
|
+
}
|
|
22
|
+
function hasMatchingConnectionKeyDigest(connectionKeyMd5) {
|
|
23
|
+
const provided = connectionKeyMd5.trim().toLowerCase();
|
|
24
|
+
if (!/^[a-f0-9]{32}$/.test(provided)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const providedBuffer = Buffer.from(provided, "hex");
|
|
28
|
+
return getConfiguredConnectionKeys()
|
|
29
|
+
.map((key) => key.trim())
|
|
30
|
+
.filter(Boolean)
|
|
31
|
+
.some((key) => {
|
|
32
|
+
const configuredBuffer = Buffer.from(md5Hex(key), "hex");
|
|
33
|
+
return (configuredBuffer.length === providedBuffer.length &&
|
|
34
|
+
timingSafeEqual(configuredBuffer, providedBuffer));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
17
37
|
instanceRouter.get("/healthz", (_req, res) => {
|
|
18
38
|
res.json({
|
|
19
39
|
ok: true,
|
|
20
40
|
runtimeBridge: "healthy",
|
|
21
41
|
});
|
|
22
42
|
});
|
|
43
|
+
instanceRouter.get("/connection-check", (req, res) => {
|
|
44
|
+
const connectionKeyMd5 = String(req.header("X-Bridge-Connection-Key-MD5") || "");
|
|
45
|
+
if (hasMatchingConnectionKeyDigest(connectionKeyMd5)) {
|
|
46
|
+
res.json({
|
|
47
|
+
ok: true,
|
|
48
|
+
runtimeBridge: "healthy",
|
|
49
|
+
connectionKeyMatched: true,
|
|
50
|
+
});
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
res.status(401).json({
|
|
54
|
+
ok: false,
|
|
55
|
+
error: "connection_key_mismatch",
|
|
56
|
+
connectionKeyMatched: false,
|
|
57
|
+
});
|
|
58
|
+
});
|
|
23
59
|
instanceRouter.get("/ping", validateToken, async (_req, res) => {
|
|
24
60
|
try {
|
|
25
61
|
const schedulerResponse = await axios.get(`${schedulerBaseUrl}/api/runtime/ping`, { headers: { "X-Runtime-Token": runtimeToken } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-binding.d.ts","sourceRoot":"","sources":["../../src/routes/runtime-binding.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime-binding.d.ts","sourceRoot":"","sources":["../../src/routes/runtime-binding.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,oBAAoB,4CAAW,CAAC;AAqO7C,wBAAgB,6BAA6B,IAAI,IAAI,CAapD"}
|
|
@@ -3,6 +3,7 @@ import { clearRuntimeBinding, getRuntimeAccessToken, getRuntimeBindingPublicStat
|
|
|
3
3
|
import { validateToken } from "../middleware/auth.js";
|
|
4
4
|
import { runtimeToken } from "../config.js";
|
|
5
5
|
import { requestRuntimeAccessTokenRefresh } from "../services/auto-register.js";
|
|
6
|
+
import { claimMcpLaunchBinding, getMcpLaunchQueueSize } from "../services/mcp-launch-binding-queue.js";
|
|
6
7
|
import { createLogger } from "../utils/logger.js";
|
|
7
8
|
const log = createLogger("runtime-binding-route");
|
|
8
9
|
export const runtimeBindingRouter = Router();
|
|
@@ -97,6 +98,50 @@ runtimeBindingRouter.post("/binding/request-token", async (req, res) => {
|
|
|
97
98
|
updated: result.updated,
|
|
98
99
|
});
|
|
99
100
|
});
|
|
101
|
+
runtimeBindingRouter.post("/binding/claim-agent", (req, res) => {
|
|
102
|
+
if (!isLoopbackRequest(req)) {
|
|
103
|
+
res.status(403).json({ ok: false, error: "loopback request required" });
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const { agentId, bindingId, workspacePath, serverUrl } = req.body || {};
|
|
107
|
+
if (!agentId || !String(agentId).trim()) {
|
|
108
|
+
res.status(400).json({ ok: false, error: "agentId is required" });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (!bindingId || !String(bindingId).trim()) {
|
|
112
|
+
res.status(400).json({ ok: false, error: "bindingId is required" });
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (!workspacePath || !String(workspacePath).trim()) {
|
|
116
|
+
res.status(400).json({ ok: false, error: "workspacePath is required" });
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (!serverUrl || !String(serverUrl).trim()) {
|
|
120
|
+
res.status(400).json({ ok: false, error: "serverUrl is required" });
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const claimed = claimMcpLaunchBinding({ agentId, bindingId, workspacePath, serverUrl });
|
|
124
|
+
if (!claimed) {
|
|
125
|
+
res.status(404).json({
|
|
126
|
+
ok: false,
|
|
127
|
+
error: "launch binding not found",
|
|
128
|
+
queueSize: getMcpLaunchQueueSize(workspacePath),
|
|
129
|
+
});
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
res.json({
|
|
133
|
+
ok: true,
|
|
134
|
+
agentId: claimed.agentId,
|
|
135
|
+
workspacePath: claimed.workspacePath,
|
|
136
|
+
runtimeAccessToken: claimed.runtimeAccessToken,
|
|
137
|
+
userId: claimed.userId,
|
|
138
|
+
schedulerBaseUrl: claimed.schedulerBaseUrl,
|
|
139
|
+
serverUrl: claimed.serverUrl,
|
|
140
|
+
mcpHttpUrl: claimed.mcpHttpUrl,
|
|
141
|
+
bindingId: claimed.id,
|
|
142
|
+
remainingQueueSize: getMcpLaunchQueueSize(workspacePath),
|
|
143
|
+
});
|
|
144
|
+
});
|
|
100
145
|
runtimeBindingRouter.post("/binding/issue", (req, res) => {
|
|
101
146
|
const currentRuntimeToken = extractRuntimeToken(req);
|
|
102
147
|
const authorizedByScheduler = currentRuntimeToken === runtimeToken;
|
package/dist/routes/sessions.js
CHANGED
|
@@ -721,7 +721,7 @@ sessionsRouter.post('/terminate-tree', validateToken, async (req, res) => {
|
|
|
721
721
|
}
|
|
722
722
|
const result = terminateProcessTree(pid);
|
|
723
723
|
// 4. 等待进程完全终止(最多 5 秒)
|
|
724
|
-
const exited = waitForProcessExit(pid, 5000);
|
|
724
|
+
const exited = await waitForProcessExit(pid, 5000);
|
|
725
725
|
// 5. 清理持久化状�?
|
|
726
726
|
await import('../services/terminal-persistence.js').then(m => m.removePersistedSession(targetSessionId));
|
|
727
727
|
log.info(`[terminate-tree] Terminated process tree for agentId=${agentId}, pid=${pid}, mode=${mode}, terminated=${result.terminated}, failed=${result.failed}, exited=${exited}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAEL,KAAK,oBAAoB,EAM1B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAEL,KAAK,oBAAoB,EAM1B,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;CACpB;AAGD,eAAO,MAAM,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAa,CAAC;AAEnE,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7D"}
|
package/dist/routes/terminal.js
CHANGED
|
@@ -10,8 +10,9 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
10
10
|
import { adapterRegistry, registerSdkProviders, resolveSdkProviderIdByCommand, } from '../adapter/index.js';
|
|
11
11
|
import { validateToken } from '../middleware/auth.js';
|
|
12
12
|
import { getAgentProcessManager } from '../services/agent-process-manager.js';
|
|
13
|
-
import { findClaudeCodeProcesses } from '../services/process-detector.js';
|
|
13
|
+
import { findClaudeCodeProcesses, terminateProcessTree, waitForProcessExit } from '../services/process-detector.js';
|
|
14
14
|
import { flushSessionOutput, scheduleOutputFlush, sendQuestionRequest, sendStatus, sessions } from '../services/session-output.js';
|
|
15
|
+
import { enqueueMcpLaunchBinding } from '../services/mcp-launch-binding-queue.js';
|
|
15
16
|
import { loadPersistedSessions, removePersistedSession, removePersistedSessionByAgentId, savePersistedSessions, upsertPersistedSession, } from '../services/terminal-persistence.js';
|
|
16
17
|
export const terminalRouter = Router();
|
|
17
18
|
// 导出 SDK 会话存储,供其他模块使用(如 sessions.ts)
|
|
@@ -69,9 +70,17 @@ terminalRouter.post('/start', validateToken, async (req, res) => {
|
|
|
69
70
|
res.status(400).json({ error: 'agentId and workspacePath are required' });
|
|
70
71
|
return;
|
|
71
72
|
}
|
|
73
|
+
const queuedBinding = enqueueMcpLaunchBinding({
|
|
74
|
+
agentId: String(agentId),
|
|
75
|
+
workspacePath: String(workspacePath),
|
|
76
|
+
serverUrl: req.body?.serverUrl || req.body?.schedulerBaseUrl,
|
|
77
|
+
runtimeAccessToken: req.body?.runtimeAccessToken,
|
|
78
|
+
userId: req.body?.userId,
|
|
79
|
+
schedulerBaseUrl: req.body?.schedulerBaseUrl,
|
|
80
|
+
});
|
|
72
81
|
// SDK 模式
|
|
73
82
|
if (mode === 'sdk') {
|
|
74
|
-
await startSdkSession(req, res);
|
|
83
|
+
await startSdkSession(req, res, queuedBinding?.id);
|
|
75
84
|
return;
|
|
76
85
|
}
|
|
77
86
|
// PTY 模式(原有逻辑)
|
|
@@ -101,6 +110,8 @@ terminalRouter.post('/start', validateToken, async (req, res) => {
|
|
|
101
110
|
env: {
|
|
102
111
|
...process.env,
|
|
103
112
|
AWS_AGENT_ID: String(agentId),
|
|
113
|
+
AWS_MCP_LAUNCH_BINDING_ID: queuedBinding?.id || '',
|
|
114
|
+
AWS_MCP_CLAIM_LAUNCH_BINDING: 'true',
|
|
104
115
|
},
|
|
105
116
|
});
|
|
106
117
|
sessions.set(sessionId, {
|
|
@@ -165,13 +176,14 @@ terminalRouter.post('/start', validateToken, async (req, res) => {
|
|
|
165
176
|
workspacePath,
|
|
166
177
|
command: actualCommand,
|
|
167
178
|
mode: 'pty',
|
|
179
|
+
mcpLaunchBindingId: queuedBinding?.id,
|
|
168
180
|
});
|
|
169
181
|
});
|
|
170
182
|
/**
|
|
171
183
|
* 启动 SDK 会话
|
|
172
184
|
* 支持 MCP 配置和空闲命令
|
|
173
185
|
*/
|
|
174
|
-
async function startSdkSession(req, res) {
|
|
186
|
+
async function startSdkSession(req, res, mcpLaunchBindingId) {
|
|
175
187
|
const { agentId, workspacePath, command, autoAccept = true, initialPrompt,
|
|
176
188
|
// MCP 配置 - 加载 aws-client-agent-mcp
|
|
177
189
|
mcpConfigPath, extraMcpServers,
|
|
@@ -198,6 +210,12 @@ async function startSdkSession(req, res) {
|
|
|
198
210
|
// MCP 配置:不再默认注入 aws-mcp;由用户在面板中安装/配置
|
|
199
211
|
mcpConfigPath,
|
|
200
212
|
extraMcpServers: extraMcpServers || {},
|
|
213
|
+
envOverrides: {
|
|
214
|
+
AWS_AGENT_ID: String(agentId),
|
|
215
|
+
AWS_WORKSPACE_PATH: String(workspacePath),
|
|
216
|
+
AWS_MCP_LAUNCH_BINDING_ID: mcpLaunchBindingId || '',
|
|
217
|
+
AWS_MCP_CLAIM_LAUNCH_BINDING: 'true',
|
|
218
|
+
},
|
|
201
219
|
};
|
|
202
220
|
// 存储会话信息
|
|
203
221
|
sdkSessions.set(sessionId, {
|
|
@@ -533,16 +551,8 @@ terminalRouter.post('/stop', validateToken, async (req, res) => {
|
|
|
533
551
|
}
|
|
534
552
|
catch (error) {
|
|
535
553
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
536
|
-
// 即使终止失败,也清理会话记录
|
|
537
|
-
sdkSessions.delete(sessionId);
|
|
538
|
-
// 同时按 sessionId 和 agentId 删除,确保持久化会话被清除
|
|
539
|
-
await removePersistedSession(sessionId);
|
|
540
|
-
await removePersistedSessionByAgentId(agentId);
|
|
541
|
-
// ★ 也从进程管理器清理
|
|
542
|
-
const processManager = getAgentProcessManager();
|
|
543
|
-
await processManager.removeProcess(agentId);
|
|
544
554
|
console.error(`[Runtime] Failed to terminate SDK session ${sessionId}:`, errorMessage);
|
|
545
|
-
res.json({ ok:
|
|
555
|
+
res.status(500).json({ ok: false, status: 'stop_failed', mode: 'sdk', error: errorMessage });
|
|
546
556
|
return;
|
|
547
557
|
}
|
|
548
558
|
}
|
|
@@ -568,11 +578,35 @@ terminalRouter.post('/stop', validateToken, async (req, res) => {
|
|
|
568
578
|
}
|
|
569
579
|
// 4. 终止 PTY 进程
|
|
570
580
|
const agentId = session.agentId;
|
|
581
|
+
const pid = session.ptyProcess.pid;
|
|
582
|
+
let exited = false;
|
|
583
|
+
let terminated = 0;
|
|
584
|
+
let failed = 0;
|
|
571
585
|
try {
|
|
572
586
|
session.ptyProcess.kill();
|
|
587
|
+
exited = await waitForProcessExit(pid, 3000);
|
|
573
588
|
}
|
|
574
|
-
catch {
|
|
575
|
-
|
|
589
|
+
catch (error) {
|
|
590
|
+
console.warn(`[Runtime] Failed to kill PTY process gracefully: sessionId=${sessionId}, pid=${pid}`, error);
|
|
591
|
+
}
|
|
592
|
+
if (!exited) {
|
|
593
|
+
const result = terminateProcessTree(pid);
|
|
594
|
+
terminated = result.terminated;
|
|
595
|
+
failed = result.failed;
|
|
596
|
+
exited = await waitForProcessExit(pid, 5000);
|
|
597
|
+
}
|
|
598
|
+
if (!exited) {
|
|
599
|
+
await sendStatus(agentId, sessionId, 'stop_failed');
|
|
600
|
+
res.status(500).json({
|
|
601
|
+
ok: false,
|
|
602
|
+
status: 'stop_failed',
|
|
603
|
+
mode: 'pty',
|
|
604
|
+
pid,
|
|
605
|
+
terminated,
|
|
606
|
+
failed,
|
|
607
|
+
error: `process ${pid} is still running after termination attempts`,
|
|
608
|
+
});
|
|
609
|
+
return;
|
|
576
610
|
}
|
|
577
611
|
if (session.flushTimer) {
|
|
578
612
|
clearTimeout(session.flushTimer);
|
|
@@ -56,12 +56,16 @@ describe('terminal configuration', () => {
|
|
|
56
56
|
expect(getShellConfig('linux').shell).toBe('bash');
|
|
57
57
|
});
|
|
58
58
|
it('builds correct terminal environment', () => {
|
|
59
|
-
const buildTerminalEnv = (agentId, baseEnv) => ({
|
|
59
|
+
const buildTerminalEnv = (agentId, bindingId, baseEnv) => ({
|
|
60
60
|
...baseEnv,
|
|
61
61
|
AWS_AGENT_ID: agentId,
|
|
62
|
+
AWS_MCP_LAUNCH_BINDING_ID: bindingId,
|
|
63
|
+
AWS_MCP_CLAIM_LAUNCH_BINDING: 'true',
|
|
62
64
|
});
|
|
63
|
-
const env = buildTerminalEnv('agent-123', { PATH: '/usr/bin' });
|
|
65
|
+
const env = buildTerminalEnv('agent-123', 'binding-456', { PATH: '/usr/bin' });
|
|
64
66
|
expect(env.AWS_AGENT_ID).toBe('agent-123');
|
|
67
|
+
expect(env.AWS_MCP_LAUNCH_BINDING_ID).toBe('binding-456');
|
|
68
|
+
expect(env.AWS_MCP_CLAIM_LAUNCH_BINDING).toBe('true');
|
|
65
69
|
});
|
|
66
70
|
});
|
|
67
71
|
describe('resolveSdkProviderId', () => {
|
|
@@ -260,7 +260,7 @@ export class AgentProcessManager {
|
|
|
260
260
|
log.debug(`[stopProcess] Level 1: Sending SIGTERM to pid=${pid}`);
|
|
261
261
|
const sigtermResult = this.sendSigterm(pid);
|
|
262
262
|
if (sigtermResult) {
|
|
263
|
-
const exited = waitForProcessExit(pid, 3000);
|
|
263
|
+
const exited = await waitForProcessExit(pid, 3000);
|
|
264
264
|
if (exited) {
|
|
265
265
|
await this.registry.markTerminated(agentId);
|
|
266
266
|
log.info(`[stopProcess] Process stopped at Level 1: agentId=${agentId}, pid=${pid}`);
|
|
@@ -279,7 +279,7 @@ export class AgentProcessManager {
|
|
|
279
279
|
log.debug(`[stopProcess] Level 2: Force killing pid=${pid}`);
|
|
280
280
|
const forceKillResult = this.sendForceKill(pid);
|
|
281
281
|
if (forceKillResult) {
|
|
282
|
-
const exited = waitForProcessExit(pid, 3000);
|
|
282
|
+
const exited = await waitForProcessExit(pid, 3000);
|
|
283
283
|
if (exited) {
|
|
284
284
|
await this.registry.markTerminated(agentId);
|
|
285
285
|
log.info(`[stopProcess] Process stopped at Level 2: agentId=${agentId}, pid=${pid}`);
|
|
@@ -298,7 +298,7 @@ export class AgentProcessManager {
|
|
|
298
298
|
log.debug(`[stopProcess] Level 3: Terminating process tree for pid=${pid}`);
|
|
299
299
|
const treeResult = terminateProcessTree(pid);
|
|
300
300
|
// Wait for process tree to terminate
|
|
301
|
-
const treeExited = waitForProcessExit(pid, 5000);
|
|
301
|
+
const treeExited = await waitForProcessExit(pid, 5000);
|
|
302
302
|
if (treeExited) {
|
|
303
303
|
await this.registry.markTerminated(agentId);
|
|
304
304
|
log.info(`[stopProcess] Process stopped at Level 3: agentId=${agentId}, pid=${pid}, terminated=${treeResult.terminated}, failed=${treeResult.failed}`);
|
|
@@ -398,7 +398,7 @@ export class AgentProcessManager {
|
|
|
398
398
|
// Direct process tree termination
|
|
399
399
|
const result = terminateProcessTree(pid);
|
|
400
400
|
// Wait briefly for termination
|
|
401
|
-
const exited = waitForProcessExit(pid, 2000);
|
|
401
|
+
const exited = await waitForProcessExit(pid, 2000);
|
|
402
402
|
if (exited) {
|
|
403
403
|
await this.registry.markTerminated(agentId);
|
|
404
404
|
log.info(`[forceKill] Process terminated: agentId=${agentId}, pid=${pid}`);
|
|
@@ -13,10 +13,14 @@
|
|
|
13
13
|
interface AutoRegisterConfig {
|
|
14
14
|
/** 是否启用自动注册 */
|
|
15
15
|
enabled: boolean;
|
|
16
|
+
/** 要主动注册到的调度中心地址 */
|
|
17
|
+
serverUrl?: string;
|
|
16
18
|
/** 租户 ID(可选,如果提供 userKey 则可自动推导) */
|
|
17
19
|
tenantId?: string;
|
|
18
20
|
/** 用户 API Key(必填,用于验证身份和自动推导租户) */
|
|
19
21
|
userKey: string;
|
|
22
|
+
/** 连接 Bridge 机器实例需要的密钥 */
|
|
23
|
+
connectionKey?: string;
|
|
20
24
|
/** 实例名称(默认使用主机名) */
|
|
21
25
|
instanceName?: string;
|
|
22
26
|
/** 项目名称 */
|
|
@@ -29,11 +33,14 @@ interface AutoRegisterConfig {
|
|
|
29
33
|
registerIp?: string;
|
|
30
34
|
/** 虚拟 IP(EasyTier,兼容旧配置) */
|
|
31
35
|
virtualIp?: string;
|
|
36
|
+
/** 是否优先选择与 serverUrl 同局域网的本机 IP */
|
|
37
|
+
preferSameLanIp?: boolean;
|
|
32
38
|
/** 注册重试次数 */
|
|
33
39
|
maxRetries?: number;
|
|
34
40
|
/** 注册重试间隔(毫秒) */
|
|
35
41
|
retryInterval?: number;
|
|
36
42
|
}
|
|
43
|
+
export declare function getConfiguredConnectionKeys(): string[];
|
|
37
44
|
/**
|
|
38
45
|
* 加载自动注册配置
|
|
39
46
|
*
|
|
@@ -42,6 +49,7 @@ interface AutoRegisterConfig {
|
|
|
42
49
|
* 如果没有配置文件且没有环境变量,则不启用自动注册
|
|
43
50
|
*/
|
|
44
51
|
export declare function loadConfig(): AutoRegisterConfig;
|
|
52
|
+
export declare function loadConfigs(): AutoRegisterConfig[];
|
|
45
53
|
/**
|
|
46
54
|
* 自动注册主函数
|
|
47
55
|
*
|
|
@@ -70,6 +78,7 @@ export declare function unregister(): Promise<boolean>;
|
|
|
70
78
|
export declare function getRegistrationState(): {
|
|
71
79
|
registered: boolean;
|
|
72
80
|
instanceId?: string;
|
|
81
|
+
registrations: Record<string, string>;
|
|
73
82
|
lastAttempt?: Date;
|
|
74
83
|
error?: string;
|
|
75
84
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-register.d.ts","sourceRoot":"","sources":["../../src/services/auto-register.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"auto-register.d.ts","sourceRoot":"","sources":["../../src/services/auto-register.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA8CH;;GAEG;AACH,UAAU,kBAAkB;IAC1B,eAAe;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAwBD,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAEtD;AAsQD;;;;;;GAMG;AACH,wBAAgB,UAAU,IAAI,kBAAkB,CA2C/C;AAED,wBAAgB,WAAW,IAAI,kBAAkB,EAAE,CA0ClD;AA8LD;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,YAAY,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACzC,OAAO,CAAC,OAAO,CAAC,CAalB;AAyHD;;GAEG;AACH,wBAAsB,gCAAgC,IAAI,OAAO,CAAC;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAoED;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAuBnD;AAED;;GAEG;AACH,wBAAgB,oBAAoB;gBA7yBtB,OAAO;iBACN,MAAM;mBACJ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;kBACvB,IAAI;YACV,MAAM;EA2yBf;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAElD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CA0ED"}
|