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.
- package/CHANGELOG.md +44 -0
- package/README.md +69 -55
- package/README.zh-CN.md +173 -0
- package/dist/agent/ConversationContext.d.ts +91 -0
- package/dist/agent/ConversationContext.d.ts.map +1 -0
- package/dist/agent/ConversationContext.js +271 -0
- package/dist/agent/ConversationContext.js.map +1 -0
- package/dist/agent/DecisionEngine.d.ts +77 -0
- package/dist/agent/DecisionEngine.d.ts.map +1 -0
- package/dist/agent/DecisionEngine.js +414 -0
- package/dist/agent/DecisionEngine.js.map +1 -0
- package/dist/agent/ExecutionOrchestrator.d.ts +55 -0
- package/dist/agent/ExecutionOrchestrator.d.ts.map +1 -0
- package/dist/agent/ExecutionOrchestrator.js +360 -0
- package/dist/agent/ExecutionOrchestrator.js.map +1 -0
- package/dist/agent/IntentUnderstandingEngine.d.ts +43 -0
- package/dist/agent/IntentUnderstandingEngine.d.ts.map +1 -0
- package/dist/agent/IntentUnderstandingEngine.js +261 -0
- package/dist/agent/IntentUnderstandingEngine.js.map +1 -0
- package/dist/agent/index.d.ts +9 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +30 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/types.d.ts +111 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +6 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/InteractiveCLI.d.ts +109 -0
- package/dist/cli/InteractiveCLI.d.ts.map +1 -0
- package/dist/cli/InteractiveCLI.js +534 -0
- package/dist/cli/InteractiveCLI.js.map +1 -0
- package/dist/cli/ProgressDisplay.d.ts +117 -0
- package/dist/cli/ProgressDisplay.d.ts.map +1 -0
- package/dist/cli/ProgressDisplay.js +370 -0
- package/dist/cli/ProgressDisplay.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +22 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/consistency/DesignConsistencyChecker.d.ts +125 -0
- package/dist/consistency/DesignConsistencyChecker.d.ts.map +1 -0
- package/dist/consistency/DesignConsistencyChecker.js +448 -0
- package/dist/consistency/DesignConsistencyChecker.js.map +1 -0
- package/dist/consistency/index.d.ts +5 -0
- package/dist/consistency/index.d.ts.map +1 -0
- package/dist/consistency/index.js +21 -0
- package/dist/consistency/index.js.map +1 -0
- package/dist/context/CodeStyleMatcher.d.ts +124 -0
- package/dist/context/CodeStyleMatcher.d.ts.map +1 -0
- package/dist/context/CodeStyleMatcher.js +558 -0
- package/dist/context/CodeStyleMatcher.js.map +1 -0
- package/dist/context/IncrementalUpdater.d.ts +97 -0
- package/dist/context/IncrementalUpdater.d.ts.map +1 -0
- package/dist/context/IncrementalUpdater.js +431 -0
- package/dist/context/IncrementalUpdater.js.map +1 -0
- package/dist/context/index.d.ts +6 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +22 -0
- package/dist/context/index.js.map +1 -0
- package/dist/feedback/FeedbackLoop.d.ts +125 -0
- package/dist/feedback/FeedbackLoop.d.ts.map +1 -0
- package/dist/feedback/FeedbackLoop.js +353 -0
- package/dist/feedback/FeedbackLoop.js.map +1 -0
- package/dist/feedback/index.d.ts +5 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/index.js +21 -0
- package/dist/feedback/index.js.map +1 -0
- package/dist/mcp/FigmaMCPIntegration.d.ts +72 -0
- package/dist/mcp/FigmaMCPIntegration.d.ts.map +1 -0
- package/dist/mcp/FigmaMCPIntegration.js +173 -0
- package/dist/mcp/FigmaMCPIntegration.js.map +1 -0
- package/dist/mcp/MCPServiceManager.d.ts +109 -0
- package/dist/mcp/MCPServiceManager.d.ts.map +1 -0
- package/dist/mcp/MCPServiceManager.js +237 -0
- package/dist/mcp/MCPServiceManager.js.map +1 -0
- package/dist/mcp/MCPToolAdapter.d.ts +73 -0
- package/dist/mcp/MCPToolAdapter.d.ts.map +1 -0
- package/dist/mcp/MCPToolAdapter.js +249 -0
- package/dist/mcp/MCPToolAdapter.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +23 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp-server/MCPServer.d.ts +125 -0
- package/dist/mcp-server/MCPServer.d.ts.map +1 -0
- package/dist/mcp-server/MCPServer.js +449 -0
- package/dist/mcp-server/MCPServer.js.map +1 -0
- package/dist/mcp-server/index.d.ts +5 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +21 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/monitoring/ExecutionSummary.d.ts +160 -0
- package/dist/monitoring/ExecutionSummary.d.ts.map +1 -0
- package/dist/monitoring/ExecutionSummary.js +345 -0
- package/dist/monitoring/ExecutionSummary.js.map +1 -0
- package/dist/monitoring/Logger.d.ts +139 -0
- package/dist/monitoring/Logger.d.ts.map +1 -0
- package/dist/monitoring/Logger.js +406 -0
- package/dist/monitoring/Logger.js.map +1 -0
- package/dist/monitoring/index.d.ts +6 -0
- package/dist/monitoring/index.d.ts.map +1 -0
- package/dist/monitoring/index.js +22 -0
- package/dist/monitoring/index.js.map +1 -0
- package/dist/performance/LLMCache.d.ts +133 -0
- package/dist/performance/LLMCache.d.ts.map +1 -0
- package/dist/performance/LLMCache.js +358 -0
- package/dist/performance/LLMCache.js.map +1 -0
- package/dist/performance/ParallelProcessor.d.ts +89 -0
- package/dist/performance/ParallelProcessor.d.ts.map +1 -0
- package/dist/performance/ParallelProcessor.js +253 -0
- package/dist/performance/ParallelProcessor.js.map +1 -0
- package/dist/performance/TokenMonitor.d.ts +166 -0
- package/dist/performance/TokenMonitor.d.ts.map +1 -0
- package/dist/performance/TokenMonitor.js +315 -0
- package/dist/performance/TokenMonitor.js.map +1 -0
- package/dist/performance/index.d.ts +7 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +23 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/prototype/InteractivePrototypeGenerator.d.ts +175 -0
- package/dist/prototype/InteractivePrototypeGenerator.d.ts.map +1 -0
- package/dist/prototype/InteractivePrototypeGenerator.js +624 -0
- package/dist/prototype/InteractivePrototypeGenerator.js.map +1 -0
- package/dist/prototype/index.d.ts +5 -0
- package/dist/prototype/index.d.ts.map +1 -0
- package/dist/prototype/index.js +21 -0
- package/dist/prototype/index.js.map +1 -0
- package/dist/skill/SkillConfig.d.ts +66 -0
- package/dist/skill/SkillConfig.d.ts.map +1 -0
- package/dist/skill/SkillConfig.js +233 -0
- package/dist/skill/SkillConfig.js.map +1 -0
- package/dist/skill/SkillInterface.d.ts +102 -0
- package/dist/skill/SkillInterface.d.ts.map +1 -0
- package/dist/skill/SkillInterface.js +425 -0
- package/dist/skill/SkillInterface.js.map +1 -0
- package/dist/skill/index.d.ts +7 -0
- package/dist/skill/index.d.ts.map +1 -0
- package/dist/skill/index.js +23 -0
- package/dist/skill/index.js.map +1 -0
- package/dist/skill/types.d.ts +103 -0
- package/dist/skill/types.d.ts.map +1 -0
- package/dist/skill/types.js +6 -0
- package/dist/skill/types.js.map +1 -0
- package/dist/templates/TemplateManager.d.ts +147 -0
- package/dist/templates/TemplateManager.d.ts.map +1 -0
- package/dist/templates/TemplateManager.js +418 -0
- package/dist/templates/TemplateManager.js.map +1 -0
- package/dist/templates/index.d.ts +6 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +10 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/tools/CodeGenerationTool.d.ts +32 -0
- package/dist/tools/CodeGenerationTool.d.ts.map +1 -0
- package/dist/tools/CodeGenerationTool.js +63 -0
- package/dist/tools/CodeGenerationTool.js.map +1 -0
- package/dist/tools/FigmaExtractionTool.d.ts +45 -0
- package/dist/tools/FigmaExtractionTool.d.ts.map +1 -0
- package/dist/tools/FigmaExtractionTool.js +105 -0
- package/dist/tools/FigmaExtractionTool.js.map +1 -0
- package/dist/tools/ProjectAnalysisTool.d.ts +104 -0
- package/dist/tools/ProjectAnalysisTool.d.ts.map +1 -0
- package/dist/tools/ProjectAnalysisTool.js +428 -0
- package/dist/tools/ProjectAnalysisTool.js.map +1 -0
- package/dist/tools/ToolRegistry.d.ts +59 -0
- package/dist/tools/ToolRegistry.d.ts.map +1 -0
- package/dist/tools/ToolRegistry.js +162 -0
- package/dist/tools/ToolRegistry.js.map +1 -0
- package/dist/tools/TransformationTool.d.ts +30 -0
- package/dist/tools/TransformationTool.d.ts.map +1 -0
- package/dist/tools/TransformationTool.js +50 -0
- package/dist/tools/TransformationTool.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/types.d.ts +74 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +6 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/transformation/transformers/LayoutOptimizer.d.ts +8 -0
- package/dist/transformation/transformers/LayoutOptimizer.d.ts.map +1 -1
- package/dist/transformation/transformers/LayoutOptimizer.js +157 -15
- package/dist/transformation/transformers/LayoutOptimizer.js.map +1 -1
- package/dist/version/VersionManager.d.ts +128 -0
- package/dist/version/VersionManager.d.ts.map +1 -0
- package/dist/version/VersionManager.js +400 -0
- package/dist/version/VersionManager.js.map +1 -0
- package/dist/version/index.d.ts +5 -0
- package/dist/version/index.d.ts.map +1 -0
- package/dist/version/index.js +21 -0
- package/dist/version/index.js.map +1 -0
- package/package.json +3 -1
- 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
|