@marktoflow/gui 2.0.0-alpha.3 → 2.0.0-alpha.5

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 (95) hide show
  1. package/.turbo/turbo-build.log +24 -8
  2. package/README.md +11 -1
  3. package/dist/client/assets/index-CM44OayM.js +704 -0
  4. package/dist/client/assets/index-CM44OayM.js.map +1 -0
  5. package/dist/client/assets/index-Dru63gi6.css +1 -0
  6. package/dist/client/index.html +2 -2
  7. package/dist/server/{server/index.js → index.js} +22 -1
  8. package/dist/server/index.js.map +1 -0
  9. package/dist/server/routes/executions.js +125 -0
  10. package/dist/server/routes/executions.js.map +1 -0
  11. package/dist/server/{server/routes → routes}/workflows.js +37 -1
  12. package/dist/server/routes/workflows.js.map +1 -0
  13. package/dist/server/{server/services → services}/WorkflowService.js +158 -15
  14. package/dist/server/services/WorkflowService.js.map +1 -0
  15. package/dist/server/{server/websocket → websocket}/index.js +12 -0
  16. package/dist/server/{server/websocket → websocket}/index.js.map +1 -1
  17. package/marktoflow-gui-2.0.0-alpha.5.tgz +0 -0
  18. package/package.json +20 -6
  19. package/scripts/flatten-dist.js +69 -0
  20. package/src/client/components/Canvas/Canvas.tsx +3 -1
  21. package/src/client/components/Canvas/ExecutionOverlay.tsx +120 -32
  22. package/src/client/components/Canvas/ForEachNode.tsx +27 -3
  23. package/src/client/components/Canvas/IfElseNode.tsx +22 -7
  24. package/src/client/components/Canvas/NodeContextMenu.tsx +8 -4
  25. package/src/client/components/Canvas/ParallelNode.tsx +25 -8
  26. package/src/client/components/Canvas/SwitchNode.tsx +41 -20
  27. package/src/client/components/Canvas/Toolbar.tsx +59 -21
  28. package/src/client/components/Canvas/TransformNode.tsx +9 -0
  29. package/src/client/components/Canvas/WhileNode.tsx +35 -3
  30. package/src/client/components/Debug/VariableInspector.tsx +148 -0
  31. package/src/client/components/Prompt/PromptInput.tsx +3 -1
  32. package/src/client/components/Settings/ProviderSwitcher.tsx +228 -0
  33. package/src/client/components/Sidebar/ImportDialog.tsx +257 -0
  34. package/src/client/components/Sidebar/Sidebar.tsx +21 -2
  35. package/src/client/components/common/KeyboardShortcuts.tsx +8 -2
  36. package/src/client/stores/agentStore.ts +109 -0
  37. package/src/client/stores/executionStore.ts +64 -2
  38. package/src/client/stores/workflowStore.ts +10 -2
  39. package/src/client/styles/globals.css +106 -0
  40. package/src/client/utils/platform.ts +46 -0
  41. package/src/client/utils/workflowToGraph.ts +245 -21
  42. package/src/server/index.ts +24 -1
  43. package/src/server/routes/executions.ts +136 -0
  44. package/src/server/routes/workflows.ts +42 -1
  45. package/src/server/services/WorkflowService.ts +176 -16
  46. package/src/server/websocket/index.ts +13 -0
  47. package/tests/unit/ForEachNode.test.tsx +96 -6
  48. package/tests/unit/IfElseNode.test.tsx +47 -0
  49. package/tests/unit/ParallelNode.test.tsx +80 -0
  50. package/tests/unit/SwitchNode.test.tsx +75 -0
  51. package/tests/unit/WhileNode.test.tsx +12 -8
  52. package/tests/unit/agentStore.test.ts +218 -0
  53. package/tests/unit/executionStore.test.ts +40 -0
  54. package/tests/unit/platform.test.ts +118 -0
  55. package/tests/unit/workflowToGraph.test.ts +22 -0
  56. package/dist/client/assets/index-C90Y_aBX.js +0 -678
  57. package/dist/client/assets/index-C90Y_aBX.js.map +0 -1
  58. package/dist/client/assets/index-CRWeQ3NN.css +0 -1
  59. package/dist/server/server/index.js.map +0 -1
  60. package/dist/server/server/routes/workflows.js.map +0 -1
  61. package/dist/server/server/services/WorkflowService.js.map +0 -1
  62. /package/dist/server/{server/routes → routes}/ai.js +0 -0
  63. /package/dist/server/{server/routes → routes}/ai.js.map +0 -0
  64. /package/dist/server/{server/routes → routes}/execute.js +0 -0
  65. /package/dist/server/{server/routes → routes}/execute.js.map +0 -0
  66. /package/dist/server/{server/routes → routes}/tools.js +0 -0
  67. /package/dist/server/{server/routes → routes}/tools.js.map +0 -0
  68. /package/dist/server/{server/services → services}/AIService.js +0 -0
  69. /package/dist/server/{server/services → services}/AIService.js.map +0 -0
  70. /package/dist/server/{server/services → services}/FileWatcher.js +0 -0
  71. /package/dist/server/{server/services → services}/FileWatcher.js.map +0 -0
  72. /package/dist/server/{server/services → services}/agents/claude-code-provider.js +0 -0
  73. /package/dist/server/{server/services → services}/agents/claude-code-provider.js.map +0 -0
  74. /package/dist/server/{server/services → services}/agents/claude-provider.js +0 -0
  75. /package/dist/server/{server/services → services}/agents/claude-provider.js.map +0 -0
  76. /package/dist/server/{server/services → services}/agents/codex-provider.js +0 -0
  77. /package/dist/server/{server/services → services}/agents/codex-provider.js.map +0 -0
  78. /package/dist/server/{server/services → services}/agents/copilot-provider.js +0 -0
  79. /package/dist/server/{server/services → services}/agents/copilot-provider.js.map +0 -0
  80. /package/dist/server/{server/services → services}/agents/demo-provider.js +0 -0
  81. /package/dist/server/{server/services → services}/agents/demo-provider.js.map +0 -0
  82. /package/dist/server/{server/services → services}/agents/index.js +0 -0
  83. /package/dist/server/{server/services → services}/agents/index.js.map +0 -0
  84. /package/dist/server/{server/services → services}/agents/ollama-provider.js +0 -0
  85. /package/dist/server/{server/services → services}/agents/ollama-provider.js.map +0 -0
  86. /package/dist/server/{server/services → services}/agents/prompts.js +0 -0
  87. /package/dist/server/{server/services → services}/agents/prompts.js.map +0 -0
  88. /package/dist/server/{server/services → services}/agents/registry.js +0 -0
  89. /package/dist/server/{server/services → services}/agents/registry.js.map +0 -0
  90. /package/dist/server/{server/services → services}/agents/types.js +0 -0
  91. /package/dist/server/{server/services → services}/agents/types.js.map +0 -0
  92. /package/dist/{server/shared → shared}/constants.js +0 -0
  93. /package/dist/{server/shared → shared}/constants.js.map +0 -0
  94. /package/dist/{server/shared → shared}/types.js +0 -0
  95. /package/dist/{server/shared → shared}/types.js.map +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowService.js","sourceRoot":"","sources":["../../../../src/server/services/WorkflowService.ts"],"names":[],"mappings":"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"}
