@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":"PipelineNodeConfig.mjs","sources":["../../components/PipelineNodeConfig.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\nimport { usePipelineStore, ExecutionLogEntry } from '../store/pipelineStore';\nimport { usePipelineContext } from '../context/PipelineContext';\nimport { PipelineNode } from '../types/index';\nimport { Trash2, Upload, X, File, ArrowLeft, Play, CheckCircle2, Info, Copy, Search, AlertCircle } from 'lucide-react';\nimport { Input } from './ui/input';\nimport { Label } from './ui/label';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select';\nimport { Button } from './ui/button';\nimport { Alert, AlertDescription } from './ui/alert';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './ui/tooltip';\n\ninterface PipelineNodeConfigProps {\n nodeId: string;\n onUpdate: (updates: Partial<PipelineNode>) => void;\n onDelete: () => void;\n onClose?: () => void;\n}\n\n// Helper function to get input data for a node\nconst getInputDataForNode = (\n nodeId: string,\n nodes: PipelineNode[],\n edges: Array<{ source: string; target: string }>,\n targetNodeType?: string\n): { sourceNode: PipelineNode | null; inputData: any } => {\n const incomingEdges = edges.filter((e) => e.target === nodeId);\n if (incomingEdges.length === 0) {\n return { sourceNode: null, inputData: null };\n }\n\n const sourceNode = nodes.find((n) => n.id === incomingEdges[0].source);\n if (!sourceNode) {\n return { sourceNode: null, inputData: null };\n }\n\n // For code execution nodes, return the full result_metadata as input data\n if (targetNodeType === 'message_input_node' && sourceNode.result_metadata) {\n return {\n sourceNode,\n inputData: sourceNode.result_metadata,\n };\n }\n\n // Get input data based on source node type\n if (sourceNode.type === 'input_node') {\n // Prioritize result_metadata (from execution) over config\n const fileInfo = sourceNode.result_metadata?.file_info || sourceNode.result_metadata?.data || {\n type: 'pdb_file',\n filename: sourceNode.config?.filename,\n file_id: sourceNode.config?.file_id,\n file_url: sourceNode.config?.file_url,\n chains: sourceNode.config?.chains,\n total_residues: sourceNode.config?.total_residues,\n suggested_contigs: sourceNode.config?.suggested_contigs,\n chain_residue_counts: sourceNode.config?.chain_residue_counts,\n atoms: sourceNode.config?.atoms,\n };\n return {\n sourceNode,\n inputData: fileInfo,\n };\n }\n\n if (sourceNode.result_metadata?.output_file) {\n return {\n sourceNode,\n inputData: {\n type: 'pdb_file',\n output_file: sourceNode.result_metadata.output_file,\n },\n };\n }\n\n if (sourceNode.type === 'proteinmpnn_node' && sourceNode.result_metadata?.sequence) {\n return {\n sourceNode,\n inputData: {\n type: 'sequence',\n sequence: sourceNode.result_metadata.sequence,\n },\n };\n }\n\n // For any other node with result_metadata, return it as generic data\n if (sourceNode.result_metadata) {\n return {\n sourceNode,\n inputData: sourceNode.result_metadata,\n };\n }\n\n return { sourceNode, inputData: null };\n};\n\nexport const PipelineNodeConfig: React.FC<PipelineNodeConfigProps> = ({\n nodeId,\n onUpdate,\n onDelete,\n onClose,\n}) => {\n const { currentPipeline, currentExecution, executeSingleNode } = usePipelineStore();\n const { getAuthHeaders } = usePipelineContext();\n const node = currentPipeline?.nodes.find((n) => n.id === nodeId);\n \n // Debug: Log when node config changes\n useEffect(() => {\n if (node?.type === 'input_node') {\n console.log('[PipelineNodeConfig] Node config updated:', {\n nodeId,\n hasConfig: !!node.config,\n configKeys: node.config ? Object.keys(node.config) : null,\n filename: node.config?.filename,\n file_id: node.config?.file_id,\n fullConfig: JSON.parse(JSON.stringify(node.config || {})), // Deep clone to see current state\n });\n }\n }, [nodeId, node?.config?.filename, node?.config?.file_id, node?.config]);\n const [pendingFile, setPendingFile] = useState<File | null>(null);\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [isUploading, setIsUploading] = useState(false);\n const [activeTab, setActiveTab] = useState<'parameters' | 'settings' | 'output'>('parameters');\n const [outputViewTab, setOutputViewTab] = useState<'table' | 'json' | 'schema'>('json');\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Get execution log for this node\n const nodeLog: ExecutionLogEntry | undefined = currentExecution?.logs.find(\n (log) => log.nodeId === nodeId\n );\n\n // Debug logging for input nodes - check if output tab should show data\n useEffect(() => {\n if (node?.type === 'input_node' && activeTab === 'output') {\n console.log('[PipelineNodeConfig] Input node - Output tab opened:', {\n nodeId,\n hasNodeLog: !!nodeLog,\n hasConfig: !!node.config,\n hasFilename: !!node.config?.filename,\n hasFileId: !!node.config?.file_id,\n filename: node.config?.filename,\n fileId: node.config?.file_id,\n hasResultMetadata: !!node.result_metadata,\n hasFileInfo: !!node.result_metadata?.file_info,\n hasResultData: !!node.result_metadata?.data,\n configKeys: node.config ? Object.keys(node.config) : null,\n shouldShowOutput: !!(nodeLog || (node.config?.filename || node.config?.file_id || node.result_metadata?.file_info || node.result_metadata?.data)),\n });\n }\n }, [nodeId, node?.type, activeTab, node?.config, node?.result_metadata, nodeLog]);\n\n // Debug: Log when nodeLog changes (especially for HTTP request nodes)\n useEffect(() => {\n if (node?.type === 'http_request_node') {\n console.log('[PipelineNodeConfig] nodeLog changed:', {\n nodeId,\n hasCurrentExecution: !!currentExecution,\n currentExecutionId: currentExecution?.id,\n logsCount: currentExecution?.logs?.length || 0,\n allLogNodeIds: currentExecution?.logs?.map(l => l.nodeId) || [],\n hasNodeLog: !!nodeLog,\n nodeLogStatus: nodeLog?.status,\n nodeLogKeys: nodeLog ? Object.keys(nodeLog) : null,\n nodeLogResponse: nodeLog?.response,\n nodeLogOutput: nodeLog?.output,\n activeTab,\n fullNodeLog: nodeLog, // Log entire nodeLog for debugging\n });\n }\n }, [nodeId, node?.type, currentExecution, nodeLog, activeTab]);\n\n // Debug: Log for input nodes when output tab is active\n useEffect(() => {\n if (node?.type === 'input_node') {\n console.log('[PipelineNodeConfig] Input node state:', {\n nodeId,\n activeTab,\n hasNodeLog: !!nodeLog,\n hasCurrentExecution: !!currentExecution,\n hasConfig: !!node.config,\n configKeys: node.config ? Object.keys(node.config) : null,\n hasFilename: !!node.config?.filename,\n filename: node.config?.filename,\n hasFileId: !!node.config?.file_id,\n fileId: node.config?.file_id,\n hasResultMetadata: !!node.result_metadata,\n hasFileInfo: !!node.result_metadata?.file_info,\n hasResultData: !!node.result_metadata?.data,\n shouldShowOutput: !!(nodeLog || (node.config?.filename || node.config?.file_id || node.result_metadata?.file_info || node.result_metadata?.data)),\n fullConfig: node.config,\n fullResultMetadata: node.result_metadata,\n });\n }\n }, [nodeId, node?.type, activeTab, node?.config, node?.result_metadata, nodeLog, currentExecution]);\n\n // Get input data for nodes that have inputs\n const { sourceNode, inputData } = currentPipeline\n ? getInputDataForNode(nodeId, currentPipeline.nodes, currentPipeline.edges, node?.type)\n : { sourceNode: null, inputData: null };\n\n // Check if node has inputs (needs INPUT panel)\n const hasInputs = node?.type !== 'input_node' && currentPipeline?.edges.some((e) => e.target === nodeId);\n\n if (!node) {\n return <div className=\"text-sm text-gray-400\">Node not found</div>;\n }\n\n const handleConfigChange = (key: string, value: any) => {\n // Get the latest node from store to ensure we have the most up-to-date config\n const latestNode = usePipelineStore.getState().currentPipeline?.nodes.find((n) => n.id === nodeId);\n const currentConfig = latestNode?.config || node.config || {};\n \n const newConfig = {\n ...currentConfig,\n [key]: value,\n };\n \n if (node?.type === 'input_node') {\n console.log('[PipelineNodeConfig] handleConfigChange for input node:', {\n nodeId,\n key,\n value,\n oldConfig: currentConfig,\n newConfig,\n usingLatestNode: latestNode !== node,\n });\n }\n \n onUpdate({\n config: newConfig,\n });\n \n // After update, check the store to verify it was updated\n setTimeout(() => {\n if (node?.type === 'input_node') {\n const updatedNode = usePipelineStore.getState().currentPipeline?.nodes.find((n) => n.id === nodeId);\n console.log('[PipelineNodeConfig] After onUpdate - checking store:', {\n nodeId,\n hasUpdatedNode: !!updatedNode,\n updatedConfig: updatedNode?.config,\n updatedFilename: updatedNode?.config?.filename,\n updatedFileId: updatedNode?.config?.file_id,\n });\n }\n }, 100);\n };\n\n const handleFileSelected = async (file: File) => {\n setPendingFile(file);\n setUploadError(null);\n setIsUploading(true);\n\n try {\n const formData = new FormData();\n formData.append('file', file);\n\n // Get auth headers for the request (if available)\n const headers = getAuthHeaders ? getAuthHeaders() : {};\n\n const response = await fetch('/api/upload/pdb', {\n method: 'POST',\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.detail || 'Upload failed');\n }\n\n const result = await response.json();\n \n console.log('[PipelineNodeConfig] File upload result:', {\n nodeId,\n result,\n fileInfo: result.file_info,\n });\n \n // Get the latest node from store to ensure we have the most up-to-date config\n const latestNode = usePipelineStore.getState().currentPipeline?.nodes.find((n) => n.id === nodeId);\n const currentConfig = latestNode?.config || node.config || {};\n \n // Update all config values at once to avoid race conditions\n const updatedConfig = {\n ...currentConfig,\n filename: result.file_info.filename,\n file_id: result.file_info.file_id,\n file_url: result.file_info.file_url,\n ...(result.file_info.chain_residue_counts && { chain_residue_counts: result.file_info.chain_residue_counts }),\n ...(result.file_info.total_residues && { total_residues: result.file_info.total_residues }),\n ...(result.file_info.suggested_contigs && { suggested_contigs: result.file_info.suggested_contigs }),\n ...(result.file_info.chains && { chains: result.file_info.chains }),\n ...(result.file_info.atoms && { atoms: result.file_info.atoms }),\n };\n \n console.log('[PipelineNodeConfig] Updating config with all values at once:', {\n nodeId,\n currentConfig,\n updatedConfig,\n });\n \n // Update all config at once\n onUpdate({\n config: updatedConfig,\n });\n \n console.log('[PipelineNodeConfig] After onUpdate call:', {\n nodeId,\n filename: result.file_info.filename,\n file_id: result.file_info.file_id,\n });\n \n // Verify the update after a short delay\n setTimeout(() => {\n const updatedNode = usePipelineStore.getState().currentPipeline?.nodes.find((n) => n.id === nodeId);\n console.log('[PipelineNodeConfig] After onUpdate - verifying store:', {\n nodeId,\n hasUpdatedNode: !!updatedNode,\n updatedConfig: updatedNode?.config,\n updatedFilename: updatedNode?.config?.filename,\n updatedFileId: updatedNode?.config?.file_id,\n });\n }, 100);\n \n setPendingFile(null);\n setIsUploading(false);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to upload file';\n setUploadError(errorMessage);\n setIsUploading(false);\n setPendingFile(null);\n }\n };\n\n const handleFileCleared = () => {\n setPendingFile(null);\n setUploadError(null);\n handleConfigChange('filename', '');\n handleConfigChange('file_id', '');\n handleConfigChange('file_url', '');\n handleConfigChange('chain_residue_counts', {});\n handleConfigChange('total_residues', 0);\n handleConfigChange('suggested_contigs', '');\n handleConfigChange('chains', []);\n handleConfigChange('atoms', 0);\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n };\n\n const handleFileInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (file) {\n // Validate file type\n if (!file.name.toLowerCase().endsWith('.pdb')) {\n setUploadError('Please select a PDB file (.pdb extension required)');\n return;\n }\n\n // Validate file size (10MB limit)\n const maxSize = 10 * 1024 * 1024; // 10MB\n if (file.size > maxSize) {\n setUploadError('File too large. Maximum size is 10MB.');\n return;\n }\n\n handleFileSelected(file);\n }\n // Reset input value to allow re-selecting the same file\n event.target.value = '';\n };\n\n const handleUploadClick = () => {\n fileInputRef.current?.click();\n };\n\n const inputClassName = \"w-full px-3 py-2 text-sm bg-gray-800/50 border border-gray-600/50 rounded-lg text-gray-200 placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500/50 transition-colors\";\n\n const handleExecuteStep = () => {\n // Execute just this node\n executeSingleNode(nodeId);\n };\n\n const renderConfigFields = () => {\n switch (node.type) {\n case 'input_node':\n return (\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n PDB File\n </label>\n <div className=\"space-y-2\">\n {pendingFile ? (\n <div className=\"flex items-center gap-2 px-3 py-2 bg-gray-800/50 border border-gray-600/50 rounded-lg\">\n <File className=\"w-4 h-4 text-blue-400 flex-shrink-0\" />\n <span className=\"text-xs text-gray-200 flex-1 truncate\" title={pendingFile.name}>\n {pendingFile.name}\n </span>\n {isUploading ? (\n <span className=\"text-xs text-gray-400\">Uploading...</span>\n ) : (\n <button\n type=\"button\"\n onClick={handleFileCleared}\n disabled={isUploading}\n className=\"p-1 hover:bg-gray-700/50 rounded disabled:opacity-50 transition-colors\"\n title=\"Remove file\"\n >\n <X className=\"w-3 h-3 text-gray-400\" />\n </button>\n )}\n </div>\n ) : node.config?.filename ? (\n <div className=\"flex items-center gap-2 px-3 py-2 bg-gray-800/30 border border-gray-700/50 rounded-lg\">\n <File className=\"w-4 h-4 text-green-400 flex-shrink-0\" />\n <span className=\"text-xs text-gray-300 flex-1 truncate\" title={node.config.filename}>\n {node.config.filename}\n </span>\n <button\n type=\"button\"\n onClick={handleFileCleared}\n className=\"p-1 hover:bg-gray-700/50 rounded transition-colors\"\n title=\"Remove file\"\n >\n <X className=\"w-3 h-3 text-gray-400\" />\n </button>\n </div>\n ) : (\n <Button\n type=\"button\"\n onClick={handleUploadClick}\n disabled={isUploading}\n variant=\"outline\"\n className=\"w-full bg-gray-800/50 border-gray-600/50 text-gray-200 hover:bg-gray-800/70\"\n >\n <Upload className=\"w-4 h-4 mr-2\" />\n Upload PDB File\n </Button>\n )}\n {uploadError && (\n <Alert variant=\"destructive\" className=\"mt-2\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertDescription className=\"text-xs\">{uploadError}</AlertDescription>\n </Alert>\n )}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".pdb\"\n onChange={handleFileInputChange}\n className=\"hidden\"\n />\n </div>\n </div>\n\n {/* PDB Analysis Results - Display when file is uploaded */}\n {node.config?.filename && node.config?.total_residues && (\n <div className=\"space-y-3 pt-2 border-t border-gray-700/50\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Structure Information\n </label>\n <div className=\"bg-gray-800/30 rounded-lg p-3 space-y-2 text-xs\">\n <div className=\"flex justify-between\">\n <span className=\"text-gray-500\">Total Residues:</span>\n <span className=\"text-gray-200 font-medium\">{node.config.total_residues}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-500\">Atoms:</span>\n <span className=\"text-gray-200 font-medium\">{node.config.atoms || 'N/A'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-500\">Chains:</span>\n <span className=\"text-gray-200 font-medium\">\n {Array.isArray(node.config.chains) ? node.config.chains.join(', ') : 'N/A'}\n </span>\n </div>\n {node.config.chain_residue_counts && typeof node.config.chain_residue_counts === 'object' && (\n <div className=\"pt-2 border-t border-gray-700/30\">\n <span className=\"text-gray-500 block mb-1\">Residues per Chain:</span>\n <div className=\"space-y-1\">\n {Object.entries(node.config.chain_residue_counts).map(([chain, count]) => (\n <div key={chain} className=\"flex justify-between pl-2\">\n <span className=\"text-gray-400\">Chain {chain}:</span>\n <span className=\"text-gray-200\">{count as number} residues</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Suggested RFdiffusion Parameters */}\n {node.config?.suggested_contigs && (\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Suggested RFdiffusion Parameters\n </label>\n <div className=\"bg-blue-900/20 border border-blue-700/30 rounded-lg p-3 space-y-2 text-xs\">\n <div className=\"flex items-start gap-2\">\n <span className=\"text-blue-400 font-medium\">Contigs:</span>\n <code className=\"flex-1 text-blue-300 bg-gray-900/50 px-2 py-1 rounded font-mono\">\n {node.config.suggested_contigs}\n </code>\n </div>\n <p className=\"text-gray-400 text-xs mt-2\">\n This suggestion is based on your PDB structure. You can use this value in RFdiffusion nodes connected to this input.\n </p>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n\n case 'rfdiffusion_node':\n return (\n <div className=\"space-y-4\">\n {/* HTTP Method */}\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Method\n </Label>\n <Select\n value={node.config?.method || 'POST'}\n onValueChange={(value) => handleConfigChange('method', value)}\n >\n <SelectTrigger className={inputClassName}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"GET\">GET</SelectItem>\n <SelectItem value=\"POST\">POST</SelectItem>\n <SelectItem value=\"PUT\">PUT</SelectItem>\n <SelectItem value=\"PATCH\">PATCH</SelectItem>\n <SelectItem value=\"DELETE\">DELETE</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* URL */}\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n URL\n </Label>\n <Input\n type=\"text\"\n value={node.config?.url || '/rfdiffusion/run'}\n onChange={(e) => handleConfigChange('url', e.target.value)}\n className={inputClassName}\n placeholder=\"/rfdiffusion/run\"\n />\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <p className=\"text-xs text-gray-500 mt-1.5 cursor-help\">\n API endpoint URL (relative or absolute)\n </p>\n </TooltipTrigger>\n <TooltipContent>\n <p>Enter the API endpoint URL. Can be relative (e.g., /api/endpoint) or absolute (e.g., https://api.example.com/endpoint)</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n\n {/* API Key */}\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n API Key\n </Label>\n <Input\n type=\"password\"\n value={node.config?.api_key || ''}\n onChange={(e) => handleConfigChange('api_key', e.target.value)}\n className={inputClassName}\n placeholder=\"Enter NVIDIA API key (optional)\"\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Leave empty to use global API key from settings\n </p>\n </div>\n\n {/* Design Mode */}\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Design Mode\n </Label>\n <Select\n value={node.config?.design_mode || 'unconditional'}\n onValueChange={(value) => handleConfigChange('design_mode', value)}\n >\n <SelectTrigger className={inputClassName}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"unconditional\">Unconditional Design</SelectItem>\n <SelectItem value=\"motif_scaffolding\">Motif Scaffolding</SelectItem>\n <SelectItem value=\"partial_diffusion\">Partial Diffusion</SelectItem>\n </SelectContent>\n </Select>\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Unconditional: new proteins | Motif: around structures | Partial: modify regions\n </p>\n </div>\n\n {/* PDB ID */}\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n PDB ID (optional)\n </Label>\n <Input\n type=\"text\"\n value={node.config?.pdb_id || ''}\n onChange={(e) => handleConfigChange('pdb_id', e.target.value)}\n className={inputClassName}\n placeholder=\"e.g., 1R42\"\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Optional PDB ID to use as template (4-character code)\n </p>\n </div>\n\n {/* Contigs */}\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Contigs *\n </Label>\n <Input\n type=\"text\"\n value={node.config?.contigs || 'A50-150'}\n onChange={(e) => handleConfigChange('contigs', e.target.value)}\n className={inputClassName}\n placeholder=\"A50-150\"\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Contig specification (e.g., \"A50-150\" or \"A20-60/0 50-100\")\n </p>\n </div>\n\n {/* Hotspot Residues */}\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Hotspot Residues (optional)\n </Label>\n <Input\n type=\"text\"\n value={node.config?.hotspot_res || ''}\n onChange={(e) => handleConfigChange('hotspot_res', e.target.value)}\n className={inputClassName}\n placeholder=\"A50, A51, A52\"\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Comma-separated list of residues to preserve (e.g., \"A50, A51, A52\")\n </p>\n </div>\n\n {/* Diffusion Steps */}\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Diffusion Steps\n </Label>\n <Input\n type=\"number\"\n min=\"1\"\n max=\"100\"\n value={node.config?.diffusion_steps || 15}\n onChange={(e) => handleConfigChange('diffusion_steps', parseInt(e.target.value) || 15)}\n className={inputClassName}\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Number of diffusion steps (1-100, higher = better quality but slower)\n </p>\n </div>\n\n {/* Number of Designs */}\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Number of Designs\n </Label>\n <Input\n type=\"number\"\n min=\"1\"\n max=\"10\"\n value={node.config?.num_designs || 1}\n onChange={(e) => handleConfigChange('num_designs', parseInt(e.target.value) || 1)}\n className={inputClassName}\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Number of design variants to generate (1-10)\n </p>\n </div>\n\n {/* Send Query Parameters Toggle */}\n <div className=\"flex items-center justify-between\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Send Query Parameters\n </label>\n <p className=\"text-xs text-gray-500\">\n Include query parameters in the URL\n </p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={node.config?.send_query_params || false}\n onChange={(e) => handleConfigChange('send_query_params', e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-purple-600\"></div>\n </label>\n </div>\n\n {/* Query Parameters (shown if toggle is on) */}\n {node.config?.send_query_params && (\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Query Parameters\n </label>\n <textarea\n value={node.config?.query_params || '{}'}\n onChange={(e) => handleConfigChange('query_params', e.target.value)}\n className={`${inputClassName} font-mono text-xs`}\n rows={3}\n placeholder='{\"key\": \"value\"}'\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n JSON object with query parameters\n </p>\n </div>\n )}\n\n {/* Send Headers Toggle */}\n <div className=\"flex items-center justify-between\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Send Headers\n </label>\n <p className=\"text-xs text-gray-500\">\n Include custom headers in the request\n </p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={node.config?.send_headers !== false}\n onChange={(e) => handleConfigChange('send_headers', e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-purple-600\"></div>\n </label>\n </div>\n\n {/* Custom Headers (shown if toggle is on) */}\n {node.config?.send_headers !== false && (\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Custom Headers\n </label>\n <textarea\n value={node.config?.custom_headers || '{}'}\n onChange={(e) => handleConfigChange('custom_headers', e.target.value)}\n className={`${inputClassName} font-mono text-xs`}\n rows={3}\n placeholder='{\"Content-Type\": \"application/json\"}'\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n JSON object with custom headers\n </p>\n </div>\n )}\n\n {/* Send Body Toggle */}\n <div className=\"flex items-center justify-between\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Send Body\n </label>\n <p className=\"text-xs text-gray-500\">\n Include request body\n </p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={node.config?.send_body !== false}\n onChange={(e) => handleConfigChange('send_body', e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-purple-600\"></div>\n </label>\n </div>\n\n {/* Body Configuration (shown if toggle is on) */}\n {node.config?.send_body !== false && (\n <>\n {/* Body Content Type */}\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Body Content Type\n </Label>\n <Select\n value={node.config?.body_content_type || 'json'}\n onValueChange={(value) => handleConfigChange('body_content_type', value)}\n >\n <SelectTrigger className={inputClassName}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"json\">JSON</SelectItem>\n <SelectItem value=\"form-data\">Form Data</SelectItem>\n <SelectItem value=\"x-www-form-urlencoded\">Form URL Encoded</SelectItem>\n <SelectItem value=\"raw\">Raw</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Specify Body */}\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Specify Body\n </Label>\n <Select\n value={node.config?.body_specify || 'json'}\n onValueChange={(value) => handleConfigChange('body_specify', value)}\n >\n <SelectTrigger className={inputClassName}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"json\">Using JSON</SelectItem>\n <SelectItem value=\"expression\">Using Expression</SelectItem>\n <SelectItem value=\"fixed\">Fixed</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* JSON Body */}\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n JSON\n </label>\n <textarea\n value={node.config?.body_json || '{\\n \"pdb_file\": \"{{input.target}}\",\\n \"contigs\": \"{{config.contigs}}\",\\n \"num_designs\": \"{{config.num_designs}}\"\\n}'}\n onChange={(e) => handleConfigChange('body_json', e.target.value)}\n className={`${inputClassName} font-mono text-xs`}\n rows={6}\n placeholder='{\"pdb_file\": \"{{input.target}}\", \"contigs\": \"{{config.contigs}}\"}'\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n JSON body content (supports template variables like {\"{{input.target}}\"})\n </p>\n </div>\n </>\n )}\n\n {/* Legacy Fields (for backwards compatibility) */}\n <div className=\"border-t border-gray-700 pt-4 mt-4\">\n <p className=\"text-xs font-medium text-gray-400 mb-3\">Legacy Parameters</p>\n \n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Contigs\n </Label>\n <Input\n type=\"text\"\n value={node.config?.contigs || '50'}\n onChange={(e) => handleConfigChange('contigs', e.target.value)}\n className={inputClassName}\n placeholder=\"50\"\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Contig specification (e.g., \"50\" or \"A1-50\")\n </p>\n </div>\n\n <div className=\"mt-4\">\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Number of Designs\n </Label>\n <Input\n type=\"number\"\n value={node.config?.num_designs || 1}\n onChange={(e) => handleConfigChange('num_designs', parseInt(e.target.value) || 1)}\n className={inputClassName}\n min=\"1\"\n max=\"10\"\n />\n </div>\n </div>\n </div>\n );\n\n case 'proteinmpnn_node':\n return (\n <div className=\"space-y-4\">\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Number of Sequences\n </Label>\n <Input\n type=\"number\"\n value={node.config?.num_sequences || 8}\n onChange={(e) => handleConfigChange('num_sequences', parseInt(e.target.value) || 8)}\n className={inputClassName}\n min=\"1\"\n max=\"100\"\n />\n </div>\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Temperature\n </Label>\n <Input\n type=\"number\"\n step=\"0.1\"\n value={node.config?.temperature || 0.1}\n onChange={(e) => handleConfigChange('temperature', parseFloat(e.target.value) || 0.1)}\n className={inputClassName}\n min=\"0.1\"\n max=\"1.0\"\n />\n </div>\n </div>\n );\n\n case 'alphafold_node':\n return (\n <div className=\"space-y-4\">\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Recycle Count\n </Label>\n <Input\n type=\"number\"\n value={node.config?.recycle_count || 3}\n onChange={(e) => handleConfigChange('recycle_count', parseInt(e.target.value) || 3)}\n className={inputClassName}\n min=\"1\"\n max=\"20\"\n />\n </div>\n <div>\n <Label className=\"text-xs font-medium text-gray-400 mb-2\">\n Number of Relax Steps\n </Label>\n <Input\n type=\"number\"\n value={node.config?.num_relax || 0}\n onChange={(e) => handleConfigChange('num_relax', parseInt(e.target.value) || 0)}\n className={inputClassName}\n min=\"0\"\n max=\"10\"\n />\n </div>\n </div>\n );\n\n case 'message_input_node':\n return (\n <div className=\"space-y-4\">\n {/* Code Editor */}\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Code\n </label>\n <textarea\n value={node.config?.code || ''}\n onChange={(e) => handleConfigChange('code', e.target.value)}\n className={`${inputClassName} font-mono text-xs`}\n rows={16}\n placeholder={`// Access input data via 'input' object\n// Access node config via 'config' object\n// Access node metadata via 'node' object\n// IMPORTANT: Return a value to see it in the OUTPUT panel\n// console.log() outputs to browser console (F12), not the OUTPUT panel\n\nconst message = config.message || 'Hello from code execution!';\nconsole.log('[Code Execution]', message); // This goes to browser console\n\n// Return value to see it in OUTPUT panel\nreturn {\n message: message,\n executedAt: new Date().toISOString(),\n inputKeys: Object.keys(input),\n configKeys: Object.keys(config)\n};`}\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n JavaScript code to execute. Use 'input' for input data, 'config' for node config, and 'node' for node metadata. Return the result.\n </p>\n <div className=\"mt-2 px-3 py-2 bg-yellow-900/20 border border-yellow-700/30 rounded-lg\">\n <p className=\"text-xs text-yellow-300\">\n 💡 Type $ for a list of special vars/methods. Debug by using console.log() statements and viewing their output in the browser console.\n </p>\n </div>\n </div>\n\n {/* Message Field (Optional) */}\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Message <span className=\"text-gray-600\">(Optional)</span>\n </label>\n <input\n type=\"text\"\n value={node.config?.message || ''}\n onChange={(e) => handleConfigChange('message', e.target.value)}\n className={inputClassName}\n placeholder=\"Enter a message...\"\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Optional message that can be accessed in code via config.message\n </p>\n </div>\n </div>\n );\n\n case 'http_request_node':\n return (\n <div className=\"space-y-4\">\n {/* HTTP Method */}\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Method\n </label>\n <select\n value={node.config?.method || 'GET'}\n onChange={(e) => handleConfigChange('method', e.target.value)}\n className={inputClassName}\n >\n <option value=\"GET\">GET</option>\n <option value=\"POST\">POST</option>\n <option value=\"PUT\">PUT</option>\n <option value=\"PATCH\">PATCH</option>\n <option value=\"DELETE\">DELETE</option>\n <option value=\"HEAD\">HEAD</option>\n <option value=\"OPTIONS\">OPTIONS</option>\n </select>\n </div>\n\n {/* URL */}\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n URL\n </label>\n <input\n type=\"text\"\n value={node.config?.url || 'https://jsonplaceholder.typicode.com/todos/1'}\n onChange={(e) => handleConfigChange('url', e.target.value)}\n className={inputClassName}\n placeholder=\"https://api.example.com/endpoint\"\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Full URL for the HTTP request (supports template variables like {\"{{input.field}}\"})\n </p>\n </div>\n\n {/* Authentication */}\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Authentication\n </label>\n <select\n value={node.config?.authentication || 'none'}\n onChange={(e) => handleConfigChange('authentication', e.target.value)}\n className={inputClassName}\n >\n <option value=\"none\">None</option>\n <option value=\"basic\">Basic Auth</option>\n <option value=\"bearer\">Bearer Token</option>\n <option value=\"custom\">Custom Header</option>\n </select>\n </div>\n\n {/* Basic Auth Fields */}\n {node.config?.authentication === 'basic' && (\n <>\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Username\n </label>\n <input\n type=\"text\"\n value={node.config?.basic_auth_username || ''}\n onChange={(e) => handleConfigChange('basic_auth_username', e.target.value)}\n className={inputClassName}\n placeholder=\"Username\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Password\n </label>\n <input\n type=\"password\"\n value={node.config?.basic_auth_password || ''}\n onChange={(e) => handleConfigChange('basic_auth_password', e.target.value)}\n className={inputClassName}\n placeholder=\"Password\"\n />\n </div>\n </>\n )}\n\n {/* Bearer Token Field */}\n {node.config?.authentication === 'bearer' && (\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Bearer Token\n </label>\n <input\n type=\"password\"\n value={node.config?.bearer_token || ''}\n onChange={(e) => handleConfigChange('bearer_token', e.target.value)}\n className={inputClassName}\n placeholder=\"Bearer token\"\n />\n </div>\n )}\n\n {/* Custom Auth Header Fields */}\n {node.config?.authentication === 'custom' && (\n <>\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Header Name\n </label>\n <input\n type=\"text\"\n value={node.config?.custom_auth_header_name || 'Authorization'}\n onChange={(e) => handleConfigChange('custom_auth_header_name', e.target.value)}\n className={inputClassName}\n placeholder=\"Header name\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Header Value\n </label>\n <input\n type=\"password\"\n value={node.config?.custom_auth_header_value || ''}\n onChange={(e) => handleConfigChange('custom_auth_header_value', e.target.value)}\n className={inputClassName}\n placeholder=\"Header value\"\n />\n </div>\n </>\n )}\n\n {/* Send Query Parameters Toggle */}\n <div className=\"flex items-center justify-between\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Send Query Parameters\n </label>\n <p className=\"text-xs text-gray-500\">\n Include query parameters in the URL\n </p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={node.config?.send_query_params || false}\n onChange={(e) => handleConfigChange('send_query_params', e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600\"></div>\n </label>\n </div>\n\n {/* Query Parameters (shown if toggle is on) */}\n {node.config?.send_query_params && (\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Query Parameters\n </label>\n <textarea\n value={node.config?.query_params || '{}'}\n onChange={(e) => handleConfigChange('query_params', e.target.value)}\n className={`${inputClassName} font-mono text-xs`}\n rows={3}\n placeholder='{\"key\": \"value\", \"page\": 1}'\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n JSON object with query parameters\n </p>\n </div>\n )}\n\n {/* Send Headers Toggle */}\n <div className=\"flex items-center justify-between\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Send Headers\n </label>\n <p className=\"text-xs text-gray-500\">\n Include custom headers in the request\n </p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={node.config?.send_headers || false}\n onChange={(e) => handleConfigChange('send_headers', e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600\"></div>\n </label>\n </div>\n\n {/* Custom Headers (shown if toggle is on) */}\n {node.config?.send_headers && (\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Custom Headers\n </label>\n <textarea\n value={node.config?.custom_headers || '{}'}\n onChange={(e) => handleConfigChange('custom_headers', e.target.value)}\n className={`${inputClassName} font-mono text-xs`}\n rows={3}\n placeholder='{\"Content-Type\": \"application/json\", \"X-Custom-Header\": \"value\"}'\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n JSON object with custom headers\n </p>\n </div>\n )}\n\n {/* Send Body Toggle */}\n <div className=\"flex items-center justify-between\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Send Body\n </label>\n <p className=\"text-xs text-gray-500\">\n Include request body (only for POST, PUT, PATCH methods)\n </p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={node.config?.send_body || false}\n onChange={(e) => handleConfigChange('send_body', e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600\"></div>\n </label>\n </div>\n\n {/* Body Configuration (shown if toggle is on) */}\n {node.config?.send_body && (\n <>\n {/* Body Content Type */}\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Body Content Type\n </label>\n <select\n value={node.config?.body_content_type || 'json'}\n onChange={(e) => handleConfigChange('body_content_type', e.target.value)}\n className={inputClassName}\n >\n <option value=\"json\">JSON</option>\n <option value=\"form-data\">Form Data</option>\n <option value=\"x-www-form-urlencoded\">Form URL Encoded</option>\n <option value=\"raw\">Raw</option>\n <option value=\"text\">Text</option>\n <option value=\"xml\">XML</option>\n </select>\n </div>\n\n {/* Specify Body */}\n {(node.config?.body_content_type === 'json' || !node.config?.body_content_type) && (\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Specify Body\n </label>\n <select\n value={node.config?.body_specify || 'json'}\n onChange={(e) => handleConfigChange('body_specify', e.target.value)}\n className={inputClassName}\n >\n <option value=\"json\">Using JSON</option>\n <option value=\"expression\">Using Expression</option>\n <option value=\"fixed\">Fixed</option>\n </select>\n </div>\n )}\n\n {/* JSON Body */}\n {(node.config?.body_content_type === 'json' || !node.config?.body_content_type) && (\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n JSON\n </label>\n <textarea\n value={node.config?.body_json || ''}\n onChange={(e) => handleConfigChange('body_json', e.target.value)}\n className={`${inputClassName} font-mono text-xs`}\n rows={6}\n placeholder='{\"key\": \"value\"} or use template variables like {{input.field}}'\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n JSON body content (supports template variables like {\"{{input.field}}\"})\n </p>\n </div>\n )}\n\n {/* Raw Body (for raw, text, xml) */}\n {(node.config?.body_content_type === 'raw' || \n node.config?.body_content_type === 'text' || \n node.config?.body_content_type === 'xml') && (\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Raw Body\n </label>\n <textarea\n value={node.config?.body_raw || ''}\n onChange={(e) => handleConfigChange('body_raw', e.target.value)}\n className={`${inputClassName} font-mono text-xs`}\n rows={6}\n placeholder=\"Raw body content\"\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Raw body content (for raw, text, or XML content types)\n </p>\n </div>\n )}\n </>\n )}\n\n {/* Options Section */}\n <div className=\"border-t border-gray-700 pt-4 mt-4\">\n <p className=\"text-xs font-medium text-gray-400 mb-3\">Options</p>\n \n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Timeout (ms)\n </label>\n <input\n type=\"number\"\n value={node.config?.options_timeout || 30000}\n onChange={(e) => handleConfigChange('options_timeout', parseInt(e.target.value) || 30000)}\n className={inputClassName}\n min=\"1000\"\n max=\"300000\"\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Request timeout in milliseconds (default: 30000)\n </p>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Follow Redirects\n </label>\n <p className=\"text-xs text-gray-500\">\n Automatically follow HTTP redirects\n </p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={node.config?.options_follow_redirects !== false}\n onChange={(e) => handleConfigChange('options_follow_redirects', e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600\"></div>\n </label>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Ignore SSL Errors\n </label>\n <p className=\"text-xs text-gray-500\">\n Ignore SSL certificate errors (not recommended for production)\n </p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={node.config?.options_ignore_ssl_errors || false}\n onChange={(e) => handleConfigChange('options_ignore_ssl_errors', e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600\"></div>\n </label>\n </div>\n </div>\n\n {/* Info Message */}\n <div className=\"mt-4 px-3 py-2 bg-amber-900/20 border border-amber-700/30 rounded-lg\">\n <p className=\"text-xs text-amber-300\">\n You can view the raw requests this node makes in your browser's developer console.\n </p>\n </div>\n </div>\n );\n\n default:\n return <div className=\"text-sm text-gray-400\">No configuration available</div>;\n }\n };\n\n return (\n <div className=\"h-full flex flex-col bg-[#1e1e32]\">\n {/* Header */}\n <div className=\"px-4 py-3 border-b border-gray-700/50 bg-gray-800/30 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {onClose && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClose}\n className=\"text-gray-400 hover:text-gray-200\"\n >\n <ArrowLeft className=\"w-4 h-4\" />\n </Button>\n )}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-200\">{node.label}</h3>\n <p className=\"text-xs text-gray-500\">{node.type}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n onClick={handleExecuteStep}\n size=\"sm\"\n className=\"bg-orange-600 hover:bg-orange-500 text-white\"\n >\n <Play className=\"w-3.5 h-3.5 mr-1.5\" />\n Execute step\n </Button>\n {onClose && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClose}\n className=\"text-gray-400 hover:text-gray-200\"\n title=\"Close panel\"\n >\n <X className=\"w-4 h-4\" />\n </Button>\n )}\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"px-4 border-b border-gray-700/50 flex items-center gap-1\">\n <button\n onClick={() => setActiveTab('parameters')}\n className={`px-3 py-2 text-xs font-medium transition-colors relative ${\n activeTab === 'parameters'\n ? 'text-gray-200'\n : 'text-gray-500 hover:text-gray-300'\n }`}\n >\n Parameters\n {activeTab === 'parameters' && (\n <div className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-red-500\" />\n )}\n </button>\n <button\n onClick={() => setActiveTab('settings')}\n className={`px-3 py-2 text-xs font-medium transition-colors relative ${\n activeTab === 'settings'\n ? 'text-gray-200'\n : 'text-gray-500 hover:text-gray-300'\n }`}\n >\n Settings\n {activeTab === 'settings' && (\n <div className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-red-500\" />\n )}\n </button>\n <button\n onClick={() => setActiveTab('output')}\n className={`px-3 py-2 text-xs font-medium transition-colors relative ${\n activeTab === 'output'\n ? 'text-gray-200'\n : 'text-gray-500 hover:text-gray-300'\n }`}\n >\n Output\n {activeTab === 'output' && (\n <div className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-red-500\" />\n )}\n </button>\n <a\n href=\"#\"\n className=\"ml-auto text-xs text-gray-500 hover:text-gray-400 transition-colors\"\n >\n Docs\n </a>\n </div>\n\n {/* Main content - Three panel layout (INPUT | Configuration | OUTPUT) */}\n <div className=\"flex-1 flex min-h-0\">\n {/* Left: INPUT Panel */}\n <div className=\"w-[25%] min-w-[200px] max-w-[300px] border-r border-gray-700/50 bg-[#1a1a2e] flex flex-col flex-shrink-0\">\n <div className=\"px-4 py-3 border-b border-gray-700/50 bg-[#1e1e32]\">\n <h3 className=\"text-sm font-semibold text-gray-200\">INPUT</h3>\n </div>\n <div className=\"flex-1 overflow-y-auto p-4\">\n {hasInputs && inputData ? (\n <div className=\"space-y-3\">\n {inputData.type === 'pdb_file' && (\n <>\n {inputData.filename && (\n <div>\n <div className=\"text-xs font-medium text-gray-400 mb-1\">File</div>\n <div className=\"text-xs text-gray-300 bg-gray-800/50 px-2 py-1 rounded\">\n {inputData.filename}\n </div>\n </div>\n )}\n {inputData.chains && Array.isArray(inputData.chains) && (\n <div>\n <div className=\"text-xs font-medium text-gray-400 mb-1\">Chains</div>\n <div className=\"text-xs text-gray-300 bg-gray-800/50 px-2 py-1 rounded\">\n {inputData.chains.join(', ')}\n </div>\n </div>\n )}\n {inputData.total_residues && (\n <div>\n <div className=\"text-xs font-medium text-gray-400 mb-1\">Total Residues</div>\n <div className=\"text-xs text-gray-300 bg-gray-800/50 px-2 py-1 rounded\">\n {inputData.total_residues}\n </div>\n </div>\n )}\n {inputData.suggested_contigs && (\n <div>\n <div className=\"text-xs font-medium text-gray-400 mb-1\">Suggested Contigs</div>\n <div className=\"text-xs text-blue-300 bg-blue-900/20 border border-blue-700/30 px-2 py-1 rounded font-mono\">\n {inputData.suggested_contigs}\n </div>\n </div>\n )}\n {sourceNode && (\n <div className=\"pt-2 border-t border-gray-700/30\">\n <div className=\"text-xs font-medium text-gray-400 mb-1\">From Node</div>\n <div className=\"text-xs text-gray-300\">{sourceNode.label}</div>\n </div>\n )}\n </>\n )}\n {inputData.type === 'sequence' && (\n <div>\n <div className=\"text-xs font-medium text-gray-400 mb-1\">Sequence</div>\n <div className=\"text-xs text-gray-300 bg-gray-800/50 px-2 py-1 rounded font-mono break-all\">\n {inputData.sequence?.substring(0, 100)}\n {inputData.sequence?.length > 100 ? '...' : ''}\n </div>\n </div>\n )}\n {/* Generic JSON/object data display for code execution nodes */}\n {(!inputData.type || inputData.type === 'any' || node?.type === 'message_input_node') && (\n <div className=\"space-y-2\">\n <div className=\"text-xs font-medium text-gray-400 mb-2\">Input Data</div>\n <pre className=\"text-xs text-gray-300 bg-gray-800/50 px-3 py-2 rounded font-mono overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(inputData, null, 2)}\n </pre>\n {sourceNode && (\n <div className=\"pt-2 border-t border-gray-700/30\">\n <div className=\"text-xs font-medium text-gray-400 mb-1\">From Node</div>\n <div className=\"text-xs text-gray-300\">{sourceNode.label}</div>\n </div>\n )}\n </div>\n )}\n </div>\n ) : (\n <div className=\"h-full flex items-center justify-center\">\n <div className=\"text-center\">\n <p className=\"text-xs text-gray-500 mb-2\">No input data yet</p>\n {hasInputs && (\n <>\n <button\n onClick={handleExecuteStep}\n className=\"text-xs text-gray-400 hover:text-gray-300 transition-colors\"\n title=\"Execute previous nodes\"\n >\n Execute previous nodes\n </button>\n <p className=\"text-xs text-gray-600 mt-1\">(From the earliest node that needs it ?)</p>\n </>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Middle: Configuration */}\n <div className=\"flex-1 border-r border-gray-700/50 overflow-y-auto bg-[#1e1e32]\">\n <div className=\"p-4 space-y-4\">\n {activeTab === 'parameters' ? (\n <>\n {renderConfigFields()}\n </>\n ) : activeTab === 'output' ? (\n <div className=\"space-y-4\">\n {nodeLog ? (\n <>\n {/* Execution Status */}\n <div className=\"border border-gray-700/50 rounded-lg p-3 bg-gray-800/30\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-medium text-gray-400\">Status</span>\n <span className={`text-xs font-semibold ${\n (nodeLog.status === 'success' || nodeLog.status === 'completed') ? 'text-green-400' :\n nodeLog.status === 'error' ? 'text-red-400' :\n nodeLog.status === 'running' ? 'text-blue-400' :\n 'text-gray-400'\n }`}>\n {nodeLog.status.toUpperCase()}\n </span>\n </div>\n {nodeLog.duration !== undefined && (\n <div className=\"flex items-center justify-between mt-2\">\n <span className=\"text-xs text-gray-500\">Duration</span>\n <span className=\"text-xs text-gray-300 font-mono\">\n {nodeLog.duration}ms\n </span>\n </div>\n )}\n </div>\n\n {/* Request Details */}\n {nodeLog.request && (\n <div className=\"border border-gray-700/50 rounded-lg overflow-hidden\">\n <div className=\"px-3 py-2 bg-gray-800/30 border-b border-gray-700/50\">\n <span className=\"text-xs font-medium text-gray-300\">Request</span>\n </div>\n <div className=\"p-3 space-y-2\">\n {nodeLog.request.method && nodeLog.request.url && (\n <div>\n <span className=\"text-xs text-gray-500\">Method & URL</span>\n <div className=\"mt-1 text-xs font-mono text-gray-300 bg-gray-900/50 px-2 py-1 rounded\">\n {nodeLog.request.method} {nodeLog.request.url}\n </div>\n </div>\n )}\n {nodeLog.request.headers && Object.keys(nodeLog.request.headers).length > 0 && (\n <div>\n <span className=\"text-xs text-gray-500\">Headers</span>\n <pre className=\"mt-1 text-xs font-mono text-gray-300 bg-gray-900/50 px-2 py-1 rounded overflow-x-auto\">\n {JSON.stringify(nodeLog.request.headers, null, 2)}\n </pre>\n </div>\n )}\n {nodeLog.request.queryParams && Object.keys(nodeLog.request.queryParams).length > 0 && (\n <div>\n <span className=\"text-xs text-gray-500\">Query Parameters</span>\n <pre className=\"mt-1 text-xs font-mono text-gray-300 bg-gray-900/50 px-2 py-1 rounded overflow-x-auto\">\n {JSON.stringify(nodeLog.request.queryParams, null, 2)}\n </pre>\n </div>\n )}\n {nodeLog.request.body && (\n <div>\n <span className=\"text-xs text-gray-500\">Body</span>\n <pre className=\"mt-1 text-xs font-mono text-gray-300 bg-gray-900/50 px-2 py-1 rounded overflow-x-auto max-h-48 overflow-y-auto\">\n {JSON.stringify(nodeLog.request.body, null, 2)}\n </pre>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Response Details */}\n {nodeLog.response && (\n <div className=\"border border-gray-700/50 rounded-lg overflow-hidden\">\n <div className=\"px-3 py-2 bg-gray-800/30 border-b border-gray-700/50\">\n <span className=\"text-xs font-medium text-gray-300\">Response</span>\n </div>\n <div className=\"p-3 space-y-2\">\n {nodeLog.response.status && (\n <div>\n <span className=\"text-xs text-gray-500\">Status</span>\n <div className={`mt-1 text-xs font-mono px-2 py-1 rounded ${\n nodeLog.response.status >= 200 && nodeLog.response.status < 300\n ? 'text-green-400 bg-green-900/20'\n : 'text-red-400 bg-red-900/20'\n }`}>\n {nodeLog.response.status} {nodeLog.response.statusText || ''}\n </div>\n </div>\n )}\n {nodeLog.response.headers && Object.keys(nodeLog.response.headers).length > 0 && (\n <div>\n <span className=\"text-xs text-gray-500\">Headers</span>\n <pre className=\"mt-1 text-xs font-mono text-gray-300 bg-gray-900/50 px-2 py-1 rounded overflow-x-auto\">\n {JSON.stringify(nodeLog.response.headers, null, 2)}\n </pre>\n </div>\n )}\n {nodeLog.response.data && (\n <div>\n <span className=\"text-xs text-gray-500\">Data</span>\n <pre className=\"mt-1 text-xs font-mono text-gray-300 bg-gray-900/50 px-2 py-1 rounded overflow-x-auto max-h-64 overflow-y-auto\">\n {JSON.stringify(nodeLog.response.data, null, 2)}\n </pre>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Output Data */}\n {nodeLog.output && (\n <div className=\"border border-gray-700/50 rounded-lg overflow-hidden\">\n <div className=\"px-3 py-2 bg-gray-800/30 border-b border-gray-700/50\">\n <span className=\"text-xs font-medium text-gray-300\">Output</span>\n </div>\n <div className=\"p-3\">\n <pre className=\"text-xs font-mono text-gray-300 bg-gray-900/50 px-2 py-1 rounded overflow-x-auto max-h-64 overflow-y-auto\">\n {JSON.stringify(nodeLog.output, null, 2)}\n </pre>\n </div>\n </div>\n )}\n\n {/* Error */}\n {nodeLog.error && (\n <div className=\"border border-red-700/50 rounded-lg overflow-hidden bg-red-900/10\">\n <div className=\"px-3 py-2 bg-red-800/30 border-b border-red-700/50\">\n <span className=\"text-xs font-medium text-red-300\">Error</span>\n </div>\n <div className=\"p-3\">\n <pre className=\"text-xs font-mono text-red-300 whitespace-pre-wrap\">\n {nodeLog.error}\n </pre>\n </div>\n </div>\n )}\n </>\n ) : (\n <div className=\"h-full flex items-center justify-center py-12\">\n <div className=\"text-center\">\n <p className=\"text-xs text-gray-500 mb-2\">No execution logs yet</p>\n <p className=\"text-xs text-gray-600\">Execute the node to see request/response details</p>\n </div>\n </div>\n )}\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Node ID\n </label>\n <input\n type=\"text\"\n value={node.id}\n disabled\n className={inputClassName + ' opacity-50 cursor-not-allowed'}\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Node Type\n </label>\n <input\n type=\"text\"\n value={node.type}\n disabled\n className={inputClassName + ' opacity-50 cursor-not-allowed'}\n />\n </div>\n\n {/* Execution Settings */}\n <div className=\"border-t border-gray-700/50 pt-4 space-y-4\">\n <p className=\"text-xs font-medium text-gray-400 mb-3\">Execution Settings</p>\n \n {/* Always Output Data */}\n <div className=\"flex items-center justify-between\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-1\">\n Always Output Data\n </label>\n <p className=\"text-xs text-gray-500\">\n Always produce output even if empty\n </p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={node.config?.always_output_data || false}\n onChange={(e) => handleConfigChange('always_output_data', e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-purple-600\"></div>\n </label>\n </div>\n\n {/* Execute Once */}\n <div className=\"flex items-center justify-between\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-1\">\n Execute Once\n </label>\n <p className=\"text-xs text-gray-500\">\n Execute this node only once per workflow run\n </p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={node.config?.execute_once || false}\n onChange={(e) => handleConfigChange('execute_once', e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-purple-600\"></div>\n </label>\n </div>\n\n {/* Retry On Fail */}\n <div className=\"flex items-center justify-between\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-1\">\n Retry On Fail\n </label>\n <p className=\"text-xs text-gray-500\">\n Automatically retry if execution fails\n </p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={node.config?.retry_on_fail || false}\n onChange={(e) => handleConfigChange('retry_on_fail', e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-purple-600\"></div>\n </label>\n </div>\n\n {/* On Error */}\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n On Error\n </label>\n <select\n value={node.config?.on_error || 'stop_workflow'}\n onChange={(e) => handleConfigChange('on_error', e.target.value)}\n className={inputClassName}\n >\n <option value=\"stop_workflow\">Stop Workflow</option>\n <option value=\"continue_workflow\">Continue Workflow</option>\n <option value=\"retry\">Retry</option>\n <option value=\"skip_node\">Skip Node</option>\n </select>\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Action to take when this node encounters an error\n </p>\n </div>\n </div>\n\n {/* Notes Section */}\n <div className=\"border-t border-gray-700/50 pt-4 space-y-4\">\n <p className=\"text-xs font-medium text-gray-400 mb-3\">Notes</p>\n \n {/* Notes Text Area */}\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-2\">\n Notes\n </label>\n <textarea\n value={node.config?.notes || ''}\n onChange={(e) => handleConfigChange('notes', e.target.value)}\n className={`${inputClassName} resize-y`}\n rows={4}\n placeholder=\"Add notes about this node...\"\n />\n <p className=\"text-xs text-gray-500 mt-1.5\">\n Add notes or documentation for this node\n </p>\n </div>\n\n {/* Display Note in Flow */}\n <div className=\"flex items-center justify-between\">\n <div>\n <label className=\"block text-xs font-medium text-gray-400 mb-1\">\n Display Note in Flow?\n </label>\n <p className=\"text-xs text-gray-500\">\n Show notes on the node in the canvas\n </p>\n </div>\n <label className=\"relative inline-flex items-center cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={node.config?.display_note_in_flow || false}\n onChange={(e) => handleConfigChange('display_note_in_flow', e.target.checked)}\n className=\"sr-only peer\"\n />\n <div className=\"w-11 h-6 bg-gray-700 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-purple-600\"></div>\n </label>\n </div>\n </div>\n\n {/* Delete Node */}\n <div className=\"border-t border-gray-700/50 pt-4\">\n <button\n onClick={onDelete}\n className=\"w-full px-3 py-2 text-sm bg-red-600/20 text-red-400 border border-red-600/30 rounded-lg hover:bg-red-600/30 flex items-center justify-center gap-2 transition-colors\"\n >\n <Trash2 className=\"w-4 h-4\" />\n Delete Node\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Right: Execution Logs/Output */}\n <div className=\"w-[30%] min-w-[250px] max-w-[400px] bg-[#1a1a2e] flex flex-col flex-shrink-0\">\n <div className=\"px-4 py-3 border-b border-gray-700/50 bg-[#1e1e32] flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold text-gray-200\">OUTPUT</h3>\n {nodeLog && (nodeLog.status === 'success' || nodeLog.status === 'completed') && (\n <>\n <div className=\"w-4 h-4 rounded-full bg-green-500 flex items-center justify-center\">\n <CheckCircle2 className=\"w-3 h-3 text-white\" />\n </div>\n <Info className=\"w-4 h-4 text-gray-400\" />\n </>\n )}\n {nodeLog && nodeLog.status === 'error' && (\n <AlertCircle className=\"w-4 h-4 text-yellow-400\" />\n )}\n </div>\n </div>\n \n {/* Output Tabs */}\n {(nodeLog || (node?.type === 'input_node' && (node.config?.filename || node.result_metadata?.file_info || node.result_metadata?.data))) && (\n <div className=\"flex border-b border-gray-700/50 bg-[#1e1e32]\">\n <button\n onClick={() => setOutputViewTab('table')}\n className={`px-4 py-2 text-xs font-medium transition-colors ${\n outputViewTab === 'table'\n ? 'text-gray-200 border-b-2 border-gray-200'\n : 'text-gray-500 hover:text-gray-300'\n }`}\n >\n Table\n </button>\n <button\n onClick={() => setOutputViewTab('json')}\n className={`px-4 py-2 text-xs font-medium transition-colors ${\n outputViewTab === 'json'\n ? 'text-gray-200 border-b-2 border-gray-200'\n : 'text-gray-500 hover:text-gray-300'\n }`}\n >\n JSON\n </button>\n <button\n onClick={() => setOutputViewTab('schema')}\n className={`px-4 py-2 text-xs font-medium transition-colors ${\n outputViewTab === 'schema'\n ? 'text-gray-200 border-b-2 border-gray-200'\n : 'text-gray-500 hover:text-gray-300'\n }`}\n >\n Schema\n </button>\n </div>\n )}\n\n <div className=\"flex-1 overflow-y-auto p-4\">\n {/* Info box for RFdiffusion */}\n {node.type === 'rfdiffusion_node' && !nodeLog && (\n <div className=\"mb-4 bg-gray-800/50 border border-gray-700/50 rounded-lg p-3 flex items-start gap-2\">\n <div className=\"w-4 h-4 rounded-full bg-blue-500/20 flex items-center justify-center flex-shrink-0 mt-0.5\">\n <span className=\"text-blue-400 text-xs font-bold\">i</span>\n </div>\n <p className=\"text-xs text-gray-400 leading-relaxed\">\n Use the suggested contigs from the input node for optimal results. The contigs parameter specifies which regions of the structure to design.\n </p>\n </div>\n )}\n {(() => {\n // Check if we should show output - be more explicit about the condition\n const hasFileData = node?.type === 'input_node' && (\n node.config?.filename || \n node.config?.file_id || \n node.result_metadata?.file_info || \n node.result_metadata?.data\n );\n const shouldShowOutput = nodeLog || hasFileData;\n \n // Debug logging for input nodes\n if (node?.type === 'input_node') {\n console.log('[PipelineNodeConfig] Output section render check:', {\n nodeId,\n shouldShowOutput: !!shouldShowOutput,\n hasNodeLog: !!nodeLog,\n hasConfig: !!node.config,\n configObject: node.config,\n configKeys: node.config ? Object.keys(node.config) : null,\n hasConfigFilename: !!node.config?.filename,\n configFilename: node.config?.filename,\n hasConfigFileId: !!node.config?.file_id,\n configFileId: node.config?.file_id,\n hasResultMetadataFileInfo: !!node.result_metadata?.file_info,\n hasResultMetadataData: !!node.result_metadata?.data,\n hasFileData: !!hasFileData,\n conditionBreakdown: {\n isInputNode: node?.type === 'input_node',\n hasFilename: !!node.config?.filename,\n hasFileId: !!node.config?.file_id,\n hasFileInfo: !!node.result_metadata?.file_info,\n hasResultData: !!node.result_metadata?.data,\n },\n });\n }\n \n return !!shouldShowOutput;\n })() ? (\n <div className=\"space-y-4\">\n {/* Extract output data - for HTTP requests, get response data */}\n {(() => {\n let outputData: any = null;\n let itemCount = 0;\n \n // Log at the start of data extraction\n if (node?.type === 'input_node') {\n console.log('[PipelineNodeConfig] Starting output data extraction for input node:', {\n nodeId,\n hasNodeLog: !!nodeLog,\n hasConfig: !!node.config,\n });\n }\n \n // Debug logging for HTTP request nodes\n if (node?.type === 'http_request_node') {\n console.log('[PipelineNodeConfig] Extracting output for HTTP request:', {\n nodeId,\n hasNodeLog: !!nodeLog,\n hasError: !!nodeLog?.error,\n hasOutput: !!nodeLog?.output,\n hasResponse: !!nodeLog?.response,\n responseData: nodeLog?.response?.data,\n outputType: typeof nodeLog?.output,\n outputKeys: nodeLog?.output && typeof nodeLog?.output === 'object' ? Object.keys(nodeLog.output) : null,\n });\n }\n \n // For input nodes, show data from config or result_metadata even without execution log\n if (node?.type === 'input_node') {\n // Check result_metadata first (stored after execution)\n if (node.result_metadata?.file_info) {\n outputData = node.result_metadata.file_info;\n } else if (node.result_metadata?.data) {\n outputData = node.result_metadata.data;\n } else if (nodeLog?.output?.data) {\n outputData = nodeLog.output.data;\n } else if (nodeLog?.output) {\n outputData = nodeLog.output;\n } else if (node.config?.filename || node.config?.file_id) {\n // Show config data if no execution log exists yet\n outputData = {\n type: 'pdb_file',\n filename: node.config.filename || 'Unknown',\n file_id: node.config.file_id,\n file_url: node.config.file_url,\n chains: node.config.chains,\n total_residues: node.config.total_residues,\n suggested_contigs: node.config.suggested_contigs,\n chain_residue_counts: node.config.chain_residue_counts,\n atoms: node.config.atoms,\n };\n }\n \n // Debug logging for input nodes\n console.log('[PipelineNodeConfig] Input node output data extraction:', {\n nodeId,\n hasNodeLog: !!nodeLog,\n hasResultMetadata: !!node.result_metadata,\n hasFileInfo: !!node.result_metadata?.file_info,\n hasResultData: !!node.result_metadata?.data,\n hasConfigFilename: !!node.config?.filename,\n configKeys: node.config ? Object.keys(node.config) : null,\n outputData: outputData,\n outputDataType: typeof outputData,\n outputDataKeys: outputData && typeof outputData === 'object' ? Object.keys(outputData) : null,\n });\n \n // Count items for input nodes\n if (outputData !== null && outputData !== undefined) {\n if (Array.isArray(outputData)) {\n itemCount = outputData.length;\n } else if (typeof outputData === 'object') {\n itemCount = Object.keys(outputData).length > 0 ? 1 : 0;\n } else {\n itemCount = 1;\n }\n }\n } else if (nodeLog) {\n // Always show errors if they exist\n if (nodeLog?.error) {\n outputData = { \n error: nodeLog.error,\n status: nodeLog.status,\n ...(nodeLog.response && { response: nodeLog.response }),\n };\n itemCount = 1;\n } else if (nodeLog?.response?.data !== undefined && nodeLog?.response?.data !== null) {\n // For HTTP requests, prioritize response.data, then output.data, then output\n outputData = nodeLog.response.data;\n } else if (nodeLog?.output !== undefined && nodeLog?.output !== null) {\n // Check if output has a data property (nested structure)\n if (typeof nodeLog.output === 'object' && 'data' in nodeLog.output && nodeLog.output.data !== undefined) {\n outputData = nodeLog.output.data;\n } else {\n // Output is the data directly\n outputData = nodeLog.output;\n }\n }\n \n // Count items\n if (outputData !== null && outputData !== undefined) {\n if (Array.isArray(outputData)) {\n itemCount = outputData.length;\n } else if (typeof outputData === 'object') {\n itemCount = Object.keys(outputData).length > 0 ? 1 : 0;\n } else {\n itemCount = 1;\n }\n }\n }\n \n // Debug logging for extracted output\n if (node?.type === 'http_request_node') {\n console.log('[PipelineNodeConfig] Extracted output data:', {\n nodeId,\n hasNodeLog: !!nodeLog,\n nodeLogKeys: nodeLog ? Object.keys(nodeLog) : null,\n hasResponse: !!nodeLog?.response,\n responseKeys: nodeLog?.response ? Object.keys(nodeLog.response) : null,\n responseData: nodeLog?.response?.data,\n hasOutput: !!nodeLog?.output,\n outputValue: nodeLog?.output,\n hasOutputData: outputData !== null && outputData !== undefined,\n outputDataType: typeof outputData,\n outputDataKeys: outputData && typeof outputData === 'object' ? Object.keys(outputData) : null,\n outputDataValue: outputData,\n itemCount,\n });\n }\n\n return (\n <>\n {/* Item count */}\n {itemCount > 0 && (\n <div className=\"text-xs text-gray-500\">\n {itemCount} {itemCount === 1 ? 'item' : 'items'}\n </div>\n )}\n\n {/* Output content based on selected tab */}\n <div className=\"relative\">\n {/* Action buttons */}\n {outputData && (\n <div className=\"absolute top-2 right-2 flex items-center gap-2 z-10\">\n <button\n onClick={() => {\n const text = JSON.stringify(outputData, null, 2);\n navigator.clipboard.writeText(text);\n }}\n className=\"p-1.5 hover:bg-gray-700/50 rounded transition-colors\"\n title=\"Copy output\"\n >\n <Copy className=\"w-4 h-4 text-gray-400\" />\n </button>\n <button\n className=\"p-1.5 hover:bg-gray-700/50 rounded transition-colors\"\n title=\"Search\"\n >\n <Search className=\"w-4 h-4 text-gray-400\" />\n </button>\n </div>\n )}\n\n {/* JSON View */}\n {outputViewTab === 'json' && (\n <div className={`rounded-lg p-4 text-xs font-mono overflow-x-auto border min-h-[200px] ${\n outputData?.error \n ? 'bg-red-900/20 border-red-700/50 text-red-300' \n : 'bg-gray-900/50 border-gray-700/30 text-gray-300'\n }`}>\n <pre className=\"whitespace-pre-wrap\">\n {outputData !== null && outputData !== undefined ? (\n JSON.stringify(outputData, null, 2)\n ) : (\n <span className=\"text-gray-500 italic\">\n No output data available\n {node?.type === 'input_node' && (\n <div className=\"mt-2 text-xs space-y-1\">\n <div>Debug: nodeLog exists: {nodeLog ? 'yes' : 'no'}</div>\n <div>hasConfig: {node.config ? 'yes' : 'no'}</div>\n <div>hasFilename: {node.config?.filename ? 'yes' : 'no'}</div>\n <div>filename: {node.config?.filename || 'none'}</div>\n <div>hasResultMetadata: {node.result_metadata ? 'yes' : 'no'}</div>\n <div>configKeys: {node.config ? Object.keys(node.config).join(', ') : 'none'}</div>\n </div>\n )}\n {node?.type === 'http_request_node' && (\n <div className=\"mt-2 text-xs\">\n Debug: nodeLog exists: {nodeLog ? 'yes' : 'no'}, \n hasResponse: {nodeLog?.response ? 'yes' : 'no'}, \n hasOutput: {nodeLog?.output ? 'yes' : 'no'}\n </div>\n )}\n </span>\n )}\n </pre>\n </div>\n )}\n\n {/* Table View */}\n {outputViewTab === 'table' && (\n <div className=\"bg-gray-900/50 rounded-lg p-4 border border-gray-700/30 min-h-[200px]\">\n {/* Special formatted view for input node file metadata */}\n {node?.type === 'input_node' && outputData && typeof outputData === 'object' && outputData.type === 'pdb_file' ? (\n <div className=\"space-y-4\">\n {/* File Information Section */}\n <div className=\"space-y-3\">\n <h4 className=\"text-sm font-semibold text-gray-200 border-b border-gray-700 pb-2\">File Information</h4>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <span className=\"text-xs text-gray-500\">Filename:</span>\n <div className=\"text-xs text-gray-300 mt-1 font-mono\">{outputData.filename || 'N/A'}</div>\n </div>\n <div>\n <span className=\"text-xs text-gray-500\">File ID:</span>\n <div className=\"text-xs text-gray-300 mt-1 font-mono\">{outputData.file_id || 'N/A'}</div>\n </div>\n {outputData.file_url && (\n <div className=\"col-span-2\">\n <span className=\"text-xs text-gray-500\">File URL:</span>\n <div className=\"text-xs text-gray-300 mt-1 font-mono break-all\">{outputData.file_url}</div>\n </div>\n )}\n </div>\n </div>\n\n {/* Structure Information Section */}\n {(outputData.chains || outputData.total_residues || outputData.atoms) && (\n <div className=\"space-y-3 pt-3 border-t border-gray-700\">\n <h4 className=\"text-sm font-semibold text-gray-200 border-b border-gray-700 pb-2\">Structure Information</h4>\n <div className=\"grid grid-cols-2 gap-3\">\n {outputData.atoms && (\n <div>\n <span className=\"text-xs text-gray-500\">Atoms:</span>\n <div className=\"text-xs text-gray-300 mt-1\">{outputData.atoms.toLocaleString()}</div>\n </div>\n )}\n {outputData.total_residues && (\n <div>\n <span className=\"text-xs text-gray-500\">Total Residues:</span>\n <div className=\"text-xs text-gray-300 mt-1\">{outputData.total_residues.toLocaleString()}</div>\n </div>\n )}\n {outputData.chains && Array.isArray(outputData.chains) && (\n <div className=\"col-span-2\">\n <span className=\"text-xs text-gray-500\">Chains:</span>\n <div className=\"text-xs text-gray-300 mt-1\">\n {outputData.chains.join(', ')} ({outputData.chains.length} chain{outputData.chains.length !== 1 ? 's' : ''})\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Chain Details Section */}\n {outputData.chain_residue_counts && typeof outputData.chain_residue_counts === 'object' && Object.keys(outputData.chain_residue_counts).length > 0 && (\n <div className=\"space-y-3 pt-3 border-t border-gray-700\">\n <h4 className=\"text-sm font-semibold text-gray-200 border-b border-gray-700 pb-2\">Chain Residue Counts</h4>\n <div className=\"space-y-2\">\n {Object.entries(outputData.chain_residue_counts).map(([chain, count]) => (\n <div key={chain} className=\"flex items-center justify-between text-xs\">\n <span className=\"text-gray-500\">Chain {chain}:</span>\n <span className=\"text-gray-300 font-medium\">{count as number} residues</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* RFdiffusion Suggestions */}\n {outputData.suggested_contigs && (\n <div className=\"space-y-3 pt-3 border-t border-gray-700\">\n <h4 className=\"text-sm font-semibold text-gray-200 border-b border-gray-700 pb-2\">RFdiffusion Suggestions</h4>\n <div className=\"bg-blue-500/10 border border-blue-500/30 rounded-lg p-3\">\n <div className=\"text-xs text-gray-500 mb-1\">Suggested Contigs:</div>\n <div className=\"text-xs text-blue-300 font-mono\">{outputData.suggested_contigs}</div>\n <div className=\"text-xs text-gray-500 mt-2 italic\">\n Use this value in RFdiffusion nodes for optimal design results.\n </div>\n </div>\n </div>\n )}\n </div>\n ) : outputData && typeof outputData === 'object' && !Array.isArray(outputData) ? (\n <div className=\"space-y-2\">\n {Object.entries(outputData).map(([key, value]) => (\n <div key={key} className=\"flex items-start gap-2 text-xs\">\n <span className=\"text-gray-500 font-medium min-w-[120px]\">{key}:</span>\n <span className=\"text-gray-300 flex-1\">\n {typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value)}\n </span>\n </div>\n ))}\n </div>\n ) : Array.isArray(outputData) ? (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs\">\n <thead>\n <tr className=\"border-b border-gray-700\">\n {outputData.length > 0 && Object.keys(outputData[0]).map((key) => (\n <th key={key} className=\"text-left py-2 px-2 text-gray-400 font-medium\">\n {key}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {outputData.map((row: any, idx: number) => (\n <tr key={idx} className=\"border-b border-gray-800\">\n {Object.values(row).map((cell: any, cellIdx: number) => (\n <td key={cellIdx} className=\"py-2 px-2 text-gray-300\">\n {typeof cell === 'object' ? JSON.stringify(cell) : String(cell)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <div className=\"text-xs text-gray-500 italic\">\n Table view not available for this data type\n </div>\n )}\n </div>\n )}\n\n {/* Schema View */}\n {outputViewTab === 'schema' && (\n <div className=\"bg-gray-900/50 rounded-lg p-4 border border-gray-700/30 min-h-[200px]\">\n {outputData && typeof outputData === 'object' ? (\n <div className=\"text-xs font-mono text-gray-300\">\n <pre className=\"whitespace-pre-wrap\">\n {JSON.stringify(\n (() => {\n const getSchema = (obj: any): any => {\n if (Array.isArray(obj) && obj.length > 0) {\n return [getSchema(obj[0])];\n } else if (typeof obj === 'object' && obj !== null) {\n const schema: any = {};\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'object' && value !== null) {\n schema[key] = getSchema(value);\n } else {\n schema[key] = typeof value;\n }\n }\n return schema;\n }\n return typeof obj;\n };\n return getSchema(outputData);\n })(),\n null,\n 2\n )}\n </pre>\n </div>\n ) : (\n <div className=\"text-xs text-gray-500 italic\">\n Schema view not available for this data type\n </div>\n )}\n </div>\n )}\n </div>\n </>\n );\n })()}\n </div>\n ) : (\n <div className=\"h-full flex items-center justify-center\">\n <div className=\"text-center space-y-3\">\n <p className=\"text-sm text-gray-500 mb-1\">\n Execute this node to view data\n </p>\n <div className=\"text-xs text-gray-600 mt-2 p-2 bg-gray-800/50 rounded\">\n Debug: hasCurrentExecution={currentExecution ? 'yes' : 'no'}, \n logsCount={currentExecution?.logs?.length || 0}, \n hasNodeLog={nodeLog ? 'yes' : 'no'},\n nodeId={nodeId},\n nodeType={node?.type},\n isExecuting={usePipelineStore.getState().isExecuting}\n </div>\n <button\n onClick={handleExecuteStep}\n className=\"text-xs text-red-400 hover:text-red-300 transition-colors\"\n >\n or set mock data\n </button>\n {node?.type === 'message_input_node' && (\n <div className=\"mt-4 px-3 py-2 bg-blue-900/20 border border-blue-700/30 rounded-lg text-left max-w-xs\">\n <p className=\"text-xs text-blue-300 font-medium mb-1\">💡 Tip:</p>\n <p className=\"text-xs text-gray-400 leading-relaxed\">\n <code className=\"text-blue-300\">console.log()</code> outputs to the browser console (F12). \n To see output here, <code className=\"text-blue-300\">return</code> a value from your code.\n </p>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n"],"names":["getInputDataForNode","nodeId","nodes","edges","targetNodeType","incomingEdges","e","sourceNode","n","fileInfo","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","PipelineNodeConfig","onUpdate","onDelete","onClose","currentPipeline","currentExecution","executeSingleNode","usePipelineStore","getAuthHeaders","usePipelineContext","node","useEffect","pendingFile","setPendingFile","useState","uploadError","setUploadError","isUploading","setIsUploading","activeTab","setActiveTab","outputViewTab","setOutputViewTab","fileInputRef","useRef","nodeLog","log","l","inputData","hasInputs","jsx","handleConfigChange","key","value","latestNode","currentConfig","newConfig","updatedNode","handleFileSelected","file","formData","headers","response","errorData","result","updatedConfig","error","errorMessage","handleFileCleared","handleFileInputChange","event","maxSize","handleUploadClick","inputClassName","handleExecuteStep","renderConfigFields","jsxs","File","X","Button","Upload","Alert","AlertCircle","AlertDescription","chain","count","Label","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","_m","_n","_o","_p","_q","_r","_s","_t","_u","Fragment","_v","_w","_x","_y","_z","_A","_B","_C","_D","_E","_F","_G","_H","_I","_J","_K","_L","_M","_N","_O","_P","_Q","_R","_S","_T","_U","_V","_W","_X","_Y","_Z","__","_$","_aa","_ba","_ca","_da","_ea","_fa","_ga","_ha","_ia","_ja","_ka","ArrowLeft","Play","Trash2","CheckCircle2","Info","hasFileData","shouldShowOutput","outputData","itemCount","text","Copy","Search","row","idx","cell","cellIdx","getSchema","obj","schema"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare const PipelineNodePalette: React.FC;
3
+ //# sourceMappingURL=PipelineNodePalette.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineNodePalette.d.ts","sourceRoot":"","sources":["../../components/PipelineNodePalette.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AA2D1B,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EA+CvC,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { jsxs as t, jsx as o } from "react/jsx-runtime";
2
+ import { usePipelineStore as d } from "../store/pipelineStore.mjs";
3
+ import { getDefaultNodeConfig as p } from "../utils/nodeLoader.mjs";
4
+ import { FileInput as m, Sparkles as g, Dna as u, Layers as b, MessageSquare as f, Globe as h } from "lucide-react";
5
+ const a = [
6
+ {
7
+ type: "input_node",
8
+ label: "Input",
9
+ icon: /* @__PURE__ */ o(m, { className: "w-5 h-5" }),
10
+ color: "bg-blue-500",
11
+ description: "Upload PDB file"
12
+ },
13
+ {
14
+ type: "rfdiffusion_node",
15
+ label: "RFdiffusion",
16
+ icon: /* @__PURE__ */ o(g, { className: "w-5 h-5" }),
17
+ color: "bg-purple-500",
18
+ description: "De novo backbone design"
19
+ },
20
+ {
21
+ type: "proteinmpnn_node",
22
+ label: "ProteinMPNN",
23
+ icon: /* @__PURE__ */ o(u, { className: "w-5 h-5" }),
24
+ color: "bg-green-500",
25
+ description: "Sequence design"
26
+ },
27
+ {
28
+ type: "alphafold_node",
29
+ label: "AlphaFold",
30
+ icon: /* @__PURE__ */ o(b, { className: "w-5 h-5" }),
31
+ color: "bg-orange-500",
32
+ description: "Structure prediction"
33
+ },
34
+ {
35
+ type: "message_input_node",
36
+ label: "Code Execution",
37
+ icon: /* @__PURE__ */ o(f, { className: "w-5 h-5" }),
38
+ color: "bg-green-500",
39
+ description: "Execute JavaScript code for testing and processing"
40
+ },
41
+ {
42
+ type: "http_request_node",
43
+ label: "HTTP Request",
44
+ icon: /* @__PURE__ */ o(h, { className: "w-5 h-5" }),
45
+ color: "bg-blue-500",
46
+ description: "Make HTTP requests to any API endpoint"
47
+ }
48
+ ], v = () => {
49
+ const { addNode: l } = d(), n = async (e) => {
50
+ var r;
51
+ const s = await p(e), i = {
52
+ id: `node_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
53
+ type: e,
54
+ label: ((r = a.find((c) => c.type === e)) == null ? void 0 : r.label) || e,
55
+ config: { ...s },
56
+ inputs: {},
57
+ status: "idle",
58
+ position: {
59
+ x: Math.random() * 400 + 100,
60
+ y: Math.random() * 300 + 100
61
+ }
62
+ };
63
+ l(i);
64
+ };
65
+ return /* @__PURE__ */ t("div", { className: "w-64 bg-[#1e1e32] border-l border-gray-700/50 p-4 flex flex-col h-full", children: [
66
+ /* @__PURE__ */ o("h3", { className: "text-sm font-semibold text-gray-200 mb-3 flex-shrink-0", children: "Node Palette" }),
67
+ /* @__PURE__ */ o("div", { className: "space-y-2 overflow-y-auto flex-1 min-h-0", children: a.map((e) => /* @__PURE__ */ t(
68
+ "button",
69
+ {
70
+ onClick: () => n(e.type),
71
+ className: "w-full p-3 text-left border border-gray-700/50 rounded-lg hover:border-gray-600 hover:bg-gray-800/50 transition-colors group",
72
+ children: [
73
+ /* @__PURE__ */ t("div", { className: "flex items-center gap-2 mb-1", children: [
74
+ /* @__PURE__ */ o("div", { className: `${e.color} text-white p-1.5 rounded-lg shadow-lg group-hover:scale-110 transition-transform`, children: e.icon }),
75
+ /* @__PURE__ */ o("span", { className: "text-sm font-medium text-gray-200", children: e.label })
76
+ ] }),
77
+ /* @__PURE__ */ o("p", { className: "text-xs text-gray-500", children: e.description })
78
+ ]
79
+ },
80
+ e.type
81
+ )) })
82
+ ] });
83
+ };
84
+ export {
85
+ v as PipelineNodePalette
86
+ };
87
+ //# sourceMappingURL=PipelineNodePalette.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineNodePalette.mjs","sources":["../../components/PipelineNodePalette.tsx"],"sourcesContent":["import React from 'react';\nimport { usePipelineStore } from '../store/pipelineStore';\nimport { NodeType, PipelineNode } from '../types/index';\nimport { getDefaultNodeConfig } from '../utils/nodeLoader';\nimport { FileInput, Sparkles, Dna, Layers, MessageSquare, Globe } from 'lucide-react';\n\ninterface NodeTypeInfo {\n type: NodeType;\n label: string;\n icon: React.ReactNode;\n color: string;\n description: string;\n}\n\nconst nodeTypes: NodeTypeInfo[] = [\n {\n type: 'input_node',\n label: 'Input',\n icon: <FileInput className=\"w-5 h-5\" />,\n color: 'bg-blue-500',\n description: 'Upload PDB file',\n },\n {\n type: 'rfdiffusion_node',\n label: 'RFdiffusion',\n icon: <Sparkles className=\"w-5 h-5\" />,\n color: 'bg-purple-500',\n description: 'De novo backbone design',\n },\n {\n type: 'proteinmpnn_node',\n label: 'ProteinMPNN',\n icon: <Dna className=\"w-5 h-5\" />,\n color: 'bg-green-500',\n description: 'Sequence design',\n },\n {\n type: 'alphafold_node',\n label: 'AlphaFold',\n icon: <Layers className=\"w-5 h-5\" />,\n color: 'bg-orange-500',\n description: 'Structure prediction',\n },\n {\n type: 'message_input_node',\n label: 'Code Execution',\n icon: <MessageSquare className=\"w-5 h-5\" />,\n color: 'bg-green-500',\n description: 'Execute JavaScript code for testing and processing',\n },\n {\n type: 'http_request_node',\n label: 'HTTP Request',\n icon: <Globe className=\"w-5 h-5\" />,\n color: 'bg-blue-500',\n description: 'Make HTTP requests to any API endpoint',\n },\n];\n\nexport const PipelineNodePalette: React.FC = () => {\n const { addNode } = usePipelineStore();\n\n const handleAddNode = async (nodeType: NodeType) => {\n // Load default config for the node type\n const defaultConfig = await getDefaultNodeConfig(nodeType);\n \n const node: PipelineNode = {\n id: `node_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n type: nodeType,\n label: nodeTypes.find((nt) => nt.type === nodeType)?.label || nodeType,\n config: { ...defaultConfig },\n inputs: {},\n status: 'idle',\n position: {\n x: Math.random() * 400 + 100,\n y: Math.random() * 300 + 100,\n },\n };\n \n addNode(node);\n };\n\n return (\n <div className=\"w-64 bg-[#1e1e32] border-l border-gray-700/50 p-4 flex flex-col h-full\">\n <h3 className=\"text-sm font-semibold text-gray-200 mb-3 flex-shrink-0\">Node Palette</h3>\n <div className=\"space-y-2 overflow-y-auto flex-1 min-h-0\">\n {nodeTypes.map((nodeType) => (\n <button\n key={nodeType.type}\n onClick={() => handleAddNode(nodeType.type)}\n className=\"w-full p-3 text-left border border-gray-700/50 rounded-lg hover:border-gray-600 hover:bg-gray-800/50 transition-colors group\"\n >\n <div className=\"flex items-center gap-2 mb-1\">\n <div className={`${nodeType.color} text-white p-1.5 rounded-lg shadow-lg group-hover:scale-110 transition-transform`}>\n {nodeType.icon}\n </div>\n <span className=\"text-sm font-medium text-gray-200\">\n {nodeType.label}\n </span>\n </div>\n <p className=\"text-xs text-gray-500\">{nodeType.description}</p>\n </button>\n ))}\n </div>\n </div>\n );\n};\n\n"],"names":["nodeTypes","jsx","FileInput","Sparkles","Dna","Layers","MessageSquare","Globe","PipelineNodePalette","addNode","usePipelineStore","handleAddNode","nodeType","defaultConfig","getDefaultNodeConfig","node","_a","nt","jsxs"],"mappings":";;;;AAcA,MAAMA,IAA4B;AAAA,EAChC;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,gBAAAC,EAACC,GAAA,EAAU,WAAU,UAAA,CAAU;AAAA,IACrC,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,gBAAAD,EAACE,GAAA,EAAS,WAAU,UAAA,CAAU;AAAA,IACpC,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,gBAAAF,EAACG,GAAA,EAAI,WAAU,UAAA,CAAU;AAAA,IAC/B,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,gBAAAH,EAACI,GAAA,EAAO,WAAU,UAAA,CAAU;AAAA,IAClC,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,gBAAAJ,EAACK,GAAA,EAAc,WAAU,UAAA,CAAU;AAAA,IACzC,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,gBAAAL,EAACM,GAAA,EAAM,WAAU,UAAA,CAAU;AAAA,IACjC,OAAO;AAAA,IACP,aAAa;AAAA,EAAA;AAEjB,GAEaC,IAAgC,MAAM;AACjD,QAAM,EAAE,SAAAC,EAAA,IAAYC,EAAA,GAEdC,IAAgB,OAAOC,MAAuB;;AAElD,UAAMC,IAAgB,MAAMC,EAAqBF,CAAQ,GAEnDG,IAAqB;AAAA,MACzB,IAAI,QAAQ,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,MACjE,MAAMH;AAAA,MACN,SAAOI,IAAAhB,EAAU,KAAK,CAACiB,MAAOA,EAAG,SAASL,CAAQ,MAA3C,gBAAAI,EAA8C,UAASJ;AAAA,MAC9D,QAAQ,EAAE,GAAGC,EAAA;AAAA,MACb,QAAQ,CAAA;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,QACR,GAAG,KAAK,OAAA,IAAW,MAAM;AAAA,QACzB,GAAG,KAAK,OAAA,IAAW,MAAM;AAAA,MAAA;AAAA,IAC3B;AAGF,IAAAJ,EAAQM,CAAI;AAAA,EACd;AAEA,SACE,gBAAAG,EAAC,OAAA,EAAI,WAAU,0EACb,UAAA;AAAA,IAAA,gBAAAjB,EAAC,MAAA,EAAG,WAAU,0DAAyD,UAAA,gBAAY;AAAA,sBAClF,OAAA,EAAI,WAAU,4CACZ,UAAAD,EAAU,IAAI,CAACY,MACd,gBAAAM;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAMP,EAAcC,EAAS,IAAI;AAAA,QAC1C,WAAU;AAAA,QAEV,UAAA;AAAA,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,YAAA,gBAAAjB,EAAC,SAAI,WAAW,GAAGW,EAAS,KAAK,qFAC9B,YAAS,KAAA,CACZ;AAAA,YACA,gBAAAX,EAAC,QAAA,EAAK,WAAU,qCACb,YAAS,MAAA,CACZ;AAAA,UAAA,GACF;AAAA,UACA,gBAAAA,EAAC,KAAA,EAAE,WAAU,yBAAyB,YAAS,YAAA,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAZtDW,EAAS;AAAA,IAAA,CAcjB,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ interface SavePipelineDialogProps {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ onSave?: (name: string) => void;
6
+ }
7
+ export declare const SavePipelineDialog: React.FC<SavePipelineDialogProps>;
8
+ export {};
9
+ //# sourceMappingURL=SavePipelineDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SavePipelineDialog.d.ts","sourceRoot":"","sources":["../../components/SavePipelineDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAgBnD,UAAU,uBAAuB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAmMhE,CAAC"}