@marktoflow/gui 2.0.2 → 2.0.3
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/README.md +9 -3
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/client/App.tsx.html +2230 -0
- package/coverage/client/components/Accessibility/LiveRegion.tsx.html +166 -0
- package/coverage/client/components/Accessibility/SkipNav.tsx.html +106 -0
- package/coverage/client/components/Accessibility/index.html +131 -0
- package/coverage/client/components/Admin/AuditViewer.tsx.html +214 -0
- package/coverage/client/components/Admin/EnvironmentSwitcher.tsx.html +187 -0
- package/coverage/client/components/Admin/RoleManager.tsx.html +250 -0
- package/coverage/client/components/Admin/SecretsVault.tsx.html +241 -0
- package/coverage/client/components/Admin/index.html +161 -0
- package/coverage/client/components/Canvas/AlignmentTools.tsx.html +694 -0
- package/coverage/client/components/Canvas/Canvas.tsx.html +1513 -0
- package/coverage/client/components/Canvas/DataPreviewBadge.tsx.html +307 -0
- package/coverage/client/components/Canvas/ExecutionInputDialog.tsx.html +769 -0
- package/coverage/client/components/Canvas/ExecutionOverlay.tsx.html +2938 -0
- package/coverage/client/components/Canvas/ForEachNode.tsx.html +568 -0
- package/coverage/client/components/Canvas/GroupNode.tsx.html +421 -0
- package/coverage/client/components/Canvas/IfElseNode.tsx.html +508 -0
- package/coverage/client/components/Canvas/InlineEditor.tsx.html +472 -0
- package/coverage/client/components/Canvas/NodeContextMenu.tsx.html +661 -0
- package/coverage/client/components/Canvas/NodeTooltip.tsx.html +316 -0
- package/coverage/client/components/Canvas/OutputNode.tsx.html +418 -0
- package/coverage/client/components/Canvas/ParallelNode.tsx.html +556 -0
- package/coverage/client/components/Canvas/StepNode.tsx.html +463 -0
- package/coverage/client/components/Canvas/StickyNoteNode.tsx.html +442 -0
- package/coverage/client/components/Canvas/SubWorkflowNode.tsx.html +508 -0
- package/coverage/client/components/Canvas/SwitchNode.tsx.html +640 -0
- package/coverage/client/components/Canvas/Toolbar.tsx.html +1030 -0
- package/coverage/client/components/Canvas/TransformNode.tsx.html +667 -0
- package/coverage/client/components/Canvas/TriggerNode.tsx.html +469 -0
- package/coverage/client/components/Canvas/TryCatchNode.tsx.html +577 -0
- package/coverage/client/components/Canvas/WhileNode.tsx.html +595 -0
- package/coverage/client/components/Canvas/index.html +446 -0
- package/coverage/client/components/Canvas/index.ts.html +157 -0
- package/coverage/client/components/Collaboration/ActivityFeed.tsx.html +253 -0
- package/coverage/client/components/Collaboration/CommentThread.tsx.html +397 -0
- package/coverage/client/components/Collaboration/LockIndicator.tsx.html +172 -0
- package/coverage/client/components/Collaboration/PresenceIndicator.tsx.html +214 -0
- package/coverage/client/components/Collaboration/index.html +161 -0
- package/coverage/client/components/CommandPalette/CommandItem.tsx.html +313 -0
- package/coverage/client/components/CommandPalette/CommandPalette.tsx.html +685 -0
- package/coverage/client/components/CommandPalette/index.html +131 -0
- package/coverage/client/components/Debug/VariableInspector.tsx.html +529 -0
- package/coverage/client/components/Debug/index.html +116 -0
- package/coverage/client/components/Editor/InputsEditor.tsx.html +1459 -0
- package/coverage/client/components/Editor/NewStepWizard.tsx.html +1117 -0
- package/coverage/client/components/Editor/StepEditor.tsx.html +1681 -0
- package/coverage/client/components/Editor/YamlEditor.tsx.html +565 -0
- package/coverage/client/components/Editor/index.html +161 -0
- package/coverage/client/components/Execution/TimelineView.tsx.html +397 -0
- package/coverage/client/components/Execution/index.html +116 -0
- package/coverage/client/components/Onboarding/OnboardingTour.tsx.html +265 -0
- package/coverage/client/components/Onboarding/index.html +116 -0
- package/coverage/client/components/Panels/PropertiesPanel.tsx.html +2035 -0
- package/coverage/client/components/Panels/ValidationPanel.tsx.html +856 -0
- package/coverage/client/components/Panels/index.html +131 -0
- package/coverage/client/components/Prompt/ChangePreview.tsx.html +928 -0
- package/coverage/client/components/Prompt/PromptHistoryPanel.tsx.html +712 -0
- package/coverage/client/components/Prompt/PromptInput.tsx.html +415 -0
- package/coverage/client/components/Prompt/index.html +146 -0
- package/coverage/client/components/Settings/ProviderSwitcher.tsx.html +1306 -0
- package/coverage/client/components/Settings/SettingsPanel.tsx.html +355 -0
- package/coverage/client/components/Settings/controls/SettingNumber.tsx.html +211 -0
- package/coverage/client/components/Settings/controls/SettingSelect.tsx.html +196 -0
- package/coverage/client/components/Settings/controls/SettingToggle.tsx.html +199 -0
- package/coverage/client/components/Settings/controls/index.html +146 -0
- package/coverage/client/components/Settings/index.html +131 -0
- package/coverage/client/components/Settings/sections/AISettings.tsx.html +154 -0
- package/coverage/client/components/Settings/sections/CanvasSettings.tsx.html +220 -0
- package/coverage/client/components/Settings/sections/EditorSettings.tsx.html +208 -0
- package/coverage/client/components/Settings/sections/ExecutionSettings.tsx.html +172 -0
- package/coverage/client/components/Settings/sections/GeneralSettings.tsx.html +151 -0
- package/coverage/client/components/Settings/sections/NotificationSettings.tsx.html +190 -0
- package/coverage/client/components/Settings/sections/index.html +191 -0
- package/coverage/client/components/Sidebar/ImportDialog.tsx.html +856 -0
- package/coverage/client/components/Sidebar/NewWorkflowDialog.tsx.html +694 -0
- package/coverage/client/components/Sidebar/Sidebar.tsx.html +1456 -0
- package/coverage/client/components/Sidebar/index.html +146 -0
- package/coverage/client/components/Templates/TemplateCard.tsx.html +181 -0
- package/coverage/client/components/Templates/TemplateGallery.tsx.html +307 -0
- package/coverage/client/components/Templates/index.html +131 -0
- package/coverage/client/components/Versions/DiffViewer.tsx.html +220 -0
- package/coverage/client/components/Versions/VersionHistory.tsx.html +352 -0
- package/coverage/client/components/Versions/index.html +131 -0
- package/coverage/client/components/common/Breadcrumb.tsx.html +205 -0
- package/coverage/client/components/common/Button.tsx.html +289 -0
- package/coverage/client/components/common/ContextMenu.tsx.html +691 -0
- package/coverage/client/components/common/KeyboardShortcuts.tsx.html +541 -0
- package/coverage/client/components/common/Modal.tsx.html +364 -0
- package/coverage/client/components/common/Tabs.tsx.html +256 -0
- package/coverage/client/components/common/ThemeToggle.tsx.html +301 -0
- package/coverage/client/components/common/index.html +206 -0
- package/coverage/client/components/index.html +116 -0
- package/coverage/client/components/index.ts.html +181 -0
- package/coverage/client/hooks/index.html +176 -0
- package/coverage/client/hooks/index.ts.html +97 -0
- package/coverage/client/hooks/useAIPrompt.ts.html +409 -0
- package/coverage/client/hooks/useCanvas.ts.html +739 -0
- package/coverage/client/hooks/useWebSocket.ts.html +580 -0
- package/coverage/client/hooks/useWorkflow.ts.html +502 -0
- package/coverage/client/index.html +131 -0
- package/coverage/client/main.tsx.html +115 -0
- package/coverage/client/stores/agentStore.ts.html +421 -0
- package/coverage/client/stores/canvasStore.ts.html +1129 -0
- package/coverage/client/stores/collaborationStore.ts.html +544 -0
- package/coverage/client/stores/commandStore.ts.html +610 -0
- package/coverage/client/stores/editorStore.ts.html +484 -0
- package/coverage/client/stores/executionStore.ts.html +1594 -0
- package/coverage/client/stores/governanceStore.ts.html +493 -0
- package/coverage/client/stores/index.html +341 -0
- package/coverage/client/stores/index.ts.html +112 -0
- package/coverage/client/stores/layoutStore.ts.html +439 -0
- package/coverage/client/stores/navigationStore.ts.html +232 -0
- package/coverage/client/stores/onboardingStore.ts.html +247 -0
- package/coverage/client/stores/promptStore.ts.html +430 -0
- package/coverage/client/stores/settingsStore.ts.html +472 -0
- package/coverage/client/stores/themeStore.ts.html +271 -0
- package/coverage/client/stores/versionStore.ts.html +340 -0
- package/coverage/client/stores/workflowStore.ts.html +739 -0
- package/coverage/client/utils/applyDagreLayout.ts.html +286 -0
- package/coverage/client/utils/cn.ts.html +112 -0
- package/coverage/client/utils/index.html +206 -0
- package/coverage/client/utils/index.ts.html +97 -0
- package/coverage/client/utils/platform.ts.html +223 -0
- package/coverage/client/utils/serviceIcons.tsx.html +376 -0
- package/coverage/client/utils/stepValidation.ts.html +550 -0
- package/coverage/client/utils/workflowToGraph.ts.html +1624 -0
- package/coverage/coverage-final.json +107 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +461 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/shared/constants.ts.html +655 -0
- package/coverage/shared/index.html +146 -0
- package/coverage/shared/settings.ts.html +406 -0
- package/coverage/shared/types.ts.html +622 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/dist/client/assets/{index-DQeR1ew6.css → index-DipWdkNl.css} +1 -1
- package/dist/client/assets/{index-LbIVPHbD.js → index-DtX_BPDj.js} +20 -20
- package/dist/client/assets/{index-LbIVPHbD.js.map → index-DtX_BPDj.js.map} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/server/routes/form.js +27 -1
- package/dist/server/routes/form.js.map +1 -1
- package/dist/server/services/AIService.js +16 -6
- package/dist/server/services/AIService.js.map +1 -1
- package/dist/server/services/agents/{claude-code-provider.js → claude-agent-provider.js} +11 -11
- package/dist/server/services/agents/claude-agent-provider.js.map +1 -0
- package/dist/server/services/agents/claude-provider.js +4 -5
- package/dist/server/services/agents/claude-provider.js.map +1 -1
- package/dist/server/services/agents/codex-provider.js +5 -6
- package/dist/server/services/agents/codex-provider.js.map +1 -1
- package/dist/server/services/agents/copilot-provider.js +35 -8
- package/dist/server/services/agents/copilot-provider.js.map +1 -1
- package/dist/server/services/agents/openai-provider.js +244 -0
- package/dist/server/services/agents/openai-provider.js.map +1 -0
- package/dist/server/services/agents/opencode-provider.js +258 -0
- package/dist/server/services/agents/opencode-provider.js.map +1 -0
- package/dist/server/services/agents/registry.js +17 -22
- package/dist/server/services/agents/registry.js.map +1 -1
- package/index.html +1 -1
- package/package.json +3 -3
- package/dist/server/services/agents/claude-code-provider.js.map +0 -1
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Provider for GUI
|
|
3
|
+
* Supports OpenAI API, VLLM, and any OpenAI-compatible endpoint
|
|
4
|
+
*/
|
|
5
|
+
import { buildPrompt, generateSuggestions } from './prompts.js';
|
|
6
|
+
export class OpenAIProvider {
|
|
7
|
+
id = 'openai';
|
|
8
|
+
name = 'OpenAI';
|
|
9
|
+
capabilities = {
|
|
10
|
+
streaming: true,
|
|
11
|
+
toolUse: true,
|
|
12
|
+
codeExecution: false,
|
|
13
|
+
systemPrompts: true,
|
|
14
|
+
models: ['gpt-4.5', 'gpt-4.1', 'gpt-4.1-mini', 'gpt-4o', 'o3'],
|
|
15
|
+
};
|
|
16
|
+
apiKey = '';
|
|
17
|
+
baseUrl = 'https://api.openai.com/v1';
|
|
18
|
+
model = 'gpt-4.5';
|
|
19
|
+
ready = false;
|
|
20
|
+
error;
|
|
21
|
+
async initialize(config) {
|
|
22
|
+
try {
|
|
23
|
+
// Get API key from config or environment
|
|
24
|
+
this.apiKey = config.apiKey || process.env.OPENAI_API_KEY || '';
|
|
25
|
+
// For VLLM/local endpoints, use dummy key
|
|
26
|
+
if (config.baseUrl && !this.apiKey) {
|
|
27
|
+
this.apiKey = 'dummy-key';
|
|
28
|
+
}
|
|
29
|
+
if (!this.apiKey) {
|
|
30
|
+
this.ready = false;
|
|
31
|
+
this.error = 'OPENAI_API_KEY not set. Set environment variable or provide in config.';
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Configure base URL (for VLLM or other OpenAI-compatible endpoints)
|
|
35
|
+
if (config.baseUrl) {
|
|
36
|
+
this.baseUrl = config.baseUrl;
|
|
37
|
+
}
|
|
38
|
+
// Configure model
|
|
39
|
+
if (config.model) {
|
|
40
|
+
this.model = config.model;
|
|
41
|
+
}
|
|
42
|
+
// Test the connection
|
|
43
|
+
try {
|
|
44
|
+
await this.testConnection();
|
|
45
|
+
this.ready = true;
|
|
46
|
+
this.error = undefined;
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
this.ready = false;
|
|
50
|
+
this.error = err instanceof Error ? err.message : 'Failed to connect to OpenAI API';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
this.ready = false;
|
|
55
|
+
this.error = err instanceof Error ? err.message : 'Unknown error initializing OpenAI';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async testConnection() {
|
|
59
|
+
const response = await fetch(`${this.baseUrl}/models`, {
|
|
60
|
+
headers: {
|
|
61
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
throw new Error(`API test failed: ${response.statusText}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
isReady() {
|
|
69
|
+
return this.ready;
|
|
70
|
+
}
|
|
71
|
+
getStatus() {
|
|
72
|
+
return {
|
|
73
|
+
ready: this.ready,
|
|
74
|
+
model: this.model,
|
|
75
|
+
error: this.error,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async processPrompt(prompt, workflow, context) {
|
|
79
|
+
if (!this.ready) {
|
|
80
|
+
return {
|
|
81
|
+
explanation: 'OpenAI provider not available.',
|
|
82
|
+
error: this.error || 'Provider not initialized',
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const { systemPrompt, userPrompt } = buildPrompt(prompt, workflow, context);
|
|
87
|
+
const messages = [
|
|
88
|
+
{ role: 'system', content: systemPrompt },
|
|
89
|
+
{ role: 'user', content: userPrompt },
|
|
90
|
+
];
|
|
91
|
+
const response = await this.callOpenAI(messages);
|
|
92
|
+
const responseText = response.choices[0]?.message?.content || '';
|
|
93
|
+
return await this.parseAIResponse(responseText, workflow);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
return {
|
|
97
|
+
explanation: '',
|
|
98
|
+
error: err instanceof Error ? err.message : 'Unknown error',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async callOpenAI(messages) {
|
|
103
|
+
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
104
|
+
method: 'POST',
|
|
105
|
+
headers: {
|
|
106
|
+
'Content-Type': 'application/json',
|
|
107
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
108
|
+
},
|
|
109
|
+
body: JSON.stringify({
|
|
110
|
+
model: this.model,
|
|
111
|
+
messages,
|
|
112
|
+
temperature: 0.7,
|
|
113
|
+
max_tokens: 4000,
|
|
114
|
+
}),
|
|
115
|
+
});
|
|
116
|
+
if (!response.ok) {
|
|
117
|
+
const errorText = await response.text();
|
|
118
|
+
throw new Error(`OpenAI API error: ${response.statusText} - ${errorText}`);
|
|
119
|
+
}
|
|
120
|
+
return response.json();
|
|
121
|
+
}
|
|
122
|
+
async streamPrompt(prompt, workflow, onChunk, context) {
|
|
123
|
+
if (!this.ready) {
|
|
124
|
+
return this.processPrompt(prompt, workflow, context);
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
const { systemPrompt, userPrompt } = buildPrompt(prompt, workflow, context);
|
|
128
|
+
const messages = [
|
|
129
|
+
{ role: 'system', content: systemPrompt },
|
|
130
|
+
{ role: 'user', content: userPrompt },
|
|
131
|
+
];
|
|
132
|
+
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
133
|
+
method: 'POST',
|
|
134
|
+
headers: {
|
|
135
|
+
'Content-Type': 'application/json',
|
|
136
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
137
|
+
},
|
|
138
|
+
body: JSON.stringify({
|
|
139
|
+
model: this.model,
|
|
140
|
+
messages,
|
|
141
|
+
temperature: 0.7,
|
|
142
|
+
max_tokens: 4000,
|
|
143
|
+
stream: true,
|
|
144
|
+
}),
|
|
145
|
+
});
|
|
146
|
+
if (!response.ok) {
|
|
147
|
+
throw new Error(`OpenAI API error: ${response.statusText}`);
|
|
148
|
+
}
|
|
149
|
+
let fullResponse = '';
|
|
150
|
+
const reader = response.body?.getReader();
|
|
151
|
+
const decoder = new TextDecoder();
|
|
152
|
+
if (!reader) {
|
|
153
|
+
throw new Error('No response body');
|
|
154
|
+
}
|
|
155
|
+
while (true) {
|
|
156
|
+
const { done, value } = await reader.read();
|
|
157
|
+
if (done)
|
|
158
|
+
break;
|
|
159
|
+
const chunk = decoder.decode(value);
|
|
160
|
+
const lines = chunk.split('\n').filter((line) => line.trim() !== '');
|
|
161
|
+
for (const line of lines) {
|
|
162
|
+
if (line.startsWith('data: ')) {
|
|
163
|
+
const data = line.slice(6);
|
|
164
|
+
if (data === '[DONE]')
|
|
165
|
+
continue;
|
|
166
|
+
try {
|
|
167
|
+
const parsed = JSON.parse(data);
|
|
168
|
+
const content = parsed.choices[0]?.delta?.content;
|
|
169
|
+
if (content) {
|
|
170
|
+
fullResponse += content;
|
|
171
|
+
onChunk(content);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// Skip invalid JSON
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return await this.parseAIResponse(fullResponse, workflow);
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
return {
|
|
184
|
+
explanation: '',
|
|
185
|
+
error: err instanceof Error ? err.message : 'Unknown error',
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async getSuggestions(workflow, selectedStepId) {
|
|
190
|
+
return generateSuggestions(workflow, selectedStepId);
|
|
191
|
+
}
|
|
192
|
+
async cancel() {
|
|
193
|
+
// OpenAI doesn't provide a cancel mechanism via API
|
|
194
|
+
// The request will be aborted by closing the connection
|
|
195
|
+
}
|
|
196
|
+
async parseAIResponse(responseText, originalWorkflow) {
|
|
197
|
+
const yamlMatch = responseText.match(/```yaml\n([\s\S]*?)\n```/);
|
|
198
|
+
let modifiedWorkflow;
|
|
199
|
+
let explanation = responseText;
|
|
200
|
+
if (yamlMatch) {
|
|
201
|
+
try {
|
|
202
|
+
const { parse } = await import('yaml');
|
|
203
|
+
const parsedYaml = parse(yamlMatch[1]);
|
|
204
|
+
if (parsedYaml && (parsedYaml.steps || parsedYaml.metadata)) {
|
|
205
|
+
modifiedWorkflow = parsedYaml;
|
|
206
|
+
const explanationMatch = responseText.match(/^([\s\S]*?)```yaml/);
|
|
207
|
+
if (explanationMatch) {
|
|
208
|
+
explanation = explanationMatch[1].trim();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// Failed to parse YAML
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
let diff;
|
|
217
|
+
if (modifiedWorkflow) {
|
|
218
|
+
diff = this.generateDiff(originalWorkflow, modifiedWorkflow);
|
|
219
|
+
}
|
|
220
|
+
return { explanation, workflow: modifiedWorkflow, diff };
|
|
221
|
+
}
|
|
222
|
+
generateDiff(original, modified) {
|
|
223
|
+
const originalStepIds = new Set(original.steps?.map((s) => s.id) || []);
|
|
224
|
+
const modifiedStepIds = new Set(modified.steps?.map((s) => s.id) || []);
|
|
225
|
+
const added = modified.steps?.filter((s) => !originalStepIds.has(s.id)) || [];
|
|
226
|
+
const removed = original.steps?.filter((s) => !modifiedStepIds.has(s.id)) || [];
|
|
227
|
+
let diff = '';
|
|
228
|
+
if (added.length > 0) {
|
|
229
|
+
diff += `+ Added ${added.length} step(s): ${added.map((s) => s.name || s.id).join(', ')}\n`;
|
|
230
|
+
}
|
|
231
|
+
if (removed.length > 0) {
|
|
232
|
+
diff += `- Removed ${removed.length} step(s): ${removed.map((s) => s.name || s.id).join(', ')}\n`;
|
|
233
|
+
}
|
|
234
|
+
return diff || 'No structural changes detected';
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
export function createOpenAIProvider(config) {
|
|
238
|
+
const provider = new OpenAIProvider();
|
|
239
|
+
if (config) {
|
|
240
|
+
provider.initialize(config);
|
|
241
|
+
}
|
|
242
|
+
return provider;
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=openai-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/openai-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Provider for GUI
|
|
3
|
+
* Supports OpenCode in both CLI and server modes
|
|
4
|
+
*
|
|
5
|
+
* Configuration:
|
|
6
|
+
* - CLI mode: Uses local opencode CLI (must be installed)
|
|
7
|
+
* - Server mode: Connects to opencode server
|
|
8
|
+
* - Default server: http://localhost:4096
|
|
9
|
+
* - Configure via baseUrl option in GUI
|
|
10
|
+
* - Start server with: opencode serve --port 4096
|
|
11
|
+
*/
|
|
12
|
+
import { buildPrompt, generateSuggestions } from './prompts.js';
|
|
13
|
+
export class OpenCodeProvider {
|
|
14
|
+
static DEFAULT_PORT = 4096;
|
|
15
|
+
static DEFAULT_SERVER_URL = `http://localhost:${OpenCodeProvider.DEFAULT_PORT}`;
|
|
16
|
+
id = 'opencode';
|
|
17
|
+
name = 'OpenCode';
|
|
18
|
+
capabilities = {
|
|
19
|
+
streaming: true,
|
|
20
|
+
toolUse: true,
|
|
21
|
+
codeExecution: true,
|
|
22
|
+
systemPrompts: true,
|
|
23
|
+
models: [], // OpenCode supports many models via different backends
|
|
24
|
+
};
|
|
25
|
+
mode = 'cli';
|
|
26
|
+
serverUrl = OpenCodeProvider.DEFAULT_SERVER_URL;
|
|
27
|
+
ready = false;
|
|
28
|
+
error;
|
|
29
|
+
model;
|
|
30
|
+
async initialize(config) {
|
|
31
|
+
try {
|
|
32
|
+
// Determine mode (server or CLI)
|
|
33
|
+
if (config.options?.mode === 'server' || config.baseUrl) {
|
|
34
|
+
this.mode = 'server';
|
|
35
|
+
if (config.baseUrl) {
|
|
36
|
+
this.serverUrl = config.baseUrl;
|
|
37
|
+
}
|
|
38
|
+
else if (config.options?.port) {
|
|
39
|
+
// Support direct port configuration
|
|
40
|
+
const port = config.options.port;
|
|
41
|
+
this.serverUrl = `http://localhost:${port}`;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Set model if provided
|
|
45
|
+
if (config.model) {
|
|
46
|
+
this.model = config.model;
|
|
47
|
+
}
|
|
48
|
+
// Test availability
|
|
49
|
+
if (this.mode === 'server') {
|
|
50
|
+
await this.testServerConnection();
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
await this.testCLI();
|
|
54
|
+
}
|
|
55
|
+
this.ready = true;
|
|
56
|
+
this.error = undefined;
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
this.ready = false;
|
|
60
|
+
this.error = err instanceof Error ? err.message : 'Unknown error initializing OpenCode';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async testServerConnection() {
|
|
64
|
+
try {
|
|
65
|
+
const response = await fetch(`${this.serverUrl}/health`).catch(() => null);
|
|
66
|
+
if (!response || !response.ok) {
|
|
67
|
+
throw new Error(`OpenCode server not responding at ${this.serverUrl}. Start with: opencode serve --port 4096`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
throw new Error(`OpenCode server not available. Start with: opencode serve --port 4096`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async testCLI() {
|
|
75
|
+
// Check if opencode CLI is available
|
|
76
|
+
const { spawn } = await import('node:child_process');
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
const process = spawn('which', ['opencode']);
|
|
79
|
+
process.on('close', (code) => {
|
|
80
|
+
if (code === 0) {
|
|
81
|
+
resolve();
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
reject(new Error('OpenCode CLI not found. Install from: https://opencode.ai'));
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
process.on('error', () => {
|
|
88
|
+
reject(new Error('OpenCode CLI not found. Install from: https://opencode.ai'));
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
isReady() {
|
|
93
|
+
return this.ready;
|
|
94
|
+
}
|
|
95
|
+
getStatus() {
|
|
96
|
+
const status = {
|
|
97
|
+
ready: this.ready,
|
|
98
|
+
error: this.error,
|
|
99
|
+
};
|
|
100
|
+
// Show current configuration
|
|
101
|
+
if (this.mode === 'server') {
|
|
102
|
+
status.model = `Server: ${this.serverUrl}${this.model ? ` (${this.model})` : ''}`;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
status.model = this.model || 'CLI mode';
|
|
106
|
+
}
|
|
107
|
+
return status;
|
|
108
|
+
}
|
|
109
|
+
async processPrompt(prompt, workflow, context) {
|
|
110
|
+
if (!this.ready) {
|
|
111
|
+
return {
|
|
112
|
+
explanation: 'OpenCode not available.',
|
|
113
|
+
error: this.error || 'Provider not initialized',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const { systemPrompt, userPrompt } = buildPrompt(prompt, workflow, context);
|
|
118
|
+
const fullPrompt = `${systemPrompt}\n\n---\n\nUser request: ${userPrompt}`;
|
|
119
|
+
let responseText;
|
|
120
|
+
if (this.mode === 'server') {
|
|
121
|
+
responseText = await this.callServer(fullPrompt);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
responseText = await this.callCLI(fullPrompt);
|
|
125
|
+
}
|
|
126
|
+
return await this.parseAIResponse(responseText, workflow);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
return {
|
|
130
|
+
explanation: '',
|
|
131
|
+
error: err instanceof Error ? err.message : 'Unknown error',
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async callServer(prompt) {
|
|
136
|
+
// Create session if needed, then send prompt
|
|
137
|
+
const sessionResponse = await fetch(`${this.serverUrl}/api/session`, {
|
|
138
|
+
method: 'POST',
|
|
139
|
+
headers: { 'Content-Type': 'application/json' },
|
|
140
|
+
body: JSON.stringify({}),
|
|
141
|
+
});
|
|
142
|
+
if (!sessionResponse.ok) {
|
|
143
|
+
throw new Error('Failed to create OpenCode session');
|
|
144
|
+
}
|
|
145
|
+
const sessionData = (await sessionResponse.json());
|
|
146
|
+
const sessionId = sessionData.id;
|
|
147
|
+
// Send prompt to session
|
|
148
|
+
const promptResponse = await fetch(`${this.serverUrl}/api/session/${sessionId}/prompt`, {
|
|
149
|
+
method: 'POST',
|
|
150
|
+
headers: { 'Content-Type': 'application/json' },
|
|
151
|
+
body: JSON.stringify({
|
|
152
|
+
parts: [{ type: 'text', text: prompt }],
|
|
153
|
+
model: this.model,
|
|
154
|
+
}),
|
|
155
|
+
});
|
|
156
|
+
if (!promptResponse.ok) {
|
|
157
|
+
throw new Error('OpenCode server error');
|
|
158
|
+
}
|
|
159
|
+
const result = (await promptResponse.json());
|
|
160
|
+
// Extract text from response parts
|
|
161
|
+
if (result.parts) {
|
|
162
|
+
return result.parts
|
|
163
|
+
.filter((p) => p.type === 'text')
|
|
164
|
+
.map((p) => p.text || '')
|
|
165
|
+
.join('\n');
|
|
166
|
+
}
|
|
167
|
+
return result.message || '';
|
|
168
|
+
}
|
|
169
|
+
async callCLI(prompt) {
|
|
170
|
+
const { spawn } = await import('node:child_process');
|
|
171
|
+
return new Promise((resolve, reject) => {
|
|
172
|
+
const args = ['run'];
|
|
173
|
+
if (this.model) {
|
|
174
|
+
args.push('--model', this.model);
|
|
175
|
+
}
|
|
176
|
+
args.push(prompt);
|
|
177
|
+
const process = spawn('opencode', args);
|
|
178
|
+
let output = '';
|
|
179
|
+
let errorOutput = '';
|
|
180
|
+
process.stdout.on('data', (data) => {
|
|
181
|
+
output += data.toString();
|
|
182
|
+
});
|
|
183
|
+
process.stderr.on('data', (data) => {
|
|
184
|
+
errorOutput += data.toString();
|
|
185
|
+
});
|
|
186
|
+
process.on('close', (code) => {
|
|
187
|
+
if (code === 0) {
|
|
188
|
+
resolve(output);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
reject(new Error(`OpenCode CLI failed: ${errorOutput || output}`));
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
process.on('error', (err) => {
|
|
195
|
+
reject(new Error(`Failed to run OpenCode CLI: ${err.message}`));
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
async streamPrompt(prompt, workflow, _onChunk, context) {
|
|
200
|
+
// For now, fall back to non-streaming for GUI
|
|
201
|
+
// Server mode streaming would require SSE implementation
|
|
202
|
+
return this.processPrompt(prompt, workflow, context);
|
|
203
|
+
}
|
|
204
|
+
async getSuggestions(workflow, selectedStepId) {
|
|
205
|
+
return generateSuggestions(workflow, selectedStepId);
|
|
206
|
+
}
|
|
207
|
+
async cancel() {
|
|
208
|
+
// Would need to implement session cancellation for server mode
|
|
209
|
+
}
|
|
210
|
+
async parseAIResponse(responseText, originalWorkflow) {
|
|
211
|
+
const yamlMatch = responseText.match(/```yaml\n([\s\S]*?)\n```/);
|
|
212
|
+
let modifiedWorkflow;
|
|
213
|
+
let explanation = responseText;
|
|
214
|
+
if (yamlMatch) {
|
|
215
|
+
try {
|
|
216
|
+
const { parse } = await import('yaml');
|
|
217
|
+
const parsedYaml = parse(yamlMatch[1]);
|
|
218
|
+
if (parsedYaml && (parsedYaml.steps || parsedYaml.metadata)) {
|
|
219
|
+
modifiedWorkflow = parsedYaml;
|
|
220
|
+
const explanationMatch = responseText.match(/^([\s\S]*?)```yaml/);
|
|
221
|
+
if (explanationMatch) {
|
|
222
|
+
explanation = explanationMatch[1].trim();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Failed to parse YAML
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
let diff;
|
|
231
|
+
if (modifiedWorkflow) {
|
|
232
|
+
diff = this.generateDiff(originalWorkflow, modifiedWorkflow);
|
|
233
|
+
}
|
|
234
|
+
return { explanation, workflow: modifiedWorkflow, diff };
|
|
235
|
+
}
|
|
236
|
+
generateDiff(original, modified) {
|
|
237
|
+
const originalStepIds = new Set(original.steps?.map((s) => s.id) || []);
|
|
238
|
+
const modifiedStepIds = new Set(modified.steps?.map((s) => s.id) || []);
|
|
239
|
+
const added = modified.steps?.filter((s) => !originalStepIds.has(s.id)) || [];
|
|
240
|
+
const removed = original.steps?.filter((s) => !modifiedStepIds.has(s.id)) || [];
|
|
241
|
+
let diff = '';
|
|
242
|
+
if (added.length > 0) {
|
|
243
|
+
diff += `+ Added ${added.length} step(s): ${added.map((s) => s.name || s.id).join(', ')}\n`;
|
|
244
|
+
}
|
|
245
|
+
if (removed.length > 0) {
|
|
246
|
+
diff += `- Removed ${removed.length} step(s): ${removed.map((s) => s.name || s.id).join(', ')}\n`;
|
|
247
|
+
}
|
|
248
|
+
return diff || 'No structural changes detected';
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
export function createOpenCodeProvider(config) {
|
|
252
|
+
const provider = new OpenCodeProvider();
|
|
253
|
+
if (config) {
|
|
254
|
+
provider.initialize(config);
|
|
255
|
+
}
|
|
256
|
+
return provider;
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=opencode-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-provider.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/opencode-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
* Agent Provider Registry
|
|
3
3
|
* Manages all available AI agent providers and provides a unified interface
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
6
|
-
import { createClaudeCodeProvider } from './claude-code-provider.js';
|
|
5
|
+
import { createClaudeAgentProvider } from './claude-agent-provider.js';
|
|
7
6
|
import { createCopilotProvider } from './copilot-provider.js';
|
|
8
7
|
import { createCodexProvider } from './codex-provider.js';
|
|
9
8
|
import { createDemoProvider } from './demo-provider.js';
|
|
10
9
|
import { createOllamaProvider } from './ollama-provider.js';
|
|
10
|
+
import { createOpenAIProvider } from './openai-provider.js';
|
|
11
|
+
import { createOpenCodeProvider } from './opencode-provider.js';
|
|
11
12
|
/**
|
|
12
13
|
* Registry of all available agent providers
|
|
13
14
|
*/
|
|
@@ -19,9 +20,9 @@ export class AgentRegistry {
|
|
|
19
20
|
// Register built-in providers
|
|
20
21
|
// SDK-based providers with automatic CLI authentication (recommended)
|
|
21
22
|
this.registerProvider({
|
|
22
|
-
id: 'claude-
|
|
23
|
-
name: 'Claude
|
|
24
|
-
factory:
|
|
23
|
+
id: 'claude-agent',
|
|
24
|
+
name: 'Claude Agent (SDK)',
|
|
25
|
+
factory: createClaudeAgentProvider,
|
|
25
26
|
});
|
|
26
27
|
this.registerProvider({
|
|
27
28
|
id: 'copilot',
|
|
@@ -33,11 +34,16 @@ export class AgentRegistry {
|
|
|
33
34
|
name: 'OpenAI Codex (SDK)',
|
|
34
35
|
factory: createCodexProvider,
|
|
35
36
|
});
|
|
37
|
+
this.registerProvider({
|
|
38
|
+
id: 'opencode',
|
|
39
|
+
name: 'OpenCode',
|
|
40
|
+
factory: createOpenCodeProvider,
|
|
41
|
+
});
|
|
36
42
|
// API key-based providers
|
|
37
43
|
this.registerProvider({
|
|
38
|
-
id: '
|
|
39
|
-
name: '
|
|
40
|
-
factory:
|
|
44
|
+
id: 'openai',
|
|
45
|
+
name: 'OpenAI',
|
|
46
|
+
factory: createOpenAIProvider,
|
|
41
47
|
});
|
|
42
48
|
// Local providers
|
|
43
49
|
this.registerProvider({
|
|
@@ -110,7 +116,7 @@ export class AgentRegistry {
|
|
|
110
116
|
*/
|
|
111
117
|
async autoDetectProvider() {
|
|
112
118
|
// Try Claude Code SDK first (uses automatic CLI authentication)
|
|
113
|
-
const claudeCodeProvider = this.providers.get('claude-
|
|
119
|
+
const claudeCodeProvider = this.providers.get('claude-agent');
|
|
114
120
|
if (claudeCodeProvider) {
|
|
115
121
|
await claudeCodeProvider.initialize({
|
|
116
122
|
options: {
|
|
@@ -118,8 +124,8 @@ export class AgentRegistry {
|
|
|
118
124
|
},
|
|
119
125
|
});
|
|
120
126
|
if (claudeCodeProvider.isReady()) {
|
|
121
|
-
this.activeProviderId = 'claude-
|
|
122
|
-
return 'claude-
|
|
127
|
+
this.activeProviderId = 'claude-agent';
|
|
128
|
+
return 'claude-agent';
|
|
123
129
|
}
|
|
124
130
|
}
|
|
125
131
|
// Try GitHub Copilot SDK (uses automatic CLI authentication)
|
|
@@ -150,17 +156,6 @@ export class AgentRegistry {
|
|
|
150
156
|
return 'codex';
|
|
151
157
|
}
|
|
152
158
|
}
|
|
153
|
-
// Try Claude with API key (requires ANTHROPIC_API_KEY)
|
|
154
|
-
const claudeProvider = this.providers.get('claude');
|
|
155
|
-
if (claudeProvider) {
|
|
156
|
-
await claudeProvider.initialize({
|
|
157
|
-
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
158
|
-
});
|
|
159
|
-
if (claudeProvider.isReady()) {
|
|
160
|
-
this.activeProviderId = 'claude';
|
|
161
|
-
return 'claude';
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
159
|
// Try Ollama (if running locally)
|
|
165
160
|
const ollamaProvider = this.providers.get('ollama');
|
|
166
161
|
if (ollamaProvider) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/registry.ts"],"names":[],"mappings":"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"}
|
package/index.html
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<html lang="en" class="dark">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
|
-
<link rel="icon" type="image/
|
|
5
|
+
<link rel="icon" type="image/png" href="/marktoflow-logo.png" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>Marktoflow Designer</title>
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|