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.
- package/dist/adapter/AcodeSdkAdapter.d.ts +104 -0
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -0
- package/dist/adapter/AcodeSdkAdapter.js +644 -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 +1280 -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/ClaudeSdkAdapter.test.js +31 -8
- package/dist/adapter/CodexSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/CodexSdkAdapter.js +2 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/OpencodeSdkAdapter.js +2 -0
- package/dist/adapter/SdkProviderSpi.d.ts.map +1 -1
- package/dist/adapter/SdkProviderSpi.js +10 -1
- package/dist/adapter/adapter.test.js +2 -2
- package/dist/adapter/idle-poll-loop.d.ts +4 -4
- package/dist/adapter/idle-poll-loop.d.ts.map +1 -1
- package/dist/adapter/idle-poll-loop.js +3 -3
- package/dist/adapter/idle-poll-loop.test.js +15 -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/adapter/types.d.ts +25 -6
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/adapter/types.js +221 -110
- package/dist/adapter/types.test.js +10 -3
- 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.d.ts.map +1 -1
- package/dist/routes/instance.js +7 -8
- 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 +11 -58
- 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 +27 -7
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +439 -171
- package/dist/routes/terminal.test.js +385 -197
- 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 +8 -0
- package/dist/services/ai-source-apply.test.js +8 -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/mcp-launch-binding-queue.d.ts +1 -0
- package/dist/services/mcp-launch-binding-queue.d.ts.map +1 -1
- package/dist/services/mcp-launch-binding-queue.js +8 -2
- package/dist/services/mcp-launch-binding-queue.test.js +47 -4
- package/dist/services/session-output.d.ts +10 -6
- package/dist/services/session-output.d.ts.map +1 -1
- package/dist/services/session-output.js +29 -14
- package/dist/services/session-output.test.js +93 -39
- 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 +6 -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 +27 -1
- 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 +569 -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 +42 -0
- package/package/acode/dist/runtime.d.ts.map +1 -0
- package/package/acode/dist/runtime.js +1283 -0
- package/package/acode/dist/types.d.ts +112 -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 +3 -24
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +90 -5
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +1 -0
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js +31 -3
- package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +4 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.js.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 +5 -100
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js +43 -0
- package/package/aws-client-agent-mcp/dist/websocket-client.test.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 +6 -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 +27 -1
- 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
|
@@ -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 || ''),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/routes/instance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/routes/instance.ts"],"names":[],"mappings":"AA0BA,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"}
|
package/dist/routes/instance.js
CHANGED
|
@@ -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 {
|
|
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) => {
|
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);
|
package/dist/routes/mcp.test.js
CHANGED
|
@@ -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
|
-
*
|
|
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):
|
|
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":"
|
|
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
|
-
*
|
|
9
|
+
* 主流程:MCP Node token 必须通过 /runtime/binding/claim-agent 从启动绑定领取。
|
|
10
|
+
* 不再返回 bridge/user/server scoped runtime token,避免 MCP Node 降级使用旧 bridge 级凭据。
|
|
35
11
|
*/
|
|
36
|
-
export
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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 =
|
|
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,
|