figma-to-code-agent 0.5.0 → 0.7.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 +44 -0
  2. package/README.md +69 -55
  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 -168
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExecutionOrchestrator = void 0;
4
+ /**
5
+ * 执行编排器
6
+ * 协调工具调用和处理结果
7
+ */
8
+ class ExecutionOrchestrator {
9
+ constructor(tools) {
10
+ this.tools = tools;
11
+ this.executionStartTime = 0;
12
+ this.totalTokensUsed = 0;
13
+ this.totalApiCalls = 0;
14
+ this.toolsInvoked = [];
15
+ }
16
+ /**
17
+ * 执行策略
18
+ */
19
+ async executeStrategy(strategy, context) {
20
+ this.executionStartTime = Date.now();
21
+ this.totalTokensUsed = 0;
22
+ this.totalApiCalls = 0;
23
+ this.toolsInvoked = [];
24
+ const artifacts = [];
25
+ const errors = [];
26
+ try {
27
+ // 保存初始检查点
28
+ this.saveCheckpoint(context, 'strategy_start', {
29
+ strategyId: strategy.id,
30
+ step: 0,
31
+ });
32
+ // 更新任务状态
33
+ context.taskState.phase = 'executing';
34
+ context.taskState.currentStep = strategy.name;
35
+ context.taskState.progress = 0;
36
+ // 执行每个步骤
37
+ for (let i = 0; i < strategy.steps.length; i++) {
38
+ const step = strategy.steps[i];
39
+ // 更新进度
40
+ context.taskState.progress = Math.floor(((i + 1) / strategy.steps.length) * 100);
41
+ context.taskState.currentStep = `执行步骤 ${i + 1}/${strategy.steps.length}: ${step.action}`;
42
+ try {
43
+ // 调用工具
44
+ const result = await this.invokeToolWithRetry(step, context);
45
+ // 处理结果
46
+ if (result.success) {
47
+ // 如果结果包含生成的文件,添加到 artifacts
48
+ if (result.data?.files) {
49
+ for (const file of result.data.files) {
50
+ artifacts.push({
51
+ id: `${Date.now()}-${file.path}`,
52
+ type: 'code',
53
+ path: file.path,
54
+ content: file.content,
55
+ version: 1,
56
+ timestamp: Date.now(),
57
+ });
58
+ }
59
+ }
60
+ // 累计指标
61
+ this.totalApiCalls++;
62
+ if (result.metadata.tokensUsed) {
63
+ this.totalTokensUsed += result.metadata.tokensUsed;
64
+ }
65
+ this.toolsInvoked.push(result.metadata.toolName);
66
+ // 保存检查点
67
+ this.saveCheckpoint(context, `step_${i}_complete`, {
68
+ step: i,
69
+ result: result.data,
70
+ });
71
+ }
72
+ else {
73
+ // 工具执行失败
74
+ errors.push({
75
+ type: 'tool_execution_failed',
76
+ message: `工具 ${step.tool} 执行失败: ${result.error?.message}`,
77
+ context: { step: i, tool: step.tool },
78
+ recoverable: !!step.fallbackTool,
79
+ });
80
+ // 如果错误不可恢复,停止执行
81
+ if (!step.fallbackTool) {
82
+ break;
83
+ }
84
+ }
85
+ }
86
+ catch (error) {
87
+ // 捕获未预期的错误
88
+ errors.push({
89
+ type: 'unexpected_error',
90
+ message: error instanceof Error ? error.message : String(error),
91
+ context: { step: i, tool: step.tool },
92
+ recoverable: false,
93
+ });
94
+ break;
95
+ }
96
+ }
97
+ // 更新最终状态
98
+ context.taskState.progress = 100;
99
+ context.taskState.phase = errors.length > 0 ? 'reviewing' : 'completed';
100
+ // 分析执行结果并决定下一步
101
+ const nextAction = this.analyzeResults(artifacts, errors, context);
102
+ return {
103
+ success: errors.length === 0,
104
+ artifacts,
105
+ errors,
106
+ metrics: this.getMetrics(),
107
+ nextAction,
108
+ };
109
+ }
110
+ catch (error) {
111
+ // 顶层错误处理
112
+ errors.push({
113
+ type: 'orchestrator_error',
114
+ message: error instanceof Error ? error.message : String(error),
115
+ context: { strategy: strategy.id },
116
+ recoverable: false,
117
+ });
118
+ return {
119
+ success: false,
120
+ artifacts,
121
+ errors,
122
+ metrics: this.getMetrics(),
123
+ nextAction: 'ask_user',
124
+ };
125
+ }
126
+ }
127
+ /**
128
+ * 调用工具(带重试和回退)
129
+ */
130
+ async invokeToolWithRetry(step, context) {
131
+ const tool = this.tools.get(step.tool);
132
+ if (!tool) {
133
+ // 工具不存在,尝试回退
134
+ if (step.fallbackTool) {
135
+ return this.invokeFallbackTool(step, context);
136
+ }
137
+ return {
138
+ success: false,
139
+ data: null,
140
+ error: new Error(`工具 ${step.tool} 不存在`),
141
+ metadata: {
142
+ duration: 0,
143
+ toolName: step.tool,
144
+ },
145
+ };
146
+ }
147
+ try {
148
+ // 检查工具是否可用
149
+ const isAvailable = await tool.isAvailable();
150
+ if (!isAvailable) {
151
+ // 工具不可用,尝试回退
152
+ if (step.fallbackTool) {
153
+ return this.invokeFallbackTool(step, context);
154
+ }
155
+ return {
156
+ success: false,
157
+ data: null,
158
+ error: new Error(`工具 ${step.tool} 不可用`),
159
+ metadata: {
160
+ duration: 0,
161
+ toolName: step.tool,
162
+ },
163
+ };
164
+ }
165
+ // 执行工具
166
+ return await this.invokeTool(tool, step.inputs);
167
+ }
168
+ catch (error) {
169
+ // 工具执行失败,尝试回退
170
+ if (step.fallbackTool) {
171
+ return this.invokeFallbackTool(step, context);
172
+ }
173
+ return {
174
+ success: false,
175
+ data: null,
176
+ error: error instanceof Error ? error : new Error(String(error)),
177
+ metadata: {
178
+ duration: 0,
179
+ toolName: step.tool,
180
+ },
181
+ };
182
+ }
183
+ }
184
+ /**
185
+ * 调用回退工具
186
+ */
187
+ async invokeFallbackTool(step, _context) {
188
+ if (!step.fallbackTool) {
189
+ return {
190
+ success: false,
191
+ data: null,
192
+ error: new Error('没有可用的回退工具'),
193
+ metadata: {
194
+ duration: 0,
195
+ toolName: step.tool,
196
+ },
197
+ };
198
+ }
199
+ const fallbackTool = this.tools.get(step.fallbackTool);
200
+ if (!fallbackTool) {
201
+ return {
202
+ success: false,
203
+ data: null,
204
+ error: new Error(`回退工具 ${step.fallbackTool} 不存在`),
205
+ metadata: {
206
+ duration: 0,
207
+ toolName: step.fallbackTool,
208
+ },
209
+ };
210
+ }
211
+ try {
212
+ return await this.invokeTool(fallbackTool, step.inputs);
213
+ }
214
+ catch (error) {
215
+ return {
216
+ success: false,
217
+ data: null,
218
+ error: error instanceof Error ? error : new Error(String(error)),
219
+ metadata: {
220
+ duration: 0,
221
+ toolName: step.fallbackTool,
222
+ },
223
+ };
224
+ }
225
+ }
226
+ /**
227
+ * 调用工具
228
+ */
229
+ async invokeTool(tool, inputs) {
230
+ const startTime = Date.now();
231
+ try {
232
+ const result = await tool.execute(inputs);
233
+ const duration = Date.now() - startTime;
234
+ return {
235
+ success: true,
236
+ data: result,
237
+ metadata: {
238
+ duration,
239
+ toolName: tool.name,
240
+ },
241
+ };
242
+ }
243
+ catch (error) {
244
+ const duration = Date.now() - startTime;
245
+ return {
246
+ success: false,
247
+ data: null,
248
+ error: error instanceof Error ? error : new Error(String(error)),
249
+ metadata: {
250
+ duration,
251
+ toolName: tool.name,
252
+ },
253
+ };
254
+ }
255
+ }
256
+ /**
257
+ * 处理工具失败
258
+ */
259
+ async handleToolFailure(tool, error, fallback) {
260
+ // 记录错误
261
+ console.error(`工具 ${tool.name} 执行失败:`, error);
262
+ // 如果有回退工具,尝试使用
263
+ if (fallback) {
264
+ try {
265
+ return await this.invokeTool(fallback, {});
266
+ }
267
+ catch (fallbackError) {
268
+ return {
269
+ success: false,
270
+ data: null,
271
+ error: fallbackError instanceof Error ? fallbackError : new Error(String(fallbackError)),
272
+ metadata: {
273
+ duration: 0,
274
+ toolName: fallback.name,
275
+ },
276
+ };
277
+ }
278
+ }
279
+ return {
280
+ success: false,
281
+ data: null,
282
+ error,
283
+ metadata: {
284
+ duration: 0,
285
+ toolName: tool.name,
286
+ },
287
+ };
288
+ }
289
+ /**
290
+ * 保存检查点
291
+ */
292
+ saveCheckpoint(context, checkpointId, data) {
293
+ const checkpoint = {
294
+ id: checkpointId,
295
+ timestamp: Date.now(),
296
+ phase: context.taskState.phase,
297
+ data,
298
+ };
299
+ context.taskState.checkpoints.push(checkpoint);
300
+ }
301
+ /**
302
+ * 从检查点恢复
303
+ */
304
+ async restoreFromCheckpoint(context, checkpointId) {
305
+ const checkpoint = context.taskState.checkpoints.find((cp) => cp.id === checkpointId);
306
+ if (!checkpoint) {
307
+ return false;
308
+ }
309
+ // 恢复任务状态
310
+ context.taskState.phase = checkpoint.phase;
311
+ // 恢复执行数据
312
+ // 这里可以根据 checkpoint.data 恢复具体的执行状态
313
+ return true;
314
+ }
315
+ /**
316
+ * 分析执行结果并决定下一步
317
+ */
318
+ analyzeResults(artifacts, errors, context) {
319
+ // 如果有不可恢复的错误,询问用户
320
+ if (errors.some((e) => !e.recoverable)) {
321
+ return 'ask_user';
322
+ }
323
+ // 如果没有生成任何产物,询问用户
324
+ if (artifacts.length === 0) {
325
+ return 'ask_user';
326
+ }
327
+ // 如果有可恢复的错误,建议迭代
328
+ if (errors.length > 0) {
329
+ return 'iterate';
330
+ }
331
+ // 如果用户偏好是详细模式,询问是否需要改进
332
+ if (context.userPreferences.verbosity === 'detailed') {
333
+ return 'ask_user';
334
+ }
335
+ // 否则完成
336
+ return 'complete';
337
+ }
338
+ /**
339
+ * 获取执行指标
340
+ */
341
+ getMetrics() {
342
+ return {
343
+ totalDuration: Date.now() - this.executionStartTime,
344
+ tokensUsed: this.totalTokensUsed,
345
+ apiCalls: this.totalApiCalls,
346
+ toolsInvoked: [...this.toolsInvoked],
347
+ };
348
+ }
349
+ /**
350
+ * 重置指标
351
+ */
352
+ resetMetrics() {
353
+ this.executionStartTime = 0;
354
+ this.totalTokensUsed = 0;
355
+ this.totalApiCalls = 0;
356
+ this.toolsInvoked = [];
357
+ }
358
+ }
359
+ exports.ExecutionOrchestrator = ExecutionOrchestrator;
360
+ //# sourceMappingURL=ExecutionOrchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionOrchestrator.js","sourceRoot":"","sources":["../../src/agent/ExecutionOrchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { LLMProvider } from '../llm/types';
2
+ import type { Intent, ConversationContext } from './types';
3
+ /**
4
+ * 意图理解引擎
5
+ * 解析用户输入并识别意图
6
+ */
7
+ export declare class IntentUnderstandingEngine {
8
+ private llm?;
9
+ constructor(llm?: LLMProvider | undefined);
10
+ /**
11
+ * 分析用户输入并提取意图
12
+ */
13
+ analyzeInput(input: string, context: ConversationContext): Promise<Intent>;
14
+ /**
15
+ * 提取 Figma URL 中的文件 ID 和节点 ID
16
+ */
17
+ private extractFigmaInput;
18
+ /**
19
+ * 使用 LLM 分析意图
20
+ */
21
+ private analyzeWithLLM;
22
+ /**
23
+ * 构建 LLM prompt
24
+ */
25
+ private buildLLMPrompt;
26
+ /**
27
+ * 解析 LLM 响应
28
+ */
29
+ private parseLLMResponse;
30
+ /**
31
+ * 使用基于规则的分析
32
+ */
33
+ private analyzeWithRules;
34
+ /**
35
+ * 识别缺失的信息
36
+ */
37
+ identifyMissingInfo(intent: Intent): string[];
38
+ /**
39
+ * 生成澄清问题
40
+ */
41
+ generateClarificationQuestions(missingInfo: string[]): string[];
42
+ }
43
+ //# sourceMappingURL=IntentUnderstandingEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IntentUnderstandingEngine.d.ts","sourceRoot":"","sources":["../../src/agent/IntentUnderstandingEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAc,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEvE;;;GAGG;AACH,qBAAa,yBAAyB;IACxB,OAAO,CAAC,GAAG,CAAC;gBAAJ,GAAG,CAAC,EAAE,WAAW,YAAA;IAErC;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAahF;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;OAEG;YACW,cAAc;IAuB5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAyCtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwExB;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAkB7C;;OAEG;IACH,8BAA8B,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CAqBhE"}
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IntentUnderstandingEngine = void 0;
4
+ /**
5
+ * 意图理解引擎
6
+ * 解析用户输入并识别意图
7
+ */
8
+ class IntentUnderstandingEngine {
9
+ constructor(llm) {
10
+ this.llm = llm;
11
+ }
12
+ /**
13
+ * 分析用户输入并提取意图
14
+ */
15
+ async analyzeInput(input, context) {
16
+ // 首先尝试提取 Figma 输入
17
+ const figmaInput = this.extractFigmaInput(input);
18
+ // 如果有 LLM,使用 LLM 进行深度分析
19
+ if (this.llm) {
20
+ return this.analyzeWithLLM(input, figmaInput, context);
21
+ }
22
+ // 否则使用基于规则的分析
23
+ return this.analyzeWithRules(input, figmaInput, context);
24
+ }
25
+ /**
26
+ * 提取 Figma URL 中的文件 ID 和节点 ID
27
+ */
28
+ extractFigmaInput(input) {
29
+ // 匹配 Figma URL 格式
30
+ // https://www.figma.com/file/{fileKey}/{title}?node-id={nodeId}
31
+ // https://www.figma.com/design/{fileKey}/{title}?node-id={nodeId}
32
+ const urlPattern = /https?:\/\/(?:www\.)?figma\.com\/(?:file|design)\/([a-zA-Z0-9]+)(?:\/[^?]*)?(?:\?.*node-id=([^&]+))?/;
33
+ const match = input.match(urlPattern);
34
+ if (match) {
35
+ const fileKey = match[1];
36
+ const nodeId = match[2]?.replace(/-/g, ':'); // Convert node-id format
37
+ return {
38
+ type: 'url',
39
+ url: match[0],
40
+ fileKey,
41
+ nodeIds: nodeId ? [nodeId] : undefined,
42
+ };
43
+ }
44
+ // 检查是否直接提供了文件 ID
45
+ const fileIdPattern = /\b([a-zA-Z0-9]{22,})\b/;
46
+ const fileIdMatch = input.match(fileIdPattern);
47
+ if (fileIdMatch) {
48
+ return {
49
+ type: 'file_id',
50
+ fileKey: fileIdMatch[1],
51
+ };
52
+ }
53
+ // 检查是否要求使用当前打开的文件(MCP)
54
+ if (input.includes('当前') || input.includes('current') || input.includes('opened')) {
55
+ return {
56
+ type: 'mcp_current',
57
+ };
58
+ }
59
+ return null;
60
+ }
61
+ /**
62
+ * 使用 LLM 分析意图
63
+ */
64
+ async analyzeWithLLM(input, figmaInput, context) {
65
+ const prompt = this.buildLLMPrompt(input, figmaInput, context);
66
+ try {
67
+ const response = await this.llm.chat([
68
+ {
69
+ role: 'user',
70
+ content: prompt,
71
+ },
72
+ ]);
73
+ // 解析 LLM 响应
74
+ return this.parseLLMResponse(response.content, figmaInput);
75
+ }
76
+ catch (error) {
77
+ console.warn('LLM analysis failed, falling back to rules:', error);
78
+ return this.analyzeWithRules(input, figmaInput, context);
79
+ }
80
+ }
81
+ /**
82
+ * 构建 LLM prompt
83
+ */
84
+ buildLLMPrompt(input, figmaInput, context) {
85
+ const historyContext = context.history
86
+ .slice(-5) // 最近 5 条消息
87
+ .map((m) => `${m.role}: ${m.content}`)
88
+ .join('\n');
89
+ return `你是一个 Figma 设计转代码的 AI Agent。分析用户的意图并提取关键信息。
90
+
91
+ 用户输入:${input}
92
+
93
+ ${figmaInput ? `检测到 Figma 输入:${JSON.stringify(figmaInput)}` : ''}
94
+
95
+ ${historyContext ? `对话历史:\n${historyContext}` : ''}
96
+
97
+ 请分析用户意图并以 JSON 格式返回:
98
+ {
99
+ "type": "generate_new" | "update_existing" | "optimize" | "analyze",
100
+ "targetFramework": "react" | "vue" | null,
101
+ "styleMode": "css-modules" | "tailwind" | "css" | null,
102
+ "qualityMode": "fast" | "balanced" | "high" | null,
103
+ "additionalRequirements": ["requirement1", "requirement2"]
104
+ }
105
+
106
+ 规则:
107
+ - 如果用户说"生成"、"创建"、"转换",type 为 "generate_new"
108
+ - 如果用户说"更新"、"修改"、"改进",type 为 "update_existing"
109
+ - 如果用户说"优化"、"提升性能",type 为 "optimize"
110
+ - 如果用户说"分析"、"检查"、"查看",type 为 "analyze"
111
+ - 如果提到 React/Vue,设置 targetFramework
112
+ - 如果提到 Tailwind/CSS Modules/CSS,设置 styleMode
113
+ - 如果提到"快速"、"原型",qualityMode 为 "fast"
114
+ - 如果提到"高质量"、"生产",qualityMode 为 "high"
115
+ - 提取其他特殊要求到 additionalRequirements
116
+
117
+ 只返回 JSON,不要其他解释。`;
118
+ }
119
+ /**
120
+ * 解析 LLM 响应
121
+ */
122
+ parseLLMResponse(response, figmaInput) {
123
+ try {
124
+ // 提取 JSON 部分
125
+ const jsonMatch = response.match(/\{[\s\S]*\}/);
126
+ if (!jsonMatch) {
127
+ throw new Error('No JSON found in response');
128
+ }
129
+ const parsed = JSON.parse(jsonMatch[0]);
130
+ return {
131
+ type: parsed.type || 'generate_new',
132
+ figmaInput: figmaInput || { type: 'url' },
133
+ targetFramework: parsed.targetFramework || undefined,
134
+ styleMode: parsed.styleMode || undefined,
135
+ qualityMode: parsed.qualityMode || 'balanced',
136
+ additionalRequirements: parsed.additionalRequirements || [],
137
+ };
138
+ }
139
+ catch (error) {
140
+ console.warn('Failed to parse LLM response:', error);
141
+ // 返回默认意图
142
+ return {
143
+ type: 'generate_new',
144
+ figmaInput: figmaInput || { type: 'url' },
145
+ additionalRequirements: [],
146
+ };
147
+ }
148
+ }
149
+ /**
150
+ * 使用基于规则的分析
151
+ */
152
+ analyzeWithRules(input, figmaInput, context) {
153
+ const lowerInput = input.toLowerCase();
154
+ // 确定意图类型
155
+ let type = 'generate_new';
156
+ if (lowerInput.includes('更新') || lowerInput.includes('修改') || lowerInput.includes('update') || lowerInput.includes('modify')) {
157
+ type = 'update_existing';
158
+ }
159
+ else if (lowerInput.includes('优化') || lowerInput.includes('optimize') || lowerInput.includes('improve')) {
160
+ type = 'optimize';
161
+ }
162
+ else if (lowerInput.includes('分析') || lowerInput.includes('analyze') || lowerInput.includes('check')) {
163
+ type = 'analyze';
164
+ }
165
+ // 提取框架
166
+ let targetFramework;
167
+ if (lowerInput.includes('react')) {
168
+ targetFramework = 'react';
169
+ }
170
+ else if (lowerInput.includes('vue')) {
171
+ targetFramework = 'vue';
172
+ }
173
+ else if (context.userPreferences.defaultFramework) {
174
+ targetFramework = context.userPreferences.defaultFramework;
175
+ }
176
+ // 提取样式模式
177
+ let styleMode;
178
+ if (lowerInput.includes('tailwind')) {
179
+ styleMode = 'tailwind';
180
+ }
181
+ else if (lowerInput.includes('css module') || lowerInput.includes('css-module')) {
182
+ styleMode = 'css-modules';
183
+ }
184
+ else if (lowerInput.includes('css')) {
185
+ styleMode = 'css';
186
+ }
187
+ else if (context.userPreferences.defaultStyleMode) {
188
+ styleMode = context.userPreferences.defaultStyleMode;
189
+ }
190
+ // 提取质量模式
191
+ let qualityMode = 'balanced';
192
+ if (lowerInput.includes('快速') || lowerInput.includes('fast') || lowerInput.includes('quick') || lowerInput.includes('原型') || lowerInput.includes('prototype')) {
193
+ qualityMode = 'fast';
194
+ }
195
+ else if (lowerInput.includes('高质量') || lowerInput.includes('high quality') || lowerInput.includes('生产') || lowerInput.includes('production')) {
196
+ qualityMode = 'high';
197
+ }
198
+ // 提取额外要求
199
+ const additionalRequirements = [];
200
+ if (lowerInput.includes('typescript') || lowerInput.includes('ts')) {
201
+ additionalRequirements.push('typescript');
202
+ }
203
+ if (lowerInput.includes('响应式') || lowerInput.includes('responsive')) {
204
+ additionalRequirements.push('responsive');
205
+ }
206
+ if (lowerInput.includes('暗色模式') || lowerInput.includes('dark mode')) {
207
+ additionalRequirements.push('dark_mode');
208
+ }
209
+ if (lowerInput.includes('无障碍') || lowerInput.includes('accessibility') || lowerInput.includes('a11y')) {
210
+ additionalRequirements.push('accessibility');
211
+ }
212
+ return {
213
+ type,
214
+ figmaInput: figmaInput || { type: 'url' },
215
+ targetFramework,
216
+ styleMode,
217
+ qualityMode,
218
+ additionalRequirements,
219
+ };
220
+ }
221
+ /**
222
+ * 识别缺失的信息
223
+ */
224
+ identifyMissingInfo(intent) {
225
+ const missing = [];
226
+ if (!intent.figmaInput || (!intent.figmaInput.url && !intent.figmaInput.fileKey)) {
227
+ missing.push('figma_input');
228
+ }
229
+ if (!intent.targetFramework) {
230
+ missing.push('target_framework');
231
+ }
232
+ if (!intent.styleMode) {
233
+ missing.push('style_mode');
234
+ }
235
+ return missing;
236
+ }
237
+ /**
238
+ * 生成澄清问题
239
+ */
240
+ generateClarificationQuestions(missingInfo) {
241
+ const questions = [];
242
+ for (const info of missingInfo) {
243
+ switch (info) {
244
+ case 'figma_input':
245
+ questions.push('请提供 Figma 设计链接或文件 ID');
246
+ break;
247
+ case 'target_framework':
248
+ questions.push('您希望生成 React 还是 Vue 组件?');
249
+ break;
250
+ case 'style_mode':
251
+ questions.push('您希望使用哪种样式方案?(CSS Modules / Tailwind / 纯 CSS)');
252
+ break;
253
+ default:
254
+ questions.push(`请提供 ${info}`);
255
+ }
256
+ }
257
+ return questions;
258
+ }
259
+ }
260
+ exports.IntentUnderstandingEngine = IntentUnderstandingEngine;
261
+ //# sourceMappingURL=IntentUnderstandingEngine.js.map