aws-runtime-bridge 1.7.48 → 1.7.50

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 (166) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +77 -0
  2. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -0
  3. package/dist/adapter/AcodeSdkAdapter.js +322 -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 +273 -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/SdkProviderSpi.d.ts.map +1 -1
  12. package/dist/adapter/SdkProviderSpi.js +10 -1
  13. package/dist/adapter/index.d.ts +1 -0
  14. package/dist/adapter/index.d.ts.map +1 -1
  15. package/dist/adapter/index.js +1 -0
  16. package/dist/adapters/cc-switch/index.d.ts +2 -0
  17. package/dist/adapters/cc-switch/index.d.ts.map +1 -1
  18. package/dist/adapters/cc-switch/index.js +6 -0
  19. package/dist/adapters/cc-switch/mcp-acode.d.ts +17 -0
  20. package/dist/adapters/cc-switch/mcp-acode.d.ts.map +1 -0
  21. package/dist/adapters/cc-switch/mcp-acode.js +71 -0
  22. package/dist/adapters/cc-switch/mcp-acode.test.d.ts +2 -0
  23. package/dist/adapters/cc-switch/mcp-acode.test.d.ts.map +1 -0
  24. package/dist/adapters/cc-switch/mcp-acode.test.js +80 -0
  25. package/dist/adapters/cc-switch/mcp-claude.d.ts.map +1 -1
  26. package/dist/adapters/cc-switch/mcp-claude.js +1 -0
  27. package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +1 -1
  28. package/dist/adapters/cc-switch/mcp-claudecode.js +1 -0
  29. package/dist/adapters/cc-switch/mcp-claudecode.test.js +1 -0
  30. package/dist/adapters/cc-switch/mcp-codex.d.ts.map +1 -1
  31. package/dist/adapters/cc-switch/mcp-codex.js +1 -0
  32. package/dist/adapters/cc-switch/mcp-codex.test.js +1 -0
  33. package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +1 -1
  34. package/dist/adapters/cc-switch/mcp-opencode.js +1 -0
  35. package/dist/adapters/cc-switch/mcp-opencode.test.js +1 -0
  36. package/dist/adapters/cc-switch/skill-acode.d.ts +11 -0
  37. package/dist/adapters/cc-switch/skill-acode.d.ts.map +1 -0
  38. package/dist/adapters/cc-switch/skill-acode.js +12 -0
  39. package/dist/adapters/cc-switch/skill-directory.test.js +1 -0
  40. package/dist/config.d.ts +4 -0
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js +10 -0
  43. package/dist/index.js +2 -0
  44. package/dist/routes/ai-sources.js +3 -2
  45. package/dist/routes/instance.js +1 -1
  46. package/dist/routes/instance.test.js +2 -1
  47. package/dist/routes/mcp.js +2 -2
  48. package/dist/routes/mcp.test.js +2 -1
  49. package/dist/routes/runtime-binding.d.ts +3 -2
  50. package/dist/routes/runtime-binding.d.ts.map +1 -1
  51. package/dist/routes/runtime-binding.js +9 -56
  52. package/dist/routes/runtime-binding.test.js +4 -80
  53. package/dist/routes/sessions.d.ts +5 -0
  54. package/dist/routes/sessions.d.ts.map +1 -1
  55. package/dist/routes/sessions.js +36 -16
  56. package/dist/routes/sessions.test.js +13 -0
  57. package/dist/routes/skills.js +2 -2
  58. package/dist/routes/skills.test.js +2 -1
  59. package/dist/routes/terminal.d.ts +24 -4
  60. package/dist/routes/terminal.d.ts.map +1 -1
  61. package/dist/routes/terminal.js +99 -10
  62. package/dist/routes/terminal.test.js +74 -8
  63. package/dist/services/acode-package.d.ts +8 -0
  64. package/dist/services/acode-package.d.ts.map +1 -0
  65. package/dist/services/acode-package.js +82 -0
  66. package/dist/services/ai-source-apply.d.ts +4 -0
  67. package/dist/services/ai-source-apply.d.ts.map +1 -1
  68. package/dist/services/ai-source-apply.js +38 -9
  69. package/dist/services/ai-source-apply.test.js +58 -1
  70. package/dist/services/cc-switch-sdk.d.ts.map +1 -1
  71. package/dist/services/cc-switch-sdk.js +9 -1
  72. package/dist/services/instance-init-service.d.ts.map +1 -1
  73. package/dist/services/instance-init-service.js +3 -2
  74. package/dist/services/instance-init-service.test.js +6 -5
  75. package/dist/services/instance-service.d.ts.map +1 -1
  76. package/dist/services/instance-service.js +1 -0
  77. package/dist/services/instance-state.js +1 -1
  78. package/dist/services/instance-state.test.js +4 -4
  79. package/dist/services/tool-installer.d.ts.map +1 -1
  80. package/dist/services/tool-installer.js +10 -0
  81. package/dist/types.d.ts +5 -0
  82. package/dist/types.d.ts.map +1 -1
  83. package/dist/utils/file-utils.d.ts.map +1 -1
  84. package/dist/utils/file-utils.js +1 -0
  85. package/dist/utils/mcp-utils.d.ts.map +1 -1
  86. package/dist/utils/mcp-utils.js +4 -1
  87. package/dist/utils/validation.js +1 -1
  88. package/node_modules/@cc-switch/sdk/dist/constants.d.ts.map +1 -1
  89. package/node_modules/@cc-switch/sdk/dist/constants.js +7 -0
  90. package/node_modules/@cc-switch/sdk/dist/schemas.d.ts.map +1 -1
  91. package/node_modules/@cc-switch/sdk/dist/schemas.js +1 -0
  92. package/node_modules/@cc-switch/sdk/dist/sdk.d.ts.map +1 -1
  93. package/node_modules/@cc-switch/sdk/dist/sdk.js +7 -3
  94. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts +7 -0
  95. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts.map +1 -1
  96. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.js +29 -2
  97. package/node_modules/@cc-switch/sdk/dist/types.d.ts +4 -1
  98. package/node_modules/@cc-switch/sdk/dist/types.d.ts.map +1 -1
  99. package/package/acode/README.md +88 -0
  100. package/package/acode/dist/built-in-file-tools.d.ts +16 -0
  101. package/package/acode/dist/built-in-file-tools.d.ts.map +1 -0
  102. package/package/acode/dist/built-in-file-tools.js +231 -0
  103. package/package/acode/dist/cli.d.ts +3 -0
  104. package/package/acode/dist/cli.d.ts.map +1 -0
  105. package/package/acode/dist/cli.js +37 -0
  106. package/package/acode/dist/commands/commandLoader.d.ts +7 -0
  107. package/package/acode/dist/commands/commandLoader.d.ts.map +1 -0
  108. package/package/acode/dist/commands/commandLoader.js +33 -0
  109. package/package/acode/dist/commands/commandParser.d.ts +7 -0
  110. package/package/acode/dist/commands/commandParser.d.ts.map +1 -0
  111. package/package/acode/dist/commands/commandParser.js +77 -0
  112. package/package/acode/dist/commands/commandRegistry.d.ts +13 -0
  113. package/package/acode/dist/commands/commandRegistry.d.ts.map +1 -0
  114. package/package/acode/dist/commands/commandRegistry.js +30 -0
  115. package/package/acode/dist/config.d.ts +4 -0
  116. package/package/acode/dist/config.d.ts.map +1 -0
  117. package/package/acode/dist/config.js +80 -0
  118. package/package/acode/dist/hooks/hookBus.d.ts +19 -0
  119. package/package/acode/dist/hooks/hookBus.d.ts.map +1 -0
  120. package/package/acode/dist/hooks/hookBus.js +40 -0
  121. package/package/acode/dist/index.d.ts +8 -0
  122. package/package/acode/dist/index.d.ts.map +1 -0
  123. package/package/acode/dist/index.js +7 -0
  124. package/package/acode/dist/runtime.d.ts +34 -0
  125. package/package/acode/dist/runtime.d.ts.map +1 -0
  126. package/package/acode/dist/runtime.js +571 -0
  127. package/package/acode/dist/types.d.ts +99 -0
  128. package/package/acode/dist/types.d.ts.map +1 -0
  129. package/package/acode/dist/types.js +1 -0
  130. package/package/acode/package.json +24 -0
  131. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +4 -4
  132. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
  133. package/package/aws-client-agent-mcp/dist/agent-client.js +9 -6
  134. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
  135. package/package/aws-client-agent-mcp/dist/agent-client.test.js +21 -0
  136. package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +1 -1
  137. package/package/aws-client-agent-mcp/dist/http-client.d.ts +1 -17
  138. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
  139. package/package/aws-client-agent-mcp/dist/http-client.js +7 -113
  140. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
  141. package/package/aws-client-agent-mcp/dist/http-client.test.js +22 -2
  142. package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -1
  143. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -5
  144. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  145. package/package/aws-client-agent-mcp/dist/mcp-server.js +1 -23
  146. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  147. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +89 -6
  148. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  149. package/package/aws-client-agent-mcp/dist/types.d.ts +3 -0
  150. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  151. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +0 -13
  152. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
  153. package/package/aws-client-agent-mcp/dist/websocket-client.js +3 -100
  154. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
  155. package/package/cc-switch-sdk/dist/constants.d.ts.map +1 -1
  156. package/package/cc-switch-sdk/dist/constants.js +7 -0
  157. package/package/cc-switch-sdk/dist/schemas.d.ts.map +1 -1
  158. package/package/cc-switch-sdk/dist/schemas.js +1 -0
  159. package/package/cc-switch-sdk/dist/sdk.d.ts.map +1 -1
  160. package/package/cc-switch-sdk/dist/sdk.js +7 -3
  161. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +7 -0
  162. package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +1 -1
  163. package/package/cc-switch-sdk/dist/services/ai-config-service.js +29 -2
  164. package/package/cc-switch-sdk/dist/types.d.ts +4 -1
  165. package/package/cc-switch-sdk/dist/types.d.ts.map +1 -1
  166. package/package.json +8 -4
