@marktoflow/gui 2.0.0-alpha.5 → 2.0.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 (164) hide show
  1. package/README.md +48 -180
  2. package/client.log +0 -0
  3. package/dist/client/assets/index-DQeR1ew6.css +1 -0
  4. package/dist/client/assets/index-LbIVPHbD.js +833 -0
  5. package/dist/client/assets/index-LbIVPHbD.js.map +1 -0
  6. package/dist/client/index.html +2 -2
  7. package/dist/client/marktoflow-logo.png +0 -0
  8. package/dist/server/index.js +31 -5
  9. package/dist/server/index.js.map +1 -1
  10. package/dist/server/routes/admin.js +95 -0
  11. package/dist/server/routes/admin.js.map +1 -0
  12. package/dist/server/routes/ai.js +2 -2
  13. package/dist/server/routes/ai.js.map +1 -1
  14. package/dist/server/routes/collaboration.js +104 -0
  15. package/dist/server/routes/collaboration.js.map +1 -0
  16. package/dist/server/routes/execute.js +181 -14
  17. package/dist/server/routes/execute.js.map +1 -1
  18. package/dist/server/routes/form.js +160 -0
  19. package/dist/server/routes/form.js.map +1 -0
  20. package/dist/server/routes/settings.js +90 -0
  21. package/dist/server/routes/settings.js.map +1 -0
  22. package/dist/server/routes/templates.js +106 -0
  23. package/dist/server/routes/templates.js.map +1 -0
  24. package/dist/server/routes/versions.js +101 -0
  25. package/dist/server/routes/versions.js.map +1 -0
  26. package/dist/server/services/AIService.js +85 -2
  27. package/dist/server/services/AIService.js.map +1 -1
  28. package/dist/server/services/ExecutionManager.js +571 -0
  29. package/dist/server/services/ExecutionManager.js.map +1 -0
  30. package/dist/server/services/VersionService.js +65 -0
  31. package/dist/server/services/VersionService.js.map +1 -0
  32. package/dist/server/services/WorkflowService.js +8 -2
  33. package/dist/server/services/WorkflowService.js.map +1 -1
  34. package/dist/server/services/agents/copilot-provider.js +32 -0
  35. package/dist/server/services/agents/copilot-provider.js.map +1 -1
  36. package/dist/server/websocket/index.js +42 -0
  37. package/dist/server/websocket/index.js.map +1 -1
  38. package/dist/shared/constants.js +9 -0
  39. package/dist/shared/constants.js.map +1 -1
  40. package/dist/shared/settings.js +51 -0
  41. package/dist/shared/settings.js.map +1 -0
  42. package/package.json +14 -10
  43. package/public/marktoflow-logo.png +0 -0
  44. package/server.log +0 -0
  45. package/tests/integration/fixtures/test-workflow.md +6 -0
  46. package/.turbo/turbo-build.log +0 -42
  47. package/dist/client/assets/index-CM44OayM.js +0 -704
  48. package/dist/client/assets/index-CM44OayM.js.map +0 -1
  49. package/dist/client/assets/index-Dru63gi6.css +0 -1
  50. package/marktoflow-gui-2.0.0-alpha.5.tgz +0 -0
  51. package/playwright.config.ts +0 -27
  52. package/postcss.config.js +0 -6
  53. package/src/client/App.tsx +0 -520
  54. package/src/client/components/Canvas/Canvas.tsx +0 -425
  55. package/src/client/components/Canvas/ExecutionOverlay.tsx +0 -935
  56. package/src/client/components/Canvas/ForEachNode.tsx +0 -152
  57. package/src/client/components/Canvas/IfElseNode.tsx +0 -141
  58. package/src/client/components/Canvas/NodeContextMenu.tsx +0 -192
  59. package/src/client/components/Canvas/OutputNode.tsx +0 -111
  60. package/src/client/components/Canvas/ParallelNode.tsx +0 -157
  61. package/src/client/components/Canvas/StepNode.tsx +0 -106
  62. package/src/client/components/Canvas/SubWorkflowNode.tsx +0 -141
  63. package/src/client/components/Canvas/SwitchNode.tsx +0 -185
  64. package/src/client/components/Canvas/Toolbar.tsx +0 -227
  65. package/src/client/components/Canvas/TransformNode.tsx +0 -194
  66. package/src/client/components/Canvas/TriggerNode.tsx +0 -128
  67. package/src/client/components/Canvas/TryCatchNode.tsx +0 -164
  68. package/src/client/components/Canvas/WhileNode.tsx +0 -161
  69. package/src/client/components/Canvas/index.ts +0 -24
  70. package/src/client/components/Debug/VariableInspector.tsx +0 -148
  71. package/src/client/components/Editor/InputsEditor.tsx +0 -458
  72. package/src/client/components/Editor/NewStepWizard.tsx +0 -344
  73. package/src/client/components/Editor/StepEditor.tsx +0 -532
  74. package/src/client/components/Editor/YamlEditor.tsx +0 -160
  75. package/src/client/components/Panels/PropertiesPanel.tsx +0 -589
  76. package/src/client/components/Prompt/ChangePreview.tsx +0 -281
  77. package/src/client/components/Prompt/PromptHistoryPanel.tsx +0 -209
  78. package/src/client/components/Prompt/PromptInput.tsx +0 -110
  79. package/src/client/components/Settings/ProviderSwitcher.tsx +0 -228
  80. package/src/client/components/Sidebar/ImportDialog.tsx +0 -257
  81. package/src/client/components/Sidebar/Sidebar.tsx +0 -362
  82. package/src/client/components/common/Breadcrumb.tsx +0 -40
  83. package/src/client/components/common/Button.tsx +0 -68
  84. package/src/client/components/common/ContextMenu.tsx +0 -202
  85. package/src/client/components/common/KeyboardShortcuts.tsx +0 -149
  86. package/src/client/components/common/Modal.tsx +0 -93
  87. package/src/client/components/common/Tabs.tsx +0 -57
  88. package/src/client/components/common/ThemeToggle.tsx +0 -63
  89. package/src/client/components/index.ts +0 -32
  90. package/src/client/hooks/index.ts +0 -4
  91. package/src/client/hooks/useAIPrompt.ts +0 -108
  92. package/src/client/hooks/useCanvas.ts +0 -247
  93. package/src/client/hooks/useWebSocket.ts +0 -164
  94. package/src/client/hooks/useWorkflow.ts +0 -138
  95. package/src/client/main.tsx +0 -10
  96. package/src/client/stores/agentStore.ts +0 -109
  97. package/src/client/stores/canvasStore.ts +0 -348
  98. package/src/client/stores/editorStore.ts +0 -133
  99. package/src/client/stores/executionStore.ts +0 -502
  100. package/src/client/stores/index.ts +0 -4
  101. package/src/client/stores/layoutStore.ts +0 -103
  102. package/src/client/stores/navigationStore.ts +0 -49
  103. package/src/client/stores/promptStore.ts +0 -113
  104. package/src/client/stores/themeStore.ts +0 -75
  105. package/src/client/stores/workflowStore.ts +0 -185
  106. package/src/client/styles/globals.css +0 -452
  107. package/src/client/utils/cn.ts +0 -9
  108. package/src/client/utils/index.ts +0 -4
  109. package/src/client/utils/platform.ts +0 -46
  110. package/src/client/utils/serviceIcons.tsx +0 -97
  111. package/src/client/utils/stepValidation.ts +0 -155
  112. package/src/client/utils/workflowToGraph.ts +0 -523
  113. package/src/server/index.ts +0 -137
  114. package/src/server/routes/ai.ts +0 -91
  115. package/src/server/routes/execute.ts +0 -71
  116. package/src/server/routes/executions.ts +0 -136
  117. package/src/server/routes/tools.ts +0 -970
  118. package/src/server/routes/workflows.ts +0 -147
  119. package/src/server/services/AIService.ts +0 -105
  120. package/src/server/services/FileWatcher.ts +0 -69
  121. package/src/server/services/WorkflowService.ts +0 -601
  122. package/src/server/services/agents/claude-code-provider.ts +0 -320
  123. package/src/server/services/agents/claude-provider.ts +0 -248
  124. package/src/server/services/agents/codex-provider.ts +0 -398
  125. package/src/server/services/agents/copilot-provider.ts +0 -311
  126. package/src/server/services/agents/demo-provider.ts +0 -184
  127. package/src/server/services/agents/index.ts +0 -31
  128. package/src/server/services/agents/ollama-provider.ts +0 -267
  129. package/src/server/services/agents/prompts.ts +0 -509
  130. package/src/server/services/agents/registry.ts +0 -310
  131. package/src/server/services/agents/types.ts +0 -146
  132. package/src/server/websocket/index.ts +0 -117
  133. package/src/shared/constants.ts +0 -180
  134. package/src/shared/types.ts +0 -179
  135. package/tailwind.config.ts +0 -73
  136. package/tests/e2e/app.spec.ts +0 -90
  137. package/tests/e2e/canvas.spec.ts +0 -128
  138. package/tests/e2e/workflow.spec.ts +0 -185
  139. package/tests/integration/api.test.ts +0 -452
  140. package/tests/integration/testApp.ts +0 -31
  141. package/tests/setup.ts +0 -72
  142. package/tests/unit/ForEachNode.test.tsx +0 -308
  143. package/tests/unit/IfElseNode.test.tsx +0 -235
  144. package/tests/unit/ParallelNode.test.tsx +0 -344
  145. package/tests/unit/SwitchNode.test.tsx +0 -327
  146. package/tests/unit/TransformNode.test.tsx +0 -386
  147. package/tests/unit/TryCatchNode.test.tsx +0 -243
  148. package/tests/unit/WhileNode.test.tsx +0 -230
  149. package/tests/unit/agentStore.test.ts +0 -218
  150. package/tests/unit/canvasStore.test.ts +0 -502
  151. package/tests/unit/codexProvider.test.ts +0 -399
  152. package/tests/unit/components.test.tsx +0 -151
  153. package/tests/unit/executionStore.test.ts +0 -567
  154. package/tests/unit/layoutStore.test.ts +0 -194
  155. package/tests/unit/navigationStore.test.ts +0 -152
  156. package/tests/unit/platform.test.ts +0 -118
  157. package/tests/unit/serviceIcons.test.ts +0 -197
  158. package/tests/unit/stepValidation.test.ts +0 -226
  159. package/tests/unit/themeStore.test.ts +0 -141
  160. package/tests/unit/workflowToGraph.test.ts +0 -311
  161. package/tsconfig.json +0 -29
  162. package/tsconfig.server.json +0 -28
  163. package/vite.config.ts +0 -31
  164. 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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"}