@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.
Files changed (165) hide show
  1. package/.turbo/turbo-build.log +26 -0
  2. package/.turbo/turbo-test.log +22 -0
  3. package/README.md +179 -0
  4. package/dist/client/assets/index-DwTI8opO.js +608 -0
  5. package/dist/client/assets/index-DwTI8opO.js.map +1 -0
  6. package/dist/client/assets/index-RoEdL6gO.css +1 -0
  7. package/dist/client/index.html +20 -0
  8. package/dist/client/vite.svg +9 -0
  9. package/dist/server/index.d.ts +3 -0
  10. package/dist/server/index.d.ts.map +1 -0
  11. package/dist/server/index.js +56 -0
  12. package/dist/server/index.js.map +1 -0
  13. package/dist/server/routes/ai.js +50 -0
  14. package/dist/server/routes/ai.js.map +1 -0
  15. package/dist/server/routes/execute.js +62 -0
  16. package/dist/server/routes/execute.js.map +1 -0
  17. package/dist/server/routes/workflows.js +99 -0
  18. package/dist/server/routes/workflows.js.map +1 -0
  19. package/dist/server/server/index.js +95 -0
  20. package/dist/server/server/index.js.map +1 -0
  21. package/dist/server/server/routes/ai.js +87 -0
  22. package/dist/server/server/routes/ai.js.map +1 -0
  23. package/dist/server/server/routes/execute.js +63 -0
  24. package/dist/server/server/routes/execute.js.map +1 -0
  25. package/dist/server/server/routes/tools.js +518 -0
  26. package/dist/server/server/routes/tools.js.map +1 -0
  27. package/dist/server/server/routes/workflows.js +99 -0
  28. package/dist/server/server/routes/workflows.js.map +1 -0
  29. package/dist/server/server/services/AIService.js +69 -0
  30. package/dist/server/server/services/AIService.js.map +1 -0
  31. package/dist/server/server/services/FileWatcher.js +60 -0
  32. package/dist/server/server/services/FileWatcher.js.map +1 -0
  33. package/dist/server/server/services/WorkflowService.js +363 -0
  34. package/dist/server/server/services/WorkflowService.js.map +1 -0
  35. package/dist/server/server/services/agents/claude-code-provider.js +250 -0
  36. package/dist/server/server/services/agents/claude-code-provider.js.map +1 -0
  37. package/dist/server/server/services/agents/claude-provider.js +204 -0
  38. package/dist/server/server/services/agents/claude-provider.js.map +1 -0
  39. package/dist/server/server/services/agents/copilot-provider.js +227 -0
  40. package/dist/server/server/services/agents/copilot-provider.js.map +1 -0
  41. package/dist/server/server/services/agents/demo-provider.js +167 -0
  42. package/dist/server/server/services/agents/demo-provider.js.map +1 -0
  43. package/dist/server/server/services/agents/index.js +31 -0
  44. package/dist/server/server/services/agents/index.js.map +1 -0
  45. package/dist/server/server/services/agents/ollama-provider.js +220 -0
  46. package/dist/server/server/services/agents/ollama-provider.js.map +1 -0
  47. package/dist/server/server/services/agents/prompts.js +436 -0
  48. package/dist/server/server/services/agents/prompts.js.map +1 -0
  49. package/dist/server/server/services/agents/registry.js +242 -0
  50. package/dist/server/server/services/agents/registry.js.map +1 -0
  51. package/dist/server/server/services/agents/types.js +6 -0
  52. package/dist/server/server/services/agents/types.js.map +1 -0
  53. package/dist/server/server/websocket/index.js +85 -0
  54. package/dist/server/server/websocket/index.js.map +1 -0
  55. package/dist/server/services/AIService.d.ts +30 -0
  56. package/dist/server/services/AIService.d.ts.map +1 -0
  57. package/dist/server/services/AIService.js +216 -0
  58. package/dist/server/services/AIService.js.map +1 -0
  59. package/dist/server/services/FileWatcher.d.ts +10 -0
  60. package/dist/server/services/FileWatcher.d.ts.map +1 -0
  61. package/dist/server/services/FileWatcher.js +62 -0
  62. package/dist/server/services/FileWatcher.js.map +1 -0
  63. package/dist/server/services/WorkflowService.d.ts +54 -0
  64. package/dist/server/services/WorkflowService.d.ts.map +1 -0
  65. package/dist/server/services/WorkflowService.js +323 -0
  66. package/dist/server/services/WorkflowService.js.map +1 -0
  67. package/dist/server/shared/constants.js +175 -0
  68. package/dist/server/shared/constants.js.map +1 -0
  69. package/dist/server/shared/types.js +3 -0
  70. package/dist/server/shared/types.js.map +1 -0
  71. package/dist/server/websocket/index.d.ts +10 -0
  72. package/dist/server/websocket/index.d.ts.map +1 -0
  73. package/dist/server/websocket/index.js +85 -0
  74. package/dist/server/websocket/index.js.map +1 -0
  75. package/index.html +19 -0
  76. package/package.json +96 -0
  77. package/playwright.config.ts +27 -0
  78. package/postcss.config.js +6 -0
  79. package/public/vite.svg +9 -0
  80. package/src/client/App.tsx +520 -0
  81. package/src/client/components/Canvas/Canvas.tsx +405 -0
  82. package/src/client/components/Canvas/ExecutionOverlay.tsx +847 -0
  83. package/src/client/components/Canvas/NodeContextMenu.tsx +188 -0
  84. package/src/client/components/Canvas/OutputNode.tsx +111 -0
  85. package/src/client/components/Canvas/StepNode.tsx +106 -0
  86. package/src/client/components/Canvas/SubWorkflowNode.tsx +141 -0
  87. package/src/client/components/Canvas/Toolbar.tsx +189 -0
  88. package/src/client/components/Canvas/TriggerNode.tsx +128 -0
  89. package/src/client/components/Editor/InputsEditor.tsx +458 -0
  90. package/src/client/components/Editor/NewStepWizard.tsx +344 -0
  91. package/src/client/components/Editor/StepEditor.tsx +532 -0
  92. package/src/client/components/Editor/YamlEditor.tsx +160 -0
  93. package/src/client/components/Panels/PropertiesPanel.tsx +589 -0
  94. package/src/client/components/Prompt/ChangePreview.tsx +281 -0
  95. package/src/client/components/Prompt/PromptHistoryPanel.tsx +209 -0
  96. package/src/client/components/Prompt/PromptInput.tsx +108 -0
  97. package/src/client/components/Sidebar/Sidebar.tsx +343 -0
  98. package/src/client/components/common/Breadcrumb.tsx +40 -0
  99. package/src/client/components/common/Button.tsx +68 -0
  100. package/src/client/components/common/ContextMenu.tsx +202 -0
  101. package/src/client/components/common/KeyboardShortcuts.tsx +143 -0
  102. package/src/client/components/common/Modal.tsx +93 -0
  103. package/src/client/components/common/Tabs.tsx +57 -0
  104. package/src/client/components/common/ThemeToggle.tsx +63 -0
  105. package/src/client/components/index.ts +32 -0
  106. package/src/client/hooks/index.ts +4 -0
  107. package/src/client/hooks/useAIPrompt.ts +108 -0
  108. package/src/client/hooks/useCanvas.ts +247 -0
  109. package/src/client/hooks/useWebSocket.ts +164 -0
  110. package/src/client/hooks/useWorkflow.ts +138 -0
  111. package/src/client/main.tsx +10 -0
  112. package/src/client/stores/canvasStore.ts +348 -0
  113. package/src/client/stores/editorStore.ts +133 -0
  114. package/src/client/stores/executionStore.ts +440 -0
  115. package/src/client/stores/index.ts +4 -0
  116. package/src/client/stores/layoutStore.ts +103 -0
  117. package/src/client/stores/navigationStore.ts +49 -0
  118. package/src/client/stores/promptStore.ts +113 -0
  119. package/src/client/stores/themeStore.ts +75 -0
  120. package/src/client/stores/workflowStore.ts +177 -0
  121. package/src/client/styles/globals.css +346 -0
  122. package/src/client/utils/cn.ts +9 -0
  123. package/src/client/utils/index.ts +4 -0
  124. package/src/client/utils/serviceIcons.tsx +64 -0
  125. package/src/client/utils/stepValidation.ts +155 -0
  126. package/src/client/utils/workflowToGraph.ts +299 -0
  127. package/src/server/index.ts +114 -0
  128. package/src/server/routes/ai.ts +91 -0
  129. package/src/server/routes/execute.ts +71 -0
  130. package/src/server/routes/tools.ts +564 -0
  131. package/src/server/routes/workflows.ts +106 -0
  132. package/src/server/services/AIService.ts +105 -0
  133. package/src/server/services/FileWatcher.ts +69 -0
  134. package/src/server/services/WorkflowService.ts +441 -0
  135. package/src/server/services/agents/claude-code-provider.ts +320 -0
  136. package/src/server/services/agents/claude-provider.ts +248 -0
  137. package/src/server/services/agents/copilot-provider.ts +311 -0
  138. package/src/server/services/agents/demo-provider.ts +184 -0
  139. package/src/server/services/agents/index.ts +31 -0
  140. package/src/server/services/agents/ollama-provider.ts +267 -0
  141. package/src/server/services/agents/prompts.ts +482 -0
  142. package/src/server/services/agents/registry.ts +289 -0
  143. package/src/server/services/agents/types.ts +146 -0
  144. package/src/server/websocket/index.ts +104 -0
  145. package/src/shared/constants.ts +180 -0
  146. package/src/shared/types.ts +179 -0
  147. package/tailwind.config.ts +73 -0
  148. package/tests/e2e/app.spec.ts +90 -0
  149. package/tests/e2e/canvas.spec.ts +128 -0
  150. package/tests/e2e/workflow.spec.ts +185 -0
  151. package/tests/integration/api.test.ts +250 -0
  152. package/tests/integration/testApp.ts +31 -0
  153. package/tests/setup.ts +37 -0
  154. package/tests/unit/canvasStore.test.ts +502 -0
  155. package/tests/unit/components.test.tsx +151 -0
  156. package/tests/unit/executionStore.test.ts +527 -0
  157. package/tests/unit/layoutStore.test.ts +194 -0
  158. package/tests/unit/navigationStore.test.ts +152 -0
  159. package/tests/unit/stepValidation.test.ts +226 -0
  160. package/tests/unit/themeStore.test.ts +141 -0
  161. package/tests/unit/workflowToGraph.test.ts +289 -0
  162. package/tsconfig.json +29 -0
  163. package/tsconfig.server.json +28 -0
  164. package/vite.config.ts +31 -0
  165. package/vitest.config.ts +26 -0
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Agent Provider Registry
3
+ * Manages all available AI agent providers and provides a unified interface
4
+ */
5
+ import { createClaudeProvider } from './claude-provider.js';
6
+ import { createClaudeCodeProvider } from './claude-code-provider.js';
7
+ import { createCopilotProvider } from './copilot-provider.js';
8
+ import { createDemoProvider } from './demo-provider.js';
9
+ import { createOllamaProvider } from './ollama-provider.js';
10
+ /**
11
+ * Registry of all available agent providers
12
+ */
13
+ export class AgentRegistry {
14
+ providers = new Map();
15
+ activeProviderId = 'demo';
16
+ history = [];
17
+ constructor() {
18
+ // Register built-in providers
19
+ // SDK-based providers with automatic CLI authentication (recommended)
20
+ this.registerProvider({
21
+ id: 'claude-code',
22
+ name: 'Claude Code (SDK)',
23
+ factory: createClaudeCodeProvider,
24
+ });
25
+ this.registerProvider({
26
+ id: 'copilot',
27
+ name: 'GitHub Copilot (SDK)',
28
+ factory: createCopilotProvider,
29
+ });
30
+ // API key-based providers
31
+ this.registerProvider({
32
+ id: 'claude',
33
+ name: 'Claude (API Key)',
34
+ factory: createClaudeProvider,
35
+ });
36
+ // Local providers
37
+ this.registerProvider({
38
+ id: 'ollama',
39
+ name: 'Ollama (Local)',
40
+ factory: createOllamaProvider,
41
+ });
42
+ // Demo mode (always available)
43
+ this.registerProvider({
44
+ id: 'demo',
45
+ name: 'Demo Mode',
46
+ factory: createDemoProvider,
47
+ });
48
+ }
49
+ /**
50
+ * Register a new provider
51
+ */
52
+ registerProvider(entry) {
53
+ const provider = entry.factory(entry.defaultConfig);
54
+ this.providers.set(entry.id, provider);
55
+ }
56
+ /**
57
+ * Get all registered providers
58
+ */
59
+ getProviders() {
60
+ return Array.from(this.providers.entries()).map(([id, provider]) => ({
61
+ id,
62
+ name: provider.name,
63
+ ready: provider.isReady(),
64
+ }));
65
+ }
66
+ /**
67
+ * Get a specific provider
68
+ */
69
+ getProvider(id) {
70
+ return this.providers.get(id);
71
+ }
72
+ /**
73
+ * Get the active provider
74
+ */
75
+ getActiveProvider() {
76
+ return this.providers.get(this.activeProviderId) || this.providers.get('demo');
77
+ }
78
+ /**
79
+ * Set the active provider
80
+ */
81
+ async setActiveProvider(id, config) {
82
+ const provider = this.providers.get(id);
83
+ if (!provider) {
84
+ return false;
85
+ }
86
+ if (config) {
87
+ await provider.initialize(config);
88
+ }
89
+ if (provider.isReady()) {
90
+ this.activeProviderId = id;
91
+ return true;
92
+ }
93
+ return false;
94
+ }
95
+ /**
96
+ * Get the active provider ID
97
+ */
98
+ getActiveProviderId() {
99
+ return this.activeProviderId;
100
+ }
101
+ /**
102
+ * Auto-detect and set the best available provider
103
+ * Priority: SDK-based (auto-auth) > API key-based > Local > Demo
104
+ */
105
+ async autoDetectProvider() {
106
+ // Try Claude Code SDK first (uses automatic CLI authentication)
107
+ const claudeCodeProvider = this.providers.get('claude-code');
108
+ if (claudeCodeProvider) {
109
+ await claudeCodeProvider.initialize({
110
+ options: {
111
+ cwd: process.cwd(),
112
+ },
113
+ });
114
+ if (claudeCodeProvider.isReady()) {
115
+ this.activeProviderId = 'claude-code';
116
+ return 'claude-code';
117
+ }
118
+ }
119
+ // Try GitHub Copilot SDK (uses automatic CLI authentication)
120
+ const copilotProvider = this.providers.get('copilot');
121
+ if (copilotProvider) {
122
+ await copilotProvider.initialize({
123
+ baseUrl: process.env.COPILOT_CLI_URL,
124
+ options: {
125
+ cliPath: process.env.COPILOT_CLI_PATH,
126
+ },
127
+ });
128
+ if (copilotProvider.isReady()) {
129
+ this.activeProviderId = 'copilot';
130
+ return 'copilot';
131
+ }
132
+ }
133
+ // Try Claude with API key (requires ANTHROPIC_API_KEY)
134
+ const claudeProvider = this.providers.get('claude');
135
+ if (claudeProvider) {
136
+ await claudeProvider.initialize({
137
+ apiKey: process.env.ANTHROPIC_API_KEY,
138
+ });
139
+ if (claudeProvider.isReady()) {
140
+ this.activeProviderId = 'claude';
141
+ return 'claude';
142
+ }
143
+ }
144
+ // Try Ollama (if running locally)
145
+ const ollamaProvider = this.providers.get('ollama');
146
+ if (ollamaProvider) {
147
+ await ollamaProvider.initialize({
148
+ baseUrl: process.env.OLLAMA_BASE_URL || 'http://localhost:11434',
149
+ });
150
+ if (ollamaProvider.isReady()) {
151
+ this.activeProviderId = 'ollama';
152
+ return 'ollama';
153
+ }
154
+ }
155
+ // Fall back to demo mode
156
+ this.activeProviderId = 'demo';
157
+ return 'demo';
158
+ }
159
+ /**
160
+ * Process a prompt using the active provider
161
+ */
162
+ async processPrompt(prompt, workflow) {
163
+ const provider = this.getActiveProvider();
164
+ const result = await provider.processPrompt(prompt, workflow);
165
+ // Record in history
166
+ this.history.unshift({
167
+ prompt,
168
+ response: result.explanation,
169
+ timestamp: new Date(),
170
+ success: !result.error,
171
+ provider: provider.id,
172
+ });
173
+ // Keep only last 50 items
174
+ if (this.history.length > 50) {
175
+ this.history = this.history.slice(0, 50);
176
+ }
177
+ return result;
178
+ }
179
+ /**
180
+ * Get suggestions using the active provider
181
+ */
182
+ async getSuggestions(workflow, selectedStepId) {
183
+ const provider = this.getActiveProvider();
184
+ return provider.getSuggestions(workflow, selectedStepId);
185
+ }
186
+ /**
187
+ * Stream a prompt using the active provider (if supported)
188
+ */
189
+ async streamPrompt(prompt, workflow, onChunk) {
190
+ const provider = this.getActiveProvider();
191
+ if (provider.streamPrompt) {
192
+ const result = await provider.streamPrompt(prompt, workflow, onChunk);
193
+ this.history.unshift({
194
+ prompt,
195
+ response: result.explanation,
196
+ timestamp: new Date(),
197
+ success: !result.error,
198
+ provider: provider.id,
199
+ });
200
+ return result;
201
+ }
202
+ // Fall back to non-streaming
203
+ return this.processPrompt(prompt, workflow);
204
+ }
205
+ /**
206
+ * Get prompt history
207
+ */
208
+ getHistory(limit = 20) {
209
+ return this.history.slice(0, limit);
210
+ }
211
+ /**
212
+ * Clear history
213
+ */
214
+ clearHistory() {
215
+ this.history = [];
216
+ }
217
+ /**
218
+ * Get provider status
219
+ */
220
+ getStatus() {
221
+ return {
222
+ activeProvider: this.activeProviderId,
223
+ providers: Array.from(this.providers.entries()).map(([id, provider]) => ({
224
+ id,
225
+ name: provider.name,
226
+ ...provider.getStatus(),
227
+ })),
228
+ };
229
+ }
230
+ }
231
+ // Singleton instance
232
+ let registryInstance = null;
233
+ export function getAgentRegistry() {
234
+ if (!registryInstance) {
235
+ registryInstance = new AgentRegistry();
236
+ }
237
+ return registryInstance;
238
+ }
239
+ export function createAgentRegistry() {
240
+ return new AgentRegistry();
241
+ }
242
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Abstract types for AI agent providers
3
+ * Allows the GUI to work with any agent backend (Claude, OpenCode, Ollama, etc.)
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,85 @@
1
+ const clients = new Map();
2
+ export function setupWebSocket(io) {
3
+ io.on('connection', (socket) => {
4
+ console.log(`Client connected: ${socket.id}`);
5
+ // Initialize client state
6
+ clients.set(socket.id, {
7
+ subscribedWorkflows: new Set(),
8
+ subscribedExecutions: new Set(),
9
+ });
10
+ // Handle workflow subscription
11
+ socket.on('workflow:subscribe', (workflowPath) => {
12
+ const state = clients.get(socket.id);
13
+ if (state) {
14
+ state.subscribedWorkflows.add(workflowPath);
15
+ socket.join(`workflow:${workflowPath}`);
16
+ console.log(`Client ${socket.id} subscribed to workflow: ${workflowPath}`);
17
+ }
18
+ });
19
+ socket.on('workflow:unsubscribe', (workflowPath) => {
20
+ const state = clients.get(socket.id);
21
+ if (state) {
22
+ state.subscribedWorkflows.delete(workflowPath);
23
+ socket.leave(`workflow:${workflowPath}`);
24
+ }
25
+ });
26
+ // Handle execution subscription
27
+ socket.on('execution:subscribe', (runId) => {
28
+ const state = clients.get(socket.id);
29
+ if (state) {
30
+ state.subscribedExecutions.add(runId);
31
+ socket.join(`execution:${runId}`);
32
+ console.log(`Client ${socket.id} subscribed to execution: ${runId}`);
33
+ }
34
+ });
35
+ socket.on('execution:unsubscribe', (runId) => {
36
+ const state = clients.get(socket.id);
37
+ if (state) {
38
+ state.subscribedExecutions.delete(runId);
39
+ socket.leave(`execution:${runId}`);
40
+ }
41
+ });
42
+ // Handle disconnect
43
+ socket.on('disconnect', () => {
44
+ console.log(`Client disconnected: ${socket.id}`);
45
+ clients.delete(socket.id);
46
+ });
47
+ });
48
+ // Helper functions to emit events
49
+ return {
50
+ // Emit to all clients subscribed to a workflow
51
+ emitWorkflowUpdate(workflowPath, data) {
52
+ io.to(`workflow:${workflowPath}`).emit('workflow:updated', {
53
+ path: workflowPath,
54
+ ...data,
55
+ });
56
+ },
57
+ // Emit execution step update
58
+ emitExecutionStep(runId, data) {
59
+ io.to(`execution:${runId}`).emit('execution:step', {
60
+ runId,
61
+ ...data,
62
+ });
63
+ },
64
+ // Emit execution completed
65
+ emitExecutionCompleted(runId, data) {
66
+ io.to(`execution:${runId}`).emit('execution:completed', {
67
+ runId,
68
+ ...data,
69
+ });
70
+ },
71
+ // Emit AI processing status
72
+ emitAIProcessing(socketId, processing) {
73
+ io.to(socketId).emit('ai:processing', { processing });
74
+ },
75
+ // Emit AI response
76
+ emitAIResponse(socketId, response) {
77
+ io.to(socketId).emit('ai:response', response);
78
+ },
79
+ // Broadcast to all clients
80
+ broadcast(event, data) {
81
+ io.emit(event, data);
82
+ },
83
+ };
84
+ }
85
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/websocket/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ interface Workflow {
2
+ metadata: any;
3
+ steps: any[];
4
+ tools?: Record<string, any>;
5
+ inputs?: Record<string, any>;
6
+ }
7
+ interface PromptResult {
8
+ explanation: string;
9
+ workflow?: Workflow;
10
+ diff?: string;
11
+ }
12
+ interface PromptHistoryItem {
13
+ prompt: string;
14
+ response: string;
15
+ timestamp: Date;
16
+ success: boolean;
17
+ }
18
+ export declare class AIService {
19
+ private history;
20
+ private anthropic;
21
+ constructor();
22
+ processPrompt(prompt: string, workflow: Workflow): Promise<PromptResult>;
23
+ private parseAIResponse;
24
+ private generateDiff;
25
+ getHistory(): Promise<PromptHistoryItem[]>;
26
+ getSuggestions(workflow: Workflow, selectedStepId?: string): Promise<string[]>;
27
+ private simulateResponse;
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=AIService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIService.d.ts","sourceRoot":"","sources":["../../../src/server/services/AIService.ts"],"names":[],"mappings":"AAGA,UAAU,QAAQ;IAChB,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAyBD,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,SAAS,CAA0B;;IASrC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAkD9E,OAAO,CAAC,eAAe;IAoCvB,OAAO,CAAC,YAAY;IAkBd,UAAU,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAI1C,cAAc,CAClB,QAAQ,EAAE,QAAQ,EAClB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,EAAE,CAAC;IAmCpB,OAAO,CAAC,gBAAgB;CA6DzB"}
@@ -0,0 +1,216 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIService.js","sourceRoot":"","sources":["../../../src/server/services/AIService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
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
@@ -0,0 +1 @@
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"}