@mesantosrai/pipeline-canvas 1.0.0

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 (148) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +545 -0
  3. package/dist/_virtual/dynamic-import-helper.mjs +17 -0
  4. package/dist/_virtual/dynamic-import-helper.mjs.map +1 -0
  5. package/dist/components/CustomHandle.d.ts +9 -0
  6. package/dist/components/CustomHandle.d.ts.map +1 -0
  7. package/dist/components/CustomHandle.mjs +18 -0
  8. package/dist/components/CustomHandle.mjs.map +1 -0
  9. package/dist/components/ExecutionLogsPanel.d.ts +3 -0
  10. package/dist/components/ExecutionLogsPanel.d.ts.map +1 -0
  11. package/dist/components/ExecutionLogsPanel.mjs +189 -0
  12. package/dist/components/ExecutionLogsPanel.mjs.map +1 -0
  13. package/dist/components/NodeContextMenu.d.ts +15 -0
  14. package/dist/components/NodeContextMenu.d.ts.map +1 -0
  15. package/dist/components/NodeContextMenu.mjs +110 -0
  16. package/dist/components/NodeContextMenu.mjs.map +1 -0
  17. package/dist/components/PipelineCanvas.d.ts +4 -0
  18. package/dist/components/PipelineCanvas.d.ts.map +1 -0
  19. package/dist/components/PipelineCanvas.mjs +1016 -0
  20. package/dist/components/PipelineCanvas.mjs.map +1 -0
  21. package/dist/components/PipelineCanvasProvider.d.ts +30 -0
  22. package/dist/components/PipelineCanvasProvider.d.ts.map +1 -0
  23. package/dist/components/PipelineCanvasProvider.mjs +7 -0
  24. package/dist/components/PipelineCanvasProvider.mjs.map +1 -0
  25. package/dist/components/PipelineExecution.d.ts +16 -0
  26. package/dist/components/PipelineExecution.d.ts.map +1 -0
  27. package/dist/components/PipelineExecution.mjs +310 -0
  28. package/dist/components/PipelineExecution.mjs.map +1 -0
  29. package/dist/components/PipelineManager.d.ts +8 -0
  30. package/dist/components/PipelineManager.d.ts.map +1 -0
  31. package/dist/components/PipelineManager.mjs +143 -0
  32. package/dist/components/PipelineManager.mjs.map +1 -0
  33. package/dist/components/PipelineNodeConfig.d.ts +11 -0
  34. package/dist/components/PipelineNodeConfig.d.ts.map +1 -0
  35. package/dist/components/PipelineNodeConfig.mjs +1808 -0
  36. package/dist/components/PipelineNodeConfig.mjs.map +1 -0
  37. package/dist/components/PipelineNodePalette.d.ts +3 -0
  38. package/dist/components/PipelineNodePalette.d.ts.map +1 -0
  39. package/dist/components/PipelineNodePalette.mjs +87 -0
  40. package/dist/components/PipelineNodePalette.mjs.map +1 -0
  41. package/dist/components/SavePipelineDialog.d.ts +9 -0
  42. package/dist/components/SavePipelineDialog.d.ts.map +1 -0
  43. package/dist/components/SavePipelineDialog.mjs +140 -0
  44. package/dist/components/SavePipelineDialog.mjs.map +1 -0
  45. package/dist/components/SavedPipelinesList.d.ts +3 -0
  46. package/dist/components/SavedPipelinesList.d.ts.map +1 -0
  47. package/dist/components/SavedPipelinesList.mjs +172 -0
  48. package/dist/components/SavedPipelinesList.mjs.map +1 -0
  49. package/dist/components/index.d.ts +8 -0
  50. package/dist/components/index.d.ts.map +1 -0
  51. package/dist/components/ui/alert.d.ts +9 -0
  52. package/dist/components/ui/alert.d.ts.map +1 -0
  53. package/dist/components/ui/alert.mjs +51 -0
  54. package/dist/components/ui/alert.mjs.map +1 -0
  55. package/dist/components/ui/button.d.ts +12 -0
  56. package/dist/components/ui/button.d.ts.map +1 -0
  57. package/dist/components/ui/button.mjs +45 -0
  58. package/dist/components/ui/button.mjs.map +1 -0
  59. package/dist/components/ui/dialog.d.ts +20 -0
  60. package/dist/components/ui/dialog.d.ts.map +1 -0
  61. package/dist/components/ui/dialog.mjs +99 -0
  62. package/dist/components/ui/dialog.mjs.map +1 -0
  63. package/dist/components/ui/index.d.ts +8 -0
  64. package/dist/components/ui/index.d.ts.map +1 -0
  65. package/dist/components/ui/input.d.ts +6 -0
  66. package/dist/components/ui/input.d.ts.map +1 -0
  67. package/dist/components/ui/input.mjs +22 -0
  68. package/dist/components/ui/input.mjs.map +1 -0
  69. package/dist/components/ui/label.d.ts +6 -0
  70. package/dist/components/ui/label.d.ts.map +1 -0
  71. package/dist/components/ui/label.mjs +20 -0
  72. package/dist/components/ui/label.mjs.map +1 -0
  73. package/dist/components/ui/select.d.ts +14 -0
  74. package/dist/components/ui/select.d.ts.map +1 -0
  75. package/dist/components/ui/select.mjs +121 -0
  76. package/dist/components/ui/select.mjs.map +1 -0
  77. package/dist/components/ui/tooltip.d.ts +8 -0
  78. package/dist/components/ui/tooltip.d.ts.map +1 -0
  79. package/dist/components/ui/tooltip.mjs +24 -0
  80. package/dist/components/ui/tooltip.mjs.map +1 -0
  81. package/dist/context/PipelineContext.d.ts +50 -0
  82. package/dist/context/PipelineContext.d.ts.map +1 -0
  83. package/dist/context/PipelineContext.mjs +36 -0
  84. package/dist/context/PipelineContext.mjs.map +1 -0
  85. package/dist/index.d.ts +12 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.mjs +45 -0
  88. package/dist/index.mjs.map +1 -0
  89. package/dist/lib/utils.d.ts +3 -0
  90. package/dist/lib/utils.d.ts.map +1 -0
  91. package/dist/lib/utils.mjs +9 -0
  92. package/dist/lib/utils.mjs.map +1 -0
  93. package/dist/node_modules/zustand/esm/middleware.mjs +256 -0
  94. package/dist/node_modules/zustand/esm/middleware.mjs.map +1 -0
  95. package/dist/nodes/alphafold_node/node.json.mjs +82 -0
  96. package/dist/nodes/alphafold_node/node.json.mjs.map +1 -0
  97. package/dist/nodes/http_request_node/node.json.mjs +383 -0
  98. package/dist/nodes/http_request_node/node.json.mjs.map +1 -0
  99. package/dist/nodes/input_node/node.json.mjs +51 -0
  100. package/dist/nodes/input_node/node.json.mjs.map +1 -0
  101. package/dist/nodes/message_input_node/node.json.mjs +90 -0
  102. package/dist/nodes/message_input_node/node.json.mjs.map +1 -0
  103. package/dist/nodes/proteinmpnn_node/node.json.mjs +83 -0
  104. package/dist/nodes/proteinmpnn_node/node.json.mjs.map +1 -0
  105. package/dist/nodes/rfdiffusion_node/node.json.mjs +281 -0
  106. package/dist/nodes/rfdiffusion_node/node.json.mjs.map +1 -0
  107. package/dist/store/pipelineStore.d.ts +108 -0
  108. package/dist/store/pipelineStore.d.ts.map +1 -0
  109. package/dist/store/pipelineStore.mjs +633 -0
  110. package/dist/store/pipelineStore.mjs.map +1 -0
  111. package/dist/style.css +1 -0
  112. package/dist/types/dependencies.d.ts +93 -0
  113. package/dist/types/dependencies.d.ts.map +1 -0
  114. package/dist/types/index.d.ts +56 -0
  115. package/dist/types/index.d.ts.map +1 -0
  116. package/dist/types/logger.d.ts +67 -0
  117. package/dist/types/logger.d.ts.map +1 -0
  118. package/dist/types/logger.mjs +22 -0
  119. package/dist/types/logger.mjs.map +1 -0
  120. package/dist/utils/executionEngine.d.ts +27 -0
  121. package/dist/utils/executionEngine.d.ts.map +1 -0
  122. package/dist/utils/executionEngine.mjs +461 -0
  123. package/dist/utils/executionEngine.mjs.map +1 -0
  124. package/dist/utils/index.d.ts +6 -0
  125. package/dist/utils/index.d.ts.map +1 -0
  126. package/dist/utils/logger.d.ts +23 -0
  127. package/dist/utils/logger.d.ts.map +1 -0
  128. package/dist/utils/logger.mjs +29 -0
  129. package/dist/utils/logger.mjs.map +1 -0
  130. package/dist/utils/nodeLoader.d.ts +76 -0
  131. package/dist/utils/nodeLoader.d.ts.map +1 -0
  132. package/dist/utils/nodeLoader.mjs +48 -0
  133. package/dist/utils/nodeLoader.mjs.map +1 -0
  134. package/dist/utils/templateResolver.d.ts +10 -0
  135. package/dist/utils/templateResolver.d.ts.map +1 -0
  136. package/dist/utils/templateResolver.mjs +64 -0
  137. package/dist/utils/templateResolver.mjs.map +1 -0
  138. package/dist/utils/topologicalSort.d.ts +10 -0
  139. package/dist/utils/topologicalSort.d.ts.map +1 -0
  140. package/dist/utils/topologicalSort.mjs +25 -0
  141. package/dist/utils/topologicalSort.mjs.map +1 -0
  142. package/nodes/alphafold_node/node.json +77 -0
  143. package/nodes/http_request_node/node.json +311 -0
  144. package/nodes/input_node/node.json +47 -0
  145. package/nodes/message_input_node/node.json +56 -0
  146. package/nodes/proteinmpnn_node/node.json +78 -0
  147. package/nodes/rfdiffusion_node/node.json +231 -0
  148. package/package.json +94 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineCanvas.mjs","sources":["../../components/PipelineCanvas.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState, useRef, useEffect } from 'react';\nimport ReactFlow, {\n Node,\n Edge,\n Background,\n Controls,\n MiniMap,\n Connection,\n addEdge,\n useNodesState,\n useEdgesState,\n MarkerType,\n Position,\n BackgroundVariant,\n} from 'reactflow';\nimport 'reactflow/dist/style.css';\nimport { usePipelineStore } from '../store/pipelineStore';\nimport { usePipelineContext } from '../context/PipelineContext';\nimport { PipelineNode, NodeStatus } from '../types/index';\nimport { PipelineNodeConfig } from './PipelineNodeConfig';\nimport { PipelineNodePalette } from './PipelineNodePalette';\nimport { SavedPipelinesList } from './SavedPipelinesList';\nimport { SavePipelineDialog } from './SavePipelineDialog';\nimport { ExecutionLogsPanel } from './ExecutionLogsPanel';\nimport { CustomHandle } from './CustomHandle';\nimport { NodeContextMenu } from './NodeContextMenu';\nimport { \n Play, \n Square, \n Trash2, \n Save, \n Loader2, \n CheckCircle2, \n XCircle, \n AlertCircle, \n Plus,\n FileInput,\n Sparkles,\n Dna,\n Atom,\n MessageSquare,\n Globe\n} from 'lucide-react';\n\n// Get status class for node border glow\nconst getStatusClasses = (status: NodeStatus, isExecuting: boolean, hasResultMetadata?: boolean) => {\n // If node has result_metadata, treat it as completed even if status is not explicitly set\n if (hasResultMetadata) {\n return 'border-green-500 shadow-[0_0_10px_rgba(34,197,94,0.3)]';\n }\n \n switch (status) {\n case 'running':\n return 'border-blue-500 shadow-[0_0_15px_rgba(59,130,246,0.5)] animate-pulse-glow';\n case 'success':\n case 'completed':\n return 'border-green-500 shadow-[0_0_10px_rgba(34,197,94,0.3)]';\n case 'error':\n return 'border-red-500 shadow-[0_0_10px_rgba(239,68,68,0.3)]';\n case 'pending':\n return isExecuting ? 'border-gray-300 opacity-60' : 'border-gray-300';\n default:\n return 'border-gray-300';\n }\n};\n\n// Editable label component for node labels\nconst EditableLabel: React.FC<{ \n label: string; \n nodeId: string; \n onUpdate: (nodeId: string, label: string) => void;\n}> = ({ label, nodeId, onUpdate }) => {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(label);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [isEditing]);\n\n useEffect(() => {\n setEditValue(label);\n }, [label]);\n\n const handleDoubleClick = () => {\n setIsEditing(true);\n };\n\n const handleBlur = () => {\n if (editValue.trim() !== label) {\n onUpdate(nodeId, editValue.trim() || label);\n }\n setIsEditing(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleBlur();\n } else if (e.key === 'Escape') {\n setEditValue(label);\n setIsEditing(false);\n }\n };\n\n if (isEditing) {\n return (\n <input\n ref={inputRef}\n type=\"text\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n className=\"w-full text-center text-xs font-medium text-white bg-gray-700/80 border border-gray-500 rounded px-2 py-1 outline-none focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n />\n );\n }\n\n return (\n <div\n onDoubleClick={handleDoubleClick}\n className=\"text-center text-xs font-medium text-gray-200 cursor-text hover:text-white transition-colors px-1 py-0.5 rounded hover:bg-gray-800/50\"\n title=\"Double-click to edit\"\n >\n {label || 'Unnamed'}\n </div>\n );\n};\n\n// Custom node components with enhanced animations\nconst InputNode: React.FC<{ data: any }> = ({ data }) => {\n const status = data.status as NodeStatus;\n const isExecuting = data.isExecuting;\n const lastClickTimeRef = useRef<number>(0);\n \n // Determine if node is completed (either by status or by having result_metadata)\n const isCompleted = status === 'completed' || status === 'success' || (data.result_metadata && Object.keys(data.result_metadata).length > 0);\n \n // Debug logging to help troubleshoot\n React.useEffect(() => {\n if (data.id && (status === 'completed' || status === 'success' || (data.result_metadata && Object.keys(data.result_metadata).length > 0))) {\n console.log('[InputNode] Status check:', {\n nodeId: data.id,\n status,\n hasResultMetadata: !!(data.result_metadata && Object.keys(data.result_metadata).length > 0),\n isCompleted,\n resultMetadataKeys: data.result_metadata ? Object.keys(data.result_metadata) : []\n });\n }\n }, [data.id, status, data.result_metadata, isCompleted]);\n \n const getStatusIcon = () => {\n // Always show checkmark if node has been executed (has result_metadata)\n if (isCompleted) {\n return <CheckCircle2 className=\"w-4 h-4 text-green-500\" />;\n }\n \n switch (status) {\n case 'running':\n return (\n <div className=\"relative\">\n <Loader2 className=\"w-4 h-4 animate-spin text-blue-500\" />\n <div className=\"absolute inset-0 bg-blue-400/30 rounded-full animate-ping\" />\n </div>\n );\n case 'error':\n return <XCircle className=\"w-4 h-4 text-red-500\" />;\n default:\n // Show checkmark if node has result_metadata (completed previously, even if status was reset)\n if (data.result_metadata && Object.keys(data.result_metadata).length > 0) {\n return <CheckCircle2 className=\"w-4 h-4 text-green-500\" />;\n }\n return null;\n }\n };\n\n const handleClick = (e: React.MouseEvent) => {\n const now = Date.now();\n const timeSinceLastClick = now - lastClickTimeRef.current;\n lastClickTimeRef.current = now;\n \n // If this click is part of a double-click (within 300ms), don't stop propagation\n // This allows React Flow's onNodeDoubleClick to fire\n if (timeSinceLastClick > 300) {\n e.stopPropagation();\n }\n };\n\n return (\n <div className=\"flex flex-col items-center\">\n <div \n className={`\n px-4 py-3 bg-white border-2 rounded-xl min-w-[220px] relative transition-all duration-300\n ${getStatusClasses(status, isExecuting, !!(data.result_metadata && Object.keys(data.result_metadata).length > 0))}\n `}\n onClick={handleClick}\n onDoubleClick={() => {\n // Allow double-click to bubble up to React Flow's onNodeDoubleClick\n // Don't stop propagation so the panel opens\n }}\n >\n <CustomHandle type=\"source\" position={Position.Right} />\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <div className={`w-8 h-8 rounded-lg flex items-center justify-center ${\n status === 'running' ? 'bg-blue-100' : \n isCompleted ? 'bg-green-100' : \n status === 'error' ? 'bg-red-100' : 'bg-blue-100'\n }`}>\n <FileInput className={`w-4 h-4 ${\n status === 'running' ? 'text-blue-600' : \n isCompleted ? 'text-green-600' : \n status === 'error' ? 'text-red-600' : 'text-blue-600'\n }`} />\n </div>\n <span className=\"font-semibold text-sm text-gray-900\">Input</span>\n </div>\n {getStatusIcon()}\n </div>\n <div className=\"text-xs text-gray-500 pl-10\">\n {data.config?.filename || 'No file selected'}\n </div>\n {(status === 'success' || status === 'completed' || (data.result_metadata && Object.keys(data.result_metadata).length > 0)) && (\n <div className=\"absolute -top-1 -right-1 w-4 h-4 bg-green-500 rounded-full flex items-center justify-center shadow-lg z-10\">\n <CheckCircle2 className=\"w-3 h-3 text-white\" />\n </div>\n )}\n </div>\n <div className=\"mt-1 w-full\" onClick={(e) => e.stopPropagation()}>\n <EditableLabel \n label={data.label || 'Input'} \n nodeId={data.id} \n onUpdate={data.onUpdateLabel || (() => {})} \n />\n </div>\n </div>\n );\n};\n\nconst RFdiffusionNode: React.FC<{ data: any }> = ({ data }) => {\n const status = data.status as NodeStatus;\n const isExecuting = data.isExecuting;\n \n // Determine if node is completed (either by status or by having result_metadata)\n const isCompleted = status === 'completed' || status === 'success' || (data.result_metadata && Object.keys(data.result_metadata).length > 0);\n \n const getStatusIcon = () => {\n // Always show checkmark if node has been executed (has result_metadata)\n if (isCompleted) {\n return <CheckCircle2 className=\"w-4 h-4 text-green-500\" />;\n }\n \n switch (status) {\n case 'running':\n return (\n <div className=\"relative\">\n <Loader2 className=\"w-4 h-4 animate-spin text-blue-500\" />\n <div className=\"absolute inset-0 bg-blue-400/30 rounded-full animate-ping\" />\n </div>\n );\n case 'error':\n return <XCircle className=\"w-4 h-4 text-red-500\" />;\n default:\n // Show checkmark if node has result_metadata (completed previously, even if status was reset)\n if (data.result_metadata && Object.keys(data.result_metadata).length > 0) {\n return <CheckCircle2 className=\"w-4 h-4 text-green-500\" />;\n }\n return null;\n }\n };\n\n return (\n <div className=\"flex flex-col items-center\">\n <div \n className={`\n px-4 py-3 bg-white border-2 rounded-xl min-w-[220px] relative transition-all duration-300\n ${getStatusClasses(status, isExecuting, !!(data.result_metadata && Object.keys(data.result_metadata).length > 0))}\n `}\n onClick={(e) => e.stopPropagation()}\n >\n <CustomHandle type=\"target\" position={Position.Left} />\n <CustomHandle type=\"source\" position={Position.Right} />\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <div className={`w-8 h-8 rounded-lg flex items-center justify-center ${\n status === 'running' ? 'bg-blue-100' : \n isCompleted ? 'bg-green-100' : \n status === 'error' ? 'bg-red-100' : 'bg-purple-100'\n }`}>\n <Sparkles className={`w-4 h-4 ${\n status === 'running' ? 'text-blue-600' : \n isCompleted ? 'text-green-600' : \n status === 'error' ? 'text-red-600' : 'text-purple-600'\n }`} />\n </div>\n <span className=\"font-semibold text-sm text-gray-900\">RFdiffusion</span>\n </div>\n {getStatusIcon()}\n </div>\n <div className=\"text-xs text-gray-500 space-y-1 pl-10\">\n <div>Contigs: {data.config?.contigs || 'N/A'}</div>\n {data.error && (\n <div className=\"text-red-600 flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n {data.error}\n </div>\n )}\n </div>\n {(status === 'success' || status === 'completed' || (data.result_metadata && Object.keys(data.result_metadata).length > 0)) && (\n <div className=\"absolute -top-1 -right-1 w-4 h-4 bg-green-500 rounded-full flex items-center justify-center shadow-lg z-10\">\n <CheckCircle2 className=\"w-3 h-3 text-white\" />\n </div>\n )}\n </div>\n <div className=\"mt-1 w-full\" onClick={(e) => e.stopPropagation()}>\n <EditableLabel \n label={data.label || 'RFdiffusion'} \n nodeId={data.id} \n onUpdate={data.onUpdateLabel || (() => {})} \n />\n </div>\n </div>\n );\n};\n\nconst ProteinMPNNNode: React.FC<{ data: any }> = ({ data }) => {\n const status = data.status as NodeStatus;\n const isExecuting = data.isExecuting;\n \n // Determine if node is completed (either by status or by having result_metadata)\n const isCompleted = status === 'completed' || status === 'success' || (data.result_metadata && Object.keys(data.result_metadata).length > 0);\n \n const getStatusIcon = () => {\n // Always show checkmark if node has been executed (has result_metadata)\n if (isCompleted) {\n return <CheckCircle2 className=\"w-4 h-4 text-green-500\" />;\n }\n \n switch (status) {\n case 'running':\n return (\n <div className=\"relative\">\n <Loader2 className=\"w-4 h-4 animate-spin text-blue-500\" />\n <div className=\"absolute inset-0 bg-blue-400/30 rounded-full animate-ping\" />\n </div>\n );\n case 'error':\n return <XCircle className=\"w-4 h-4 text-red-500\" />;\n default:\n // Show checkmark if node has result_metadata (completed previously, even if status was reset)\n if (data.result_metadata && Object.keys(data.result_metadata).length > 0) {\n return <CheckCircle2 className=\"w-4 h-4 text-green-500\" />;\n }\n return null;\n }\n };\n\n return (\n <div className=\"flex flex-col items-center\">\n <div \n className={`\n px-4 py-3 bg-white border-2 rounded-xl min-w-[220px] relative transition-all duration-300\n ${getStatusClasses(status, isExecuting, !!(data.result_metadata && Object.keys(data.result_metadata).length > 0))}\n `}\n onClick={(e) => e.stopPropagation()}\n >\n <CustomHandle type=\"target\" position={Position.Left} />\n <CustomHandle type=\"source\" position={Position.Right} />\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <div className={`w-8 h-8 rounded-lg flex items-center justify-center ${\n status === 'running' ? 'bg-blue-100' : \n isCompleted ? 'bg-green-100' : \n status === 'error' ? 'bg-red-100' : 'bg-green-100'\n }`}>\n <Dna className={`w-4 h-4 ${\n status === 'running' ? 'text-blue-600' : \n isCompleted ? 'text-green-600' : \n status === 'error' ? 'text-red-600' : 'text-green-600'\n }`} />\n </div>\n <span className=\"font-semibold text-sm text-gray-900\">ProteinMPNN</span>\n </div>\n {getStatusIcon()}\n </div>\n <div className=\"text-xs text-gray-500 space-y-1 pl-10\">\n <div>Sequences: {data.config?.num_sequences || 'N/A'}</div>\n {data.error && (\n <div className=\"text-red-600 flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n {data.error}\n </div>\n )}\n </div>\n {(status === 'success' || status === 'completed' || (data.result_metadata && Object.keys(data.result_metadata).length > 0)) && (\n <div className=\"absolute -top-1 -right-1 w-4 h-4 bg-green-500 rounded-full flex items-center justify-center shadow-lg z-10\">\n <CheckCircle2 className=\"w-3 h-3 text-white\" />\n </div>\n )}\n </div>\n <div className=\"mt-1 w-full\" onClick={(e) => e.stopPropagation()}>\n <EditableLabel \n label={data.label || 'ProteinMPNN'} \n nodeId={data.id} \n onUpdate={data.onUpdateLabel || (() => {})} \n />\n </div>\n </div>\n );\n};\n\nconst AlphaFoldNode: React.FC<{ data: any }> = ({ data }) => {\n const status = data.status as NodeStatus;\n const isExecuting = data.isExecuting;\n \n // Determine if node is completed (either by status or by having result_metadata)\n const isCompleted = status === 'completed' || status === 'success' || (data.result_metadata && Object.keys(data.result_metadata).length > 0);\n \n const getStatusIcon = () => {\n // Always show checkmark if node has been executed (has result_metadata)\n if (isCompleted) {\n return <CheckCircle2 className=\"w-4 h-4 text-green-500\" />;\n }\n \n switch (status) {\n case 'running':\n return (\n <div className=\"relative\">\n <Loader2 className=\"w-4 h-4 animate-spin text-blue-500\" />\n <div className=\"absolute inset-0 bg-blue-400/30 rounded-full animate-ping\" />\n </div>\n );\n case 'error':\n return <XCircle className=\"w-4 h-4 text-red-500\" />;\n default:\n // Show checkmark if node has result_metadata (completed previously, even if status was reset)\n if (data.result_metadata && Object.keys(data.result_metadata).length > 0) {\n return <CheckCircle2 className=\"w-4 h-4 text-green-500\" />;\n }\n return null;\n }\n };\n\n return (\n <div className=\"flex flex-col items-center\">\n <div \n className={`\n px-4 py-3 bg-white border-2 rounded-xl min-w-[220px] relative transition-all duration-300\n ${getStatusClasses(status, isExecuting, !!(data.result_metadata && Object.keys(data.result_metadata).length > 0))}\n `}\n onClick={(e) => e.stopPropagation()}\n >\n <CustomHandle type=\"target\" position={Position.Left} />\n <CustomHandle type=\"source\" position={Position.Right} />\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <div className={`w-8 h-8 rounded-lg flex items-center justify-center ${\n status === 'running' ? 'bg-blue-100' : \n isCompleted ? 'bg-green-100' : \n status === 'error' ? 'bg-red-100' : 'bg-orange-100'\n }`}>\n <Atom className={`w-4 h-4 ${\n status === 'running' ? 'text-blue-600' : \n isCompleted ? 'text-green-600' : \n status === 'error' ? 'text-red-600' : 'text-orange-600'\n }`} />\n </div>\n <span className=\"font-semibold text-sm text-gray-900\">AlphaFold</span>\n </div>\n {getStatusIcon()}\n </div>\n <div className=\"text-xs text-gray-500 space-y-1 pl-10\">\n <div>Recycles: {data.config?.recycle_count || 'N/A'}</div>\n {data.error && (\n <div className=\"text-red-600 flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n {data.error}\n </div>\n )}\n </div>\n {(status === 'success' || status === 'completed' || (data.result_metadata && Object.keys(data.result_metadata).length > 0)) && (\n <div className=\"absolute -top-1 -right-1 w-4 h-4 bg-green-500 rounded-full flex items-center justify-center shadow-lg z-10\">\n <CheckCircle2 className=\"w-3 h-3 text-white\" />\n </div>\n )}\n </div>\n <div className=\"mt-1 w-full\" onClick={(e) => e.stopPropagation()}>\n <EditableLabel \n label={data.label || 'AlphaFold'} \n nodeId={data.id} \n onUpdate={data.onUpdateLabel || (() => {})} \n />\n </div>\n </div>\n );\n};\n\nconst MessageInputNode: React.FC<{ data: any }> = ({ data }) => {\n const status = data.status as NodeStatus;\n const isExecuting = data.isExecuting;\n \n // Determine if node is completed (either by status or by having result_metadata)\n const isCompleted = status === 'completed' || status === 'success' || (data.result_metadata && Object.keys(data.result_metadata).length > 0);\n \n const getStatusIcon = () => {\n // Always show checkmark if node has been executed (has result_metadata)\n if (isCompleted) {\n return <CheckCircle2 className=\"w-4 h-4 text-green-500\" />;\n }\n \n switch (status) {\n case 'running':\n return (\n <div className=\"relative\">\n <Loader2 className=\"w-4 h-4 animate-spin text-blue-500\" />\n <div className=\"absolute inset-0 bg-blue-400/30 rounded-full animate-ping\" />\n </div>\n );\n case 'error':\n return <XCircle className=\"w-4 h-4 text-red-500\" />;\n default:\n // Show checkmark if node has result_metadata (completed previously, even if status was reset)\n if (data.result_metadata && Object.keys(data.result_metadata).length > 0) {\n return <CheckCircle2 className=\"w-4 h-4 text-green-500\" />;\n }\n return null;\n }\n };\n\n const codePreview = data.config?.code \n ? (data.config.code.length > 40 \n ? data.config.code.substring(0, 40).replace(/\\n/g, ' ') + '...' \n : data.config.code.replace(/\\n/g, ' '))\n : 'No code';\n\n return (\n <div className=\"flex flex-col items-center\">\n <div \n className={`\n px-4 py-3 bg-white border-2 rounded-xl min-w-[220px] relative transition-all duration-300\n ${getStatusClasses(status, isExecuting, !!(data.result_metadata && Object.keys(data.result_metadata).length > 0))}\n `}\n onClick={(e) => e.stopPropagation()}\n >\n <CustomHandle type=\"source\" position={Position.Right} />\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <div className={`w-8 h-8 rounded-lg flex items-center justify-center ${\n status === 'running' ? 'bg-blue-100' : \n isCompleted ? 'bg-green-100' : \n status === 'error' ? 'bg-red-100' : 'bg-green-100'\n }`}>\n <MessageSquare className={`w-4 h-4 ${\n status === 'running' ? 'text-blue-600' : \n isCompleted ? 'text-green-600' : \n status === 'error' ? 'text-red-600' : 'text-green-600'\n }`} />\n </div>\n <span className=\"font-semibold text-sm text-gray-900\">Code Execution</span>\n </div>\n {getStatusIcon()}\n </div>\n <div className=\"text-xs text-gray-500 pl-10 font-mono\">\n {codePreview}\n </div>\n {(status === 'success' || status === 'completed' || (data.result_metadata && Object.keys(data.result_metadata).length > 0)) && (\n <div className=\"absolute -top-1 -right-1 w-4 h-4 bg-green-500 rounded-full flex items-center justify-center shadow-lg z-10\">\n <CheckCircle2 className=\"w-3 h-3 text-white\" />\n </div>\n )}\n </div>\n <div className=\"mt-1 w-full\" onClick={(e) => e.stopPropagation()}>\n <EditableLabel \n label={data.label || 'Code Execution'} \n nodeId={data.id} \n onUpdate={data.onUpdateLabel || (() => {})} \n />\n </div>\n </div>\n );\n};\n\nconst HttpRequestNode: React.FC<{ data: any }> = ({ data }) => {\n const status = data.status as NodeStatus;\n const isExecuting = data.isExecuting;\n \n // Determine if node is completed (either by status or by having result_metadata)\n const isCompleted = status === 'completed' || status === 'success' || (data.result_metadata && Object.keys(data.result_metadata).length > 0);\n \n const getStatusIcon = () => {\n // Always show checkmark if node has been executed (has result_metadata)\n if (isCompleted) {\n return <CheckCircle2 className=\"w-4 h-4 text-green-500\" />;\n }\n \n switch (status) {\n case 'running':\n return (\n <div className=\"relative\">\n <Loader2 className=\"w-4 h-4 animate-spin text-blue-500\" />\n <div className=\"absolute inset-0 bg-blue-400/30 rounded-full animate-ping\" />\n </div>\n );\n case 'error':\n return <XCircle className=\"w-4 h-4 text-red-500\" />;\n default:\n // Show checkmark if node has result_metadata (completed previously, even if status was reset)\n if (data.result_metadata && Object.keys(data.result_metadata).length > 0) {\n return <CheckCircle2 className=\"w-4 h-4 text-green-500\" />;\n }\n return null;\n }\n };\n\n const urlPreview = data.config?.url \n ? (data.config.url.length > 30 \n ? data.config.url.substring(0, 30) + '...' \n : data.config.url)\n : 'No URL';\n\n return (\n <div className=\"flex flex-col items-center\">\n <div \n className={`\n px-4 py-3 bg-white border-2 rounded-xl min-w-[220px] relative transition-all duration-300\n ${getStatusClasses(status, isExecuting, !!(data.result_metadata && Object.keys(data.result_metadata).length > 0))}\n `}\n onClick={(e) => e.stopPropagation()}\n >\n <CustomHandle type=\"target\" position={Position.Left} />\n <CustomHandle type=\"source\" position={Position.Right} />\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <div className={`w-8 h-8 rounded-lg flex items-center justify-center ${\n status === 'running' ? 'bg-blue-100' : \n isCompleted ? 'bg-green-100' : \n status === 'error' ? 'bg-red-100' : 'bg-blue-100'\n }`}>\n <Globe className={`w-4 h-4 ${\n status === 'running' ? 'text-blue-600' : \n isCompleted ? 'text-green-600' : \n status === 'error' ? 'text-red-600' : 'text-blue-600'\n }`} />\n </div>\n <span className=\"font-semibold text-sm text-gray-900\">HTTP Request</span>\n </div>\n {getStatusIcon()}\n </div>\n <div className=\"text-xs text-gray-500 space-y-1 pl-10\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium\">{data.config?.method || 'GET'}</span>\n <span className=\"text-gray-400\">•</span>\n <span className=\"truncate\">{urlPreview}</span>\n </div>\n {data.error && (\n <div className=\"text-red-600 flex items-center gap-1\">\n <AlertCircle className=\"w-3 h-3\" />\n {data.error}\n </div>\n )}\n </div>\n {(status === 'success' || status === 'completed' || (data.result_metadata && Object.keys(data.result_metadata).length > 0)) && (\n <div className=\"absolute -top-1 -right-1 w-4 h-4 bg-green-500 rounded-full flex items-center justify-center shadow-lg z-10\">\n <CheckCircle2 className=\"w-3 h-3 text-white\" />\n </div>\n )}\n </div>\n <div className=\"mt-1 w-full\" onClick={(e) => e.stopPropagation()}>\n <EditableLabel \n label={data.label || 'HTTP Request'} \n nodeId={data.id} \n onUpdate={data.onUpdateLabel || (() => {})} \n />\n </div>\n </div>\n );\n};\n\n// Define nodeTypes outside component to ensure stable reference\n// Using Object.freeze to prevent accidental mutations\nconst nodeTypes = Object.freeze({\n input_node: InputNode,\n rfdiffusion_node: RFdiffusionNode,\n proteinmpnn_node: ProteinMPNNNode,\n alphafold_node: AlphaFoldNode,\n message_input_node: MessageInputNode,\n http_request_node: HttpRequestNode,\n});\n\nexport const PipelineCanvas: React.FC = () => {\n const {\n currentPipeline,\n ghostBlueprint,\n isExecuting,\n viewMode,\n setViewMode,\n approveBlueprint,\n rejectBlueprint,\n updateNode,\n deleteNode,\n addNode,\n addEdge: addPipelineEdge,\n startExecution,\n stopExecution,\n clearPipeline,\n lastSavedAt,\n isSaving,\n setCurrentPipeline,\n syncPipelines,\n } = usePipelineStore();\n const { authState, apiClient } = usePipelineContext();\n const user = authState?.user;\n\n // Sync pipelines from backend when component mounts and user is authenticated\n React.useEffect(() => {\n if (user && apiClient) {\n console.log('[PipelineCanvas] Syncing pipelines from backend...');\n syncPipelines({ apiClient, authState }).catch((error) => {\n console.error('[PipelineCanvas] Failed to sync pipelines:', error);\n });\n }\n }, [user, apiClient, authState, syncPipelines]);\n\n // Memoize nodeTypes to ensure stable reference for React Flow\n const memoizedNodeTypes = useMemo(() => nodeTypes, []);\n\n const [selectedNodeId, setSelectedNodeId] = React.useState<string | null>(null);\n const [showPalette, setShowPalette] = React.useState(false);\n const [showSaveDialog, setShowSaveDialog] = React.useState(false);\n \n // Auto-select first node when a new pipeline is created from blueprint (for configuration)\n // This helps users immediately see the configuration panel after approving a blueprint\n // But NOT when loading an existing pipeline from the sidebar\n const previousPipelineIdRef = React.useRef<string | null>(null);\n const shouldAutoSelectRef = React.useRef<boolean>(false);\n \n React.useEffect(() => {\n const currentPipelineId = currentPipeline?.id || null;\n const pipelineChanged = currentPipelineId !== previousPipelineIdRef.current;\n \n // Only auto-select if:\n // 1. We have a pipeline with nodes\n // 2. The pipeline ID changed (new pipeline created)\n // 3. We should auto-select (set when blueprint is approved)\n // 4. No node is currently selected\n // 5. We're in editor mode\n if (\n currentPipeline && \n currentPipeline.nodes.length > 0 && \n pipelineChanged &&\n shouldAutoSelectRef.current &&\n !selectedNodeId && \n viewMode === 'editor'\n ) {\n // Find the first input_node, or fall back to the first node\n const firstInputNode = currentPipeline.nodes.find(n => n.type === 'input_node');\n const nodeToSelect = firstInputNode || currentPipeline.nodes[0];\n if (nodeToSelect) {\n console.log('[PipelineCanvas] Auto-selecting first node for configuration:', nodeToSelect.id, nodeToSelect.type);\n // Small delay to ensure the canvas is rendered\n setTimeout(() => {\n setSelectedNodeId(nodeToSelect.id);\n }, 100);\n }\n // Reset the flag after auto-selecting\n shouldAutoSelectRef.current = false;\n } else if (pipelineChanged && !shouldAutoSelectRef.current) {\n // Pipeline changed but we shouldn't auto-select (e.g., loaded from sidebar)\n // Clear any selected node to ensure clean state\n if (selectedNodeId) {\n setSelectedNodeId(null);\n }\n }\n \n // Update the ref to track pipeline changes\n previousPipelineIdRef.current = currentPipelineId;\n }, [currentPipeline?.id, currentPipeline?.nodes.length, selectedNodeId, viewMode]);\n \n // Listen for blueprint approval events to enable auto-selection\n React.useEffect(() => {\n const handleBlueprintApproved = () => {\n console.log('[PipelineCanvas] Blueprint approved, will auto-select first node');\n shouldAutoSelectRef.current = true;\n };\n \n // Listen for custom event when blueprint is approved\n window.addEventListener('blueprint-approved', handleBlueprintApproved);\n \n return () => {\n window.removeEventListener('blueprint-approved', handleBlueprintApproved);\n };\n }, []);\n \n // Context menu state\n const [contextMenu, setContextMenu] = React.useState<{\n nodeId: string;\n x: number;\n y: number;\n } | null>(null);\n \n // Draggable panel state\n const [panelPosition, setPanelPosition] = React.useState({ right: 16, top: 80 }); // Default: right-4 (16px), top-20 (80px)\n const [panelSize, setPanelSize] = React.useState({ width: 900, height: 600 }); // Default panel size\n const [isDragging, setIsDragging] = React.useState(false);\n const [isResizing, setIsResizing] = React.useState(false);\n const [resizeType, setResizeType] = React.useState<'width-right' | 'width-left' | 'height-bottom' | 'height-top' | 'both-bottom-right' | 'both-bottom-left' | 'both-top-right' | 'both-top-left' | null>(null);\n const [dragStart, setDragStart] = React.useState({ x: 0, y: 0 });\n const [resizeStart, setResizeStart] = React.useState({ x: 0, y: 0, width: 0, height: 0, right: 0, top: 0 });\n const panelRef = React.useRef<HTMLDivElement>(null);\n\n // Drag handlers\n const handleMouseDown = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n // Don't start dragging if clicking on interactive elements or resize handles\n const target = e.target as HTMLElement;\n if (\n target.tagName === 'BUTTON' ||\n target.tagName === 'INPUT' ||\n target.tagName === 'SELECT' ||\n target.tagName === 'TEXTAREA' ||\n target.closest('button') ||\n target.closest('input') ||\n target.closest('select') ||\n target.closest('textarea') ||\n target.closest('[role=\"button\"]') ||\n target.closest('[class*=\"cursor-col-resize\"]') ||\n target.closest('[class*=\"cursor-row-resize\"]') ||\n target.closest('[class*=\"cursor-nwse-resize\"]') ||\n target.closest('[class*=\"cursor-nesw-resize\"]')\n ) {\n return;\n }\n \n if (panelRef.current) {\n setIsDragging(true);\n const rect = panelRef.current.getBoundingClientRect();\n setDragStart({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n e.preventDefault(); // Prevent text selection\n }\n }, []);\n\n const handleMouseMove = useCallback((e: MouseEvent) => {\n if (isResizing && panelRef.current) {\n const parentRect = panelRef.current.parentElement?.getBoundingClientRect();\n if (parentRect) {\n const deltaX = e.clientX - resizeStart.x;\n const deltaY = e.clientY - resizeStart.y;\n \n let newWidth = resizeStart.width;\n let newHeight = resizeStart.height;\n let newRight = resizeStart.right;\n let newTop = resizeStart.top;\n \n // Handle width resizing - natural behavior: fix the opposite edge\n if (resizeType?.includes('width-right') || resizeType?.includes('both-bottom-right') || resizeType?.includes('both-top-right')) {\n // Resizing from right edge - left edge stays fixed\n // deltaX: positive = dragging right (increases width), negative = dragging left (decreases width)\n newWidth = Math.max(400, Math.min(1200, resizeStart.width + deltaX));\n } else if (resizeType?.includes('width-left') || resizeType?.includes('both-bottom-left') || resizeType?.includes('both-top-left')) {\n // Resizing from left edge - right edge stays fixed\n // deltaX: positive = dragging right (should decrease width), negative = dragging left (should increase width)\n // So we invert: newWidth = oldWidth - deltaX\n // But if user says it's opposite, maybe the coordinate system is different\n // Let's try: dragging left edge left (negative deltaX) = increase width, dragging right (positive deltaX) = decrease width\n newWidth = Math.max(400, Math.min(1200, resizeStart.width - deltaX));\n // Adjust right position to keep right edge fixed\n // When width changes, right position must change by the same amount in opposite direction\n newRight = resizeStart.right + (resizeStart.width - newWidth);\n // Constrain to parent bounds\n newRight = Math.max(0, Math.min(parentRect.width - newWidth, newRight));\n }\n \n // Handle height resizing - natural behavior: fix the opposite edge\n if (resizeType?.includes('height-bottom') || resizeType?.includes('both-bottom-right') || resizeType?.includes('both-bottom-left')) {\n // Resizing from bottom edge - top edge stays fixed\n // deltaY: positive = dragging down (increases height), negative = dragging up (decreases height)\n newHeight = Math.max(300, Math.min(parentRect.height - resizeStart.top, resizeStart.height + deltaY));\n } else if (resizeType?.includes('height-top') || resizeType?.includes('both-top-right') || resizeType?.includes('both-top-left')) {\n // Resizing from top edge - bottom edge stays fixed\n // deltaY: positive = dragging down (decreases height), negative = dragging up (increases height)\n // The bottom edge position: top + height\n // To keep bottom fixed: newTop = oldTop + (oldHeight - newHeight)\n newHeight = Math.max(300, Math.min(parentRect.height - resizeStart.top, resizeStart.height - deltaY));\n // Adjust top to keep bottom edge fixed\n newTop = resizeStart.top + (resizeStart.height - newHeight);\n // Constrain to parent bounds\n newTop = Math.max(0, Math.min(parentRect.height - newHeight, newTop));\n }\n \n setPanelSize({ width: newWidth, height: newHeight });\n setPanelPosition({ right: newRight, top: newTop });\n }\n } else if (isDragging && panelRef.current) {\n const parentRect = panelRef.current.parentElement?.getBoundingClientRect();\n if (parentRect) {\n // Calculate new position relative to parent\n const newLeft = e.clientX - parentRect.left - dragStart.x;\n const newTop = e.clientY - parentRect.top - dragStart.y;\n \n // Convert left to right (for absolute positioning with right property)\n const newRight = parentRect.width - newLeft - panelSize.width;\n \n // Constrain to parent bounds\n const minRight = 0;\n const maxRight = parentRect.width - panelSize.width;\n const minTop = 0;\n const maxTop = parentRect.height - 100; // minimum panel height\n \n setPanelPosition({\n right: Math.max(minRight, Math.min(newRight, maxRight)),\n top: Math.max(minTop, Math.min(newTop, maxTop)),\n });\n }\n }\n }, [isDragging, isResizing, dragStart, resizeStart, resizeType, panelSize.width]);\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n setIsResizing(false);\n setResizeType(null);\n }, []);\n\n const handleResizeStart = useCallback((e: React.MouseEvent, type: 'width-right' | 'width-left' | 'height-bottom' | 'height-top' | 'both-bottom-right' | 'both-bottom-left' | 'both-top-right' | 'both-top-left') => {\n e.preventDefault();\n e.stopPropagation();\n if (panelRef.current) {\n setIsResizing(true);\n setResizeType(type);\n const rect = panelRef.current.getBoundingClientRect();\n const parentRect = panelRef.current.parentElement?.getBoundingClientRect();\n if (parentRect) {\n // For left edge, capture the left edge position, not mouse position\n // For right edge, capture the right edge position\n let startX = e.clientX;\n if (type.includes('width-left') || type.includes('both-bottom-left') || type.includes('both-top-left')) {\n // Use the left edge of the panel as reference\n startX = rect.left;\n } else if (type.includes('width-right') || type.includes('both-bottom-right') || type.includes('both-top-right')) {\n // Use the right edge of the panel as reference\n startX = rect.right;\n }\n \n setResizeStart({\n x: startX,\n y: e.clientY,\n width: panelSize.width,\n height: panelSize.height,\n right: panelPosition.right,\n top: panelPosition.top,\n });\n }\n }\n }, [panelSize, panelPosition]);\n\n // Attach global mouse event listeners for dragging and resizing\n React.useEffect(() => {\n if (isDragging || isResizing) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }\n }, [isDragging, isResizing, handleMouseMove, handleMouseUp]);\n\n // Convert pipeline nodes to React Flow nodes\n const reactFlowNodes = useMemo(() => {\n const nodes: PipelineNode[] = [];\n \n // Add ghost nodes if blueprint exists\n if (ghostBlueprint) {\n ghostBlueprint.nodes.forEach((node, index) => {\n nodes.push({\n ...node,\n status: 'idle',\n position: { x: 100 + (index % 3) * 300, y: 100 + Math.floor(index / 3) * 200 },\n });\n });\n }\n \n // Add current pipeline nodes\n if (currentPipeline) {\n currentPipeline.nodes.forEach((node) => {\n nodes.push(node);\n });\n }\n \n return nodes.map((node, index) => ({\n id: node.id,\n type: node.type,\n position: node.position || { x: 100 + (index % 3) * 300, y: 100 + Math.floor(index / 3) * 200 },\n data: {\n ...node,\n label: node.label,\n config: node.config,\n status: node.status,\n error: node.error,\n result_metadata: node.result_metadata,\n isExecuting,\n onUpdateLabel: (nodeId: string, newLabel: string) => {\n updateNode(nodeId, { label: newLabel });\n },\n },\n style: {\n opacity: ghostBlueprint && !currentPipeline ? 0.5 : 1,\n borderStyle: ghostBlueprint && !currentPipeline ? 'dashed' : 'solid',\n },\n })) as Node[];\n }, [currentPipeline, ghostBlueprint, isExecuting]);\n\n // Convert pipeline edges to React Flow edges with enhanced styling\n const reactFlowEdges = useMemo(() => {\n const edges: Array<{ source: string; target: string }> = [];\n \n if (ghostBlueprint) {\n edges.push(...ghostBlueprint.edges);\n }\n \n if (currentPipeline) {\n edges.push(...currentPipeline.edges);\n }\n \n return edges.map((edge) => {\n // Check if source node is running or complete\n const sourceNode = currentPipeline?.nodes.find(n => n.id === edge.source);\n const isSourceRunning = sourceNode?.status === 'running';\n const isSourceComplete = sourceNode?.status === 'success' || sourceNode?.status === 'completed';\n \n return {\n id: `e${edge.source}-${edge.target}`,\n source: edge.source,\n target: edge.target,\n type: 'smoothstep',\n animated: isExecuting && (isSourceRunning || isSourceComplete),\n style: {\n stroke: isSourceComplete ? '#22c55e' : isSourceRunning ? '#3b82f6' : '#9ca3af',\n strokeWidth: isSourceRunning ? 3 : 2,\n },\n markerEnd: {\n type: MarkerType.ArrowClosed,\n color: isSourceComplete ? '#22c55e' : isSourceRunning ? '#3b82f6' : '#9ca3af',\n },\n };\n }) as Edge[];\n }, [currentPipeline, ghostBlueprint, isExecuting]);\n\n const [nodes, setNodes, onNodesChange] = useNodesState(reactFlowNodes);\n const [edges, setEdges, onEdgesChange] = useEdgesState(reactFlowEdges);\n\n // Update nodes/edges when pipeline changes - use ref to prevent infinite loops\n const prevNodesRef = React.useRef<string>('');\n const prevEdgesRef = React.useRef<string>('');\n\n React.useEffect(() => {\n const nodesKey = JSON.stringify(reactFlowNodes.map(n => ({ id: n.id, data: n.data, position: n.position })));\n if (nodesKey !== prevNodesRef.current) {\n prevNodesRef.current = nodesKey;\n setNodes(reactFlowNodes);\n }\n }, [reactFlowNodes, setNodes]);\n\n React.useEffect(() => {\n const edgesKey = JSON.stringify(reactFlowEdges.map(e => ({ id: e.id, source: e.source, target: e.target })));\n if (edgesKey !== prevEdgesRef.current) {\n prevEdgesRef.current = edgesKey;\n setEdges(reactFlowEdges);\n }\n }, [reactFlowEdges, setEdges]);\n\n // Auto-save when node positions change (debounced to avoid excessive saves during dragging)\n const positionUpdateTimerRef = React.useRef<NodeJS.Timeout | null>(null);\n React.useEffect(() => {\n if (nodes.length > 0 && currentPipeline) {\n // Clear previous timer\n if (positionUpdateTimerRef.current) {\n clearTimeout(positionUpdateTimerRef.current);\n }\n \n // Debounce position updates (only save after user stops dragging)\n positionUpdateTimerRef.current = setTimeout(() => {\n const updatedNodes = currentPipeline.nodes.map((pipelineNode) => {\n const reactFlowNode = nodes.find((n) => n.id === pipelineNode.id);\n if (reactFlowNode && reactFlowNode.position) {\n return {\n ...pipelineNode,\n position: reactFlowNode.position,\n };\n }\n return pipelineNode;\n });\n \n // Only update if positions actually changed\n const positionsChanged = updatedNodes.some((node) => {\n const original = currentPipeline.nodes.find(n => n.id === node.id);\n return original && (\n original.position?.x !== node.position?.x ||\n original.position?.y !== node.position?.y\n );\n });\n \n if (positionsChanged) {\n setCurrentPipeline({\n ...currentPipeline,\n nodes: updatedNodes,\n updatedAt: new Date(),\n });\n }\n }, 500); // Wait 500ms after last position change\n }\n \n return () => {\n if (positionUpdateTimerRef.current) {\n clearTimeout(positionUpdateTimerRef.current);\n }\n };\n }, [nodes, currentPipeline, setCurrentPipeline]);\n\n const onConnect = useCallback(\n (params: Connection | null) => {\n if (!params || !params.source || !params.target) {\n console.warn('[PipelineCanvas] Invalid connection params:', params);\n return;\n }\n try {\n addPipelineEdge(params.source, params.target);\n setEdges((eds: Edge[]) => addEdge(params, eds));\n setEdges((eds) => addEdge(params as Connection, eds));\n } catch (error) {\n console.error('[PipelineCanvas] Error adding edge:', error);\n }\n },\n [addPipelineEdge, setEdges]\n );\n\n const onNodeClick = useCallback((_event: React.MouseEvent, node: Node) => {\n setSelectedNodeId(node.id);\n }, []);\n\n const onNodeDoubleClick = useCallback((_event: React.MouseEvent, node: Node) => {\n setSelectedNodeId(node.id);\n }, []);\n\n const onNodeContextMenu = useCallback((event: React.MouseEvent, node: Node) => {\n event.preventDefault();\n event.stopPropagation();\n \n // Get mouse position relative to viewport\n setContextMenu({\n nodeId: node.id,\n x: event.clientX,\n y: event.clientY,\n });\n }, []);\n\n const handleNodeDelete = useCallback(\n (nodeId: string) => {\n deleteNode(nodeId);\n setSelectedNodeId(null);\n },\n [deleteNode]\n );\n\n // Context menu handlers\n const handleContextMenuRename = useCallback(() => {\n if (!contextMenu) return;\n const node = currentPipeline?.nodes.find(n => n.id === contextMenu.nodeId);\n if (node) {\n setSelectedNodeId(contextMenu.nodeId);\n // Trigger rename by focusing the EditableLabel (handled by the node component)\n }\n }, [contextMenu, currentPipeline]);\n\n const handleContextMenuDelete = useCallback(() => {\n if (!contextMenu) return;\n if (confirm('Are you sure you want to delete this node?')) {\n handleNodeDelete(contextMenu.nodeId);\n }\n }, [contextMenu, handleNodeDelete]);\n\n const handleContextMenuConfigure = useCallback(() => {\n if (!contextMenu) return;\n setSelectedNodeId(contextMenu.nodeId);\n }, [contextMenu]);\n\n const handleContextMenuDuplicate = useCallback(() => {\n if (!contextMenu || !currentPipeline) return;\n const node = currentPipeline.nodes.find(n => n.id === contextMenu.nodeId);\n if (!node) return;\n\n const newNode: PipelineNode = {\n ...node,\n id: `node_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n label: `${node.label} (Copy)`,\n position: {\n x: (node.position?.x || 0) + 50,\n y: (node.position?.y || 0) + 50,\n },\n status: 'idle',\n error: undefined,\n result_metadata: undefined,\n };\n\n addNode(newNode);\n }, [contextMenu, currentPipeline, addNode]);\n\n const handleCloseContextMenu = useCallback(() => {\n setContextMenu(null);\n }, []);\n\n const handleSavePipeline = () => {\n setShowSaveDialog(true);\n };\n\n const hasGhostNodes = !!ghostBlueprint && !currentPipeline;\n const hasNodes = (currentPipeline?.nodes.length || 0) > 0;\n\n // Format last saved time\n const formatLastSaved = (date: Date | string | null) => {\n if (!date) return '';\n // Convert string to Date if needed (from localStorage)\n const dateObj = date instanceof Date ? date : new Date(date);\n if (isNaN(dateObj.getTime())) return '';\n \n const now = new Date();\n const diff = now.getTime() - dateObj.getTime();\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n \n if (seconds < 10) return 'Just now';\n if (seconds < 60) return `${seconds}s ago`;\n if (minutes < 60) return `${minutes}m ago`;\n return dateObj.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n };\n\n return (\n <div className=\"h-full flex flex-col bg-[#1a1a2e]\">\n {/* Toolbar with Editor/Executions toggle */}\n <div className=\"h-14 flex items-center justify-between px-4 border-b border-gray-700/50 bg-[#1e1e32]\">\n {/* Left side - View toggle */}\n <div className=\"flex items-center gap-4\">\n {/* Auto-save indicator (like n8n) */}\n {currentPipeline && (\n <div className=\"flex items-center gap-2 text-xs text-gray-400\">\n {isSaving ? (\n <>\n <Loader2 className=\"w-3 h-3 animate-spin\" />\n <span>Saving...</span>\n </>\n ) : lastSavedAt ? (\n <>\n <CheckCircle2 className=\"w-3 h-3 text-green-500\" />\n <span className=\"text-gray-300\">Saved</span>\n <span className=\"text-gray-500\">•</span>\n <span>{formatLastSaved(lastSavedAt)}</span>\n </>\n ) : null}\n </div>\n )}\n \n {/* n8n-style Editor/Executions toggle */}\n <div className=\"flex bg-gray-800/50 rounded-lg p-0.5\">\n <button\n onClick={() => setViewMode('editor')}\n className={`px-4 py-1.5 text-xs font-medium rounded-md transition-all ${\n viewMode === 'editor'\n ? 'bg-gray-700 text-white shadow-sm'\n : 'text-gray-400 hover:text-gray-200'\n }`}\n >\n Editor\n </button>\n <button\n onClick={() => setViewMode('executions')}\n className={`px-4 py-1.5 text-xs font-medium rounded-md transition-all flex items-center gap-1.5 ${\n viewMode === 'executions'\n ? 'bg-gray-700 text-white shadow-sm'\n : 'text-gray-400 hover:text-gray-200'\n }`}\n >\n Executions\n {isExecuting && (\n <span className=\"relative flex h-2 w-2\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75\"></span>\n <span className=\"relative inline-flex rounded-full h-2 w-2 bg-green-500\"></span>\n </span>\n )}\n </button>\n </div>\n \n {hasGhostNodes && (\n <span className=\"px-2 py-1 text-xs bg-yellow-500/20 text-yellow-400 rounded border border-yellow-500/30\">\n Review Blueprint\n </span>\n )}\n </div>\n \n {/* Right side - Action buttons */}\n <div className=\"flex items-center gap-2\">\n {!hasGhostNodes && viewMode === 'editor' && (\n <button\n onClick={() => setShowPalette(!showPalette)}\n className=\"px-3 py-1.5 text-xs bg-gray-700 text-gray-200 rounded-lg hover:bg-gray-600 flex items-center gap-1.5 transition-colors\"\n title=\"Toggle node palette\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add Node\n </button>\n )}\n {hasGhostNodes ? (\n <>\n <button\n onClick={approveBlueprint}\n className=\"px-3 py-1.5 text-xs bg-green-600 text-white rounded-lg hover:bg-green-500 flex items-center gap-1.5 transition-colors\"\n >\n <CheckCircle2 className=\"w-3.5 h-3.5\" />\n Approve\n </button>\n <button\n onClick={rejectBlueprint}\n className=\"px-3 py-1.5 text-xs bg-red-600/80 text-white rounded-lg hover:bg-red-500 flex items-center gap-1.5 transition-colors\"\n >\n <XCircle className=\"w-3.5 h-3.5\" />\n Reject\n </button>\n </>\n ) : (\n <>\n {hasNodes && (\n <>\n {isExecuting ? (\n <button\n onClick={stopExecution}\n className=\"px-3 py-1.5 text-xs bg-red-600/80 text-white rounded-lg hover:bg-red-500 flex items-center gap-1.5 transition-colors\"\n >\n <Square className=\"w-3.5 h-3.5\" />\n Stop\n </button>\n ) : (\n <button\n onClick={startExecution}\n className=\"px-3 py-1.5 text-xs bg-green-600 text-white rounded-lg hover:bg-green-500 flex items-center gap-1.5 transition-colors\"\n >\n <Play className=\"w-3.5 h-3.5\" />\n Run All\n </button>\n )}\n <button\n onClick={handleSavePipeline}\n className=\"px-3 py-1.5 text-xs bg-gray-700 text-gray-200 rounded-lg hover:bg-gray-600 flex items-center gap-1.5 transition-colors\"\n >\n <Save className=\"w-3.5 h-3.5\" />\n Save\n </button>\n </>\n )}\n {hasNodes && (\n <button\n onClick={clearPipeline}\n className=\"px-3 py-1.5 text-xs bg-gray-700 text-red-400 rounded-lg hover:bg-red-600/20 flex items-center gap-1.5 transition-colors\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n Clear\n </button>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* Main content area with Editor/Executions views */}\n <div className=\"flex-1 relative flex min-h-0\">\n {viewMode === 'editor' ? (\n // Editor View - Canvas with saved pipelines on left and palette on right\n <>\n {/* Left side - Saved Pipelines List */}\n <SavedPipelinesList />\n \n {/* Center - Canvas */}\n <div className=\"flex-1 relative\">\n {reactFlowNodes.length === 0 ? (\n <div className=\"h-full flex flex-col items-center justify-center bg-[#1a1a2e]\">\n <div className=\"text-center\">\n <div className=\"w-16 h-16 rounded-full bg-gray-800/50 flex items-center justify-center mx-auto mb-4\">\n <Sparkles className=\"w-8 h-8 text-gray-500\" />\n </div>\n <p className=\"text-gray-400 mb-2\">No pipeline nodes yet</p>\n <p className=\"text-sm text-gray-500\">\n Ask the agent to create a pipeline, or click \"Add Node\" to build one manually\n </p>\n </div>\n </div>\n ) : (\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n onNodeClick={onNodeClick}\n onNodeDoubleClick={onNodeDoubleClick}\n onNodeContextMenu={onNodeContextMenu}\n nodeTypes={memoizedNodeTypes}\n fitView\n className=\"bg-[#1a1a2e]\"\n >\n <Background \n variant={BackgroundVariant.Dots} \n gap={20} \n size={1} \n color=\"#374151\"\n />\n <Controls className=\"bg-gray-800 border-gray-700 rounded-lg\" />\n <MiniMap \n className=\"bg-gray-800/50 rounded-lg\"\n nodeColor={(node: Node) => {\n switch (node.data?.status) {\n case 'running': return '#3b82f6';\n case 'success': return '#22c55e';\n case 'error': return '#ef4444';\n default: return '#6b7280';\n }\n }}\n />\n </ReactFlow>\n )}\n </div>\n \n {/* Right side - Node Palette */}\n {showPalette && !hasGhostNodes && (\n <PipelineNodePalette />\n )}\n </>\n ) : (\n // Executions View - Split canvas and logs\n <div className=\"flex-1 flex min-h-0\">\n {/* Left: Mini canvas view */}\n <div className=\"w-1/2 border-r border-gray-700/50 relative\">\n {reactFlowNodes.length === 0 ? (\n <div className=\"h-full flex items-center justify-center bg-[#1a1a2e]\">\n <p className=\"text-gray-500\">No nodes to display</p>\n </div>\n ) : (\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n onNodeClick={onNodeClick}\n onNodeDoubleClick={onNodeDoubleClick}\n onNodeContextMenu={onNodeContextMenu}\n nodeTypes={memoizedNodeTypes}\n fitView\n className=\"bg-[#1a1a2e]\"\n nodesDraggable={!isExecuting}\n nodesConnectable={!isExecuting}\n elementsSelectable={!isExecuting}\n >\n <Background \n variant={BackgroundVariant.Dots} \n gap={20} \n size={1} \n color=\"#374151\"\n />\n <Controls className=\"bg-gray-800 border-gray-700 rounded-lg\" />\n </ReactFlow>\n )}\n \n {/* Canvas overlay controls */}\n <div className=\"absolute bottom-4 left-4 flex items-center gap-2\">\n <button className=\"p-2 bg-gray-800/80 rounded-lg text-gray-400 hover:text-white transition-colors\">\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4\" />\n </svg>\n </button>\n <button className=\"p-2 bg-gray-800/80 rounded-lg text-gray-400 hover:text-white transition-colors\">\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM10 7v3m0 0v3m0-3h3m-3 0H7\" />\n </svg>\n </button>\n <button className=\"p-2 bg-gray-800/80 rounded-lg text-gray-400 hover:text-white transition-colors\">\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM13 10H7\" />\n </svg>\n </button>\n <button className=\"p-2 bg-gray-800/80 rounded-lg text-gray-400 hover:text-white transition-colors\">\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </button>\n </div>\n \n \n </div>\n \n {/* Right: Execution logs panel */}\n <div className=\"w-1/2 bg-[#1e1e32]\">\n <ExecutionLogsPanel />\n </div>\n </div>\n )}\n </div>\n\n {/* Save Pipeline Dialog */}\n <SavePipelineDialog\n isOpen={showSaveDialog}\n onClose={() => setShowSaveDialog(false)}\n />\n\n {/* Node Configuration Panel (only in editor view) */}\n {selectedNodeId && viewMode === 'editor' && (\n <div\n ref={panelRef}\n className=\"absolute bg-[#1e1e32] border border-gray-700/50 rounded-xl shadow-2xl z-10 flex flex-col\"\n style={{\n right: `${panelPosition.right}px`,\n top: `${panelPosition.top}px`,\n width: `${panelSize.width}px`,\n height: `${panelSize.height}px`,\n maxHeight: 'calc(100vh - 100px)', // Constrain height\n cursor: isDragging \n ? 'grabbing' \n : isResizing \n ? (resizeType?.includes('both-top-left') || resizeType?.includes('both-bottom-right') \n ? 'nwse-resize' \n : resizeType?.includes('both-top-right') || resizeType?.includes('both-bottom-left')\n ? 'nesw-resize'\n : resizeType?.includes('width')\n ? 'col-resize'\n : 'row-resize')\n : 'grab',\n userSelect: 'none',\n }}\n onMouseDown={handleMouseDown}\n >\n {/* Panel Content */}\n <div className=\"flex-1 overflow-y-auto\">\n <PipelineNodeConfig\n nodeId={selectedNodeId}\n onUpdate={(updates) => updateNode(selectedNodeId, updates)}\n onDelete={() => handleNodeDelete(selectedNodeId)}\n onClose={() => setSelectedNodeId(null)}\n />\n </div>\n \n {/* Resize Handles */}\n {/* Top edge resize handle */}\n <div\n className=\"absolute top-0 left-0 right-0 h-1 cursor-row-resize hover:bg-blue-500/50 transition-colors z-20\"\n onMouseDown={(e) => handleResizeStart(e, 'height-top')}\n style={{ height: '4px' }}\n />\n \n {/* Right edge resize handle */}\n <div\n className=\"absolute top-0 bottom-0 right-0 w-1 cursor-col-resize hover:bg-blue-500/50 transition-colors z-20\"\n onMouseDown={(e) => handleResizeStart(e, 'width-right')}\n style={{ width: '4px' }}\n />\n \n {/* Bottom edge resize handle */}\n <div\n className=\"absolute bottom-0 left-0 right-0 h-1 cursor-row-resize hover:bg-blue-500/50 transition-colors z-20\"\n onMouseDown={(e) => handleResizeStart(e, 'height-bottom')}\n style={{ height: '4px' }}\n />\n \n {/* Left edge resize handle */}\n <div\n className=\"absolute top-0 bottom-0 left-0 w-1 cursor-col-resize hover:bg-blue-500/50 transition-colors z-20\"\n onMouseDown={(e) => handleResizeStart(e, 'width-left')}\n style={{ width: '4px' }}\n />\n \n {/* Top-left corner resize handle */}\n <div\n className=\"absolute top-0 left-0 w-4 h-4 cursor-nwse-resize z-30\"\n onMouseDown={(e) => handleResizeStart(e, 'both-top-left')}\n />\n \n {/* Top-right corner resize handle */}\n <div\n className=\"absolute top-0 right-0 w-4 h-4 cursor-nesw-resize z-30\"\n onMouseDown={(e) => handleResizeStart(e, 'both-top-right')}\n />\n \n {/* Bottom-right corner resize handle */}\n <div\n className=\"absolute bottom-0 right-0 w-4 h-4 cursor-nwse-resize z-30\"\n onMouseDown={(e) => handleResizeStart(e, 'both-bottom-right')}\n />\n \n {/* Bottom-left corner resize handle */}\n <div\n className=\"absolute bottom-0 left-0 w-4 h-4 cursor-nesw-resize z-30\"\n onMouseDown={(e) => handleResizeStart(e, 'both-bottom-left')}\n />\n </div>\n )}\n\n {/* Node Context Menu */}\n {contextMenu && (() => {\n const node = currentPipeline?.nodes.find(n => n.id === contextMenu.nodeId) || \n ghostBlueprint?.nodes.find(n => n.id === contextMenu.nodeId);\n if (!node) return null;\n \n return (\n <NodeContextMenu\n x={contextMenu.x}\n y={contextMenu.y}\n nodeId={contextMenu.nodeId}\n nodeLabel={node.label || node.type}\n onRename={handleContextMenuRename}\n onDelete={handleContextMenuDelete}\n onConfigure={handleContextMenuConfigure}\n onDuplicate={handleContextMenuDuplicate}\n onClose={handleCloseContextMenu}\n />\n );\n })()}\n </div>\n );\n};\n"],"names":["getStatusClasses","status","isExecuting","hasResultMetadata","EditableLabel","label","nodeId","onUpdate","isEditing","setIsEditing","useState","editValue","setEditValue","inputRef","useRef","useEffect","handleDoubleClick","handleBlur","handleKeyDown","e","jsx","InputNode","data","lastClickTimeRef","isCompleted","React","getStatusIcon","CheckCircle2","jsxs","Loader2","XCircle","handleClick","now","timeSinceLastClick","CustomHandle","Position","FileInput","_a","RFdiffusionNode","Sparkles","AlertCircle","ProteinMPNNNode","Dna","AlphaFoldNode","Atom","MessageInputNode","codePreview","MessageSquare","HttpRequestNode","urlPreview","Globe","_b","nodeTypes","PipelineCanvas","currentPipeline","ghostBlueprint","viewMode","setViewMode","approveBlueprint","rejectBlueprint","updateNode","deleteNode","addNode","addPipelineEdge","startExecution","stopExecution","clearPipeline","lastSavedAt","isSaving","setCurrentPipeline","syncPipelines","usePipelineStore","authState","apiClient","usePipelineContext","user","error","memoizedNodeTypes","useMemo","selectedNodeId","setSelectedNodeId","showPalette","setShowPalette","showSaveDialog","setShowSaveDialog","previousPipelineIdRef","shouldAutoSelectRef","currentPipelineId","pipelineChanged","nodeToSelect","n","handleBlueprintApproved","contextMenu","setContextMenu","panelPosition","setPanelPosition","panelSize","setPanelSize","isDragging","setIsDragging","isResizing","setIsResizing","resizeType","setResizeType","dragStart","setDragStart","resizeStart","setResizeStart","panelRef","handleMouseDown","useCallback","target","rect","handleMouseMove","parentRect","deltaX","deltaY","newWidth","newHeight","newRight","newTop","newLeft","minRight","maxRight","minTop","maxTop","handleMouseUp","handleResizeStart","type","startX","reactFlowNodes","nodes","node","index","newLabel","reactFlowEdges","edges","edge","sourceNode","isSourceRunning","isSourceComplete","MarkerType","setNodes","onNodesChange","useNodesState","setEdges","onEdgesChange","useEdgesState","prevNodesRef","prevEdgesRef","nodesKey","edgesKey","positionUpdateTimerRef","updatedNodes","pipelineNode","reactFlowNode","original","_c","_d","onConnect","params","eds","addEdge","onNodeClick","_event","onNodeDoubleClick","onNodeContextMenu","event","handleNodeDelete","handleContextMenuRename","handleContextMenuDelete","handleContextMenuConfigure","handleContextMenuDuplicate","newNode","handleCloseContextMenu","handleSavePipeline","hasGhostNodes","hasNodes","Fragment","date","dateObj","diff","seconds","minutes","Plus","Square","Play","Save","Trash2","SavedPipelinesList","ReactFlow","Background","BackgroundVariant","Controls","MiniMap","PipelineNodePalette","ExecutionLogsPanel","SavePipelineDialog","PipelineNodeConfig","updates","NodeContextMenu"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import { PipelineProviderProps } from '../context/PipelineContext';
