figma-to-code-agent 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +69 -77
  3. package/README.zh-CN.md +173 -0
  4. package/dist/agent/ConversationContext.d.ts +91 -0
  5. package/dist/agent/ConversationContext.d.ts.map +1 -0
  6. package/dist/agent/ConversationContext.js +271 -0
  7. package/dist/agent/ConversationContext.js.map +1 -0
  8. package/dist/agent/DecisionEngine.d.ts +77 -0
  9. package/dist/agent/DecisionEngine.d.ts.map +1 -0
  10. package/dist/agent/DecisionEngine.js +414 -0
  11. package/dist/agent/DecisionEngine.js.map +1 -0
  12. package/dist/agent/ExecutionOrchestrator.d.ts +55 -0
  13. package/dist/agent/ExecutionOrchestrator.d.ts.map +1 -0
  14. package/dist/agent/ExecutionOrchestrator.js +360 -0
  15. package/dist/agent/ExecutionOrchestrator.js.map +1 -0
  16. package/dist/agent/IntentUnderstandingEngine.d.ts +43 -0
  17. package/dist/agent/IntentUnderstandingEngine.d.ts.map +1 -0
  18. package/dist/agent/IntentUnderstandingEngine.js +261 -0
  19. package/dist/agent/IntentUnderstandingEngine.js.map +1 -0
  20. package/dist/agent/index.d.ts +9 -0
  21. package/dist/agent/index.d.ts.map +1 -0
  22. package/dist/agent/index.js +30 -0
  23. package/dist/agent/index.js.map +1 -0
  24. package/dist/agent/types.d.ts +111 -0
  25. package/dist/agent/types.d.ts.map +1 -0
  26. package/dist/agent/types.js +6 -0
  27. package/dist/agent/types.js.map +1 -0
  28. package/dist/cli/InteractiveCLI.d.ts +109 -0
  29. package/dist/cli/InteractiveCLI.d.ts.map +1 -0
  30. package/dist/cli/InteractiveCLI.js +534 -0
  31. package/dist/cli/InteractiveCLI.js.map +1 -0
  32. package/dist/cli/ProgressDisplay.d.ts +117 -0
  33. package/dist/cli/ProgressDisplay.d.ts.map +1 -0
  34. package/dist/cli/ProgressDisplay.js +370 -0
  35. package/dist/cli/ProgressDisplay.js.map +1 -0
  36. package/dist/cli/index.d.ts +6 -0
  37. package/dist/cli/index.d.ts.map +1 -0
  38. package/dist/cli/index.js +22 -0
  39. package/dist/cli/index.js.map +1 -0
  40. package/dist/consistency/DesignConsistencyChecker.d.ts +125 -0
  41. package/dist/consistency/DesignConsistencyChecker.d.ts.map +1 -0
  42. package/dist/consistency/DesignConsistencyChecker.js +448 -0
  43. package/dist/consistency/DesignConsistencyChecker.js.map +1 -0
  44. package/dist/consistency/index.d.ts +5 -0
  45. package/dist/consistency/index.d.ts.map +1 -0
  46. package/dist/consistency/index.js +21 -0
  47. package/dist/consistency/index.js.map +1 -0
  48. package/dist/context/CodeStyleMatcher.d.ts +124 -0
  49. package/dist/context/CodeStyleMatcher.d.ts.map +1 -0
  50. package/dist/context/CodeStyleMatcher.js +558 -0
  51. package/dist/context/CodeStyleMatcher.js.map +1 -0
  52. package/dist/context/IncrementalUpdater.d.ts +97 -0
  53. package/dist/context/IncrementalUpdater.d.ts.map +1 -0
  54. package/dist/context/IncrementalUpdater.js +431 -0
  55. package/dist/context/IncrementalUpdater.js.map +1 -0
  56. package/dist/context/index.d.ts +6 -0
  57. package/dist/context/index.d.ts.map +1 -0
  58. package/dist/context/index.js +22 -0
  59. package/dist/context/index.js.map +1 -0
  60. package/dist/feedback/FeedbackLoop.d.ts +125 -0
  61. package/dist/feedback/FeedbackLoop.d.ts.map +1 -0
  62. package/dist/feedback/FeedbackLoop.js +353 -0
  63. package/dist/feedback/FeedbackLoop.js.map +1 -0
  64. package/dist/feedback/index.d.ts +5 -0
  65. package/dist/feedback/index.d.ts.map +1 -0
  66. package/dist/feedback/index.js +21 -0
  67. package/dist/feedback/index.js.map +1 -0
  68. package/dist/mcp/FigmaMCPIntegration.d.ts +72 -0
  69. package/dist/mcp/FigmaMCPIntegration.d.ts.map +1 -0
  70. package/dist/mcp/FigmaMCPIntegration.js +173 -0
  71. package/dist/mcp/FigmaMCPIntegration.js.map +1 -0
  72. package/dist/mcp/MCPServiceManager.d.ts +109 -0
  73. package/dist/mcp/MCPServiceManager.d.ts.map +1 -0
  74. package/dist/mcp/MCPServiceManager.js +237 -0
  75. package/dist/mcp/MCPServiceManager.js.map +1 -0
  76. package/dist/mcp/MCPToolAdapter.d.ts +73 -0
  77. package/dist/mcp/MCPToolAdapter.d.ts.map +1 -0
  78. package/dist/mcp/MCPToolAdapter.js +249 -0
  79. package/dist/mcp/MCPToolAdapter.js.map +1 -0
  80. package/dist/mcp/index.d.ts +7 -0
  81. package/dist/mcp/index.d.ts.map +1 -0
  82. package/dist/mcp/index.js +23 -0
  83. package/dist/mcp/index.js.map +1 -0
  84. package/dist/mcp-server/MCPServer.d.ts +125 -0
  85. package/dist/mcp-server/MCPServer.d.ts.map +1 -0
  86. package/dist/mcp-server/MCPServer.js +449 -0
  87. package/dist/mcp-server/MCPServer.js.map +1 -0
  88. package/dist/mcp-server/index.d.ts +5 -0
  89. package/dist/mcp-server/index.d.ts.map +1 -0
  90. package/dist/mcp-server/index.js +21 -0
  91. package/dist/mcp-server/index.js.map +1 -0
  92. package/dist/monitoring/ExecutionSummary.d.ts +160 -0
  93. package/dist/monitoring/ExecutionSummary.d.ts.map +1 -0
  94. package/dist/monitoring/ExecutionSummary.js +345 -0
  95. package/dist/monitoring/ExecutionSummary.js.map +1 -0
  96. package/dist/monitoring/Logger.d.ts +139 -0
  97. package/dist/monitoring/Logger.d.ts.map +1 -0
  98. package/dist/monitoring/Logger.js +406 -0
  99. package/dist/monitoring/Logger.js.map +1 -0
  100. package/dist/monitoring/index.d.ts +6 -0
  101. package/dist/monitoring/index.d.ts.map +1 -0
  102. package/dist/monitoring/index.js +22 -0
  103. package/dist/monitoring/index.js.map +1 -0
  104. package/dist/performance/LLMCache.d.ts +133 -0
  105. package/dist/performance/LLMCache.d.ts.map +1 -0
  106. package/dist/performance/LLMCache.js +358 -0
  107. package/dist/performance/LLMCache.js.map +1 -0
  108. package/dist/performance/ParallelProcessor.d.ts +89 -0
  109. package/dist/performance/ParallelProcessor.d.ts.map +1 -0
  110. package/dist/performance/ParallelProcessor.js +253 -0
  111. package/dist/performance/ParallelProcessor.js.map +1 -0
  112. package/dist/performance/TokenMonitor.d.ts +166 -0
  113. package/dist/performance/TokenMonitor.d.ts.map +1 -0
  114. package/dist/performance/TokenMonitor.js +315 -0
  115. package/dist/performance/TokenMonitor.js.map +1 -0
  116. package/dist/performance/index.d.ts +7 -0
  117. package/dist/performance/index.d.ts.map +1 -0
  118. package/dist/performance/index.js +23 -0
  119. package/dist/performance/index.js.map +1 -0
  120. package/dist/prototype/InteractivePrototypeGenerator.d.ts +175 -0
  121. package/dist/prototype/InteractivePrototypeGenerator.d.ts.map +1 -0
  122. package/dist/prototype/InteractivePrototypeGenerator.js +624 -0
  123. package/dist/prototype/InteractivePrototypeGenerator.js.map +1 -0
  124. package/dist/prototype/index.d.ts +5 -0
  125. package/dist/prototype/index.d.ts.map +1 -0
  126. package/dist/prototype/index.js +21 -0
  127. package/dist/prototype/index.js.map +1 -0
  128. package/dist/skill/SkillConfig.d.ts +66 -0
  129. package/dist/skill/SkillConfig.d.ts.map +1 -0
  130. package/dist/skill/SkillConfig.js +233 -0
  131. package/dist/skill/SkillConfig.js.map +1 -0
  132. package/dist/skill/SkillInterface.d.ts +102 -0
  133. package/dist/skill/SkillInterface.d.ts.map +1 -0
  134. package/dist/skill/SkillInterface.js +425 -0
  135. package/dist/skill/SkillInterface.js.map +1 -0
  136. package/dist/skill/index.d.ts +7 -0
  137. package/dist/skill/index.d.ts.map +1 -0
  138. package/dist/skill/index.js +23 -0
  139. package/dist/skill/index.js.map +1 -0
  140. package/dist/skill/types.d.ts +103 -0
  141. package/dist/skill/types.d.ts.map +1 -0
  142. package/dist/skill/types.js +6 -0
  143. package/dist/skill/types.js.map +1 -0
  144. package/dist/templates/TemplateManager.d.ts +147 -0
  145. package/dist/templates/TemplateManager.d.ts.map +1 -0
  146. package/dist/templates/TemplateManager.js +418 -0
  147. package/dist/templates/TemplateManager.js.map +1 -0
  148. package/dist/templates/index.d.ts +6 -0
  149. package/dist/templates/index.d.ts.map +1 -0
  150. package/dist/templates/index.js +10 -0
  151. package/dist/templates/index.js.map +1 -0
  152. package/dist/tools/CodeGenerationTool.d.ts +32 -0
  153. package/dist/tools/CodeGenerationTool.d.ts.map +1 -0
  154. package/dist/tools/CodeGenerationTool.js +63 -0
  155. package/dist/tools/CodeGenerationTool.js.map +1 -0
  156. package/dist/tools/FigmaExtractionTool.d.ts +45 -0
  157. package/dist/tools/FigmaExtractionTool.d.ts.map +1 -0
  158. package/dist/tools/FigmaExtractionTool.js +105 -0
  159. package/dist/tools/FigmaExtractionTool.js.map +1 -0
  160. package/dist/tools/ProjectAnalysisTool.d.ts +104 -0
  161. package/dist/tools/ProjectAnalysisTool.d.ts.map +1 -0
  162. package/dist/tools/ProjectAnalysisTool.js +428 -0
  163. package/dist/tools/ProjectAnalysisTool.js.map +1 -0
  164. package/dist/tools/ToolRegistry.d.ts +59 -0
  165. package/dist/tools/ToolRegistry.d.ts.map +1 -0
  166. package/dist/tools/ToolRegistry.js +162 -0
  167. package/dist/tools/ToolRegistry.js.map +1 -0
  168. package/dist/tools/TransformationTool.d.ts +30 -0
  169. package/dist/tools/TransformationTool.d.ts.map +1 -0
  170. package/dist/tools/TransformationTool.js +50 -0
  171. package/dist/tools/TransformationTool.js.map +1 -0
  172. package/dist/tools/index.d.ts +10 -0
  173. package/dist/tools/index.d.ts.map +1 -0
  174. package/dist/tools/index.js +32 -0
  175. package/dist/tools/index.js.map +1 -0
  176. package/dist/tools/types.d.ts +74 -0
  177. package/dist/tools/types.d.ts.map +1 -0
  178. package/dist/tools/types.js +6 -0
  179. package/dist/tools/types.js.map +1 -0
  180. package/dist/transformation/transformers/LayoutOptimizer.d.ts +8 -0
  181. package/dist/transformation/transformers/LayoutOptimizer.d.ts.map +1 -1
  182. package/dist/transformation/transformers/LayoutOptimizer.js +157 -15
  183. package/dist/transformation/transformers/LayoutOptimizer.js.map +1 -1
  184. package/dist/version/VersionManager.d.ts +128 -0
  185. package/dist/version/VersionManager.d.ts.map +1 -0
  186. package/dist/version/VersionManager.js +400 -0
  187. package/dist/version/VersionManager.js.map +1 -0
  188. package/dist/version/index.d.ts +5 -0
  189. package/dist/version/index.d.ts.map +1 -0
  190. package/dist/version/index.js +21 -0
  191. package/dist/version/index.js.map +1 -0
  192. package/package.json +3 -1
  193. package/QUICKSTART.md +0 -178
