aws-runtime-bridge 1.7.49 → 1.8.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.
Files changed (199) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +104 -0
  2. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -0
  3. package/dist/adapter/AcodeSdkAdapter.js +644 -0
  4. package/dist/adapter/AcodeSdkAdapter.test.d.ts +2 -0
  5. package/dist/adapter/AcodeSdkAdapter.test.d.ts.map +1 -0
  6. package/dist/adapter/AcodeSdkAdapter.test.js +1280 -0
  7. package/dist/adapter/AdapterRegistry.d.ts +1 -1
  8. package/dist/adapter/AdapterRegistry.d.ts.map +1 -1
  9. package/dist/adapter/AdapterRegistry.js +2 -0
  10. package/dist/adapter/AdapterRegistry.test.js +10 -1
  11. package/dist/adapter/ClaudeSdkAdapter.test.js +31 -8
  12. package/dist/adapter/CodexSdkAdapter.d.ts.map +1 -1
  13. package/dist/adapter/CodexSdkAdapter.js +2 -0
  14. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
  15. package/dist/adapter/OpencodeSdkAdapter.js +2 -0
  16. package/dist/adapter/SdkProviderSpi.d.ts.map +1 -1
  17. package/dist/adapter/SdkProviderSpi.js +10 -1
  18. package/dist/adapter/adapter.test.js +2 -2
  19. package/dist/adapter/idle-poll-loop.d.ts +4 -4
  20. package/dist/adapter/idle-poll-loop.d.ts.map +1 -1
  21. package/dist/adapter/idle-poll-loop.js +3 -3
  22. package/dist/adapter/idle-poll-loop.test.js +15 -1
  23. package/dist/adapter/index.d.ts +1 -0
  24. package/dist/adapter/index.d.ts.map +1 -1
  25. package/dist/adapter/index.js +1 -0
  26. package/dist/adapter/types.d.ts +25 -6
  27. package/dist/adapter/types.d.ts.map +1 -1
  28. package/dist/adapter/types.js +221 -110
  29. package/dist/adapter/types.test.js +10 -3
  30. package/dist/adapters/cc-switch/index.d.ts +2 -0
  31. package/dist/adapters/cc-switch/index.d.ts.map +1 -1
  32. package/dist/adapters/cc-switch/index.js +6 -0
  33. package/dist/adapters/cc-switch/mcp-acode.d.ts +17 -0
  34. package/dist/adapters/cc-switch/mcp-acode.d.ts.map +1 -0
  35. package/dist/adapters/cc-switch/mcp-acode.js +71 -0
  36. package/dist/adapters/cc-switch/mcp-acode.test.d.ts +2 -0
  37. package/dist/adapters/cc-switch/mcp-acode.test.d.ts.map +1 -0
  38. package/dist/adapters/cc-switch/mcp-acode.test.js +80 -0
  39. package/dist/adapters/cc-switch/mcp-claude.d.ts.map +1 -1
  40. package/dist/adapters/cc-switch/mcp-claude.js +1 -0
  41. package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +1 -1
  42. package/dist/adapters/cc-switch/mcp-claudecode.js +1 -0
  43. package/dist/adapters/cc-switch/mcp-claudecode.test.js +1 -0
  44. package/dist/adapters/cc-switch/mcp-codex.d.ts.map +1 -1
  45. package/dist/adapters/cc-switch/mcp-codex.js +1 -0
  46. package/dist/adapters/cc-switch/mcp-codex.test.js +1 -0
  47. package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +1 -1
  48. package/dist/adapters/cc-switch/mcp-opencode.js +1 -0
  49. package/dist/adapters/cc-switch/mcp-opencode.test.js +1 -0
  50. package/dist/adapters/cc-switch/skill-acode.d.ts +11 -0
  51. package/dist/adapters/cc-switch/skill-acode.d.ts.map +1 -0
  52. package/dist/adapters/cc-switch/skill-acode.js +12 -0
  53. package/dist/adapters/cc-switch/skill-directory.test.js +1 -0
  54. package/dist/config.d.ts +4 -0
  55. package/dist/config.d.ts.map +1 -1
  56. package/dist/config.js +10 -0
  57. package/dist/index.js +2 -0
  58. package/dist/routes/ai-sources.js +3 -2
  59. package/dist/routes/instance.d.ts.map +1 -1
  60. package/dist/routes/instance.js +7 -8
  61. package/dist/routes/instance.test.js +2 -1
  62. package/dist/routes/mcp.js +2 -2
  63. package/dist/routes/mcp.test.js +2 -1
  64. package/dist/routes/runtime-binding.d.ts +3 -2
  65. package/dist/routes/runtime-binding.d.ts.map +1 -1
  66. package/dist/routes/runtime-binding.js +11 -58
  67. package/dist/routes/runtime-binding.test.js +4 -80
  68. package/dist/routes/sessions.d.ts +5 -0
  69. package/dist/routes/sessions.d.ts.map +1 -1
  70. package/dist/routes/sessions.js +36 -16
  71. package/dist/routes/sessions.test.js +13 -0
  72. package/dist/routes/skills.js +2 -2
  73. package/dist/routes/skills.test.js +2 -1
  74. package/dist/routes/terminal.d.ts +27 -7
  75. package/dist/routes/terminal.d.ts.map +1 -1
  76. package/dist/routes/terminal.js +439 -171
  77. package/dist/routes/terminal.test.js +385 -197
  78. package/dist/services/acode-package.d.ts +8 -0
  79. package/dist/services/acode-package.d.ts.map +1 -0
  80. package/dist/services/acode-package.js +82 -0
  81. package/dist/services/ai-source-apply.d.ts +4 -0
  82. package/dist/services/ai-source-apply.d.ts.map +1 -1
  83. package/dist/services/ai-source-apply.js +8 -0
  84. package/dist/services/ai-source-apply.test.js +8 -1
  85. package/dist/services/cc-switch-sdk.d.ts.map +1 -1
  86. package/dist/services/cc-switch-sdk.js +9 -1
  87. package/dist/services/instance-init-service.d.ts.map +1 -1
  88. package/dist/services/instance-init-service.js +3 -2
  89. package/dist/services/instance-init-service.test.js +6 -5
  90. package/dist/services/instance-service.d.ts.map +1 -1
  91. package/dist/services/instance-service.js +1 -0
  92. package/dist/services/instance-state.js +1 -1
  93. package/dist/services/instance-state.test.js +4 -4
  94. package/dist/services/mcp-launch-binding-queue.d.ts +1 -0
  95. package/dist/services/mcp-launch-binding-queue.d.ts.map +1 -1
  96. package/dist/services/mcp-launch-binding-queue.js +8 -2
  97. package/dist/services/mcp-launch-binding-queue.test.js +47 -4
  98. package/dist/services/session-output.d.ts +10 -6
  99. package/dist/services/session-output.d.ts.map +1 -1
  100. package/dist/services/session-output.js +29 -14
  101. package/dist/services/session-output.test.js +93 -39
  102. package/dist/services/tool-installer.d.ts.map +1 -1
  103. package/dist/services/tool-installer.js +10 -0
  104. package/dist/types.d.ts +5 -0
  105. package/dist/types.d.ts.map +1 -1
  106. package/dist/utils/file-utils.d.ts.map +1 -1
  107. package/dist/utils/file-utils.js +1 -0
  108. package/dist/utils/mcp-utils.d.ts.map +1 -1
  109. package/dist/utils/mcp-utils.js +4 -1
  110. package/dist/utils/validation.js +1 -1
  111. package/node_modules/@cc-switch/sdk/dist/constants.d.ts.map +1 -1
  112. package/node_modules/@cc-switch/sdk/dist/constants.js +7 -0
  113. package/node_modules/@cc-switch/sdk/dist/schemas.d.ts.map +1 -1
  114. package/node_modules/@cc-switch/sdk/dist/schemas.js +1 -0
  115. package/node_modules/@cc-switch/sdk/dist/sdk.d.ts.map +1 -1
  116. package/node_modules/@cc-switch/sdk/dist/sdk.js +7 -3
  117. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts +6 -0
  118. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts.map +1 -1
  119. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.js +27 -1
  120. package/node_modules/@cc-switch/sdk/dist/types.d.ts +4 -1
  121. package/node_modules/@cc-switch/sdk/dist/types.d.ts.map +1 -1
  122. package/package/acode/README.md +88 -0
  123. package/package/acode/dist/built-in-file-tools.d.ts +16 -0
  124. package/package/acode/dist/built-in-file-tools.d.ts.map +1 -0
  125. package/package/acode/dist/built-in-file-tools.js +569 -0
  126. package/package/acode/dist/cli.d.ts +3 -0
  127. package/package/acode/dist/cli.d.ts.map +1 -0
  128. package/package/acode/dist/cli.js +37 -0
  129. package/package/acode/dist/commands/commandLoader.d.ts +7 -0
  130. package/package/acode/dist/commands/commandLoader.d.ts.map +1 -0
  131. package/package/acode/dist/commands/commandLoader.js +33 -0
  132. package/package/acode/dist/commands/commandParser.d.ts +7 -0
  133. package/package/acode/dist/commands/commandParser.d.ts.map +1 -0
  134. package/package/acode/dist/commands/commandParser.js +77 -0
  135. package/package/acode/dist/commands/commandRegistry.d.ts +13 -0
  136. package/package/acode/dist/commands/commandRegistry.d.ts.map +1 -0
  137. package/package/acode/dist/commands/commandRegistry.js +30 -0
  138. package/package/acode/dist/config.d.ts +4 -0
  139. package/package/acode/dist/config.d.ts.map +1 -0
  140. package/package/acode/dist/config.js +80 -0
  141. package/package/acode/dist/hooks/hookBus.d.ts +19 -0
  142. package/package/acode/dist/hooks/hookBus.d.ts.map +1 -0
  143. package/package/acode/dist/hooks/hookBus.js +40 -0
  144. package/package/acode/dist/index.d.ts +8 -0
  145. package/package/acode/dist/index.d.ts.map +1 -0
  146. package/package/acode/dist/index.js +7 -0
  147. package/package/acode/dist/runtime.d.ts +42 -0
  148. package/package/acode/dist/runtime.d.ts.map +1 -0
  149. package/package/acode/dist/runtime.js +1283 -0
  150. package/package/acode/dist/types.d.ts +112 -0
  151. package/package/acode/dist/types.d.ts.map +1 -0
  152. package/package/acode/dist/types.js +1 -0
  153. package/package/acode/package.json +24 -0
  154. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +4 -4
  155. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
  156. package/package/aws-client-agent-mcp/dist/agent-client.js +9 -6
  157. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
  158. package/package/aws-client-agent-mcp/dist/agent-client.test.js +21 -0
  159. package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +1 -1
  160. package/package/aws-client-agent-mcp/dist/http-client.d.ts +1 -17
  161. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
  162. package/package/aws-client-agent-mcp/dist/http-client.js +7 -113
  163. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
  164. package/package/aws-client-agent-mcp/dist/http-client.test.js +22 -2
  165. package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -1
  166. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -5
  167. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  168. package/package/aws-client-agent-mcp/dist/mcp-server.js +3 -24
  169. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  170. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +90 -5
  171. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  172. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +1 -1
  173. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +1 -0
  174. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +1 -1
  175. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +2 -0
  176. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -1
  177. package/package/aws-client-agent-mcp/dist/status-reporter.js +31 -3
  178. package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -1
  179. package/package/aws-client-agent-mcp/dist/types.d.ts +4 -1
  180. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  181. package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
  182. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +0 -13
  183. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
  184. package/package/aws-client-agent-mcp/dist/websocket-client.js +5 -100
  185. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
  186. package/package/aws-client-agent-mcp/dist/websocket-client.test.js +43 -0
  187. package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +1 -1
  188. package/package/cc-switch-sdk/dist/constants.d.ts.map +1 -1
  189. package/package/cc-switch-sdk/dist/constants.js +7 -0
  190. package/package/cc-switch-sdk/dist/schemas.d.ts.map +1 -1
  191. package/package/cc-switch-sdk/dist/schemas.js +1 -0
  192. package/package/cc-switch-sdk/dist/sdk.d.ts.map +1 -1
  193. package/package/cc-switch-sdk/dist/sdk.js +7 -3
  194. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +6 -0
  195. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +1 -1
  196. package/package/cc-switch-sdk/dist/services/ai-config-service.js +27 -1
  197. package/package/cc-switch-sdk/dist/types.d.ts +4 -1
  198. package/package/cc-switch-sdk/dist/types.d.ts.map +1 -1
  199. package/package.json +8 -4