3
+ /**
4
+ * PipelineCanvasProvider - Wrapper component for PipelineProvider
5
+ * Provides dependencies to all pipeline canvas components via context
6
+ *
7
+ * This is the main entry point for dependency injection in the pipeline canvas library.
8
+ * All dependencies are optional, allowing the library to work standalone.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * // Basic usage (no dependencies)
13
+ * <PipelineCanvasProvider>
14
+ * <PipelineCanvas />
15
+ * </PipelineCanvasProvider>
16
+ *
17
+ * // With authentication
18
+ * <PipelineCanvasProvider
19
+ * apiClient={myApiClient}
20
+ * authState={{ user: currentUser, isAuthenticated: true }}
21
+ * sessionId={activeSessionId}
22
+ * getAuthHeaders={() => ({ Authorization: `Bearer ${token}` })}
23
+ * >
24
+ * <PipelineCanvas />
25
+ * </PipelineCanvasProvider>
26
+ * ```
27
+ */
28
+ export declare const PipelineCanvasProvider: React.FC<PipelineProviderProps>;
29
+ export type { PipelineProviderProps as PipelineCanvasProviderProps } from '../context/PipelineContext';
30
+ //# sourceMappingURL=PipelineCanvasProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineCanvasProvider.d.ts","sourceRoot":"","sources":["../../components/PipelineCanvasProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAoB,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAErF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAElE,CAAC;AAGF,YAAY,EAAE,qBAAqB,IAAI,2BAA2B,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import { PipelineProvider as i } from "../context/PipelineContext.mjs";
3
+ const p = (r) => /* @__PURE__ */ e(i, { ...r });
4
+ export {
5
+ p as PipelineCanvasProvider
6
+ };
7
+ //# sourceMappingURL=PipelineCanvasProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineCanvasProvider.mjs","sources":["../../components/PipelineCanvasProvider.tsx"],"sourcesContent":["import React from 'react';\nimport { PipelineProvider, PipelineProviderProps } from '../context/PipelineContext';\n\n/**\n * PipelineCanvasProvider - Wrapper component for PipelineProvider\n * Provides dependencies to all pipeline canvas components via context\n * \n * This is the main entry point for dependency injection in the pipeline canvas library.\n * All dependencies are optional, allowing the library to work standalone.\n * \n * @example\n * ```tsx\n * // Basic usage (no dependencies)\n * <PipelineCanvasProvider>\n * <PipelineCanvas />\n * </PipelineCanvasProvider>\n * \n * // With authentication\n * <PipelineCanvasProvider\n * apiClient={myApiClient}\n * authState={{ user: currentUser, isAuthenticated: true }}\n * sessionId={activeSessionId}\n * getAuthHeaders={() => ({ Authorization: `Bearer ${token}` })}\n * >\n * <PipelineCanvas />\n * </PipelineCanvasProvider>\n * ```\n */\nexport const PipelineCanvasProvider: React.FC<PipelineProviderProps> = (props) => {\n return <PipelineProvider {...props} />;\n};\n\n// Re-export types for convenience\nexport type { PipelineProviderProps as PipelineCanvasProviderProps } from '../context/PipelineContext';\n"],"names":["PipelineCanvasProvider","props","jsx","PipelineProvider"],"mappings":";;AA4BO,MAAMA,IAA0D,CAACC,MAC/D,gBAAAC,EAACC,GAAA,EAAkB,GAAGF,EAAA,CAAO;"}
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ interface ApiClient {
3
+ post: (endpoint: string, data: any, config?: {
4
+ headers?: Record<string, string>;
5
+ method?: string;
6
+ }) => Promise<any>;
7
+ get: (endpoint: string, config?: {
8
+ headers?: Record<string, string>;
9
+ }) => Promise<any>;
10
+ }
11
+ interface PipelineExecutionProps {
12
+ apiClient?: ApiClient;
13
+ }
14
+ export declare const PipelineExecution: React.FC<PipelineExecutionProps>;
15
+ export {};
16
+ //# sourceMappingURL=PipelineExecution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineExecution.d.ts","sourceRoot":"","sources":["../../components/PipelineExecution.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAMzC,UAAU,SAAS;IACjB,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACpH,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACxF;AAED,UAAU,sBAAsB;IAC9B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAigB9D,CAAC"}