@marktoflow/gui 2.0.0-alpha.5 → 2.0.2

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 (162) hide show
  1. package/README.md +48 -180
  2. package/dist/client/assets/index-DQeR1ew6.css +1 -0
  3. package/dist/client/assets/index-LbIVPHbD.js +833 -0
  4. package/dist/client/assets/index-LbIVPHbD.js.map +1 -0
  5. package/dist/client/index.html +2 -2
  6. package/dist/client/marktoflow-logo.png +0 -0
  7. package/dist/server/index.js +31 -5
  8. package/dist/server/index.js.map +1 -1
  9. package/dist/server/routes/admin.js +95 -0
  10. package/dist/server/routes/admin.js.map +1 -0
  11. package/dist/server/routes/ai.js +2 -2
  12. package/dist/server/routes/ai.js.map +1 -1
  13. package/dist/server/routes/collaboration.js +104 -0
  14. package/dist/server/routes/collaboration.js.map +1 -0
  15. package/dist/server/routes/execute.js +181 -14
  16. package/dist/server/routes/execute.js.map +1 -1
  17. package/dist/server/routes/form.js +160 -0
  18. package/dist/server/routes/form.js.map +1 -0
  19. package/dist/server/routes/settings.js +90 -0
  20. package/dist/server/routes/settings.js.map +1 -0
  21. package/dist/server/routes/templates.js +106 -0
  22. package/dist/server/routes/templates.js.map +1 -0
  23. package/dist/server/routes/versions.js +101 -0
  24. package/dist/server/routes/versions.js.map +1 -0
  25. package/dist/server/services/AIService.js +85 -2
  26. package/dist/server/services/AIService.js.map +1 -1
  27. package/dist/server/services/ExecutionManager.js +571 -0
  28. package/dist/server/services/ExecutionManager.js.map +1 -0
  29. package/dist/server/services/VersionService.js +65 -0
  30. package/dist/server/services/VersionService.js.map +1 -0
  31. package/dist/server/services/WorkflowService.js +8 -2
  32. package/dist/server/services/WorkflowService.js.map +1 -1
  33. package/dist/server/services/agents/copilot-provider.js +32 -0
  34. package/dist/server/services/agents/copilot-provider.js.map +1 -1
  35. package/dist/server/websocket/index.js +42 -0
  36. package/dist/server/websocket/index.js.map +1 -1
  37. package/dist/shared/constants.js +9 -0
  38. package/dist/shared/constants.js.map +1 -1
  39. package/dist/shared/settings.js +51 -0
  40. package/dist/shared/settings.js.map +1 -0
  41. package/package.json +14 -10
  42. package/public/marktoflow-logo.png +0 -0
  43. package/tests/integration/fixtures/test-workflow.md +6 -0
  44. package/.turbo/turbo-build.log +0 -42
  45. package/dist/client/assets/index-CM44OayM.js +0 -704
  46. package/dist/client/assets/index-CM44OayM.js.map +0 -1
  47. package/dist/client/assets/index-Dru63gi6.css +0 -1
  48. package/marktoflow-gui-2.0.0-alpha.5.tgz +0 -0
  49. package/playwright.config.ts +0 -27
  50. package/postcss.config.js +0 -6
  51. package/src/client/App.tsx +0 -520
  52. package/src/client/components/Canvas/Canvas.tsx +0 -425
  53. package/src/client/components/Canvas/ExecutionOverlay.tsx +0 -935
  54. package/src/client/components/Canvas/ForEachNode.tsx +0 -152
  55. package/src/client/components/Canvas/IfElseNode.tsx +0 -141
  56. package/src/client/components/Canvas/NodeContextMenu.tsx +0 -192
  57. package/src/client/components/Canvas/OutputNode.tsx +0 -111
  58. package/src/client/components/Canvas/ParallelNode.tsx +0 -157
  59. package/src/client/components/Canvas/StepNode.tsx +0 -106
  60. package/src/client/components/Canvas/SubWorkflowNode.tsx +0 -141
  61. package/src/client/components/Canvas/SwitchNode.tsx +0 -185
  62. package/src/client/components/Canvas/Toolbar.tsx +0 -227
  63. package/src/client/components/Canvas/TransformNode.tsx +0 -194
  64. package/src/client/components/Canvas/TriggerNode.tsx +0 -128
  65. package/src/client/components/Canvas/TryCatchNode.tsx +0 -164
  66. package/src/client/components/Canvas/WhileNode.tsx +0 -161
  67. package/src/client/components/Canvas/index.ts +0 -24
  68. package/src/client/components/Debug/VariableInspector.tsx +0 -148
  69. package/src/client/components/Editor/InputsEditor.tsx +0 -458
  70. package/src/client/components/Editor/NewStepWizard.tsx +0 -344
  71. package/src/client/components/Editor/StepEditor.tsx +0 -532
  72. package/src/client/components/Editor/YamlEditor.tsx +0 -160
  73. package/src/client/components/Panels/PropertiesPanel.tsx +0 -589
  74. package/src/client/components/Prompt/ChangePreview.tsx +0 -281
  75. package/src/client/components/Prompt/PromptHistoryPanel.tsx +0 -209
  76. package/src/client/components/Prompt/PromptInput.tsx +0 -110
  77. package/src/client/components/Settings/ProviderSwitcher.tsx +0 -228
  78. package/src/client/components/Sidebar/ImportDialog.tsx +0 -257
  79. package/src/client/components/Sidebar/Sidebar.tsx +0 -362
  80. package/src/client/components/common/Breadcrumb.tsx +0 -40
  81. package/src/client/components/common/Button.tsx +0 -68
  82. package/src/client/components/common/ContextMenu.tsx +0 -202
  83. package/src/client/components/common/KeyboardShortcuts.tsx +0 -149
  84. package/src/client/components/common/Modal.tsx +0 -93
  85. package/src/client/components/common/Tabs.tsx +0 -57
  86. package/src/client/components/common/ThemeToggle.tsx +0 -63
  87. package/src/client/components/index.ts +0 -32
  88. package/src/client/hooks/index.ts +0 -4
  89. package/src/client/hooks/useAIPrompt.ts +0 -108
  90. package/src/client/hooks/useCanvas.ts +0 -247
  91. package/src/client/hooks/useWebSocket.ts +0 -164
  92. package/src/client/hooks/useWorkflow.ts +0 -138
  93. package/src/client/main.tsx +0 -10
  94. package/src/client/stores/agentStore.ts +0 -109
  95. package/src/client/stores/canvasStore.ts +0 -348
  96. package/src/client/stores/editorStore.ts +0 -133
  97. package/src/client/stores/executionStore.ts +0 -502
  98. package/src/client/stores/index.ts +0 -4
  99. package/src/client/stores/layoutStore.ts +0 -103
  100. package/src/client/stores/navigationStore.ts +0 -49
  101. package/src/client/stores/promptStore.ts +0 -113
  102. package/src/client/stores/themeStore.ts +0 -75
  103. package/src/client/stores/workflowStore.ts +0 -185
  104. package/src/client/styles/globals.css +0 -452
  105. package/src/client/utils/cn.ts +0 -9
  106. package/src/client/utils/index.ts +0 -4
  107. package/src/client/utils/platform.ts +0 -46
  108. package/src/client/utils/serviceIcons.tsx +0 -97
  109. package/src/client/utils/stepValidation.ts +0 -155
  110. package/src/client/utils/workflowToGraph.ts +0 -523
  111. package/src/server/index.ts +0 -137
  112. package/src/server/routes/ai.ts +0 -91
  113. package/src/server/routes/execute.ts +0 -71
  114. package/src/server/routes/executions.ts +0 -136
  115. package/src/server/routes/tools.ts +0 -970
  116. package/src/server/routes/workflows.ts +0 -147
  117. package/src/server/services/AIService.ts +0 -105
  118. package/src/server/services/FileWatcher.ts +0 -69
  119. package/src/server/services/WorkflowService.ts +0 -601
  120. package/src/server/services/agents/claude-code-provider.ts +0 -320
  121. package/src/server/services/agents/claude-provider.ts +0 -248
  122. package/src/server/services/agents/codex-provider.ts +0 -398
  123. package/src/server/services/agents/copilot-provider.ts +0 -311
  124. package/src/server/services/agents/demo-provider.ts +0 -184
  125. package/src/server/services/agents/index.ts +0 -31
  126. package/src/server/services/agents/ollama-provider.ts +0 -267
  127. package/src/server/services/agents/prompts.ts +0 -509
  128. package/src/server/services/agents/registry.ts +0 -310
  129. package/src/server/services/agents/types.ts +0 -146
  130. package/src/server/websocket/index.ts +0 -117
  131. package/src/shared/constants.ts +0 -180
  132. package/src/shared/types.ts +0 -179
  133. package/tailwind.config.ts +0 -73
  134. package/tests/e2e/app.spec.ts +0 -90
  135. package/tests/e2e/canvas.spec.ts +0 -128
  136. package/tests/e2e/workflow.spec.ts +0 -185
  137. package/tests/integration/api.test.ts +0 -452
  138. package/tests/integration/testApp.ts +0 -31
  139. package/tests/setup.ts +0 -72
  140. package/tests/unit/ForEachNode.test.tsx +0 -308
  141. package/tests/unit/IfElseNode.test.tsx +0 -235
  142. package/tests/unit/ParallelNode.test.tsx +0 -344
  143. package/tests/unit/SwitchNode.test.tsx +0 -327
  144. package/tests/unit/TransformNode.test.tsx +0 -386
  145. package/tests/unit/TryCatchNode.test.tsx +0 -243
  146. package/tests/unit/WhileNode.test.tsx +0 -230
  147. package/tests/unit/agentStore.test.ts +0 -218
  148. package/tests/unit/canvasStore.test.ts +0 -502
  149. package/tests/unit/codexProvider.test.ts +0 -399
  150. package/tests/unit/components.test.tsx +0 -151
  151. package/tests/unit/executionStore.test.ts +0 -567
  152. package/tests/unit/layoutStore.test.ts +0 -194
  153. package/tests/unit/navigationStore.test.ts +0 -152
  154. package/tests/unit/platform.test.ts +0 -118
  155. package/tests/unit/serviceIcons.test.ts +0 -197
  156. package/tests/unit/stepValidation.test.ts +0 -226
  157. package/tests/unit/themeStore.test.ts +0 -141
  158. package/tests/unit/workflowToGraph.test.ts +0 -311
  159. package/tsconfig.json +0 -29
  160. package/tsconfig.server.json +0 -28
  161. package/vite.config.ts +0 -31
  162. package/vitest.config.ts +0 -26