@@ -0,0 +1,71 @@
1
+ /**
2
+ * ACode MCP Adapter
3
+ *
4
+ * 主流程:读取内置 ACode 的 JSON 配置 -> 将 mcpServers 映射导入 SDK ->
5
+ * 按 SDK 状态增删 ACode 配置中的 MCP server。ACode 内置在 runtime-bridge 中,
6
+ * 因此不需要外部 CLI 安装步骤。
7
+ */
8
+ async function readJsonFile(filePath, fallback) {
9
+ try {
10
+ const raw = await import('node:fs/promises').then((fs) => fs.readFile(filePath, 'utf-8'));
11
+ const parsed = JSON.parse(raw);
12
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
13
+ return parsed;
14
+ }
15
+ return { ...fallback };
16
+ }
17
+ catch {
18
+ return { ...fallback };
19
+ }
20
+ }
21
+ async function writeJsonFile(filePath, content) {
22
+ const fs = await import('node:fs/promises');
23
+ const path = await import('node:path');
24
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
25
+ await fs.writeFile(filePath, JSON.stringify(content, null, 2), 'utf-8');
26
+ }
27
+ function createId(prefix) {
28
+ const timestamp = Date.now().toString(36);
29
+ const random = Math.random().toString(36).slice(2, 8);
30
+ return `${prefix}_${timestamp}_${random}`;
31
+ }
32
+ export class AcodeMcpAdapter {
33
+ constructor(configPath) {
34
+ this.configPath = configPath;
35
+ this.appId = 'acode';
36
+ }
37
+ async importServers() {
38
+ const config = await readJsonFile(this.configPath, {});
39
+ const entries = Object.entries(config.mcpServers ?? {});
40
+ return entries.map(([name, server]) => ({
41
+ id: createId('mcp'),
42
+ name,
43
+ server,
44
+ apps: {
45
+ acode: true,
46
+ claude: false,
47
+ claudecode: false,
48
+ codex: false,
49
+ gemini: false,
50
+ opencode: false,
51
+ openclaw: false,
52
+ },
53
+ }));
54
+ }
55
+ async syncServer(server) {
56
+ const config = await readJsonFile(this.configPath, {});
57
+ config.mcpServers = {
58
+ ...(config.mcpServers ?? {}),
59
+ [server.name]: server.server,
60
+ };
61
+ await writeJsonFile(this.configPath, config);
62
+ }
63
+ async removeServer(server) {
64
+ const config = await readJsonFile(this.configPath, {});
65
+ if (!config.mcpServers?.[server.name]) {
66
+ return;
67
+ }
68
+ delete config.mcpServers[server.name];
69
+ await writeJsonFile(this.configPath, config);
70
+ }
71
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-acode.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-acode.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-acode.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import { AcodeMcpAdapter } from './mcp-acode.js';
6
+ let tempDir;
7
+ let configPath;
8
+ function buildServer(name = 'agents-work-studio') {
9
+ return {
10
+ id: 'mcp_test',
11
+ name,
12
+ server: {
13
+ type: 'stdio',
14
+ command: 'cmd',
15
+ args: ['/c', 'node', 'D:\\code\\AgentsWorkStudio\\aws-runtime-bridge\\package\\aws-client-agent-mcp\\dist\\index.js'],
16
+ env: {
17
+ AWS_SERVER_URL: 'ws://localhost:8080/ws/agent',
18
+ },
19
+ },
20
+ apps: {
21
+ acode: true,
22
+ claude: false,
23
+ claudecode: false,
24
+ codex: false,
25
+ gemini: false,
26
+ opencode: false,
27
+ openclaw: false,
28
+ },
29
+ };
30
+ }
31
+ beforeEach(async () => {
32
+ tempDir = await mkdtemp(path.join(os.tmpdir(), 'acode-mcp-adapter-'));
33
+ configPath = path.join(tempDir, '.acode', 'config.json');
34
+ });
35
+ afterEach(async () => {
36
+ await rm(tempDir, { recursive: true, force: true });
37
+ });
38
+ describe('AcodeMcpAdapter', () => {
39
+ it('syncs MCP servers into ACode config mcpServers while preserving provider config', async () => {
40
+ const adapter = new AcodeMcpAdapter(configPath);
41
+ await mkdir(path.dirname(configPath), { recursive: true });
42
+ await writeFile(configPath, JSON.stringify({ provider: { default: { model: 'test-model' } } }), 'utf-8');
43
+ await adapter.syncServer(buildServer());
44
+ const written = JSON.parse(await readFile(configPath, 'utf-8'));
45
+ expect(written.provider?.default).toEqual({ model: 'test-model' });
46
+ expect(written.mcpServers?.['agents-work-studio']).toMatchObject({
47
+ type: 'stdio',
48
+ command: 'cmd',
49
+ args: ['/c', 'node', 'D:\\code\\AgentsWorkStudio\\aws-runtime-bridge\\package\\aws-client-agent-mcp\\dist\\index.js'],
50
+ env: {
51
+ AWS_SERVER_URL: 'ws://localhost:8080/ws/agent',
52
+ },
53
+ });
54
+ });
55
+ it('imports and removes ACode MCP servers', async () => {
56
+ const adapter = new AcodeMcpAdapter(configPath);
57
+ await mkdir(path.dirname(configPath), { recursive: true });
58
+ await writeFile(configPath, JSON.stringify({
59
+ mcpServers: {
60
+ 'agents-work-studio': {
61
+ type: 'stdio',
62
+ command: 'cmd',
63
+ args: ['/c', 'node', 'old.js'],
64
+ },
65
+ playwright: {
66
+ type: 'stdio',
67
+ command: 'npx',
68
+ args: ['@playwright/mcp@latest'],
69
+ },
70
+ },
71
+ }), 'utf-8');
72
+ const imported = await adapter.importServers();
73
+ await adapter.removeServer(buildServer());
74
+ const written = JSON.parse(await readFile(configPath, 'utf-8'));
75
+ expect(imported).toHaveLength(2);
76
+ expect(imported[0]?.apps.acode).toBe(true);
77
+ expect(written.mcpServers?.['agents-work-studio']).toBeUndefined();
78
+ expect(written.mcpServers?.playwright).toBeDefined();
79
+ });
80
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-claude.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-claude.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAqD5E,qBAAa,gBAAiB,YAAW,WAAW;IAGtC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,KAAK,EAAG,QAAQ,CAAU;gBAEb,UAAU,EAAE,MAAM;IAEzC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAmBrC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CASrD"}
1
+ {"version":3,"file":"mcp-claude.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-claude.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAqD5E,qBAAa,gBAAiB,YAAW,WAAW;IAGtC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,KAAK,EAAG,QAAQ,CAAU;gBAEb,UAAU,EAAE,MAAM;IAEzC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAoBrC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CASrD"}
@@ -62,6 +62,7 @@ export class ClaudeMcpAdapter {
62
62
  name,
63
63
  server: toMcpSpecFromClaude(server),
64
64
  apps: {
65
+ acode: false,
65
66
  claude: true,
66
67
  claudecode: false,
67
68
  codex: false,
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-claudecode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-claudecode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAuC7D,qBAAa,oBAAqB,YAAW,WAAW;IAG1C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,KAAK,EAAG,YAAY,CAAU;gBAEjB,UAAU,EAAE,MAAM;IAEzC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAmBrC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CASrD"}
1
+ {"version":3,"file":"mcp-claudecode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-claudecode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAuC7D,qBAAa,oBAAqB,YAAW,WAAW;IAG1C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,KAAK,EAAG,YAAY,CAAU;gBAEjB,UAAU,EAAE,MAAM;IAEzC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAoBrC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CASrD"}
@@ -50,6 +50,7 @@ export class ClaudecodeMcpAdapter {
50
50
  name,
51
51
  server,
52
52
  apps: {
53
+ acode: false,
53
54
  claude: false,
54
55
  claudecode: true,
55
56
  codex: false,
@@ -18,6 +18,7 @@ function buildServer(name = 'agents-work-studio') {
18
18
  },
19
19
  },
20
20
  apps: {
21
+ acode: false,
21
22
  claude: false,
22
23
  claudecode: true,
23
24
  codex: false,
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-codex.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-codex.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAuP5E,qBAAa,eAAgB,YAAW,WAAW;IAGrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,KAAK,EAAG,OAAO,CAAU;gBAEZ,UAAU,EAAE,MAAM;IAEzC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAiBrC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAQrD"}
1
+ {"version":3,"file":"mcp-codex.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-codex.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAuP5E,qBAAa,eAAgB,YAAW,WAAW;IAGrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,KAAK,EAAG,OAAO,CAAU;gBAEZ,UAAU,EAAE,MAAM;IAEzC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAkBrC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAQrD"}
@@ -224,6 +224,7 @@ export class CodexMcpAdapter {
224
224
  name: block.name,
225
225
  server: parseCodexBlock(block),
226
226
  apps: {
227
+ acode: false,
227
228
  claude: false,
228
229
  claudecode: false,
229
230
  codex: true,
@@ -18,6 +18,7 @@ function buildServer(name = 'aws-client-agent-mcp') {
18
18
  },
19
19
  },
20
20
  apps: {
21
+ acode: false,
21
22
  claude: false,
22
23
  claudecode: false,
23
24
  codex: true,
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-opencode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-opencode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAwC7D,qBAAa,kBAAmB,YAAW,WAAW;IAGxC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,KAAK,EAAG,UAAU,CAAU;gBAEf,UAAU,EAAE,MAAM;IAE/C;;OAEG;IACH,OAAO,CAAC,SAAS;IAMjB;;OAEG;YACW,UAAU;IAQlB,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAmBrC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAUrD"}
1
+ {"version":3,"file":"mcp-opencode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-opencode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAwC7D,qBAAa,kBAAmB,YAAW,WAAW;IAGxC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,SAAgB,KAAK,EAAG,UAAU,CAAU;gBAEf,UAAU,EAAE,MAAM;IAE/C;;OAEG;IACH,OAAO,CAAC,SAAS;IAMjB;;OAEG;YACW,UAAU;IAQlB,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAoBrC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAUrD"}
@@ -69,6 +69,7 @@ export class OpenCodeMcpAdapter {
69
69
  name,
70
70
  server: toMcpSpecFromOpenCode(server),
71
71
  apps: {
72
+ acode: false,
72
73
  claude: false,
73
74
  claudecode: false,
74
75
  codex: false,
@@ -11,6 +11,7 @@ function buildServer(name = 'new-server') {
11
11
  name,
12
12
  server: { type: 'stdio', command: 'node', args: ['server.js'] },
13
13
  apps: {
14
+ acode: false,
14
15
  claude: false,
15
16
  claudecode: false,
16
17
  codex: false,
@@ -0,0 +1,11 @@
1
+ /**
2
+ * ACode Skill Adapter
3
+ *
4
+ * 主流程:复用目录型 Skill 同步,将已安装 Skill 物化到内置 ACode 的
5
+ * `.acode/skills` 目录,供 ACode headless runtime 启动时扫描。
6
+ */
7
+ import { DirectorySkillAdapter } from './skill-directory.js';
8
+ export declare class AcodeSkillAdapter extends DirectorySkillAdapter {
9
+ constructor(skillsDir: string);
10
+ }
11
+ //# sourceMappingURL=skill-acode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-acode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/skill-acode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,qBAAa,iBAAkB,SAAQ,qBAAqB;gBAC9C,SAAS,EAAE,MAAM;CAG9B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ACode Skill Adapter
3
+ *
4
+ * 主流程:复用目录型 Skill 同步,将已安装 Skill 物化到内置 ACode 的
5
+ * `.acode/skills` 目录,供 ACode headless runtime 启动时扫描。
6
+ */
7
+ import { DirectorySkillAdapter } from './skill-directory.js';
8
+ export class AcodeSkillAdapter extends DirectorySkillAdapter {
9
+ constructor(skillsDir) {
10
+ super('acode', skillsDir);
11
+ }
12
+ }
@@ -16,6 +16,7 @@ function buildSkill(name = 'frontend-design') {
16
16
  directory: path.join(tempDir, 'source'),
17
17
  description: 'A design skill',
18
18
  apps: {
19
+ acode: false,
19
20
  claude: false,
20
21
  claudecode: true,
21
22
  codex: false,
package/dist/config.d.ts CHANGED
@@ -43,12 +43,16 @@ export declare function getClaudeMcpConfigFile(runtimeHome: string): string;
43
43
  export declare function getClaudeSkillsDir(runtimeHome: string): string;
44
44
  /** 获取 OpenCode 配置文件路径 */
45
45
  export declare function getOpencodeConfigFile(runtimeHome: string): string;
46
+ /** 获取内置 ACode 配置文件路径 */
47
+ export declare function getAcodeConfigFile(runtimeHome: string): string;
46
48
  /** 获取 Codex 配置文件路径 */
47
49
  export declare function getCodexConfigFile(runtimeHome: string): string;
48
50
  /** 获取 Codex Skills 目录 */
49
51
  export declare function getCodexSkillsDir(runtimeHome: string): string;
50
52
  /** 获取 OpenCode Skills 目录 */
51
53
  export declare function getOpencodeSkillsDir(runtimeHome: string): string;
54
+ /** 获取内置 ACode Skills 目录 */
55
+ export declare function getAcodeSkillsDir(runtimeHome: string): string;
52
56
  /**
53
57
  * 孤儿进程监控配置
54
58
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,WAAW;AACX,eAAO,MAAM,IAAI,EAAE,MAElB,CAAC;AAEF,kBAAkB;AAClB,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAElE,MAAM,MAAM,sBAAsB,GAC9B,SAAS,GACT,KAAK,GACL,6BAA6B,GAC7B,SAAS,GACT,iCAAiC,CAAC;AAEtC,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,sBAAsB,CAAC;IAC/B,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AA+ED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,0BAA0B,CAEpE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,uBAAuB,EAAE,OAAO,GAC/B,0BAA0B,CA4C5B;AAED,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,EAAE,MAEH,CAAC;AAE7B,cAAc;AACd,eAAO,MAAM,OAAO,EAAE,MAA8C,CAAC;AAErE,oCAAoC;AACpC,eAAO,MAAM,oBAAoB,EAAE,OACiB,CAAC;AAErD,8BAA8B;AAC9B,eAAO,MAAM,kBAAkB,EAAE,MAAM,EAMC,CAAC;AAEzC,gEAAgE;AAChE,wBAAgB,uBAAuB,IAAI,IAAI,CAAG;AAElD,eAAe;AACf,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,8CAA8C;AAC9C,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED,2BAA2B;AAC3B,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED,0BAA0B;AAC1B,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,yBAAyB;AACzB,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,sBAAsB;AACtB,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED,yBAAyB;AACzB,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED,4BAA4B;AAC5B,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED;;GAEG;AAEH,yBAAyB;AACzB,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,sBAAsB,EACrB,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1C,eAAe;AACf,eAAO,MAAM,mBAAmB,SACiB,CAAC;AAElD,iCAAiC;AACjC,eAAO,MAAM,2BAA2B,QAEvC,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,uBAAuB,QAEnC,CAAC;AAEF;;GAEG;AAEH,eAAe;AACf,eAAO,MAAM,qBAAqB,SAA2C,CAAC;AAE9E,YAAY;AACZ,eAAO,MAAM,uBAAuB,QAAkC,CAAC;AAEvE,iBAAiB;AACjB,eAAO,MAAM,sBAAsB,QAAiC,CAAC;AAErE,oBAAoB;AACpB,eAAO,MAAM,2BAA2B,QAAsC,CAAC;AAE/E,WAAW;AACX,eAAO,MAAM,0BAA0B,QAAqC,CAAC;AAE7E,WAAW;AACX,eAAO,MAAM,uBAAuB,QAAkC,CAAC;AAEvE,aAAa;AACb,eAAO,MAAM,4BAA4B,QACH,CAAC;AAEvC,kCAAkC;AAClC,eAAO,MAAM,wBAAwB,QAC4B,CAAC;AAElE,aAAa;AACb,eAAO,MAAM,yBAAyB,QAErC,CAAC;AAEF,iBAAiB;AACjB,eAAO,MAAM,4BAA4B,QAExC,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -159,6 +159,11 @@ export function getOpencodeConfigFile(runtimeHome) {
159
159
  return (String(process.env.AWS_RUNTIME_OPENCODE_CONFIG_FILE || "").trim() ||
160
160
  path.join(runtimeHome, ".config", "opencode", "opencode.json"));
161
161
  }
162
+ /** 获取内置 ACode 配置文件路径 */
163
+ export function getAcodeConfigFile(runtimeHome) {
164
+ return (String(process.env.AWS_RUNTIME_ACODE_CONFIG_FILE || "").trim() ||
165
+ path.join(runtimeHome, ".acode", "config.json"));
166
+ }
162
167
  /** 获取 Codex 配置文件路径 */
163
168
  export function getCodexConfigFile(runtimeHome) {
164
169
  return (String(process.env.AWS_RUNTIME_CODEX_CONFIG_FILE || "").trim() ||
@@ -174,6 +179,11 @@ export function getOpencodeSkillsDir(runtimeHome) {
174
179
  return (String(process.env.AWS_RUNTIME_OPENCODE_SKILLS_DIR || "").trim() ||
175
180
  path.join(runtimeHome, ".opencode", "skills"));
176
181
  }
182
+ /** 获取内置 ACode Skills 目录 */
183
+ export function getAcodeSkillsDir(runtimeHome) {
184
+ return (String(process.env.AWS_RUNTIME_ACODE_SKILLS_DIR || "").trim() ||
185
+ path.join(runtimeHome, ".acode", "skills"));
186
+ }
177
187
  /**
178
188
  * 孤儿进程监控配置
179
189
  */
package/dist/index.js CHANGED
@@ -33,6 +33,7 @@ import { adapterRegistry } from "./adapter/index.js";
33
33
  import { logger } from "./utils/logger.js";
34
34
  import { autoRegister, unregister, bridgeRestartCleanup, } from "./services/auto-register.js";
35
35
  import { ensureAwsClientAgentMcpReleased } from "./services/aws-client-agent-mcp.js";
36
+ import { ensureAcodePackageReleased } from "./services/acode-package.js";
36
37
  import { ensureStartupConfig } from "./services/startup-config-wizard.js";
37
38
  import { handleCliCommand } from "./services/cli-commands.js";
38
39
  import { buildGracefulShutdownPlan, shouldCleanupPersistedSessionsOnStartup, } from "./services/runtime-lifecycle-policy.js";
@@ -45,6 +46,7 @@ if (cliCommandResult.handled) {
45
46
  await ensureStartupConfig();
46
47
  validateProductionToken();
47
48
  ensureAwsClientAgentMcpReleased();
49
+ ensureAcodePackageReleased();
48
50
  logRuntimeBindingStartupState();
49
51
  // ★ 启动时自动注册
50
52
  async function performAutoRegister() {
@@ -59,7 +59,7 @@ async function fetchRemoteModelList(baseUrl, apiKey) {
59
59
  return normalizeListedModels(anthropicResponse.data);
60
60
  }
61
61
  aiSourcesRouter.post('/cc-switch/apply-ai-sources', validateToken, async (req, res) => {
62
- const { agentId, template, ccSwitchEnabledTools, claudecodeTemplateId, codexTemplateId, opencodeTemplateId, claudecode, codex, opencode, } = req.body || {};
62
+ const { agentId, template, ccSwitchEnabledTools, acodeTemplateId, claudecodeTemplateId, codexTemplateId, opencodeTemplateId, acode, claudecode, codex, opencode, } = req.body || {};
63
63
  if (!agentId) {
64
64
  res.status(400).json({ error: 'agentId is required' });
65
65
  return;
@@ -70,13 +70,14 @@ aiSourcesRouter.post('/cc-switch/apply-ai-sources', validateToken, async (req, r
70
70
  const toolStatus = await detectToolStatuses(tools);
71
71
  const appliedSummary = await applyCurrentAiConfigToInstalledTools({
72
72
  template: template,
73
- requestedSources: { claudecode, codex, opencode },
73
+ requestedSources: { acode, claudecode, codex, opencode },
74
74
  toolStatus,
75
75
  aiConfigService,
76
76
  });
77
77
  res.json({
78
78
  ok: true,
79
79
  agentId: String(agentId),
80
+ acodeTemplateId: String(acodeTemplateId || ''),
80
81
  claudecodeTemplateId: String(claudecodeTemplateId || ''),
81
82
  codexTemplateId: String(codexTemplateId || ''),
82
83
  opencodeTemplateId: String(opencodeTemplateId || ''),
@@ -1 +1 @@
1
- {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/routes/instance.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAoBrD,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;AAsJvC,wBAAgB,4BAA4B,CAAC,gBAAgB,EAAE,MAAM,GAAG;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QACJ,EAAE,EAAE,OAAO,CAAC;QACZ,aAAa,CAAC,EAAE,SAAS,CAAC;QAC1B,oBAAoB,EAAE,OAAO,CAAC;QAC9B,qBAAqB,EAAE,OAAO,CAAC;QAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAqCA;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,gBAAgB,CAAC;IAC/B,aAAa,EAAE,SAAS,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,iCAAiC;IACzC,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,8BAA8B,CAAC;IACtC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,aAAa,EAAE,SAAS,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,KAAK,EACZ,0BAA0B,EAAE,MAAM,GACjC,4BAA4B,CAiB9B;AAoDD;;;GAGG;AACH,wBAAgB,sCAAsC,CACpD,UAAU,EAAE,MAAM,EAAE,GACnB,iCAAiC,CAUnC;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQhF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,MAAM,EAAE,EACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAC5C,MAAM,CAaR;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAC5C,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,OAAO,CAAC,CAAC,CAY3F"}
1
+ {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/routes/instance.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAqBrD,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;AAsJvC,wBAAgB,4BAA4B,CAAC,gBAAgB,EAAE,MAAM,GAAG;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QACJ,EAAE,EAAE,OAAO,CAAC;QACZ,aAAa,CAAC,EAAE,SAAS,CAAC;QAC1B,oBAAoB,EAAE,OAAO,CAAC;QAC9B,qBAAqB,EAAE,OAAO,CAAC;QAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAqCA;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,gBAAgB,CAAC;IAC/B,aAAa,EAAE,SAAS,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,iCAAiC;IACzC,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,8BAA8B,CAAC;IACtC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,aAAa,EAAE,SAAS,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,KAAK,EACZ,0BAA0B,EAAE,MAAM,GACjC,4BAA4B,CAiB9B;AAoDD;;;GAGG;AACH,wBAAgB,sCAAsC,CACpD,UAAU,EAAE,MAAM,EAAE,GACnB,iCAAiC,CAUnC;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQhF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,MAAM,EAAE,EACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAC5C,MAAM,CAaR;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAC5C,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,OAAO,CAAC,CAAC,CAY3F"}
@@ -2,19 +2,18 @@ import { Router } from "express";
2
2
  import axios from "axios";
3
3
  import { spawn } from "node:child_process";
4
4
  import { createHash, timingSafeEqual } from "node:crypto";
5
- import { validateToken } from "../middleware/auth.js";
6
5
  import { resolveSchedulerBaseUrlFrom } from "../config.js";
7
- import { getRuntimeAccessToken } from "../services/runtime-binding.js";
8
- import { loadInstanceState, saveInstanceState, } from "../services/instance-state.js";
9
- import { initInstance } from "../services/instance-init-service.js";
10
- import { discoverCcSwitchConfiguredItems, loadCcSwitchSdk } from "../services/cc-switch-sdk.js";
11
- import { syncLegacyStateFromSdk } from "../services/instance-init-service.js";
12
- import { detectToolStatuses, ensureToolsInstalled, SUPPORTED_INSTALLABLE_TOOLS, SUPPORTED_UNINSTALLABLE_TOOLS, uninstallTools, } from "../services/tool-installer.js";
6
+ import { validateToken } from "../middleware/auth.js";
13
7
  import { getConfiguredConnectionKeys, requestRuntimeAccessTokenRefreshForServer } from "../services/auto-register.js";
8
+ import { discoverCcSwitchConfiguredItems, loadCcSwitchSdk } from "../services/cc-switch-sdk.js";
9
+ import { initInstance, syncLegacyStateFromSdk } from "../services/instance-init-service.js";
14
10
  import { createBridgeLifecycleOperation, deliverPendingBridgeLifecycleNotifications, upsertBridgeLifecycleOperation, } from "../services/lifecycle-state.js";
11
+ import { loadInstanceState, saveInstanceState, } from "../services/instance-state.js";
12
+ import { getRuntimeAccessToken } from "../services/runtime-binding.js";
13
+ import { detectToolStatuses, ensureToolsInstalled, SUPPORTED_INSTALLABLE_TOOLS, SUPPORTED_UNINSTALLABLE_TOOLS, uninstallTools, } from "../services/tool-installer.js";
15
14
  import { createLogger } from "../utils/logger.js";
16
15
  const log = createLogger("instance");
17
- const PANEL_TOOL_STATUS_KEYS = ["claude", "opencode", "codex"];
16
+ const PANEL_TOOL_STATUS_KEYS = ["acode", "claude", "opencode", "codex"];
18
17
  // ★★★ 导出 gracefulShutdown 的触发函数
19
18
  // 用于 aws-mcp-server 通知 bridge 保留会话状态关闭
20
19
  let gracefulShutdownFn = null;
@@ -115,9 +115,10 @@ describe('instance route validation', () => {
115
115
  expect(buildToolStatusDetectionTargets(['claude', 'opencode'])).toEqual([
116
116
  'claude',
117
117
  'opencode',
118
+ 'acode',
118
119
  'codex',
119
120
  ]);
120
- });
121
+ }, 15_000);
121
122
  it('accepts codex for cc-switch tool installation validation', async () => {
122
123
  const { SUPPORTED_INSTALLABLE_TOOLS } = await import('../services/tool-installer.js');
123
124
  const normalizeInstallableTools = (tools) => {
@@ -4,7 +4,7 @@ import { discoverCcSwitchConfiguredItems, loadCcSwitchSdk, runCcSwitchAdapter }
4
4
  import { syncLegacyStateFromSdk } from '../services/instance-init-service.js';
5
5
  import { normalizeSdkAppFlags, normalizeSdkMcpServerSpec } from '../utils/mcp-utils.js';
6
6
  export const mcpRouter = Router();
7
- const TOGGLEABLE_APP_IDS = new Set(['claudecode', 'opencode', 'codex']);
7
+ const TOGGLEABLE_APP_IDS = new Set(['acode', 'claudecode', 'opencode', 'codex']);
8
8
  mcpRouter.post('/cc-switch/mcp/list', validateToken, async (req, res) => {
9
9
  const { agentId } = req.body || {};
10
10
  if (!agentId) {
@@ -106,7 +106,7 @@ mcpRouter.post('/cc-switch/mcp/toggle-app', validateToken, async (req, res) => {
106
106
  try {
107
107
  const normalizedAppId = String(appId).trim().toLowerCase();
108
108
  if (!TOGGLEABLE_APP_IDS.has(normalizedAppId)) {
109
- res.status(400).json({ error: 'appId must be one of claudecode, opencode, codex' });
109
+ res.status(400).json({ error: 'appId must be one of acode, claudecode, opencode, codex' });
110
110
  return;
111
111
  }
112
112
  const sdk = await loadCcSwitchSdk(agentId);
@@ -82,7 +82,8 @@ describe('app flags normalization', () => {
82
82
  expect(normalizeAppFlags(null)).toEqual([]);
83
83
  });
84
84
  it('allows supported per-tool toggle app ids', () => {
85
- const isSupportedToggleAppId = (appId) => ['claudecode', 'opencode', 'codex'].includes(appId);
85
+ const isSupportedToggleAppId = (appId) => ['acode', 'claudecode', 'opencode', 'codex'].includes(appId);
86
+ expect(isSupportedToggleAppId('acode')).toBe(true);
86
87
  expect(isSupportedToggleAppId('claudecode')).toBe(true);
87
88
  expect(isSupportedToggleAppId('opencode')).toBe(true);
88
89
  expect(isSupportedToggleAppId('codex')).toBe(true);
@@ -13,8 +13,9 @@ export interface RuntimeTokenRequestResult {
13
13
  error?: string;
14
14
  }
15
15
  /**
16
- * 主流程:读取当前 scoped token -> 必要时串行刷新 -> 锁内重读 token,避免多个 MCP 进程强刷时互相废弃新 token。
16
+ * 主流程:MCP Node token 必须通过 /runtime/binding/claim-agent 从启动绑定领取。
17
+ * 不再返回 bridge/user/server scoped runtime token,避免 MCP Node 降级使用旧 bridge 级凭据。
17
18
  */
18
- export declare function resolveRuntimeTokenRequest(input: RuntimeTokenRequestInput): Promise<RuntimeTokenRequestResult>;
19
+ export declare function resolveRuntimeTokenRequest(input: RuntimeTokenRequestInput): RuntimeTokenRequestResult;
19
20
  export declare function logRuntimeBindingStartupState(): void;
20
21
  //# sourceMappingURL=runtime-binding.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-binding.d.ts","sourceRoot":"","sources":["../../src/routes/runtime-binding.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,oBAAoB,4CAAW,CAAC;AAE7C,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqCD;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,yBAAyB,CAAC,CAyCpC;AAqMD,wBAAgB,6BAA6B,IAAI,IAAI,CAapD"}
1
+ {"version":3,"file":"runtime-binding.d.ts","sourceRoot":"","sources":["../../src/routes/runtime-binding.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,oBAAoB,4CAAW,CAAC;AAE7C,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,wBAAwB,GAC9B,yBAAyB,CAM3B;AAqMD,wBAAgB,6BAA6B,IAAI,IAAI,CAapD"}
@@ -1,67 +1,20 @@
1
1
  import { Router } from "express";
2
2
  import { validateToken } from "../middleware/auth.js";
3
- import { requestRuntimeAccessTokenRefresh, requestRuntimeAccessTokenRefreshForServer } from "../services/auto-register.js";
4
3
  import { claimMcpLaunchBinding, getMcpLaunchQueueSize } from "../services/mcp-launch-binding-queue.js";
5
4
  import { clearRuntimeBinding, getRuntimeAccessToken, getRuntimeBindingPublicState, getRuntimePairingCode, hasRuntimeBinding, saveRuntimeBinding, validateRuntimeBindingToken, validateRuntimePairingCode, } from "../services/runtime-binding.js";
6
5
  import { createLogger } from "../utils/logger.js";
7
6
  const log = createLogger("runtime-binding-route");
8
7
  export const runtimeBindingRouter = Router();
9
- const runtimeTokenRefreshLocks = new Map();
10
- function buildRuntimeTokenRefreshLockKey(userId, serverUrl) {
11
- return `${String(userId || "").trim()}\n${String(serverUrl || "").trim()}`;
12
- }
13
- async function withRuntimeTokenRefreshLock(userId, serverUrl, operation) {
14
- const lockKey = buildRuntimeTokenRefreshLockKey(userId, serverUrl);
15
- const previous = runtimeTokenRefreshLocks.get(lockKey) ?? Promise.resolve();
16
- let release;
17
- const current = new Promise((resolve) => {
18
- release = resolve;
19
- });
20
- const chained = previous.then(() => current);
21
- runtimeTokenRefreshLocks.set(lockKey, chained);
22
- await previous;
23
- try {
24
- return await operation();
25
- }
26
- finally {
27
- release();
28
- if (runtimeTokenRefreshLocks.get(lockKey) === chained) {
29
- runtimeTokenRefreshLocks.delete(lockKey);
30
- }
31
- }
32
- }
33
8
  /**
34
- * 主流程:读取当前 scoped token -> 必要时串行刷新 -> 锁内重读 token,避免多个 MCP 进程强刷时互相废弃新 token。
9
+ * 主流程:MCP Node token 必须通过 /runtime/binding/claim-agent 从启动绑定领取。
10
+ * 不再返回 bridge/user/server scoped runtime token,避免 MCP Node 降级使用旧 bridge 级凭据。
35
11
  */
36
- export async function resolveRuntimeTokenRequest(input) {
37
- const { userId, serverUrl, schedulerBaseUrl, forceRefresh } = input;
38
- const requestedServerUrl = serverUrl || schedulerBaseUrl;
39
- const scopedToken = getRuntimeAccessToken(userId, requestedServerUrl);
40
- if (scopedToken && forceRefresh !== true) {
41
- return {
42
- success: true,
43
- runtimeAccessToken: scopedToken,
44
- updated: false,
45
- };
46
- }
47
- return await withRuntimeTokenRefreshLock(userId, requestedServerUrl, async () => {
48
- const latestScopedToken = getRuntimeAccessToken(userId, requestedServerUrl);
49
- const rejectedRuntimeAccessToken = String(input.rejectedRuntimeAccessToken || "").trim();
50
- if (forceRefresh === true &&
51
- latestScopedToken &&
52
- rejectedRuntimeAccessToken &&
53
- latestScopedToken !== rejectedRuntimeAccessToken) {
54
- return {
55
- success: true,
56
- runtimeAccessToken: latestScopedToken,
57
- updated: false,
58
- };
59
- }
60
- if (requestedServerUrl) {
61
- return await requestRuntimeAccessTokenRefreshForServer(String(requestedServerUrl));
62
- }
63
- return await requestRuntimeAccessTokenRefresh();
64
- });
12
+ export function resolveRuntimeTokenRequest(input) {
13
+ void input;
14
+ return {
15
+ success: false,
16
+ error: "MCP runtime token must be claimed from launch binding; bridge-scoped token refresh is disabled",
17
+ };
65
18
  }
66
19
  function extractRuntimeToken(req) {
67
20
  const headerToken = req.header("X-Runtime-Token");
@@ -130,7 +83,7 @@ runtimeBindingRouter.post("/binding/request-token", async (req, res) => {
130
83
  res.status(403).json({ ok: false, error: "loopback request required" });
131
84
  return;
132
85
  }
133
- const result = await resolveRuntimeTokenRequest(req.body || {});
86
+ const result = resolveRuntimeTokenRequest(req.body || {});
134
87
  if (!result.success || !result.runtimeAccessToken) {
135
88
  res.status(400).json({
136
89
  ok: false,
@@ -149,7 +102,7 @@ runtimeBindingRouter.post("/binding/claim-agent", (req, res) => {
149
102
  res.status(403).json({ ok: false, error: "loopback request required" });
150
103
  return;
151
104
  }
152
- const { workspacePath, serverUrl } = req.body || {};
105
+ const { agentId, workspacePath, serverUrl } = req.body || {};
153
106
  if (!workspacePath || !String(workspacePath).trim()) {
154
107
  res.status(400).json({ ok: false, error: "workspacePath is required" });
155
108
  return;
@@ -158,7 +111,7 @@ runtimeBindingRouter.post("/binding/claim-agent", (req, res) => {
158
111
  res.status(400).json({ ok: false, error: "serverUrl is required" });
159
112
  return;
160
113
  }
161
- const claimed = claimMcpLaunchBinding({ workspacePath, serverUrl });
114
+ const claimed = claimMcpLaunchBinding({ agentId, workspacePath, serverUrl });
162
115
  if (!claimed) {
163
116
  res.status(404).json({
164
117
  ok: false,