@@ -0,0 +1,109 @@
1
+ /**
2
+ * MCP 服务管理器
3
+ * 负责管理 MCP 服务的连接、工具发现和健康检查
4
+ */
5
+ import type { Tool } from '../tools/types';
6
+ export interface MCPService {
7
+ id: string;
8
+ name: string;
9
+ url: string;
10
+ connected: boolean;
11
+ tools: Tool[];
12
+ lastHealthCheck?: Date;
13
+ reconnectAttempts: number;
14
+ }
15
+ export interface MCPServiceConfig {
16
+ id: string;
17
+ name: string;
18
+ url: string;
19
+ autoConnect?: boolean;
20
+ healthCheckInterval?: number;
21
+ maxReconnectAttempts?: number;
22
+ }
23
+ export interface MCPServiceManager {
24
+ /**
25
+ * 注册 MCP 服务
26
+ */
27
+ registerService(config: MCPServiceConfig): Promise<void>;
28
+ /**
29
+ * 连接到 MCP 服务
30
+ */
31
+ connectService(serviceId: string): Promise<boolean>;
32
+ /**
33
+ * 断开 MCP 服务
34
+ */
35
+ disconnectService(serviceId: string): Promise<void>;
36
+ /**
37
+ * 发现服务提供的工具
38
+ */
39
+ discoverTools(serviceId: string): Promise<Tool[]>;
40
+ /**
41
+ * 获取所有已注册的服务
42
+ */
43
+ getServices(): MCPService[];
44
+ /**
45
+ * 获取特定服务
46
+ */
47
+ getService(serviceId: string): MCPService | undefined;
48
+ /**
49
+ * 健康检查
50
+ */
51
+ healthCheck(serviceId: string): Promise<boolean>;
52
+ /**
53
+ * 获取所有可用的工具
54
+ */
55
+ getAllTools(): Tool[];
56
+ }
57
+ /**
58
+ * MCP 服务管理器实现
59
+ */
60
+ export declare class MCPServiceManagerImpl implements MCPServiceManager {
61
+ private services;
62
+ private healthCheckIntervals;
63
+ private messageId;
64
+ /**
65
+ * 注册 MCP 服务
66
+ */
67
+ registerService(config: MCPServiceConfig): Promise<void>;
68
+ /**
69
+ * 连接到 MCP 服务
70
+ */
71
+ connectService(serviceId: string): Promise<boolean>;
72
+ /**
73
+ * 断开 MCP 服务
74
+ */
75
+ disconnectService(serviceId: string): Promise<void>;
76
+ /**
77
+ * 发现服务提供的工具
78
+ */
79
+ discoverTools(serviceId: string): Promise<Tool[]>;
80
+ /**
81
+ * 获取所有已注册的服务
82
+ */
83
+ getServices(): MCPService[];
84
+ /**
85
+ * 获取特定服务
86
+ */
87
+ getService(serviceId: string): MCPService | undefined;
88
+ /**
89
+ * 健康检查
90
+ */
91
+ healthCheck(serviceId: string): Promise<boolean>;
92
+ /**
93
+ * 获取所有可用的工具
94
+ */
95
+ getAllTools(): Tool[];
96
+ /**
97
+ * 发送 MCP 请求
98
+ */
99
+ private sendRequest;
100
+ /**
101
+ * 重连服务
102
+ */
103
+ private reconnect;
104
+ /**
105
+ * 启动健康检查
106
+ */
107
+ private startHealthCheck;
108
+ }
109
+ //# sourceMappingURL=MCPServiceManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MCPServiceManager.d.ts","sourceRoot":"","sources":["../../src/mcp/MCPServiceManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpD;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAElD;;OAEG;IACH,WAAW,IAAI,UAAU,EAAE,CAAC;IAE5B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAEtD;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjD;;OAEG;IACH,WAAW,IAAI,IAAI,EAAE,CAAC;CACvB;AAkBD;;GAEG;AACH,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,oBAAoB,CAA0C;IACtE,OAAO,CAAC,SAAS,CAAK;IAEtB;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B9D;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyCzD;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBzD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IA0BvD;;OAEG;IACH,WAAW,IAAI,UAAU,EAAE;IAI3B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIrD;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmCtD;;OAEG;IACH,WAAW,IAAI,IAAI,EAAE;IAYrB;;OAEG;YACW,WAAW;IA0BzB;;OAEG;YACW,SAAS;IA0BvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAYzB"}
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ /**
3
+ * MCP 服务管理器
4
+ * 负责管理 MCP 服务的连接、工具发现和健康检查
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MCPServiceManagerImpl = void 0;
8
+ /**
9
+ * MCP 服务管理器实现
10
+ */
11
+ class MCPServiceManagerImpl {
12
+ constructor() {
13
+ this.services = new Map();
14
+ this.healthCheckIntervals = new Map();
15
+ this.messageId = 0;
16
+ }
17
+ /**
18
+ * 注册 MCP 服务
19
+ */
20
+ async registerService(config) {
21
+ if (this.services.has(config.id)) {
22
+ throw new Error(`Service ${config.id} is already registered`);
23
+ }
24
+ const service = {
25
+ id: config.id,
26
+ name: config.name,
27
+ url: config.url,
28
+ connected: false,
29
+ tools: [],
30
+ reconnectAttempts: 0,
31
+ };
32
+ this.services.set(config.id, service);
33
+ // 自动连接
34
+ if (config.autoConnect !== false) {
35
+ try {
36
+ await this.connectService(config.id);
37
+ }
38
+ catch (error) {
39
+ console.warn(`Failed to auto-connect to service ${config.id}:`, error);
40
+ }
41
+ }
42
+ // 设置健康检查
43
+ if (config.healthCheckInterval && config.healthCheckInterval > 0) {
44
+ this.startHealthCheck(config.id, config.healthCheckInterval);
45
+ }
46
+ }
47
+ /**
48
+ * 连接到 MCP 服务
49
+ */
50
+ async connectService(serviceId) {
51
+ const service = this.services.get(serviceId);
52
+ if (!service) {
53
+ throw new Error(`Service ${serviceId} not found`);
54
+ }
55
+ try {
56
+ // 发送初始化请求
57
+ const response = await this.sendRequest(service, 'initialize', {
58
+ protocolVersion: '2024-11-05',
59
+ capabilities: {
60
+ tools: {},
61
+ },
62
+ clientInfo: {
63
+ name: 'figma-to-code-agent',
64
+ version: '1.0.0',
65
+ },
66
+ });
67
+ if (response.error) {
68
+ throw new Error(`Initialization failed: ${response.error.message}`);
69
+ }
70
+ service.connected = true;
71
+ service.reconnectAttempts = 0;
72
+ // 发现工具
73
+ const tools = await this.discoverTools(serviceId);
74
+ service.tools = tools;
75
+ console.log(`✓ Connected to MCP service: ${service.name}`);
76
+ console.log(` Discovered ${tools.length} tools`);
77
+ return true;
78
+ }
79
+ catch (error) {
80
+ service.connected = false;
81
+ console.error(`Failed to connect to service ${serviceId}:`, error);
82
+ return false;
83
+ }
84
+ }
85
+ /**
86
+ * 断开 MCP 服务
87
+ */
88
+ async disconnectService(serviceId) {
89
+ const service = this.services.get(serviceId);
90
+ if (!service) {
91
+ return;
92
+ }
93
+ // 停止健康检查
94
+ const interval = this.healthCheckIntervals.get(serviceId);
95
+ if (interval) {
96
+ clearInterval(interval);
97
+ this.healthCheckIntervals.delete(serviceId);
98
+ }
99
+ service.connected = false;
100
+ service.tools = [];
101
+ console.log(`Disconnected from MCP service: ${service.name}`);
102
+ }
103
+ /**
104
+ * 发现服务提供的工具
105
+ */
106
+ async discoverTools(serviceId) {
107
+ const service = this.services.get(serviceId);
108
+ if (!service) {
109
+ throw new Error(`Service ${serviceId} not found`);
110
+ }
111
+ if (!service.connected) {
112
+ throw new Error(`Service ${serviceId} is not connected`);
113
+ }
114
+ try {
115
+ const response = await this.sendRequest(service, 'tools/list', {});
116
+ if (response.error) {
117
+ throw new Error(`Tool discovery failed: ${response.error.message}`);
118
+ }
119
+ // 将 MCP 工具转换为标准 Tool 接口
120
+ // 这里返回空数组,实际的适配将在 MCPToolAdapter 中完成
121
+ return [];
122
+ }
123
+ catch (error) {
124
+ console.error(`Failed to discover tools from service ${serviceId}:`, error);
125
+ return [];
126
+ }
127
+ }
128
+ /**
129
+ * 获取所有已注册的服务
130
+ */
131
+ getServices() {
132
+ return Array.from(this.services.values());
133
+ }
134
+ /**
135
+ * 获取特定服务
136
+ */
137
+ getService(serviceId) {
138
+ return this.services.get(serviceId);
139
+ }
140
+ /**
141
+ * 健康检查
142
+ */
143
+ async healthCheck(serviceId) {
144
+ const service = this.services.get(serviceId);
145
+ if (!service) {
146
+ return false;
147
+ }
148
+ if (!service.connected) {
149
+ // 尝试重连
150
+ return await this.reconnect(service);
151
+ }
152
+ try {
153
+ // 发送 ping 请求
154
+ const response = await this.sendRequest(service, 'ping', {}, 5000 // 5 秒超时
155
+ );
156
+ const isHealthy = !response.error;
157
+ service.lastHealthCheck = new Date();
158
+ if (!isHealthy) {
159
+ console.warn(`Health check failed for service ${serviceId}`);
160
+ return await this.reconnect(service);
161
+ }
162
+ return true;
163
+ }
164
+ catch (error) {
165
+ console.error(`Health check error for service ${serviceId}:`, error);
166
+ return await this.reconnect(service);
167
+ }
168
+ }
169
+ /**
170
+ * 获取所有可用的工具
171
+ */
172
+ getAllTools() {
173
+ const allTools = [];
174
+ for (const service of this.services.values()) {
175
+ if (service.connected) {
176
+ allTools.push(...service.tools);
177
+ }
178
+ }
179
+ return allTools;
180
+ }
181
+ /**
182
+ * 发送 MCP 请求
183
+ */
184
+ async sendRequest(service, method, params, _timeout = 30000) {
185
+ const message = {
186
+ jsonrpc: '2.0',
187
+ id: ++this.messageId,
188
+ method,
189
+ params,
190
+ };
191
+ // 这里是简化实现,实际应该使用 WebSocket 或 stdio
192
+ // 目前返回模拟响应
193
+ return new Promise((resolve) => {
194
+ setTimeout(() => {
195
+ resolve({
196
+ jsonrpc: '2.0',
197
+ id: message.id,
198
+ result: {},
199
+ });
200
+ }, 100);
201
+ });
202
+ }
203
+ /**
204
+ * 重连服务
205
+ */
206
+ async reconnect(service) {
207
+ const maxAttempts = 5;
208
+ if (service.reconnectAttempts >= maxAttempts) {
209
+ console.error(`Max reconnect attempts (${maxAttempts}) reached for service ${service.id}`);
210
+ return false;
211
+ }
212
+ service.reconnectAttempts++;
213
+ console.log(`Attempting to reconnect to service ${service.id} (${service.reconnectAttempts}/${maxAttempts})...`);
214
+ const connected = await this.connectService(service.id);
215
+ if (!connected) {
216
+ // 指数退避
217
+ const delay = Math.min(1000 * Math.pow(2, service.reconnectAttempts), 30000);
218
+ await new Promise((resolve) => setTimeout(resolve, delay));
219
+ }
220
+ return connected;
221
+ }
222
+ /**
223
+ * 启动健康检查
224
+ */
225
+ startHealthCheck(serviceId, interval) {
226
+ const existingInterval = this.healthCheckIntervals.get(serviceId);
227
+ if (existingInterval) {
228
+ clearInterval(existingInterval);
229
+ }
230
+ const intervalId = setInterval(async () => {
231
+ await this.healthCheck(serviceId);
232
+ }, interval);
233
+ this.healthCheckIntervals.set(serviceId, intervalId);
234
+ }
235
+ }
236
+ exports.MCPServiceManagerImpl = MCPServiceManagerImpl;
237
+ //# sourceMappingURL=MCPServiceManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MCPServiceManager.js","sourceRoot":"","sources":["../../src/mcp/MCPServiceManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * MCP 工具适配器
3
+ * 将 MCP 工具适配为标准 Tool 接口
4
+ */
5
+ import type { Tool, ToolMetadata, ToolCategory } from '../tools/types';
6
+ import type { MCPService } from './MCPServiceManager';
7
+ /**
8
+ * MCP 工具定义(来自 MCP 协议)
9
+ */
10
+ export interface MCPToolDefinition {
11
+ name: string;
12
+ description?: string;
13
+ inputSchema: {
14
+ type: 'object';
15
+ properties?: Record<string, any>;
16
+ required?: string[];
17
+ };
18
+ }
19
+ /**
20
+ * MCP 工具适配器
21
+ * 将 MCP 工具包装为标准 Tool 接口
22
+ */
23
+ export declare class MCPToolAdapter implements Tool {
24
+ private mcpTool;
25
+ private service;
26
+ name: string;
27
+ description: string;
28
+ category: ToolCategory;
29
+ capabilities: string[];
30
+ private messageId;
31
+ constructor(mcpTool: MCPToolDefinition, service: MCPService, category?: ToolCategory);
32
+ /**
33
+ * 检查工具是否可用
34
+ */
35
+ isAvailable(): Promise<boolean>;
36
+ /**
37
+ * 执行工具
38
+ */
39
+ execute(inputs: Record<string, any>): Promise<any>;
40
+ /**
41
+ * 获取工具元数据
42
+ */
43
+ getMetadata(): ToolMetadata;
44
+ /**
45
+ * 调用 MCP 工具
46
+ */
47
+ private callMCPTool;
48
+ /**
49
+ * 发送 MCP 请求
50
+ */
51
+ private sendRequest;
52
+ /**
53
+ * 验证输入参数
54
+ */
55
+ private validateInputs;
56
+ /**
57
+ * 从能力中提取工具能力
58
+ */
59
+ private extractCapabilities;
60
+ /**
61
+ * 从 MCP 结果中提取数据
62
+ */
63
+ private extractData;
64
+ /**
65
+ * 从 MCP 结果中提取错误消息
66
+ */
67
+ private extractErrorMessage;
68
+ }
69
+ /**
70
+ * 从 MCP 服务创建工具适配器
71
+ */
72
+ export declare function createMCPToolAdapters(service: MCPService, mcpTools: MCPToolDefinition[]): MCPToolAdapter[];
73
+ //# sourceMappingURL=MCPToolAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MCPToolAdapter.d.ts","sourceRoot":"","sources":["../../src/mcp/MCPToolAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AA+BD;;;GAGG;AACH,qBAAa,cAAe,YAAW,IAAI;IASvC,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IATjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IAEvB,OAAO,CAAC,SAAS,CAAK;gBAGZ,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,UAAU,EAC3B,QAAQ,GAAE,YAA2B;IAQvC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAqCxD;;OAEG;IACH,WAAW,IAAI,YAAY;IAc3B;;OAEG;YACW,WAAW;IA6BzB;;OAEG;YACW,WAAW;IA2BzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAsBtB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8B3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAgCnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAQ5B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,iBAAiB,EAAE,GAC5B,cAAc,EAAE,CAkBlB"}
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+ /**
3
+ * MCP 工具适配器
4
+ * 将 MCP 工具适配为标准 Tool 接口
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MCPToolAdapter = void 0;
8
+ exports.createMCPToolAdapters = createMCPToolAdapters;
9
+ /**
10
+ * MCP 工具适配器
11
+ * 将 MCP 工具包装为标准 Tool 接口
12
+ */
13
+ class MCPToolAdapter {
14
+ constructor(mcpTool, service, category = 'extraction') {
15
+ this.mcpTool = mcpTool;
16
+ this.service = service;
17
+ this.messageId = 0;
18
+ this.name = `mcp-${service.id}-${mcpTool.name}`;
19
+ this.description = mcpTool.description || `MCP tool: ${mcpTool.name}`;
20
+ this.category = category;
21
+ this.capabilities = this.extractCapabilities(mcpTool);
22
+ }
23
+ /**
24
+ * 检查工具是否可用
25
+ */
26
+ async isAvailable() {
27
+ return this.service.connected;
28
+ }
29
+ /**
30
+ * 执行工具
31
+ */
32
+ async execute(inputs) {
33
+ if (!this.service.connected) {
34
+ throw new Error(`MCP service ${this.service.id} is not connected`);
35
+ }
36
+ // 验证输入
37
+ this.validateInputs(inputs);
38
+ try {
39
+ const startTime = Date.now();
40
+ // 调用 MCP 工具
41
+ const result = await this.callMCPTool(this.mcpTool.name, inputs);
42
+ const duration = Date.now() - startTime;
43
+ // 处理结果
44
+ if (result.isError) {
45
+ throw new Error(`MCP tool execution failed: ${this.extractErrorMessage(result)}`);
46
+ }
47
+ return {
48
+ success: true,
49
+ data: this.extractData(result),
50
+ metadata: {
51
+ duration,
52
+ toolName: this.name,
53
+ serviceId: this.service.id,
54
+ },
55
+ };
56
+ }
57
+ catch (error) {
58
+ throw new Error(`Failed to execute MCP tool ${this.mcpTool.name}: ${error.message}`);
59
+ }
60
+ }
61
+ /**
62
+ * 获取工具元数据
63
+ */
64
+ getMetadata() {
65
+ return {
66
+ version: '1.0.0',
67
+ author: `MCP Service: ${this.service.name}`,
68
+ performance: {
69
+ avgDuration: 2000, // 估计值
70
+ reliability: 0.9,
71
+ },
72
+ cost: {
73
+ apiCallsPerExecution: 1,
74
+ },
75
+ };
76
+ }
77
+ /**
78
+ * 调用 MCP 工具
79
+ */
80
+ async callMCPTool(toolName, inputs) {
81
+ const message = {
82
+ jsonrpc: '2.0',
83
+ id: ++this.messageId,
84
+ method: 'tools/call',
85
+ params: {
86
+ name: toolName,
87
+ arguments: inputs,
88
+ },
89
+ };
90
+ // 发送请求(这里是简化实现)
91
+ const response = await this.sendRequest(message);
92
+ if (response.error) {
93
+ return {
94
+ content: [
95
+ {
96
+ type: 'text',
97
+ text: response.error.message,
98
+ },
99
+ ],
100
+ isError: true,
101
+ };
102
+ }
103
+ return response.result;
104
+ }
105
+ /**
106
+ * 发送 MCP 请求
107
+ */
108
+ async sendRequest(message, timeout = 30000) {
109
+ // 这里是简化实现,实际应该使用 WebSocket 或 stdio
110
+ // 目前返回模拟响应
111
+ return new Promise((resolve, reject) => {
112
+ const timer = setTimeout(() => {
113
+ reject(new Error('Request timeout'));
114
+ }, timeout);
115
+ // 模拟异步响应
116
+ setTimeout(() => {
117
+ clearTimeout(timer);
118
+ resolve({
119
+ jsonrpc: '2.0',
120
+ id: message.id,
121
+ result: {
122
+ content: [
123
+ {
124
+ type: 'text',
125
+ text: 'Mock response',
126
+ },
127
+ ],
128
+ },
129
+ });
130
+ }, 100);
131
+ });
132
+ }
133
+ /**
134
+ * 验证输入参数
135
+ */
136
+ validateInputs(inputs) {
137
+ const schema = this.mcpTool.inputSchema;
138
+ // 检查必需参数
139
+ if (schema.required) {
140
+ for (const requiredField of schema.required) {
141
+ if (!(requiredField in inputs)) {
142
+ throw new Error(`Missing required parameter: ${requiredField}`);
143
+ }
144
+ }
145
+ }
146
+ // 简单的类型检查
147
+ if (schema.properties) {
148
+ for (const key of Object.keys(inputs)) {
149
+ if (!(key in schema.properties)) {
150
+ console.warn(`Unknown parameter: ${key}`);
151
+ }
152
+ }
153
+ }
154
+ }
155
+ /**
156
+ * 从能力中提取工具能力
157
+ */
158
+ extractCapabilities(tool) {
159
+ const capabilities = [];
160
+ // 基于工具名称推断能力
161
+ const name = tool.name.toLowerCase();
162
+ if (name.includes('figma') || name.includes('design')) {
163
+ capabilities.push('extract_design');
164
+ }
165
+ if (name.includes('file') || name.includes('get')) {
166
+ capabilities.push('read_data');
167
+ }
168
+ if (name.includes('create') || name.includes('update')) {
169
+ capabilities.push('write_data');
170
+ }
171
+ if (name.includes('analyze') || name.includes('inspect')) {
172
+ capabilities.push('analyze');
173
+ }
174
+ // 如果没有推断出任何能力,添加通用能力
175
+ if (capabilities.length === 0) {
176
+ capabilities.push('mcp_tool');
177
+ }
178
+ return capabilities;
179
+ }
180
+ /**
181
+ * 从 MCP 结果中提取数据
182
+ */
183
+ extractData(result) {
184
+ if (!result.content || result.content.length === 0) {
185
+ return null;
186
+ }
187
+ // 如果只有一个内容项,直接返回
188
+ if (result.content.length === 1) {
189
+ const item = result.content[0];
190
+ if (item.type === 'text') {
191
+ // 尝试解析 JSON
192
+ try {
193
+ return JSON.parse(item.text || '');
194
+ }
195
+ catch {
196
+ return item.text;
197
+ }
198
+ }
199
+ return item;
200
+ }
201
+ // 多个内容项,返回数组
202
+ return result.content.map((item) => {
203
+ if (item.type === 'text') {
204
+ try {
205
+ return JSON.parse(item.text || '');
206
+ }
207
+ catch {
208
+ return item.text;
209
+ }
210
+ }
211
+ return item;
212
+ });
213
+ }
214
+ /**
215
+ * 从 MCP 结果中提取错误消息
216
+ */
217
+ extractErrorMessage(result) {
218
+ if (!result.content || result.content.length === 0) {
219
+ return 'Unknown error';
220
+ }
221
+ const textContent = result.content.find((item) => item.type === 'text');
222
+ return textContent?.text || 'Unknown error';
223
+ }
224
+ }
225
+ exports.MCPToolAdapter = MCPToolAdapter;
226
+ /**
227
+ * 从 MCP 服务创建工具适配器
228
+ */
229
+ function createMCPToolAdapters(service, mcpTools) {
230
+ return mcpTools.map((tool) => {
231
+ // 根据工具名称推断类别
232
+ let category = 'extraction';
233
+ const name = tool.name.toLowerCase();
234
+ if (name.includes('transform') || name.includes('optimize')) {
235
+ category = 'transformation';
236
+ }
237
+ else if (name.includes('generate') || name.includes('create')) {
238
+ category = 'generation';
239
+ }
240
+ else if (name.includes('validate') || name.includes('test')) {
241
+ category = 'validation';
242
+ }
243
+ else if (name.includes('analyze') || name.includes('inspect')) {
244
+ category = 'analysis';
245
+ }
246
+ return new MCPToolAdapter(tool, service, category);
247
+ });
248
+ }
249
+ //# sourceMappingURL=MCPToolAdapter.js.map