@@ -2,7 +2,7 @@
2
2
  * Adapter 注册表 —— 管理 Provider ID → Adapter 实例的映射
3
3
  */
4
4
  import type { BaseProviderAdapter } from './types.js';
5
- export type AdapterType = 'claude-sdk' | 'codex-sdk' | 'opencode-sdk';
5
+ export type AdapterType = 'acode-sdk' | 'claude-sdk' | 'codex-sdk' | 'opencode-sdk';
6
6
  /**
7
7
  * Adapter 注册表
8
8
  * 管理所有 Provider Adapter 实例的生命周期
@@ -1 +1 @@
1
- {"version":3,"file":"AdapterRegistry.d.ts","sourceRoot":"","sources":["../../src/adapter/AdapterRegistry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAEtE;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAA+C;IAE/D;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAO5C;;;;OAIG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB;IAU5C;;;;OAIG;IACH,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,mBAAmB;IASxD;;;OAGG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAI5B;;OAEG;IACH,MAAM,IAAI,mBAAmB,EAAE;IAI/B;;OAEG;IACH,OAAO,IAAI,IAAI;IAWf;;OAEG;IACH,OAAO,CAAC,SAAS;CAYlB;AAGD,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
1
+ {"version":3,"file":"AdapterRegistry.d.ts","sourceRoot":"","sources":["../../src/adapter/AdapterRegistry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAEpF;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAA+C;IAE/D;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAO5C;;;;OAIG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB;IAU5C;;;;OAIG;IACH,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,mBAAmB;IASxD;;;OAGG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAI5B;;OAEG;IACH,MAAM,IAAI,mBAAmB,EAAE;IAI/B;;OAEG;IACH,OAAO,IAAI,IAAI;IAWf;;OAEG;IACH,OAAO,CAAC,SAAS;CAclB;AAGD,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
@@ -85,6 +85,8 @@ export class AdapterRegistry {
85
85
  switch (adapterType) {
86
86
  case 'claude-sdk':
87
87
  return providerId === 'claude-code';
88
+ case 'acode-sdk':
89
+ return providerId === 'acode';
88
90
  case 'codex-sdk':
89
91
  return providerId === 'codex';
90
92
  case 'opencode-sdk':
@@ -4,6 +4,7 @@
4
4
  import { EventEmitter } from 'node:events';
5
5
  import { beforeEach, describe, expect, it } from 'vitest';
6
6
  import { AdapterRegistry } from '../adapter/AdapterRegistry.js';
7
+ import { toAcodeEsmImportSpecifier } from '../adapter/AcodeSdkAdapter.js';
7
8
  import { registerSdkProviders } from '../adapter/SdkProviderSpi.js';
8
9
  import { CodexSdkAdapter } from './CodexSdkAdapter.js';
9
10
  // 创建测试用的 Mock Adapter
@@ -94,10 +95,18 @@ describe('AdapterRegistry', () => {
94
95
  describe('SDK provider SPI', () => {
95
96
  it('registers built-in SDK providers through one extension point', () => {
96
97
  registerSdkProviders(registry, () => { });
97
- expect(registry.getRegisteredIds().sort()).toEqual(['claude-code', 'codex', 'opencode']);
98
+ expect(registry.getRegisteredIds().sort()).toEqual(['acode', 'claude-code', 'codex', 'opencode']);
98
99
  expect(registry.get('codex').providerId).toBe('codex');
99
100
  });
100
101
  });
102
+ describe('ACode ESM import specifier', () => {
103
+ it('converts Windows absolute paths to file URLs for dynamic import', () => {
104
+ const specifier = toAcodeEsmImportSpecifier('C:\\runtime-home\\.agentswork\\runtime-bridge\\packages\\acode\\dist\\index.js');
105
+ expect(specifier).toMatch(/^file:\/\//);
106
+ expect(specifier).not.toMatch(/^c:/i);
107
+ expect(specifier).toContain('acode');
108
+ });
109
+ });
101
110
  describe('cleanup', () => {
102
111
  it('should clear all adapters', () => {
103
112
  const adapter = new MockAdapter();
@@ -1 +1 @@
1
- {"version":3,"file":"SdkProviderSpi.d.ts","sourceRoot":"","sources":["../../src/adapter/SdkProviderSpi.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,mBAAmB,CAAC;CAC1C;AAED,eAAO,MAAM,wBAAwB,EAAE,qBAAqB,EAyB3D,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAOnF;AAED,wBAAgB,6BAA6B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,iBAAiB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,qBAAqB,KAAK,IAAI,GAC3F,IAAI,CASN"}
1
+ {"version":3,"file":"SdkProviderSpi.d.ts","sourceRoot":"","sources":["../../src/adapter/SdkProviderSpi.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,mBAAmB,CAAC;CAC1C;AAED,eAAO,MAAM,wBAAwB,EAAE,qBAAqB,EAiC3D,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAOnF;AAED,wBAAgB,6BAA6B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,iBAAiB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,qBAAqB,KAAK,IAAI,GAC3F,IAAI,CASN"}
@@ -1,7 +1,16 @@
1
+ import { AcodeSdkAdapter } from './AcodeSdkAdapter.js';
1
2
  import { ClaudeSdkAdapter } from './ClaudeSdkAdapter.js';
2
3
  import { CodexSdkAdapter } from './CodexSdkAdapter.js';
3
4
  import { OpencodeSdkAdapter } from './OpencodeSdkAdapter.js';
4
5
  export const SDK_PROVIDER_DEFINITIONS = [
6
+ {
7
+ runtimeMode: 'acode',
8
+ providerId: 'acode',
9
+ displayName: 'ACode',
10
+ defaultCommand: 'acode',
11
+ commandMatchers: ['acode'],
12
+ createAdapter: () => new AcodeSdkAdapter(),
13
+ },
5
14
  {
6
15
  runtimeMode: 'claudecode',
7
16
  providerId: 'claude-code',
@@ -28,7 +37,7 @@ export const SDK_PROVIDER_DEFINITIONS = [
28
37
  },
29
38
  ];
30
39
  export function resolveSdkProviderByCommand(command) {
31
- const normalizedCommand = String(command || 'claude').trim().toLowerCase();
40
+ const normalizedCommand = String(command || 'acode').trim().toLowerCase();
32
41
  return (SDK_PROVIDER_DEFINITIONS.find((definition) => definition.commandMatchers.some((matcher) => normalizedCommand.includes(matcher))) || SDK_PROVIDER_DEFINITIONS[0]);
33
42
  }
34
43
  export function resolveSdkProviderIdByCommand(command) {
@@ -4,6 +4,7 @@
4
4
  */