@@ -0,0 +1,571 @@
1
+ /**
2
+ * ExecutionManager service for managing workflow executions in the GUI
3
+ *
4
+ * Tracks active executions, provides cancellation support, and integrates
5
+ * with StateStore for persistence and Socket.IO for real-time updates.
6
+ */
7
+ import { parseFile, WorkflowEngine, SDKRegistry, createSDKStepExecutor, WorkflowStatus, StepStatus, CoreInitializer, WorkflowInitializer, } from '@marktoflow/core';
8
+ // ============================================================================
9
+ // ExecutionManager Implementation
10
+ // ============================================================================
11
+ export class ExecutionManager {
12
+ activeExecutions = new Map();
13
+ stateStore;
14
+ wsEmitter;
15
+ constructor(stateStore, wsEmitter = null, _workflowDir = process.cwd() // eslint-disable-line @typescript-eslint/no-unused-vars
16
+ ) {
17
+ this.stateStore = stateStore;
18
+ this.wsEmitter = wsEmitter;
19
+ }
20
+ /**
21
+ * Start a new workflow execution
22
+ */
23
+ async startExecution(workflowPath, inputs = {}) {
24
+ const runId = `run-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
25
+ const abortController = new AbortController();
26
+ // Parse the workflow
27
+ const { workflow } = await parseFile(workflowPath);
28
+ // Create execution record in state store
29
+ this.stateStore.createExecution({
30
+ runId,
31
+ workflowId: workflow.metadata.id,
32
+ workflowPath,
33
+ status: WorkflowStatus.RUNNING,
34
+ startedAt: new Date(),
35
+ completedAt: null,
36
+ currentStep: 0,
37
+ totalSteps: workflow.steps.length,
38
+ inputs,
39
+ outputs: null,
40
+ error: null,
41
+ metadata: null,
42
+ });
43
+ // Create workflow engine with callbacks
44
+ const engine = new WorkflowEngine({}, {
45
+ onStepStart: (step) => {
46
+ const active = this.activeExecutions.get(runId);
47
+ if (active) {
48
+ const stepIndex = workflow.steps.findIndex(s => s.id === step.id);
49
+ active.currentStep = stepIndex + 1;
50
+ // Update state store (protected in case db is closed during cleanup)
51
+ try {
52
+ this.stateStore.updateExecution(runId, {
53
+ currentStep: stepIndex + 1,
54
+ });
55
+ // Save checkpoint
56
+ this.stateStore.saveCheckpoint({
57
+ runId,
58
+ stepIndex,
59
+ stepName: step.id,
60
+ status: StepStatus.RUNNING,
61
+ startedAt: new Date(),
62
+ completedAt: null,
63
+ inputs: step.inputs,
64
+ outputs: null,
65
+ error: null,
66
+ retryCount: 0,
67
+ });
68
+ }
69
+ catch {
70
+ // Database may be closed during test cleanup, ignore
71
+ }
72
+ // Emit via WebSocket
73
+ if (this.wsEmitter) {
74
+ this.wsEmitter.emitExecutionStep(runId, {
75
+ stepId: step.id,
76
+ stepIndex,
77
+ status: 'running',
78
+ action: step.action,
79
+ });
80
+ }
81
+ }
82
+ },
83
+ onStepComplete: (step, result) => {
84
+ const active = this.activeExecutions.get(runId);
85
+ if (active) {
86
+ const stepIndex = workflow.steps.findIndex(s => s.id === step.id);
87
+ // Update checkpoint (protected in case db is closed during cleanup)
88
+ try {
89
+ this.stateStore.saveCheckpoint({
90
+ runId,
91
+ stepIndex,
92
+ stepName: step.id,
93
+ status: result.status,
94
+ startedAt: new Date(Date.now() - (result.duration || 0)),
95
+ completedAt: new Date(),
96
+ inputs: step.inputs,
97
+ outputs: result.output,
98
+ error: result.error ? String(result.error) : null,
99
+ retryCount: result.retryCount || 0,
100
+ });
101
+ }
102
+ catch {
103
+ // Database may be closed during test cleanup, ignore
104
+ }
105
+ // Emit via WebSocket
106
+ if (this.wsEmitter) {
107
+ this.wsEmitter.emitExecutionStep(runId, {
108
+ stepId: step.id,
109
+ stepIndex,
110
+ status: result.status,
111
+ duration: result.duration,
112
+ output: result.output,
113
+ error: result.error,
114
+ });
115
+ }
116
+ }
117
+ },
118
+ });
119
+ // Track active execution
120
+ const activeExecution = {
121
+ runId,
122
+ workflowPath,
123
+ workflowId: workflow.metadata.id,
124
+ startedAt: new Date(),
125
+ status: 'running',
126
+ currentStep: 0,
127
+ totalSteps: workflow.steps.length,
128
+ abortController,
129
+ engine,
130
+ };
131
+ this.activeExecutions.set(runId, activeExecution);
132
+ // Emit execution started
133
+ if (this.wsEmitter) {
134
+ this.wsEmitter.emitExecutionStarted(runId, {
135
+ workflowPath,
136
+ workflowId: workflow.metadata.id,
137
+ workflowName: workflow.metadata.name,
138
+ totalSteps: workflow.steps.length,
139
+ inputs,
140
+ });
141
+ }
142
+ // Execute workflow asynchronously
143
+ this.executeWorkflowAsync(runId, workflow, inputs, engine);
144
+ return runId;
145
+ }
146
+ /**
147
+ * Execute workflow asynchronously (non-blocking)
148
+ */
149
+ async executeWorkflowAsync(runId, workflow, inputs, engine) {
150
+ console.log(`[ExecutionManager] Starting async execution for ${runId}`);
151
+ console.log(`[ExecutionManager] Workflow: ${workflow.metadata.name} (${workflow.steps.length} steps)`);
152
+ console.log(`[ExecutionManager] Inputs:`, JSON.stringify(inputs, null, 2));
153
+ try {
154
+ // Set up SDK registry
155
+ const registry = new SDKRegistry();
156
+ // Always register core built-in tools (they don't require external dependencies)
157
+ registry.registerInitializer('core', CoreInitializer);
158
+ registry.registerInitializer('workflow', WorkflowInitializer);
159
+ // Dynamically import and register integrations
160
+ try {
161
+ console.log('[ExecutionManager] Loading integrations...');
162
+ // Use direct dynamic import - works better with tsx and TypeScript
163
+ const integrationsModule = await import('@marktoflow/integrations');
164
+ if (integrationsModule.registerIntegrations) {
165
+ integrationsModule.registerIntegrations(registry);
166
+ console.log('[ExecutionManager] Integrations registered');
167
+ }
168
+ }
169
+ catch (error) {
170
+ // @marktoflow/integrations may not be available in all environments
171
+ // Continue without it - core tools will still work
172
+ console.error('[ExecutionManager] Failed to load integrations:', error);
173
+ console.log('[ExecutionManager] Continuing with core tools only');
174
+ }
175
+ console.log('[ExecutionManager] Registering workflow tools:', Object.keys(workflow.tools || {}));
176
+ registry.registerTools(workflow.tools);
177
+ console.log('[ExecutionManager] Starting workflow execution...');
178
+ // Execute workflow
179
+ const result = await engine.execute(workflow, inputs, registry, createSDKStepExecutor());
180
+ console.log('[ExecutionManager] Workflow execution completed:', result.status);
181
+ if (result.error) {
182
+ console.error('[ExecutionManager] Workflow error:', result.error);
183
+ }
184
+ // Update state store first (before marking as complete, to avoid race condition with waitForAll)
185
+ try {
186
+ this.stateStore.updateExecution(runId, {
187
+ status: result.status,
188
+ completedAt: new Date(),
189
+ outputs: result.output || null,
190
+ error: result.error || null,
191
+ });
192
+ }
193
+ catch {
194
+ // Database may be closed during test cleanup, ignore
195
+ }
196
+ // Update active execution status (this signals waitForAll that we're done)
197
+ const active = this.activeExecutions.get(runId);
198
+ if (active) {
199
+ active.status = result.status === WorkflowStatus.COMPLETED ? 'completed' : 'failed';
200
+ }
201
+ // Emit completion via WebSocket
202
+ if (this.wsEmitter) {
203
+ this.wsEmitter.emitExecutionCompleted(runId, {
204
+ status: result.status,
205
+ duration: result.duration,
206
+ stepResults: result.stepResults,
207
+ outputs: result.output,
208
+ error: result.error,
209
+ });
210
+ }
211
+ }
212
+ catch (error) {
213
+ const errorMessage = error instanceof Error ? error.message : String(error);
214
+ const errorStack = error instanceof Error ? error.stack : undefined;
215
+ // Log the error for debugging
216
+ console.error(`[ExecutionManager] Workflow execution failed (${runId}):`, errorMessage);
217
+ if (errorStack) {
218
+ console.error('[ExecutionManager] Stack trace:', errorStack);
219
+ }
220
+ // Update state store first (before marking as failed, to avoid race condition with waitForAll)
221
+ try {
222
+ this.stateStore.updateExecution(runId, {
223
+ status: WorkflowStatus.FAILED,
224
+ completedAt: new Date(),
225
+ error: errorMessage,
226
+ });
227
+ }
228
+ catch {
229
+ // Database may be closed during test cleanup, ignore
230
+ }
231
+ // Update active execution status (this signals waitForAll that we're done)
232
+ const active = this.activeExecutions.get(runId);
233
+ if (active) {
234
+ active.status = 'failed';
235
+ }
236
+ // Emit failure via WebSocket
237
+ if (this.wsEmitter) {
238
+ this.wsEmitter.emitExecutionCompleted(runId, {
239
+ status: 'failed',
240
+ error: errorMessage,
241
+ });
242
+ }
243
+ }
244
+ finally {
245
+ // Clean up active execution after a delay (keep for status queries)
246
+ setTimeout(() => {
247
+ this.activeExecutions.delete(runId);
248
+ }, 60000); // Keep for 1 minute after completion
249
+ }
250
+ }
251
+ /**
252
+ * Cancel an active execution
253
+ */
254
+ async cancelExecution(runId) {
255
+ const active = this.activeExecutions.get(runId);
256
+ if (!active) {
257
+ // Check if it exists in state store
258
+ const execution = this.stateStore.getExecution(runId);
259
+ if (!execution) {
260
+ return false;
261
+ }
262
+ // Already completed
263
+ if (execution.status !== WorkflowStatus.RUNNING) {
264
+ return false;
265
+ }
266
+ // Update as cancelled (execution might be orphaned)
267
+ this.stateStore.updateExecution(runId, {
268
+ status: WorkflowStatus.CANCELLED,
269
+ completedAt: new Date(),
270
+ error: 'Execution cancelled by user',
271
+ });
272
+ return true;
273
+ }
274
+ // Abort the execution
275
+ active.abortController.abort();
276
+ active.status = 'cancelled';
277
+ // Update state store
278
+ this.stateStore.updateExecution(runId, {
279
+ status: WorkflowStatus.CANCELLED,
280
+ completedAt: new Date(),
281
+ error: 'Execution cancelled by user',
282
+ });
283
+ // Emit cancellation via WebSocket
284
+ if (this.wsEmitter) {
285
+ this.wsEmitter.emitExecutionCompleted(runId, {
286
+ status: 'cancelled',
287
+ error: 'Execution cancelled by user',
288
+ });
289
+ }
290
+ return true;
291
+ }
292
+ /**
293
+ * Resume a paused execution (e.g., after form submission)
294
+ */
295
+ async resumeExecution(runId, stepId, resumeData) {
296
+ // Check if execution exists
297
+ const execution = this.stateStore.getExecution(runId);
298
+ if (!execution) {
299
+ throw new Error(`Execution ${runId} not found`);
300
+ }
301
+ if (execution.status !== WorkflowStatus.RUNNING) {
302
+ throw new Error(`Cannot resume execution ${runId}: status is ${execution.status}`);
303
+ }
304
+ // Create new engine instance for resumption
305
+ const abortController = new AbortController();
306
+ const { workflow } = await parseFile(execution.workflowPath);
307
+ const engine = new WorkflowEngine({}, {
308
+ onStepStart: (step) => {
309
+ const stepIndex = workflow.steps.findIndex(s => s.id === step.id);
310
+ if (this.wsEmitter) {
311
+ this.wsEmitter.emitExecutionStep(runId, {
312
+ stepId: step.id,
313
+ stepIndex,
314
+ status: 'running',
315
+ action: step.action,
316
+ });
317
+ }
318
+ },
319
+ onStepComplete: (step, result) => {
320
+ const stepIndex = workflow.steps.findIndex(s => s.id === step.id);
321
+ if (this.wsEmitter) {
322
+ this.wsEmitter.emitExecutionStep(runId, {
323
+ stepId: step.id,
324
+ stepIndex,
325
+ status: result.status,
326
+ duration: result.duration,
327
+ output: result.output,
328
+ error: result.error,
329
+ });
330
+ }
331
+ },
332
+ }, this.stateStore);
333
+ engine.workflowPath = execution.workflowPath;
334
+ // Track active execution
335
+ const activeExecution = {
336
+ runId,
337
+ workflowPath: execution.workflowPath,
338
+ workflowId: workflow.metadata.id,
339
+ startedAt: execution.startedAt,
340
+ status: 'running',
341
+ currentStep: execution.currentStep,
342
+ totalSteps: workflow.steps.length,
343
+ abortController,
344
+ engine,
345
+ };
346
+ this.activeExecutions.set(runId, activeExecution);
347
+ // Emit resumption event
348
+ if (this.wsEmitter) {
349
+ this.wsEmitter.emitExecutionStep(runId, {
350
+ stepId,
351
+ status: 'resumed',
352
+ resumeData,
353
+ });
354
+ }
355
+ // Set up SDK registry
356
+ const registry = new SDKRegistry();
357
+ registry.registerInitializer('core', CoreInitializer);
358
+ registry.registerInitializer('workflow', WorkflowInitializer);
359
+ // Register integrations
360
+ try {
361
+ const moduleName = '@marktoflow/integrations';
362
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
363
+ const integrationsModule = await Function('moduleName', 'return import(moduleName)')(moduleName);
364
+ if (integrationsModule.registerIntegrations) {
365
+ integrationsModule.registerIntegrations(registry);
366
+ }
367
+ }
368
+ catch {
369
+ // Continue without integrations
370
+ }
371
+ registry.registerTools(workflow.tools);
372
+ // Resume execution asynchronously
373
+ try {
374
+ const result = await engine.resumeExecution(runId, stepId, resumeData, registry, createSDKStepExecutor());
375
+ // Update state store
376
+ this.stateStore.updateExecution(runId, {
377
+ status: result.status,
378
+ completedAt: new Date(),
379
+ outputs: result.output || null,
380
+ error: result.error || null,
381
+ });
382
+ // Update active execution
383
+ const active = this.activeExecutions.get(runId);
384
+ if (active) {
385
+ active.status = result.status === WorkflowStatus.COMPLETED ? 'completed' : 'failed';
386
+ }
387
+ // Emit completion
388
+ if (this.wsEmitter) {
389
+ this.wsEmitter.emitExecutionCompleted(runId, {
390
+ status: result.status,
391
+ duration: result.duration,
392
+ stepResults: result.stepResults,
393
+ outputs: result.output,
394
+ error: result.error,
395
+ });
396
+ }
397
+ }
398
+ catch (error) {
399
+ const errorMessage = error instanceof Error ? error.message : String(error);
400
+ this.stateStore.updateExecution(runId, {
401
+ status: WorkflowStatus.FAILED,
402
+ completedAt: new Date(),
403
+ error: errorMessage,
404
+ });
405
+ const active = this.activeExecutions.get(runId);
406
+ if (active) {
407
+ active.status = 'failed';
408
+ }
409
+ if (this.wsEmitter) {
410
+ this.wsEmitter.emitExecutionCompleted(runId, {
411
+ status: WorkflowStatus.FAILED,
412
+ error: errorMessage,
413
+ });
414
+ }
415
+ throw error;
416
+ }
417
+ }
418
+ /**
419
+ * Get execution status
420
+ */
421
+ getExecutionStatus(runId) {
422
+ // Check active executions first
423
+ const active = this.activeExecutions.get(runId);
424
+ if (active) {
425
+ return {
426
+ runId: active.runId,
427
+ workflowPath: active.workflowPath,
428
+ workflowId: active.workflowId,
429
+ status: active.status,
430
+ currentStep: active.currentStep,
431
+ totalSteps: active.totalSteps,
432
+ startedAt: active.startedAt,
433
+ completedAt: null,
434
+ error: null,
435
+ stepResults: this.getStepResults(runId),
436
+ };
437
+ }
438
+ // Check state store
439
+ const execution = this.stateStore.getExecution(runId);
440
+ if (!execution) {
441
+ return null;
442
+ }
443
+ // Map WorkflowStatus to our status type
444
+ let status;
445
+ switch (execution.status) {
446
+ case WorkflowStatus.COMPLETED:
447
+ status = 'completed';
448
+ break;
449
+ case WorkflowStatus.FAILED:
450
+ status = 'failed';
451
+ break;
452
+ case WorkflowStatus.CANCELLED:
453
+ status = 'cancelled';
454
+ break;
455
+ case WorkflowStatus.RUNNING:
456
+ status = 'running';
457
+ break;
458
+ default:
459
+ status = 'not_found';
460
+ }
461
+ return {
462
+ runId: execution.runId,
463
+ workflowPath: execution.workflowPath,
464
+ workflowId: execution.workflowId,
465
+ status,
466
+ currentStep: execution.currentStep,
467
+ totalSteps: execution.totalSteps,
468
+ startedAt: execution.startedAt,
469
+ completedAt: execution.completedAt,
470
+ error: execution.error,
471
+ stepResults: this.getStepResults(runId),
472
+ };
473
+ }
474
+ /**
475
+ * Get step results for an execution
476
+ */
477
+ getStepResults(runId) {
478
+ const checkpoints = this.stateStore.getCheckpoints(runId);
479
+ return checkpoints.map(cp => ({
480
+ stepId: cp.stepName,
481
+ status: cp.status,
482
+ duration: cp.completedAt
483
+ ? cp.completedAt.getTime() - cp.startedAt.getTime()
484
+ : null,
485
+ output: cp.outputs,
486
+ error: cp.error || undefined,
487
+ }));
488
+ }
489
+ /**
490
+ * List recent executions
491
+ */
492
+ listExecutions(options = {}) {
493
+ const workflowStatus = options.status
494
+ ? options.status
495
+ : undefined;
496
+ const executions = this.stateStore.listExecutions({
497
+ status: workflowStatus,
498
+ limit: options.limit || 50,
499
+ });
500
+ return executions.map(exec => {
501
+ let status;
502
+ switch (exec.status) {
503
+ case WorkflowStatus.COMPLETED:
504
+ status = 'completed';
505
+ break;
506
+ case WorkflowStatus.FAILED:
507
+ status = 'failed';
508
+ break;
509
+ case WorkflowStatus.CANCELLED:
510
+ status = 'cancelled';
511
+ break;
512
+ case WorkflowStatus.RUNNING:
513
+ status = 'running';
514
+ break;
515
+ default:
516
+ status = 'not_found';
517
+ }
518
+ return {
519
+ runId: exec.runId,
520
+ workflowPath: exec.workflowPath,
521
+ workflowId: exec.workflowId,
522
+ status,
523
+ currentStep: exec.currentStep,
524
+ totalSteps: exec.totalSteps,
525
+ startedAt: exec.startedAt,
526
+ completedAt: exec.completedAt,
527
+ error: exec.error,
528
+ stepResults: [],
529
+ };
530
+ });
531
+ }
532
+ /**
533
+ * Get count of active executions
534
+ */
535
+ getActiveCount() {
536
+ return this.activeExecutions.size;
537
+ }
538
+ /**
539
+ * Check if an execution is currently active
540
+ */
541
+ isActive(runId) {
542
+ return this.activeExecutions.has(runId);
543
+ }
544
+ /**
545
+ * Wait for all active executions to complete
546
+ * Useful for testing cleanup to ensure DB isn't closed while executions are in progress
547
+ */
548
+ async waitForAll(timeoutMs = 10000) {
549
+ const startTime = Date.now();
550
+ while (this.hasRunningExecutions()) {
551
+ if (Date.now() - startTime > timeoutMs) {
552
+ // Timeout reached, force clear
553
+ this.activeExecutions.clear();
554
+ break;
555
+ }
556
+ await new Promise(resolve => setTimeout(resolve, 50));
557
+ }
558
+ }
559
+ /**
560
+ * Check if any executions are still running (not completed/failed/cancelled)
561
+ */
562
+ hasRunningExecutions() {
563
+ for (const execution of this.activeExecutions.values()) {
564
+ if (execution.status === 'running') {
565
+ return true;
566
+ }
567
+ }
568
+ return false;
569
+ }
570
+ }
571
+ //# sourceMappingURL=ExecutionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionManager.js","sourceRoot":"","sources":["../../../../src/server/services/ExecutionManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { createHash } from 'crypto';
2
+ class VersionServiceImpl {
3
+ versions = new Map();
4
+ nextVersion = new Map();
5
+ createVersion(workflowPath, content, message, author = 'system', isAutoSave = false) {
6
+ const versionNum = (this.nextVersion.get(workflowPath) || 0) + 1;
7
+ this.nextVersion.set(workflowPath, versionNum);
8
+ const hash = createHash('sha256').update(content).digest('hex').slice(0, 12);
9
+ const version = {
10
+ id: `v-${workflowPath}-${versionNum}`,
11
+ workflowPath,
12
+ version: versionNum,
13
+ content,
14
+ message: message || (isAutoSave ? 'Auto-save' : `Version ${versionNum}`),
15
+ author,
16
+ createdAt: new Date().toISOString(),
17
+ hash,
18
+ isAutoSave,
19
+ };
20
+ const existing = this.versions.get(workflowPath) || [];
21
+ existing.push(version);
22
+ this.versions.set(workflowPath, existing);
23
+ return version;
24
+ }
25
+ listVersions(workflowPath) {
26
+ const versions = this.versions.get(workflowPath) || [];
27
+ return versions
28
+ .map(({ content, ...rest }) => rest)
29
+ .sort((a, b) => b.version - a.version);
30
+ }
31
+ getVersion(workflowPath, versionId) {
32
+ const versions = this.versions.get(workflowPath) || [];
33
+ return versions.find((v) => v.id === versionId) || null;
34
+ }
35
+ getLatestVersion(workflowPath) {
36
+ const versions = this.versions.get(workflowPath) || [];
37
+ return versions.length > 0 ? versions[versions.length - 1] : null;
38
+ }
39
+ compareVersions(workflowPath, versionId1, versionId2) {
40
+ const v1 = this.getVersion(workflowPath, versionId1);
41
+ const v2 = this.getVersion(workflowPath, versionId2);
42
+ if (!v1 || !v2)
43
+ return null;
44
+ const lines1 = v1.content.split('\n');
45
+ const lines2 = v2.content.split('\n');
46
+ const set1 = new Set(lines1);
47
+ const set2 = new Set(lines2);
48
+ const added = lines2.filter((l) => !set1.has(l));
49
+ const removed = lines1.filter((l) => !set2.has(l));
50
+ return {
51
+ added,
52
+ removed,
53
+ modified: [],
54
+ summary: `+${added.length} -${removed.length} lines`,
55
+ };
56
+ }
57
+ shouldAutoSave(workflowPath, newContent) {
58
+ const latest = this.getLatestVersion(workflowPath);
59
+ if (!latest)
60
+ return true;
61
+ return latest.hash !== createHash('sha256').update(newContent).digest('hex').slice(0, 12);
62
+ }
63
+ }
64
+ export const VersionService = new VersionServiceImpl();
65
+ //# sourceMappingURL=VersionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VersionService.js","sourceRoot":"","sources":["../../../../src/server/services/VersionService.ts"],"names":[],"mappings":"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"}