@marktoflow/gui 2.0.0-alpha.1 → 2.0.0-alpha.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/.turbo/turbo-build.log +7 -7
- package/README.md +38 -2
- package/dist/client/assets/index-C90Y_aBX.js +678 -0
- package/dist/client/assets/index-C90Y_aBX.js.map +1 -0
- package/dist/client/assets/index-CRWeQ3NN.css +1 -0
- package/dist/client/index.html +2 -2
- package/dist/server/server/index.js +1 -1
- package/dist/server/server/routes/tools.js +406 -0
- package/dist/server/server/routes/tools.js.map +1 -1
- package/dist/server/server/services/agents/codex-provider.js +270 -0
- package/dist/server/server/services/agents/codex-provider.js.map +1 -0
- package/dist/server/server/services/agents/prompts.js +27 -0
- package/dist/server/server/services/agents/prompts.js.map +1 -1
- package/dist/server/server/services/agents/registry.js +20 -0
- package/dist/server/server/services/agents/registry.js.map +1 -1
- package/package.json +6 -6
- package/src/client/components/Canvas/Canvas.tsx +24 -6
- package/src/client/components/Canvas/ForEachNode.tsx +128 -0
- package/src/client/components/Canvas/IfElseNode.tsx +126 -0
- package/src/client/components/Canvas/ParallelNode.tsx +140 -0
- package/src/client/components/Canvas/SwitchNode.tsx +164 -0
- package/src/client/components/Canvas/TransformNode.tsx +185 -0
- package/src/client/components/Canvas/TryCatchNode.tsx +164 -0
- package/src/client/components/Canvas/WhileNode.tsx +129 -0
- package/src/client/components/Canvas/index.ts +24 -0
- package/src/client/utils/serviceIcons.tsx +33 -0
- package/src/server/index.ts +1 -1
- package/src/server/routes/tools.ts +406 -0
- package/src/server/services/agents/codex-provider.ts +398 -0
- package/src/server/services/agents/prompts.ts +27 -0
- package/src/server/services/agents/registry.ts +21 -0
- package/tailwind.config.ts +1 -1
- package/tests/integration/api.test.ts +203 -1
- package/tests/integration/testApp.ts +1 -1
- package/tests/setup.ts +35 -0
- package/tests/unit/ForEachNode.test.tsx +218 -0
- package/tests/unit/IfElseNode.test.tsx +188 -0
- package/tests/unit/ParallelNode.test.tsx +264 -0
- package/tests/unit/SwitchNode.test.tsx +252 -0
- package/tests/unit/TransformNode.test.tsx +386 -0
- package/tests/unit/TryCatchNode.test.tsx +243 -0
- package/tests/unit/WhileNode.test.tsx +226 -0
- package/tests/unit/codexProvider.test.ts +399 -0
- package/tests/unit/serviceIcons.test.ts +197 -0
- package/.turbo/turbo-test.log +0 -22
- package/dist/client/assets/index-DwTI8opO.js +0 -608
- package/dist/client/assets/index-DwTI8opO.js.map +0 -1
- package/dist/client/assets/index-RoEdL6gO.css +0 -1
- package/dist/server/index.d.ts +0 -3
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js +0 -56
- package/dist/server/index.js.map +0 -1
- package/dist/server/routes/ai.js +0 -50
- package/dist/server/routes/ai.js.map +0 -1
- package/dist/server/routes/execute.js +0 -62
- package/dist/server/routes/execute.js.map +0 -1
- package/dist/server/routes/workflows.js +0 -99
- package/dist/server/routes/workflows.js.map +0 -1
- package/dist/server/services/AIService.d.ts +0 -30
- package/dist/server/services/AIService.d.ts.map +0 -1
- package/dist/server/services/AIService.js +0 -216
- package/dist/server/services/AIService.js.map +0 -1
- package/dist/server/services/FileWatcher.d.ts +0 -10
- package/dist/server/services/FileWatcher.d.ts.map +0 -1
- package/dist/server/services/FileWatcher.js +0 -62
- package/dist/server/services/FileWatcher.js.map +0 -1
- package/dist/server/services/WorkflowService.d.ts +0 -54
- package/dist/server/services/WorkflowService.d.ts.map +0 -1
- package/dist/server/services/WorkflowService.js +0 -323
- package/dist/server/services/WorkflowService.js.map +0 -1
- package/dist/server/websocket/index.d.ts +0 -10
- package/dist/server/websocket/index.d.ts.map +0 -1
- package/dist/server/websocket/index.js +0 -85
- package/dist/server/websocket/index.js.map +0 -1
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
-
import { stringify as yamlStringify, parse as yamlParse } from 'yaml';
|
|
3
|
-
const SYSTEM_PROMPT = `You are an expert workflow automation assistant for Marktoflow, a markdown-based workflow automation framework.
|
|
4
|
-
|
|
5
|
-
Your role is to help users modify their workflows based on natural language requests. You should:
|
|
6
|
-
|
|
7
|
-
1. Understand the current workflow structure (YAML frontmatter with steps, inputs, tools)
|
|
8
|
-
2. Make precise modifications based on user requests
|
|
9
|
-
3. Explain what changes you made and why
|
|
10
|
-
|
|
11
|
-
When modifying workflows, follow these conventions:
|
|
12
|
-
- Each step has: id, name (optional), action (service.method), inputs, output_variable
|
|
13
|
-
- Actions use format: service.method (e.g., slack.chat.postMessage, github.pulls.get)
|
|
14
|
-
- Template variables use: {{ variable_name }} syntax
|
|
15
|
-
- Error handling can specify: action (stop/continue/retry), max_retries
|
|
16
|
-
- Conditions use JavaScript-like expressions
|
|
17
|
-
|
|
18
|
-
Available services: slack, github, jira, gmail, outlook, linear, notion, discord, airtable, confluence, http, claude, opencode, ollama
|
|
19
|
-
|
|
20
|
-
Respond with:
|
|
21
|
-
1. A brief explanation of the changes
|
|
22
|
-
2. The complete modified workflow in valid YAML format
|
|
23
|
-
|
|
24
|
-
Be concise and precise. Only make the requested changes.`;
|
|
25
|
-
export class AIService {
|
|
26
|
-
history = [];
|
|
27
|
-
anthropic = null;
|
|
28
|
-
constructor() {
|
|
29
|
-
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
30
|
-
if (apiKey) {
|
|
31
|
-
this.anthropic = new Anthropic({ apiKey });
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
async processPrompt(prompt, workflow) {
|
|
35
|
-
if (!this.anthropic) {
|
|
36
|
-
// Demo mode: simulate AI response
|
|
37
|
-
return this.simulateResponse(prompt, workflow);
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
// Convert workflow to YAML for better readability
|
|
41
|
-
const workflowYaml = yamlStringify(workflow, { indent: 2, lineWidth: 0 });
|
|
42
|
-
const response = await this.anthropic.messages.create({
|
|
43
|
-
model: 'claude-sonnet-4-20250514',
|
|
44
|
-
max_tokens: 4096,
|
|
45
|
-
system: SYSTEM_PROMPT,
|
|
46
|
-
messages: [
|
|
47
|
-
{
|
|
48
|
-
role: 'user',
|
|
49
|
-
content: `Current workflow:\n\`\`\`yaml\n${workflowYaml}\n\`\`\`\n\nUser request: ${prompt}`,
|
|
50
|
-
},
|
|
51
|
-
],
|
|
52
|
-
});
|
|
53
|
-
// Parse the response
|
|
54
|
-
const responseText = response.content
|
|
55
|
-
.filter((block) => block.type === 'text')
|
|
56
|
-
.map((block) => block.text)
|
|
57
|
-
.join('');
|
|
58
|
-
// Extract explanation and workflow from response
|
|
59
|
-
const result = this.parseAIResponse(responseText, workflow);
|
|
60
|
-
this.history.unshift({
|
|
61
|
-
prompt,
|
|
62
|
-
response: result.explanation,
|
|
63
|
-
timestamp: new Date(),
|
|
64
|
-
success: true,
|
|
65
|
-
});
|
|
66
|
-
return result;
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
this.history.unshift({
|
|
70
|
-
prompt,
|
|
71
|
-
response: error instanceof Error ? error.message : 'Unknown error',
|
|
72
|
-
timestamp: new Date(),
|
|
73
|
-
success: false,
|
|
74
|
-
});
|
|
75
|
-
throw error;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
parseAIResponse(responseText, originalWorkflow) {
|
|
79
|
-
// Try to extract YAML from the response
|
|
80
|
-
const yamlMatch = responseText.match(/```yaml\n([\s\S]*?)\n```/);
|
|
81
|
-
let modifiedWorkflow;
|
|
82
|
-
let explanation = responseText;
|
|
83
|
-
if (yamlMatch) {
|
|
84
|
-
try {
|
|
85
|
-
const parsedYaml = yamlParse(yamlMatch[1]);
|
|
86
|
-
// Validate that it has the expected workflow structure
|
|
87
|
-
if (parsedYaml && (parsedYaml.steps || parsedYaml.metadata)) {
|
|
88
|
-
modifiedWorkflow = parsedYaml;
|
|
89
|
-
// Extract explanation (text before the YAML block)
|
|
90
|
-
const explanationMatch = responseText.match(/^([\s\S]*?)```yaml/);
|
|
91
|
-
if (explanationMatch) {
|
|
92
|
-
explanation = explanationMatch[1].trim();
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
// Failed to parse YAML, return just the explanation
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
// Generate diff if we have a modified workflow
|
|
101
|
-
let diff;
|
|
102
|
-
if (modifiedWorkflow) {
|
|
103
|
-
diff = this.generateDiff(originalWorkflow, modifiedWorkflow);
|
|
104
|
-
}
|
|
105
|
-
return {
|
|
106
|
-
explanation,
|
|
107
|
-
workflow: modifiedWorkflow,
|
|
108
|
-
diff,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
generateDiff(original, modified) {
|
|
112
|
-
const originalStepIds = new Set(original.steps?.map((s) => s.id) || []);
|
|
113
|
-
const modifiedStepIds = new Set(modified.steps?.map((s) => s.id) || []);
|
|
114
|
-
const added = modified.steps?.filter((s) => !originalStepIds.has(s.id)) || [];
|
|
115
|
-
const removed = original.steps?.filter((s) => !modifiedStepIds.has(s.id)) || [];
|
|
116
|
-
let diff = '';
|
|
117
|
-
if (added.length > 0) {
|
|
118
|
-
diff += `+ Added ${added.length} step(s): ${added.map((s) => s.name || s.id).join(', ')}\n`;
|
|
119
|
-
}
|
|
120
|
-
if (removed.length > 0) {
|
|
121
|
-
diff += `- Removed ${removed.length} step(s): ${removed.map((s) => s.name || s.id).join(', ')}\n`;
|
|
122
|
-
}
|
|
123
|
-
return diff || 'No structural changes detected';
|
|
124
|
-
}
|
|
125
|
-
async getHistory() {
|
|
126
|
-
return this.history.slice(0, 20);
|
|
127
|
-
}
|
|
128
|
-
async getSuggestions(workflow, selectedStepId) {
|
|
129
|
-
const suggestions = [];
|
|
130
|
-
if (!workflow || !workflow.steps) {
|
|
131
|
-
return [
|
|
132
|
-
'Add your first step',
|
|
133
|
-
'Import a template workflow',
|
|
134
|
-
'Connect to a service',
|
|
135
|
-
];
|
|
136
|
-
}
|
|
137
|
-
// Generic suggestions
|
|
138
|
-
suggestions.push('Add error handling to all steps', 'Add a notification step at the end', 'Convert steps to a sub-workflow');
|
|
139
|
-
// Step-specific suggestions
|
|
140
|
-
if (selectedStepId) {
|
|
141
|
-
const step = workflow.steps.find((s) => s.id === selectedStepId);
|
|
142
|
-
if (step) {
|
|
143
|
-
if (!step.errorHandling) {
|
|
144
|
-
suggestions.push(`Add retry logic to "${step.name || step.id}"`);
|
|
145
|
-
}
|
|
146
|
-
suggestions.push(`Add a condition to "${step.name || step.id}"`, `Duplicate "${step.name || step.id}"`);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
return suggestions.slice(0, 5);
|
|
150
|
-
}
|
|
151
|
-
simulateResponse(prompt, workflow) {
|
|
152
|
-
const promptLower = prompt.toLowerCase();
|
|
153
|
-
let explanation = '';
|
|
154
|
-
let modifiedWorkflow = { ...workflow, steps: [...(workflow.steps || [])] };
|
|
155
|
-
// Simple pattern matching for demo purposes
|
|
156
|
-
if (promptLower.includes('add') && promptLower.includes('slack')) {
|
|
157
|
-
const newStep = {
|
|
158
|
-
id: `slack-${Date.now()}`,
|
|
159
|
-
name: 'Send Slack Notification',
|
|
160
|
-
action: 'slack.chat.postMessage',
|
|
161
|
-
inputs: {
|
|
162
|
-
channel: '#general',
|
|
163
|
-
text: 'Workflow completed successfully!',
|
|
164
|
-
},
|
|
165
|
-
outputVariable: 'slack_result',
|
|
166
|
-
};
|
|
167
|
-
modifiedWorkflow.steps.push(newStep);
|
|
168
|
-
explanation = 'Added a new Slack notification step at the end of the workflow. The message will be sent to #general channel.';
|
|
169
|
-
}
|
|
170
|
-
else if (promptLower.includes('add') && promptLower.includes('error')) {
|
|
171
|
-
modifiedWorkflow.steps = modifiedWorkflow.steps.map((step) => ({
|
|
172
|
-
...step,
|
|
173
|
-
errorHandling: {
|
|
174
|
-
action: 'retry',
|
|
175
|
-
maxRetries: 3,
|
|
176
|
-
},
|
|
177
|
-
}));
|
|
178
|
-
explanation = 'Added error handling with 3 retries to all steps in the workflow.';
|
|
179
|
-
}
|
|
180
|
-
else if (promptLower.includes('add') && promptLower.includes('condition')) {
|
|
181
|
-
if (modifiedWorkflow.steps.length > 0) {
|
|
182
|
-
modifiedWorkflow.steps[modifiedWorkflow.steps.length - 1] = {
|
|
183
|
-
...modifiedWorkflow.steps[modifiedWorkflow.steps.length - 1],
|
|
184
|
-
conditions: ['{{ previous_step.success === true }}'],
|
|
185
|
-
};
|
|
186
|
-
explanation = 'Added a condition to the last step to only run if the previous step succeeded.';
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
explanation = 'No steps to add conditions to. Please add some steps first.';
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
else if (promptLower.includes('remove') || promptLower.includes('delete')) {
|
|
193
|
-
if (modifiedWorkflow.steps.length > 0) {
|
|
194
|
-
const removed = modifiedWorkflow.steps.pop();
|
|
195
|
-
explanation = `Removed the last step "${removed?.name || removed?.id}" from the workflow.`;
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
explanation = 'No steps to remove.';
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
explanation = `I understood your request: "${prompt}". In a full implementation, I would analyze the workflow and make the appropriate modifications. For now, this is running in demo mode without an API key.`;
|
|
203
|
-
}
|
|
204
|
-
this.history.unshift({
|
|
205
|
-
prompt,
|
|
206
|
-
response: explanation,
|
|
207
|
-
timestamp: new Date(),
|
|
208
|
-
success: true,
|
|
209
|
-
});
|
|
210
|
-
return {
|
|
211
|
-
explanation,
|
|
212
|
-
workflow: modifiedWorkflow,
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
//# sourceMappingURL=AIService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AIService.js","sourceRoot":"","sources":["../../../src/server/services/AIService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { Server as SocketIOServer } from 'socket.io';
|
|
2
|
-
export declare class FileWatcher {
|
|
3
|
-
private watcher;
|
|
4
|
-
private io;
|
|
5
|
-
private baseDir;
|
|
6
|
-
constructor(baseDir: string, io: SocketIOServer);
|
|
7
|
-
private setupListeners;
|
|
8
|
-
stop(): void;
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=FileWatcher.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FileWatcher.d.ts","sourceRoot":"","sources":["../../../src/server/services/FileWatcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,WAAW,CAAC;AAG1D,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc;IAyB/C,OAAO,CAAC,cAAc;IAiCtB,IAAI;CAIL"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { watch } from 'chokidar';
|
|
2
|
-
export class FileWatcher {
|
|
3
|
-
watcher;
|
|
4
|
-
io;
|
|
5
|
-
baseDir;
|
|
6
|
-
constructor(baseDir, io) {
|
|
7
|
-
this.baseDir = baseDir;
|
|
8
|
-
this.io = io;
|
|
9
|
-
// Watch for workflow files
|
|
10
|
-
this.watcher = watch(['**/*.md', '**/*.yaml', '**/*.yml'], {
|
|
11
|
-
cwd: baseDir,
|
|
12
|
-
ignored: [
|
|
13
|
-
'**/node_modules/**',
|
|
14
|
-
'**/dist/**',
|
|
15
|
-
'**/.git/**',
|
|
16
|
-
'**/.*',
|
|
17
|
-
],
|
|
18
|
-
persistent: true,
|
|
19
|
-
ignoreInitial: true,
|
|
20
|
-
awaitWriteFinish: {
|
|
21
|
-
stabilityThreshold: 300,
|
|
22
|
-
pollInterval: 100,
|
|
23
|
-
},
|
|
24
|
-
});
|
|
25
|
-
this.setupListeners();
|
|
26
|
-
console.log(`File watcher started for: ${baseDir}`);
|
|
27
|
-
}
|
|
28
|
-
setupListeners() {
|
|
29
|
-
this.watcher.on('change', (path) => {
|
|
30
|
-
console.log(`File changed: ${path}`);
|
|
31
|
-
this.io.emit('workflow:updated', {
|
|
32
|
-
path,
|
|
33
|
-
event: 'change',
|
|
34
|
-
timestamp: new Date().toISOString(),
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
this.watcher.on('add', (path) => {
|
|
38
|
-
console.log(`File added: ${path}`);
|
|
39
|
-
this.io.emit('workflow:updated', {
|
|
40
|
-
path,
|
|
41
|
-
event: 'add',
|
|
42
|
-
timestamp: new Date().toISOString(),
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
this.watcher.on('unlink', (path) => {
|
|
46
|
-
console.log(`File removed: ${path}`);
|
|
47
|
-
this.io.emit('workflow:updated', {
|
|
48
|
-
path,
|
|
49
|
-
event: 'remove',
|
|
50
|
-
timestamp: new Date().toISOString(),
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
this.watcher.on('error', (error) => {
|
|
54
|
-
console.error('File watcher error:', error);
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
stop() {
|
|
58
|
-
this.watcher.close();
|
|
59
|
-
console.log('File watcher stopped');
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=FileWatcher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FileWatcher.js","sourceRoot":"","sources":["../../../src/server/services/FileWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,UAAU,CAAC;AAIjD,MAAM,OAAO,WAAW;IACd,OAAO,CAAY;IACnB,EAAE,CAAiB;IACnB,OAAO,CAAS;IAExB,YAAY,OAAe,EAAE,EAAkB;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QAEb,2BAA2B;QAC3B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE;YACzD,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE;gBACP,oBAAoB;gBACpB,YAAY;gBACZ,YAAY;gBACZ,OAAO;aACR;YACD,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE;gBAChB,kBAAkB,EAAE,GAAG;gBACvB,YAAY,EAAE,GAAG;aAClB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;YACjC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC/B,IAAI;gBACJ,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC/B,IAAI;gBACJ,KAAK,EAAE,KAAK;gBACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;YACjC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC/B,IAAI;gBACJ,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
interface WorkflowListItem {
|
|
2
|
-
path: string;
|
|
3
|
-
name: string;
|
|
4
|
-
description?: string;
|
|
5
|
-
version?: string;
|
|
6
|
-
}
|
|
7
|
-
interface WorkflowMetadata {
|
|
8
|
-
id: string;
|
|
9
|
-
name: string;
|
|
10
|
-
version?: string;
|
|
11
|
-
description?: string;
|
|
12
|
-
author?: string;
|
|
13
|
-
tags?: string[];
|
|
14
|
-
}
|
|
15
|
-
interface WorkflowStep {
|
|
16
|
-
id: string;
|
|
17
|
-
name?: string;
|
|
18
|
-
action?: string;
|
|
19
|
-
workflow?: string;
|
|
20
|
-
inputs: Record<string, unknown>;
|
|
21
|
-
outputVariable?: string;
|
|
22
|
-
conditions?: string[];
|
|
23
|
-
errorHandling?: {
|
|
24
|
-
action: 'stop' | 'continue' | 'retry';
|
|
25
|
-
maxRetries?: number;
|
|
26
|
-
retryDelay?: number;
|
|
27
|
-
fallbackStep?: string;
|
|
28
|
-
};
|
|
29
|
-
timeout?: number;
|
|
30
|
-
}
|
|
31
|
-
interface Workflow {
|
|
32
|
-
metadata: WorkflowMetadata;
|
|
33
|
-
steps: WorkflowStep[];
|
|
34
|
-
tools?: Record<string, unknown>;
|
|
35
|
-
inputs?: Record<string, unknown>;
|
|
36
|
-
triggers?: unknown[];
|
|
37
|
-
}
|
|
38
|
-
export declare class WorkflowService {
|
|
39
|
-
private workflowDir;
|
|
40
|
-
constructor(workflowDir?: string);
|
|
41
|
-
listWorkflows(): Promise<WorkflowListItem[]>;
|
|
42
|
-
getWorkflow(workflowPath: string): Promise<Workflow | null>;
|
|
43
|
-
createWorkflow(name: string, template?: string): Promise<WorkflowListItem>;
|
|
44
|
-
updateWorkflow(workflowPath: string, workflow: Workflow): Promise<Workflow>;
|
|
45
|
-
deleteWorkflow(workflowPath: string): Promise<void>;
|
|
46
|
-
getExecutionHistory(workflowPath: string): Promise<unknown[]>;
|
|
47
|
-
private resolvePath;
|
|
48
|
-
private parseWorkflow;
|
|
49
|
-
private parseStep;
|
|
50
|
-
private serializeWorkflow;
|
|
51
|
-
private generateWorkflowTemplate;
|
|
52
|
-
}
|
|
53
|
-
export {};
|
|
54
|
-
//# sourceMappingURL=WorkflowService.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowService.d.ts","sourceRoot":"","sources":["../../../src/server/services/WorkflowService.ts"],"names":[],"mappings":"AASA,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE;QACd,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;QACtC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,QAAQ;IAChB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,CAAC,EAAE,MAAM;IAI1B,aAAa,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA+C5C,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgB3D,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiB1E,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAkB3E,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAMnE,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,aAAa;IA0ErB,OAAO,CAAC,SAAS;IA8CjB,OAAO,CAAC,iBAAiB;IAyDzB,OAAO,CAAC,wBAAwB;CAmCjC"}
|