@marktoflow/gui 2.0.0-alpha.1 → 2.0.0-alpha.12

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 (139) hide show
  1. package/.marktoflow/state/workflow-state.db +0 -0
  2. package/.marktoflow/state/workflow-state.db-shm +0 -0
  3. package/.marktoflow/state/workflow-state.db-wal +0 -0
  4. package/.turbo/turbo-build.log +24 -8
  5. package/.turbo/turbo-test.log +29 -13
  6. package/README.md +49 -3
  7. package/dist/client/assets/index-CM44OayM.js +704 -0
  8. package/dist/client/assets/index-CM44OayM.js.map +1 -0
  9. package/dist/client/assets/index-Dru63gi6.css +1 -0
  10. package/dist/client/index.html +2 -2
  11. package/dist/server/index.js +93 -33
  12. package/dist/server/index.js.map +1 -1
  13. package/dist/server/routes/ai.js +38 -1
  14. package/dist/server/routes/ai.js.map +1 -1
  15. package/dist/server/routes/execute.js +23 -22
  16. package/dist/server/routes/execute.js.map +1 -1
  17. package/dist/server/routes/executions.js +125 -0
  18. package/dist/server/routes/executions.js.map +1 -0
  19. package/dist/server/{server/routes → routes}/tools.js +406 -0
  20. package/dist/server/{server/routes → routes}/tools.js.map +1 -1
  21. package/dist/server/routes/workflows.js +41 -5
  22. package/dist/server/routes/workflows.js.map +1 -1
  23. package/dist/server/services/AIService.js +55 -202
  24. package/dist/server/services/AIService.js.map +1 -1
  25. package/dist/server/services/FileWatcher.js +0 -2
  26. package/dist/server/services/FileWatcher.js.map +1 -1
  27. package/dist/server/services/WorkflowService.js +199 -16
  28. package/dist/server/services/WorkflowService.js.map +1 -1
  29. package/dist/server/services/agents/codex-provider.js +270 -0
  30. package/dist/server/services/agents/codex-provider.js.map +1 -0
  31. package/dist/server/{server/services → services}/agents/prompts.js +27 -0
  32. package/dist/server/services/agents/prompts.js.map +1 -0
  33. package/dist/server/{server/services → services}/agents/registry.js +20 -0
  34. package/dist/server/services/agents/registry.js.map +1 -0
  35. package/dist/server/websocket/index.js +12 -0
  36. package/dist/server/websocket/index.js.map +1 -1
  37. package/marktoflow-gui-2.0.0-alpha.12.tgz +0 -0
  38. package/package.json +19 -5
  39. package/scripts/flatten-dist.js +69 -0
  40. package/src/client/components/Canvas/Canvas.tsx +27 -7
  41. package/src/client/components/Canvas/ExecutionOverlay.tsx +120 -32
  42. package/src/client/components/Canvas/ForEachNode.tsx +152 -0
  43. package/src/client/components/Canvas/IfElseNode.tsx +141 -0
  44. package/src/client/components/Canvas/NodeContextMenu.tsx +8 -4
  45. package/src/client/components/Canvas/ParallelNode.tsx +157 -0
  46. package/src/client/components/Canvas/SwitchNode.tsx +185 -0
  47. package/src/client/components/Canvas/Toolbar.tsx +59 -21
  48. package/src/client/components/Canvas/TransformNode.tsx +194 -0
  49. package/src/client/components/Canvas/TryCatchNode.tsx +164 -0
  50. package/src/client/components/Canvas/WhileNode.tsx +161 -0
  51. package/src/client/components/Canvas/index.ts +24 -0
  52. package/src/client/components/Debug/VariableInspector.tsx +148 -0
  53. package/src/client/components/Prompt/PromptInput.tsx +3 -1
  54. package/src/client/components/Settings/ProviderSwitcher.tsx +228 -0
  55. package/src/client/components/Sidebar/ImportDialog.tsx +257 -0
  56. package/src/client/components/Sidebar/Sidebar.tsx +21 -2
  57. package/src/client/components/common/KeyboardShortcuts.tsx +8 -2
  58. package/src/client/stores/agentStore.ts +109 -0
  59. package/src/client/stores/executionStore.ts +64 -2
  60. package/src/client/stores/workflowStore.ts +10 -2
  61. package/src/client/styles/globals.css +106 -0
  62. package/src/client/utils/platform.ts +46 -0
  63. package/src/client/utils/serviceIcons.tsx +33 -0
  64. package/src/client/utils/workflowToGraph.ts +245 -21
  65. package/src/server/index.ts +25 -2
  66. package/src/server/routes/executions.ts +136 -0
  67. package/src/server/routes/tools.ts +406 -0
  68. package/src/server/routes/workflows.ts +42 -1
  69. package/src/server/services/WorkflowService.ts +176 -16
  70. package/src/server/services/agents/codex-provider.ts +398 -0
  71. package/src/server/services/agents/prompts.ts +27 -0
  72. package/src/server/services/agents/registry.ts +21 -0
  73. package/src/server/websocket/index.ts +13 -0
  74. package/tailwind.config.ts +1 -1
  75. package/tests/integration/api.test.ts +203 -1
  76. package/tests/integration/testApp.ts +1 -1
  77. package/tests/setup.ts +35 -0
  78. package/tests/unit/ForEachNode.test.tsx +308 -0
  79. package/tests/unit/IfElseNode.test.tsx +235 -0
  80. package/tests/unit/ParallelNode.test.tsx +344 -0
  81. package/tests/unit/SwitchNode.test.tsx +327 -0
  82. package/tests/unit/TransformNode.test.tsx +386 -0
  83. package/tests/unit/TryCatchNode.test.tsx +243 -0
  84. package/tests/unit/WhileNode.test.tsx +230 -0
  85. package/tests/unit/agentStore.test.ts +218 -0
  86. package/tests/unit/codexProvider.test.ts +399 -0
  87. package/tests/unit/executionStore.test.ts +40 -0
  88. package/tests/unit/platform.test.ts +118 -0
  89. package/tests/unit/serviceIcons.test.ts +197 -0
  90. package/tests/unit/workflowToGraph.test.ts +22 -0
  91. package/dist/client/assets/index-DwTI8opO.js +0 -608
  92. package/dist/client/assets/index-DwTI8opO.js.map +0 -1
  93. package/dist/client/assets/index-RoEdL6gO.css +0 -1
  94. package/dist/server/index.d.ts +0 -3
  95. package/dist/server/index.d.ts.map +0 -1
  96. package/dist/server/server/index.js +0 -95
  97. package/dist/server/server/index.js.map +0 -1
  98. package/dist/server/server/routes/ai.js +0 -87
  99. package/dist/server/server/routes/ai.js.map +0 -1
  100. package/dist/server/server/routes/execute.js +0 -63
  101. package/dist/server/server/routes/execute.js.map +0 -1
  102. package/dist/server/server/routes/workflows.js +0 -99
  103. package/dist/server/server/routes/workflows.js.map +0 -1
  104. package/dist/server/server/services/AIService.js +0 -69
  105. package/dist/server/server/services/AIService.js.map +0 -1
  106. package/dist/server/server/services/FileWatcher.js +0 -60
  107. package/dist/server/server/services/FileWatcher.js.map +0 -1
  108. package/dist/server/server/services/WorkflowService.js +0 -363
  109. package/dist/server/server/services/WorkflowService.js.map +0 -1
  110. package/dist/server/server/services/agents/prompts.js.map +0 -1
  111. package/dist/server/server/services/agents/registry.js.map +0 -1
  112. package/dist/server/server/websocket/index.js +0 -85
  113. package/dist/server/server/websocket/index.js.map +0 -1
  114. package/dist/server/services/AIService.d.ts +0 -30
  115. package/dist/server/services/AIService.d.ts.map +0 -1
  116. package/dist/server/services/FileWatcher.d.ts +0 -10
  117. package/dist/server/services/FileWatcher.d.ts.map +0 -1
  118. package/dist/server/services/WorkflowService.d.ts +0 -54
  119. package/dist/server/services/WorkflowService.d.ts.map +0 -1
  120. package/dist/server/websocket/index.d.ts +0 -10
  121. package/dist/server/websocket/index.d.ts.map +0 -1
  122. /package/dist/server/{server/services → services}/agents/claude-code-provider.js +0 -0
  123. /package/dist/server/{server/services → services}/agents/claude-code-provider.js.map +0 -0
  124. /package/dist/server/{server/services → services}/agents/claude-provider.js +0 -0
  125. /package/dist/server/{server/services → services}/agents/claude-provider.js.map +0 -0
  126. /package/dist/server/{server/services → services}/agents/copilot-provider.js +0 -0
  127. /package/dist/server/{server/services → services}/agents/copilot-provider.js.map +0 -0
  128. /package/dist/server/{server/services → services}/agents/demo-provider.js +0 -0
  129. /package/dist/server/{server/services → services}/agents/demo-provider.js.map +0 -0
  130. /package/dist/server/{server/services → services}/agents/index.js +0 -0
  131. /package/dist/server/{server/services → services}/agents/index.js.map +0 -0
  132. /package/dist/server/{server/services → services}/agents/ollama-provider.js +0 -0
  133. /package/dist/server/{server/services → services}/agents/ollama-provider.js.map +0 -0
  134. /package/dist/server/{server/services → services}/agents/types.js +0 -0
  135. /package/dist/server/{server/services → services}/agents/types.js.map +0 -0
  136. /package/dist/{server/shared → shared}/constants.js +0 -0
  137. /package/dist/{server/shared → shared}/constants.js.map +0 -0
  138. /package/dist/{server/shared → shared}/types.js +0 -0
  139. /package/dist/{server/shared → shared}/types.js.map +0 -0
