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