@@ -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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"}
Binary file
package/package.json CHANGED
@@ -1,20 +1,30 @@
1
1
  {
2
2
  "name": "@marktoflow/gui",
3
- "version": "2.0.0-alpha.3",
3
+ "version": "2.0.0-alpha.5",
4
4
  "description": "Visual workflow designer for marktoflow - web UI",
5
5
  "type": "module",
6
- "main": "./dist/server/server/index.js",
7
- "types": "./dist/server/server/index.d.ts",
6
+ "main": "./dist/server/index.js",
7
+ "types": "./dist/server/index.d.ts",
8
8
  "bin": {
9
- "marktoflow-gui": "./dist/server/server/index.js"
9
+ "marktoflow-gui": "./dist/server/index.js"
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"
10
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.9",
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",
@@ -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,6 +12,7 @@ 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';
@@ -61,6 +62,7 @@ export function Canvas() {
61
62
  const { autoLayout, deleteSelected, duplicateSelected } = useCanvas();
62
63
  const currentWorkflow = useWorkflowStore((s) => s.currentWorkflow);
63
64
  const { screenToFlowPosition } = useReactFlow();
65
+ const modKey = getModKey();
64
66
 
65
67
  // Editor state
66
68
  const [editingStep, setEditingStep] = useState<WorkflowStep | null>(null);
@@ -389,7 +391,7 @@ export function Canvas() {
389
391
  <ContextMenuItem onClick={handleContextDuplicate}>
390
392
  <Copy className="w-4 h-4 mr-2" />
391
393
  Duplicate
392
- <ContextMenuShortcut>⌘D</ContextMenuShortcut>
394
+ <ContextMenuShortcut>{modKey}D</ContextMenuShortcut>
393
395
  </ContextMenuItem>
394
396
  <ContextMenuItem onClick={handleContextDelete} destructive>
395
397
  <Trash2 className="w-4 h-4 mr-2" />
@@ -30,6 +30,7 @@ interface ExecutionStep {
30
30
  status: StepStatus;
31
31
  duration?: number;
32
32
  error?: string;
33
+ inputs?: Record<string, unknown>;
33
34
  output?: unknown;
34
35
  outputVariable?: string;
35
36
  }
@@ -384,11 +385,12 @@ function LogsViewer({ logs }: { logs: string[] }) {
384
385
 
385
386
  function VariableInspector({ steps }: { steps: ExecutionStep[] }) {
386
387
  const [expandedSteps, setExpandedSteps] = useState<Set<string>>(new Set());
388
+ const [expandedSection, setExpandedSection] = useState<Set<string>>(new Set());
387
389
  const [copiedKey, setCopiedKey] = useState<string | null>(null);
388
390
 
389
- // Filter steps that have output data
390
- const stepsWithOutput = steps.filter(
391
- (step) => step.output !== undefined && step.outputVariable
391
+ // Filter steps that have input or output data
392
+ const stepsWithData = steps.filter(
393
+ (step) => step.inputs !== undefined || (step.output !== undefined && step.outputVariable)
392
394
  );
393
395
 
394
396
  const toggleStep = (stepId: string) => {
@@ -403,6 +405,18 @@ function VariableInspector({ steps }: { steps: ExecutionStep[] }) {
403
405
  });
404
406
  };
405
407
 
408
+ const toggleSection = (sectionId: string) => {
409
+ setExpandedSection((prev) => {
410
+ const next = new Set(prev);
411
+ if (next.has(sectionId)) {
412
+ next.delete(sectionId);
413
+ } else {
414
+ next.add(sectionId);
415
+ }
416
+ return next;
417
+ });
418
+ };
419
+
406
420
  const copyValue = async (key: string, value: unknown) => {
407
421
  try {
408
422
  const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);
@@ -414,26 +428,29 @@ function VariableInspector({ steps }: { steps: ExecutionStep[] }) {
414
428
  }
415
429
  };
416
430
 
417
- if (stepsWithOutput.length === 0) {
431
+ if (stepsWithData.length === 0) {
418
432
  return (
419
433
  <div className="text-center py-8 text-gray-500 text-sm">
420
- No variables available yet.
434
+ No data available yet.
421
435
  <br />
422
- <span className="text-xs">Variables will appear as steps complete.</span>
436
+ <span className="text-xs">Step inputs and outputs will appear as steps execute.</span>
423
437
  </div>
424
438
  );
425
439
  }
426
440
 
427
441
  return (
428
442
  <div className="space-y-2">
429
- {stepsWithOutput.map((step) => {
443
+ {stepsWithData.map((step) => {
430
444
  const isExpanded = expandedSteps.has(step.stepId);
445
+ const hasInputs = step.inputs && Object.keys(step.inputs).length > 0;
446
+ const hasOutput = step.output !== undefined && step.outputVariable;
447
+
431
448
  return (
432
449
  <div
433
450
  key={step.stepId}
434
451
  className="border border-node-border rounded-lg overflow-hidden"
435
452
  >
436
- {/* Variable Header */}
453
+ {/* Step Header */}
437
454
  <button
438
455
  onClick={() => toggleStep(step.stepId)}
439
456
  className="w-full flex items-center gap-2 px-3 py-2 bg-node-bg hover:bg-white/5 transition-colors"
@@ -443,38 +460,109 @@ function VariableInspector({ steps }: { steps: ExecutionStep[] }) {
443
460
  ) : (
444
461
  <ChevronRight className="w-4 h-4 text-gray-400" />
445
462
  )}
446
- <code className="text-sm text-primary font-mono">
447
- {step.outputVariable}
463
+ <code className="text-sm text-white font-mono">
464
+ {step.stepName || step.stepId}
448
465
  </code>
449
466
  <span className="text-xs text-gray-500 ml-auto">
450
- {getTypeLabel(step.output)}
467
+ {hasInputs && `${Object.keys(step.inputs!).length} inputs`}
468
+ {hasInputs && hasOutput && ' • '}
469
+ {hasOutput && step.outputVariable}
451
470
  </span>
452
471
  </button>
453
472
 
454
- {/* Variable Value */}
473
+ {/* Step Data */}
455
474
  {isExpanded && (
456
- <div className="p-3 bg-panel-bg border-t border-node-border">
457
- <div className="flex items-start gap-2">
458
- <div className="flex-1 overflow-x-auto">
459
- <ValueRenderer
460
- value={step.output}
461
- onCopy={(key, val) => copyValue(key, val)}
462
- copiedKey={copiedKey}
463
- path={step.outputVariable || ''}
464
- />
475
+ <div className="bg-panel-bg border-t border-node-border">
476
+ {/* Inputs Section */}
477
+ {hasInputs && (
478
+ <div className="border-b border-node-border">
479
+ <button
480
+ onClick={() => toggleSection(`${step.stepId}-inputs`)}
481
+ className="w-full flex items-center gap-2 px-3 py-2 hover:bg-white/5 transition-colors"
482
+ >
483
+ {expandedSection.has(`${step.stepId}-inputs`) ? (
484
+ <ChevronDown className="w-3 h-3 text-gray-400" />
485
+ ) : (
486
+ <ChevronRight className="w-3 h-3 text-gray-400" />
487
+ )}
488
+ <span className="text-xs font-medium text-gray-400">
489
+ Inputs ({Object.keys(step.inputs!).length})
490
+ </span>
491
+ </button>
492
+ {expandedSection.has(`${step.stepId}-inputs`) && (
493
+ <div className="px-3 pb-3">
494
+ <div className="flex items-start gap-2">
495
+ <div className="flex-1 overflow-x-auto">
496
+ <ValueRenderer
497
+ value={step.inputs}
498
+ onCopy={(key, val) => copyValue(key, val)}
499
+ copiedKey={copiedKey}
500
+ path="inputs"
501
+ />
502
+ </div>
503
+ <button
504
+ onClick={() => copyValue(`${step.stepId}-inputs`, step.inputs)}
505
+ className="p-1.5 hover:bg-white/10 rounded transition-colors"
506
+ title="Copy inputs"
507
+ >
508
+ {copiedKey === `${step.stepId}-inputs` ? (
509
+ <Check className="w-4 h-4 text-success" />
510
+ ) : (
511
+ <Copy className="w-4 h-4 text-gray-400" />
512
+ )}
513
+ </button>
514
+ </div>
515
+ </div>
516
+ )}
465
517
  </div>
466
- <button
467
- onClick={() => copyValue(step.outputVariable || '', step.output)}
468
- className="p-1.5 hover:bg-white/10 rounded transition-colors"
469
- title="Copy entire value"
470
- >
471
- {copiedKey === step.outputVariable ? (
472
- <Check className="w-4 h-4 text-success" />
473
- ) : (
474
- <Copy className="w-4 h-4 text-gray-400" />
518
+ )}
519
+
520
+ {/* Output Section */}
521
+ {hasOutput && (
522
+ <div>
523
+ <button
524
+ onClick={() => toggleSection(`${step.stepId}-output`)}
525
+ className="w-full flex items-center gap-2 px-3 py-2 hover:bg-white/5 transition-colors"
526
+ >
527
+ {expandedSection.has(`${step.stepId}-output`) ? (
528
+ <ChevronDown className="w-3 h-3 text-gray-400" />
529
+ ) : (
530
+ <ChevronRight className="w-3 h-3 text-gray-400" />
531
+ )}
532
+ <span className="text-xs font-medium text-gray-400">
533
+ Output
534
+ </span>
535
+ <code className="text-xs text-primary font-mono ml-auto">
536
+ {step.outputVariable}
537
+ </code>
538
+ </button>
539
+ {expandedSection.has(`${step.stepId}-output`) && (
540
+ <div className="px-3 pb-3">
541
+ <div className="flex items-start gap-2">
542
+ <div className="flex-1 overflow-x-auto">
543
+ <ValueRenderer
544
+ value={step.output}
545
+ onCopy={(key, val) => copyValue(key, val)}
546
+ copiedKey={copiedKey}
547
+ path={step.outputVariable || 'output'}
548
+ />
549
+ </div>
550
+ <button
551
+ onClick={() => copyValue(step.outputVariable || '', step.output)}
552
+ className="p-1.5 hover:bg-white/10 rounded transition-colors"
553
+ title="Copy output"
554
+ >
555
+ {copiedKey === step.outputVariable ? (
556
+ <Check className="w-4 h-4 text-success" />
557
+ ) : (
558
+ <Copy className="w-4 h-4 text-gray-400" />
559
+ )}
560
+ </button>
561
+ </div>
562
+ </div>
475
563
  )}
476
- </button>
477
- </div>
564
+ </div>
565
+ )}
478
566
  </div>
479
567
  )}
480
568
  </div>
@@ -1,6 +1,6 @@
1
1
  import { memo } from 'react';
2
2
  import { Handle, Position, type Node, type NodeProps } from '@xyflow/react';
3
- import { Repeat, CheckCircle, XCircle, Clock } from 'lucide-react';
3
+ import { Repeat, CheckCircle, XCircle, Clock, LogOut } from 'lucide-react';
4
4
 
5
5
  export interface ForEachNodeData extends Record<string, unknown> {
6
6
  id: string;
@@ -10,6 +10,8 @@ export interface ForEachNodeData extends Record<string, unknown> {
10
10
  status?: 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
11
11
  currentIteration?: number;
12
12
  totalIterations?: number;
13
+ earlyExit?: boolean;
14
+ exitReason?: 'break' | 'error';
13
15
  }
14
16
 
15
17
  export type ForEachNodeType = Node<ForEachNodeData, 'for_each'>;
@@ -45,7 +47,7 @@ function ForEachNodeComponent({ data, selected }: NodeProps<ForEachNodeType>) {
45
47
 
46
48
  return (
47
49
  <div
48
- className={`control-flow-node for-each-node p-0 ${selected ? 'selected' : ''} ${status === 'running' ? 'running' : ''}`}
50
+ className={`control-flow-node for-each-node p-0 ${selected ? 'selected' : ''} ${status === 'running' ? 'running' : ''} ${status === 'completed' ? 'completed' : ''} ${status === 'failed' ? 'failed' : ''}`}
49
51
  style={{
50
52
  background: 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)',
51
53
  }}
@@ -88,6 +90,16 @@ function ForEachNodeComponent({ data, selected }: NodeProps<ForEachNodeType>) {
88
90
  <span className="font-mono">{data.itemVariable || 'item'}</span>
89
91
  </div>
90
92
 
93
+ {/* Early exit indicator */}
94
+ {data.earlyExit && (
95
+ <div className="mb-3 p-2 bg-orange-500/20 border border-orange-500/30 rounded flex items-center gap-2">
96
+ <LogOut className="w-4 h-4 text-orange-200" />
97
+ <span className="text-xs text-orange-200 font-medium">
98
+ {data.exitReason === 'break' ? 'Loop exited early (break)' : 'Loop stopped on error'}
99
+ </span>
100
+ </div>
101
+ )}
102
+
91
103
  {/* Iteration progress */}
92
104
  {data.totalIterations !== undefined && (
93
105
  <div className="mt-2 p-2 bg-white/5 rounded">
@@ -95,11 +107,14 @@ function ForEachNodeComponent({ data, selected }: NodeProps<ForEachNodeType>) {
95
107
  <span className="text-xs text-white/70">Progress</span>
96
108
  <span className="text-xs text-white font-medium">
97
109
  {data.currentIteration || 0} / {data.totalIterations}
110
+ {data.earlyExit && (
111
+ <span className="ml-1 text-orange-300 text-[10px]">(stopped)</span>
112
+ )}
98
113
  </span>
99
114
  </div>
100
115
  <div className="w-full bg-white/10 rounded-full h-1.5">
101
116
  <div
102
- className="bg-orange-400 h-1.5 rounded-full transition-all"
117
+ className={`h-1.5 rounded-full transition-all ${data.earlyExit ? 'bg-orange-400' : 'bg-pink-400'}`}
103
118
  style={{
104
119
  width: `${((data.currentIteration || 0) / data.totalIterations) * 100}%`,
105
120
  }}
@@ -121,6 +136,15 @@ function ForEachNodeComponent({ data, selected }: NodeProps<ForEachNodeType>) {
121
136
  position={Position.Bottom}
122
137
  className="!w-3 !h-3 !bg-primary !border-2 !border-node-bg"
123
138
  />
139
+
140
+ {/* Loop-back handle (left side for iteration feedback) */}
141
+ <Handle
142
+ id="loop-back"
143
+ type="source"
144
+ position={Position.Left}
145
+ className="!w-3 !h-3 !bg-purple-500 !border-2 !border-node-bg"
146
+ style={{ top: '50%', left: '-6px' }}
147
+ />
124
148
  </div>
125
149
  );
126
150
  }
@@ -8,6 +8,7 @@ export interface IfElseNodeData extends Record<string, unknown> {
8
8
  condition: string;
9
9
  status?: 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
10
10
  activeBranch?: 'then' | 'else' | null;
11
+ skippedBranch?: 'then' | 'else' | null;
11
12
  }
12
13
 
13
14
  export type IfElseNodeType = Node<IfElseNodeData, 'if'>;
@@ -43,7 +44,7 @@ function IfElseNodeComponent({ data, selected }: NodeProps<IfElseNodeType>) {
43
44
 
44
45
  return (
45
46
  <div
46
- className={`control-flow-node if-else-node p-0 ${selected ? 'selected' : ''} ${status === 'running' ? 'running' : ''}`}
47
+ className={`control-flow-node if-else-node p-0 ${selected ? 'selected' : ''} ${status === 'running' ? 'running' : ''} ${status === 'completed' ? 'completed' : ''} ${status === 'failed' ? 'failed' : ''}`}
47
48
  style={{
48
49
  background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
49
50
  }}
@@ -84,22 +85,36 @@ function IfElseNodeComponent({ data, selected }: NodeProps<IfElseNodeType>) {
84
85
  {/* Branch outputs */}
85
86
  <div className="grid grid-cols-2 gap-2">
86
87
  <div
87
- className={`text-center p-2 rounded text-xs font-medium transition-colors ${
88
+ className={`text-center p-2 rounded text-xs font-medium transition-colors relative ${
88
89
  data.activeBranch === 'then'
89
- ? 'bg-green-500/30 text-green-200'
90
- : 'bg-white/5 text-white/60'
90
+ ? 'bg-green-500/30 text-green-200 ring-1 ring-green-400/50'
91
+ : data.skippedBranch === 'then'
92
+ ? 'bg-gray-500/20 text-gray-400'
93
+ : 'bg-white/5 text-white/60'
91
94
  }`}
92
95
  >
93
96
  ✓ Then
97
+ {data.skippedBranch === 'then' && (
98
+ <span className="absolute -top-1 -right-1 text-[8px] px-1 py-0.5 rounded bg-gray-500/50 text-gray-300">
99
+ SKIP
100
+ </span>
101
+ )}
94
102
  </div>
95
103
  <div
96
- className={`text-center p-2 rounded text-xs font-medium transition-colors ${
104
+ className={`text-center p-2 rounded text-xs font-medium transition-colors relative ${
97
105
  data.activeBranch === 'else'
98
- ? 'bg-red-500/30 text-red-200'
99
- : 'bg-white/5 text-white/60'
106
+ ? 'bg-red-500/30 text-red-200 ring-1 ring-red-400/50'
107
+ : data.skippedBranch === 'else'
108
+ ? 'bg-gray-500/20 text-gray-400'
109
+ : 'bg-white/5 text-white/60'
100
110
  }`}
101
111
  >
102
112
  ✗ Else
113
+ {data.skippedBranch === 'else' && (
114
+ <span className="absolute -top-1 -right-1 text-[8px] px-1 py-0.5 rounded bg-gray-500/50 text-gray-300">
115
+ SKIP
116
+ </span>
117
+ )}
103
118
  </div>
104
119
  </div>
105
120
  </div>
@@ -20,6 +20,7 @@ import {
20
20
  AlertTriangle,
21
21
  } from 'lucide-react';
22
22
  import type { Node } from '@xyflow/react';
23
+ import { getModKey } from '../../utils/platform';
23
24
 
24
25
  interface NodeContextMenuProps {
25
26
  children: React.ReactNode;
@@ -50,6 +51,7 @@ export function NodeContextMenu({
50
51
  }: NodeContextMenuProps) {
51
52
  const isSubworkflow = node.type === 'subworkflow';
52
53
  const hasError = node.data?.status === 'failed';
54
+ const modKey = getModKey();
53
55
 
54
56
  return (
55
57
  <ContextMenu>
@@ -77,7 +79,7 @@ export function NodeContextMenu({
77
79
  <ContextMenuItem onClick={onDuplicate}>
78
80
  <Copy className="w-4 h-4 mr-2" />
79
81
  Duplicate
80
- <ContextMenuShortcut>⌘D</ContextMenuShortcut>
82
+ <ContextMenuShortcut>{modKey}D</ContextMenuShortcut>
81
83
  </ContextMenuItem>
82
84
 
83
85
  <ContextMenuSub>
@@ -148,6 +150,8 @@ export function CanvasContextMenu({
148
150
  onFitView,
149
151
  canPaste,
150
152
  }: CanvasContextMenuProps) {
153
+ const modKey = getModKey();
154
+
151
155
  return (
152
156
  <ContextMenu>
153
157
  {children}
@@ -168,19 +172,19 @@ export function CanvasContextMenu({
168
172
  <ContextMenuItem onClick={onPaste} disabled={!canPaste}>
169
173
  <Copy className="w-4 h-4 mr-2" />
170
174
  Paste
171
- <ContextMenuShortcut>⌘V</ContextMenuShortcut>
175
+ <ContextMenuShortcut>{modKey}V</ContextMenuShortcut>
172
176
  </ContextMenuItem>
173
177
 
174
178
  <ContextMenuSeparator />
175
179
 
176
180
  <ContextMenuItem onClick={onAutoLayout}>
177
181
  Auto-layout
178
- <ContextMenuShortcut>⌘L</ContextMenuShortcut>
182
+ <ContextMenuShortcut>{modKey}L</ContextMenuShortcut>
179
183
  </ContextMenuItem>
180
184
 
181
185
  <ContextMenuItem onClick={onFitView}>
182
186
  Fit to View
183
- <ContextMenuShortcut>⌘0</ContextMenuShortcut>
187
+ <ContextMenuShortcut>{modKey}0</ContextMenuShortcut>
184
188
  </ContextMenuItem>
185
189
  </ContextMenuContent>
186
190
  </ContextMenu>