@@ -0,0 +1,270 @@
1
+ /**
2
+ * OpenAI Codex AI agent provider
3
+ * Uses the @openai/codex-sdk for AI capabilities
4
+ */
5
+ import { parse as yamlParse } from 'yaml';
6
+ import { buildPrompt, generateSuggestions } from './prompts.js';
7
+ export class CodexProvider {
8
+ id = 'codex';
9
+ name = 'OpenAI Codex';
10
+ capabilities = {
11
+ streaming: true,
12
+ toolUse: true,
13
+ codeExecution: true,
14
+ systemPrompts: true,
15
+ models: [
16
+ 'codex-1',
17
+ 'o3',
18
+ 'o3-mini',
19
+ 'o4-mini',
20
+ 'gpt-4.1',
21
+ ],
22
+ };
23
+ codex = null;
24
+ model = 'codex-1';
25
+ ready = false;
26
+ error;
27
+ workingDirectory = process.cwd();
28
+ lastThreadId = null;
29
+ async initialize(config) {
30
+ try {
31
+ // Try to import the Codex SDK (dynamic import with webpackIgnore to avoid bundling issues)
32
+ const sdkModule = (await import(
33
+ /* webpackIgnore: true */ '@openai/codex-sdk').catch(() => null));
34
+ if (!sdkModule || !sdkModule.Codex) {
35
+ this.ready = false;
36
+ this.error = 'OpenAI Codex SDK not installed. Run: npm install @openai/codex-sdk';
37
+ return;
38
+ }
39
+ const { Codex } = sdkModule;
40
+ const codexOptions = {};
41
+ // API key from config or environment
42
+ if (config.apiKey) {
43
+ codexOptions.apiKey = config.apiKey;
44
+ }
45
+ else if (process.env.OPENAI_API_KEY) {
46
+ codexOptions.apiKey = process.env.OPENAI_API_KEY;
47
+ }
48
+ // Base URL
49
+ if (config.baseUrl) {
50
+ codexOptions.baseUrl = config.baseUrl;
51
+ }
52
+ // Codex path override
53
+ if (config.options?.codexPath) {
54
+ codexOptions.codexPathOverride = config.options.codexPath;
55
+ }
56
+ // Environment variables
57
+ if (config.options?.env) {
58
+ codexOptions.env = config.options.env;
59
+ }
60
+ this.codex = new Codex(codexOptions);
61
+ if (config.model) {
62
+ this.model = config.model;
63
+ }
64
+ // Working directory
65
+ if (config.options?.workingDirectory) {
66
+ this.workingDirectory = config.options.workingDirectory;
67
+ }
68
+ else if (config.options?.cwd) {
69
+ this.workingDirectory = config.options.cwd;
70
+ }
71
+ // Test connectivity by starting a simple thread
72
+ try {
73
+ const thread = this.codex.startThread({
74
+ skipGitRepoCheck: true,
75
+ sandboxMode: 'read-only',
76
+ workingDirectory: this.workingDirectory,
77
+ });
78
+ // Just verify it can be created
79
+ if (thread) {
80
+ this.ready = true;
81
+ this.error = undefined;
82
+ }
83
+ }
84
+ catch (testError) {
85
+ this.ready = false;
86
+ this.error = `Cannot initialize Codex: ${testError instanceof Error ? testError.message : 'Unknown error'}`;
87
+ }
88
+ }
89
+ catch (err) {
90
+ this.ready = false;
91
+ this.error = err instanceof Error ? err.message : 'Unknown error initializing Codex';
92
+ }
93
+ }
94
+ isReady() {
95
+ return this.ready;
96
+ }
97
+ getStatus() {
98
+ return {
99
+ ready: this.ready,
100
+ model: this.model,
101
+ error: this.error,
102
+ };
103
+ }
104
+ async processPrompt(prompt, workflow, context) {
105
+ if (!this.codex || !this.ready) {
106
+ return {
107
+ explanation: 'OpenAI Codex provider not available.',
108
+ error: this.error || 'Provider not initialized',
109
+ };
110
+ }
111
+ try {
112
+ // Build context-aware prompts
113
+ const { systemPrompt, userPrompt } = buildPrompt(prompt, workflow, context);
114
+ // Combine system and user prompts for Codex
115
+ const fullPrompt = `${systemPrompt}\n\n---\n\n${userPrompt}`;
116
+ const thread = this.codex.startThread({
117
+ model: this.model,
118
+ skipGitRepoCheck: true,
119
+ sandboxMode: 'read-only', // Safe for workflow modifications
120
+ workingDirectory: this.workingDirectory,
121
+ modelReasoningEffort: 'medium',
122
+ });
123
+ const result = await thread.run(fullPrompt);
124
+ this.lastThreadId = thread.id;
125
+ // Extract the response text
126
+ const responseText = result.finalResponse ||
127
+ result.items.find((item) => item.type === 'agent_message')?.text || '';
128
+ return this.parseAIResponse(responseText, workflow);
129
+ }
130
+ catch (err) {
131
+ return {
132
+ explanation: '',
133
+ error: err instanceof Error ? err.message : 'Unknown error',
134
+ };
135
+ }
136
+ }
137
+ async getSuggestions(workflow, selectedStepId) {
138
+ return generateSuggestions(workflow, selectedStepId);
139
+ }
140
+ async streamPrompt(prompt, workflow, onChunk, context) {
141
+ if (!this.codex || !this.ready) {
142
+ return this.processPrompt(prompt, workflow, context);
143
+ }
144
+ const { systemPrompt, userPrompt } = buildPrompt(prompt, workflow, context);
145
+ const fullPrompt = `${systemPrompt}\n\n---\n\n${userPrompt}`;
146
+ let fullResponse = '';
147
+ try {
148
+ const thread = this.codex.startThread({
149
+ model: this.model,
150
+ skipGitRepoCheck: true,
151
+ sandboxMode: 'read-only',
152
+ workingDirectory: this.workingDirectory,
153
+ modelReasoningEffort: 'medium',
154
+ });
155
+ const streamResult = await thread.runStreamed(fullPrompt);
156
+ for await (const event of streamResult.events) {
157
+ if (event.type === 'thread.started') {
158
+ this.lastThreadId = event.thread_id || null;
159
+ }
160
+ else if (event.type === 'item.completed' && event.item?.type === 'agent_message') {
161
+ const text = event.item.text || '';
162
+ fullResponse = text;
163
+ onChunk(text);
164
+ }
165
+ else if (event.type === 'error') {
166
+ throw new Error(event.message || 'Stream error');
167
+ }
168
+ else if (event.type === 'turn.failed') {
169
+ throw new Error(event.error?.message || 'Turn failed');
170
+ }
171
+ }
172
+ return this.parseAIResponse(fullResponse, workflow);
173
+ }
174
+ catch (err) {
175
+ return {
176
+ explanation: '',
177
+ error: err instanceof Error ? err.message : 'Unknown error',
178
+ };
179
+ }
180
+ }
181
+ async cancel() {
182
+ // Codex SDK doesn't have explicit cancellation, but we can reset state
183
+ this.lastThreadId = null;
184
+ }
185
+ /**
186
+ * Get the last thread ID for resumption
187
+ */
188
+ getLastThreadId() {
189
+ return this.lastThreadId;
190
+ }
191
+ /**
192
+ * Resume a previous thread
193
+ */
194
+ async resumePrompt(threadId, prompt, workflow, context) {
195
+ if (!this.codex || !this.ready) {
196
+ return {
197
+ explanation: 'OpenAI Codex provider not available.',
198
+ error: this.error || 'Provider not initialized',
199
+ };
200
+ }
201
+ try {
202
+ const { systemPrompt, userPrompt } = buildPrompt(prompt, workflow, context);
203
+ const fullPrompt = `${systemPrompt}\n\n---\n\n${userPrompt}`;
204
+ const thread = this.codex.resumeThread(threadId, {
205
+ model: this.model,
206
+ skipGitRepoCheck: true,
207
+ sandboxMode: 'read-only',
208
+ workingDirectory: this.workingDirectory,
209
+ });
210
+ const result = await thread.run(fullPrompt);
211
+ this.lastThreadId = thread.id;
212
+ const responseText = result.finalResponse ||
213
+ result.items.find((item) => item.type === 'agent_message')?.text || '';
214
+ return this.parseAIResponse(responseText, workflow);
215
+ }
216
+ catch (err) {
217
+ return {
218
+ explanation: '',
219
+ error: err instanceof Error ? err.message : 'Unknown error',
220
+ };
221
+ }
222
+ }
223
+ parseAIResponse(responseText, originalWorkflow) {
224
+ const yamlMatch = responseText.match(/```yaml\n([\s\S]*?)\n```/);
225
+ let modifiedWorkflow;
226
+ let explanation = responseText;
227
+ if (yamlMatch) {
228
+ try {
229
+ const parsedYaml = yamlParse(yamlMatch[1]);
230
+ if (parsedYaml && (parsedYaml.steps || parsedYaml.metadata)) {
231
+ modifiedWorkflow = parsedYaml;
232
+ const explanationMatch = responseText.match(/^([\s\S]*?)```yaml/);
233
+ if (explanationMatch) {
234
+ explanation = explanationMatch[1].trim();
235
+ }
236
+ }
237
+ }
238
+ catch {
239
+ // Failed to parse YAML
240
+ }
241
+ }
242
+ let diff;
243
+ if (modifiedWorkflow) {
244
+ diff = this.generateDiff(originalWorkflow, modifiedWorkflow);
245
+ }
246
+ return { explanation, workflow: modifiedWorkflow, diff };
247
+ }
248
+ generateDiff(original, modified) {
249
+ const originalStepIds = new Set(original.steps?.map((s) => s.id) || []);
250
+ const modifiedStepIds = new Set(modified.steps?.map((s) => s.id) || []);
251
+ const added = modified.steps?.filter((s) => !originalStepIds.has(s.id)) || [];
252
+ const removed = original.steps?.filter((s) => !modifiedStepIds.has(s.id)) || [];
253
+ let diff = '';
254
+ if (added.length > 0) {
255
+ diff += `+ Added ${added.length} step(s): ${added.map((s) => s.name || s.id).join(', ')}\n`;
256
+ }
257
+ if (removed.length > 0) {
258
+ diff += `- Removed ${removed.length} step(s): ${removed.map((s) => s.name || s.id).join(', ')}\n`;
259
+ }
260
+ return diff || 'No structural changes detected';
261
+ }
262
+ }
263
+ export function createCodexProvider(config) {
264
+ const provider = new CodexProvider();
265
+ if (config) {
266
+ provider.initialize(config);
267
+ }
268
+ return provider;
269
+ }
270
+ //# sourceMappingURL=codex-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-provider.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/codex-provider.ts"],"names":[],"mappings":"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"}
@@ -141,6 +141,33 @@ export const AVAILABLE_SERVICES = {
141
141
  description: 'Local Ollama LLM for AI tasks',
142
142
  commonActions: ['generate', 'chat', 'embeddings'],
143
143
  },
144
+ codex: {
145
+ sdk: '@openai/codex-sdk',
146
+ description: 'OpenAI Codex for AI-powered coding workflows',
147
+ commonActions: [
148
+ 'chat',
149
+ 'codeModify',
150
+ 'codeAnalyze',
151
+ 'codeReview',
152
+ 'webSearch',
153
+ 'execute',
154
+ 'structured',
155
+ 'resume',
156
+ 'withImages',
157
+ ],
158
+ },
159
+ copilot: {
160
+ sdk: '@github/copilot-sdk',
161
+ description: 'GitHub Copilot for AI code assistance',
162
+ commonActions: [
163
+ 'chat',
164
+ 'codeReview',
165
+ 'codeModify',
166
+ 'withTools',
167
+ 'withAgents',
168
+ 'withMcp',
169
+ ],
170
+ },
144
171
  };
145
172
  // Base system prompt with comprehensive context
146
173
  export const BASE_SYSTEM_PROMPT = `You are an expert workflow automation assistant for Marktoflow, a markdown-based workflow automation framework.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/prompts.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@
5
5
  import { createClaudeProvider } from './claude-provider.js';
6
6
  import { createClaudeCodeProvider } from './claude-code-provider.js';
7
7
  import { createCopilotProvider } from './copilot-provider.js';
8
+ import { createCodexProvider } from './codex-provider.js';
8
9
  import { createDemoProvider } from './demo-provider.js';
9
10
  import { createOllamaProvider } from './ollama-provider.js';
10
11
  /**
@@ -27,6 +28,11 @@ export class AgentRegistry {
27
28
  name: 'GitHub Copilot (SDK)',
28
29
  factory: createCopilotProvider,
29
30
  });
31
+ this.registerProvider({
32
+ id: 'codex',
33
+ name: 'OpenAI Codex (SDK)',
34
+ factory: createCodexProvider,
35
+ });
30
36
  // API key-based providers
31
37
  this.registerProvider({
32
38
  id: 'claude',
@@ -130,6 +136,20 @@ export class AgentRegistry {
130
136
  return 'copilot';
131
137
  }
132
138
  }
139
+ // Try OpenAI Codex SDK (uses OPENAI_API_KEY)
140
+ const codexProvider = this.providers.get('codex');
141
+ if (codexProvider) {
142
+ await codexProvider.initialize({
143
+ apiKey: process.env.OPENAI_API_KEY,
144
+ options: {
145
+ cwd: process.cwd(),
146
+ },
147
+ });
148
+ if (codexProvider.isReady()) {
149
+ this.activeProviderId = 'codex';
150
+ return 'codex';
151
+ }
152
+ }
133
153
  // Try Claude with API key (requires ANTHROPIC_API_KEY)
134
154
  const claudeProvider = this.providers.get('claude');
135
155
  if (claudeProvider) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../../src/server/services/agents/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,SAAS,GAA+B,IAAI,GAAG,EAAE,CAAC;IAClD,gBAAgB,GAAW,MAAM,CAAC;IAClC,OAAO,GAAwB,EAAE,CAAC;IAE1C;QACE,8BAA8B;QAC9B,sEAAsE;QACtE,IAAI,CAAC,gBAAgB,CAAC;YACpB,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,wBAAwB;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,CAAC;YACpB,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,qBAAqB;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,CAAC;YACpB,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,mBAAmB;SAC7B,CAAC,CAAC;QACH,0BAA0B;QAC1B,IAAI,CAAC,gBAAgB,CAAC;YACpB,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,oBAAoB;SAC9B,CAAC,CAAC;QACH,kBAAkB;QAClB,IAAI,CAAC,gBAAgB,CAAC;YACpB,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,oBAAoB;SAC9B,CAAC,CAAC;QACH,+BAA+B;QAC/B,IAAI,CAAC,gBAAgB,CAAC;YACpB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,kBAAkB;SAC5B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAyB;QACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YACnE,EAAE;YACF,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE;SAC1B,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,EAAU;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,EAAU,EAAE,MAAoB;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACvB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,kBAAkB;QACtB,gEAAgE;QAChE,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7D,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,kBAAkB,CAAC,UAAU,CAAC;gBAClC,OAAO,EAAE;oBACP,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;iBACnB;aACF,CAAC,CAAC;YACH,IAAI,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC;gBACjC,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC;gBACtC,OAAO,aAAa,CAAC;YACvB,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,eAAe,CAAC,UAAU,CAAC;gBAC/B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;gBACpC,OAAO,EAAE;oBACP,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;iBACtC;aACF,CAAC,CAAC;YACH,IAAI,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC9B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBAClC,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,aAAa,CAAC,UAAU,CAAC;gBAC7B,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;gBAClC,OAAO,EAAE;oBACP,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;iBACnB;aACF,CAAC,CAAC;YACH,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5B,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;gBAChC,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,cAAc,CAAC,UAAU,CAAC;gBAC9B,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;aACtC,CAAC,CAAC;YACH,IAAI,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC7B,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;gBACjC,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,cAAc,CAAC,UAAU,CAAC;gBAC9B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,wBAAwB;aACjE,CAAC,CAAC;YACH,IAAI,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC7B,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;gBACjC,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,QAAkB;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE9D,oBAAoB;QACpB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACnB,MAAM;YACN,QAAQ,EAAE,MAAM,CAAC,WAAW;YAC5B,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK;YACtB,QAAQ,EAAE,QAAQ,CAAC,EAAE;SACtB,CAAC,CAAC;QAEH,0BAA0B;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAkB,EAAE,cAAuB;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,MAAc,EACd,QAAkB,EAClB,OAAgC;QAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE1C,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEtE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;gBACnB,MAAM;gBACN,QAAQ,EAAE,MAAM,CAAC,WAAW;gBAC5B,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK;gBACtB,QAAQ,EAAE,QAAQ,CAAC,EAAE;aACtB,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,6BAA6B;QAC7B,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAgB,EAAE;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,SAAS;QAIP,OAAO;YACL,cAAc,EAAE,IAAI,CAAC,gBAAgB;YACrC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvE,EAAE;gBACF,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,GAAG,QAAQ,CAAC,SAAS,EAAE;aACxB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;CACF;AAED,qBAAqB;AACrB,IAAI,gBAAgB,GAAyB,IAAI,CAAC;AAElD,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,IAAI,aAAa,EAAE,CAAC;IACzC,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,aAAa,EAAE,CAAC;AAC7B,CAAC"}
@@ -54,6 +54,18 @@ export function setupWebSocket(io) {
54
54
  ...data,
55
55
  });
56
56
  },
57
+ // Emit execution started
58
+ emitExecutionStarted(runId, data) {
59
+ io.to(`execution:${runId}`).emit('execution:started', {
60
+ runId,
61
+ ...data,
62
+ });
63
+ // Also broadcast to all clients for global execution history updates
64
+ io.emit('execution:new', {
65
+ runId,
66
+ ...data,
67
+ });
68
+ },
57
69
  // Emit execution step update
58
70
  emitExecutionStep(runId, data) {
59
71
  io.to(`execution:${runId}`).emit('execution:step', {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/websocket/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/websocket/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,20 +1,30 @@
1
1
  {
2
2
  "name": "@marktoflow/gui",
3
- "version": "2.0.0-alpha.1",
4
- "description": "Visual workflow designer for marktoflow - n8n-inspired web UI",
3
+ "version": "2.0.0-alpha.12",
4
+ "description": "Visual workflow designer for marktoflow - web UI",
5
5
  "type": "module",
6
6
  "main": "./dist/server/index.js",
7
7
  "types": "./dist/server/index.d.ts",
8
8
  "bin": {
9
9
  "marktoflow-gui": "./dist/server/index.js"
10
10
  },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/marktoflow/marktoflow.git",
14
+ "directory": "packages/gui"
15
+ },
16
+ "homepage": "https://github.com/marktoflow/marktoflow#readme",
17
+ "bugs": {
18
+ "url": "https://github.com/marktoflow/marktoflow/issues"
19
+ },
11
20
  "scripts": {
12
21
  "dev": "concurrently \"pnpm:dev:*\"",
13
22
  "dev:client": "vite",
14
23
  "dev:server": "tsx watch src/server/index.ts",
15
- "build": "pnpm build:client && pnpm build:server",
24
+ "build": "pnpm build:client && pnpm build:server && pnpm build:flatten",
16
25
  "build:client": "vite build",
17
26
  "build:server": "tsc -p tsconfig.server.json",
27
+ "build:flatten": "node scripts/flatten-dist.js",
18
28
  "preview": "vite preview",
19
29
  "test": "vitest run",
20
30
  "test:watch": "vitest",
@@ -26,7 +36,7 @@
26
36
  "@anthropic-ai/claude-agent-sdk": ">=0.1.0",
27
37
  "@anthropic-ai/sdk": "^0.52.0",
28
38
  "@github/copilot-sdk": "^0.1.18",
29
- "@marktoflow/core": "workspace:*",
39
+ "@marktoflow/core": "2.0.0-alpha.12",
30
40
  "@monaco-editor/react": "^4.6.0",
31
41
  "@radix-ui/react-context-menu": "^2.2.2",
32
42
  "@radix-ui/react-dialog": "^1.1.2",
@@ -34,7 +44,10 @@
34
44
  "@radix-ui/react-popover": "^1.1.2",
35
45
  "@radix-ui/react-tabs": "^1.1.1",
36
46
  "@radix-ui/react-tooltip": "^1.1.3",
47
+ "@types/adm-zip": "^0.5.7",
48
+ "@types/multer": "^2.0.0",
37
49
  "@xyflow/react": "^12.3.6",
50
+ "adm-zip": "^0.5.16",
38
51
  "chokidar": "^4.0.3",
39
52
  "class-variance-authority": "^0.7.1",
40
53
  "clsx": "^2.1.1",
@@ -42,6 +55,7 @@
42
55
  "dagre": "^0.8.5",
43
56
  "express": "^4.21.2",
44
57
  "lucide-react": "^0.468.0",
58
+ "multer": "^2.0.2",
45
59
  "react": "^18.3.1",
46
60
  "react-dom": "^18.3.1",
47
61
  "react-markdown": "^9.0.1",
@@ -92,5 +106,5 @@
92
106
  "automation"
93
107
  ],
94
108
  "author": "Scott Gilroy",
95
- "license": "MIT"
109
+ "license": "Apache-2.0"
96
110
  }
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Post-build script to flatten the dist structure
5
+ *
6
+ * Before:
7
+ * dist/
8
+ * client/ (from vite build)
9
+ * server/
10
+ * server/ (from tsc)
11
+ * shared/ (from tsc)
12
+ *
13
+ * After:
14
+ * dist/
15
+ * client/ (unchanged)
16
+ * server/ (flattened - was server/server/)
17
+ * shared/ (moved from server/shared/)
18
+ */
19
+
20
+ import { existsSync, cpSync, rmSync, readdirSync, statSync } from 'fs';
21
+ import { join, dirname } from 'path';
22
+ import { fileURLToPath } from 'url';
23
+
24
+ const __filename = fileURLToPath(import.meta.url);
25
+ const __dirname = dirname(__filename);
26
+ const packageRoot = join(__dirname, '..');
27
+ const distDir = join(packageRoot, 'dist');
28
+
29
+ console.log('🔧 Flattening dist structure...');
30
+
31
+ // Check if dist exists
32
+ if (!existsSync(distDir)) {
33
+ console.error('❌ dist directory not found');
34
+ process.exit(1);
35
+ }
36
+
37
+ // 1. Move dist/server/server/* to dist/server-temp/
38
+ const serverServerDir = join(distDir, 'server', 'server');
39
+ const serverTempDir = join(distDir, 'server-temp');
40
+
41
+ if (existsSync(serverServerDir)) {
42
+ console.log(' 📦 Moving server/server/* to temp location...');
43
+ cpSync(serverServerDir, serverTempDir, { recursive: true });
44
+ }
45
+
46
+ // 2. Move dist/server/shared/* to dist/shared/
47
+ const serverSharedDir = join(distDir, 'server', 'shared');
48
+ const sharedDir = join(distDir, 'shared');
49
+
50
+ if (existsSync(serverSharedDir)) {
51
+ console.log(' 📦 Moving server/shared/* to dist/shared/...');
52
+ cpSync(serverSharedDir, sharedDir, { recursive: true });
53
+ }
54
+
55
+ // 3. Remove old dist/server directory
56
+ console.log(' 🗑️ Removing old server directory...');
57
+ rmSync(join(distDir, 'server'), { recursive: true, force: true });
58
+
59
+ // 4. Move temp back to dist/server
60
+ console.log(' 📦 Moving temp back to dist/server/...');
61
+ cpSync(serverTempDir, join(distDir, 'server'), { recursive: true });
62
+ rmSync(serverTempDir, { recursive: true, force: true });
63
+
64
+ console.log('✅ Dist structure flattened successfully!');
65
+ console.log('\nFinal structure:');
66
+ console.log(' dist/');
67
+ console.log(' client/ - React app');
68
+ console.log(' server/ - Server code (flat)');
69
+ console.log(' shared/ - Shared code');
@@ -12,10 +12,18 @@ import {
12
12
  import { Edit, Copy, Trash2, Code, Play } from 'lucide-react';
13
13
  import { useCanvasStore } from '../../stores/canvasStore';
14
14
  import { useWorkflowStore } from '../../stores/workflowStore';
15
+ import { getModKey } from '../../utils/platform';
15
16
  import { StepNode } from './StepNode';
16
17
  import { SubWorkflowNode } from './SubWorkflowNode';
17
18
  import { TriggerNode } from './TriggerNode';
18
19
  import { OutputNode } from './OutputNode';
20
+ import { IfElseNode } from './IfElseNode';
21
+ import { ForEachNode } from './ForEachNode';
22
+ import { WhileNode } from './WhileNode';
23
+ import { SwitchNode } from './SwitchNode';
24
+ import { ParallelNode } from './ParallelNode';
25
+ import { TryCatchNode } from './TryCatchNode';
26
+ import { TransformNode } from './TransformNode';
19
27
  import { StepEditor } from '../Editor/StepEditor';
20
28
  import { YamlViewer } from '../Editor/YamlEditor';
21
29
  import { Modal } from '../common/Modal';
@@ -37,6 +45,15 @@ const nodeTypes = {
37
45
  subworkflow: SubWorkflowNode,
38
46
  trigger: TriggerNode,
39
47
  output: OutputNode,
48
+ if: IfElseNode,
49
+ for_each: ForEachNode,
50
+ while: WhileNode,
51
+ switch: SwitchNode,
52
+ parallel: ParallelNode,
53
+ try: TryCatchNode,
54
+ map: TransformNode,
55
+ filter: TransformNode,
56
+ reduce: TransformNode,
40
57
  };
41
58
 
42
59
  export function Canvas() {
@@ -45,6 +62,7 @@ export function Canvas() {
45
62
  const { autoLayout, deleteSelected, duplicateSelected } = useCanvas();
46
63
  const currentWorkflow = useWorkflowStore((s) => s.currentWorkflow);
47
64
  const { screenToFlowPosition } = useReactFlow();
65
+ const modKey = getModKey();
48
66
 
49
67
  // Editor state
50
68
  const [editingStep, setEditingStep] = useState<WorkflowStep | null>(null);
@@ -62,8 +80,8 @@ export function Canvas() {
62
80
  event.preventDefault();
63
81
 
64
82
  // Sub-workflow nodes handle their own double-click via the drill-down button
65
- // Don't open editor for special node types
66
- if (node.type === 'subworkflow' || node.type === 'trigger' || node.type === 'output') {
83
+ // Don't open editor for special node types that have their own interactions
84
+ if (node.type === 'trigger' || node.type === 'output') {
67
85
  return;
68
86
  }
69
87
 
@@ -76,10 +94,11 @@ export function Canvas() {
76
94
  [currentWorkflow]
77
95
  );
78
96
 
79
- // Get the currently selected step node
97
+ // Get the currently selected step node (including control flow nodes)
80
98
  const getSelectedStep = useCallback((): WorkflowStep | null => {
81
99
  if (!currentWorkflow) return null;
82
- const selectedNode = nodes.find((n) => n.selected && n.type === 'step');
100
+ const controlFlowTypes = ['step', 'if', 'for_each', 'while', 'switch', 'parallel', 'try', 'map', 'filter', 'reduce'];
101
+ const selectedNode = nodes.find((n) => n.selected && controlFlowTypes.includes(n.type || ''));
83
102
  if (!selectedNode) return null;
84
103
  return currentWorkflow.steps.find((s) => s.id === selectedNode.data.id) || null;
85
104
  }, [currentWorkflow, nodes]);
@@ -213,8 +232,9 @@ export function Canvas() {
213
232
  const onNodeContextMenu = useCallback(
214
233
  (event: React.MouseEvent, node: Node) => {
215
234
  event.preventDefault();
216
- // Only show context menu for step nodes
217
- if (node.type === 'step') {
235
+ // Show context menu for all control flow nodes
236
+ const controlFlowTypes = ['step', 'if', 'for_each', 'while', 'switch', 'parallel', 'try', 'map', 'filter', 'reduce', 'subworkflow'];
237
+ if (controlFlowTypes.includes(node.type || '')) {
218
238
  setContextMenuNode(node);
219
239
  }
220
240
  },
@@ -371,7 +391,7 @@ export function Canvas() {
371
391
  <ContextMenuItem onClick={handleContextDuplicate}>
372
392
  <Copy className="w-4 h-4 mr-2" />
373
393
  Duplicate
374
- <ContextMenuShortcut>⌘D</ContextMenuShortcut>
394
+ <ContextMenuShortcut>{modKey}D</ContextMenuShortcut>
375
395
  </ContextMenuItem>
376
396
  <ContextMenuItem onClick={handleContextDelete} destructive>
377
397
  <Trash2 className="w-4 h-4 mr-2" />