aws-runtime-bridge 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/dist/adapter/adapter.test.js +4 -4
  2. package/dist/adapter/types.d.ts.map +1 -1
  3. package/dist/adapter/types.js +0 -7
  4. package/dist/adapter/types.test.js +5 -53
  5. package/dist/config.d.ts +1 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +2 -2
  8. package/dist/middleware/auth.d.ts.map +1 -1
  9. package/dist/middleware/auth.js +4 -0
  10. package/dist/routes/instance.d.ts.map +1 -1
  11. package/dist/routes/instance.js +88 -34
  12. package/dist/routes/runtime-binding.d.ts.map +1 -1
  13. package/dist/routes/runtime-binding.js +59 -2
  14. package/dist/routes/sessions.js +1 -1
  15. package/dist/routes/terminal.d.ts.map +1 -1
  16. package/dist/routes/terminal.js +48 -14
  17. package/dist/routes/terminal.test.js +6 -2
  18. package/dist/services/agent-process-manager.js +4 -4
  19. package/dist/services/auto-register.d.ts +12 -1
  20. package/dist/services/auto-register.d.ts.map +1 -1
  21. package/dist/services/auto-register.js +206 -42
  22. package/dist/services/aws-client-agent-mcp.test.js +3 -0
  23. package/dist/services/mcp-launch-binding-queue.d.ts +36 -0
  24. package/dist/services/mcp-launch-binding-queue.d.ts.map +1 -0
  25. package/dist/services/mcp-launch-binding-queue.js +92 -0
  26. package/dist/services/mcp-launch-binding-queue.test.d.ts +2 -0
  27. package/dist/services/mcp-launch-binding-queue.test.d.ts.map +1 -0
  28. package/dist/services/mcp-launch-binding-queue.test.js +107 -0
  29. package/dist/services/orphan-monitor.js +1 -1
  30. package/dist/services/process-detector.d.ts +1 -1
  31. package/dist/services/process-detector.d.ts.map +1 -1
  32. package/dist/services/process-detector.js +2 -11
  33. package/dist/services/process-registry.d.ts +1 -0
  34. package/dist/services/process-registry.d.ts.map +1 -1
  35. package/dist/services/process-registry.js +129 -108
  36. package/dist/services/runtime-binding.d.ts +11 -1
  37. package/dist/services/runtime-binding.d.ts.map +1 -1
  38. package/dist/services/runtime-binding.js +130 -4
  39. package/dist/services/terminal-persistence.d.ts.map +1 -1
  40. package/dist/services/terminal-persistence.js +47 -37
  41. package/dist/services/terminal-persistence.test.js +47 -1
  42. package/dist/utils/file-utils.d.ts +3 -0
  43. package/dist/utils/file-utils.d.ts.map +1 -1
  44. package/dist/utils/file-utils.js +32 -0
  45. package/package/aws-client-agent-mcp/README.md +288 -288
  46. package/package.json +76 -76
  47. package/dist/routes/aws-mcp.d.ts +0 -10
  48. package/dist/routes/aws-mcp.d.ts.map +0 -1
  49. package/dist/routes/aws-mcp.js +0 -74
  50. package/dist/routes/aws-mcp.test.d.ts +0 -2
  51. package/dist/routes/aws-mcp.test.d.ts.map +0 -1
  52. package/dist/routes/aws-mcp.test.js +0 -42
  53. package/dist/routes/memory.d.ts +0 -13
  54. package/dist/routes/memory.d.ts.map +0 -1
  55. package/dist/routes/memory.js +0 -429
  56. package/dist/services/aws-mcp-http.d.ts +0 -11
  57. package/dist/services/aws-mcp-http.d.ts.map +0 -1
  58. package/dist/services/aws-mcp-http.js +0 -225
  59. package/dist/services/aws-mcp-http.test.d.ts +0 -2
  60. package/dist/services/aws-mcp-http.test.d.ts.map +0 -1
  61. package/dist/services/aws-mcp-http.test.js +0 -27
  62. package/dist/services/easytier-manager.d.ts +0 -106
  63. package/dist/services/easytier-manager.d.ts.map +0 -1
  64. package/dist/services/easytier-manager.js +0 -331
  65. package/dist/services/easytier-manager.test.d.ts +0 -5
  66. package/dist/services/easytier-manager.test.d.ts.map +0 -1
  67. package/dist/services/easytier-manager.test.js +0 -98
  68. package/dist/services/memory-service.d.ts +0 -195
  69. package/dist/services/memory-service.d.ts.map +0 -1
  70. package/dist/services/memory-service.js +0 -650
  71. package/dist/services/session-lookup.d.ts +0 -20
  72. package/dist/services/session-lookup.d.ts.map +0 -1
  73. package/dist/services/session-lookup.js +0 -43
  74. package/dist/services/user-api-key-service.d.ts +0 -28
  75. package/dist/services/user-api-key-service.d.ts.map +0 -1
  76. package/dist/services/user-api-key-service.js +0 -75
  77. package/node_modules/@cc-switch/sdk/dist/adapters/common.d.ts +0 -38
  78. package/node_modules/@cc-switch/sdk/dist/adapters/common.d.ts.map +0 -1
  79. package/node_modules/@cc-switch/sdk/dist/adapters/common.js +0 -47
  80. package/node_modules/@cc-switch/sdk/dist/adapters/index.d.ts +0 -5
  81. package/node_modules/@cc-switch/sdk/dist/adapters/index.d.ts.map +0 -1
  82. package/node_modules/@cc-switch/sdk/dist/adapters/index.js +0 -28
  83. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.d.ts +0 -10
  84. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.d.ts.map +0 -1
  85. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.js +0 -39
  86. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.d.ts +0 -10
  87. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.d.ts.map +0 -1
  88. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.js +0 -40
  89. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.d.ts +0 -18
  90. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.d.ts.map +0 -1
  91. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.js +0 -63
  92. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.d.ts +0 -2
  93. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.d.ts.map +0 -1
  94. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.js +0 -86
  95. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.d.ts +0 -9
  96. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.d.ts.map +0 -1
  97. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.js +0 -14
  98. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.d.ts +0 -10
  99. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.d.ts.map +0 -1
  100. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.js +0 -51
  101. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.d.ts +0 -10
  102. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.d.ts.map +0 -1
  103. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.js +0 -51
  104. package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.d.ts +0 -10
  105. package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.d.ts.map +0 -1
  106. package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.js +0 -51
  107. package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.d.ts +0 -9
  108. package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.d.ts.map +0 -1
  109. package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.js +0 -14
  110. package/node_modules/@cc-switch/sdk/dist/services/instance-service.d.ts +0 -78
  111. package/node_modules/@cc-switch/sdk/dist/services/instance-service.d.ts.map +0 -1
  112. package/node_modules/@cc-switch/sdk/dist/services/instance-service.js +0 -180
  113. package/package/cc-switch-sdk/dist/adapters/common.d.ts +0 -38
  114. package/package/cc-switch-sdk/dist/adapters/common.d.ts.map +0 -1
  115. package/package/cc-switch-sdk/dist/adapters/common.js +0 -47
  116. package/package/cc-switch-sdk/dist/adapters/index.d.ts +0 -5
  117. package/package/cc-switch-sdk/dist/adapters/index.d.ts.map +0 -1
  118. package/package/cc-switch-sdk/dist/adapters/index.js +0 -28
  119. package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts +0 -10
  120. package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts.map +0 -1
  121. package/package/cc-switch-sdk/dist/adapters/mcp-claude.js +0 -39
  122. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts +0 -10
  123. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts.map +0 -1
  124. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.js +0 -40
  125. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts +0 -18
  126. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts.map +0 -1
  127. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.js +0 -63
  128. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts +0 -2
  129. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts.map +0 -1
  130. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.js +0 -86
  131. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts +0 -9
  132. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts.map +0 -1
  133. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.js +0 -14
  134. package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts +0 -10
  135. package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts.map +0 -1
  136. package/package/cc-switch-sdk/dist/adapters/skill-claude.js +0 -51
  137. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts +0 -10
  138. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts.map +0 -1
  139. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.js +0 -51
  140. package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts +0 -10
  141. package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts.map +0 -1
  142. package/package/cc-switch-sdk/dist/adapters/skill-opencode.js +0 -51
  143. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts +0 -9
  144. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts.map +0 -1
  145. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.js +0 -14
  146. package/package/cc-switch-sdk/dist/services/instance-service.d.ts +0 -78
  147. package/package/cc-switch-sdk/dist/services/instance-service.d.ts.map +0 -1
  148. package/package/cc-switch-sdk/dist/services/instance-service.js +0 -180
