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.
- package/dist/adapter/AcodeSdkAdapter.d.ts +77 -0
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -0
- package/dist/adapter/AcodeSdkAdapter.js +322 -0
- package/dist/adapter/AcodeSdkAdapter.test.d.ts +2 -0
- package/dist/adapter/AcodeSdkAdapter.test.d.ts.map +1 -0
- package/dist/adapter/AcodeSdkAdapter.test.js +273 -0
- package/dist/adapter/AdapterRegistry.d.ts +1 -1
- package/dist/adapter/AdapterRegistry.d.ts.map +1 -1
- package/dist/adapter/AdapterRegistry.js +2 -0
- package/dist/adapter/AdapterRegistry.test.js +10 -1
- package/dist/adapter/SdkProviderSpi.d.ts.map +1 -1
- package/dist/adapter/SdkProviderSpi.js +10 -1
- package/dist/adapter/index.d.ts +1 -0
- package/dist/adapter/index.d.ts.map +1 -1
- package/dist/adapter/index.js +1 -0
- package/dist/adapters/cc-switch/index.d.ts +2 -0
- package/dist/adapters/cc-switch/index.d.ts.map +1 -1
- package/dist/adapters/cc-switch/index.js +6 -0
- package/dist/adapters/cc-switch/mcp-acode.d.ts +17 -0
- package/dist/adapters/cc-switch/mcp-acode.d.ts.map +1 -0
- package/dist/adapters/cc-switch/mcp-acode.js +71 -0
- package/dist/adapters/cc-switch/mcp-acode.test.d.ts +2 -0
- package/dist/adapters/cc-switch/mcp-acode.test.d.ts.map +1 -0
- package/dist/adapters/cc-switch/mcp-acode.test.js +80 -0
- package/dist/adapters/cc-switch/mcp-claude.d.ts.map +1 -1
- package/dist/adapters/cc-switch/mcp-claude.js +1 -0
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +1 -1
- package/dist/adapters/cc-switch/mcp-claudecode.js +1 -0
- package/dist/adapters/cc-switch/mcp-claudecode.test.js +1 -0
- package/dist/adapters/cc-switch/mcp-codex.d.ts.map +1 -1
- package/dist/adapters/cc-switch/mcp-codex.js +1 -0
- package/dist/adapters/cc-switch/mcp-codex.test.js +1 -0
- package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +1 -1
- package/dist/adapters/cc-switch/mcp-opencode.js +1 -0
- package/dist/adapters/cc-switch/mcp-opencode.test.js +1 -0
- package/dist/adapters/cc-switch/skill-acode.d.ts +11 -0
- package/dist/adapters/cc-switch/skill-acode.d.ts.map +1 -0
- package/dist/adapters/cc-switch/skill-acode.js +12 -0
- package/dist/adapters/cc-switch/skill-directory.test.js +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -0
- package/dist/index.js +2 -0
- package/dist/routes/ai-sources.js +3 -2
- package/dist/routes/instance.js +1 -1
- package/dist/routes/instance.test.js +2 -1
- package/dist/routes/mcp.js +2 -2
- package/dist/routes/mcp.test.js +2 -1
- package/dist/routes/runtime-binding.d.ts +3 -2
- package/dist/routes/runtime-binding.d.ts.map +1 -1
- package/dist/routes/runtime-binding.js +9 -56
- package/dist/routes/runtime-binding.test.js +4 -80
- package/dist/routes/sessions.d.ts +5 -0
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +36 -16
- package/dist/routes/sessions.test.js +13 -0
- package/dist/routes/skills.js +2 -2
- package/dist/routes/skills.test.js +2 -1
- package/dist/routes/terminal.d.ts +24 -4
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +99 -10
- package/dist/routes/terminal.test.js +74 -8
- package/dist/services/acode-package.d.ts +8 -0
- package/dist/services/acode-package.d.ts.map +1 -0
- package/dist/services/acode-package.js +82 -0
- package/dist/services/ai-source-apply.d.ts +4 -0
- package/dist/services/ai-source-apply.d.ts.map +1 -1
- package/dist/services/ai-source-apply.js +38 -9
- package/dist/services/ai-source-apply.test.js +58 -1
- package/dist/services/cc-switch-sdk.d.ts.map +1 -1
- package/dist/services/cc-switch-sdk.js +9 -1
- package/dist/services/instance-init-service.d.ts.map +1 -1
- package/dist/services/instance-init-service.js +3 -2
- package/dist/services/instance-init-service.test.js +6 -5
- package/dist/services/instance-service.d.ts.map +1 -1
- package/dist/services/instance-service.js +1 -0
- package/dist/services/instance-state.js +1 -1
- package/dist/services/instance-state.test.js +4 -4
- package/dist/services/tool-installer.d.ts.map +1 -1
- package/dist/services/tool-installer.js +10 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +1 -0
- package/dist/utils/mcp-utils.d.ts.map +1 -1
- package/dist/utils/mcp-utils.js +4 -1
- package/dist/utils/validation.js +1 -1
- package/node_modules/@cc-switch/sdk/dist/constants.d.ts.map +1 -1
- package/node_modules/@cc-switch/sdk/dist/constants.js +7 -0
- package/node_modules/@cc-switch/sdk/dist/schemas.d.ts.map +1 -1
- package/node_modules/@cc-switch/sdk/dist/schemas.js +1 -0
- package/node_modules/@cc-switch/sdk/dist/sdk.d.ts.map +1 -1
- package/node_modules/@cc-switch/sdk/dist/sdk.js +7 -3
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts +7 -0
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts.map +1 -1
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.js +29 -2
- package/node_modules/@cc-switch/sdk/dist/types.d.ts +4 -1
- package/node_modules/@cc-switch/sdk/dist/types.d.ts.map +1 -1
- package/package/acode/README.md +88 -0
- package/package/acode/dist/built-in-file-tools.d.ts +16 -0
- package/package/acode/dist/built-in-file-tools.d.ts.map +1 -0
- package/package/acode/dist/built-in-file-tools.js +231 -0
- package/package/acode/dist/cli.d.ts +3 -0
- package/package/acode/dist/cli.d.ts.map +1 -0
- package/package/acode/dist/cli.js +37 -0
- package/package/acode/dist/commands/commandLoader.d.ts +7 -0
- package/package/acode/dist/commands/commandLoader.d.ts.map +1 -0
- package/package/acode/dist/commands/commandLoader.js +33 -0
- package/package/acode/dist/commands/commandParser.d.ts +7 -0
- package/package/acode/dist/commands/commandParser.d.ts.map +1 -0
- package/package/acode/dist/commands/commandParser.js +77 -0
- package/package/acode/dist/commands/commandRegistry.d.ts +13 -0
- package/package/acode/dist/commands/commandRegistry.d.ts.map +1 -0
- package/package/acode/dist/commands/commandRegistry.js +30 -0
- package/package/acode/dist/config.d.ts +4 -0
- package/package/acode/dist/config.d.ts.map +1 -0
- package/package/acode/dist/config.js +80 -0
- package/package/acode/dist/hooks/hookBus.d.ts +19 -0
- package/package/acode/dist/hooks/hookBus.d.ts.map +1 -0
- package/package/acode/dist/hooks/hookBus.js +40 -0
- package/package/acode/dist/index.d.ts +8 -0
- package/package/acode/dist/index.d.ts.map +1 -0
- package/package/acode/dist/index.js +7 -0
- package/package/acode/dist/runtime.d.ts +34 -0
- package/package/acode/dist/runtime.d.ts.map +1 -0
- package/package/acode/dist/runtime.js +571 -0
- package/package/acode/dist/types.d.ts +99 -0
- package/package/acode/dist/types.d.ts.map +1 -0
- package/package/acode/dist/types.js +1 -0
- package/package/acode/package.json +24 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +4 -4
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +9 -6
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.js +21 -0
- package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +1 -17
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.js +7 -113
- package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.js +22 -2
- package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -5
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +1 -23
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +89 -6
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +3 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +0 -13
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +3 -100
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
- package/package/cc-switch-sdk/dist/constants.d.ts.map +1 -1
- package/package/cc-switch-sdk/dist/constants.js +7 -0
- package/package/cc-switch-sdk/dist/schemas.d.ts.map +1 -1
- package/package/cc-switch-sdk/dist/schemas.js +1 -0
- package/package/cc-switch-sdk/dist/sdk.d.ts.map +1 -1
- package/package/cc-switch-sdk/dist/sdk.js +7 -3
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +7 -0
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +1 -1
- package/package/cc-switch-sdk/dist/services/ai-config-service.js +29 -2
- package/package/cc-switch-sdk/dist/types.d.ts +4 -1
- package/package/cc-switch-sdk/dist/types.d.ts.map +1 -1
- 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;
|
|
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"}
|
|
@@ -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":"
|
|
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 || '
|
|
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) {
|
package/dist/adapter/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/adapter/index.js
CHANGED
|
@@ -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;
|
|
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 @@
|
|
|
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;
|
|
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"}
|
|
@@ -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;
|
|
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"}
|
|
@@ -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;
|
|
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"}
|
|
@@ -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;
|
|
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"}
|
|
@@ -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
|
+
}
|
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
|
*/
|
package/dist/config.d.ts.map
CHANGED
|
@@ -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 || ''),
|
package/dist/routes/instance.js
CHANGED
|
@@ -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) => {
|
package/dist/routes/mcp.js
CHANGED
|
@@ -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);
|