@marktoflow/gui 2.0.0-alpha.1
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/.turbo/turbo-build.log +26 -0
- package/.turbo/turbo-test.log +22 -0
- package/README.md +179 -0
- package/dist/client/assets/index-DwTI8opO.js +608 -0
- package/dist/client/assets/index-DwTI8opO.js.map +1 -0
- package/dist/client/assets/index-RoEdL6gO.css +1 -0
- package/dist/client/index.html +20 -0
- package/dist/client/vite.svg +9 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +56 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/ai.js +50 -0
- package/dist/server/routes/ai.js.map +1 -0
- package/dist/server/routes/execute.js +62 -0
- package/dist/server/routes/execute.js.map +1 -0
- package/dist/server/routes/workflows.js +99 -0
- package/dist/server/routes/workflows.js.map +1 -0
- package/dist/server/server/index.js +95 -0
- package/dist/server/server/index.js.map +1 -0
- package/dist/server/server/routes/ai.js +87 -0
- package/dist/server/server/routes/ai.js.map +1 -0
- package/dist/server/server/routes/execute.js +63 -0
- package/dist/server/server/routes/execute.js.map +1 -0
- package/dist/server/server/routes/tools.js +518 -0
- package/dist/server/server/routes/tools.js.map +1 -0
- package/dist/server/server/routes/workflows.js +99 -0
- package/dist/server/server/routes/workflows.js.map +1 -0
- package/dist/server/server/services/AIService.js +69 -0
- package/dist/server/server/services/AIService.js.map +1 -0
- package/dist/server/server/services/FileWatcher.js +60 -0
- package/dist/server/server/services/FileWatcher.js.map +1 -0
- package/dist/server/server/services/WorkflowService.js +363 -0
- package/dist/server/server/services/WorkflowService.js.map +1 -0
- package/dist/server/server/services/agents/claude-code-provider.js +250 -0
- package/dist/server/server/services/agents/claude-code-provider.js.map +1 -0
- package/dist/server/server/services/agents/claude-provider.js +204 -0
- package/dist/server/server/services/agents/claude-provider.js.map +1 -0
- package/dist/server/server/services/agents/copilot-provider.js +227 -0
- package/dist/server/server/services/agents/copilot-provider.js.map +1 -0
- package/dist/server/server/services/agents/demo-provider.js +167 -0
- package/dist/server/server/services/agents/demo-provider.js.map +1 -0
- package/dist/server/server/services/agents/index.js +31 -0
- package/dist/server/server/services/agents/index.js.map +1 -0
- package/dist/server/server/services/agents/ollama-provider.js +220 -0
- package/dist/server/server/services/agents/ollama-provider.js.map +1 -0
- package/dist/server/server/services/agents/prompts.js +436 -0
- package/dist/server/server/services/agents/prompts.js.map +1 -0
- package/dist/server/server/services/agents/registry.js +242 -0
- package/dist/server/server/services/agents/registry.js.map +1 -0
- package/dist/server/server/services/agents/types.js +6 -0
- package/dist/server/server/services/agents/types.js.map +1 -0
- package/dist/server/server/websocket/index.js +85 -0
- package/dist/server/server/websocket/index.js.map +1 -0
- package/dist/server/services/AIService.d.ts +30 -0
- package/dist/server/services/AIService.d.ts.map +1 -0
- package/dist/server/services/AIService.js +216 -0
- package/dist/server/services/AIService.js.map +1 -0
- package/dist/server/services/FileWatcher.d.ts +10 -0
- package/dist/server/services/FileWatcher.d.ts.map +1 -0
- package/dist/server/services/FileWatcher.js +62 -0
- package/dist/server/services/FileWatcher.js.map +1 -0
- package/dist/server/services/WorkflowService.d.ts +54 -0
- package/dist/server/services/WorkflowService.d.ts.map +1 -0
- package/dist/server/services/WorkflowService.js +323 -0
- package/dist/server/services/WorkflowService.js.map +1 -0
- package/dist/server/shared/constants.js +175 -0
- package/dist/server/shared/constants.js.map +1 -0
- package/dist/server/shared/types.js +3 -0
- package/dist/server/shared/types.js.map +1 -0
- package/dist/server/websocket/index.d.ts +10 -0
- package/dist/server/websocket/index.d.ts.map +1 -0
- package/dist/server/websocket/index.js +85 -0
- package/dist/server/websocket/index.js.map +1 -0
- package/index.html +19 -0
- package/package.json +96 -0
- package/playwright.config.ts +27 -0
- package/postcss.config.js +6 -0
- package/public/vite.svg +9 -0
- package/src/client/App.tsx +520 -0
- package/src/client/components/Canvas/Canvas.tsx +405 -0
- package/src/client/components/Canvas/ExecutionOverlay.tsx +847 -0
- package/src/client/components/Canvas/NodeContextMenu.tsx +188 -0
- package/src/client/components/Canvas/OutputNode.tsx +111 -0
- package/src/client/components/Canvas/StepNode.tsx +106 -0
- package/src/client/components/Canvas/SubWorkflowNode.tsx +141 -0
- package/src/client/components/Canvas/Toolbar.tsx +189 -0
- package/src/client/components/Canvas/TriggerNode.tsx +128 -0
- package/src/client/components/Editor/InputsEditor.tsx +458 -0
- package/src/client/components/Editor/NewStepWizard.tsx +344 -0
- package/src/client/components/Editor/StepEditor.tsx +532 -0
- package/src/client/components/Editor/YamlEditor.tsx +160 -0
- package/src/client/components/Panels/PropertiesPanel.tsx +589 -0
- package/src/client/components/Prompt/ChangePreview.tsx +281 -0
- package/src/client/components/Prompt/PromptHistoryPanel.tsx +209 -0
- package/src/client/components/Prompt/PromptInput.tsx +108 -0
- package/src/client/components/Sidebar/Sidebar.tsx +343 -0
- package/src/client/components/common/Breadcrumb.tsx +40 -0
- package/src/client/components/common/Button.tsx +68 -0
- package/src/client/components/common/ContextMenu.tsx +202 -0
- package/src/client/components/common/KeyboardShortcuts.tsx +143 -0
- package/src/client/components/common/Modal.tsx +93 -0
- package/src/client/components/common/Tabs.tsx +57 -0
- package/src/client/components/common/ThemeToggle.tsx +63 -0
- package/src/client/components/index.ts +32 -0
- package/src/client/hooks/index.ts +4 -0
- package/src/client/hooks/useAIPrompt.ts +108 -0
- package/src/client/hooks/useCanvas.ts +247 -0
- package/src/client/hooks/useWebSocket.ts +164 -0
- package/src/client/hooks/useWorkflow.ts +138 -0
- package/src/client/main.tsx +10 -0
- package/src/client/stores/canvasStore.ts +348 -0
- package/src/client/stores/editorStore.ts +133 -0
- package/src/client/stores/executionStore.ts +440 -0
- package/src/client/stores/index.ts +4 -0
- package/src/client/stores/layoutStore.ts +103 -0
- package/src/client/stores/navigationStore.ts +49 -0
- package/src/client/stores/promptStore.ts +113 -0
- package/src/client/stores/themeStore.ts +75 -0
- package/src/client/stores/workflowStore.ts +177 -0
- package/src/client/styles/globals.css +346 -0
- package/src/client/utils/cn.ts +9 -0
- package/src/client/utils/index.ts +4 -0
- package/src/client/utils/serviceIcons.tsx +64 -0
- package/src/client/utils/stepValidation.ts +155 -0
- package/src/client/utils/workflowToGraph.ts +299 -0
- package/src/server/index.ts +114 -0
- package/src/server/routes/ai.ts +91 -0
- package/src/server/routes/execute.ts +71 -0
- package/src/server/routes/tools.ts +564 -0
- package/src/server/routes/workflows.ts +106 -0
- package/src/server/services/AIService.ts +105 -0
- package/src/server/services/FileWatcher.ts +69 -0
- package/src/server/services/WorkflowService.ts +441 -0
- package/src/server/services/agents/claude-code-provider.ts +320 -0
- package/src/server/services/agents/claude-provider.ts +248 -0
- package/src/server/services/agents/copilot-provider.ts +311 -0
- package/src/server/services/agents/demo-provider.ts +184 -0
- package/src/server/services/agents/index.ts +31 -0
- package/src/server/services/agents/ollama-provider.ts +267 -0
- package/src/server/services/agents/prompts.ts +482 -0
- package/src/server/services/agents/registry.ts +289 -0
- package/src/server/services/agents/types.ts +146 -0
- package/src/server/websocket/index.ts +104 -0
- package/src/shared/constants.ts +180 -0
- package/src/shared/types.ts +179 -0
- package/tailwind.config.ts +73 -0
- package/tests/e2e/app.spec.ts +90 -0
- package/tests/e2e/canvas.spec.ts +128 -0
- package/tests/e2e/workflow.spec.ts +185 -0
- package/tests/integration/api.test.ts +250 -0
- package/tests/integration/testApp.ts +31 -0
- package/tests/setup.ts +37 -0
- package/tests/unit/canvasStore.test.ts +502 -0
- package/tests/unit/components.test.tsx +151 -0
- package/tests/unit/executionStore.test.ts +527 -0
- package/tests/unit/layoutStore.test.ts +194 -0
- package/tests/unit/navigationStore.test.ts +152 -0
- package/tests/unit/stepValidation.test.ts +226 -0
- package/tests/unit/themeStore.test.ts +141 -0
- package/tests/unit/workflowToGraph.test.ts +289 -0
- package/tsconfig.json +29 -0
- package/tsconfig.server.json +28 -0
- package/vite.config.ts +31 -0
- package/vitest.config.ts +26 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama AI agent provider
|
|
3
|
+
* Uses local Ollama instance for AI capabilities
|
|
4
|
+
*/
|
|
5
|
+
import { stringify as yamlStringify, parse as yamlParse } from 'yaml';
|
|
6
|
+
const SYSTEM_PROMPT = `You are an expert workflow automation assistant. Help users modify their workflows.
|
|
7
|
+
|
|
8
|
+
When modifying workflows:
|
|
9
|
+
- Each step has: id, name, action, inputs, output_variable
|
|
10
|
+
- Actions use format: service.method (e.g., slack.chat.postMessage)
|
|
11
|
+
- Template variables use: {{ variable_name }} syntax
|
|
12
|
+
|
|
13
|
+
Respond with:
|
|
14
|
+
1. A brief explanation of changes
|
|
15
|
+
2. The complete modified workflow in YAML format between \`\`\`yaml and \`\`\``;
|
|
16
|
+
export class OllamaProvider {
|
|
17
|
+
id = 'ollama';
|
|
18
|
+
name = 'Ollama (Local)';
|
|
19
|
+
capabilities = {
|
|
20
|
+
streaming: true,
|
|
21
|
+
toolUse: false,
|
|
22
|
+
codeExecution: false,
|
|
23
|
+
systemPrompts: true,
|
|
24
|
+
models: [
|
|
25
|
+
'llama3.2',
|
|
26
|
+
'llama3.1',
|
|
27
|
+
'codellama',
|
|
28
|
+
'mistral',
|
|
29
|
+
'mixtral',
|
|
30
|
+
'phi3',
|
|
31
|
+
'gemma2',
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
baseUrl = 'http://localhost:11434';
|
|
35
|
+
model = 'llama3.2';
|
|
36
|
+
ready = false;
|
|
37
|
+
error;
|
|
38
|
+
async initialize(config) {
|
|
39
|
+
try {
|
|
40
|
+
if (config.baseUrl) {
|
|
41
|
+
this.baseUrl = config.baseUrl;
|
|
42
|
+
}
|
|
43
|
+
if (config.model) {
|
|
44
|
+
this.model = config.model;
|
|
45
|
+
}
|
|
46
|
+
// Check if Ollama is available
|
|
47
|
+
const response = await fetch(`${this.baseUrl}/api/tags`, {
|
|
48
|
+
method: 'GET',
|
|
49
|
+
signal: AbortSignal.timeout(5000),
|
|
50
|
+
});
|
|
51
|
+
if (response.ok) {
|
|
52
|
+
this.ready = true;
|
|
53
|
+
this.error = undefined;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.ready = false;
|
|
57
|
+
this.error = 'Ollama server returned an error';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
this.ready = false;
|
|
62
|
+
this.error = `Cannot connect to Ollama at ${this.baseUrl}. Is Ollama running?`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
isReady() {
|
|
66
|
+
return this.ready;
|
|
67
|
+
}
|
|
68
|
+
getStatus() {
|
|
69
|
+
return {
|
|
70
|
+
ready: this.ready,
|
|
71
|
+
model: this.model,
|
|
72
|
+
error: this.error,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async processPrompt(prompt, workflow) {
|
|
76
|
+
if (!this.ready) {
|
|
77
|
+
return {
|
|
78
|
+
explanation: 'Ollama is not available. Please ensure Ollama is running.',
|
|
79
|
+
error: this.error,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const workflowYaml = yamlStringify(workflow, { indent: 2, lineWidth: 0 });
|
|
84
|
+
const response = await fetch(`${this.baseUrl}/api/generate`, {
|
|
85
|
+
method: 'POST',
|
|
86
|
+
headers: { 'Content-Type': 'application/json' },
|
|
87
|
+
body: JSON.stringify({
|
|
88
|
+
model: this.model,
|
|
89
|
+
prompt: `${SYSTEM_PROMPT}\n\nCurrent workflow:\n\`\`\`yaml\n${workflowYaml}\n\`\`\`\n\nUser request: ${prompt}`,
|
|
90
|
+
stream: false,
|
|
91
|
+
}),
|
|
92
|
+
});
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw new Error(`Ollama API error: ${response.status}`);
|
|
95
|
+
}
|
|
96
|
+
const data = (await response.json());
|
|
97
|
+
return this.parseAIResponse(data.response, workflow);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
return {
|
|
101
|
+
explanation: '',
|
|
102
|
+
error: err instanceof Error ? err.message : 'Unknown error',
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async getSuggestions(workflow, selectedStepId) {
|
|
107
|
+
const suggestions = [];
|
|
108
|
+
if (!workflow || !workflow.steps) {
|
|
109
|
+
return [
|
|
110
|
+
'Add your first step',
|
|
111
|
+
'Create a simple workflow',
|
|
112
|
+
'Add an HTTP request',
|
|
113
|
+
];
|
|
114
|
+
}
|
|
115
|
+
suggestions.push('Add error handling', 'Add a notification step', 'Simplify the workflow');
|
|
116
|
+
if (selectedStepId) {
|
|
117
|
+
const step = workflow.steps.find((s) => s.id === selectedStepId);
|
|
118
|
+
if (step) {
|
|
119
|
+
suggestions.push(`Improve "${step.name || step.id}"`, `Add validation to "${step.name || step.id}"`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return suggestions.slice(0, 5);
|
|
123
|
+
}
|
|
124
|
+
async streamPrompt(prompt, workflow, onChunk) {
|
|
125
|
+
if (!this.ready) {
|
|
126
|
+
return this.processPrompt(prompt, workflow);
|
|
127
|
+
}
|
|
128
|
+
const workflowYaml = yamlStringify(workflow, { indent: 2, lineWidth: 0 });
|
|
129
|
+
let fullResponse = '';
|
|
130
|
+
try {
|
|
131
|
+
const response = await fetch(`${this.baseUrl}/api/generate`, {
|
|
132
|
+
method: 'POST',
|
|
133
|
+
headers: { 'Content-Type': 'application/json' },
|
|
134
|
+
body: JSON.stringify({
|
|
135
|
+
model: this.model,
|
|
136
|
+
prompt: `${SYSTEM_PROMPT}\n\nCurrent workflow:\n\`\`\`yaml\n${workflowYaml}\n\`\`\`\n\nUser request: ${prompt}`,
|
|
137
|
+
stream: true,
|
|
138
|
+
}),
|
|
139
|
+
});
|
|
140
|
+
if (!response.ok || !response.body) {
|
|
141
|
+
throw new Error(`Ollama API error: ${response.status}`);
|
|
142
|
+
}
|
|
143
|
+
const reader = response.body.getReader();
|
|
144
|
+
const decoder = new TextDecoder();
|
|
145
|
+
while (true) {
|
|
146
|
+
const { done, value } = await reader.read();
|
|
147
|
+
if (done)
|
|
148
|
+
break;
|
|
149
|
+
const chunk = decoder.decode(value);
|
|
150
|
+
const lines = chunk.split('\n').filter(Boolean);
|
|
151
|
+
for (const line of lines) {
|
|
152
|
+
try {
|
|
153
|
+
const data = JSON.parse(line);
|
|
154
|
+
if (data.response) {
|
|
155
|
+
fullResponse += data.response;
|
|
156
|
+
onChunk(data.response);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Skip invalid JSON
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return this.parseAIResponse(fullResponse, workflow);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
return {
|
|
168
|
+
explanation: '',
|
|
169
|
+
error: err instanceof Error ? err.message : 'Unknown error',
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
parseAIResponse(responseText, originalWorkflow) {
|
|
174
|
+
const yamlMatch = responseText.match(/```yaml\n([\s\S]*?)\n```/);
|
|
175
|
+
let modifiedWorkflow;
|
|
176
|
+
let explanation = responseText;
|
|
177
|
+
if (yamlMatch) {
|
|
178
|
+
try {
|
|
179
|
+
const parsedYaml = yamlParse(yamlMatch[1]);
|
|
180
|
+
if (parsedYaml && (parsedYaml.steps || parsedYaml.metadata)) {
|
|
181
|
+
modifiedWorkflow = parsedYaml;
|
|
182
|
+
const explanationMatch = responseText.match(/^([\s\S]*?)```yaml/);
|
|
183
|
+
if (explanationMatch) {
|
|
184
|
+
explanation = explanationMatch[1].trim();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// Failed to parse YAML
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
let diff;
|
|
193
|
+
if (modifiedWorkflow) {
|
|
194
|
+
diff = this.generateDiff(originalWorkflow, modifiedWorkflow);
|
|
195
|
+
}
|
|
196
|
+
return { explanation, workflow: modifiedWorkflow, diff };
|
|
197
|
+
}
|
|
198
|
+
generateDiff(original, modified) {
|
|
199
|
+
const originalStepIds = new Set(original.steps?.map((s) => s.id) || []);
|
|
200
|
+
const modifiedStepIds = new Set(modified.steps?.map((s) => s.id) || []);
|
|
201
|
+
const added = modified.steps?.filter((s) => !originalStepIds.has(s.id)) || [];
|
|
202
|
+
const removed = original.steps?.filter((s) => !modifiedStepIds.has(s.id)) || [];
|
|
203
|
+
let diff = '';
|
|
204
|
+
if (added.length > 0) {
|
|
205
|
+
diff += `+ Added ${added.length} step(s)\n`;
|
|
206
|
+
}
|
|
207
|
+
if (removed.length > 0) {
|
|
208
|
+
diff += `- Removed ${removed.length} step(s)\n`;
|
|
209
|
+
}
|
|
210
|
+
return diff || 'No structural changes';
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
export function createOllamaProvider(config) {
|
|
214
|
+
const provider = new OllamaProvider();
|
|
215
|
+
if (config) {
|
|
216
|
+
provider.initialize(config);
|
|
217
|
+
}
|
|
218
|
+
return provider;
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=ollama-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-provider.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/ollama-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt Engineering Module for Workflow Modifications
|
|
3
|
+
*
|
|
4
|
+
* This module provides context-aware prompts for different workflow operations:
|
|
5
|
+
* - Adding/removing steps
|
|
6
|
+
* - Modifying step inputs
|
|
7
|
+
* - Adding error handling
|
|
8
|
+
* - Creating sub-workflows
|
|
9
|
+
* - Adding conditions
|
|
10
|
+
*/
|
|
11
|
+
// Available service integrations with their SDK mappings
|
|
12
|
+
export const AVAILABLE_SERVICES = {
|
|
13
|
+
slack: {
|
|
14
|
+
sdk: '@slack/web-api',
|
|
15
|
+
description: 'Slack messaging and workspace management',
|
|
16
|
+
commonActions: [
|
|
17
|
+
'chat.postMessage',
|
|
18
|
+
'chat.update',
|
|
19
|
+
'chat.delete',
|
|
20
|
+
'conversations.list',
|
|
21
|
+
'conversations.history',
|
|
22
|
+
'users.list',
|
|
23
|
+
'files.upload',
|
|
24
|
+
'reactions.add',
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
github: {
|
|
28
|
+
sdk: '@octokit/rest',
|
|
29
|
+
description: 'GitHub repository, issues, and PR management',
|
|
30
|
+
commonActions: [
|
|
31
|
+
'pulls.get',
|
|
32
|
+
'pulls.create',
|
|
33
|
+
'pulls.list',
|
|
34
|
+
'issues.create',
|
|
35
|
+
'issues.update',
|
|
36
|
+
'issues.list',
|
|
37
|
+
'repos.getContent',
|
|
38
|
+
'repos.createRelease',
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
jira: {
|
|
42
|
+
sdk: 'jira.js',
|
|
43
|
+
description: 'Jira issue and project tracking',
|
|
44
|
+
commonActions: [
|
|
45
|
+
'issues.createIssue',
|
|
46
|
+
'issues.updateIssue',
|
|
47
|
+
'issues.getIssue',
|
|
48
|
+
'issues.searchJql',
|
|
49
|
+
'projects.getProject',
|
|
50
|
+
'transitions.transitionIssue',
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
gmail: {
|
|
54
|
+
sdk: 'googleapis',
|
|
55
|
+
description: 'Gmail email sending and management',
|
|
56
|
+
commonActions: [
|
|
57
|
+
'users.messages.send',
|
|
58
|
+
'users.messages.list',
|
|
59
|
+
'users.messages.get',
|
|
60
|
+
'users.labels.list',
|
|
61
|
+
'users.drafts.create',
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
outlook: {
|
|
65
|
+
sdk: '@microsoft/microsoft-graph-client',
|
|
66
|
+
description: 'Microsoft Outlook email and calendar',
|
|
67
|
+
commonActions: [
|
|
68
|
+
'mail.sendMail',
|
|
69
|
+
'mail.listMessages',
|
|
70
|
+
'calendar.createEvent',
|
|
71
|
+
'calendar.listEvents',
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
linear: {
|
|
75
|
+
sdk: '@linear/sdk',
|
|
76
|
+
description: 'Linear issue tracking and project management',
|
|
77
|
+
commonActions: [
|
|
78
|
+
'issues.create',
|
|
79
|
+
'issues.update',
|
|
80
|
+
'issues.archive',
|
|
81
|
+
'projects.list',
|
|
82
|
+
'cycles.list',
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
notion: {
|
|
86
|
+
sdk: '@notionhq/client',
|
|
87
|
+
description: 'Notion pages and databases',
|
|
88
|
+
commonActions: [
|
|
89
|
+
'pages.create',
|
|
90
|
+
'pages.update',
|
|
91
|
+
'databases.query',
|
|
92
|
+
'blocks.children.append',
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
discord: {
|
|
96
|
+
sdk: 'discord.js',
|
|
97
|
+
description: 'Discord messaging and server management',
|
|
98
|
+
commonActions: [
|
|
99
|
+
'channels.send',
|
|
100
|
+
'channels.createWebhook',
|
|
101
|
+
'guilds.members.fetch',
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
airtable: {
|
|
105
|
+
sdk: 'airtable',
|
|
106
|
+
description: 'Airtable database and records',
|
|
107
|
+
commonActions: [
|
|
108
|
+
'tables.list',
|
|
109
|
+
'records.create',
|
|
110
|
+
'records.update',
|
|
111
|
+
'records.list',
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
confluence: {
|
|
115
|
+
sdk: 'confluence.js',
|
|
116
|
+
description: 'Atlassian Confluence wiki pages',
|
|
117
|
+
commonActions: [
|
|
118
|
+
'content.getContent',
|
|
119
|
+
'content.createContent',
|
|
120
|
+
'content.updateContent',
|
|
121
|
+
'space.getSpaces',
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
http: {
|
|
125
|
+
sdk: 'built-in',
|
|
126
|
+
description: 'Generic HTTP requests to any API',
|
|
127
|
+
commonActions: ['request', 'get', 'post', 'put', 'delete'],
|
|
128
|
+
},
|
|
129
|
+
claude: {
|
|
130
|
+
sdk: '@anthropic-ai/sdk',
|
|
131
|
+
description: 'Claude AI for text generation and analysis',
|
|
132
|
+
commonActions: ['messages.create', 'completions.create'],
|
|
133
|
+
},
|
|
134
|
+
opencode: {
|
|
135
|
+
sdk: '@anthropic-ai/claude-agent-sdk',
|
|
136
|
+
description: 'OpenCode for code generation and analysis',
|
|
137
|
+
commonActions: ['generate', 'analyze', 'refactor'],
|
|
138
|
+
},
|
|
139
|
+
ollama: {
|
|
140
|
+
sdk: 'ollama',
|
|
141
|
+
description: 'Local Ollama LLM for AI tasks',
|
|
142
|
+
commonActions: ['generate', 'chat', 'embeddings'],
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
// Base system prompt with comprehensive context
|
|
146
|
+
export const BASE_SYSTEM_PROMPT = `You are an expert workflow automation assistant for Marktoflow, a markdown-based workflow automation framework.
|
|
147
|
+
|
|
148
|
+
## Your Role
|
|
149
|
+
Help users modify their workflows based on natural language requests. You must:
|
|
150
|
+
1. Understand the current workflow structure
|
|
151
|
+
2. Make precise modifications based on user requests
|
|
152
|
+
3. Explain what changes you made and why
|
|
153
|
+
4. Return valid YAML that can be parsed
|
|
154
|
+
|
|
155
|
+
## Workflow Structure
|
|
156
|
+
|
|
157
|
+
A workflow consists of:
|
|
158
|
+
- **metadata**: name, description, version, author, tags
|
|
159
|
+
- **inputs**: declared input variables with types and defaults
|
|
160
|
+
- **tools**: service SDK configurations with authentication
|
|
161
|
+
- **steps**: array of actions to execute
|
|
162
|
+
|
|
163
|
+
### Step Structure
|
|
164
|
+
\`\`\`yaml
|
|
165
|
+
- id: unique-step-id # Required: kebab-case identifier
|
|
166
|
+
name: "Human Readable Name" # Optional: display name
|
|
167
|
+
action: service.method # Required: SDK method to call
|
|
168
|
+
inputs: # Required: method parameters
|
|
169
|
+
param1: value
|
|
170
|
+
param2: "{{ variable }}" # Template variables
|
|
171
|
+
output_variable: result_name # Optional: store output
|
|
172
|
+
conditions: # Optional: when to run
|
|
173
|
+
- "{{ previous_step.success }}"
|
|
174
|
+
errorHandling: # Optional: error handling
|
|
175
|
+
action: retry # stop | continue | retry
|
|
176
|
+
maxRetries: 3
|
|
177
|
+
\`\`\`
|
|
178
|
+
|
|
179
|
+
### Template Variables
|
|
180
|
+
- Access inputs: \`{{ inputs.variable_name }}\`
|
|
181
|
+
- Access step outputs: \`{{ step_id.field }}\` or \`{{ output_variable.field }}\`
|
|
182
|
+
- JavaScript expressions: \`{{ inputs.count > 10 ? "many" : "few" }}\`
|
|
183
|
+
|
|
184
|
+
### Available Services
|
|
185
|
+
${Object.entries(AVAILABLE_SERVICES)
|
|
186
|
+
.map(([name, info]) => `- **${name}**: ${info.description} (SDK: ${info.sdk})`)
|
|
187
|
+
.join('\n')}
|
|
188
|
+
|
|
189
|
+
## Response Format
|
|
190
|
+
|
|
191
|
+
Always respond with:
|
|
192
|
+
1. A brief explanation (1-3 sentences) of what you changed
|
|
193
|
+
2. The complete modified workflow in a YAML code block
|
|
194
|
+
|
|
195
|
+
\`\`\`yaml
|
|
196
|
+
# Your modified workflow here
|
|
197
|
+
\`\`\`
|
|
198
|
+
|
|
199
|
+
## Important Guidelines
|
|
200
|
+
- Only make the changes requested - don't "improve" other parts
|
|
201
|
+
- Preserve existing step IDs unless explicitly asked to rename
|
|
202
|
+
- Generate unique IDs for new steps (use kebab-case)
|
|
203
|
+
- Ensure all YAML is valid and properly indented
|
|
204
|
+
- Keep the same workflow structure (don't remove required sections)
|
|
205
|
+
`;
|
|
206
|
+
// Operation-specific prompts for different modification types
|
|
207
|
+
export const OPERATION_PROMPTS = {
|
|
208
|
+
addStep: `
|
|
209
|
+
## Adding Steps
|
|
210
|
+
When adding a new step:
|
|
211
|
+
1. Generate a unique, descriptive kebab-case ID (e.g., "send-slack-notification")
|
|
212
|
+
2. Add a human-readable name
|
|
213
|
+
3. Use the correct action format: service.method
|
|
214
|
+
4. Include all required inputs for the action
|
|
215
|
+
5. Consider adding an output_variable if the result will be used later
|
|
216
|
+
6. Place the step at a logical position in the workflow
|
|
217
|
+
|
|
218
|
+
Common step patterns:
|
|
219
|
+
- Notifications: slack.chat.postMessage, gmail.users.messages.send
|
|
220
|
+
- API calls: http.request, github.pulls.get
|
|
221
|
+
- Data processing: Transform data between steps
|
|
222
|
+
`,
|
|
223
|
+
removeStep: `
|
|
224
|
+
## Removing Steps
|
|
225
|
+
When removing a step:
|
|
226
|
+
1. Remove the entire step block from the steps array
|
|
227
|
+
2. Check if other steps reference this step's output_variable
|
|
228
|
+
3. If references exist, either:
|
|
229
|
+
- Update those references to use a different source
|
|
230
|
+
- Warn the user about broken references
|
|
231
|
+
4. Preserve the workflow structure and other steps
|
|
232
|
+
`,
|
|
233
|
+
modifyInputs: `
|
|
234
|
+
## Modifying Step Inputs
|
|
235
|
+
When modifying inputs:
|
|
236
|
+
1. Only change the specified inputs
|
|
237
|
+
2. Preserve other inputs unless asked to remove them
|
|
238
|
+
3. Use template variables for dynamic values: {{ variable }}
|
|
239
|
+
4. Ensure the value type matches what the action expects
|
|
240
|
+
5. Consider adding validation or error handling if needed
|
|
241
|
+
`,
|
|
242
|
+
addErrorHandling: `
|
|
243
|
+
## Adding Error Handling
|
|
244
|
+
Error handling options:
|
|
245
|
+
- **stop**: Halt workflow execution on error (default)
|
|
246
|
+
- **continue**: Log error and continue to next step
|
|
247
|
+
- **retry**: Retry the step with backoff
|
|
248
|
+
|
|
249
|
+
Example:
|
|
250
|
+
\`\`\`yaml
|
|
251
|
+
errorHandling:
|
|
252
|
+
action: retry
|
|
253
|
+
maxRetries: 3
|
|
254
|
+
retryDelay: 1000 # milliseconds
|
|
255
|
+
fallback:
|
|
256
|
+
action: slack.chat.postMessage
|
|
257
|
+
inputs:
|
|
258
|
+
channel: "#alerts"
|
|
259
|
+
text: "Step {{ step.name }} failed: {{ error.message }}"
|
|
260
|
+
\`\`\`
|
|
261
|
+
`,
|
|
262
|
+
addConditions: `
|
|
263
|
+
## Adding Conditions
|
|
264
|
+
Conditions control when a step executes. They are JavaScript-like expressions.
|
|
265
|
+
|
|
266
|
+
Examples:
|
|
267
|
+
\`\`\`yaml
|
|
268
|
+
conditions:
|
|
269
|
+
- "{{ previous_step.success === true }}"
|
|
270
|
+
- "{{ inputs.environment === 'production' }}"
|
|
271
|
+
- "{{ pr_details.state === 'open' && pr_details.draft === false }}"
|
|
272
|
+
\`\`\`
|
|
273
|
+
|
|
274
|
+
Common patterns:
|
|
275
|
+
- Check previous step success: \`{{ step_id.success }}\`
|
|
276
|
+
- Check variable values: \`{{ output_var.field === 'value' }}\`
|
|
277
|
+
- Check input values: \`{{ inputs.flag === true }}\`
|
|
278
|
+
- Combine conditions: \`{{ condition1 && condition2 }}\`
|
|
279
|
+
`,
|
|
280
|
+
createSubWorkflow: `
|
|
281
|
+
## Creating Sub-Workflows
|
|
282
|
+
A sub-workflow is referenced by path instead of an action:
|
|
283
|
+
|
|
284
|
+
\`\`\`yaml
|
|
285
|
+
- id: run-notification-workflow
|
|
286
|
+
name: "Run Notification Workflow"
|
|
287
|
+
workflowPath: "./workflows/notify.md"
|
|
288
|
+
inputs:
|
|
289
|
+
message: "{{ previous_step.summary }}"
|
|
290
|
+
channel: "{{ inputs.notification_channel }}"
|
|
291
|
+
output_variable: notification_result
|
|
292
|
+
\`\`\`
|
|
293
|
+
|
|
294
|
+
When creating sub-workflows:
|
|
295
|
+
1. Use workflowPath instead of action
|
|
296
|
+
2. Pass inputs that the sub-workflow expects
|
|
297
|
+
3. The sub-workflow's outputs are available via output_variable
|
|
298
|
+
`,
|
|
299
|
+
addTool: `
|
|
300
|
+
## Adding Tool Configurations
|
|
301
|
+
Tools are configured with their SDK and authentication:
|
|
302
|
+
|
|
303
|
+
\`\`\`yaml
|
|
304
|
+
tools:
|
|
305
|
+
slack:
|
|
306
|
+
sdk: '@slack/web-api'
|
|
307
|
+
auth:
|
|
308
|
+
token: '\${SLACK_BOT_TOKEN}'
|
|
309
|
+
github:
|
|
310
|
+
sdk: '@octokit/rest'
|
|
311
|
+
auth:
|
|
312
|
+
token: '\${GITHUB_TOKEN}'
|
|
313
|
+
\`\`\`
|
|
314
|
+
|
|
315
|
+
Authentication patterns:
|
|
316
|
+
- Environment variables: \${ENV_VAR_NAME}
|
|
317
|
+
- OAuth tokens: Stored and retrieved automatically
|
|
318
|
+
- API keys: Configured per-tool
|
|
319
|
+
`,
|
|
320
|
+
};
|
|
321
|
+
/**
|
|
322
|
+
* Build a context-aware prompt based on the user's request
|
|
323
|
+
*/
|
|
324
|
+
export function buildPrompt(userRequest, workflow, context) {
|
|
325
|
+
// Detect the type of operation requested
|
|
326
|
+
const operations = detectOperations(userRequest);
|
|
327
|
+
// Build system prompt with relevant operation guides
|
|
328
|
+
let systemPrompt = BASE_SYSTEM_PROMPT;
|
|
329
|
+
for (const op of operations) {
|
|
330
|
+
if (OPERATION_PROMPTS[op]) {
|
|
331
|
+
systemPrompt += '\n' + OPERATION_PROMPTS[op];
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Build user prompt with context
|
|
335
|
+
let userPrompt = `Current workflow:\n\`\`\`yaml\n${formatWorkflow(workflow)}\n\`\`\`\n\n`;
|
|
336
|
+
if (context?.selectedStepId) {
|
|
337
|
+
const selectedStep = workflow.steps?.find((s) => s.id === context.selectedStepId);
|
|
338
|
+
if (selectedStep) {
|
|
339
|
+
userPrompt += `Currently selected step: "${context.selectedStepId}"\n\n`;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
if (context?.recentHistory && context.recentHistory.length > 0) {
|
|
343
|
+
userPrompt += `Recent changes:\n${context.recentHistory.map((h) => `- ${h}`).join('\n')}\n\n`;
|
|
344
|
+
}
|
|
345
|
+
userPrompt += `User request: ${userRequest}`;
|
|
346
|
+
return { systemPrompt, userPrompt };
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Detect what type of operations the user is requesting
|
|
350
|
+
*/
|
|
351
|
+
function detectOperations(request) {
|
|
352
|
+
const lower = request.toLowerCase();
|
|
353
|
+
const operations = [];
|
|
354
|
+
if (lower.includes('add') && (lower.includes('step') || lower.includes('action'))) {
|
|
355
|
+
operations.push('addStep');
|
|
356
|
+
}
|
|
357
|
+
if (lower.includes('remove') || lower.includes('delete')) {
|
|
358
|
+
operations.push('removeStep');
|
|
359
|
+
}
|
|
360
|
+
if (lower.includes('change') || lower.includes('modify') || lower.includes('update')) {
|
|
361
|
+
operations.push('modifyInputs');
|
|
362
|
+
}
|
|
363
|
+
if (lower.includes('error') || lower.includes('retry') || lower.includes('fallback')) {
|
|
364
|
+
operations.push('addErrorHandling');
|
|
365
|
+
}
|
|
366
|
+
if (lower.includes('condition') || lower.includes('if') || lower.includes('when')) {
|
|
367
|
+
operations.push('addConditions');
|
|
368
|
+
}
|
|
369
|
+
if (lower.includes('sub-workflow') || lower.includes('subworkflow') || lower.includes('nested')) {
|
|
370
|
+
operations.push('createSubWorkflow');
|
|
371
|
+
}
|
|
372
|
+
if (lower.includes('tool') || lower.includes('sdk') || lower.includes('connect')) {
|
|
373
|
+
operations.push('addTool');
|
|
374
|
+
}
|
|
375
|
+
// Default to addStep if no specific operation detected
|
|
376
|
+
if (operations.length === 0) {
|
|
377
|
+
operations.push('addStep');
|
|
378
|
+
}
|
|
379
|
+
return operations;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Format workflow for prompt (simplified YAML)
|
|
383
|
+
*/
|
|
384
|
+
function formatWorkflow(workflow) {
|
|
385
|
+
const { stringify } = require('yaml');
|
|
386
|
+
return stringify(workflow, { indent: 2, lineWidth: 0 });
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Generate contextual suggestions based on workflow state
|
|
390
|
+
*/
|
|
391
|
+
export function generateSuggestions(workflow, selectedStepId) {
|
|
392
|
+
const suggestions = [];
|
|
393
|
+
const steps = workflow.steps || [];
|
|
394
|
+
// No steps - suggest getting started
|
|
395
|
+
if (steps.length === 0) {
|
|
396
|
+
return [
|
|
397
|
+
'Add a step to send a Slack message',
|
|
398
|
+
'Add a step to fetch data from GitHub',
|
|
399
|
+
'Add an HTTP request step',
|
|
400
|
+
'Create a workflow that monitors a webhook',
|
|
401
|
+
];
|
|
402
|
+
}
|
|
403
|
+
// Check for missing error handling
|
|
404
|
+
const stepsWithoutErrorHandling = steps.filter((s) => !s.errorHandling);
|
|
405
|
+
if (stepsWithoutErrorHandling.length > 0) {
|
|
406
|
+
suggestions.push('Add error handling with retries to all steps');
|
|
407
|
+
}
|
|
408
|
+
// Check for missing notifications
|
|
409
|
+
const hasNotification = steps.some((s) => s.action?.includes('slack') ||
|
|
410
|
+
s.action?.includes('gmail') ||
|
|
411
|
+
s.action?.includes('discord'));
|
|
412
|
+
if (!hasNotification) {
|
|
413
|
+
suggestions.push('Add a Slack notification at the end');
|
|
414
|
+
}
|
|
415
|
+
// Step-specific suggestions
|
|
416
|
+
if (selectedStepId) {
|
|
417
|
+
const step = steps.find((s) => s.id === selectedStepId);
|
|
418
|
+
if (step) {
|
|
419
|
+
if (!step.errorHandling) {
|
|
420
|
+
suggestions.push(`Add retry logic to "${step.name || step.id}"`);
|
|
421
|
+
}
|
|
422
|
+
if (!step.conditions || step.conditions.length === 0) {
|
|
423
|
+
suggestions.push(`Add a condition to "${step.name || step.id}"`);
|
|
424
|
+
}
|
|
425
|
+
suggestions.push(`Duplicate "${step.name || step.id}" with modifications`);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
// General suggestions
|
|
429
|
+
if (steps.length >= 3) {
|
|
430
|
+
suggestions.push('Convert these steps into a reusable sub-workflow');
|
|
431
|
+
}
|
|
432
|
+
suggestions.push('Add a step to log results to a database');
|
|
433
|
+
suggestions.push('Add parallel execution for independent steps');
|
|
434
|
+
return suggestions.slice(0, 5);
|
|
435
|
+
}
|
|
436
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/prompts.ts"],"names":[],"mappings":"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"}
|