@@ -1,43 +0,0 @@
1
- /**
2
- * 构建按 Agent 查询会话状态的统一响应。
3
- *
4
- * 主流程:
5
- * 1. 活跃会话返回 hasActiveSession=true 且 isActive=true
6
- * 2. 持久化可恢复会话返回 hasActiveSession=true 且 isActive=false
7
- * 3. 无会话返回 false/false
8
- */
9
- export function buildSessionLookupResponse(agentId, activeSession, persistedSession) {
10
- if (activeSession) {
11
- return {
12
- ok: true,
13
- agentId,
14
- sessionId: activeSession.sessionId,
15
- workspacePath: activeSession.workspacePath,
16
- status: 'running',
17
- mode: activeSession.mode,
18
- hasActiveSession: true,
19
- isActive: true,
20
- };
21
- }
22
- if (persistedSession) {
23
- return {
24
- ok: true,
25
- agentId,
26
- sessionId: persistedSession.sessionId,
27
- workspacePath: persistedSession.workspacePath,
28
- command: persistedSession.command,
29
- status: persistedSession.status,
30
- startedAt: persistedSession.startedAt,
31
- mode: persistedSession.mode ?? 'pty',
32
- hasActiveSession: true,
33
- isActive: false,
34
- };
35
- }
36
- return {
37
- ok: true,
38
- agentId,
39
- status: 'none',
40
- hasActiveSession: false,
41
- isActive: false,
42
- };
43
- }
@@ -1,28 +0,0 @@
1
- /**
2
- * 用户 API Key 服务
3
- *
4
- * 从 aws-mcp-server 获取用户的默认 API Key
5
- * 用于 SDK 启动时配置 WebSocket 连接认证
6
- */
7
- /**
8
- * 获取用户的默认 API Key
9
- *
10
- * @param userId - 用户 ID(可选,如果不提供则使用当前登录用户)
11
- * @returns 默认 API Key 或 null
12
- */
13
- export declare function getUserDefaultApiKey(userId?: string): Promise<string | null>;
14
- /**
15
- * 为 Agent 获取 API Key(用于 WebSocket 连接认证)
16
- *
17
- * ★ 调用后端 /api/user-api-keys/for-agent 接口
18
- * 后端会自动处理以下逻辑:
19
- * 1. 查找 Agent 的 ownerUserId
20
- * 2. 如果找到,返回该用户的默认 API Key
21
- * 3. 如果找不到,返回系统用户的默认 API Key
22
- * 4. 确保每个 Agent 都能获取到可用的 API Key
23
- *
24
- * @param agentId - Agent ID
25
- * @returns API Key 或 null
26
- */
27
- export declare function getApiKeyForAgent(agentId: string): Promise<string | null>;
28
- //# sourceMappingURL=user-api-key-service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-api-key-service.d.ts","sourceRoot":"","sources":["../../src/services/user-api-key-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8BxB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BxB"}
@@ -1,75 +0,0 @@
1
- /**
2
- * 用户 API Key 服务
3
- *
4
- * 从 aws-mcp-server 获取用户的默认 API Key
5
- * 用于 SDK 启动时配置 WebSocket 连接认证
6
- */
7
- import axios from "axios";
8
- import { schedulerBaseUrl, runtimeToken } from "../config.js";
9
- import { logger } from "../utils/logger.js";
10
- /**
11
- * 获取用户的默认 API Key
12
- *
13
- * @param userId - 用户 ID(可选,如果不提供则使用当前登录用户)
14
- * @returns 默认 API Key 或 null
15
- */
16
- export async function getUserDefaultApiKey(userId) {
17
- try {
18
- const url = userId
19
- ? `${schedulerBaseUrl}/api/user-api-keys/default?userId=${userId}`
20
- : `${schedulerBaseUrl}/api/user-api-keys/default`;
21
- const response = await axios.get(url, {
22
- headers: {
23
- "X-Runtime-Token": runtimeToken,
24
- },
25
- timeout: 5000,
26
- });
27
- if (response.data && response.data.success && response.data.data) {
28
- const apiKey = response.data.data.apiKey;
29
- logger.info(`[UserApiKeyService] 获取用户默认 API Key 成功: apiKey=${apiKey}`);
30
- return apiKey;
31
- }
32
- logger.warn("[UserApiKeyService] 获取用户默认 API Key 失败: 响应数据无效");
33
- return null;
34
- }
35
- catch (error) {
36
- const errorMessage = error instanceof Error ? error.message : String(error);
37
- logger.error(`[UserApiKeyService] 获取用户默认 API Key 失败: ${errorMessage}`);
38
- return null;
39
- }
40
- }
41
- /**
42
- * 为 Agent 获取 API Key(用于 WebSocket 连接认证)
43
- *
44
- * ★ 调用后端 /api/user-api-keys/for-agent 接口
45
- * 后端会自动处理以下逻辑:
46
- * 1. 查找 Agent 的 ownerUserId
47
- * 2. 如果找到,返回该用户的默认 API Key
48
- * 3. 如果找不到,返回系统用户的默认 API Key
49
- * 4. 确保每个 Agent 都能获取到可用的 API Key
50
- *
51
- * @param agentId - Agent ID
52
- * @returns API Key 或 null
53
- */
54
- export async function getApiKeyForAgent(agentId) {
55
- try {
56
- const response = await axios.get(`${schedulerBaseUrl}/api/user-api-keys/for-agent?agentId=${agentId}`, {
57
- headers: {
58
- "X-Runtime-Token": runtimeToken,
59
- },
60
- timeout: 5000,
61
- });
62
- if (response.data && response.data.success && response.data.data) {
63
- const apiKey = response.data.data.apiKey;
64
- logger.info(`[UserApiKeyService] 获取 Agent ${agentId} 的 API Key 成功: apiKey=${apiKey}`);
65
- return apiKey;
66
- }
67
- logger.warn(`[UserApiKeyService] 获取 Agent ${agentId} 的 API Key 失败: 响应数据无效`);
68
- return null;
69
- }
70
- catch (error) {
71
- const errorMessage = error instanceof Error ? error.message : String(error);
72
- logger.error(`[UserApiKeyService] 获取 Agent ${agentId} 的 API Key 失败: ${errorMessage}`);
73
- return null;
74
- }
75
- }
@@ -1,38 +0,0 @@
1
- import type { AppId, McpServer, McpServerSpec } from "../types.js";
2
- export type JsonRecord = Record<string, unknown>;
3
- export interface ClaudeConfig {
4
- mcpServers?: Record<string, McpServerSpec>;
5
- [key: string]: unknown;
6
- }
7
- export interface OpenCodeLocalServer {
8
- type: "local";
9
- command: string[];
10
- environment?: Record<string, string>;
11
- cwd?: string;
12
- enabled?: boolean;
13
- }
14
- export interface OpenCodeRemoteServer {
15
- type: "remote";
16
- url: string;
17
- headers?: Record<string, string>;
18
- enabled?: boolean;
19
- }
20
- export type OpenCodeServer = OpenCodeLocalServer | OpenCodeRemoteServer;
21
- export interface OpenCodeConfig {
22
- mcp?: Record<string, OpenCodeServer>;
23
- mcpServers?: Record<string, OpenCodeServer>;
24
- [key: string]: unknown;
25
- }
26
- export type ClaudecodeLocalServer = OpenCodeLocalServer;
27
- export type ClaudecodeRemoteServer = OpenCodeRemoteServer;
28
- export type ClaudecodeServer = OpenCodeServer;
29
- export interface ClaudecodeConfig {
30
- mcpServers?: Record<string, ClaudecodeServer>;
31
- [key: string]: unknown;
32
- }
33
- export declare function toMcpSpecFromOpenCode(input: OpenCodeServer): McpServerSpec;
34
- export declare function toOpenCodeServer(input: McpServerSpec): OpenCodeServer;
35
- export declare function mergeAppFlagOnImport(server: McpServer, appId: AppId): McpServer;
36
- export declare const toMcpSpecFromClaudecode: typeof toMcpSpecFromOpenCode;
37
- export declare const toClaudecodeServer: typeof toOpenCodeServer;
38
- //# sourceMappingURL=common.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/adapters/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG,oBAAoB,CAAC;AAExE,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AACxD,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC9C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,CAiB1E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAoBrE;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,KAAK,GACX,SAAS,CAQX;AAGD,eAAO,MAAM,uBAAuB,8BAAwB,CAAC;AAC7D,eAAO,MAAM,kBAAkB,yBAAmB,CAAC"}
@@ -1,47 +0,0 @@
1
- export function toMcpSpecFromOpenCode(input) {
2
- if (input.type === "local") {
3
- const [command, ...args] = input.command;
4
- return {
5
- type: "stdio",
6
- command,
7
- args,
8
- env: input.environment,
9
- cwd: input.cwd,
10
- };
11
- }
12
- return {
13
- type: "sse",
14
- url: input.url,
15
- headers: input.headers,
16
- };
17
- }
18
- export function toOpenCodeServer(input) {
19
- if (input.type === "stdio") {
20
- const commandParts = [input.command, ...(input.args ?? [])].filter((entry) => Boolean(entry));
21
- return {
22
- type: "local",
23
- command: commandParts,
24
- environment: input.env,
25
- cwd: input.cwd,
26
- enabled: true,
27
- };
28
- }
29
- return {
30
- type: "remote",
31
- url: input.url ?? "",
32
- headers: input.headers,
33
- enabled: true,
34
- };
35
- }
36
- export function mergeAppFlagOnImport(server, appId) {
37
- return {
38
- ...server,
39
- apps: {
40
- ...server.apps,
41
- [appId]: true,
42
- },
43
- };
44
- }
45
- // Claudecode uses the same conversion functions as OpenCode
46
- export const toMcpSpecFromClaudecode = toMcpSpecFromOpenCode;
47
- export const toClaudecodeServer = toOpenCodeServer;
@@ -1,5 +0,0 @@
1
- import type { AppId, IMcpAdapter, SdkPaths } from "../types.js";
2
- import type { ISkillAdapter } from "../types.js";
3
- export declare function createMcpAdapters(paths: SdkPaths): Record<AppId, IMcpAdapter>;
4
- export declare function createSkillAdapters(paths: SdkPaths): Record<AppId, ISkillAdapter>;
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAShE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAS7E;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,QAAQ,GACd,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAS9B"}
@@ -1,28 +0,0 @@
1
- import { ClaudeMcpAdapter } from "./mcp-claude.js";
2
- import { ClaudecodeMcpAdapter } from "./mcp-claudecode.js";
3
- import { OpenCodeMcpAdapter } from "./mcp-opencode.js";
4
- import { PlaceholderMcpAdapter } from "./mcp-placeholder.js";
5
- import { ClaudeSkillAdapter } from "./skill-claude.js";
6
- import { ClaudecodeSkillAdapter } from "./skill-claudecode.js";
7
- import { OpenCodeSkillAdapter } from "./skill-opencode.js";
8
- import { PlaceholderSkillAdapter } from "./skill-placeholder.js";
9
- export function createMcpAdapters(paths) {
10
- return {
11
- claude: new ClaudeMcpAdapter(paths.claudeConfigFile),
12
- claudecode: new ClaudecodeMcpAdapter(paths.claudecodeConfigFile),
13
- opencode: new OpenCodeMcpAdapter(paths.opencodeConfigFile),
14
- codex: new PlaceholderMcpAdapter("codex"),
15
- gemini: new PlaceholderMcpAdapter("gemini"),
16
- openclaw: new PlaceholderMcpAdapter("openclaw"),
17
- };
18
- }
19
- export function createSkillAdapters(paths) {
20
- return {
21
- claude: new ClaudeSkillAdapter(paths.claudeSkillsDir),
22
- claudecode: new ClaudecodeSkillAdapter(paths.claudecodeSkillsDir),
23
- opencode: new OpenCodeSkillAdapter(paths.opencodeSkillsDir),
24
- codex: new PlaceholderSkillAdapter("codex"),
25
- gemini: new PlaceholderSkillAdapter("gemini"),
26
- openclaw: new PlaceholderSkillAdapter("openclaw"),
27
- };
28
- }
@@ -1,10 +0,0 @@
1
- import type { IMcpAdapter, McpServer } from "../types.js";
2
- export declare class ClaudeMcpAdapter implements IMcpAdapter {
3
- private readonly configPath;
4
- readonly appId: "claude";
5
- constructor(configPath: string);
6
- importServers(): Promise<McpServer[]>;
7
- syncServer(server: McpServer): Promise<void>;
8
- removeServer(server: McpServer): Promise<void>;
9
- }
10
- //# sourceMappingURL=mcp-claude.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-claude.d.ts","sourceRoot":"","sources":["../../src/adapters/mcp-claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK1D,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,39 +0,0 @@
1
- import { createId } from "../utils/id.js";
2
- import { readJsonFile, writeJsonFile } from "../utils/fs.js";
3
- export class ClaudeMcpAdapter {
4
- constructor(configPath) {
5
- this.configPath = configPath;
6
- this.appId = "claude";
7
- }
8
- async importServers() {
9
- const config = await readJsonFile(this.configPath, {});
10
- const entries = Object.entries(config.mcpServers ?? {});
11
- return entries.map(([name, server]) => ({
12
- id: createId("mcp"),
13
- name,
14
- server,
15
- apps: {
16
- claude: true,
17
- claudecode: false,
18
- codex: false,
19
- gemini: false,
20
- opencode: false,
21
- openclaw: false,
22
- },
23
- }));
24
- }
25
- async syncServer(server) {
26
- const config = await readJsonFile(this.configPath, {});
27
- config.mcpServers = config.mcpServers ?? {};
28
- config.mcpServers[server.name] = server.server;
29
- await writeJsonFile(this.configPath, config);
30
- }
31
- async removeServer(server) {
32
- const config = await readJsonFile(this.configPath, {});
33
- if (!config.mcpServers) {
34
- return;
35
- }
36
- delete config.mcpServers[server.name];
37
- await writeJsonFile(this.configPath, config);
38
- }
39
- }
@@ -1,10 +0,0 @@
1
- import type { IMcpAdapter, McpServer } from "../types.js";
2
- export declare class ClaudecodeMcpAdapter implements IMcpAdapter {
3
- private readonly configPath;
4
- readonly appId: "claudecode";
5
- constructor(configPath: string);
6
- importServers(): Promise<McpServer[]>;
7
- syncServer(server: McpServer): Promise<void>;
8
- removeServer(server: McpServer): Promise<void>;
9
- }
10
- //# sourceMappingURL=mcp-claudecode.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-claudecode.d.ts","sourceRoot":"","sources":["../../src/adapters/mcp-claudecode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM1D,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,40 +0,0 @@
1
- import { createId } from "../utils/id.js";
2
- import { readJsonFile, writeJsonFile } from "../utils/fs.js";
3
- import { toMcpSpecFromClaudecode, toClaudecodeServer } from "./common.js";
4
- export class ClaudecodeMcpAdapter {
5
- constructor(configPath) {
6
- this.configPath = configPath;
7
- this.appId = "claudecode";
8
- }
9
- async importServers() {
10
- const config = await readJsonFile(this.configPath, {});
11
- const entries = Object.entries(config.mcpServers ?? {});
12
- return entries.map(([name, server]) => ({
13
- id: createId("mcp"),
14
- name,
15
- server: toMcpSpecFromClaudecode(server),
16
- apps: {
17
- claude: false,
18
- claudecode: true,
19
- codex: false,
20
- gemini: false,
21
- opencode: false,
22
- openclaw: false,
23
- },
24
- }));
25
- }
26
- async syncServer(server) {
27
- const config = await readJsonFile(this.configPath, {});
28
- config.mcpServers = config.mcpServers ?? {};
29
- config.mcpServers[server.name] = toClaudecodeServer(server.server);
30
- await writeJsonFile(this.configPath, config);
31
- }
32
- async removeServer(server) {
33
- const config = await readJsonFile(this.configPath, {});
34
- if (!config.mcpServers) {
35
- return;
36
- }
37
- delete config.mcpServers[server.name];
38
- await writeJsonFile(this.configPath, config);
39
- }
40
- }
@@ -1,18 +0,0 @@
1
- import type { IMcpAdapter, McpServer } from "../types.js";
2
- export declare class OpenCodeMcpAdapter implements IMcpAdapter {
3
- private readonly configPath;
4
- readonly appId: "opencode";
5
- constructor(configPath: string);
6
- /**
7
- * 读取 OpenCode MCP 映射,优先使用合法的 mcp 字段,兼容历史错误写入的 mcpServers。
8
- */
9
- private getMcpMap;
10
- /**
11
- * 将 MCP 服务器写回 OpenCode 配置,只保留合法的 mcp 字段并清理错误的 mcpServers。
12
- */
13
- private saveMcpMap;
14
- importServers(): Promise<McpServer[]>;
15
- syncServer(server: McpServer): Promise<void>;
16
- removeServer(server: McpServer): Promise<void>;
17
- }
18
- //# sourceMappingURL=mcp-opencode.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-opencode.d.ts","sourceRoot":"","sources":["../../src/adapters/mcp-opencode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM1D,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;IAUjB;;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,63 +0,0 @@
1
- import { createId } from "../utils/id.js";
2
- import { readJsonFile, writeJsonFile } from "../utils/fs.js";
3
- import { toMcpSpecFromOpenCode, toOpenCodeServer } from "./common.js";
4
- export class OpenCodeMcpAdapter {
5
- constructor(configPath) {
6
- this.configPath = configPath;
7
- this.appId = "opencode";
8
- }
9
- /**
10
- * 读取 OpenCode MCP 映射,优先使用合法的 mcp 字段,兼容历史错误写入的 mcpServers。
11
- */
12
- getMcpMap(config) {
13
- if (config.mcp && typeof config.mcp === "object") {
14
- return config.mcp;
15
- }
16
- if (config.mcpServers && typeof config.mcpServers === "object") {
17
- return config.mcpServers;
18
- }
19
- return {};
20
- }
21
- /**
22
- * 将 MCP 服务器写回 OpenCode 配置,只保留合法的 mcp 字段并清理错误的 mcpServers。
23
- */
24
- async saveMcpMap(config, mcp) {
25
- config.mcp = mcp;
26
- if ("mcpServers" in config) {
27
- delete config.mcpServers;
28
- }
29
- await writeJsonFile(this.configPath, config);
30
- }
31
- async importServers() {
32
- const config = await readJsonFile(this.configPath, {});
33
- const entries = Object.entries(this.getMcpMap(config));
34
- return entries.map(([name, server]) => ({
35
- id: createId("mcp"),
36
- name,
37
- server: toMcpSpecFromOpenCode(server),
38
- apps: {
39
- claude: false,
40
- claudecode: false,
41
- codex: false,
42
- gemini: false,
43
- opencode: true,
44
- openclaw: false,
45
- },
46
- }));
47
- }
48
- async syncServer(server) {
49
- const config = await readJsonFile(this.configPath, {});
50
- const mcp = this.getMcpMap(config);
51
- mcp[server.name] = toOpenCodeServer(server.server);
52
- await this.saveMcpMap(config, mcp);
53
- }
54
- async removeServer(server) {
55
- const config = await readJsonFile(this.configPath, {});
56
- const mcp = this.getMcpMap(config);
57
- if (!mcp[server.name]) {
58
- return;
59
- }
60
- delete mcp[server.name];
61
- await this.saveMcpMap(config, mcp);
62
- }
63
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=mcp-opencode.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-opencode.test.d.ts","sourceRoot":"","sources":["../../src/adapters/mcp-opencode.test.ts"],"names":[],"mappings":""}
@@ -1,86 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import { describe, it } from "node:test";
3
- import os from "node:os";
4
- import path from "node:path";
5
- import { promises as fs } from "node:fs";
6
- import { OpenCodeMcpAdapter } from "./mcp-opencode.js";
7
- /**
8
- * 创建隔离测试目录,避免污染真实用户配置。
9
- */
10
- async function createTempConfigPath() {
11
- const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "opencode-mcp-adapter-"));
12
- return path.join(tempDir, "opencode.json");
13
- }
14
- /**
15
- * 读取测试配置文件内容,便于断言 OpenCode 实际写盘结构。
16
- */
17
- async function readConfig(filePath) {
18
- const content = await fs.readFile(filePath, "utf-8");
19
- return JSON.parse(content);
20
- }
21
- function buildServer(name) {
22
- return {
23
- id: `mcp-${name}`,
24
- name,
25
- server: {
26
- type: "stdio",
27
- command: "node",
28
- args: ["server.js"],
29
- env: { DEMO: "1" },
30
- },
31
- apps: {
32
- claude: false,
33
- claudecode: false,
34
- codex: false,
35
- gemini: false,
36
- opencode: true,
37
- openclaw: false,
38
- },
39
- };
40
- }
41
- describe("OpenCodeMcpAdapter", () => {
42
- it("writes OpenCode MCP servers to the mcp key and removes legacy mcpServers", async () => {
43
- const configPath = await createTempConfigPath();
44
- await fs.writeFile(configPath, JSON.stringify({
45
- $schema: "https://opencode.ai/config.json",
46
- mcpServers: {
47
- legacy: {
48
- type: "local",
49
- command: ["node", "legacy.js"],
50
- enabled: true,
51
- },
52
- },
53
- }, null, 2), "utf-8");
54
- const adapter = new OpenCodeMcpAdapter(configPath);
55
- await adapter.syncServer(buildServer("aws-mcp"));
56
- const saved = await readConfig(configPath);
57
- assert.equal("mcpServers" in saved, false);
58
- assert.ok(saved.mcp);
59
- assert.deepEqual(saved.mcp["aws-mcp"], {
60
- type: "local",
61
- command: ["node", "server.js"],
62
- environment: { DEMO: "1" },
63
- enabled: true,
64
- });
65
- });
66
- it("imports existing OpenCode MCP servers from the mcp key", async () => {
67
- const configPath = await createTempConfigPath();
68
- await fs.writeFile(configPath, JSON.stringify({
69
- mcp: {
70
- aws: {
71
- type: "local",
72
- command: ["node", "index.js"],
73
- environment: { AWS_SERVER_URL: "ws://localhost:8080/ws/agent" },
74
- enabled: true,
75
- },
76
- },
77
- }, null, 2), "utf-8");
78
- const adapter = new OpenCodeMcpAdapter(configPath);
79
- const imported = await adapter.importServers();
80
- assert.equal(imported.length, 1);
81
- assert.equal(imported[0]?.name, "aws");
82
- assert.equal(imported[0]?.server.command, "node");
83
- assert.deepEqual(imported[0]?.server.args, ["index.js"]);
84
- assert.deepEqual(imported[0]?.server.env, { AWS_SERVER_URL: "ws://localhost:8080/ws/agent" });
85
- });
86
- });
@@ -1,9 +0,0 @@
1
- import type { AppId, IMcpAdapter, McpServer } from "../types.js";
2
- export declare class PlaceholderMcpAdapter implements IMcpAdapter {
3
- readonly appId: AppId;
4
- constructor(appId: AppId);
5
- importServers(): Promise<McpServer[]>;
6
- syncServer(): Promise<void>;
7
- removeServer(): Promise<void>;
8
- }
9
- //# sourceMappingURL=mcp-placeholder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-placeholder.d.ts","sourceRoot":"","sources":["../../src/adapters/mcp-placeholder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEjE,qBAAa,qBAAsB,YAAW,WAAW;aAC3B,KAAK,EAAE,KAAK;gBAAZ,KAAK,EAAE,KAAK;IAElC,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIrC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
@@ -1,14 +0,0 @@
1
- export class PlaceholderMcpAdapter {
2
- constructor(appId) {
3
- this.appId = appId;
4
- }
5
- async importServers() {
6
- return [];
7
- }
8
- async syncServer() {
9
- return;
10
- }
11
- async removeServer() {
12
- return;
13
- }
14
- }
@@ -1,10 +0,0 @@
1
- import type { ISkillAdapter, InstalledSkill, SkillSyncMethod } from "../types.js";
2
- export declare class ClaudeSkillAdapter implements ISkillAdapter {
3
- private readonly skillsDir;
4
- readonly appId: "claude";
5
- constructor(skillsDir: string);
6
- importSkills(): Promise<Array<Pick<InstalledSkill, "id" | "name" | "directory" | "description">>>;
7
- syncSkill(skill: InstalledSkill, sourceDir: string, method: SkillSyncMethod): Promise<void>;
8
- removeSkill(skill: InstalledSkill): Promise<void>;
9
- }
10
- //# sourceMappingURL=skill-claude.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-claude.d.ts","sourceRoot":"","sources":["../../src/adapters/skill-claude.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA6BlF,qBAAa,kBAAmB,YAAW,aAAa;IAG1C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,SAAgB,KAAK,EAAG,QAAQ,CAAU;gBAEb,SAAS,EAAE,MAAM;IAExC,YAAY,IAAI,OAAO,CAC3B,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC,CAAC,CACzE;IAgBK,SAAS,CACb,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC;IAKV,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAIxD"}