5
5
  export * from './types.js';
6
6
  export * from './AdapterRegistry.js';
7
+ export * from './AcodeSdkAdapter.js';
7
8
  export * from './ClaudeSdkAdapter.js';
8
9
  export * from './CodexSdkAdapter.js';
9
10
  export * from './OpencodeSdkAdapter.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapter/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapter/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC"}
@@ -4,6 +4,7 @@
4
4
  */
5
5
  export * from './types.js';
6
6
  export * from './AdapterRegistry.js';
7
+ export * from './AcodeSdkAdapter.js';
7
8
  export * from './ClaudeSdkAdapter.js';
8
9
  export * from './CodexSdkAdapter.js';
9
10
  export * from './OpencodeSdkAdapter.js';
@@ -4,11 +4,13 @@
4
4
  * 提供工厂函数创建所有 MCP 和 Skill 适配器实例
5
5
  */
6
6
  import type { AppId, IMcpAdapter, ISkillAdapter, SdkPaths } from '@cc-switch/sdk';
7
+ export { AcodeMcpAdapter } from './mcp-acode.js';
7
8
  export { ClaudeMcpAdapter } from './mcp-claude.js';
8
9
  export { ClaudecodeMcpAdapter } from './mcp-claudecode.js';
9
10
  export { CodexMcpAdapter } from './mcp-codex.js';
10
11
  export { OpenCodeMcpAdapter } from './mcp-opencode.js';
11
12
  export { PlaceholderMcpAdapter } from './mcp-placeholder.js';
13
+ export { AcodeSkillAdapter } from './skill-acode.js';
12
14
  export { ClaudeSkillAdapter } from './skill-claude.js';
13
15
  export { ClaudecodeSkillAdapter } from './skill-claudecode.js';
14
16
  export { CodexSkillAdapter } from './skill-codex.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAWlF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,cAAc,aAAa,CAAC;AAE5B;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAS7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CASjF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAalF,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,cAAc,aAAa,CAAC;AAE5B;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAU7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAUjF"}
@@ -3,20 +3,24 @@
3
3
  *
4
4
  * 提供工厂函数创建所有 MCP 和 Skill 适配器实例
5
5
  */
6
+ import { AcodeMcpAdapter } from './mcp-acode.js';
6
7
  import { ClaudecodeMcpAdapter } from './mcp-claudecode.js';
7
8
  import { CodexMcpAdapter } from './mcp-codex.js';
8
9
  import { OpenCodeMcpAdapter } from './mcp-opencode.js';
9
10
  import { PlaceholderMcpAdapter } from './mcp-placeholder.js';
11
+ import { AcodeSkillAdapter } from './skill-acode.js';
10
12
  import { ClaudecodeSkillAdapter } from './skill-claudecode.js';
11
13
  import { CodexSkillAdapter } from './skill-codex.js';
12
14
  import { OpenCodeSkillAdapter } from './skill-opencode.js';
13
15
  import { PlaceholderSkillAdapter } from './skill-placeholder.js';
14
16
  // 导出所有适配器类
17
+ export { AcodeMcpAdapter } from './mcp-acode.js';
15
18
  export { ClaudeMcpAdapter } from './mcp-claude.js';
16
19
  export { ClaudecodeMcpAdapter } from './mcp-claudecode.js';
17
20
  export { CodexMcpAdapter } from './mcp-codex.js';
18
21
  export { OpenCodeMcpAdapter } from './mcp-opencode.js';
19
22
  export { PlaceholderMcpAdapter } from './mcp-placeholder.js';
23
+ export { AcodeSkillAdapter } from './skill-acode.js';
20
24
  export { ClaudeSkillAdapter } from './skill-claude.js';
21
25
  export { ClaudecodeSkillAdapter } from './skill-claudecode.js';
22
26
  export { CodexSkillAdapter } from './skill-codex.js';
@@ -28,6 +32,7 @@ export * from './common.js';
28
32
  */
29
33
  export function createMcpAdapters(paths) {
30
34
  return {
35
+ acode: new AcodeMcpAdapter(paths.acodeConfigFile),
31
36
  claude: new PlaceholderMcpAdapter("claude"),
32
37
  claudecode: new ClaudecodeMcpAdapter(paths.claudecodeConfigFile),
33
38
  opencode: new OpenCodeMcpAdapter(paths.opencodeConfigFile),
@@ -41,6 +46,7 @@ export function createMcpAdapters(paths) {
41
46
  */
42
47
  export function createSkillAdapters(paths) {
43
48
  return {
49
+ acode: new AcodeSkillAdapter(paths.acodeSkillsDir),
44
50
  claude: new PlaceholderSkillAdapter("claude"),
45
51
  claudecode: new ClaudecodeSkillAdapter(paths.claudecodeSkillsDir),
46
52
  opencode: new OpenCodeSkillAdapter(paths.opencodeSkillsDir),
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ACode MCP Adapter
3
+ *
4
+ * 主流程:读取内置 ACode 的 JSON 配置 -> 将 mcpServers 映射导入 SDK ->
5
+ * 按 SDK 状态增删 ACode 配置中的 MCP server。ACode 内置在 runtime-bridge 中,
6
+ * 因此不需要外部 CLI 安装步骤。
7
+ */
8
+ import type { IMcpAdapter, McpServer } from '@cc-switch/sdk';
9
+ export declare class AcodeMcpAdapter implements IMcpAdapter {
10
+ private readonly configPath;
11
+ readonly appId: "acode";
12
+ constructor(configPath: string);
13
+ importServers(): Promise<McpServer[]>;
14
+ syncServer(server: McpServer): Promise<void>;
15
+ removeServer(server: McpServer): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=mcp-acode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-acode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cc-switch/mcp-acode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAiC5E,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;IAoBrC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5C,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAQrD"}
@@ -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 || ''),
@@ -14,7 +14,7 @@ import { getConfiguredConnectionKeys, requestRuntimeAccessTokenRefreshForServer
14
14
  import { createBridgeLifecycleOperation, deliverPendingBridgeLifecycleNotifications, upsertBridgeLifecycleOperation, } from "../services/lifecycle-state.js";
15
15
  import { createLogger } from "../utils/logger.js";
16
16
  const log = createLogger("instance");
17
- const PANEL_TOOL_STATUS_KEYS = ["claude", "opencode", "codex"];
17
+ const PANEL_TOOL_STATUS_KEYS = ["acode", "claude", "opencode", "codex"];
18
18
  // ★★★ 导出 gracefulShutdown 的触发函数
19
19
  // 用于 aws-mcp-server 通知 bridge 保留会话状态关闭
20
20
  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);