@burdenoff/fluidgrids-fe-sdk 2026.510.105

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 (68) hide show
  1. package/README.md +149 -0
  2. package/dist/ExecutionDetailPage-3EVS3WEC.js +6 -0
  3. package/dist/ExecutionDetailPage-3EVS3WEC.js.map +1 -0
  4. package/dist/ExecutionsListPage-NH2JLL2D.js +8 -0
  5. package/dist/ExecutionsListPage-NH2JLL2D.js.map +1 -0
  6. package/dist/TemplateConfigurationModal-UJAGRE7X.js +258 -0
  7. package/dist/TemplateConfigurationModal-UJAGRE7X.js.map +1 -0
  8. package/dist/TemplateDetailPanel-UXH6KPCH.js +172 -0
  9. package/dist/TemplateDetailPanel-UXH6KPCH.js.map +1 -0
  10. package/dist/WorkflowBuilder-BMKFLHVE.js +15 -0
  11. package/dist/WorkflowBuilder-BMKFLHVE.js.map +1 -0
  12. package/dist/WorkflowsList-CLI32VRE.js +8 -0
  13. package/dist/WorkflowsList-CLI32VRE.js.map +1 -0
  14. package/dist/chunk-4FFPGQD3.js +584 -0
  15. package/dist/chunk-4FFPGQD3.js.map +1 -0
  16. package/dist/chunk-5BDQNSP3.js +107 -0
  17. package/dist/chunk-5BDQNSP3.js.map +1 -0
  18. package/dist/chunk-6PHBYAEG.js +11494 -0
  19. package/dist/chunk-6PHBYAEG.js.map +1 -0
  20. package/dist/chunk-BQXHJIER.js +45 -0
  21. package/dist/chunk-BQXHJIER.js.map +1 -0
  22. package/dist/chunk-BXDSTMUA.js +8848 -0
  23. package/dist/chunk-BXDSTMUA.js.map +1 -0
  24. package/dist/chunk-CGKBAJMM.js +292 -0
  25. package/dist/chunk-CGKBAJMM.js.map +1 -0
  26. package/dist/chunk-FGYVIXQ7.js +979 -0
  27. package/dist/chunk-FGYVIXQ7.js.map +1 -0
  28. package/dist/chunk-G7B4SYFM.js +22 -0
  29. package/dist/chunk-G7B4SYFM.js.map +1 -0
  30. package/dist/chunk-GSJOLO3A.js +251 -0
  31. package/dist/chunk-GSJOLO3A.js.map +1 -0
  32. package/dist/chunk-GSS5PHRL.js +386 -0
  33. package/dist/chunk-GSS5PHRL.js.map +1 -0
  34. package/dist/chunk-GY66IQWN.js +524 -0
  35. package/dist/chunk-GY66IQWN.js.map +1 -0
  36. package/dist/chunk-LUGJJ7LL.js +297 -0
  37. package/dist/chunk-LUGJJ7LL.js.map +1 -0
  38. package/dist/chunk-NDJSUC4W.js +155 -0
  39. package/dist/chunk-NDJSUC4W.js.map +1 -0
  40. package/dist/chunk-UOCR65PI.js +262 -0
  41. package/dist/chunk-UOCR65PI.js.map +1 -0
  42. package/dist/chunk-WD52O45G.js +2015 -0
  43. package/dist/chunk-WD52O45G.js.map +1 -0
  44. package/dist/chunk-WWU2O2SR.js +52 -0
  45. package/dist/chunk-WWU2O2SR.js.map +1 -0
  46. package/dist/chunk-XQP33UJR.js +57 -0
  47. package/dist/chunk-XQP33UJR.js.map +1 -0
  48. package/dist/chunk-Z54K22LP.js +82 -0
  49. package/dist/chunk-Z54K22LP.js.map +1 -0
  50. package/dist/client-AMUUS7VE.js +3 -0
  51. package/dist/client-AMUUS7VE.js.map +1 -0
  52. package/dist/config-E4E7M6IN.js +3 -0
  53. package/dist/config-E4E7M6IN.js.map +1 -0
  54. package/dist/global-client-OW43ZRDR.js +3 -0
  55. package/dist/global-client-OW43ZRDR.js.map +1 -0
  56. package/dist/global-operations-WPTEYCJM.js +3 -0
  57. package/dist/global-operations-WPTEYCJM.js.map +1 -0
  58. package/dist/index.d.ts +56706 -0
  59. package/dist/index.js +6564 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/styles.css +139 -0
  62. package/dist/template-input-applicator-657KE4DM.js +3 -0
  63. package/dist/template-input-applicator-657KE4DM.js.map +1 -0
  64. package/dist/useImportWorkflowTemplate-2HS5D2OP.js +11 -0
  65. package/dist/useImportWorkflowTemplate-2HS5D2OP.js.map +1 -0
  66. package/dist/useTemplateDetail-NK63V3PC.js +6 -0
  67. package/dist/useTemplateDetail-NK63V3PC.js.map +1 -0
  68. package/package.json +148 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/builder/components/theme-provider.tsx","../src/builder/hooks/use-insert-node.ts","../src/builder/components/flow-builder/components/blocks/sidebar/components/sidebar-panel-wrapper.tsx","../src/builder/contants/symbols.ts","../src/builder/components/flow-builder/components/blocks/sidebar/panels/available-nodes/components/node-preview-draggable.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/available-nodes/available-nodes-panel.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/hooks/use-node-list.ts","../src/builder/components/flow-builder/components/blocks/sidebar/components/sidebar-panel-heading.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/components/node-list-item.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/property-panels/unavailable-property-panel.tsx","../src/modules/channels/hooks/useChannels.ts","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/property-panels/channel/ChannelSelector.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/property-panels/channel/ChannelDetails.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/property-panels/channel/ChannelAuth.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/property-panels/channel/ChannelNodePropertyPanel.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/property-panels/conversation/ConversationNodePropertyPanel.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/components/node-propery-panel.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/property-panels/introduction-property-panel.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/node-properties-panel.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/constants/panels.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/components/sidebar-switch-panel.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/components/sidebar-button-item.tsx","../src/hooks/store/useStoreNodes.ts","../src/hooks/store/useUpdateNode.ts","../src/hooks/store/useUninstallNode.ts","../src/hooks/store/useNodeUsageInWorkflows.ts","../src/hooks/store/useRemoveNodeFromWorkflows.ts","../src/hooks/store/useWorkflowTemplates.ts","../src/hooks/store/useCreateOrder.ts","../src/hooks/store/usePublishToStore.ts","../src/builder/components/flow-builder/components/store/StoreNodesSidebar.tsx","../src/ui/card.tsx","../src/builder/components/flow-builder/components/store/UninstallNodeDialog.tsx","../src/builder/components/flow-builder/components/store/StoreNodeCard.tsx","../src/builder/components/flow-builder/components/store/StoreNodesGrid.tsx","../src/builder/components/flow-builder/components/store/StoreNodesContent.tsx","../src/builder/components/flow-builder/components/store/StoreNodesModal.tsx","../src/builder/components/flow-builder/components/templates/TemplateCard.tsx","../src/builder/components/flow-builder/components/templates/TemplatesGrid.tsx","../src/builder/components/flow-builder/components/templates/TemplatesModal.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/fragments/desktop-sidebar-fragment.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/sidebar-module.tsx","../src/builder/hooks/use-delete-key-code.ts","../src/builder/hooks/use-on-nodes-delete.ts","../src/builder/hooks/use-node-auto-adjust.ts","../src/builder/components/mapper/theme-provider.tsx","../src/builder/components/mapper/config/data.ts","../src/builder/components/lib/type-utils.ts","../src/builder/components/mapper/schema-node.tsx","../src/builder/components/mapper/mapping-edge.tsx","../src/builder/components/mapper/node-group.tsx","../src/builder/components/lib/node-generator.ts","../src/builder/components/hooks/use-toast.ts","../src/builder/components/mapper/config/data-config-context.tsx","../src/builder/components/mapper/mapping-dialog.tsx","../src/builder/components/lib/mapping-utils.ts","../src/builder/components/mapper/visual-mapper.tsx","../src/builder/components/mapper/code-editor.tsx","../src/builder/components/mapper/mapping-preview.tsx","../src/builder/components/mapper/mapping-editor.tsx","../src/builder/components/lib/schema-parser.ts","../src/builder/components/mapper/config/default-data-config.ts","../src/builder/components/mapper/app.tsx","../src/builder/components/flow-builder/components/edges/conditionBuilder/custom-condition-edge.tsx","../src/builder/components/flow-builder/components/edges/conditionBuilder/graphql-condition-builder.tsx","../src/builder/components/flow-builder/components/edges/conditionBuilder/custom-condition-tree-converter.ts","../src/builder/components/flow-builder/components/edges/conditionBuilder/index.tsx","../src/builder/components/lib/introspection-parser.ts","../src/builder/components/flow-builder/components/edges/custom-deletable-edge.tsx","../src/builder/stores/add-node-on-edge-drop-state.ts","../src/builder/hooks/use-add-node-on-edge-drop.ts","../src/builder/hooks/use-drag-drop-flow-builder.ts","../src/builder/hooks/use-is-valid-connection.ts","../src/builder/components/flow-builder/components/controls/canvas-controls.tsx","../src/builder/components/flow-builder/components/add-node-floating-menu/components/node-list.tsx","../src/builder/components/flow-builder/components/add-node-floating-menu/add-node-floating-menu.tsx","../src/builder/hooks/use-flow-validator.ts","../src/builder/hooks/use-save-workflow.ts","../src/builder/components/flow-builder/components/ui/save-flow-button.tsx","../src/builder/components/flow-builder/components/ui/trigger-data-dialog.tsx","../src/builder/components/flow-builder/components/ui/execute-workflow-button.tsx","../src/builder/components/flow-builder/components/logs-panel/logs-panel.tsx","../src/builder/components/flow-builder/components/chat-panel/chat-panel.tsx","../src/builder/components/flow-builder/components/ui/version-history-panel.tsx","../src/builder/components/flow-builder/components/ui/activate-workflow-button.tsx","../src/builder/components/flow-builder/flow-builder.tsx","../src/builder/app/workflow/_components/flow-builder.tsx","../src/builder/app/workflow/work/page.tsx","../src/pages/WorkflowBuilder.tsx"],"names":["FeLibsThemeProvider","jsx","cn","useCallback","type","jsxs","Icon","Button","useState","useEffect","Input","gql","useShallow","useMemo","Fragment","NodePropertyPanel","useReactFlow","produce","error","useContext","useQuery","useMutation","count","Badge","Trash2","Loader2","React","Star","Sparkles","AlertCircle","RefreshCw","lazy","useImportWorkflowTemplate","useTemplateDetail","toast","getFluidGridsClient","getFluidGridsConfig","Suspense","a","b","x","y","ThemeProvider","React2","typeCompatibility","Card","CardContent","memo","props","extractFields","X","nodeTypes","List","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuItem","useRef","Tabs","TabsList","TabsTrigger","TabsContent","CardHeader","CardTitle","CardDescription","parsedSchemas","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","ChevronDown","ChevronRight","Label","stringValue","ConditionBuilder","ScrollArea","processObjectType","processInputObjectType","processEnumType","processInterfaceType","processUnionType","processField","getBezierPath","defaultDataConfig","Plus","createPortal","MiniMap","useNavigate","useParams","edgeTypes","id","ReactFlow","Background","ReactFlowProvider"],"mappings":"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","file":"chunk-6PHBYAEG.js","sourcesContent":["import * as React from \"react\";\nimport { ThemeProvider as FeLibsThemeProvider } from \"@burdenoff/fe-libs/shared/providers/shell\";\n\nexport interface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: string;\n storageKey?: string;\n}\n\nexport function ThemeProvider({ children }: ThemeProviderProps) {\n return <FeLibsThemeProvider>{children}</FeLibsThemeProvider>;\n}\n","import { ExtendedNodeType } from \"../components/flow-builder/components/blocks/types\";\nimport { createNodeWithDefaultData } from \"../components/flow-builder/components/blocks/utils\";\nimport { type XYPosition, useReactFlow } from \"@xyflow/react\";\nimport { useCallback } from \"react\";\n\nexport function useInsertNode() {\n const { addNodes, screenToFlowPosition, getNodes, updateNode } =\n useReactFlow();\n\n return useCallback(\n (type: ExtendedNodeType, pos?: XYPosition) => {\n const _pos =\n pos ||\n screenToFlowPosition({\n x: window.innerWidth / 2,\n y: window.innerHeight / 2,\n });\n\n getNodes().forEach((node) => {\n if (node.selected) {\n updateNode(node.id, { selected: false });\n }\n });\n\n const newNode = createNodeWithDefaultData(type, {\n position: _pos,\n selected: true,\n });\n addNodes(newNode);\n\n return newNode;\n },\n [screenToFlowPosition, getNodes, addNodes, updateNode],\n );\n}\n","import { cn } from \"@burdenoff/fe-libs/utils\";\n\nimport type { ComponentPropsWithoutRef } from \"react\";\n\ntype SidebarPanelWrapperProps = Readonly<ComponentPropsWithoutRef<\"div\">>;\n\nexport default function SidebarPanelWrapper({\n children,\n className,\n ...props\n}: SidebarPanelWrapperProps) {\n return (\n <div\n className={cn(\"flex flex-col w-80 h-full bg-background/60\", className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n","export const NODE_TYPE_DRAG_DATA_FORMAT = \"application/flow-builder.node-type\";\n","import { NODE_TYPE_DRAG_DATA_FORMAT } from \"../../../../../../../../contants/symbols\";\nimport { useInsertNode } from \"../../../../../../../../hooks/use-insert-node\";\nimport { type DragEvent, type ReactNode, useCallback } from \"react\";\nimport { BuilderNodeType } from \"../../../../types\";\nimport { Icon } from \"@iconify/react\";\n\ntype NodePreviewDraggableProps = Readonly<{\n icon: string | ReactNode;\n title: string;\n description: string;\n type: string;\n children?: never;\n setActivePanel: (\n panel: \"node-properties\" | \"available-nodes\" | \"none\",\n ) => void;\n insertNode: ReturnType<typeof useInsertNode>;\n}>;\n\nexport function NodePreviewDraggable({\n icon,\n title,\n description,\n type,\n setActivePanel,\n insertNode,\n}: NodePreviewDraggableProps) {\n const onDragStart = useCallback((e: DragEvent, type: string) => {\n e.dataTransfer.setData(NODE_TYPE_DRAG_DATA_FORMAT, type);\n e.dataTransfer.effectAllowed = \"move\";\n }, []);\n\n const onClick = useCallback(() => {\n insertNode(type as BuilderNodeType);\n setActivePanel(\"none\");\n }, [insertNode, setActivePanel, type]);\n\n return (\n <div\n className={\n \"flex cursor-grab select-none gap-2 border border-card-foreground/10 rounded-xl bg-card p-2.5 shadow-sm transition hover:ring-2 hover:ring-primary/50\"\n }\n onClick={onClick}\n onDragStart={(e) => onDragStart(e, type)}\n draggable\n data-vaul-no-drag\n >\n <div className=\"shrink-0\">\n <div className=\"size-10 flex items-center justify-center border border-card-foreground/10 rounded-xl bg-card\">\n {typeof icon === \"string\" ? (\n <Icon icon={icon} className=\"size-6 text-card-foreground/80\" />\n ) : (\n icon\n )}\n </div>\n </div>\n\n <div className=\"ml-1 flex grow flex-col\">\n <div className=\"mt-px text-sm font-medium leading-normal\">{title}</div>\n\n <div className=\"line-clamp-3 mt-1 text-xs text-card-foreground/60 leading-normal\">\n {description}\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport { useInsertNode } from \"../../../../../../../hooks/use-insert-node\";\nimport { useFlowStore } from \"../../../../../../../stores/flow-store\";\nimport { useShallow } from \"zustand/shallow\";\nimport SidebarPanelWrapper from \"../../components/sidebar-panel-wrapper\";\nimport {\n AVAILABLE_NODES,\n ensureNodeConfigsLoaded,\n isNodeConfigsInitialized,\n} from \"../../..\";\nimport { NodePreviewDraggable } from \"./components/node-preview-draggable\";\nimport { Icon } from \"@iconify/react\";\nexport default function AvailableNodesPanel() {\n const [setActivePanel] = useFlowStore(\n useShallow((s) => [s.actions.sidebar.setActivePanel]),\n );\n\n const [triggersExpanded, setTriggersExpanded] = useState(true);\n const [builtInExpanded, setBuiltInExpanded] = useState(true);\n const [storeExpanded, setStoreExpanded] = useState(true);\n const [nodesLoaded, setNodesLoaded] = useState(isNodeConfigsInitialized());\n\n const insertNode = useInsertNode();\n\n // Ensure nodes are loaded on component mount\n useEffect(() => {\n if (!nodesLoaded) {\n ensureNodeConfigsLoaded().then(() => {\n setNodesLoaded(true);\n });\n }\n }, [nodesLoaded]);\n\n /**\n * Check if a node type is a trigger node.\n */\n const isTriggerType = (type: string) => {\n return (\n type === \"trigger\" ||\n type === \"trigger:api\" ||\n type.startsWith(\"trigger:\") ||\n type.startsWith(\"internal:schedule\") ||\n type.startsWith(\"internal:webhook\") ||\n type.startsWith(\"internal:api\") ||\n type.startsWith(\"internal:form\") ||\n type.startsWith(\"internal:mcp\") ||\n type.endsWith(\"_trigger\") ||\n type.endsWith(\"Trigger\") ||\n type.endsWith(\"-trigger\") ||\n type === \"integration/channel\"\n );\n };\n\n // Separate nodes into triggers, built-in, and store nodes\n // Use publishType from GraphQL as the source of truth\n // BUILTIN = native platform nodes (IF, Switch, Loop, HTTP, etc.)\n // STORE = nodes installed from marketplace\n // CUSTOM = user-created nodes (future)\n const triggerNodes = AVAILABLE_NODES.filter((node) => {\n return (\n isTriggerType(node.type) &&\n (node.publishType === \"BUILTIN\" ||\n node.publishType === undefined ||\n node.publishType === null)\n );\n });\n\n const builtInNodes = AVAILABLE_NODES.filter((node) => {\n return (\n !isTriggerType(node.type) &&\n (node.publishType === \"BUILTIN\" ||\n node.publishType === undefined ||\n node.publishType === null)\n );\n });\n\n const storeNodes = AVAILABLE_NODES.filter((node) => {\n return node.publishType === \"STORE\";\n });\n\n // Split store nodes into trigger and non-trigger\n const storeTriggerNodes = storeNodes.filter((node) =>\n isTriggerType(node.type),\n );\n const storeActionNodes = storeNodes.filter(\n (node) => !isTriggerType(node.type),\n );\n\n return (\n <SidebarPanelWrapper>\n <div className=\"mt-4 flex flex-col items-center p-4 text-center\">\n <div className=\"size-12 flex items-center justify-center rounded-full bg-primary\">\n <Icon icon=\"mynaui:grid\" className=\"size-6 text-white\" />\n </div>\n\n <div className=\"mt-4 text-balance font-medium\">Available Nodes</div>\n\n <div className=\"mt-1 w-2/3 text-xs text-light-50/40 font-medium leading-normal\">\n Drag and drop nodes to build your workflow\n </div>\n </div>\n\n {!nodesLoaded && (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"flex flex-col items-center gap-2\">\n <Icon\n icon=\"mynaui:spinner\"\n className=\"size-6 text-primary animate-spin\"\n />\n <span className=\"text-sm text-foreground/60\">Loading nodes...</span>\n </div>\n </div>\n )}\n\n {nodesLoaded && (\n <div className=\"flex flex-col gap-4 p-4 overflow-y-auto max-h-[calc(100vh-200px)] scrollbar-thin scrollbar-track-transparent hover:scrollbar-thumb-gray-300/50 scrollbar-thumb-gray-300/30 scrollbar-w-[3px]\">\n {/* Trigger Nodes Section */}\n {(triggerNodes.length > 0 || storeTriggerNodes.length > 0) && (\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={() => setTriggersExpanded(!triggersExpanded)}\n className=\"flex items-center justify-between px-2 py-1.5 text-sm font-medium text-foreground/80 hover:text-foreground transition-colors\"\n >\n <span className=\"flex items-center gap-2\">\n <Icon\n icon={\n triggersExpanded\n ? \"mynaui:chevron-down\"\n : \"mynaui:chevron-right\"\n }\n className=\"size-4\"\n />\n <Icon\n icon=\"solar:play-bold\"\n className=\"size-3.5 text-primary\"\n />\n Triggers\n </span>\n <span className=\"text-xs text-foreground/50\">\n {triggerNodes.length + storeTriggerNodes.length}\n </span>\n </button>\n\n {triggersExpanded && (\n <div className=\"grid grid-cols-1 gap-3 pl-2\">\n {triggerNodes.map((node) => (\n <NodePreviewDraggable\n key={node.type}\n type={node.type}\n icon={node.icon}\n title={node.title}\n description={node.description ?? \"\"}\n setActivePanel={setActivePanel}\n insertNode={insertNode}\n />\n ))}\n {storeTriggerNodes.map((node) => (\n <NodePreviewDraggable\n key={node.type}\n type={node.type}\n icon={node.icon}\n title={node.title}\n description={node.description ?? \"\"}\n setActivePanel={setActivePanel}\n insertNode={insertNode}\n />\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Built-in Nodes Section */}\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={() => setBuiltInExpanded(!builtInExpanded)}\n className=\"flex items-center justify-between px-2 py-1.5 text-sm font-medium text-foreground/80 hover:text-foreground transition-colors\"\n >\n <span className=\"flex items-center gap-2\">\n <Icon\n icon={\n builtInExpanded\n ? \"mynaui:chevron-down\"\n : \"mynaui:chevron-right\"\n }\n className=\"size-4\"\n />\n Built-in Nodes\n </span>\n <span className=\"text-xs text-foreground/50\">\n {builtInNodes.length}\n </span>\n </button>\n\n {builtInExpanded && (\n <div className=\"grid grid-cols-1 gap-3 pl-2\">\n {builtInNodes.map((node) => (\n <NodePreviewDraggable\n key={node.type}\n type={node.type}\n icon={node.icon}\n title={node.title}\n description={node.description ?? \"\"}\n setActivePanel={setActivePanel}\n insertNode={insertNode}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Store Nodes Section (non-trigger store nodes only) */}\n {storeActionNodes.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={() => setStoreExpanded(!storeExpanded)}\n className=\"flex items-center justify-between px-2 py-1.5 text-sm font-medium text-foreground/80 hover:text-foreground transition-colors\"\n >\n <span className=\"flex items-center gap-2\">\n <Icon\n icon={\n storeExpanded\n ? \"mynaui:chevron-down\"\n : \"mynaui:chevron-right\"\n }\n className=\"size-4\"\n />\n Store Nodes\n <Icon\n icon=\"mynaui:shopping-bag\"\n className=\"size-3.5 text-primary\"\n />\n </span>\n <span className=\"text-xs text-foreground/50\">\n {storeActionNodes.length} installed\n </span>\n </button>\n\n {storeExpanded && (\n <div className=\"grid grid-cols-1 gap-3 pl-2\">\n {storeActionNodes.map((node) => (\n <NodePreviewDraggable\n key={node.type}\n type={node.type}\n icon={node.icon}\n title={node.title}\n description={node.description ?? \"\"}\n setActivePanel={setActivePanel}\n insertNode={insertNode}\n />\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </SidebarPanelWrapper>\n );\n}\n","import { useMemo } from \"react\";\n\nimport type { Node } from \"@xyflow/react\";\nimport { BuilderNode } from \"../../../../types\";\nimport { getNodeDetail } from \"../../../../utils\";\n\ninterface NodeWithDetail {\n id: string;\n type?: string;\n data: Record<string, unknown>;\n position: { x: number; y: number };\n detail: ReturnType<typeof getNodeDetail>;\n [key: string]: unknown;\n}\n\nexport function useNodeList(nodes: Node[]): NodeWithDetail[] {\n return useMemo(() => {\n return nodes\n .slice()\n .sort((a, b) => {\n if (a.type === BuilderNode.TRIGGER) return -1;\n if (b.type === BuilderNode.TRIGGER) return 1;\n if (a.type === BuilderNode.END) return 1;\n if (b.type === BuilderNode.END) return -1;\n return 0;\n })\n .map((n) => ({\n ...n,\n detail: getNodeDetail(n.type),\n })) as NodeWithDetail[];\n }, [nodes]);\n}\n","import { cn } from \"@burdenoff/fe-libs/utils\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\ntype SidebarPanelHeadingProps = Readonly<ComponentPropsWithoutRef<\"div\">>;\n\nexport default function SidebarPanelHeading({\n children,\n className,\n ...props\n}: SidebarPanelHeadingProps) {\n return (\n <div\n className={cn(\n \"flex items-center text-sm h-10 leading-none px-4 border-b border-t select-none shrink-0 border-card-foreground/10 bg-card/80 text-center text-card-foreground/60 gap-x-2 font-semibold\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import { HeaderWithIcon } from \"../../../../../ui/header-with-icon\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport { isEmpty } from \"radash\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\n// Utility function to truncate text in the middle\nfunction truncateMiddle(text: string, maxLength: number) {\n if (text.length <= maxLength) return text;\n const half = maxLength / 2;\n return `${text.slice(0, half)}...${text.slice(-half)}`;\n}\n\ntype NodeListItemProps = Readonly<\n ComponentPropsWithoutRef<\"button\"> & {\n icon: string;\n title: string;\n id?: string;\n selected?: boolean;\n pseudoSelected?: boolean;\n }\n>;\n\nexport function NodeListItem({\n id,\n title,\n className,\n icon,\n selected,\n pseudoSelected: _pseudoSelected,\n ...props\n}: NodeListItemProps) {\n return (\n <Button\n type=\"button\"\n variant={selected ? \"default\" : \"ghost\"}\n className={cn(\n \"h-8 select-none flex items-center justify-between gap-4 \",\n\n className,\n )}\n {...props}\n >\n <HeaderWithIcon icon={icon} title={title} />\n\n {id && !isEmpty(id) && (\n <div className=\"rounded-md text-xs max-w-20 overflow-hidden bg-card px-2 py-1.5 text-2.5 text-card-foreground/80 font-semibold leading-none tracking-wide\">\n {truncateMiddle(id, 4)}\n </div>\n )}\n </Button>\n );\n}\n","import { Icon } from \"@iconify/react\";\n\nexport default function UnavailableNodePropertyPanel() {\n return (\n <div className=\"h-full flex flex-col items-center justify-center p-4 text-center\">\n <div className=\"size-12 flex items-center justify-center rounded-full bg-card\">\n <Icon icon=\"mynaui:info-triangle\" className=\"size-6 text-white\" />\n </div>\n\n <div className=\"mt-4 text-balance font-medium\">\n Unavailable Properties\n </div>\n\n <div className=\"mt-1 text-xs text-card-foreground/40 font-medium leading-normal\">\n Either no properties are available for this node or the node is not\n selected.\n </div>\n\n <div className=\"mt-8 w-full text-xs text-card-foreground/40 font-medium italic\">\n Select another node to view its properties.\n </div>\n </div>\n );\n}\n","/**\n * Custom hooks for fetching channels from global-channel-svc.\n *\n * These hooks query the global-channel-svc via the global public gateway.\n * Channels represent configured connections to communication platforms\n * (Slack, Teams, Discord, Email, SMS, etc.).\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { gql } from \"@apollo/client\";\nimport { useGlobalStoreClient } from \"../../../hooks/store/useGlobalStoreClient\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ChannelPlatform =\n | \"SLACK\"\n | \"TEAMS\"\n | \"DISCORD\"\n | \"EMAIL\"\n | \"SMS\"\n | \"PUSH\"\n | \"WEBCHAT\"\n | \"WEBHOOK\"\n | \"WHATSAPP\";\n\nexport type ChannelStatus =\n | \"ACTIVE\"\n | \"INACTIVE\"\n | \"ERROR\"\n | \"ARCHIVED\"\n | \"SUSPENDED\";\n\nexport type ChannelType = \"NOTIFICATION\" | \"COMMUNICATION\";\n\nexport type ConnectionHealth = \"HEALTHY\" | \"DEGRADED\" | \"UNHEALTHY\" | \"UNKNOWN\";\n\nexport interface Channel {\n id: string;\n name: string;\n platform: ChannelPlatform;\n channelType: ChannelType;\n status: ChannelStatus;\n connectionHealth: ConnectionHealth;\n isConnected: boolean;\n description?: string;\n adapterType?: string;\n messageCount24h?: number;\n config?: {\n enableThreading?: boolean;\n enableReactions?: boolean;\n enablePresence?: boolean;\n rateLimitPerMinute?: number;\n };\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface ChannelList {\n items: Channel[];\n total: number;\n hasMore: boolean;\n}\n\n// ============================================================================\n// GraphQL Fragments & Queries\n// ============================================================================\n\nconst CHANNEL_SUMMARY_FIELDS = gql`\n fragment ChannelSummaryFields on Channel {\n id\n name\n platform\n channelType\n status\n connectionHealth\n isConnected\n description\n adapterType\n createdAt\n }\n`;\n\nconst CHANNEL_DETAIL_FIELDS = gql`\n fragment ChannelDetailFields on Channel {\n id\n name\n platform\n channelType\n status\n connectionHealth\n isConnected\n description\n adapterType\n messageCount24h\n config {\n enableThreading\n enableReactions\n enablePresence\n rateLimitPerMinute\n }\n createdAt\n updatedAt\n }\n`;\n\nconst GET_CHANNELS = gql`\n ${CHANNEL_SUMMARY_FIELDS}\n query GetChannels(\n $filter: ChannelFilterInput\n $pagination: ChannelPaginationInput\n ) {\n getChannels(filter: $filter, pagination: $pagination) {\n items {\n ...ChannelSummaryFields\n }\n total\n hasMore\n }\n }\n`;\n\nexport const GET_CHANNEL = gql`\n ${CHANNEL_DETAIL_FIELDS}\n query GetChannel($id: ID!) {\n getChannel(id: $id) {\n ...ChannelDetailFields\n }\n }\n`;\n\n// ============================================================================\n// Platform Helpers\n// ============================================================================\n\n/** Map ChannelPlatform to integration provider key for OAuth */\nexport const PLATFORM_TO_PROVIDER_KEY: Record<string, string> = {\n SLACK: \"slack\",\n TEAMS: \"microsoft-teams\",\n DISCORD: \"discord\",\n EMAIL: \"email\",\n WHATSAPP: \"whatsapp\",\n WEBCHAT: \"webchat\",\n WEBHOOK: \"webhook\",\n SMS: \"sms\",\n PUSH: \"push\",\n};\n\n/** Map ChannelPlatform to display icon (Iconify) */\nexport const PLATFORM_ICONS: Record<string, string> = {\n SLACK: \"mdi:slack\",\n TEAMS: \"mdi:microsoft-teams\",\n DISCORD: \"mdi:discord\",\n EMAIL: \"mdi:email\",\n SMS: \"mdi:message-text\",\n PUSH: \"mdi:bell-ring\",\n WEBCHAT: \"mdi:chat\",\n WEBHOOK: \"mdi:webhook\",\n WHATSAPP: \"mdi:whatsapp\",\n};\n\n/** Map ChannelStatus to display color class */\nexport const STATUS_COLORS: Record<ChannelStatus, string> = {\n ACTIVE: \"text-[var(--color-status-success-text)]\",\n INACTIVE: \"text-muted-foreground\",\n ERROR: \"text-[var(--color-status-error-text)]\",\n ARCHIVED: \"text-muted-foreground\",\n SUSPENDED: \"text-[var(--color-status-warning-text)]\",\n};\n\n/** Map ConnectionHealth to display color class */\nexport const HEALTH_COLORS: Record<ConnectionHealth, string> = {\n HEALTHY: \"text-[var(--color-status-success-text)]\",\n DEGRADED: \"text-[var(--color-status-warning-text)]\",\n UNHEALTHY: \"text-[var(--color-status-error-text)]\",\n UNKNOWN: \"text-muted-foreground\",\n};\n\n/** Map ConnectionHealth to icon */\nexport const HEALTH_ICONS: Record<ConnectionHealth, string> = {\n HEALTHY: \"mdi:check-circle\",\n DEGRADED: \"mdi:alert-circle\",\n UNHEALTHY: \"mdi:close-circle\",\n UNKNOWN: \"mdi:help-circle\",\n};\n\n// ============================================================================\n// Query Hooks\n// ============================================================================\n\ninterface ChannelFilterOptions {\n platform?: ChannelPlatform;\n status?: ChannelStatus;\n channelType?: ChannelType;\n search?: string;\n}\n\ninterface UseChannelsResult {\n channels: Channel[];\n total: number;\n hasMore: boolean;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook to fetch list of channels from global-channel-svc via global gateway.\n */\nexport function useChannels(filter?: ChannelFilterOptions): UseChannelsResult {\n const apolloClient = useGlobalStoreClient();\n const [channels, setChannels] = useState<Channel[]>([]);\n const [total, setTotal] = useState(0);\n const [hasMore, setHasMore] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const filterKey = JSON.stringify(filter);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const parsedFilter = filterKey ? JSON.parse(filterKey) : undefined;\n const PAGE_SIZE = 100;\n let offset = 0;\n let allItems: Channel[] = [];\n let totalCount = 0;\n let more = true;\n\n while (more) {\n const result = await apolloClient.query<{ getChannels: ChannelList }>({\n query: GET_CHANNELS,\n variables: {\n filter: parsedFilter,\n pagination: { limit: PAGE_SIZE, offset },\n },\n fetchPolicy: \"network-only\",\n });\n\n const page = result.data?.getChannels;\n const pageItems = page?.items ?? [];\n totalCount = page?.total ?? totalCount;\n allItems = allItems.concat(pageItems);\n\n more = (page?.hasMore ?? false) && pageItems.length === PAGE_SIZE;\n offset += PAGE_SIZE;\n }\n\n setChannels(allItems);\n setTotal(totalCount);\n setHasMore(false);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [apolloClient, filterKey]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n channels,\n total,\n hasMore,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch a single channel by ID from global-channel-svc.\n */\nexport function useChannel(channelId?: string) {\n const apolloClient = useGlobalStoreClient();\n const [channel, setChannel] = useState<Channel | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Raw query — returns result or Error, does not touch state.\n const fetchData = useCallback(\n async (policy: \"cache-first\" | \"network-only\" = \"cache-first\") => {\n if (!channelId) return undefined;\n try {\n return await apolloClient.query<{ getChannel: Channel | null }>({\n query: GET_CHANNEL,\n variables: { id: channelId },\n fetchPolicy: policy,\n });\n } catch (err) {\n return err as Error;\n }\n },\n [apolloClient, channelId],\n );\n\n // Commits a fetchData result to state.\n const applyResult = useCallback(\n (result: Awaited<ReturnType<typeof fetchData>>) => {\n if (result instanceof Error) {\n setError(result);\n } else if (result) {\n setChannel(result.data?.getChannel ?? null);\n } else {\n setChannel(null);\n }\n setLoading(false);\n },\n [],\n );\n\n // Auto-fetch on channelId change, with stale-response guard.\n useEffect(() => {\n let cancelled = false;\n\n setLoading(true);\n setError(null);\n\n fetchData().then((result) => {\n if (cancelled) return;\n applyResult(result);\n });\n\n return () => {\n cancelled = true;\n };\n }, [fetchData, applyResult]);\n\n // Explicit refetch — caller-triggered, always bypasses cache and commits state.\n const refetch = useCallback(async () => {\n setLoading(true);\n setError(null);\n const result = await fetchData(\"network-only\");\n applyResult(result);\n }, [fetchData, applyResult]);\n\n return {\n channel,\n loading,\n error,\n refetch,\n };\n}\n","/**\n * ChannelSelector — dropdown for choosing a communication channel.\n * Queries global-channel-svc via the global public gateway.\n */\n\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from \"@burdenoff/fe-libs/ui\";\nimport {\n useChannels,\n PLATFORM_ICONS,\n STATUS_COLORS,\n HEALTH_ICONS,\n HEALTH_COLORS,\n type Channel,\n type ChannelPlatform,\n} from \"../../../../../../../../../../modules/channels\";\nimport { useState } from \"react\";\n\ninterface ChannelSelectorProps {\n selectedChannelId?: string;\n onSelect: (channel: Channel) => void;\n platformFilter?: ChannelPlatform;\n}\n\nexport function ChannelSelector({\n selectedChannelId,\n onSelect,\n platformFilter,\n}: ChannelSelectorProps) {\n const [isOpen, setIsOpen] = useState(false);\n const { channels, loading, error } = useChannels(\n platformFilter\n ? { platform: platformFilter, channelType: \"COMMUNICATION\" }\n : { channelType: \"COMMUNICATION\" },\n );\n\n const selectedChannel = channels.find((c) => c.id === selectedChannelId);\n\n return (\n <div className=\"space-y-2\">\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Channel\n </div>\n <DropdownMenu open={isOpen} onOpenChange={setIsOpen}>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full justify-between\"\n >\n {selectedChannel ? (\n <span className=\"flex items-center gap-2 truncate\">\n <Icon\n icon={\n PLATFORM_ICONS[selectedChannel.platform] || \"mdi:antenna\"\n }\n className=\"w-4 h-4 shrink-0\"\n />\n <span className=\"truncate\">{selectedChannel.name}</span>\n <Icon\n icon={HEALTH_ICONS[selectedChannel.connectionHealth]}\n className={`w-3.5 h-3.5 shrink-0 ${HEALTH_COLORS[selectedChannel.connectionHealth]}`}\n />\n </span>\n ) : (\n <span className=\"flex items-center gap-2 text-muted-foreground\">\n <Icon icon=\"mdi:antenna\" className=\"w-4 h-4\" />\n Select channel\n </span>\n )}\n <Icon\n icon=\"mdi:chevron-down\"\n className=\"w-4 h-4 text-muted-foreground shrink-0\"\n />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent\n align=\"start\"\n className=\"w-[260px] max-h-[350px] overflow-y-auto\"\n >\n {loading ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n <Icon\n icon=\"mdi:loading\"\n className=\"w-5 h-5 mx-auto mb-2 animate-spin\"\n />\n <p>Loading channels...</p>\n </div>\n ) : error ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-5 h-5 mx-auto mb-2 text-[var(--color-status-error-text)]\"\n />\n <p>Failed to load channels</p>\n <p className=\"text-xs mt-1\">{error.message}</p>\n </div>\n ) : channels.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n <Icon\n icon=\"mdi:antenna-off\"\n className=\"w-6 h-6 mx-auto mb-2 opacity-50\"\n />\n <p>No channels found</p>\n <p className=\"text-xs mt-1\">\n Create one in the Channels settings\n </p>\n </div>\n ) : (\n <>\n <DropdownMenuLabel className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wide\">\n Available Channels\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {channels.map((channel) => {\n const isSelected = channel.id === selectedChannelId;\n return (\n <DropdownMenuItem\n key={channel.id}\n onClick={() => {\n onSelect(channel);\n setIsOpen(false);\n }}\n className={`flex items-center justify-between cursor-pointer ${\n isSelected ? \"bg-primary/10\" : \"\"\n }`}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <Icon\n icon={PLATFORM_ICONS[channel.platform] || \"mdi:antenna\"}\n className=\"w-4 h-4 shrink-0\"\n />\n <div className=\"flex flex-col min-w-0\">\n <span className=\"font-medium truncate text-sm\">\n {channel.name}\n </span>\n <span className=\"text-xs text-muted-foreground flex items-center gap-1\">\n <span className={STATUS_COLORS[channel.status]}>\n {channel.status.toLowerCase()}\n </span>\n <span>·</span>\n <span>{channel.platform.toLowerCase()}</span>\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Icon\n icon={HEALTH_ICONS[channel.connectionHealth]}\n className={`w-3.5 h-3.5 ${HEALTH_COLORS[channel.connectionHealth]}`}\n />\n {isSelected && (\n <Icon\n icon=\"mdi:check\"\n className=\"w-4 h-4 text-primary\"\n />\n )}\n </div>\n </DropdownMenuItem>\n );\n })}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","/**\n * ChannelDetails — displays selected channel information.\n */\n\nimport { Icon } from \"@iconify/react\";\nimport {\n useChannel,\n PLATFORM_ICONS,\n STATUS_COLORS,\n HEALTH_COLORS,\n HEALTH_ICONS,\n} from \"../../../../../../../../../../modules/channels\";\n\ninterface ChannelDetailsProps {\n channelId: string;\n}\n\nexport function ChannelDetails({ channelId }: ChannelDetailsProps) {\n const { channel, loading, error } = useChannel(channelId);\n\n if (loading) {\n return (\n <div className=\"p-3 rounded-md border border-card-foreground/10 bg-card/30\">\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n Loading channel details...\n </div>\n </div>\n );\n }\n\n if (error || !channel) {\n return (\n <div className=\"p-3 rounded-md border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bg-subtle)]\">\n <div className=\"flex items-center gap-2 text-xs text-[var(--color-status-error-text)]\">\n <Icon icon=\"mdi:alert-circle\" className=\"w-4 h-4\" />\n {error ? error.message : \"Channel not found\"}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"p-3 rounded-md border border-card-foreground/10 bg-card/30 space-y-2.5\">\n {/* Channel Header */}\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center justify-center w-8 h-8 rounded-md bg-primary/10\">\n <Icon\n icon={PLATFORM_ICONS[channel.platform] || \"mdi:antenna\"}\n className=\"w-5 h-5 text-primary\"\n />\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium truncate\">{channel.name}</span>\n <span className=\"text-xs text-muted-foreground\">\n {channel.platform.toLowerCase()} ·{\" \"}\n {channel.channelType.toLowerCase()}\n </span>\n </div>\n </div>\n\n {/* Status & Health */}\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[10px] text-muted-foreground uppercase tracking-wide\">\n Status\n </span>\n <span\n className={`text-xs font-medium ${STATUS_COLORS[channel.status]}`}\n >\n {channel.status.toLowerCase()}\n </span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[10px] text-muted-foreground uppercase tracking-wide\">\n Health\n </span>\n <span className=\"flex items-center gap-1\">\n <Icon\n icon={HEALTH_ICONS[channel.connectionHealth]}\n className={`w-3.5 h-3.5 ${HEALTH_COLORS[channel.connectionHealth]}`}\n />\n <span\n className={`text-xs font-medium ${HEALTH_COLORS[channel.connectionHealth]}`}\n >\n {channel.connectionHealth.toLowerCase()}\n </span>\n </span>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"flex items-center gap-3 pt-1 border-t border-card-foreground/5\">\n {channel.isConnected ? (\n <span className=\"flex items-center gap-1 text-xs text-[var(--color-status-success-text)]\">\n <Icon icon=\"mdi:link\" className=\"w-3.5 h-3.5\" />\n Connected\n </span>\n ) : (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Icon icon=\"mdi:link-off\" className=\"w-3.5 h-3.5\" />\n Not connected\n </span>\n )}\n {channel.messageCount24h !== undefined && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Icon icon=\"mdi:message-text\" className=\"w-3.5 h-3.5\" />\n {channel.messageCount24h} msgs/24h\n </span>\n )}\n </div>\n\n {/* Description */}\n {channel.description && (\n <p className=\"text-xs text-muted-foreground pt-1 border-t border-card-foreground/5\">\n {channel.description}\n </p>\n )}\n </div>\n );\n}\n","/**\n * ChannelAuth — authentication section for channel node configuration.\n *\n * Provides:\n * 1. \"Authenticate with {platform}\" button → redirects to microfe-integrations\n * 2. Integration ID input field (manual paste or auto-filled from redirect)\n */\n\nimport { Icon } from \"@iconify/react\";\nimport { Button, Input } from \"@burdenoff/fe-libs/ui\";\nimport {\n PLATFORM_ICONS,\n PLATFORM_TO_PROVIDER_KEY,\n type ChannelPlatform,\n} from \"../../../../../../../../../../modules/channels\";\nimport { useState, useEffect } from \"react\";\n\ninterface ChannelAuthProps {\n platform: ChannelPlatform;\n integrationId?: string;\n onIntegrationIdChange: (id: string) => void;\n /** Current workflow builder path for returnTo redirect */\n currentPath?: string;\n /** Node ID for tracking the redirect context */\n nodeId: string;\n}\n\nexport function ChannelAuth({\n platform,\n integrationId,\n onIntegrationIdChange,\n currentPath,\n nodeId,\n}: ChannelAuthProps) {\n const [localValue, setLocalValue] = useState(integrationId || \"\");\n\n useEffect(() => {\n setLocalValue(integrationId || \"\");\n }, [integrationId]);\n\n const providerKey =\n PLATFORM_TO_PROVIDER_KEY[platform] || platform.toLowerCase();\n const platformIcon = PLATFORM_ICONS[platform] || \"mdi:key\";\n const platformLabel = platform.charAt(0) + platform.slice(1).toLowerCase();\n\n const handleAuthClick = () => {\n // Build the redirect URL to the integrations page\n const returnTo = currentPath || window.location.pathname;\n const params = new URLSearchParams({\n providerKey,\n returnTo,\n channelNodeId: nodeId,\n });\n const integrationsUrl = `/integrations/connections/add?${params.toString()}`;\n\n // Open integrations page in a new tab so unsaved builder state is preserved\n window.open(integrationsUrl, \"_blank\", \"noopener,noreferrer\");\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setLocalValue(value);\n onIntegrationIdChange(value);\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n // Let the paste happen naturally, then update\n setTimeout(() => {\n const value = (e.target as HTMLInputElement).value;\n setLocalValue(value);\n onIntegrationIdChange(value);\n }, 0);\n };\n\n return (\n <div className=\"space-y-3\">\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Authentication\n </div>\n\n {/* Auth Button */}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full justify-start gap-2\"\n onClick={handleAuthClick}\n >\n <Icon icon={platformIcon} className=\"w-4 h-4\" />\n <span>Authenticate with {platformLabel}</span>\n <Icon\n icon=\"mdi:open-in-new\"\n className=\"w-3.5 h-3.5 ml-auto text-muted-foreground\"\n />\n </Button>\n\n {/* Integration ID Input */}\n <div className=\"space-y-1.5\">\n <label className=\"text-[11px] text-muted-foreground\">\n Integration Connection ID\n </label>\n <div className=\"relative\">\n <Input\n type=\"text\"\n placeholder=\"Paste integration ID here...\"\n value={localValue}\n onChange={handleInputChange}\n onPaste={handlePaste}\n className=\"text-xs pr-8\"\n />\n {localValue && (\n <div className=\"absolute right-2 top-1/2 -translate-y-1/2\">\n <Icon\n icon=\"mdi:check-circle\"\n className=\"w-4 h-4 text-[var(--color-status-success-text)]\"\n />\n </div>\n )}\n </div>\n <p className=\"text-[10px] text-muted-foreground\">\n Complete the OAuth flow above, then paste the connection ID here.\n </p>\n </div>\n </div>\n );\n}\n","/**\n * ChannelNodePropertyPanel — custom property panel for the Channel workflow node.\n *\n * Replaces the generic property panel when a channel_node is selected.\n * Shows channel selection, details, auth configuration, and connection selector.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useFlowStore } from \"../../../../../../../../../stores/flow-store\";\nimport { useShallow } from \"zustand/shallow\";\nimport { ConnectionSelector } from \"../../../../../../../../../../modules/connections/components\";\nimport { NODE_CONFIGS } from \"../../../../../index\";\nimport { ChannelSelector } from \"./ChannelSelector\";\nimport { ChannelDetails } from \"./ChannelDetails\";\nimport { ChannelAuth } from \"./ChannelAuth\";\nimport { GET_CHANNEL } from \"../../../../../../../../../../modules/channels\";\nimport { useGlobalStoreClient } from \"../../../../../../../../../../hooks/store/useGlobalStoreClient\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { Icon } from \"@iconify/react\";\nimport { gql } from \"@apollo/client\";\nimport type {\n Channel,\n ChannelPlatform,\n} from \"../../../../../../../../../../modules/channels\";\nimport type { BuilderNodeType } from \"../../../../../types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface AdaptiveCardOperation {\n name: string;\n adaptive_card: Record<string, unknown>;\n connectionAdapters?: Array<{ name: string; provider: string }>;\n credentialAdapters?: Array<{ name: string; provider: string }>;\n}\n\ninterface NodeDataOperations {\n operations?: AdaptiveCardOperation[];\n connectionAdapters?: Array<{ name: string; provider: string }>;\n credentialAdapters?: Array<{ name: string; provider: string }>;\n}\n\ninterface ConnectionArg {\n connectionId: string;\n adapter: string;\n}\n\ninterface CredentialArg {\n id: string;\n adapter: string;\n}\n\ninterface NodeData {\n nodeData?: NodeDataOperations;\n operation_name?: string;\n args?: {\n state?: Record<string, unknown>;\n connections?: ConnectionArg[];\n credentials?: CredentialArg[];\n };\n version?: string;\n}\n\ninterface ChannelNodePropertyPanelProps {\n id: string;\n type: BuilderNodeType;\n data: NodeData;\n updateData: (data: Partial<NodeData>) => void;\n}\n\n// ============================================================================\n// GraphQL\n// ============================================================================\n\nconst LINK_INTEGRATION_MUTATION = gql`\n mutation LinkIntegrationConnection(\n $integrationConnectionId: ID!\n $channelId: ID!\n ) {\n linkIntegrationConnection(\n integrationConnectionId: $integrationConnectionId\n channelId: $channelId\n ) {\n id\n }\n }\n`;\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function ChannelNodePropertyPanel({\n id,\n type,\n data,\n updateData,\n}: ChannelNodePropertyPanelProps) {\n // Detect position: if no incoming edges → trigger, else → action (auto heuristic)\n const [edges] = useFlowStore(useShallow((s) => [s.workflow.edges]));\n const autoIsTrigger = !edges.some((e) => e.target === id);\n\n // Explicit role override stored in args.state.role (\"trigger\" | \"action\" | undefined = auto)\n const explicitRole = data?.args?.state?.role as\n | \"trigger\"\n | \"action\"\n | undefined;\n const isTrigger =\n explicitRole !== undefined ? explicitRole === \"trigger\" : autoIsTrigger;\n\n // Connect button state\n const [connectLoading, setConnectLoading] = useState(false);\n const [connectStatus, setConnectStatus] = useState<\n \"idle\" | \"success\" | \"error\"\n >(\"idle\");\n const [connectError, setConnectError] = useState<string | null>(null);\n const globalClient = useGlobalStoreClient();\n\n // Auto-set operation_name based on graph position (only when no explicit role override)\n useEffect(() => {\n if (explicitRole !== undefined) return; // user has explicitly chosen; don't override\n const opName = autoIsTrigger\n ? \"onChannelMessageReceived\"\n : \"sendChannelMessage\";\n if (data?.operation_name !== opName) {\n updateData({ operation_name: opName } as Partial<NodeData>);\n }\n }, [autoIsTrigger, id, explicitRole]);\n\n // Current state values\n const channelId = data?.args?.state?.channelId as string | undefined;\n const integrationId = data?.args?.state?.integrationId as string | undefined;\n const selectedPlatform = data?.args?.state?.platform as\n | ChannelPlatform\n | undefined;\n\n // Get operations list from nodeData or NODE_CONFIGS registry\n const operationsArray = useMemo(() => {\n const nodeDataOps = data?.nodeData?.operations as\n | { operations?: AdaptiveCardOperation[] }\n | AdaptiveCardOperation[]\n | undefined;\n\n if (nodeDataOps) {\n const ops = Array.isArray(nodeDataOps)\n ? nodeDataOps\n : nodeDataOps.operations;\n if (ops && ops.length > 0) return ops;\n }\n\n const nodeConfig = NODE_CONFIGS.find((c) => c.type === type);\n if (nodeConfig?.operations) {\n return nodeConfig.operations as AdaptiveCardOperation[];\n }\n\n return [];\n }, [data?.nodeData?.operations, type]);\n\n // Currently selected operation\n const currentOperation = operationsArray.find(\n (op) => op.name === data?.operation_name,\n );\n\n // Connection adapters\n const connectionAdapters =\n currentOperation?.connectionAdapters ||\n currentOperation?.credentialAdapters ||\n data?.nodeData?.connectionAdapters ||\n data?.nodeData?.credentialAdapters ||\n [];\n\n // Selected connections\n const selectedConnections = useMemo(() => {\n if (data?.args?.connections && data.args.connections.length > 0) {\n return data.args.connections.map((conn) => ({\n connectionId: conn.connectionId,\n adapter: conn.adapter,\n }));\n }\n if (data?.args?.credentials && data.args.credentials.length > 0) {\n return data.args.credentials.map((cred) => ({\n connectionId: cred.id,\n adapter: cred.adapter,\n }));\n }\n return [];\n }, [data?.args?.connections, data?.args?.credentials]);\n\n // ============================================================================\n // Handlers\n // ============================================================================\n\n /** Handle explicit role selection (overrides edge-based auto-detection) */\n const handleRoleChange = useCallback(\n (role: \"trigger\" | \"action\") => {\n const opName =\n role === \"trigger\" ? \"onChannelMessageReceived\" : \"sendChannelMessage\";\n const currentState = (data?.args?.state ?? {}) as Record<string, unknown>;\n updateData({\n operation_name: opName,\n args: {\n ...(data?.args ?? {}),\n state: { ...currentState, role },\n },\n } as Partial<NodeData>);\n },\n [data, updateData],\n );\n\n /** Update a field in args.state without touching other data */\n const updateState = useCallback(\n (updates: Record<string, unknown>) => {\n const currentState = (data?.args?.state ?? {}) as Record<string, unknown>;\n updateData({\n args: {\n ...(data?.args ?? {}),\n state: { ...currentState, ...updates },\n },\n } as Partial<NodeData>);\n },\n [data, updateData],\n );\n\n /** Handle channel selection */\n const handleChannelSelect = useCallback(\n (channel: Channel) => {\n updateState({\n channelId: channel.id,\n platform: channel.platform,\n channelName: channel.name,\n });\n },\n [updateState],\n );\n\n /** Handle integration ID change */\n const handleIntegrationIdChange = useCallback(\n (newIntegrationId: string) => {\n updateState({ integrationId: newIntegrationId });\n },\n [updateState],\n );\n\n /** Handle connection changes */\n const handleConnectionsChange = useCallback(\n (connections: { connectionId: string; adapter: string }[]) => {\n const currentArgs = data?.args ?? {};\n const { credentials: _legacy, ...restArgs } = currentArgs;\n void _legacy;\n\n updateData({\n args: {\n ...restArgs,\n connections: connections.map((conn) => ({\n connectionId: conn.connectionId,\n adapter: conn.adapter,\n })),\n },\n } as Partial<NodeData>);\n },\n [data, updateData],\n );\n\n /** Call linkIntegrationConnection on global-channel-svc → triggers welcome DM */\n const handleConnect = useCallback(async () => {\n if (!channelId || !integrationId) return;\n setConnectLoading(true);\n setConnectStatus(\"idle\");\n setConnectError(null);\n try {\n await globalClient.mutate({\n mutation: LINK_INTEGRATION_MUTATION,\n variables: { integrationConnectionId: integrationId, channelId },\n refetchQueries: [{ query: GET_CHANNEL, variables: { id: channelId } }],\n awaitRefetchQueries: true,\n });\n setConnectStatus(\"success\");\n updateState({ integrationId });\n } catch (err) {\n setConnectStatus(\"error\");\n setConnectError(err instanceof Error ? err.message : \"Connection failed\");\n } finally {\n setConnectLoading(false);\n }\n }, [channelId, integrationId, globalClient, updateState]);\n\n // ============================================================================\n // Render\n // ============================================================================\n\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n {/* Node ID */}\n <div className=\"text-xs text-card-foreground/20 self-end\">{id}</div>\n\n {/* Operation selector */}\n <div className=\"space-y-1.5\">\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Operation\n </div>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => handleRoleChange(\"trigger\")}\n className={[\n \"flex-1 flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs transition-colors\",\n isTrigger\n ? \"border-primary/60 bg-primary/10 text-primary font-semibold\"\n : \"border-card-foreground/10 text-card-foreground/40 hover:border-card-foreground/30 hover:text-card-foreground/70\",\n ].join(\" \")}\n >\n <Icon icon=\"mdi:lightning-bolt\" className=\"w-3.5 h-3.5 shrink-0\" />\n Receive Messages\n </button>\n <button\n type=\"button\"\n onClick={() => handleRoleChange(\"action\")}\n className={[\n \"flex-1 flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs transition-colors\",\n !isTrigger\n ? \"border-primary/60 bg-primary/10 text-primary font-semibold\"\n : \"border-card-foreground/10 text-card-foreground/40 hover:border-card-foreground/30 hover:text-card-foreground/70\",\n ].join(\" \")}\n >\n <Icon icon=\"mdi:send\" className=\"w-3.5 h-3.5 shrink-0\" />\n Send Message\n </button>\n </div>\n {explicitRole === undefined && (\n <p className=\"text-[10px] text-card-foreground/30\">\n Auto-detected from graph position. Click to override.\n </p>\n )}\n </div>\n\n {/* Divider */}\n <div className=\"h-px bg-card-foreground/10\" />\n\n {/* Channel Selection */}\n <ChannelSelector\n selectedChannelId={channelId}\n onSelect={handleChannelSelect}\n />\n\n {/* Channel Details (shown when a channel is selected) */}\n {channelId && <ChannelDetails channelId={channelId} />}\n\n {/* Divider */}\n {channelId && <div className=\"h-px bg-card-foreground/10\" />}\n\n {/* Authentication Section (shown when a channel is selected) */}\n {channelId && selectedPlatform && (\n <ChannelAuth\n platform={selectedPlatform}\n integrationId={integrationId}\n onIntegrationIdChange={handleIntegrationIdChange}\n nodeId={id}\n />\n )}\n\n {/* Connect button — shown whenever a channel is selected */}\n {channelId && (\n <>\n <div className=\"h-px bg-card-foreground/10\" />\n <div className=\"space-y-2\">\n <Button\n variant=\"default\"\n size=\"sm\"\n className=\"w-full gap-2\"\n onClick={handleConnect}\n disabled={connectLoading || !integrationId}\n title={\n !integrationId\n ? \"Paste an Integration Connection ID first\"\n : undefined\n }\n >\n {connectLoading ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : connectStatus === \"success\" ? (\n <Icon icon=\"mdi:check-circle\" className=\"w-4 h-4\" />\n ) : (\n <Icon icon=\"mdi:link-variant\" className=\"w-4 h-4\" />\n )}\n <span>\n {connectLoading\n ? \"Connecting…\"\n : connectStatus === \"success\"\n ? \"Connected!\"\n : \"Connect\"}\n </span>\n </Button>\n {connectStatus === \"error\" && connectError && (\n <p className=\"text-[10px] text-destructive\">{connectError}</p>\n )}\n {connectStatus === \"success\" && (\n <p className=\"text-[10px] text-[var(--color-status-success-text)]\">\n Channel linked — welcome message sent.\n </p>\n )}\n </div>\n </>\n )}\n\n {/* Message text input — only shown when node is in action (send) mode */}\n {!isTrigger && (\n <>\n <div className=\"h-px bg-card-foreground/10\" />\n <div className=\"space-y-2\">\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Message Text\n </div>\n <textarea\n className=\"w-full text-xs px-3 py-2 rounded-md border border-card-foreground/10 bg-transparent text-card-foreground/70 placeholder:text-card-foreground/30 resize-none focus:outline-none focus:border-primary/50\"\n rows={3}\n placeholder=\"e.g. ${prev.response}\"\n value={\n (data?.args?.state?.messageText as string | undefined) ?? \"\"\n }\n onChange={(e) => updateState({ messageText: e.target.value })}\n />\n </div>\n </>\n )}\n\n {/* Connections Section */}\n {connectionAdapters.length > 0 && (\n <>\n <div className=\"h-px bg-card-foreground/10\" />\n <div className=\"space-y-2\">\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Connections\n </div>\n <ConnectionSelector\n adapters={connectionAdapters}\n selectedConnections={selectedConnections}\n onChange={handleConnectionsChange}\n compact\n />\n </div>\n </>\n )}\n </div>\n );\n}\n","/**\n * ConversationNodePropertyPanel — custom property panel for the Conversation workflow node.\n *\n * Auto-sets operation_name to 'storeAndForward'. No operation selector is shown\n * because the operation is determined automatically.\n */\n\nimport { useEffect } from \"react\";\nimport type { BuilderNodeType } from \"../../../../../types\";\n\ninterface NodeData {\n operation_name?: string;\n args?: {\n state?: Record<string, unknown>;\n };\n version?: string;\n}\n\ninterface ConversationNodePropertyPanelProps {\n id: string;\n type: BuilderNodeType;\n data: NodeData;\n updateData: (data: Partial<NodeData>) => void;\n}\n\nexport function ConversationNodePropertyPanel({\n id,\n data,\n updateData,\n}: ConversationNodePropertyPanelProps) {\n // Auto-set operation on mount\n useEffect(() => {\n if (data?.operation_name !== \"storeAndForward\") {\n updateData({ operation_name: \"storeAndForward\" } as Partial<NodeData>);\n }\n }, [id]);\n\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n {/* Node ID */}\n <div className=\"text-xs text-card-foreground/20 self-end\">{id}</div>\n\n {/* Role label */}\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Store &amp; Forward\n </div>\n\n <div className=\"h-px bg-card-foreground/10\" />\n\n <p className=\"text-xs text-card-foreground/50 leading-relaxed\">\n Stores incoming messages and passes the stored record to the next node.\n All input comes automatically from the previous node — no configuration\n required.\n </p>\n </div>\n );\n}\n","import { useReactFlow } from \"@xyflow/react\";\nimport { produce } from \"immer\";\nimport { useCallback, useState, useEffect, type ComponentProps } from \"react\";\nimport { ExtendedNodeType, BaseNodeData } from \"../../../../types\";\nimport {\n NODES,\n ensureNodeConfigsLoaded,\n isNodeConfigsInitialized,\n} from \"../../../..\";\nimport UnavailableNodePropertyPanel from \"../property-panels/unavailable-property-panel\";\nimport GenericNodePropertyPanel from \"../property-panels/property-panel\";\nimport { ChannelNodePropertyPanel } from \"../property-panels/channel\";\nimport { ConversationNodePropertyPanel } from \"../property-panels/conversation\";\nimport type { BuilderNodeType } from \"../../../../types\";\nimport { useFlowStore } from \"../../../../../../../../stores/flow-store\";\n\n/**\n * Map of dynamic node type patterns → custom property panel components.\n * When a node type matches one of these keys, the custom panel is used\n * instead of the generic one.\n */\ntype CustomPanelComponent = React.ComponentType<{\n id: string;\n type: BuilderNodeType;\n data: unknown;\n updateData: (data: Partial<BaseNodeData>) => void;\n}>;\n\n/**\n * Map of dynamic node type patterns → custom property panel components.\n * Keys can be exact types or partial matches.\n * Node types from manifests use format like \"integration/channel\", \"store/conversation\".\n */\nconst CUSTOM_DYNAMIC_PANELS: Record<string, CustomPanelComponent> = {\n \"integration/channel\": ChannelNodePropertyPanel as CustomPanelComponent,\n channel_node: ChannelNodePropertyPanel as CustomPanelComponent,\n \"store/conversation\": ConversationNodePropertyPanel as CustomPanelComponent,\n};\n\n/** Check if a node type matches any custom panel pattern */\nfunction getCustomPanel(type: string) {\n if (CUSTOM_DYNAMIC_PANELS[type]) return CUSTOM_DYNAMIC_PANELS[type];\n for (const [pattern, panel] of Object.entries(CUSTOM_DYNAMIC_PANELS)) {\n if (type.includes(pattern)) return panel;\n }\n return null;\n}\n\ntype NodePropertyPanelProps = Readonly<{\n id: string;\n type: ExtendedNodeType;\n data?: BaseNodeData;\n}>;\n\n// Type for the generic property panel's data structure\ninterface GenericNodeData {\n nodeData?: Record<string, unknown>;\n operation_name?: string;\n args?: {\n state?: Record<string, unknown>;\n connections?: Array<{ connectionId: string; adapter: string }>;\n credentials?: Array<{ id: string; adapter: string }>;\n };\n version?: string;\n}\n\nexport function NodePropertyPanel({ id, type, data }: NodePropertyPanelProps) {\n // Track when nodes are loaded to trigger re-render\n const [nodesLoaded, setNodesLoaded] = useState(isNodeConfigsInitialized());\n\n useEffect(() => {\n if (!nodesLoaded) {\n ensureNodeConfigsLoaded().then(() => {\n setNodesLoaded(true);\n });\n }\n }, [nodesLoaded]);\n\n // Look up property panel dynamically from NODES array\n // This runs on every render to pick up dynamically loaded nodes\n const nodeConfig = NODES.find((n) => n.type === type);\n const PanelComponent = nodeConfig?.propertyPanel;\n\n const { setNodes } = useReactFlow();\n const zustandSetNodes = useFlowStore((s) => s.actions.nodes.setNodes);\n\n const nodeData = produce(data, () => {});\n\n const updateData = useCallback(\n (newData: Partial<BaseNodeData>) => {\n // Update React Flow internal state (for UI rendering)\n setNodes((nds) => {\n const updatedNodes = produce(nds, (draft) => {\n const node = draft.find((n) => n.id === id);\n if (node) node.data = { ...node.data, ...newData };\n });\n // Sync the updated nodes back to the Zustand store so saveWorkflow() picks up changes\n zustandSetNodes(updatedNodes);\n return updatedNodes;\n });\n },\n [id, setNodes, zustandSetNodes],\n );\n\n // Custom panels take priority over generic node-config panels.\n // This must run before the PanelComponent check so that channel/conversation\n // nodes always get their specialised panel even after node configs are loaded\n // (which would otherwise set PanelComponent to the generic NodePropertyPanel).\n const CustomPanel = getCustomPanel(type);\n if (CustomPanel && nodeData) {\n return (\n <CustomPanel\n id={id}\n type={type as BuilderNodeType}\n data={nodeData}\n updateData={updateData}\n />\n );\n }\n\n if (!PanelComponent) {\n // For dynamic nodes, use the generic property panel directly if data exists\n // This handles nodes that were fetched dynamically but aren't in NODES yet\n if (nodeData && (data as GenericNodeData)?.nodeData) {\n // GenericNodePropertyPanel uses its own local NodeData type for `data` and `updateData`.\n // Our BaseNodeData and GenericNodeData are structurally compatible but not identical,\n // so we cast through ComponentProps to bridge the type boundary.\n type PanelProps = ComponentProps<typeof GenericNodePropertyPanel>;\n return (\n <GenericNodePropertyPanel\n id={id}\n type={type as BuilderNodeType}\n data={nodeData as PanelProps[\"data\"]}\n updateData={updateData as unknown as PanelProps[\"updateData\"]}\n />\n );\n }\n return <UnavailableNodePropertyPanel />;\n }\n\n return nodeData ? (\n <PanelComponent\n id={id}\n type={type}\n data={nodeData}\n updateData={updateData}\n />\n ) : (\n <UnavailableNodePropertyPanel />\n );\n}\n","import { Icon } from \"@iconify/react\";\n\nexport default function IntroductionPropertyPanel() {\n return (\n <div className=\"h-full flex flex-col items-center justify-center p-4 text-center\">\n <div className=\"size-12 flex items-center justify-center rounded-full bg-primary\">\n <Icon icon=\"mynaui:cog-one\" className=\"size-6 text-white\" />\n </div>\n\n <div className=\"mt-4 text-balance font-medium\">Node Properties</div>\n\n <div className=\"mt-1 w-2.5/3 text-xs text-card/40 font-medium leading-normal\">\n Here you can view and edit the properties of the selected node.\n </div>\n\n <div className=\"mt-8 w-full text-xs text-card/40 font-medium italic\">\n Select a node from the list on the top to view its properties.\n </div>\n </div>\n );\n}\n","import { useFlowStore } from \"../../../../../../../stores/flow-store\";\nimport { useNodes, useReactFlow } from \"@xyflow/react\";\nimport { produce } from \"immer\";\nimport { useMemo } from \"react\";\nimport { useNodeList } from \"./hooks/use-node-list\";\nimport SidebarPanelWrapper from \"../../components/sidebar-panel-wrapper\";\nimport { ExtendedNodeType, BaseNodeData } from \"../../../types\";\nimport SidebarPanelHeading from \"../../components/sidebar-panel-heading\";\nimport { NodeListItem } from \"./components/node-list-item\";\nimport { NodePropertyPanel } from \"./components/node-propery-panel\";\nimport IntroductionPropertyPanel from \"./property-panels/introduction-property-panel\";\nimport { HeaderWithIcon } from \"../../../../ui/header-with-icon\";\n\nexport function NodePropertiesPanel() {\n const selectedNode = useFlowStore(\n (s) => s.workflow.sidebar.panels.nodeProperties.selectedNode,\n );\n\n const setSelectedNode = useFlowStore(\n (s) => s.actions.sidebar.panels.nodeProperties.setSelectedNode,\n );\n\n const nodes = useNodes();\n\n const nodeList = useNodeList(nodes);\n\n const { setNodes } = useReactFlow();\n\n const onNodeClick = (id: string) => {\n setNodes((nds) =>\n produce(nds, (draft) => {\n draft.forEach((node) => {\n node.selected = node.id === id;\n });\n }),\n );\n\n setSelectedNode({\n id,\n type: nodeList.find((n) => n.id === id)?.type as ExtendedNodeType,\n });\n };\n\n const selectedNodeData = useMemo(() => {\n const data = nodes.find((n) => n.id === selectedNode?.id)?.data;\n return data as BaseNodeData | undefined;\n }, [nodes, selectedNode?.id]);\n\n return (\n <SidebarPanelWrapper>\n <div className=\"h-80 w-80 flex flex-col\">\n <SidebarPanelHeading className=\"shrink-0\">\n <HeaderWithIcon icon=\"mynaui:layers-three\" title=\"Nodes in Flow\" />\n </SidebarPanelHeading>\n\n <div className=\"flex w-full flex-col gap-1 p-1.5 overflow-y-auto\">\n {nodeList.map((node) => (\n <NodeListItem\n key={node.id}\n id={node.id}\n title={node.detail.title}\n icon={node.detail.icon}\n selected={selectedNode?.id === node.id}\n pseudoSelected={!!node.selected}\n onClick={() => {\n onNodeClick(node.id);\n }}\n />\n ))}\n </div>\n </div>\n\n <div className=\"w-80 max-h-[360px] 2xl:max-h-[594px] flex flex-col\">\n <SidebarPanelHeading className=\"shrink-0\">\n <HeaderWithIcon icon=\"mynaui:cog\" title=\"Node Properties\" />\n </SidebarPanelHeading>\n\n <div className=\"flex w-full flex-col overflow-y-auto\">\n {selectedNode ? (\n <NodePropertyPanel\n id={selectedNode.id}\n type={selectedNode.type}\n data={selectedNodeData}\n />\n ) : (\n <IntroductionPropertyPanel />\n )}\n </div>\n </div>\n </SidebarPanelWrapper>\n );\n}\n","import type { ComponentType } from \"react\";\nimport AvailableNodesPanel from \"../panels/available-nodes/available-nodes-panel\";\nimport { NodePropertiesPanel } from \"../panels/node-properties/node-properties-panel\";\n\nexport const PANEL_COMPONENTS: Record<\n \"node-properties\" | \"available-nodes\" | \"none\",\n ComponentType\n> = {\n \"available-nodes\": AvailableNodesPanel,\n \"node-properties\": NodePropertiesPanel,\n none: () => null,\n};\n","import { PANEL_COMPONENTS } from \"../constants/panels\";\n\ntype SwitchSidebarPanelProps = Readonly<{\n active: \"node-properties\" | \"available-nodes\" | \"none\";\n}>;\n\nexport function SwitchSidebarPanel({ active }: SwitchSidebarPanelProps) {\n const PanelComponent = PANEL_COMPONENTS[active];\n return PanelComponent ? <PanelComponent /> : null;\n}\n","import { Button } from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport type { ComponentPropsWithoutRef } from \"react\";\n\ntype SidebarButtonItemProps = Readonly<\n ComponentPropsWithoutRef<\"button\"> & {\n active?: boolean;\n }\n>;\n\nexport default function SidebarButtonItem({\n children,\n className,\n active,\n ...props\n}: SidebarButtonItemProps) {\n return (\n <Button\n size={\"icon\"}\n type=\"button\"\n variant={active ? \"default\" : \"ghost\"}\n className={cn(\n \"size-8 flex items-center justify-center\",\n\n className,\n )}\n {...props}\n >\n {children}\n </Button>\n );\n}\n","import { useQuery } from \"@apollo/client/react\";\nimport { useContext } from \"react\";\nimport {\n BrowseWorkflowNodesDocument,\n type BrowseWorkflowNodesQuery,\n type BrowseWorkflowNodesQueryVariables,\n} from \"../../generated/global-operations\";\nimport type {\n BrowseStoreInput,\n InputMaybe,\n ProductType,\n PricingModel,\n StoreSortBy,\n} from \"../../generated/global-types\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../config\";\n\nexport interface UseStoreNodesOptions {\n filter?: {\n search?: string;\n type?: string;\n category?: string;\n pricingModel?: string;\n compatibleWith?: string;\n };\n sortBy?: string;\n limit?: number;\n}\n\n/**\n * Hook to browse and search workflow nodes from the global store\n */\nexport function useStoreNodes(options: UseStoreNodesOptions = {}) {\n const client = useGlobalStoreClient();\n\n // Get workspace and organization context\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n const organizationId = context?.organizationId;\n\n const input: BrowseStoreInput = {\n filter: {\n search: options.filter?.search,\n type: (options.filter?.type || \"NODE\") as InputMaybe<ProductType>,\n category: options.filter?.category,\n pricingModel: options.filter?.pricingModel as\n | InputMaybe<PricingModel>\n | undefined,\n // Filter to only nodes compatible with FluidGrids\n compatibleWith: options.filter?.compatibleWith || \"fluidgrids\",\n },\n sortBy: (options.sortBy || \"DOWNLOADS\") as InputMaybe<StoreSortBy>,\n pagination: {\n limit: options.limit || 20,\n offset: 0,\n },\n };\n\n // Build context headers for organization and workspace context\n const contextHeaders: Record<string, string> = {};\n if (organizationId) {\n contextHeaders[\"x-organization-id\"] = organizationId;\n }\n if (workspaceId) {\n contextHeaders[\"x-workspace-id\"] = workspaceId;\n }\n\n const { data, loading, error, fetchMore, refetch } = useQuery<\n BrowseWorkflowNodesQuery,\n BrowseWorkflowNodesQueryVariables\n >(BrowseWorkflowNodesDocument, {\n client,\n variables: { input },\n fetchPolicy: \"cache-and-network\",\n // Pass organization and workspace context to Store service\n context:\n Object.keys(contextHeaders).length > 0\n ? {\n headers: contextHeaders,\n }\n : undefined,\n });\n\n // Debug log\n console.log(\"[useStoreNodes] Hook state:\", {\n input,\n data,\n loading,\n error,\n hasData: !!data,\n hasBrowseStore: !!data?.browseStore,\n hasProducts: !!data?.browseStore?.products,\n productsLength: data?.browseStore?.products?.length,\n });\n\n const handleFetchMore = () => {\n if (!data?.browseStore?.hasMore) return;\n\n fetchMore({\n variables: {\n input: {\n ...input,\n pagination: {\n ...input.pagination,\n cursor: data.browseStore.nextCursor,\n },\n },\n },\n // Pass context headers for pagination too\n context:\n Object.keys(contextHeaders).length > 0\n ? {\n headers: contextHeaders,\n }\n : undefined,\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) return prev;\n\n return {\n ...fetchMoreResult,\n browseStore: {\n ...fetchMoreResult.browseStore,\n products: [\n ...(prev.browseStore?.products || []),\n ...(fetchMoreResult.browseStore?.products || []),\n ],\n },\n };\n },\n });\n };\n\n return {\n products: data?.browseStore?.products || [],\n totalCount: data?.browseStore?.totalCount || 0,\n hasMore: data?.browseStore?.hasMore || false,\n loading,\n error,\n fetchMore: handleFetchMore,\n refetch,\n };\n}\n","import { useState, useCallback } from \"react\";\nimport type { StoreProduct } from \"../../generated/global-types\";\n\n/**\n * Hook to update an installed workflow node from the store\n *\n * This will be implemented once the Store service provides the update mutation.\n * For now, this is a placeholder that shows the intended API.\n */\nexport function useUpdateNode() {\n const [updating, setUpdating] = useState<string | null>(null);\n\n const updateNode = useCallback(\n async (node: StoreProduct, installationId: string) => {\n try {\n setUpdating(node.id);\n\n // TODO: Implement actual update mutation\n // This will need:\n // 1. Update the installation record in Store service\n // 2. Re-register the node in Workflow service with new version\n // 3. Refresh the available nodes in the sidebar\n\n console.log(\"[useUpdateNode] Update requested:\", {\n nodeId: node.id,\n nodeName: node.name,\n installationId,\n newVersion: node.manifestVersion,\n });\n\n // Simulate API call for now\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n return {\n success: true,\n message: `Updated ${node.name} successfully`,\n };\n } catch (error) {\n console.error(\"[useUpdateNode] Update failed:\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Update failed\",\n };\n } finally {\n setUpdating(null);\n }\n },\n [],\n );\n\n return {\n updateNode,\n updating,\n };\n}\n","import { useState, useCallback } from \"react\";\nimport { useMutation } from \"@apollo/client/react\";\nimport {\n UninstallWorkflowNodeDocument,\n type UninstallWorkflowNodeMutation,\n type UninstallWorkflowNodeMutationVariables,\n} from \"../../generated/global-operations\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\n\ninterface UninstallNodeInput {\n productId: string;\n workspaceId: string;\n}\n\nexport const useUninstallNode = () => {\n const globalClient = useGlobalStoreClient();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const [uninstallMutation] = useMutation<\n UninstallWorkflowNodeMutation,\n UninstallWorkflowNodeMutationVariables\n >(UninstallWorkflowNodeDocument, {\n client: globalClient,\n });\n\n const uninstallNode = useCallback(\n async (input: UninstallNodeInput): Promise<boolean> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await uninstallMutation({\n variables: {\n productId: input.productId,\n workspaceId: input.workspaceId,\n },\n });\n\n setLoading(false);\n return !!result.data?.recordAppUninstallation;\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Failed to uninstall node\");\n console.error(\"[useUninstallNode] Failed to uninstall node:\", error);\n setError(error);\n setLoading(false);\n throw error;\n }\n },\n [uninstallMutation],\n );\n\n return {\n uninstallNode,\n loading,\n error,\n };\n};\n","import { useCallback } from \"react\";\nimport { getFluidGridsClient } from \"../../graphql/client\";\nimport {\n NodeUsageStatusDocument,\n type NodeUsageStatusQuery,\n type NodeUsageStatusQueryVariables,\n} from \"../../generated/operations\";\n\n/**\n * Hook for checking if a node is used in any workflows\n * Calls the wspace-workflow-svc GraphQL query\n */\n\nexport interface WorkflowUsage {\n id: string;\n name: string;\n version?: string;\n}\n\nexport interface NodeUsageResult {\n isUsed: boolean;\n workflows: WorkflowUsage[];\n}\n\nexport const useNodeUsageInWorkflows = () => {\n const checkNodeUsage = useCallback(\n async (\n workspaceId: string,\n nodeType: string,\n nodeVersion: string = \"1.0.0\",\n ): Promise<NodeUsageResult> => {\n const client = getFluidGridsClient();\n\n try {\n const result = await client.query<\n NodeUsageStatusQuery,\n NodeUsageStatusQueryVariables\n >({\n query: NodeUsageStatusDocument,\n variables: {\n nodeType,\n nodeVersion,\n },\n fetchPolicy: \"network-only\", // Always fetch fresh data\n });\n\n if (result.error) {\n throw result.error;\n }\n\n const data = result.data?.nodeUsageStatus;\n\n if (!data) {\n return {\n isUsed: false,\n workflows: [],\n };\n }\n\n // Map the workflow references to WorkflowUsage format\n const workflows: WorkflowUsage[] = data.workflows.map((wf) => ({\n id: wf.workflowId,\n name: wf.workflowName,\n version: wf.workflowKey, // Using workflowKey as version identifier\n }));\n\n return {\n isUsed: data.isInUse,\n workflows,\n };\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Failed to check node usage\");\n console.error(\"[useNodeUsageInWorkflows] Error:\", error);\n throw error;\n }\n },\n [],\n );\n\n return {\n checkNodeUsage,\n loading: false, // Since we're using direct query, loading state is handled per-call\n error: null,\n };\n};\n","import { useCallback } from \"react\";\nimport { getFluidGridsClient } from \"../../graphql/client\";\nimport {\n RemoveNodeFromWorkflowsDocument,\n type RemoveNodeFromWorkflowsMutation,\n type RemoveNodeFromWorkflowsMutationVariables,\n} from \"../../generated/operations\";\n\nexport interface RemoveNodeResult {\n success: boolean;\n removedFromWorkflows: string[];\n deactivatedWorkflows: string[];\n cleanedUsageEntries: number;\n}\n\n/**\n * Hook for removing a node from workflows before uninstallation\n * Calls the wspace-workflow-svc GraphQL mutation\n */\nexport const useRemoveNodeFromWorkflows = () => {\n const removeNodeFromWorkflows = useCallback(\n async (\n nodeType: string,\n nodeVersion: string,\n workflowIds: string[],\n ): Promise<RemoveNodeResult> => {\n const client = getFluidGridsClient();\n\n try {\n const result = await client.mutate<\n RemoveNodeFromWorkflowsMutation,\n RemoveNodeFromWorkflowsMutationVariables\n >({\n mutation: RemoveNodeFromWorkflowsDocument,\n variables: {\n nodeType,\n nodeVersion,\n workflowIds,\n },\n });\n\n if (result.error) {\n throw new Error(result.error.message);\n }\n\n const data = result.data?.removeNodeFromWorkflows;\n\n if (!data) {\n throw new Error(\"No data returned from removeNodeFromWorkflows\");\n }\n\n return {\n success: data.success,\n removedFromWorkflows: data.removedFromWorkflows,\n deactivatedWorkflows: data.deactivatedWorkflows,\n cleanedUsageEntries: data.cleanedUsageEntries,\n };\n } catch (err) {\n const error =\n err instanceof Error\n ? err\n : new Error(\"Failed to remove node from workflows\");\n console.error(\"[useRemoveNodeFromWorkflows] Error:\", error);\n throw error;\n }\n },\n [],\n );\n\n return {\n removeNodeFromWorkflows,\n };\n};\n","import { useQuery } from \"@apollo/client/react\";\nimport { useContext, useMemo } from \"react\";\nimport {\n BrowseWorkflowTemplatesDocument,\n type BrowseWorkflowTemplatesQuery,\n type BrowseWorkflowTemplatesQueryVariables,\n} from \"../../generated/global-operations\";\nimport {\n ProductType,\n ProductStatus,\n StoreSortBy,\n type StoreProduct,\n} from \"../../generated/global-types\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../config\";\n\n/**\n * Hook to browse workflow templates from the Store\n *\n * Fetches WORKFLOW type products from the global store service\n * with rich preview data (screenshots, videos, etc.)\n *\n * @param searchTerm - Optional search query\n * @param limit - Number of templates per page (default: 20)\n * @param enabled - Whether to enable the query (default: true). Set to false to skip the query.\n */\nexport function useWorkflowTemplates(\n searchTerm?: string,\n limit = 20,\n enabled = true,\n) {\n const client = useGlobalStoreClient();\n\n // Get workspace and organization context for tenant scoping\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n const organizationId = context?.organizationId;\n\n // Build context headers for organization and workspace context\n const contextHeaders = useMemo(() => {\n const headers: Record<string, string> = {};\n if (organizationId) {\n headers[\"x-organization-id\"] = organizationId;\n }\n if (workspaceId) {\n headers[\"x-workspace-id\"] = workspaceId;\n }\n return headers;\n }, [organizationId, workspaceId]);\n\n // Extract variables builder to avoid duplication\n const buildVariables = (\n offset: number,\n ): BrowseWorkflowTemplatesQueryVariables => ({\n input: {\n filter: {\n type: ProductType.Workflow,\n status: ProductStatus.Published,\n search: searchTerm,\n },\n pagination: {\n limit,\n offset,\n },\n sortBy: searchTerm ? StoreSortBy.Relevance : StoreSortBy.Newest,\n },\n });\n\n const { data, loading, error, fetchMore, refetch } = useQuery<\n BrowseWorkflowTemplatesQuery,\n BrowseWorkflowTemplatesQueryVariables\n >(BrowseWorkflowTemplatesDocument, {\n client,\n variables: buildVariables(0),\n fetchPolicy: \"cache-and-network\",\n // Skip query if not enabled (e.g., when modal is closed)\n skip: !enabled,\n // Pass organization and workspace context to Store service\n context:\n Object.keys(contextHeaders).length > 0\n ? {\n headers: contextHeaders,\n }\n : undefined,\n });\n\n const templates = (data?.browseStore?.products || []) as StoreProduct[];\n const totalCount = data?.browseStore?.totalCount || 0;\n const hasMore = data?.browseStore?.hasMore || false;\n\n const loadMore = () => {\n if (!hasMore || loading) return;\n\n return fetchMore({\n variables: buildVariables(templates.length),\n // Pass context headers for pagination too\n context:\n Object.keys(contextHeaders).length > 0\n ? {\n headers: contextHeaders,\n }\n : undefined,\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) return prev;\n\n return {\n browseStore: {\n ...fetchMoreResult.browseStore,\n products: [\n ...(prev.browseStore?.products || []),\n ...(fetchMoreResult.browseStore?.products || []),\n ],\n },\n };\n },\n });\n };\n\n return {\n templates,\n totalCount,\n hasMore,\n loading,\n error,\n loadMore,\n refetch,\n };\n}\n","import { useState, useCallback, useContext } from \"react\";\nimport { useMutation } from \"@apollo/client/react\";\nimport {\n CreateStoreOrderDocument,\n type CreateStoreOrderMutation,\n type CreateStoreOrderMutationVariables,\n} from \"../../generated/global-operations\";\nimport type {\n CreateStoreOrderInput,\n StoreOrder,\n} from \"../../generated/global-types\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../config\";\n\ninterface CreateOrderResult {\n order?: StoreOrder;\n success: boolean;\n error?: string;\n}\n\n/**\n * Hook to create a store order for paid products\n * This creates a PENDING order that will be completed after payment\n */\nexport function useCreateOrder() {\n const globalClient = useGlobalStoreClient();\n const [creating, setCreating] = useState(false);\n\n // Get organization context if available\n const context = useContext(FluidGridsContext);\n const organizationId = context?.organizationId;\n\n const [createOrderMutation] = useMutation<\n CreateStoreOrderMutation,\n CreateStoreOrderMutationVariables\n >(CreateStoreOrderDocument, {\n client: globalClient,\n // Add organization context to the request if available\n context: organizationId\n ? {\n headers: {\n \"x-organization-id\": organizationId,\n },\n }\n : undefined,\n });\n\n const createOrder = useCallback(\n async (input: CreateStoreOrderInput): Promise<CreateOrderResult> => {\n setCreating(true);\n\n try {\n console.log(\"[useCreateOrder] Creating order with input:\", input);\n\n const result = await createOrderMutation({\n variables: { input },\n });\n\n if (!result.data?.createStoreOrder?.id) {\n throw new Error(\"Failed to create order - no order ID returned\");\n }\n\n const order = result.data.createStoreOrder as StoreOrder;\n\n console.log(\"[useCreateOrder] Order created successfully:\", order);\n\n setCreating(false);\n return {\n order,\n success: true,\n };\n } catch (error) {\n console.error(\"[useCreateOrder] Failed to create order:\", error);\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to create order\";\n\n setCreating(false);\n return {\n success: false,\n error: errorMessage,\n };\n }\n },\n [createOrderMutation],\n );\n\n return {\n createOrder,\n creating,\n };\n}\n","import { useState, useCallback, useContext } from \"react\";\nimport { gql } from \"@apollo/client/core\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../config\";\nimport type { WorkflowDefinition } from \"../../generated/graphql-types\";\nimport type { WorkflowTemplateContent } from \"../../types/workflow-template-content\";\n\n// ============================================================================\n// GraphQL Document\n// ============================================================================\n\nconst CREATE_STORE_PRODUCT = gql`\n mutation CreateStoreProduct($input: CreateProductInput!) {\n createProduct(input: $input) {\n id\n slug\n name\n type\n status\n createdAt\n }\n }\n`;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PublishToStoreInput {\n /** The workflow definition to publish as a template */\n workflow: WorkflowDefinition;\n /** Template name (defaults to workflow name) */\n name?: string;\n /** Template description */\n description?: string;\n /** Long description (markdown) */\n longDescription?: string;\n /** Category */\n category?: string;\n /** Tags */\n tags?: string[];\n /** Screenshots URLs */\n screenshots?: string[];\n /** Pricing model */\n pricingModel?: \"FREE\" | \"PAID_ONETIME\" | \"SUBSCRIPTION\";\n /** Price (for paid templates) */\n price?: number;\n /** License type */\n license?: string;\n}\n\ninterface PublishResult {\n success: boolean;\n productId: string | null;\n slug: string | null;\n message: string;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to publish a workflow definition as a template in the store.\n *\n * Extracts the definitionJson, analyzes node types used, builds the\n * WorkflowTemplateContent payload, and creates a StoreProduct via\n * the global gateway.\n */\nexport function usePublishToStore() {\n const [publishing, setPublishing] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const globalClient = useGlobalStoreClient();\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n\n /**\n * Extract the node types used in a workflow's definitionJson.\n * Scans the nodes array and returns unique node type entries.\n */\n const extractRequiredNodeTypes = useCallback(\n (\n definitionJson: Record<string, unknown>,\n ): WorkflowTemplateContent[\"requiredNodeTypes\"] => {\n const nodes =\n (\n definitionJson as {\n nodes?: Array<{ type?: string; data?: { nodeType?: string } }>;\n }\n ).nodes || [];\n const seen = new Set<string>();\n const result: WorkflowTemplateContent[\"requiredNodeTypes\"] = [];\n\n for (const node of nodes) {\n const nodeType = node.data?.nodeType || node.type || \"unknown\";\n if (!seen.has(nodeType)) {\n seen.add(nodeType);\n result.push({\n nodeType,\n nodeVersion: \"1.0\",\n publishType:\n nodeType.startsWith(\"internal:\") ||\n nodeType.startsWith(\"trigger:\")\n ? \"BUILTIN\"\n : \"STORE\",\n displayName: nodeType\n .replace(/^(internal:|trigger:)/, \"\")\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase()),\n });\n }\n }\n\n return result;\n },\n [],\n );\n\n /**\n * Publish a workflow definition as a store template.\n */\n const publishToStore = useCallback(\n async (input: PublishToStoreInput): Promise<PublishResult> => {\n setPublishing(true);\n setError(null);\n\n try {\n const { workflow } = input;\n const definitionJson = workflow.definitionJson as Record<\n string,\n unknown\n >;\n\n // Build the WorkflowTemplateContent payload\n const templateContent: WorkflowTemplateContent = {\n definitionJson:\n definitionJson as WorkflowTemplateContent[\"definitionJson\"],\n requiredNodeTypes: extractRequiredNodeTypes(definitionJson),\n defaultWorkflowName: input.name || workflow.name,\n defaultCategory: input.category || workflow.category || undefined,\n defaultTags: input.tags || workflow.tags || [],\n difficultyLevel: \"medium\",\n };\n\n // Create the store product\n const result = await globalClient.mutate({\n mutation: CREATE_STORE_PRODUCT,\n variables: {\n input: {\n name: input.name || workflow.name,\n description: input.description || workflow.description || \"\",\n longDescription: input.longDescription,\n type: \"WORKFLOW\",\n pricingModel: input.pricingModel || \"FREE\",\n price: input.price || 0,\n category: input.category || workflow.category,\n tags: input.tags || workflow.tags || [],\n screenshots: input.screenshots || [],\n content: templateContent,\n compatibleProducts: [\"fluidgrids\"],\n license: input.license || \"MIT\",\n manifestVersion: \"1.0\",\n },\n },\n });\n\n const data = result.data as\n | {\n createProduct?: { id: string; slug: string; name: string };\n }\n | undefined;\n const product = data?.createProduct;\n if (!product) {\n throw new Error(\"Failed to create store product\");\n }\n\n return {\n success: true,\n productId: product.id,\n slug: product.slug,\n message: `Template \"${product.name}\" submitted to the store`,\n };\n } catch (err) {\n const publishError =\n err instanceof Error ? err : new Error(\"Failed to publish to store\");\n setError(publishError);\n return {\n success: false,\n productId: null,\n slug: null,\n message: publishError.message,\n };\n } finally {\n setPublishing(false);\n }\n },\n [globalClient, extractRequiredNodeTypes],\n );\n\n return {\n publishToStore,\n publishing,\n error,\n };\n}\n","import { Input } from \"../../../../../ui/input\";\nimport { Button } from \"../../../../../ui/button\";\nimport { cn } from \"../../../../../utils/cn\";\nimport {\n List,\n CheckCircle,\n AlertCircle,\n XCircle,\n ArrowUpCircle,\n} from \"lucide-react\";\nimport { useInstalledNodes } from \"../../../../../hooks/store\";\n\nexport type FilterTab =\n | \"all\"\n | \"installed\"\n | \"in-workflow\"\n | \"missing\"\n | \"update-available\";\n\nexport interface StoreNodesSidebarProps {\n activeTab: FilterTab;\n onTabChange: (tab: FilterTab) => void;\n searchTerm: string;\n onSearchChange: (term: string) => void;\n}\n\ninterface TabButtonProps {\n icon: React.ElementType;\n label: string;\n count?: number;\n active: boolean;\n onClick: () => void;\n}\n\nfunction TabButton({\n icon: Icon,\n label,\n count,\n active,\n onClick,\n}: TabButtonProps) {\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"w-full justify-start gap-2 px-3\",\n active && \"bg-accent text-accent-foreground\",\n )}\n onClick={onClick}\n >\n <Icon className=\"size-4 shrink-0\" />\n <span className=\"flex-1 text-left text-sm\">{label}</span>\n {count !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{count}</span>\n )}\n </Button>\n );\n}\n\n/**\n * Left sidebar with search and filter tabs\n */\nexport function StoreNodesSidebar({\n activeTab,\n onTabChange,\n searchTerm,\n onSearchChange,\n}: StoreNodesSidebarProps) {\n const { totalCount: installedCount } = useInstalledNodes();\n\n return (\n <div className=\"w-64 shrink-0 border-r bg-muted/30 p-4 space-y-3 overflow-y-auto\">\n <Input\n placeholder=\"Search nodes...\"\n value={searchTerm}\n onChange={(e) => onSearchChange(e.target.value)}\n className=\"h-9\"\n />\n\n <nav className=\"space-y-1\">\n <TabButton\n icon={List}\n label=\"All\"\n active={activeTab === \"all\"}\n onClick={() => onTabChange(\"all\")}\n />\n <TabButton\n icon={CheckCircle}\n label=\"Installed\"\n count={installedCount}\n active={activeTab === \"installed\"}\n onClick={() => onTabChange(\"installed\")}\n />\n <TabButton\n icon={AlertCircle}\n label=\"In Workflow\"\n active={activeTab === \"in-workflow\"}\n onClick={() => onTabChange(\"in-workflow\")}\n />\n <TabButton\n icon={XCircle}\n label=\"Missing\"\n active={activeTab === \"missing\"}\n onClick={() => onTabChange(\"missing\")}\n />\n <TabButton\n icon={ArrowUpCircle}\n label=\"Update Available\"\n active={activeTab === \"update-available\"}\n onClick={() => onTabChange(\"update-available\")}\n />\n </nav>\n </div>\n );\n}\n","import { forwardRef, type HTMLAttributes } from \"react\";\nimport { cn } from \"../utils/cn\";\n\nconst Card = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm transition-all duration-200 ease-out hover:shadow-md\",\n className,\n )}\n {...props}\n />\n ),\n);\nCard.displayName = \"Card\";\n\nconst CardHeader = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n ),\n);\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = forwardRef<\n HTMLHeadingElement,\n HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n ),\n);\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n ),\n);\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n};\n","import React from \"react\";\nimport { AlertTriangle, Trash2, X } from \"lucide-react\";\nimport type { WorkflowUsage } from \"../../../../../hooks/store/useNodeUsageInWorkflows\";\n\ninterface UninstallNodeDialogProps {\n nodeName: string;\n nodeType: string;\n isUsed: boolean;\n workflows: WorkflowUsage[];\n loading: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport const UninstallNodeDialog: React.FC<UninstallNodeDialogProps> = ({\n nodeName,\n nodeType,\n isUsed,\n workflows,\n loading,\n onConfirm,\n onCancel,\n}) => {\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <div className=\"bg-white rounded-lg shadow-xl max-w-md w-full mx-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 border-b\">\n <div className=\"flex items-center gap-2\">\n <Trash2 className=\"w-5 h-5 text-red-600\" />\n <h2 className=\"text-lg font-semibold text-gray-900\">\n Uninstall Node\n </h2>\n </div>\n <button\n onClick={onCancel}\n className=\"text-gray-400 hover:text-gray-600 transition-colors\"\n aria-label=\"Close dialog\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-4\">\n {loading ? (\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\" />\n <span className=\"ml-3 text-gray-600\">Checking node usage...</span>\n </div>\n ) : (\n <>\n {/* Warning Banner for nodes in use */}\n {isUsed && (\n <div className=\"mb-4 p-3 bg-amber-50 border border-amber-200 rounded-lg flex gap-3\">\n <AlertTriangle className=\"w-5 h-5 text-amber-600 flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-amber-900\">\n Warning: Node is in use\n </p>\n <p className=\"text-sm text-amber-700 mt-1\">\n This node is currently used in {workflows.length} workflow\n {workflows.length !== 1 ? \"s\" : \"\"}. Uninstalling it will\n break these workflows.\n </p>\n </div>\n </div>\n )}\n\n {/* Node Info */}\n <div className=\"mb-4\">\n <p className=\"text-sm text-gray-600\">\n Are you sure you want to uninstall{\" \"}\n <span className=\"font-semibold text-gray-900\">\n {nodeName}\n </span>\n ?\n </p>\n <p className=\"text-xs text-gray-500 mt-1\">\n Node Type: {nodeType}\n </p>\n </div>\n\n {/* Workflows List */}\n {isUsed && workflows.length > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-sm font-medium text-gray-700 mb-2\">\n Workflows using this node:\n </p>\n <div className=\"max-h-40 overflow-y-auto border rounded-lg divide-y\">\n {workflows.map((workflow) => (\n <div key={workflow.id} className=\"p-2 hover:bg-gray-50\">\n <p className=\"text-sm font-medium text-gray-900\">\n {workflow.name}\n </p>\n <p className=\"text-xs text-gray-500\">\n ID: {workflow.id} • Version: {workflow.version}\n </p>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Info message for safe uninstall */}\n {!isUsed && (\n <div className=\"mb-4 p-3 bg-green-50 border border-green-200 rounded-lg\">\n <p className=\"text-sm text-green-800\">\n This node is not currently used in any workflows. It's safe\n to uninstall.\n </p>\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center justify-end gap-3 p-4 border-t bg-gray-50\">\n <button\n onClick={onCancel}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n disabled={loading}\n >\n Cancel\n </button>\n <button\n onClick={onConfirm}\n className={`px-4 py-2 text-sm font-medium text-white rounded-lg transition-colors ${\n isUsed\n ? \"bg-red-600 hover:bg-red-700\"\n : \"bg-red-500 hover:bg-red-600\"\n }`}\n disabled={loading}\n >\n {isUsed ? \"Uninstall Anyway\" : \"Uninstall\"}\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import { Card } from \"../../../../../ui/card\";\nimport { Button } from \"../../../../../ui/button\";\nimport { Badge } from \"../../../../../ui/badge\";\nimport {\n Star,\n Check,\n Loader2,\n DollarSign,\n RefreshCw,\n Trash2,\n} from \"lucide-react\";\nimport type { StoreProduct } from \"../../../../../generated/global-types\";\nimport {\n useInstallNode,\n useUpdateNode,\n useUninstallNode,\n useNodeUsageInWorkflows,\n useRemoveNodeFromWorkflows,\n useCreateOrder,\n useInstalledNodes,\n useRefreshAvailableNodes,\n} from \"../../../../../hooks/store\";\nimport { UninstallNodeDialog } from \"./UninstallNodeDialog\";\nimport { cn } from \"../../../../../utils/cn\";\nimport { toast } from \"sonner\";\nimport { useState, useContext } from \"react\";\nimport { FluidGridsContext } from \"../../../../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../../../../config\";\n\nexport interface StoreNodeCardProps {\n node: StoreProduct;\n isInstalled: boolean;\n installedVersion?: string;\n installationId?: string;\n onClick: () => void;\n}\n\nfunction formatDownloads(count: number): string {\n if (count >= 1000000) {\n return `${(count / 1000000).toFixed(1)}M`;\n }\n if (count >= 1000) {\n return `${(count / 1000).toFixed(1)}k`;\n }\n return count.toString();\n}\n\n/**\n * Individual node card showing node info and install button\n */\nexport function StoreNodeCard({\n node,\n isInstalled,\n installedVersion,\n installationId,\n onClick,\n}: StoreNodeCardProps) {\n const { installNode, installing } = useInstallNode();\n const { updateNode, updating } = useUpdateNode();\n const { uninstallNode, loading: uninstalling } = useUninstallNode();\n const { checkNodeUsage, loading: checkingUsage } = useNodeUsageInWorkflows();\n const { removeNodeFromWorkflows } = useRemoveNodeFromWorkflows();\n const { createOrder, creating: creatingOrder } = useCreateOrder();\n const { refetch: refetchInstalledNodes } = useInstalledNodes();\n const { refreshAvailableNodes } = useRefreshAvailableNodes();\n const [showUninstallDialog, setShowUninstallDialog] = useState(false);\n const [checkingNodeUsage, setCheckingNodeUsage] = useState(false);\n const [removingFromWorkflows, setRemovingFromWorkflows] = useState(false);\n const [nodeUsage, setNodeUsage] = useState<{\n isUsed: boolean;\n workflows: any[];\n }>({ isUsed: false, workflows: [] });\n\n // Get workspace context\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n const orgId = context?.organizationId;\n\n // Check if update is available\n const latestVersion = node.manifestVersion;\n const hasUpdate =\n isInstalled &&\n installedVersion &&\n latestVersion &&\n installedVersion !== latestVersion;\n\n const handleInstall = async (e: React.MouseEvent) => {\n e.stopPropagation();\n const result = await installNode(node);\n if (result.success) {\n toast.success(\"Node installed successfully!\", {\n description: `${node.name} is now available in your workflow builder.`,\n });\n\n // Refresh the available nodes in the builder registry\n console.log(\n \"[StoreNodeCard] Refreshing available nodes after install...\",\n );\n await refreshAvailableNodes();\n\n // Refetch the installed nodes list to update the UI\n console.log(\"[StoreNodeCard] Refetching installed nodes list...\");\n await refetchInstalledNodes();\n\n console.log(\"[StoreNodeCard] Refresh complete!\");\n } else {\n toast.error(\"Installation failed\", {\n description:\n result.error || \"Failed to install node. Please try again.\",\n });\n }\n };\n\n const handleUpdate = async (e: React.MouseEvent) => {\n e.stopPropagation();\n\n if (!installationId) {\n toast.error(\"Cannot update node\", {\n description: \"Installation ID not found. Please reinstall the node.\",\n });\n return;\n }\n\n const result = await updateNode(node, installationId);\n if (result.success) {\n toast.success(\"Node updated successfully!\", {\n description: `${node.name} has been updated to v${latestVersion}.`,\n });\n\n // Refresh the available nodes in the builder registry\n console.log(\"[StoreNodeCard] Refreshing available nodes after update...\");\n await refreshAvailableNodes();\n\n // Refetch the installed nodes list to update the UI\n console.log(\"[StoreNodeCard] Refetching installed nodes list...\");\n await refetchInstalledNodes();\n\n console.log(\"[StoreNodeCard] Refresh complete!\");\n } else {\n toast.error(\"Update failed\", {\n description: result.error || \"Failed to update node. Please try again.\",\n });\n }\n };\n\n const handlePurchase = async (e: React.MouseEvent) => {\n e.stopPropagation();\n\n try {\n // Show loading toast\n toast.info(\"Creating order\", {\n description: `Preparing checkout for ${node.name}...`,\n });\n\n // Create line item for the product (matching StoreLineItemInput schema)\n const unitPrice = node.price || 0;\n const quantity = 1;\n const subtotal = unitPrice * quantity;\n\n const lineItem = {\n productId: node.id,\n name: node.name, // Required: product name at time of purchase\n quantity: quantity,\n unitPrice: unitPrice, // Required: unit price for one item\n subtotal: subtotal, // Required: subtotal (unitPrice * quantity)\n itemType: \"DIGITAL\", // Optional: type of item\n pricingModel: node.pricingModel || \"PAID_ONETIME\", // Optional: pricing model\n version: node.manifestVersion || undefined, // Optional: product version\n };\n\n // Create order input\n const orderInput = {\n total: subtotal,\n lineItems: [lineItem],\n billingAccountId: \"\", // Will be set on billing page\n };\n\n // Create PENDING order via Store service\n const result = await createOrder(orderInput);\n\n if (result.success && result.order?.id) {\n console.log(\"[StoreNodeCard] Order created:\", result.order.id);\n\n // Navigate to billing checkout page with order ID\n const checkoutUrl = `/billing/checkout/store/${result.order.id}`;\n\n console.log(\"[StoreNodeCard] Navigating to checkout:\", checkoutUrl);\n window.location.href = checkoutUrl;\n } else {\n throw new Error(result.error || \"Failed to create order\");\n }\n } catch (error) {\n console.error(\"[StoreNodeCard] Purchase flow error:\", error);\n toast.error(\"Failed to start checkout\", {\n description:\n error instanceof Error ? error.message : \"Please try again.\",\n });\n }\n };\n\n const handleUninstallClick = async (e: React.MouseEvent) => {\n e.stopPropagation();\n\n if (!installationId) {\n toast.error(\"Cannot uninstall node\", {\n description: \"Installation ID not found.\",\n });\n return;\n }\n\n if (!workspaceId) {\n toast.error(\"Workspace not found\", {\n description: \"Unable to check node usage without workspace context.\",\n });\n return;\n }\n\n // Check if node is used in workflows\n try {\n setCheckingNodeUsage(true);\n const nodeVersion = installedVersion || latestVersion || \"1.0.0\";\n const usage = await checkNodeUsage(\n workspaceId,\n node.name, // Use node name as identifier\n nodeVersion,\n );\n setNodeUsage(usage);\n setShowUninstallDialog(true);\n } catch (error) {\n console.error(\"[StoreNodeCard] Failed to check node usage:\", error);\n toast.error(\"Failed to check node usage\", {\n description: \"Please try again.\",\n });\n } finally {\n setCheckingNodeUsage(false);\n }\n };\n\n const handleConfirmUninstall = async () => {\n if (!workspaceId) {\n toast.error(\"Workspace not found\", {\n description: \"Unable to uninstall without workspace context.\",\n });\n return;\n }\n\n try {\n // If node is in use, first remove it from all workflows\n if (nodeUsage.isUsed && nodeUsage.workflows.length > 0) {\n setRemovingFromWorkflows(true);\n\n const nodeVersion = installedVersion || latestVersion || \"1.0.0\";\n const workflowIds = nodeUsage.workflows.map((wf) => wf.id);\n\n console.log(\n `[StoreNodeCard] Removing node ${node.name} (v${nodeVersion}) from ${workflowIds.length} workflows...`,\n );\n\n const removeResult = await removeNodeFromWorkflows(\n node.name,\n nodeVersion,\n workflowIds,\n );\n\n if (!removeResult.success) {\n throw new Error(\"Failed to remove node from workflows\");\n }\n\n console.log(\n `[StoreNodeCard] Node removed from ${removeResult.removedFromWorkflows.length} workflows, ` +\n `${removeResult.deactivatedWorkflows.length} workflows deactivated`,\n );\n\n toast.info(\"Node removed from workflows\", {\n description: `Removed from ${removeResult.removedFromWorkflows.length} workflow(s) and deactivated ${removeResult.deactivatedWorkflows.length} workflow(s).`,\n });\n\n setRemovingFromWorkflows(false);\n }\n\n // Now uninstall the node from the store\n const result = await uninstallNode({\n productId: node.id,\n workspaceId: workspaceId,\n });\n\n if (result) {\n toast.success(\"Node uninstalled successfully!\", {\n description: `${node.name} has been removed from your workspace.`,\n });\n\n setShowUninstallDialog(false);\n\n // Refresh the available nodes in the builder registry\n console.log(\n \"[StoreNodeCard] Refreshing available nodes after uninstall...\",\n );\n await refreshAvailableNodes();\n\n // Refetch the installed nodes list to update the UI\n console.log(\"[StoreNodeCard] Refetching installed nodes list...\");\n await refetchInstalledNodes();\n\n console.log(\"[StoreNodeCard] Refresh complete!\");\n } else {\n throw new Error(\"Uninstall failed\");\n }\n } catch (error) {\n toast.error(\"Uninstall failed\", {\n description:\n error instanceof Error ? error.message : \"Failed to uninstall node.\",\n });\n } finally {\n setRemovingFromWorkflows(false);\n }\n };\n\n const handleCancelUninstall = () => {\n setShowUninstallDialog(false);\n };\n\n const isFree = node.pricingModel === \"FREE\";\n const isPurchased = node.isPurchased === true; // For paid nodes, check if already purchased\n const isInstalling = installing === node.id;\n const isUpdating = updating === node.id;\n\n // For paid nodes: show Install if purchased, show price if not purchased\n const canInstall = isFree || isPurchased;\n\n return (\n <Card\n className={cn(\n \"p-4 hover:shadow-lg transition-all cursor-pointer group\",\n \"border-2 hover:border-primary/50\",\n )}\n onClick={onClick}\n >\n <div className=\"flex flex-col items-center text-center space-y-2\">\n {/* Icon */}\n <div className=\"w-20 h-20 rounded-lg bg-muted flex items-center justify-center overflow-hidden\">\n {node.icon ? (\n <img\n src={node.icon}\n alt={node.name}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"text-3xl font-bold text-muted-foreground\">\n {node.name.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n\n {/* Name */}\n <h4 className=\"font-semibold text-sm truncate w-full group-hover:text-primary transition-colors\">\n {node.name}\n </h4>\n\n {/* Author */}\n <p className=\"text-xs text-muted-foreground truncate w-full\">\n by {node.authorName || node.publisher?.name || \"Unknown\"}\n </p>\n\n {/* Rating */}\n <div className=\"flex items-center gap-1 text-xs\">\n <Star className=\"size-3 fill-yellow-400 text-yellow-400\" />\n <span>{node.rating?.toFixed(1) || \"N/A\"}</span>\n <span className=\"text-muted-foreground\">\n ({node.reviewCount || 0})\n </span>\n </div>\n\n {/* Downloads */}\n <p className=\"text-xs text-muted-foreground\">\n {formatDownloads(node.downloads || 0)} downloads\n </p>\n\n {/* Featured badge */}\n {node.featured && (\n <Badge variant=\"secondary\" className=\"text-xs\">\n Featured\n </Badge>\n )}\n\n {/* Action button */}\n <div className=\"w-full pt-2 space-y-2\">\n {hasUpdate && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"w-full\"\n onClick={handleUpdate}\n disabled={isUpdating}\n >\n {isUpdating ? (\n <>\n <Loader2 className=\"size-3 mr-1 animate-spin\" />\n Updating...\n </>\n ) : (\n <>\n <RefreshCw className=\"size-3 mr-1\" />\n Update to v{latestVersion}\n </>\n )}\n </Button>\n )}\n\n {isInstalled ? (\n <>\n <Badge variant=\"secondary\" className=\"w-full justify-center py-2\">\n <Check className=\"size-3 mr-1\" />\n Installed {installedVersion && `(v${installedVersion})`}\n </Badge>\n <Button\n size=\"sm\"\n variant=\"destructive\"\n className=\"w-full\"\n onClick={handleUninstallClick}\n disabled={\n uninstalling || checkingNodeUsage || removingFromWorkflows\n }\n >\n {uninstalling ? (\n <>\n <Loader2 className=\"size-3 mr-1 animate-spin\" />\n Uninstalling...\n </>\n ) : checkingNodeUsage ? (\n <>\n <Loader2 className=\"size-3 mr-1 animate-spin\" />\n Checking...\n </>\n ) : removingFromWorkflows ? (\n <>\n <Loader2 className=\"size-3 mr-1 animate-spin\" />\n Removing...\n </>\n ) : (\n <>\n <Trash2 className=\"size-3 mr-1\" />\n Uninstall\n </>\n )}\n </Button>\n </>\n ) : canInstall ? (\n <Button\n size=\"sm\"\n className=\"w-full\"\n onClick={handleInstall}\n disabled={isInstalling}\n >\n {isInstalling ? (\n <>\n <Loader2 className=\"size-3 mr-1 animate-spin\" />\n Installing...\n </>\n ) : (\n \"Install\"\n )}\n </Button>\n ) : (\n <Badge\n className=\"w-full justify-center py-2 cursor-pointer hover:bg-primary/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n onClick={handlePurchase}\n >\n {creatingOrder ? (\n <>\n <Loader2 className=\"size-3 mr-1 animate-spin\" />\n Creating order...\n </>\n ) : (\n <>\n <DollarSign className=\"size-3 mr-1\" />$\n {node.price?.toFixed(2) || \"0.00\"}\n </>\n )}\n </Badge>\n )}\n </div>\n </div>\n\n {/* Uninstall Dialog */}\n {showUninstallDialog && (\n <UninstallNodeDialog\n nodeName={node.name}\n nodeType={node.name} // Use node name as type identifier\n isUsed={nodeUsage.isUsed}\n workflows={nodeUsage.workflows}\n loading={uninstalling || removingFromWorkflows}\n onConfirm={handleConfirmUninstall}\n onCancel={handleCancelUninstall}\n />\n )}\n </Card>\n );\n}\n","import { useMemo } from \"react\";\nimport { Button } from \"../../../../../ui/button\";\nimport { Loader2 } from \"lucide-react\";\nimport { useStoreNodes, useInstalledNodes } from \"../../../../../hooks/store\";\nimport { StoreNodeCard } from \"./StoreNodeCard\";\nimport type { BrowseWorkflowNodesQuery } from \"../../../../../generated/global-operations\";\nimport type { StoreProduct } from \"../../../../../generated/global-types\";\nimport type { FilterTab } from \"./StoreNodesSidebar\";\n\n/** Product type as returned by the BrowseWorkflowNodes query (subset of StoreProduct) */\ntype StoreProductResult =\n BrowseWorkflowNodesQuery[\"browseStore\"][\"products\"][number];\n\nexport interface StoreNodesGridProps {\n filterTab: FilterTab;\n searchTerm: string;\n onNodeClick: (node: StoreProductResult) => void;\n}\n\n/**\n * Grid of node cards with infinite scroll\n */\nexport function StoreNodesGrid({\n filterTab,\n searchTerm,\n onNodeClick,\n}: StoreNodesGridProps) {\n const { products, loading, hasMore, fetchMore, error } = useStoreNodes({\n filter: {\n search: searchTerm || undefined,\n type: \"NODE\",\n compatibleWith: \"fluidgrids\",\n },\n sortBy: \"DOWNLOADS\",\n limit: 20,\n });\n\n const { installedAppIds, installationsMap } = useInstalledNodes();\n\n // Debug logging\n console.log(\"[StoreNodesGrid] Debug:\", {\n products,\n productsLength: products?.length,\n loading,\n error,\n filterTab,\n searchTerm,\n });\n\n // Filter products based on active tab\n const filteredProducts = useMemo(() => {\n if (!products) return [];\n\n switch (filterTab) {\n case \"installed\":\n return products.filter((p) => installedAppIds.has(p.id));\n case \"all\":\n default:\n return products;\n // TODO: Implement other filters (in-workflow, missing, update-available)\n }\n }, [products, filterTab, installedAppIds]);\n\n if (loading && filteredProducts.length === 0) {\n return (\n <div className=\"flex-1 flex items-center justify-center\">\n <Loader2 className=\"size-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center p-8 text-center\">\n <p className=\"text-lg font-medium text-destructive\">\n Error loading nodes\n </p>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {error.message || \"Failed to fetch nodes from store\"}\n </p>\n <Button\n variant=\"outline\"\n className=\"mt-4\"\n onClick={() => window.location.reload()}\n >\n Retry\n </Button>\n </div>\n );\n }\n\n if (!loading && filteredProducts.length === 0) {\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center p-8 text-center space-y-4\">\n <p className=\"text-lg font-medium text-muted-foreground\">\n No nodes found\n </p>\n <p className=\"text-sm text-muted-foreground\">\n Try adjusting your search or filters\n </p>\n <div className=\"mt-4 p-4 bg-muted rounded-lg text-left text-xs font-mono max-w-md\">\n <div className=\"font-bold mb-2\">Debug Info:</div>\n <div>Total products: {products?.length || 0}</div>\n <div>Filter tab: {filterTab}</div>\n <div>Search term: \"{searchTerm}\"</div>\n <div>Loading: {loading ? \"yes\" : \"no\"}</div>\n <div>Error: none</div>\n <div>Installed count: {installedAppIds.size}</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex-1 overflow-y-auto bg-background\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6 p-6\">\n {filteredProducts.map((node) => {\n const installation = installationsMap.get(node.id);\n return (\n <StoreNodeCard\n key={node.id}\n node={node as StoreProduct}\n isInstalled={installedAppIds.has(node.id)}\n installedVersion={installation?.installedVersion}\n installationId={installation?.installationId}\n onClick={() => onNodeClick(node)}\n />\n );\n })}\n </div>\n\n {hasMore && (\n <div className=\"p-4 flex justify-center\">\n <Button variant=\"outline\" onClick={fetchMore} disabled={loading}>\n {loading ? (\n <>\n <Loader2 className=\"size-4 mr-2 animate-spin\" />\n Loading...\n </>\n ) : (\n \"Load More\"\n )}\n </Button>\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport { StoreNodesSidebar, type FilterTab } from \"./StoreNodesSidebar\";\nimport { StoreNodesGrid } from \"./StoreNodesGrid\";\nimport type { BrowseWorkflowNodesQuery } from \"../../../../../generated/global-operations\";\nimport { useStoreNodes, useInstalledNodes } from \"../../../../../hooks/store\";\n\n/** Product type as returned by the BrowseWorkflowNodes query (subset of StoreProduct) */\ntype StoreProductResult =\n BrowseWorkflowNodesQuery[\"browseStore\"][\"products\"][number];\n\n/**\n * Main content area of the store modal\n * Contains sidebar filters and node grid\n */\nexport function StoreNodesContent() {\n const [activeTab, setActiveTab] = useState<FilterTab>(\"all\");\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [selectedNode, setSelectedNode] = useState<StoreProductResult | null>(\n null,\n );\n\n // Get refetch functions to refresh data when modal opens\n const { refetch: refetchStoreNodes } = useStoreNodes({\n filter: {\n type: \"NODE\",\n compatibleWith: \"fluidgrids\",\n },\n });\n const { refetch: refetchInstalledNodes } = useInstalledNodes();\n\n // Refetch store nodes and installed nodes when modal opens\n // This ensures we get the latest purchase status (isPurchased field)\n useEffect(() => {\n console.log(\"[StoreNodesContent] Modal opened, refetching data...\");\n\n // Refetch both queries to get updated purchase and installation status\n Promise.all([refetchStoreNodes(), refetchInstalledNodes()])\n .then(() => {\n console.log(\"[StoreNodesContent] Data refreshed successfully\");\n })\n .catch((error) => {\n console.error(\"[StoreNodesContent] Failed to refresh data:\", error);\n });\n }, []); // Run only once when modal opens\n\n return (\n <div className=\"flex flex-row flex-1 overflow-hidden\">\n <StoreNodesSidebar\n activeTab={activeTab}\n onTabChange={setActiveTab}\n searchTerm={searchTerm}\n onSearchChange={setSearchTerm}\n />\n\n <StoreNodesGrid\n filterTab={activeTab}\n searchTerm={searchTerm}\n onNodeClick={setSelectedNode}\n />\n </div>\n );\n}\n","import {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"../../../../../ui/dialog\";\nimport { StoreNodesContent } from \"./StoreNodesContent\";\n\nexport interface StoreNodesModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\n/**\n * Modal dialog for browsing and installing custom workflow nodes\n * Inspired by ComfyUI's node manager\n */\nexport function StoreNodesModal({ open, onOpenChange }: StoreNodesModalProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n size=\"xl\"\n className=\"!flex !flex-col !h-[75vh] !max-h-[75vh] min-h-[500px] p-0 gap-0 overflow-hidden\"\n >\n <DialogHeader className=\"px-6 pt-6 pb-4 border-b shrink-0\">\n <DialogTitle className=\"text-xl font-semibold\">\n Discover Custom Workflow Nodes\n </DialogTitle>\n <DialogDescription className=\"text-sm\">\n Browse and install community-made nodes, integrations, and\n extensions for your workflows\n </DialogDescription>\n </DialogHeader>\n\n {/* Only render content when modal is open to avoid hook call errors */}\n {open && <StoreNodesContent />}\n </DialogContent>\n </Dialog>\n );\n}\n","import React from \"react\";\nimport { Card } from \"../../../../../ui/card\";\nimport { Button } from \"../../../../../ui/button\";\nimport { Badge } from \"../../../../../ui/badge\";\nimport { Star, Download, Eye, Sparkles } from \"lucide-react\";\nimport type { StoreProduct } from \"../../../../../generated/global-types\";\nimport { cn } from \"../../../../../utils/cn\";\n\nexport interface TemplateCardProps {\n template: StoreProduct;\n onClick: () => void;\n onUseTemplate?: (template: StoreProduct) => void;\n}\n\nfunction formatNumber(count: number): string {\n if (count >= 1000000) {\n return `${(count / 1000000).toFixed(1)}M`;\n }\n if (count >= 1000) {\n return `${(count / 1000).toFixed(1)}k`;\n }\n return count.toString();\n}\n\n/**\n * Template card component inspired by ComfyUI's template showcase\n * Features:\n * - Large preview image/screenshot\n * - Template name and description\n * - Author info\n * - Stats (downloads, views, rating)\n * - Featured badge\n * - Category/tags\n */\nexport function TemplateCard({\n template,\n onClick,\n onUseTemplate,\n}: TemplateCardProps) {\n const [imageError, setImageError] = React.useState(false);\n const previewImage = template.screenshots?.[0] || template.icon || undefined;\n const hasPreview = Boolean(previewImage) && !imageError;\n\n const handleUseTemplate = (e: React.MouseEvent) => {\n e.stopPropagation();\n onUseTemplate?.(template);\n };\n\n const handleImageError = () => {\n setImageError(true);\n };\n\n return (\n <Card\n className={cn(\n \"group overflow-hidden transition-all duration-300 cursor-pointer\",\n \"hover:shadow-xl hover:scale-[1.02] border-2 hover:border-primary/50\",\n )}\n onClick={onClick}\n >\n {/* Preview Image Section - ComfyUI style */}\n <div className=\"relative aspect-video w-full overflow-hidden bg-gradient-to-br from-primary/5 to-primary/10\">\n {hasPreview ? (\n <img\n src={previewImage}\n alt={template.name}\n onError={handleImageError}\n className=\"w-full h-full object-cover group-hover:scale-110 transition-transform duration-300\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <Sparkles className=\"size-16 text-primary/30\" />\n </div>\n )}\n\n {/* Featured Badge Overlay */}\n {template.featured && (\n <div className=\"absolute top-2 right-2\">\n <Badge\n variant=\"default\"\n className=\"bg-gradient-to-r from-yellow-500 to-orange-500 text-white border-0 shadow-lg\"\n >\n <Star className=\"size-3 mr-1 fill-white\" />\n Featured\n </Badge>\n </div>\n )}\n\n {/* Pricing Badge Overlay */}\n <div className=\"absolute top-2 left-2\">\n {template.pricingModel === \"FREE\" ? (\n <Badge\n variant=\"secondary\"\n className=\"bg-green-500 text-white border-0\"\n >\n Free\n </Badge>\n ) : (\n <Badge\n variant=\"default\"\n className=\"bg-blue-500 text-white border-0\"\n >\n ${template.price?.toString() || \"0\"}\n </Badge>\n )}\n </div>\n\n {/* Gradient Overlay on Hover */}\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300\" />\n </div>\n\n {/* Content Section */}\n <div className=\"p-4 space-y-3\">\n {/* Title */}\n <h3 className=\"font-semibold text-base line-clamp-1 group-hover:text-primary transition-colors\">\n {template.name}\n </h3>\n\n {/* Description */}\n <p className=\"text-sm text-muted-foreground line-clamp-2 min-h-[2.5rem]\">\n {template.description || \"No description available\"}\n </p>\n\n {/* Author */}\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">\n {template.authorName || template.publisher?.name || \"Unknown\"}\n </span>\n {template.publisher?.isVerified && (\n <Badge variant=\"secondary\" className=\"text-xs px-1.5 py-0\">\n ✓\n </Badge>\n )}\n </div>\n\n {/* Stats Row */}\n <div className=\"flex items-center justify-between text-xs text-muted-foreground pt-2 border-t\">\n {/* Left: Rating & Reviews */}\n <div className=\"flex items-center gap-3\">\n {template.rating && (\n <div className=\"flex items-center gap-1\">\n <Star className=\"size-3 fill-yellow-400 text-yellow-400\" />\n <span className=\"font-medium\">\n {template.rating.toFixed(1)}\n </span>\n <span className=\"text-muted-foreground/60\">\n ({template.reviewCount || 0})\n </span>\n </div>\n )}\n </div>\n\n {/* Right: Downloads & Views */}\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-1\" title=\"Downloads\">\n <Download className=\"size-3\" />\n <span>{formatNumber(template.downloads || 0)}</span>\n </div>\n <div className=\"flex items-center gap-1\" title=\"Views\">\n <Eye className=\"size-3\" />\n <span>{formatNumber(template.viewCount || 0)}</span>\n </div>\n </div>\n </div>\n\n {/* Category/Tags */}\n {(template.category || template.tags?.length > 0) && (\n <div className=\"flex flex-wrap gap-1\">\n {template.category && (\n <Badge variant=\"outline\" className=\"text-xs\">\n {template.category}\n </Badge>\n )}\n {template.tags?.slice(0, 2).map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n {template.tags?.length > 2 && (\n <Badge variant=\"outline\" className=\"text-xs\">\n +{template.tags.length - 2}\n </Badge>\n )}\n </div>\n )}\n\n {/* Action Button */}\n <Button size=\"sm\" className=\"w-full mt-2\" onClick={handleUseTemplate}>\n <Sparkles className=\"size-3 mr-1\" />\n Use Template\n </Button>\n </div>\n </Card>\n );\n}\n","import { TemplateCard } from \"./TemplateCard\";\nimport type { StoreProduct } from \"../../../../../generated/global-types\";\nimport { Loader2, Package } from \"lucide-react\";\nimport { Button } from \"../../../../../ui/button\";\n\nexport interface TemplatesGridProps {\n templates: StoreProduct[];\n loading?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n onTemplateClick: (template: StoreProduct) => void;\n onUseTemplate?: (template: StoreProduct) => void;\n}\n\n/**\n * Grid layout for displaying workflow templates\n * Inspired by ComfyUI's template showcase with responsive grid\n */\nexport function TemplatesGrid({\n templates,\n loading,\n hasMore,\n onLoadMore,\n onTemplateClick,\n onUseTemplate,\n}: TemplatesGridProps) {\n if (loading && templates.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 space-y-3\">\n <Loader2 className=\"size-8 animate-spin text-primary\" />\n <p className=\"text-sm text-muted-foreground\">Loading templates...</p>\n </div>\n );\n }\n\n if (templates.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 space-y-3\">\n <Package className=\"size-12 text-muted-foreground/50\" />\n <p className=\"text-sm font-medium\">No templates found</p>\n <p className=\"text-xs text-muted-foreground\">\n Try adjusting your search or filters\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Grid - Responsive: 1 col on mobile, 2 on tablet, 3 on desktop, 4 on xl */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\n {templates.map((template) => (\n <TemplateCard\n key={template.id}\n template={template}\n onClick={() => onTemplateClick(template)}\n onUseTemplate={onUseTemplate}\n />\n ))}\n </div>\n\n {/* Load More Button */}\n {hasMore && (\n <div className=\"flex justify-center pt-4\">\n <Button\n variant=\"outline\"\n onClick={onLoadMore}\n disabled={loading}\n className=\"min-w-[200px]\"\n >\n {loading ? (\n <>\n <Loader2 className=\"size-4 mr-2 animate-spin\" />\n Loading...\n </>\n ) : (\n \"Load More Templates\"\n )}\n </Button>\n </div>\n )}\n </div>\n );\n}\n","import { useState, useDeferredValue, lazy, Suspense } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from \"../../../../../ui/dialog\";\nimport { Input } from \"../../../../../ui/input\";\nimport { Button } from \"../../../../../ui/button\";\nimport { TemplatesGrid } from \"./TemplatesGrid\";\nimport { useWorkflowTemplates } from \"../../../../../hooks/store\";\nimport type { StoreProduct } from \"../../../../../generated/global-types\";\nimport {\n Search,\n Sparkles,\n AlertCircle,\n RefreshCw,\n Loader2,\n} from \"lucide-react\";\nimport type { TemplateDetailPanelProps } from \"./TemplateDetailPanel\";\n\n// Lazy load the detail panel to avoid Vite static import analysis issues\n// with newly created files during hot-reload in dev containers\nconst LazyTemplateDetailPanel = lazy(() =>\n import(\"./TemplateDetailPanel\").then((m) => ({\n default: m.TemplateDetailPanel,\n })),\n);\n\nexport interface TemplatesModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onUseTemplate?: (template: StoreProduct) => void;\n}\n\n/**\n * Modal for browsing and selecting workflow templates\n * Features:\n * - Search templates\n * - Grid view with previews\n * - Load more pagination\n * - Template detail side panel\n */\nexport function TemplatesModal({\n open,\n onOpenChange,\n onUseTemplate,\n}: TemplatesModalProps) {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [selectedTemplate, setSelectedTemplate] = useState<StoreProduct | null>(\n null,\n );\n // Debounce search term to avoid firing a network request on every keystroke\n const deferredSearchTerm = useDeferredValue(searchTerm);\n\n // Only fetch templates when modal is open to avoid unnecessary requests\n const { templates, totalCount, hasMore, loading, error, loadMore, refetch } =\n useWorkflowTemplates(deferredSearchTerm, 20, open);\n\n const handleTemplateClick = (template: StoreProduct) => {\n setSelectedTemplate(template);\n };\n\n const handleUseTemplate = (template: StoreProduct) => {\n if (onUseTemplate) {\n onUseTemplate(template);\n }\n };\n\n const handleCloseDetailPanel = () => {\n setSelectedTemplate(null);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n size=\"xl\"\n className=\"!flex !flex-col !h-[75vh] !max-h-[75vh] min-h-[500px] p-0 gap-0 overflow-hidden\"\n >\n <DialogHeader className=\"px-6 pt-6 pb-4 border-b shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Sparkles className=\"size-5 text-primary\" />\n <DialogTitle className=\"text-2xl\">Workflow Templates</DialogTitle>\n </div>\n <DialogDescription>\n Browse and use pre-built workflow templates to get started quickly\n </DialogDescription>\n\n {/* Search Bar */}\n <div className=\"pt-4\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search templates...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground pt-2\">\n <span>\n {totalCount} template{totalCount !== 1 ? \"s\" : \"\"} available\n </span>\n {searchTerm && (\n <>\n <span>•</span>\n <span>\n {templates.length} matching \"{searchTerm}\"\n </span>\n </>\n )}\n </div>\n </DialogHeader>\n\n {/* Error State */}\n {open && error && (\n <div className=\"flex-1 flex flex-col items-center justify-center gap-4 px-6 py-8\">\n <div className=\"flex flex-col items-center gap-2 text-center\">\n <AlertCircle className=\"size-12 text-destructive\" />\n <h3 className=\"text-lg font-semibold\">\n Failed to load templates\n </h3>\n <p className=\"text-sm text-muted-foreground max-w-md\">\n {error.message ||\n \"An error occurred while fetching workflow templates\"}\n </p>\n </div>\n <Button\n onClick={() => refetch()}\n variant=\"outline\"\n className=\"gap-2\"\n >\n <RefreshCw className=\"size-4\" />\n Retry\n </Button>\n </div>\n )}\n\n {/* Main Content Area - Grid + Optional Detail Panel */}\n {open && !error && (\n <div className=\"flex-1 flex overflow-hidden\">\n {/* Templates Grid - Scrollable */}\n <div\n className={`flex-1 overflow-y-auto px-6 py-4 ${selectedTemplate ? \"hidden md:block md:w-1/2 lg:w-3/5\" : \"\"}`}\n >\n <TemplatesGrid\n templates={templates}\n loading={loading}\n hasMore={hasMore}\n onLoadMore={loadMore}\n onTemplateClick={handleTemplateClick}\n onUseTemplate={handleUseTemplate}\n />\n </div>\n\n {/* Detail Side Panel (lazy loaded) */}\n {selectedTemplate && (\n <Suspense\n fallback={\n <div className=\"w-full md:w-1/2 lg:w-2/5 border-l bg-background flex items-center justify-center\">\n <Loader2 className=\"size-6 animate-spin text-muted-foreground\" />\n </div>\n }\n >\n <LazyTemplateDetailPanel\n template={selectedTemplate}\n onClose={handleCloseDetailPanel}\n onUseTemplate={handleUseTemplate}\n />\n </Suspense>\n )}\n </div>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState, useCallback, lazy, Suspense } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { SwitchSidebarPanel } from \"../components/sidebar-switch-panel\";\nimport SidebarButtonItem from \"../components/sidebar-button-item\";\nimport { Icon } from \"@iconify/react\";\nimport { StoreNodesModal } from \"../../../store/StoreNodesModal\";\nimport { TemplatesModal } from \"../../../templates/TemplatesModal\";\nimport { Store, Sparkles } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport type { StoreProduct } from \"../../../../../../../generated/global-types\";\nimport type {\n WorkflowTemplateContent,\n TemplateNodeCheckResult,\n} from \"../../../../../../../types/workflow-template-content\";\n\n// Lazy load new components to avoid Vite 8 beta static import resolution\n// issues with newly created files in Docker-mounted volumes\nconst LazyTemplateConfigurationModal = lazy(() =>\n import(\"../../../templates/TemplateConfigurationModal\").then((m) => ({\n default: m.TemplateConfigurationModal,\n })),\n);\n\ntype DesktopSidebarFragmentProps = Readonly<{\n activePanel: \"node-properties\" | \"available-nodes\" | \"none\";\n setActivePanel: (\n panel: \"node-properties\" | \"available-nodes\" | \"none\",\n ) => void;\n}>;\n\nexport function DesktopSidebarFragment({\n activePanel,\n setActivePanel,\n}: DesktopSidebarFragmentProps) {\n const [storeModalOpen, setStoreModalOpen] = useState(false);\n const [templatesModalOpen, setTemplatesModalOpen] = useState(false);\n\n // Configuration modal state\n const [configModalOpen, setConfigModalOpen] = useState(false);\n const [configTemplate, setConfigTemplate] = useState<StoreProduct | null>(\n null,\n );\n const [configContent, setConfigContent] =\n useState<WorkflowTemplateContent | null>(null);\n const [configNodeCheck, setConfigNodeCheck] =\n useState<TemplateNodeCheckResult | null>(null);\n const [importing, setImporting] = useState(false);\n\n const navigate = useNavigate();\n\n /**\n * Handle \"Use Template\" click from the TemplatesModal.\n *\n * Flow:\n * 1. Dynamically import the hooks (avoids static import resolution issues)\n * 2. Fetch full template detail (lazy load content)\n * 3. Parse content, check node dependencies\n * 4. If template has required inputs or missing nodes -> show config modal\n * 5. Otherwise -> import directly\n */\n const handleUseTemplate = useCallback(\n async (template: StoreProduct) => {\n try {\n // Dynamically import the hook to avoid Vite static analysis issues\n const { useImportWorkflowTemplate } =\n await import(\"../../../../../../../hooks/store/useImportWorkflowTemplate\");\n\n // We can't use hooks dynamically, so we'll use the module functions directly\n // Instead, we need to fetch the template detail inline\n const { useTemplateDetail } =\n await import(\"../../../../../../../hooks/store/useTemplateDetail\");\n\n // For now, use a simpler approach: pass template to config modal\n // which will handle the full import flow\n toast.loading(\"Loading template...\", { id: \"template-load\" });\n\n // Use the global store client to fetch template detail\n const { getGlobalStoreClient } =\n await import(\"../../../../../../../graphql/global-client\");\n const { gql } = await import(\"@apollo/client/core\");\n\n const GET_TEMPLATE_DETAIL = gql`\n query GetWorkflowTemplateDetail($id: ID!) {\n product(id: $id) {\n id\n name\n slug\n type\n description\n longDescription\n icon\n screenshots\n rating\n reviewCount\n downloads\n viewCount\n price\n pricingModel\n currency\n featured\n content\n manifest\n category\n tags\n compatibleProducts\n authorName\n publisher {\n id\n name\n isVerified\n }\n createdAt\n publishedAt\n }\n }\n `;\n\n const client = getGlobalStoreClient();\n if (!client) {\n toast.dismiss(\"template-load\");\n toast.error(\"Store client not available\");\n return;\n }\n\n const result = await client.query({\n query: GET_TEMPLATE_DETAIL,\n variables: { id: template.id },\n fetchPolicy: \"network-only\",\n });\n\n toast.dismiss(\"template-load\");\n\n const queryData = result.data as { product?: StoreProduct } | undefined;\n const fullTemplate = queryData?.product ?? null;\n if (!fullTemplate) {\n toast.error(\"Failed to load template details\");\n return;\n }\n\n // Parse content\n const content = fullTemplate.content as WorkflowTemplateContent | null;\n if (!content?.definitionJson) {\n toast.error(\"Template does not contain valid workflow data\");\n return;\n }\n\n // Check if we need configuration\n const needsConfig =\n (content.requiredInputs && content.requiredInputs.length > 0) ||\n (content.requiredNodeTypes && content.requiredNodeTypes.length > 0) ||\n (content.requiredCredentialTypes &&\n content.requiredCredentialTypes.length > 0);\n\n if (needsConfig) {\n // Show configuration modal\n setConfigTemplate(fullTemplate);\n setConfigContent(content);\n setConfigNodeCheck({\n installed: (content.requiredNodeTypes || []).filter(\n (n) => n.publishType === \"BUILTIN\",\n ),\n missing: (content.requiredNodeTypes || []).filter(\n (n) => n.publishType !== \"BUILTIN\" && !n.storeProductId,\n ),\n missingPaid: (content.requiredNodeTypes || []).filter(\n (n) => n.publishType === \"STORE\" && !!n.storeProductId,\n ),\n canImport: true,\n });\n setConfigModalOpen(true);\n setTemplatesModalOpen(false);\n } else {\n // Direct import (simple template)\n setTemplatesModalOpen(false);\n await performImport(fullTemplate, content);\n }\n } catch (err) {\n toast.dismiss(\"template-load\");\n toast.error(\"Something went wrong\", {\n description:\n err instanceof Error ? err.message : \"Failed to process template\",\n });\n }\n },\n [navigate],\n );\n\n /**\n * Perform the actual import of a template.\n */\n const performImport = useCallback(\n async (\n template: StoreProduct,\n content: WorkflowTemplateContent,\n overrides?: {\n name?: string;\n templateInputs?: Record<string, string | number>;\n },\n ) => {\n try {\n setImporting(true);\n toast.loading(\"Importing template...\", { id: \"template-import\" });\n\n // Apply template inputs if provided\n let definitionJson = JSON.parse(JSON.stringify(content.definitionJson));\n if (overrides?.templateInputs) {\n const { applyTemplateInputs } =\n await import(\"../../../../../../../utils/template-input-applicator\");\n definitionJson = applyTemplateInputs(\n definitionJson,\n overrides.templateInputs,\n );\n }\n\n // Get workspace client and config\n const { getFluidGridsClient } =\n await import(\"../../../../../../../graphql/client\");\n const { getFluidGridsConfig } =\n await import(\"../../../../../../../config\");\n const { gql } = await import(\"@apollo/client/core\");\n\n const IMPORT_MUTATION = gql`\n mutation ImportWorkflowTemplate(\n $input: ImportWorkflowTemplateInput!\n ) {\n importWorkflowTemplate(input: $input) {\n success\n message\n workflow {\n id\n workflowKey\n version\n name\n status\n }\n }\n }\n `;\n\n const config = getFluidGridsConfig();\n const client = getFluidGridsClient();\n\n const result = await client.mutate({\n mutation: IMPORT_MUTATION,\n variables: {\n input: {\n definitionJson,\n name:\n overrides?.name || content.defaultWorkflowName || template.name,\n description: template.description,\n sourceTemplateId: template.id,\n sourceTemplateName: template.name,\n tags: content.defaultTags || template.tags || [],\n category:\n content.defaultCategory || template.category || undefined,\n icon: template.icon || undefined,\n context: {\n ...(config.productId ? { productId: config.productId } : {}),\n ...(config.productName\n ? { productName: config.productName }\n : {}),\n },\n },\n },\n });\n\n toast.dismiss(\"template-import\");\n\n const importData = result.data as\n | {\n importWorkflowTemplate?: {\n success: boolean;\n message?: string;\n workflow?: {\n name: string;\n workflowKey: string;\n version: string;\n };\n };\n }\n | undefined;\n const importResult = importData?.importWorkflowTemplate;\n if (importResult?.success && importResult.workflow) {\n // Record installation in store (so template shows in /store/installed)\n // Uses the shared InstallWorkflowNodeDocument to avoid duplicate GQL definitions\n try {\n const { getGlobalStoreClient: getStoreClient } =\n await import(\"../../../../../../../graphql/global-client\");\n const { InstallWorkflowNodeDocument } =\n await import(\"../../../../../../../generated/global-operations\");\n\n const storeClient = getStoreClient();\n if (storeClient) {\n await storeClient.mutate({\n mutation: InstallWorkflowNodeDocument,\n variables: {\n input: {\n productId: template.id,\n workspaceId: config.workspaceId,\n organizationId: config.tenantId,\n version: template.manifestVersion || \"1.0.0\",\n manifest: template.manifest,\n metadata: {\n type: \"WORKFLOW\",\n sourceTemplateId: template.id,\n sourceTemplateName: template.name,\n importedWorkflowKey: importResult.workflow.workflowKey,\n importedWorkflowVersion: importResult.workflow.version,\n },\n },\n },\n });\n }\n } catch {\n // Best-effort: don't fail import if installation recording fails\n console.warn(\"[performImport] Failed to record app installation\");\n }\n\n toast.success(\"Workflow created from template!\", {\n description: `\"${importResult.workflow.name}\" is ready to edit`,\n });\n\n if (\n content.requiredCredentialTypes &&\n content.requiredCredentialTypes.length > 0\n ) {\n toast.info(\"Credentials needed\", {\n description: `Configure ${content.requiredCredentialTypes.join(\", \")} in the Credentials page`,\n duration: 6000,\n });\n }\n\n navigate(\n `../workflow/${importResult.workflow.workflowKey}/${importResult.workflow.version}`,\n );\n } else {\n toast.error(\"Failed to import template\", {\n description: importResult?.message || \"Unknown error during import\",\n });\n }\n } catch (err) {\n toast.dismiss(\"template-import\");\n toast.error(\"Import failed\", {\n description: err instanceof Error ? err.message : \"Unknown error\",\n });\n } finally {\n setImporting(false);\n }\n },\n [navigate],\n );\n\n /**\n * Handle confirm from the TemplateConfigurationModal.\n */\n const handleConfigConfirm = useCallback(\n async (config: {\n name: string;\n templateInputs: Record<string, string | number>;\n }) => {\n if (!configTemplate || !configContent) return;\n\n await performImport(configTemplate, configContent, {\n name: config.name,\n templateInputs: config.templateInputs,\n });\n\n setConfigModalOpen(false);\n },\n [configTemplate, configContent, performImport],\n );\n\n return (\n <div className=\"relative max-w-sm w-fit flex shrink-0 divide-x divide-card-foreground/10\">\n {activePanel !== \"none\" && (\n <div className=\"min-w-xs grow bg-card\">\n <SwitchSidebarPanel active={activePanel} />\n </div>\n )}\n\n <div className=\"shrink-0 bg-card p-1.5\">\n <div className=\"h-full flex flex-col gap-2\">\n <SidebarButtonItem\n active={activePanel === \"available-nodes\"}\n onClick={() =>\n setActivePanel(\n activePanel === \"available-nodes\" ? \"none\" : \"available-nodes\",\n )\n }\n title=\"Available Nodes\"\n >\n <Icon icon=\"mynaui:grid\" className=\"size-5\" />\n </SidebarButtonItem>\n\n <div className=\"mx-auto h-px w-4 bg-card-foreground/10\" />\n\n <SidebarButtonItem\n active={activePanel === \"node-properties\"}\n onClick={() =>\n setActivePanel(\n activePanel === \"node-properties\" ? \"none\" : \"node-properties\",\n )\n }\n title=\"Node Properties\"\n >\n <Icon icon=\"mynaui:layers-three\" className=\"size-5\" />\n </SidebarButtonItem>\n\n <div className=\"mx-auto h-px w-4 bg-card-foreground/10\" />\n\n <SidebarButtonItem\n active={storeModalOpen}\n onClick={() => setStoreModalOpen(true)}\n title=\"Browse custom nodes from the store\"\n >\n <Store className=\"size-5\" />\n </SidebarButtonItem>\n\n <SidebarButtonItem\n active={templatesModalOpen}\n onClick={() => setTemplatesModalOpen(true)}\n title=\"Browse workflow templates\"\n >\n <Sparkles className=\"size-5\" />\n </SidebarButtonItem>\n </div>\n </div>\n\n {/* Modals */}\n <StoreNodesModal open={storeModalOpen} onOpenChange={setStoreModalOpen} />\n <TemplatesModal\n open={templatesModalOpen}\n onOpenChange={setTemplatesModalOpen}\n onUseTemplate={handleUseTemplate}\n />\n\n {/* Configuration Modal (lazy loaded) */}\n {configModalOpen && (\n <Suspense fallback={null}>\n <LazyTemplateConfigurationModal\n open={configModalOpen}\n onOpenChange={setConfigModalOpen}\n template={configTemplate}\n content={configContent}\n nodeCheckResult={configNodeCheck}\n onConfirm={handleConfigConfirm}\n importing={importing}\n />\n </Suspense>\n )}\n </div>\n );\n}\n","import { useFlowStore } from \"../../../../../stores/flow-store\";\nimport { useShallow } from \"zustand/shallow\";\nimport { DesktopSidebarFragment } from \"./fragments/desktop-sidebar-fragment\";\n\nexport function SidebarModule() {\n const [activePanel, setActivePanel] = useFlowStore(\n useShallow((s) => [\n s.workflow.sidebar.active,\n s.actions.sidebar.setActivePanel,\n ]),\n );\n\n return (\n <DesktopSidebarFragment\n activePanel={activePanel}\n setActivePanel={setActivePanel}\n />\n );\n}\n","import { type KeyCode, useOnSelectionChange } from \"@xyflow/react\";\nimport { useState } from \"react\";\n\nexport function useDeleteKeyCode(): KeyCode | null {\n const [deleteKeyCode, setDeleteKeyCode] = useState<KeyCode | null>(null);\n\n useOnSelectionChange({\n onChange: ({ nodes }) => {\n if (nodes.length === 0) {\n setDeleteKeyCode([\"Backspace\", \"Delete\", \"Del\"]);\n } else {\n const areNodesNotDeletable = nodes.some(\n (node) => node.data.deletable === false,\n );\n setDeleteKeyCode(\n areNodesNotDeletable ? null : [\"Backspace\", \"Delete\", \"Del\"],\n );\n }\n },\n });\n\n return deleteKeyCode;\n}\n","import { useCallback } from \"react\";\nimport type { Node } from \"@xyflow/react\";\nimport { useFlowStore } from \"../stores/flow-store\";\nimport { useShallow } from \"zustand/shallow\";\n\nexport function useOnNodesDelete(nodes: Node[]) {\n const [nodePropertiesSelectedNode, nodePropertiesSetSelectedNode] =\n useFlowStore(\n useShallow((state) => [\n state.workflow.sidebar.panels.nodeProperties.selectedNode,\n state.actions.sidebar.panels.nodeProperties.setSelectedNode,\n ]),\n );\n\n return useCallback(\n (_: Node[]) => {\n if (\n nodePropertiesSelectedNode &&\n !nodes.find((node) => node.id === nodePropertiesSelectedNode.id)\n )\n nodePropertiesSetSelectedNode(null);\n },\n [nodePropertiesSelectedNode, nodePropertiesSetSelectedNode, nodes],\n );\n}\n","import { type Node, useReactFlow } from \"@xyflow/react\";\nimport { animate, easeOut } from \"popmotion\";\nimport { useCallback } from \"react\";\n\nconst NODE_MARGIN = 64;\nconst NODE_PADDING = 16;\n\ninterface NodeCoordinates {\n id: string;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\ninterface OverlappingNode {\n directions: {\n direction: \"left\" | \"right\" | \"top\" | \"bottom\";\n distance: number;\n }[];\n}\n\nfunction doesNodeOverlap(\n a: NodeCoordinates,\n b: NodeCoordinates,\n): OverlappingNode | false {\n const aAdj = {\n x: a.x - NODE_PADDING,\n y: a.y - NODE_PADDING,\n w: a.w + 2 * NODE_PADDING,\n h: a.h + 2 * NODE_PADDING,\n };\n const bAdj = {\n x: b.x - NODE_PADDING,\n y: b.y - NODE_PADDING,\n w: b.w + 2 * NODE_PADDING,\n h: b.h + 2 * NODE_PADDING,\n };\n\n const doesOverlap =\n aAdj.x < bAdj.x + bAdj.w &&\n aAdj.x + aAdj.w > bAdj.x &&\n aAdj.y < bAdj.y + bAdj.h &&\n aAdj.y + aAdj.h > bAdj.y;\n if (!doesOverlap) return false;\n\n const position: Record<\n OverlappingNode[\"directions\"][number][\"direction\"],\n number\n > = {\n top: a.y - b.h - NODE_MARGIN,\n bottom: a.y + a.h + NODE_MARGIN,\n left: a.x - b.w - NODE_MARGIN,\n right: a.x + a.w + NODE_MARGIN,\n };\n\n const directions = [\n { direction: \"left\", distance: Math.abs(b.x - position.left) },\n { direction: \"right\", distance: Math.abs(b.x - position.right) },\n { direction: \"top\", distance: Math.abs(b.y - position.top) },\n { direction: \"bottom\", distance: Math.abs(b.y - position.bottom) },\n ];\n\n directions.sort((a, b) => a.distance - b.distance);\n\n return { directions } as OverlappingNode;\n}\n\nfunction getOverlappingNodes(node: NodeCoordinates, nodes: NodeCoordinates[]) {\n return nodes.reduce(\n (acc, n) => {\n const overlap = doesNodeOverlap(node, n);\n if (overlap) {\n acc.push({ ...n, overlap });\n }\n return acc;\n },\n [] as (NodeCoordinates & { overlap: OverlappingNode })[],\n );\n}\n\nfunction moveNode(\n node: NodeCoordinates,\n direction: OverlappingNode[\"directions\"][number][\"direction\"],\n distance: number,\n): NodeCoordinates {\n const moveByDirection: Record<string, (pos: number) => number> = {\n left: (pos) => pos - distance,\n right: (pos) => pos + distance,\n top: (pos) => pos - distance,\n bottom: (pos) => pos + distance,\n };\n\n return {\n id: node.id,\n x:\n direction === \"left\" || direction === \"right\"\n ? moveByDirection[direction](node.x)\n : node.x,\n y:\n direction === \"top\" || direction === \"bottom\"\n ? moveByDirection[direction](node.y)\n : node.y,\n w: node.w,\n h: node.h,\n };\n}\n\ninterface BestMove {\n direction: \"left\" | \"right\" | \"top\" | \"bottom\";\n distance: number;\n count: number;\n}\n\nfunction getBestMove(\n overlapNode: ReturnType<typeof getOverlappingNodes>[number],\n allNodes: NodeCoordinates[],\n): OverlappingNode[\"directions\"][number] & { count: number } {\n return overlapNode.overlap.directions.reduce<BestMove>(\n (best, direction) => {\n const simulatedNode = moveNode(\n overlapNode,\n direction.direction,\n direction.distance,\n );\n const newOverlappingNodes = getOverlappingNodes(\n simulatedNode,\n allNodes.filter((n) => n.id !== simulatedNode.id),\n );\n const count = newOverlappingNodes.length;\n return count < best.count ? { ...direction, count } : best;\n },\n { direction: \"left\", distance: 0, count: Infinity },\n );\n}\n\nfunction applyMove(\n overlapNode: ReturnType<typeof getOverlappingNodes>[number],\n bestMove: OverlappingNode[\"directions\"][number],\n allNodes: NodeCoordinates[],\n movedNodes: Map<string, NodeCoordinates>,\n) {\n const movedNode = moveNode(\n overlapNode,\n bestMove.direction,\n bestMove.distance,\n );\n allNodes.forEach((n, index) => {\n if (n.id === overlapNode.id) {\n allNodes[index] = movedNode;\n }\n });\n movedNodes.set(overlapNode.id, movedNode);\n}\n\nfunction handleNodeOverlaps(\n node: NodeCoordinates,\n allNodes: NodeCoordinates[],\n movedNodes: Map<string, NodeCoordinates>,\n): boolean {\n const overlappingNodes = getOverlappingNodes(\n node,\n allNodes.filter((n) => n.id !== node.id),\n );\n if (overlappingNodes.length > 0) {\n for (const overlapNode of overlappingNodes) {\n const bestMove = getBestMove(overlapNode, allNodes);\n applyMove(overlapNode, bestMove, allNodes, movedNodes);\n }\n return true;\n }\n return false;\n}\n\nfunction handleOverlaps(\n allNodes: NodeCoordinates[],\n movedNodes: Map<string, NodeCoordinates>,\n): boolean {\n let hasOverlap = false;\n for (const currentNode of allNodes) {\n if (handleNodeOverlaps(currentNode, allNodes, movedNodes)) {\n hasOverlap = true;\n }\n }\n return hasOverlap;\n}\n\nfunction calculateCoordinates(\n node: NodeCoordinates,\n nodes: NodeCoordinates[],\n): NodeCoordinates[] {\n const allNodes = [node, ...nodes];\n const movedNodes = new Map<string, NodeCoordinates>();\n const MAX_ITERATIONS = 10000;\n let iterations = 0;\n\n let hasOverlap = true;\n while (hasOverlap && iterations < MAX_ITERATIONS) {\n hasOverlap = handleOverlaps(allNodes, movedNodes);\n iterations++;\n }\n\n if (iterations >= MAX_ITERATIONS) {\n console.warn(\"Max iterations reached, there may still be overlaps.\");\n }\n\n return Array.from(movedNodes.values());\n}\n\nexport function useNodeAutoAdjust() {\n const { getNodes, updateNode } = useReactFlow();\n\n return useCallback(\n (node: Node) => {\n const currentNodeCoordinates: NodeCoordinates = {\n id: node.id,\n x: node.position.x,\n y: node.position.y,\n w: node.measured?.width || 0,\n h: node.measured?.height || 0,\n };\n\n const nodes = getNodes().reduce<NodeCoordinates[]>((acc, n) => {\n if (n.id !== currentNodeCoordinates.id) {\n acc.push({\n id: n.id,\n x: n.position.x,\n y: n.position.y,\n w: n.measured?.width || 0,\n h: n.measured?.height || 0,\n });\n }\n return acc;\n }, []);\n\n const adjustedNodes = calculateCoordinates(currentNodeCoordinates, nodes);\n adjustedNodes.forEach(({ id, x, y }) => {\n const _node = getNodes().find((n) => n.id === id);\n\n animate({\n from: {\n x: _node?.position.x || 0,\n y: _node?.position.y || 0,\n },\n to: { x, y },\n duration: 200,\n ease: easeOut,\n onUpdate: ({ x, y }) => {\n updateNode(id, { position: { x, y } });\n },\n });\n });\n },\n [getNodes, updateNode],\n );\n}\n","import * as React from \"react\";\nimport {\n ThemeProvider as FeLibsThemeProvider,\n useTheme as useFeLibsTheme,\n} from \"@burdenoff/fe-libs/shared/providers/shell\";\n\ntype Theme = \"dark\" | \"light\" | \"system\";\n\nexport interface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: Theme;\n storageKey?: string;\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n storageKey = \"vite-ui-theme\",\n}: ThemeProviderProps) {\n // One-time cleanup of legacy storage\n React.useEffect(() => {\n if (typeof window !== \"undefined\") {\n try {\n localStorage.removeItem(storageKey);\n } catch (err) {\n // localStorage may be unavailable in some environments (e.g., Safari private mode)\n console.warn(\"Failed to clean up legacy theme storage:\", err);\n }\n }\n }, [storageKey]);\n\n return (\n <FeLibsThemeProvider defaultMode={defaultTheme}>\n {children}\n </FeLibsThemeProvider>\n );\n}\n\n// Re-export useTheme from fe-libs\nexport const useTheme = useFeLibsTheme;\n","import type { DataConfig } from \"./data-config-context\";\n\n// GraphQL Schema types (simplified)\ninterface GraphQLSchemaType {\n name: string;\n kind: string;\n fields?: Record<string, GraphQLSchemaField>;\n inputFields?: Record<string, GraphQLSchemaField>;\n}\n\ninterface GraphQLSchemaField {\n name: string;\n type: string;\n isNonNull?: boolean;\n isList?: boolean;\n args?: GraphQLSchemaArg[];\n}\n\ninterface GraphQLSchemaArg {\n name: string;\n type: string;\n isNonNull?: boolean;\n isList?: boolean;\n}\n\ninterface ParsedSchema {\n types: Record<string, GraphQLSchemaType>;\n queryType: string | null;\n mutationType: string | null;\n subscriptionType: string | null;\n}\n\n// Operation info\ninterface OperationInfo {\n name: string;\n type: \"query\" | \"mutation\";\n returnType: string;\n stateType: string | null;\n inputType: string | null;\n}\n\n// Node type info\ninterface NodeTypeInfo {\n displayName: string;\n schema: string;\n inputTypes: string[];\n operations: OperationInfo[];\n}\n\n// Node types structure\ninterface NodeTypes {\n sourceNodes: Record<string, NodeTypeInfo>;\n targetNodes: Record<string, NodeTypeInfo>;\n}\n\n// Runtime configuration state\nlet parsedSchemas: Record<string, ParsedSchema> = {};\nlet nodeTypes: NodeTypes | null = null;\nlet typeCompatibility: Record<string, string[]> | null = null;\nlet sampleData: Record<string, unknown> | null = null;\nlet nodeStyles: Record<string, { source?: string; target?: string }> | null =\n null;\nconst edgeStyles: Record<string, string> = {};\nlet currentConfig: DataConfig | null = null;\n\n// Initialize the configuration with parsed schemas and data config\nexport function initializeConfig(\n schemas: Record<string, ParsedSchema>,\n dataConfig: DataConfig,\n) {\n parsedSchemas = schemas;\n currentConfig = dataConfig;\n\n // Generate node types\n generateNodeTypes(dataConfig);\n\n // Generate type compatibility\n generateTypeCompatibilityFunc(dataConfig);\n\n // Generate sample data\n generateSampleDataFunc(dataConfig);\n\n // Generate visual styles\n generateVisualStylesFunc(dataConfig);\n}\n\nfunction generateNodeTypes(dataConfig: DataConfig) {\n const newNodeTypes: NodeTypes = {\n sourceNodes: {},\n targetNodes: {},\n };\n\n // Add nodes from the provided configuration\n Object.entries(dataConfig.nodes).forEach(([nodeKey, nodeInfo]) => {\n const category = nodeInfo.category;\n\n // Handle nodes with category \"source\" or \"both\"\n if (category === \"source\" || category === \"both\") {\n newNodeTypes.sourceNodes[nodeKey] = {\n displayName: nodeInfo.displayName,\n schema: nodeKey,\n inputTypes: [],\n operations: [],\n };\n }\n\n // Handle nodes with category \"target\" or \"both\"\n if (category === \"target\" || category === \"both\") {\n newNodeTypes.targetNodes[nodeKey] = {\n displayName: nodeInfo.displayName,\n schema: nodeKey,\n inputTypes: [],\n operations: [],\n };\n }\n\n // Add the schema to parsedSchemas if it doesn't exist\n if (!parsedSchemas[nodeKey]) {\n }\n\n // Find all operations with state arguments in this schema\n const schema = parsedSchemas[nodeKey];\n if (schema) {\n const operations = findOperationsWithStateArgs(schema);\n // Extract input types from operations\n const inputTypes = operations\n .map((op) => op.stateType)\n .filter((type): type is string => type !== null);\n\n // Add operations to both source and target nodes if category is \"both\"\n if (category === \"both\") {\n // Add to source nodes\n newNodeTypes.sourceNodes[nodeKey].inputTypes = [...new Set(inputTypes)];\n newNodeTypes.sourceNodes[nodeKey].operations = operations;\n\n // Add to target nodes\n newNodeTypes.targetNodes[nodeKey].inputTypes = [...new Set(inputTypes)];\n newNodeTypes.targetNodes[nodeKey].operations = operations;\n } else if (category === \"source\") {\n newNodeTypes.sourceNodes[nodeKey].inputTypes = [...new Set(inputTypes)];\n newNodeTypes.sourceNodes[nodeKey].operations = operations;\n } else if (category === \"target\") {\n newNodeTypes.targetNodes[nodeKey].inputTypes = [...new Set(inputTypes)];\n newNodeTypes.targetNodes[nodeKey].operations = operations;\n }\n }\n });\n\n nodeTypes = newNodeTypes;\n}\n\n// Update the findOperationsWithStateArgs function to handle more generic schemas\nexport function findOperationsWithStateArgs(\n schema: ParsedSchema,\n): OperationInfo[] {\n const operations: OperationInfo[] = [];\n // Check Query type operations\n if (schema.queryType) {\n const queryType = schema.types[schema.queryType];\n if (queryType && queryType.fields) {\n for (const fieldName in queryType.fields) {\n const field = queryType.fields[fieldName];\n\n // Skip introspection fields\n if (fieldName === \"__schema\" || fieldName === \"__type\") continue;\n // First try to find state and context arguments (specific format)\n const stateArg =\n field.args &&\n field.args.find((arg: GraphQLSchemaArg) => arg.name === \"state\");\n const contextArg =\n field.args &&\n field.args.find((arg: GraphQLSchemaArg) => arg.name === \"context\");\n\n const hasStateArg = !!stateArg;\n const hasContextArg = !!contextArg;\n\n // Include operations that have both context and state arguments\n if (hasStateArg && hasContextArg) {\n operations.push({\n name: fieldName,\n type: \"query\",\n returnType: field.type,\n stateType: stateArg.type,\n inputType: stateArg.type,\n });\n }\n // If no state/context args, but has other args, use those\n else if (field.args && field.args.length > 0) {\n // Use the first argument as input type\n const firstArg = field.args[0];\n operations.push({\n name: fieldName,\n type: \"query\",\n returnType: field.type,\n stateType: firstArg.type,\n inputType: firstArg.type,\n });\n }\n // If no args at all, still include it as a simple operation\n else {\n operations.push({\n name: fieldName,\n type: \"query\",\n returnType: field.type,\n stateType: null,\n inputType: null,\n });\n }\n }\n } else {\n console.warn(`Query type ${schema.queryType} not found or has no fields`);\n }\n } else {\n }\n\n // Check Mutation type operations\n if (schema.mutationType) {\n const mutationType = schema.types[schema.mutationType];\n if (mutationType && mutationType.fields) {\n for (const fieldName in mutationType.fields) {\n const field = mutationType.fields[fieldName];\n // First try to find state and context arguments (specific format)\n const stateArg =\n field.args &&\n field.args.find((arg: GraphQLSchemaArg) => arg.name === \"state\");\n const contextArg =\n field.args &&\n field.args.find((arg: GraphQLSchemaArg) => arg.name === \"context\");\n\n const hasStateArg = !!stateArg;\n const hasContextArg = !!contextArg;\n\n // Include operations that have both context and state arguments\n if (hasStateArg && hasContextArg) {\n operations.push({\n name: fieldName,\n type: \"mutation\",\n returnType: field.type,\n stateType: stateArg.type,\n inputType: stateArg.type,\n });\n }\n // If no state/context args, but has other args, use those\n else if (field.args && field.args.length > 0) {\n // Use the first argument as input type\n const firstArg = field.args[0];\n operations.push({\n name: fieldName,\n type: \"mutation\",\n returnType: field.type,\n stateType: firstArg.type,\n inputType: firstArg.type,\n });\n }\n // If no args at all, still include it as a simple operation\n else {\n operations.push({\n name: fieldName,\n type: \"mutation\",\n returnType: field.type,\n stateType: null,\n inputType: null,\n });\n }\n }\n } else {\n console.warn(\n `Mutation type ${schema.mutationType} not found or has no fields`,\n );\n }\n } else {\n }\n return operations;\n}\n\n// Generate type compatibility from the provided configuration\nfunction generateTypeCompatibilityFunc(dataConfig: DataConfig) {\n typeCompatibility = dataConfig.typeCompatibility;\n}\n\n// Generate sample data from the provided configuration\nfunction generateSampleDataFunc(dataConfig: DataConfig) {\n sampleData = dataConfig.sampleData;\n}\n\n// Generate visual styles from the provided configuration\nfunction generateVisualStylesFunc(dataConfig: DataConfig) {\n const newNodeStyles: Record<string, { source?: string; target?: string }> =\n {};\n\n Object.entries(dataConfig.nodes).forEach(([nodeKey, nodeInfo]) => {\n newNodeStyles[nodeKey] = nodeInfo.style || {};\n });\n\n nodeStyles = newNodeStyles;\n}\n\n// Get all available node types for display\nexport function getAllNodeTypes(dataConfig: DataConfig) {\n if (!nodeTypes) {\n // Return node types from the provided configuration\n const result: Record<string, string> = {};\n\n Object.entries(dataConfig.nodes).forEach(([key, value]) => {\n result[key] = value.displayName;\n });\n\n return result;\n }\n\n const result: Record<string, string> = {};\n\n // Add source nodes\n Object.entries(nodeTypes.sourceNodes).forEach(\n ([key, value]: [string, NodeTypeInfo]) => {\n result[key] = value.displayName;\n },\n );\n\n // Add target nodes\n Object.entries(nodeTypes.targetNodes).forEach(\n ([key, value]: [string, NodeTypeInfo]) => {\n result[key] = value.displayName;\n },\n );\n\n return result;\n}\n\nexport function getTransformFunctions() {\n return currentConfig?.mappingTypes.transform.functions || [];\n}\n\nexport function getCastTypes() {\n return currentConfig?.mappingTypes.cast.types || [];\n}\n\nexport function getExpressionExamples() {\n return currentConfig?.mappingTypes.expression.examples || [];\n}\n\nexport function getArrayExamples() {\n return currentConfig?.mappingTypes.array?.examples || [];\n}\n\nexport function getObjectExamples() {\n return currentConfig?.mappingTypes.object?.examples || [];\n}\n\nexport function getContextExamples() {\n return currentConfig?.mappingTypes.context?.examples || [];\n}\n\nexport function getDirectExamples() {\n return currentConfig?.mappingTypes.direct?.examples || [];\n}\n\nexport function getSafeBuiltins() {\n return currentConfig?.mappingTypes.expression.safeBuiltins || [];\n}\n\n// Get examples for any mapping type\nexport function getExamplesForMappingType(mappingType: string) {\n return currentConfig?.mappingTypes[mappingType]?.examples || [];\n}\n\nexport function getEdgeColor(mappingType: string, compatible = true) {\n const colorConfig = currentConfig?.mappingTypes[mappingType]?.color;\n if (!colorConfig) return null;\n return typeof colorConfig === \"string\"\n ? colorConfig\n : compatible\n ? colorConfig.compatible\n : colorConfig.incompatible;\n}\n\nexport function getSampleDataForOperation(operation: string) {\n return sampleData?.[operation];\n}\n\nexport function getReturnTypeForOperation(\n nodeType: string,\n operationName: string,\n) {\n const node =\n nodeTypes?.targetNodes[nodeType] || nodeTypes?.sourceNodes[nodeType];\n const operation = node?.operations?.find(\n (op: OperationInfo) => op.name === operationName,\n );\n return operation?.returnType;\n}\n\nexport function getOperationsForNodeType(nodeType: string) {\n const node =\n nodeTypes?.targetNodes[nodeType] || nodeTypes?.sourceNodes[nodeType];\n return node?.operations || [];\n}\n\nexport function getNodeStyle(\n nodeType: string,\n side?: string,\n): string | { source?: string; target?: string } {\n if (!nodeStyles || !nodeStyles[nodeType]) return \"\";\n const styles = nodeStyles[nodeType];\n if (side) {\n return (side === \"source\" ? styles.source : styles.target) || \"\";\n }\n return styles;\n}\n\nexport function getInputTypeForOperation(\n nodeType: string,\n operationName: string,\n) {\n const node =\n nodeTypes?.targetNodes[nodeType] || nodeTypes?.sourceNodes[nodeType];\n const operation = node?.operations?.find(\n (op: OperationInfo) => op.name === operationName,\n );\n return operation?.inputType;\n}\n\nexport function getTypeCompatibility() {\n return typeCompatibility || {};\n}\n","import { getTypeCompatibility } from \"../mapper/config/data\";\n\n// Helper function to check if two GraphQL types are compatible for mapping\nexport function areTypesCompatible(\n sourceType: string,\n targetType: string,\n): boolean {\n // Clean up type names (remove non-null and list markers)\n const cleanSourceType = sourceType\n .replace(/!$/, \"\")\n .replace(/^\\[/, \"\")\n .replace(/\\]!?$/, \"\");\n const cleanTargetType = targetType.replace(/!$/, \"\").replace(/\\]!?$/, \"\");\n\n // Check if types are exactly the same\n if (cleanSourceType === cleanTargetType) {\n return true;\n }\n\n // Get type compatibility rules\n const typeCompatibility = getTypeCompatibility();\n\n // Check if the target type is in the list of compatible types for the source type\n return typeCompatibility[cleanSourceType]?.includes(cleanTargetType) || false;\n}\n\n// Helper function to get a human-readable type name\nexport function getReadableTypeName(type: string): string {\n const isNonNull = type.endsWith(\"!\");\n const isList = type.includes(\"[\");\n const cleanType = type\n .replace(/!$/, \"\")\n .replace(/^\\[/, \"\")\n .replace(/\\]!?$/, \"\");\n\n let result = cleanType;\n\n if (isList) {\n result = `Array of ${result}`;\n }\n\n if (isNonNull) {\n result = `${result} (Required)`;\n }\n\n return result;\n}\n","import { memo } from \"react\";\nimport { Handle, Position } from \"@xyflow/react\";\nimport { Card, CardContent } from \"@burdenoff/fe-libs/ui\";\nimport { Badge } from \"@burdenoff/fe-libs/ui\";\nimport { getReadableTypeName } from \"../lib/type-utils\";\nimport { getNodeStyle } from \"./config/data\";\n\nexport interface SchemaNodeData {\n label: string;\n type: string;\n path: string;\n side: \"source\" | \"target\";\n isRequired: boolean;\n isNested: boolean;\n isArray: boolean;\n nodeType?: string;\n category?: string;\n}\n\ninterface SchemaNodeProps {\n data: SchemaNodeData;\n isConnectable?: boolean;\n}\n\nexport const SchemaNode = memo(({ data, isConnectable }: SchemaNodeProps) => {\n const {\n label,\n type,\n side,\n isRequired,\n isNested,\n isArray,\n nodeType,\n category,\n } = data;\n const readableType = getReadableTypeName(type);\n\n // Determine node color based on node type\n const borderColor = getNodeStyle(nodeType || \"\", side);\n const bgColor =\n side === \"source\"\n ? \"bg-surface hover:bg-[var(--color-bg-accent)]/10 transition-colors duration-200\"\n : \"bg-surface hover:bg-[var(--color-status-success-bg-subtle)] transition-colors duration-200\";\n\n // Determine category color\n const categoryColor = getCategoryColor(category);\n\n return (\n <Card\n className={`w-56 shadow-sm ${borderColor} ${bgColor} transition-colors duration-200`}\n >\n <div className={`flex items-center px-2 py-1 border-b ${categoryColor}`}>\n <div className=\"flex-1 font-medium text-xs truncate\" title={label}>\n {label}\n </div>\n <div className=\"flex gap-1 flex-shrink-0\">\n {isRequired && (\n <Badge variant=\"destructive\" className=\"text-[10px] px-1 py-0\">\n Req\n </Badge>\n )}\n {isArray && (\n <Badge variant=\"secondary\" className=\"text-[10px] px-1 py-0\">\n Array\n </Badge>\n )}\n {isNested && (\n <Badge variant=\"outline\" className=\"text-[10px] px-1 py-0\">\n Obj\n </Badge>\n )}\n </div>\n </div>\n <CardContent className=\"p-1 text-[10px] text-muted-foreground\">\n <div className=\"flex justify-between items-center\">\n <span title={readableType}>{readableType}</span>\n {category && (\n <Badge\n variant=\"outline\"\n className=\"text-[10px] px-1 py-0\"\n style={{ backgroundColor: getCategoryBgColor(category) }}\n >\n {category}\n </Badge>\n )}\n </div>\n </CardContent>\n\n {side === \"source\" ? (\n <Handle\n type=\"source\"\n position={Position.Right}\n isConnectable={isConnectable}\n className=\"w-2 h-2 bg-accent transition-transform hover:scale-125\"\n />\n ) : (\n <Handle\n type=\"target\"\n position={Position.Left}\n isConnectable={isConnectable}\n className=\"w-2 h-2 bg-[var(--color-status-success-bg)] transition-transform hover:scale-125\"\n />\n )}\n </Card>\n );\n});\n\n// Helper function to get category colors\nfunction getCategoryColor(category?: string): string {\n if (!category) return \"\";\n\n switch (category.toLowerCase()) {\n case \"input\":\n return \"border-[var(--color-border-accent)]/50 bg-[var(--color-bg-accent)]/10\";\n case \"metadata\":\n return \"border-[var(--color-status-warning-border)]/50 bg-[var(--color-status-warning-bg-subtle)]\";\n case \"context\":\n return \"border-[var(--color-status-success-border)]/50 bg-[var(--color-status-success-bg-subtle)]\";\n case \"output\":\n return \"border-[var(--color-border-accent)]/30 bg-[var(--color-bg-accent)]/5\";\n case \"config\":\n return \"border-[var(--color-status-error-border)]/50 bg-[var(--color-status-error-bg-subtle)]\";\n default:\n return \"border-default\";\n }\n}\n\nfunction getCategoryBgColor(category: string): string {\n switch (category.toLowerCase()) {\n case \"input\":\n return \"rgba(199, 210, 254, 0.3)\"; // indigo-100 with opacity\n case \"metadata\":\n return \"rgba(253, 230, 138, 0.3)\"; // amber-100 with opacity\n case \"context\":\n return \"rgba(167, 243, 208, 0.3)\"; // emerald-100 with opacity\n case \"output\":\n return \"rgba(186, 230, 253, 0.3)\"; // sky-100 with opacity\n case \"config\":\n return \"rgba(254, 205, 211, 0.3)\"; // rose-100 with opacity\n default:\n return \"rgba(229, 231, 235, 0.3)\"; // gray-200 with opacity\n }\n}\n\nSchemaNode.displayName = \"SchemaNode\";\n","import { memo } from \"react\";\nimport { getBezierPath, type Position } from \"@xyflow/react\";\nimport { getEdgeColor } from \"./config/data\";\n\ninterface MappingEdgeData {\n mappingType?: \"direct\" | \"expression\" | \"transform\" | \"loop\" | \"cast\";\n isCompatible?: boolean;\n mappingData?: { function?: string; type?: string };\n}\n\ninterface MappingEdgeProps {\n id: string;\n sourceX: number;\n sourceY: number;\n targetX: number;\n targetY: number;\n sourcePosition: Position;\n targetPosition: Position;\n data?: MappingEdgeData;\n style?: React.CSSProperties;\n markerEnd?: string;\n}\n\nexport const MappingEdge = memo(\n ({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n data,\n style = {},\n markerEnd,\n }: MappingEdgeProps) => {\n const [edgePath, labelX, labelY] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n const mappingType = data?.mappingType || \"direct\";\n const isCompatible = data?.isCompatible !== false; // Default to true if not specified\n\n let mappingLabel = \"\";\n const mappingColor = getEdgeColor(mappingType, isCompatible) || \"#888\";\n\n // Set the label based on mapping type\n switch (mappingType) {\n case \"direct\":\n mappingLabel = \"Direct\";\n break;\n case \"expression\":\n mappingLabel = \"Expression\";\n break;\n case \"transform\":\n // If we have function data, show the function name\n mappingLabel = data?.mappingData?.function\n ? `Transform: ${data.mappingData.function}`\n : \"Transform\";\n break;\n case \"loop\":\n mappingLabel = \"Loop\";\n break;\n case \"cast\":\n // If we have type data, show the cast type\n mappingLabel = data?.mappingData?.type\n ? `Cast: ${data.mappingData.type}`\n : \"Cast\";\n break;\n }\n\n return (\n <>\n <path\n id={id}\n style={{ ...style, stroke: mappingColor, strokeWidth: 2 }}\n className=\"react-flow__edge-path\"\n d={edgePath}\n markerEnd={markerEnd}\n />\n <foreignObject\n width={120}\n height={40}\n x={labelX - 60}\n y={labelY - 20}\n className=\"overflow-visible\"\n >\n <div className=\"flex items-center justify-center bg-surface border border-default rounded-md shadow-sm px-2 py-1\">\n <span\n className=\"text-xs font-medium\"\n style={{ color: mappingColor }}\n >\n {mappingLabel}\n {!isCompatible && mappingType === \"direct\" && \" ⚠️\"}\n </span>\n </div>\n </foreignObject>\n </>\n );\n },\n);\n\nMappingEdge.displayName = \"MappingEdge\";\n","import { memo, type ReactNode } from \"react\";\n\nexport interface NodeGroupData {\n label: string;\n nodeType: string;\n side: \"source\" | \"target\";\n}\n\ninterface NodeGroupProps {\n data: NodeGroupData;\n children?: ReactNode;\n}\n\nexport const NodeGroup = memo(({ data, children }: NodeGroupProps) => {\n const { label, nodeType, side } = data;\n\n // Determine styling based on side (source or target)\n const bgColor =\n side === \"source\"\n ? \"bg-[var(--color-bg-accent)]/10\"\n : \"bg-[var(--color-status-success-bg-subtle)]\";\n const borderColor =\n side === \"source\"\n ? \"border-[var(--color-border-accent)]\"\n : \"border-[var(--color-status-success-border)]\";\n const textColor =\n side === \"source\"\n ? \"text-accent\"\n : \"text-[var(--color-status-success-text)]\";\n const gradientColor =\n side === \"source\"\n ? \"from-[var(--color-bg-accent)]/20 to-transparent\"\n : \"from-[var(--color-status-success-bg-subtle)]/50 to-transparent\";\n\n return (\n <div\n className={`px-4 pt-12 pb-4 rounded-lg border-2 ${borderColor} ${bgColor} min-w-[400px] min-h-[600px] shadow-md relative overflow-visible bg-gradient-to-b ${gradientColor}`}\n style={{ minHeight: \"600px\" }}\n >\n <div\n className={`absolute top-0 left-0 right-0 ${textColor} font-semibold p-2 border-b ${borderColor} text-center bg-surface/70 backdrop-blur-sm rounded-t-lg flex items-center justify-center`}\n >\n <div className=\"text-sm\">\n {label} <span className=\"text-xs opacity-75\">({nodeType})</span>\n </div>\n </div>\n <div className=\"relative w-full h-full overflow-visible\">{children}</div>\n </div>\n );\n});\n\nNodeGroup.displayName = \"NodeGroup\";\n","import type {\n GraphQLSchema,\n GeneratedNodes,\n SchemaNodeData,\n GraphQLField,\n} from \"./types\";\n\n// Field definition from schema\ninterface FieldDefinition {\n name?: string;\n type: string;\n isNonNull?: boolean;\n isList?: boolean;\n args?: Array<{\n name: string;\n type: string;\n isNonNull?: boolean;\n isList?: boolean;\n }>;\n}\n\n// Processed target field definition\ninterface ProcessedTargetField {\n name: string;\n type: string;\n isNonNull: boolean;\n isList: boolean;\n args: Array<{\n name: string;\n type: string;\n isNonNull?: boolean;\n isList?: boolean;\n }>;\n}\n\n/**\n * Find the return type for an operation directly from the schema\n */\nfunction findReturnTypeFromSchema(\n schema: GraphQLSchema,\n operationName: string,\n): string | null {\n // Check Query type\n if (\n schema.queryType &&\n schema.types[schema.queryType]?.fields[operationName]\n ) {\n return schema.types[schema.queryType].fields[operationName].type;\n }\n // Check Mutation type\n if (\n schema.mutationType &&\n schema.types[schema.mutationType]?.fields[operationName]\n ) {\n return schema.types[schema.mutationType].fields[operationName].type;\n }\n return null;\n}\n\n/**\n * Find the input type for an operation directly from the schema\n * Returns either a type name (string) or the field object if args should be used directly\n */\ninterface OperationField {\n type: string;\n args?: Array<{\n name: string;\n type: string;\n isNonNull?: boolean;\n isList?: boolean;\n }>;\n}\n\nfunction findInputTypeFromSchema(\n schema: GraphQLSchema,\n operationName: string,\n): {\n typeName: string | null;\n useArgsDirectly: boolean;\n field: OperationField | null;\n} {\n let field: OperationField | null = null;\n\n // Check Query type\n if (\n schema.queryType &&\n schema.types[schema.queryType]?.fields[operationName]\n ) {\n field = schema.types[schema.queryType].fields[operationName];\n }\n // Check Mutation type\n if (\n !field &&\n schema.mutationType &&\n schema.types[schema.mutationType]?.fields[operationName]\n ) {\n field = schema.types[schema.mutationType].fields[operationName];\n }\n\n if (!field) {\n return { typeName: null, useArgsDirectly: false, field: null };\n }\n\n // Look for 'state' or 'input' argument that wraps all inputs\n const stateArg = field.args?.find(\n (a) => a.name === \"state\" || a.name === \"input\",\n );\n if (stateArg) {\n // Check if this type exists and has inputFields\n const inputType = schema.types[stateArg.type];\n if (inputType && (inputType.inputFields || inputType.fields)) {\n return { typeName: stateArg.type, useArgsDirectly: false, field };\n }\n }\n\n // If the first arg is an input type, use that\n if (field.args && field.args.length > 0) {\n const firstArg = field.args[0];\n const firstArgType = schema.types[firstArg.type];\n if (\n firstArgType &&\n firstArgType.kind === \"input\" &&\n (firstArgType.inputFields || firstArgType.fields)\n ) {\n return { typeName: firstArg.type, useArgsDirectly: false, field };\n }\n }\n\n // If no wrapper input type found, use the mutation/query args directly\n if (field.args && field.args.length > 0) {\n return { typeName: null, useArgsDirectly: true, field };\n }\n\n return { typeName: null, useArgsDirectly: false, field: null };\n}\n\n/**\n * Generate schema nodes for visual mapping\n */\nexport function generateSchemaNodes(\n sourceSchema: GraphQLSchema,\n sourceNode: string,\n sourceOperation: string,\n targetSchema: GraphQLSchema,\n targetNode: string,\n targetOperation: string,\n): GeneratedNodes {\n const nodes: SchemaNodeData[] = [];\n const edges: unknown[] = [];\n // Debug: Log mutation type fields if available\n if (\n targetSchema?.mutationType &&\n targetSchema?.types[targetSchema.mutationType]\n ) {\n const mutationField =\n targetSchema.types[targetSchema.mutationType].fields?.[targetOperation];\n // Check if input types exist for mutation args\n if (mutationField?.args) {\n for (const arg of mutationField.args) {\n const argType = targetSchema.types[arg.type];\n if (argType?.inputFields) {\n // Input type fields available for this arg\n }\n }\n }\n }\n\n // Get source operation output type directly from schema\n let sourceOutputType: { fields: Record<string, FieldDefinition> } | null =\n null;\n const sourceReturnTypeName = findReturnTypeFromSchema(\n sourceSchema,\n sourceOperation,\n );\n\n if (sourceReturnTypeName) {\n sourceOutputType = sourceSchema.types[sourceReturnTypeName];\n }\n\n // If no operation found, try to find any type with fields (fallback for simple schemas)\n if (!sourceOutputType) {\n // Look for a type that looks like an output type\n for (const typeName of Object.keys(sourceSchema.types)) {\n const type = sourceSchema.types[typeName];\n if (\n type.kind === \"type\" &&\n type.fields &&\n Object.keys(type.fields).length > 0\n ) {\n // Skip Query/Mutation/Subscription types\n if (\n typeName === sourceSchema.queryType ||\n typeName === sourceSchema.mutationType ||\n typeName === sourceSchema.subscriptionType\n ) {\n continue;\n }\n sourceOutputType = type;\n break;\n }\n }\n }\n\n // Get target input type directly from schema\n let targetInputType: {\n inputFields?: Record<string, GraphQLField>;\n fields?: Record<string, GraphQLField>;\n } | null = null;\n let useArgsDirectlyForTarget = false;\n let targetOperationField: OperationField | null = null;\n const targetInputResult = findInputTypeFromSchema(\n targetSchema,\n targetOperation,\n );\n\n if (targetInputResult.typeName) {\n targetInputType = targetSchema.types[targetInputResult.typeName];\n } else if (targetInputResult.useArgsDirectly && targetInputResult.field) {\n // Use the mutation/query args directly as target fields\n useArgsDirectlyForTarget = true;\n targetOperationField = targetInputResult.field;\n }\n\n // If no operation found, try to find any input type (fallback)\n if (!targetInputType && !useArgsDirectlyForTarget) {\n for (const typeName of Object.keys(targetSchema.types)) {\n const type = targetSchema.types[typeName];\n if (type.kind === \"input\" && (type.inputFields || type.fields)) {\n targetInputType = type;\n break;\n }\n }\n }\n // Debug: Log targetInputResult details\n // Add group nodes for source and target with more space between them\n // Position source group on the left and target group on the right with ample space\n const sourceGroupNode: SchemaNodeData = {\n id: \"source-group\",\n type: \"nodeGroup\",\n position: { x: 50, y: 50 },\n style: { width: 450, height: 800 },\n data: {\n label: `Source: ${sourceOperation}`,\n nodeType: sourceNode,\n side: \"source\" as const,\n },\n };\n\n const targetGroupNode: SchemaNodeData = {\n id: \"target-group\",\n type: \"nodeGroup\",\n position: { x: 650, y: 50 }, // Increased x position to add more space\n style: { width: 450, height: 800 },\n data: {\n label: `Target: ${targetOperation}`,\n nodeType: targetNode,\n side: \"target\" as const,\n },\n };\n\n nodes.push(sourceGroupNode, targetGroupNode);\n\n // Generate nodes for source fields (output type)\n // Starting Y position for fields - account for the NodeGroup header (pt-12 = 48px + some padding)\n const yPos = 70;\n const sourceFields = sourceOutputType?.fields || {};\n if (Object.keys(sourceFields).length === 0) {\n console.warn(\"No source fields found for\", sourceNode, sourceOperation);\n\n // Add a placeholder node if no fields are found\n nodes.push({\n id: `source-placeholder`,\n position: { x: 100, y: 70 },\n data: {\n label: \"No fields available\",\n type: \"String\",\n path: \"placeholder\",\n side: \"source\",\n isRequired: false,\n isNested: false,\n isArray: false,\n nodeType: sourceNode,\n },\n type: \"schemaNode\",\n parentId: \"source-group\",\n extent: \"parent\",\n });\n }\n\n // Update the generateFieldNodes function to categorize fields\n const generateFieldNodes = (\n fields: Record<string, FieldDefinition>,\n parentPath = \"\",\n xPos: number,\n startYPos: number,\n side: \"source\" | \"target\",\n parentNodeType: string,\n schema: GraphQLSchema,\n ): SchemaNodeData[] => {\n let currentYPos = startYPos;\n const generatedNodes: SchemaNodeData[] = [];\n // Use different x offsets based on side - target nodes need to be positioned inside target group\n const xOffset = 100;\n\n // Group fields by category\n const categorizedFields: Record<string, Record<string, FieldDefinition>> = {\n input: {},\n metadata: {},\n context: {},\n output: {},\n config: {},\n other: {},\n };\n\n // Categorize fields based on naming patterns\n for (const fieldName in fields) {\n const field = fields[fieldName];\n // Categorize based on field name patterns\n if (\n fieldName.toLowerCase().includes(\"input\") ||\n fieldName.toLowerCase().includes(\"request\")\n ) {\n categorizedFields.input[fieldName] = field;\n } else if (\n fieldName.toLowerCase().includes(\"metadata\") ||\n fieldName.toLowerCase().includes(\"meta\")\n ) {\n categorizedFields.metadata[fieldName] = field;\n } else if (\n fieldName.toLowerCase().includes(\"context\") ||\n fieldName.toLowerCase().includes(\"ctx\")\n ) {\n categorizedFields.context[fieldName] = field;\n } else if (\n fieldName.toLowerCase().includes(\"output\") ||\n fieldName.toLowerCase().includes(\"response\") ||\n fieldName.toLowerCase().includes(\"result\")\n ) {\n categorizedFields.output[fieldName] = field;\n } else if (\n fieldName.toLowerCase().includes(\"config\") ||\n fieldName.toLowerCase().includes(\"setting\") ||\n fieldName.toLowerCase().includes(\"option\")\n ) {\n categorizedFields.config[fieldName] = field;\n } else {\n categorizedFields.other[fieldName] = field;\n }\n }\n // Process each category\n const categories = Object.keys(categorizedFields);\n for (const category of categories) {\n const categoryFields = categorizedFields[category];\n\n // Skip empty categories\n if (Object.keys(categoryFields).length === 0) continue;\n\n // Add spacing between categories\n if (generatedNodes.length > 0) {\n currentYPos += 20;\n }\n\n // Process fields in this category\n for (const fieldName in categoryFields) {\n const field = categoryFields[fieldName];\n const fullPath = parentPath ? `${parentPath}.${fieldName}` : fieldName;\n\n // Create node for this field\n const node = {\n id: `${side}-${fullPath}`,\n position: { x: xOffset, y: currentYPos },\n data: {\n label: fieldName,\n type: field.type,\n path: fullPath,\n side: side,\n isRequired: field.isNonNull,\n isNested: isComplexType(schema, field.type),\n isArray: field.isList,\n nodeType: parentNodeType,\n category: category !== \"other\" ? category : undefined,\n },\n type: \"schemaNode\",\n parentId: side === \"source\" ? \"source-group\" : \"target-group\",\n extent: \"parent\",\n };\n\n generatedNodes.push(node);\n currentYPos += 70; // Reduced spacing between nodes\n\n // If this is a complex type and we have its definition, recursively add its fields\n if (isComplexType(schema, field.type) && schema.types[field.type]) {\n const nestedType = schema.types[field.type];\n const nestedFields = nestedType.fields || {};\n\n if (Object.keys(nestedFields).length > 0) {\n const nestedXOffset = side === \"source\" ? 150 : -150;\n const nestedNodes: SchemaNodeData[] = generateFieldNodes(\n nestedFields,\n fullPath,\n xPos + nestedXOffset,\n currentYPos - 20,\n side,\n parentNodeType,\n schema,\n );\n\n generatedNodes.push(...nestedNodes);\n currentYPos += nestedNodes.length * 60 + 30; // Adjusted for more compact layout\n }\n }\n }\n }\n\n return generatedNodes;\n };\n\n // Generate source nodes from the output type of the source operation\n const sourceNodes = generateFieldNodes(\n sourceFields,\n \"\",\n 100,\n yPos,\n \"source\",\n sourceNode,\n sourceSchema,\n );\n nodes.push(...sourceNodes);\n\n // Generate target nodes from the input type of the target node\n // If useArgsDirectlyForTarget is true, convert args array to fields object\n const targetFields: Record<string, ProcessedTargetField> = {};\n if (useArgsDirectlyForTarget && targetOperationField?.args) {\n // Convert args array to fields format\n for (const arg of targetOperationField.args) {\n targetFields[arg.name] = {\n name: arg.name,\n type: arg.type,\n isNonNull: arg.isNonNull || false,\n isList: arg.isList || false,\n args: [],\n };\n }\n } else if (targetInputType) {\n const inputFieldsSource =\n targetInputType.inputFields || targetInputType.fields || {};\n // Copy fields to targetFields with proper typing\n for (const fieldName of Object.keys(inputFieldsSource)) {\n const field = inputFieldsSource[fieldName];\n targetFields[fieldName] = {\n name: field.name,\n type: field.type,\n isNonNull: field.isNonNull,\n isList: field.isList,\n args: field.args || [],\n };\n }\n }\n\n // Fallback: If no target fields found, try to get args directly from mutation/query type\n if (Object.keys(targetFields).length === 0) {\n // Helper function to process operation args\n const processOperationArgs = (operationField: OperationField | null) => {\n if (!operationField?.args || operationField.args.length === 0)\n return false;\n // Check if there's a single 'input' or 'state' arg that is an INPUT_OBJECT\n const inputArg = operationField.args.find(\n (a) => a.name === \"input\" || a.name === \"state\",\n );\n if (inputArg) {\n const inputType = targetSchema.types[inputArg.type];\n if (inputType && inputType.kind === \"input\" && inputType.inputFields) {\n for (const fieldName of Object.keys(inputType.inputFields)) {\n const field = inputType.inputFields[fieldName];\n targetFields[fieldName] = {\n name: field.name || fieldName,\n type: field.type,\n isNonNull: field.isNonNull || false,\n isList: field.isList || false,\n args: [],\n };\n }\n return true;\n }\n }\n\n // Check if the first arg is an INPUT_OBJECT type\n if (operationField.args.length > 0) {\n const firstArg = operationField.args[0];\n const firstArgType = targetSchema.types[firstArg.type];\n if (\n firstArgType &&\n firstArgType.kind === \"input\" &&\n firstArgType.inputFields\n ) {\n for (const fieldName of Object.keys(firstArgType.inputFields)) {\n const field = firstArgType.inputFields[fieldName];\n targetFields[fieldName] = {\n name: field.name || fieldName,\n type: field.type,\n isNonNull: field.isNonNull || false,\n isList: field.isList || false,\n args: [],\n };\n }\n return true;\n }\n }\n\n // Use args directly as fields (for scalar args)\n for (const arg of operationField.args) {\n targetFields[arg.name] = {\n name: arg.name,\n type: arg.type,\n isNonNull: arg.isNonNull || false,\n isList: arg.isList || false,\n args: [],\n };\n }\n return true;\n };\n\n // Try mutation type first\n if (\n targetSchema.mutationType &&\n targetSchema.types[targetSchema.mutationType]\n ) {\n const mutationField =\n targetSchema.types[targetSchema.mutationType].fields?.[targetOperation];\n if (mutationField) {\n processOperationArgs(mutationField);\n }\n }\n\n // If still empty, try query type\n if (\n Object.keys(targetFields).length === 0 &&\n targetSchema.queryType &&\n targetSchema.types[targetSchema.queryType]\n ) {\n const queryField =\n targetSchema.types[targetSchema.queryType].fields?.[targetOperation];\n if (queryField) {\n processOperationArgs(queryField);\n }\n }\n }\n if (Object.keys(targetFields).length === 0) {\n console.warn(\"No target fields found for\", targetNode, targetOperation);\n\n // Add a placeholder node if no fields are found\n nodes.push({\n id: `target-placeholder`,\n position: { x: 100, y: 70 },\n data: {\n label: \"No fields available\",\n type: \"String\",\n path: \"placeholder\",\n side: \"target\",\n isRequired: false,\n isNested: false,\n isArray: false,\n nodeType: targetNode,\n },\n type: \"schemaNode\",\n parentId: \"target-group\",\n extent: \"parent\",\n });\n }\n const targetNodes = generateFieldNodes(\n targetFields,\n \"\",\n 100,\n yPos,\n \"target\",\n targetNode,\n targetSchema,\n );\n nodes.push(...targetNodes);\n\n // Adjust group node sizes based on child nodes with padding\n if (sourceNodes.length > 0) {\n // Find the maximum Y position of any source node\n const maxSourceY =\n Math.max(\n ...sourceNodes.map((node: SchemaNodeData) => {\n // For nested nodes, we need to account for their relative position\n const absoluteY = node.position.y;\n return absoluteY;\n }),\n ) + 150; // Reduced padding at the bottom (was 200)\n\n // Ensure the source group is tall enough to contain all nodes\n if (sourceGroupNode.style) {\n sourceGroupNode.style.height = Math.max(maxSourceY, 600); // Reduced minimum height (was 800)\n }\n\n // Also ensure the width is sufficient\n const maxSourceX = Math.max(\n ...sourceNodes.map((node: SchemaNodeData) => node.position.x + 300),\n );\n if (sourceGroupNode.style) {\n sourceGroupNode.style.width = Math.max(maxSourceX, 400); // Reduced minimum width (was 450)\n }\n }\n\n if (targetNodes.length > 0) {\n // Find the maximum Y position of any target node\n const maxTargetY =\n Math.max(\n ...targetNodes.map((node: SchemaNodeData) => {\n // For nested nodes, we need to account for their relative position\n const absoluteY = node.position.y;\n return absoluteY;\n }),\n ) + 150; // Reduced padding at the bottom (was 200)\n\n // Ensure the target group is tall enough to contain all nodes\n if (targetGroupNode.style) {\n targetGroupNode.style.height = Math.max(maxTargetY, 600); // Reduced minimum height (was 800)\n }\n\n // Also ensure the width is sufficient\n const maxTargetX = Math.max(\n ...targetNodes.map((node: SchemaNodeData) => node.position.x + 300),\n );\n if (targetGroupNode.style) {\n targetGroupNode.style.width = Math.max(maxTargetX, 400); // Reduced minimum width (was 450)\n }\n }\n return { nodes, edges };\n}\n\nfunction isComplexType(schema: GraphQLSchema, typeName: string): boolean {\n // Check if this is a complex type (object or input object)\n const type = schema.types[typeName];\n if (!type) return false;\n\n return type.kind === \"type\" || type.kind === \"input\";\n}\n","// Inspired by react-hot-toast library\nimport * as React from \"react\";\n\nimport type { ToastActionElement, ToastProps } from \"../ui/toast\";\n\nconst TOAST_LIMIT = 5;\nconst TOAST_REMOVE_DELAY = 1000000;\n\ntype ToasterToast = ToastProps & {\n id: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n action?: ToastActionElement;\n};\n\nconst actionTypes = {\n ADD_TOAST: \"ADD_TOAST\",\n UPDATE_TOAST: \"UPDATE_TOAST\",\n DISMISS_TOAST: \"DISMISS_TOAST\",\n REMOVE_TOAST: \"REMOVE_TOAST\",\n} as const;\n\nlet count = 0;\n\nfunction genId() {\n count = (count + 1) % Number.MAX_VALUE;\n return count.toString();\n}\n\ntype ActionType = typeof actionTypes;\n\ntype Action =\n | {\n type: ActionType[\"ADD_TOAST\"];\n toast: ToasterToast;\n }\n | {\n type: ActionType[\"UPDATE_TOAST\"];\n toast: Partial<ToasterToast>;\n }\n | {\n type: ActionType[\"DISMISS_TOAST\"];\n toastId?: string;\n }\n | {\n type: ActionType[\"REMOVE_TOAST\"];\n toastId?: string;\n };\n\ninterface State {\n toasts: ToasterToast[];\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>();\n\nconst reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case actionTypes.ADD_TOAST:\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case actionTypes.UPDATE_TOAST:\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t,\n ),\n };\n\n case actionTypes.DISMISS_TOAST: {\n const { toastId } = action;\n\n // ! Side effects ! - This could be extracted into a dismissToast() action,\n // but I'll keep it here for simplicity\n if (toastId) {\n addToRemoveQueue(toastId);\n } else {\n state.toasts.forEach((toast) => {\n addToRemoveQueue(toast.id);\n });\n }\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n open: false,\n }\n : t,\n ),\n };\n }\n case actionTypes.REMOVE_TOAST:\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [] };\n\nfunction dispatch(action: Action) {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n}\n\ntype Toast = Omit<ToasterToast, \"id\">;\n\nfunction toast({ ...props }: Toast) {\n const id = genId();\n\n const update = (props: ToasterToast) =>\n dispatch({\n type: actionTypes.UPDATE_TOAST,\n toast: { ...props, id },\n });\n const dismiss = () =>\n dispatch({ type: actionTypes.DISMISS_TOAST, toastId: id });\n\n dispatch({\n type: actionTypes.ADD_TOAST,\n toast: {\n ...props,\n id,\n open: true,\n onOpenChange: (open) => {\n if (!open) dismiss();\n },\n },\n });\n\n return {\n id: id,\n dismiss,\n update,\n };\n}\n\nfunction useToast() {\n const [state, setState] = React.useState<State>(memoryState);\n\n React.useEffect(() => {\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, [state]);\n\n return {\n ...state,\n toast,\n dismiss: (toastId?: string) =>\n dispatch({ type: actionTypes.DISMISS_TOAST, toastId }),\n };\n}\n\nfunction addToRemoveQueue(toastId: string) {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: actionTypes.REMOVE_TOAST,\n toastId,\n });\n }, TOAST_REMOVE_DELAY);\n\n toastTimeouts.set(toastId, timeout);\n}\n\nexport { useToast, toast };\n","import { createContext, useContext, type ReactNode } from \"react\";\n\n// Inline schema field definition\nexport interface SchemaField {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n}\n\n// Inline schema definition for a node\nexport interface InlineSchema {\n inputFields?: SchemaField[];\n outputFields?: SchemaField[];\n}\n\n// Define the DataConfig type based on the structure\nexport interface DataConfigNode {\n displayName: string;\n category: \"source\" | \"target\" | \"both\";\n style: {\n source: string;\n target: string;\n };\n url?: string;\n headers?: Record<string, string>;\n // Inline schema definition - used when URL is not available\n schema?: InlineSchema;\n}\n\n// Mapping example definition\nexport interface MappingExample {\n name: string;\n expression: string;\n description: string;\n}\n\n// Transform function definition\nexport interface TransformFunction {\n name: string;\n displayName: string;\n description: string;\n example: string;\n}\n\n// Cast type definition\nexport interface CastTypeDefinition {\n name: string;\n displayName: string;\n description: string;\n example: string;\n}\n\nexport interface MappingTypeConfig {\n displayName: string;\n description: string;\n color: string | { compatible: string; incompatible: string };\n examples?: MappingExample[];\n functions?: TransformFunction[];\n types?: CastTypeDefinition[];\n safeBuiltins?: string[];\n}\n\nexport interface DataConfig {\n nodes: Record<string, DataConfigNode>;\n mappingTypes: Record<string, MappingTypeConfig>;\n typeCompatibility: Record<string, string[]>;\n sampleData: Record<string, unknown>;\n}\n\n// Create a context for the data config\nconst DataConfigContext = createContext<DataConfig | null>(null);\n\n// Provider component\nexport function DataConfigProvider({\n children,\n config,\n}: {\n children: ReactNode;\n config: DataConfig;\n}) {\n return (\n <DataConfigContext.Provider value={config}>\n {children}\n </DataConfigContext.Provider>\n );\n}\n\n// Hook to use the data config\nexport function useDataConfig(): DataConfig {\n const context = useContext(DataConfigContext);\n if (!context) {\n // Return empty config instead of throwing to prevent crashes\n console.warn(\n \"useDataConfig: No DataConfigProvider found, using empty config\",\n );\n return {\n nodes: {},\n mappingTypes: {},\n typeCompatibility: {},\n sampleData: {},\n };\n }\n return context;\n}\n","import { useState, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { Label } from \"@burdenoff/fe-libs/ui\";\nimport { Input } from \"@burdenoff/fe-libs/ui\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@burdenoff/fe-libs/ui\";\nimport { Textarea } from \"@burdenoff/fe-libs/ui\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@burdenoff/fe-libs/ui\";\nimport { Badge } from \"@burdenoff/fe-libs/ui\";\nimport { X, ChevronRight } from \"lucide-react\";\nimport { useDataConfig } from \"./config/data-config-context\";\nimport type { GraphQLSchema } from \"../lib/types\";\n\n// Mapping types available in the dialog\nexport type MappingType =\n | \"direct\"\n | \"expression\"\n | \"transform\"\n | \"cast\"\n | \"array\"\n | \"object\"\n | \"context\";\n\ninterface FieldInfo {\n path: string;\n name: string;\n type: string;\n isList: boolean;\n isNonNull: boolean;\n children?: FieldInfo[];\n}\n\ninterface MappingDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSave: (mappingData: string, targetFieldName?: string) => void;\n mappingType: MappingType;\n sourceField?: string;\n targetField?: string;\n sourceSchema?: GraphQLSchema;\n sourceOperation?: string;\n targetSchema?: GraphQLSchema;\n targetOperation?: string;\n}\n\n// Wrapper component that uses key pattern to reset state when dialog opens\nexport function MappingDialog(props: MappingDialogProps) {\n if (!props.open) return null;\n\n // Key changes when dialog opens with new props, causing MappingDialogContent to remount\n const dialogKey = `${props.mappingType}-${props.sourceField || \"\"}-${props.targetField || \"\"}`;\n\n return <MappingDialogContent key={dialogKey} {...props} />;\n}\n\n// Inner component with all the state - remounts fresh each time dialog opens\nfunction MappingDialogContent({\n open,\n onOpenChange,\n onSave,\n mappingType,\n sourceField,\n targetField,\n sourceSchema,\n sourceOperation,\n targetSchema,\n targetOperation,\n}: MappingDialogProps) {\n // Initialize state with values based on props - runs fresh on each mount\n const [expression, setExpression] = useState<string>(() =>\n sourceField ? `\\${output.${sourceField}}` : \"\",\n );\n const [selectedExample, setSelectedExample] = useState<string>(\"\");\n const [activeTab, setActiveTab] = useState<string>(() =>\n mappingType === \"array\" || mappingType === \"object\"\n ? \"builder\"\n : \"examples\",\n );\n\n // Guided builder state - initialize with props\n const [targetFieldName, setTargetFieldName] = useState<string>(\n () => targetField || \"\",\n );\n const [selectedSourceArray, setSelectedSourceArray] = useState<string>(\"\");\n const [itemExpression, setItemExpression] = useState<string>(\"\");\n\n // Get data config from context\n const dataConfig = useDataConfig();\n\n // Extract available fields from source schema\n const sourceFields = useMemo(() => {\n if (!sourceSchema) return [];\n\n const fields: FieldInfo[] = [];\n\n // Helper to recursively extract fields\n const extractFields = (\n typeName: string,\n parentPath: string = \"\",\n depth: number = 0,\n ): FieldInfo[] => {\n if (depth > 3) return []; // Limit recursion depth\n\n const typeInfo = sourceSchema.types[typeName];\n if (!typeInfo || !typeInfo.fields) return [];\n\n const result: FieldInfo[] = [];\n\n for (const fieldName in typeInfo.fields) {\n const field = typeInfo.fields[fieldName];\n const fieldPath = parentPath ? `${parentPath}.${fieldName}` : fieldName;\n\n const fieldInfo: FieldInfo = {\n path: fieldPath,\n name: fieldName,\n type: field.type,\n isList: field.isList || false,\n isNonNull: field.isNonNull || false,\n };\n\n // If it's an object type, recursively get children\n if (\n sourceSchema.types[field.type] &&\n sourceSchema.types[field.type].kind === \"type\"\n ) {\n fieldInfo.children = extractFields(field.type, fieldPath, depth + 1);\n }\n\n result.push(fieldInfo);\n }\n\n return result;\n };\n\n // Find the return type for the operation\n const queryType = sourceSchema.types[sourceSchema.queryType || \"Query\"];\n if (queryType && queryType.fields && sourceOperation) {\n const operationField = queryType.fields[sourceOperation];\n if (operationField) {\n const returnType = operationField.type;\n if (sourceSchema.types[returnType]) {\n // Include operation name as prefix so paths are like \"searchEmails.emails\"\n return extractFields(returnType, sourceOperation);\n }\n }\n }\n\n // Fallback: extract from all object types\n for (const typeName in sourceSchema.types) {\n const type = sourceSchema.types[typeName];\n if (\n type.kind === \"type\" &&\n !typeName.startsWith(\"_\") &&\n typeName !== \"Query\" &&\n typeName !== \"Mutation\"\n ) {\n fields.push(...extractFields(typeName, \"\"));\n }\n }\n\n return fields;\n }, [sourceSchema, sourceOperation]);\n\n // Get all array fields (flattened)\n const arrayFields = useMemo(() => {\n const arrays: FieldInfo[] = [];\n\n const collectArrays = (fields: FieldInfo[], prefix: string = \"\") => {\n for (const field of fields) {\n if (field.isList) {\n arrays.push({\n ...field,\n path: prefix ? `${prefix}.${field.path}` : field.path,\n });\n }\n if (field.children) {\n collectArrays(field.children, prefix);\n }\n }\n };\n\n collectArrays(sourceFields);\n return arrays;\n }, [sourceFields]);\n\n // Get child fields of selected array (for item property suggestions) - includes nested fields\n const arrayItemFields = useMemo(() => {\n if (!selectedSourceArray || !sourceSchema) return [];\n\n // Find the array field\n const findField = (fields: FieldInfo[], path: string): FieldInfo | null => {\n for (const field of fields) {\n if (field.path === path) return field;\n if (field.children) {\n const found = findField(field.children, path);\n if (found) return found;\n }\n }\n return null;\n };\n\n const arrayField = findField(sourceFields, selectedSourceArray);\n if (!arrayField) return [];\n\n // Get the item type's fields - recursively to get nested fields\n const itemType = sourceSchema.types[arrayField.type];\n if (!itemType || !itemType.fields) return [];\n\n const result: {\n name: string;\n type: string;\n path: string;\n isNested: boolean;\n }[] = [];\n\n // Recursively extract fields with full paths\n const extractNestedFields = (\n typeName: string,\n parentPath: string = \"\",\n currentDepth: number = 0,\n ) => {\n if (currentDepth > 2) return; // Limit depth to avoid too many options\n\n const type = sourceSchema?.types[typeName];\n if (!type || !type.fields) return;\n\n for (const fieldName in type.fields) {\n const field = type.fields[fieldName];\n const fullPath = parentPath ? `${parentPath}.${fieldName}` : fieldName;\n\n result.push({\n name: fieldName,\n type: field.type,\n path: fullPath,\n isNested: currentDepth > 0,\n });\n\n // If this field is an object type, recurse into it\n const fieldType = sourceSchema?.types[field.type];\n if (fieldType && fieldType.kind === \"type\" && !field.isList) {\n extractNestedFields(field.type, fullPath, currentDepth + 1);\n }\n }\n };\n\n extractNestedFields(arrayField.type);\n return result;\n }, [selectedSourceArray, sourceFields, sourceSchema]);\n\n // Extract available fields from target schema\n const targetFields = useMemo(() => {\n if (!targetSchema) return [];\n\n const fields: FieldInfo[] = [];\n\n const extractFields = (\n typeName: string,\n parentPath: string = \"\",\n depth: number = 0,\n ): FieldInfo[] => {\n if (depth > 3) return [];\n\n const typeInfo = targetSchema.types[typeName];\n if (!typeInfo) return [];\n\n // Handle input types (for mutations)\n const fieldsObj = typeInfo.inputFields || typeInfo.fields;\n if (!fieldsObj) return [];\n\n const result: FieldInfo[] = [];\n\n for (const fieldName in fieldsObj) {\n const field = fieldsObj[fieldName];\n const fieldPath = parentPath ? `${parentPath}.${fieldName}` : fieldName;\n\n const fieldInfo: FieldInfo = {\n path: fieldPath,\n name: fieldName,\n type: field.type,\n isList: field.isList || false,\n isNonNull: field.isNonNull || false,\n };\n\n if (targetSchema.types[field.type]) {\n const nestedType = targetSchema.types[field.type];\n if (nestedType.kind === \"type\" || nestedType.kind === \"input\") {\n fieldInfo.children = extractFields(\n field.type,\n fieldPath,\n depth + 1,\n );\n }\n }\n\n result.push(fieldInfo);\n }\n\n return result;\n };\n\n // Find the input type for the target operation\n const mutationType =\n targetSchema.types[targetSchema.mutationType || \"Mutation\"];\n const queryType = targetSchema.types[targetSchema.queryType || \"Query\"];\n\n if (targetOperation) {\n // Check mutation first\n if (mutationType?.fields?.[targetOperation]) {\n const operationField = mutationType.fields[targetOperation];\n // Get input args\n if (operationField.args && operationField.args.length > 0) {\n for (const arg of operationField.args) {\n if (targetSchema.types[arg.type]) {\n fields.push(...extractFields(arg.type, \"\"));\n } else {\n fields.push({\n path: arg.name,\n name: arg.name,\n type: arg.type,\n isList: arg.isList || false,\n isNonNull: arg.isNonNull || false,\n });\n }\n }\n }\n }\n // Check query\n if (queryType?.fields?.[targetOperation]) {\n const operationField = queryType.fields[targetOperation];\n if (operationField.args && operationField.args.length > 0) {\n for (const arg of operationField.args) {\n if (targetSchema.types[arg.type]) {\n fields.push(...extractFields(arg.type, \"\"));\n } else {\n fields.push({\n path: arg.name,\n name: arg.name,\n type: arg.type,\n isList: arg.isList || false,\n isNonNull: arg.isNonNull || false,\n });\n }\n }\n }\n }\n }\n\n return fields;\n }, [targetSchema, targetOperation]);\n\n // Handler to update source array selection and sync expression\n const handleSourceArrayChange = (value: string) => {\n setSelectedSourceArray(value);\n if (mappingType === \"array\" && value && itemExpression) {\n setExpression(`\\${output.${value}.map(item => item.${itemExpression})}`);\n }\n };\n\n // Handler to update item expression and sync expression\n const handleItemExpressionChange = (value: string) => {\n setItemExpression(value);\n if (mappingType === \"array\" && selectedSourceArray && value) {\n setExpression(\n `\\${output.${selectedSourceArray}.map(item => item.${value})}`,\n );\n }\n };\n\n // Get examples for the current mapping type\n const getMappingTypeConfig = () => {\n return dataConfig?.mappingTypes?.[mappingType] || {};\n };\n\n const mappingTypeConfig = getMappingTypeConfig();\n const examples = mappingTypeConfig.examples || [];\n const safeBuiltins = mappingTypeConfig.safeBuiltins || [];\n\n // Check if form is valid for submission\n const isFormValid = useMemo(() => {\n if (!targetFieldName.trim()) return false;\n if (!expression.trim()) return false;\n return true;\n }, [targetFieldName, expression]);\n\n // Get validation message\n const getValidationMessage = () => {\n const missing: string[] = [];\n if (!targetFieldName.trim()) missing.push(\"target field name\");\n if (!expression.trim()) missing.push(\"expression\");\n if (missing.length === 0) return null;\n return `Please provide: ${missing.join(\", \")}`;\n };\n\n // Apply selected example - use callback instead of effect\n const handleExampleChange = (exampleName: string) => {\n setSelectedExample(exampleName);\n if (exampleName && exampleName !== \"choose\") {\n const example = examples.find(\n (ex: { name: string }) => ex.name === exampleName,\n );\n if (example && example.expression) {\n setExpression(example.expression);\n }\n }\n };\n\n const handleSave = () => {\n onSave(expression, targetFieldName || undefined);\n onOpenChange(false);\n };\n\n // Get title and description based on mapping type\n const getDialogTitle = () => {\n switch (mappingType) {\n case \"direct\":\n return \"Direct Field Mapping\";\n case \"expression\":\n return \"Expression Mapping\";\n case \"transform\":\n return \"Transform Mapping\";\n case \"cast\":\n return \"Type Cast Mapping\";\n case \"array\":\n return \"Array Mapping\";\n case \"object\":\n return \"Object Mapping\";\n case \"context\":\n return \"Workflow Context\";\n default:\n return \"Data Mapping\";\n }\n };\n\n const getDialogDescription = () => {\n return (\n mappingTypeConfig.description ||\n \"Create a mapping using JavaScript template literal syntax\"\n );\n };\n\n // Get placeholder based on mapping type\n const getPlaceholder = () => {\n switch (mappingType) {\n case \"direct\":\n return \"${output.fieldName}\";\n case \"expression\":\n return \"${output.firstName + ' ' + output.lastName}\";\n case \"transform\":\n return \"${output.field.toUpperCase()}\";\n case \"cast\":\n return \"${parseInt(output.numberString)}\";\n case \"array\":\n return \"${output.items.map(item => item.id)}\";\n case \"object\":\n return \"${({ id: output.user.id, email: output.user.email })}\";\n case \"context\":\n return \"${TriggerInput.userId}\";\n default:\n return \"${output.field}\";\n }\n };\n\n // Get quick insert snippets based on mapping type\n const getQuickInserts = () => {\n switch (mappingType) {\n case \"direct\":\n return [\n { label: \"output.\", snippet: \"output.\" },\n { label: \"?.\", snippet: \"?.\" },\n { label: \"|| ''\", snippet: \" || ''\" },\n { label: \"?? null\", snippet: \" ?? null\" },\n ];\n case \"expression\":\n return [\n { label: \"output.\", snippet: \"output.\" },\n { label: \"? :\", snippet: \" ? '' : ''\" },\n { label: \"&&\", snippet: \" && \" },\n { label: \"||\", snippet: \" || \" },\n { label: \"??\", snippet: \" ?? \" },\n ];\n case \"transform\":\n return [\n { label: \".toUpperCase()\", snippet: \".toUpperCase()\" },\n { label: \".toLowerCase()\", snippet: \".toLowerCase()\" },\n { label: \".trim()\", snippet: \".trim()\" },\n { label: \".split(',')\", snippet: \".split(',')\" },\n { label: \".join(', ')\", snippet: \".join(', ')\" },\n { label: \".replace()\", snippet: \".replace('old', 'new')\" },\n ];\n case \"cast\":\n return [\n { label: \"parseInt()\", snippet: \"parseInt(\" },\n { label: \"parseFloat()\", snippet: \"parseFloat(\" },\n { label: \"String()\", snippet: \"String(\" },\n { label: \"Boolean()\", snippet: \"Boolean(\" },\n { label: \"Number()\", snippet: \"Number(\" },\n ];\n case \"array\":\n return [\n { label: \".map()\", snippet: \".map(item => item)\" },\n { label: \".filter()\", snippet: \".filter(item => item)\" },\n { label: \".reduce()\", snippet: \".reduce((acc, item) => acc, 0)\" },\n { label: \".find()\", snippet: \".find(item => item)\" },\n { label: \".some()\", snippet: \".some(item => item)\" },\n { label: \".every()\", snippet: \".every(item => item)\" },\n { label: \".flat()\", snippet: \".flat()\" },\n { label: \".slice()\", snippet: \".slice(0, 5)\" },\n { label: \".sort()\", snippet: \".sort((a, b) => a - b)\" },\n ];\n case \"object\":\n return [\n { label: \"Object.keys()\", snippet: \"Object.keys(\" },\n { label: \"Object.values()\", snippet: \"Object.values(\" },\n { label: \"Object.entries()\", snippet: \"Object.entries(\" },\n { label: \"Object.assign()\", snippet: \"Object.assign({}, \" },\n { label: \"{ ...obj }\", snippet: \"{ ...\" },\n ];\n case \"context\":\n return [\n { label: \"TriggerInput.\", snippet: \"TriggerInput.\" },\n { label: \"WorkflowState.\", snippet: \"WorkflowState.\" },\n { label: \"RunContext.\", snippet: \"RunContext.\" },\n { label: \".output.\", snippet: \".output.\" },\n { label: \".status\", snippet: \".status\" },\n ];\n default:\n return [];\n }\n };\n\n const insertSnippet = (snippet: string) => {\n // Insert at cursor position or at the end\n const textarea = document.getElementById(\n \"expression-input\",\n ) as HTMLTextAreaElement;\n if (textarea) {\n const start = textarea.selectionStart;\n const end = textarea.selectionEnd;\n const newValue =\n expression.slice(0, start) + snippet + expression.slice(end);\n setExpression(newValue);\n // Set cursor position after snippet\n setTimeout(() => {\n textarea.focus();\n textarea.setSelectionRange(\n start + snippet.length,\n start + snippet.length,\n );\n }, 0);\n } else {\n setExpression(expression + snippet);\n }\n };\n\n if (!open) return null;\n\n return createPortal(\n <div\n className=\"fixed inset-0 bg-black/50 z-[100001] flex items-center justify-center\"\n onClick={() => onOpenChange(false)}\n >\n <div\n className=\"bg-surface dark:bg-surface z-[100002] flex flex-col w-[700px] max-w-[95vw] max-h-[90vh] rounded-lg overflow-hidden pointer-events-auto shadow-xl\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex justify-between items-start p-6 border-b\">\n <div>\n <h2 className=\"text-lg font-semibold\">{getDialogTitle()}</h2>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {getDialogDescription()}\n </p>\n </div>\n <button\n onClick={() => onOpenChange(false)}\n className=\"rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-6\">\n {/* Target Field Name - always visible */}\n <div className=\"mb-4 p-3 bg-[var(--color-bg-accent)]/10 rounded-md border border-[var(--color-border-accent)]\">\n <Label htmlFor=\"target-field-name\" className=\"text-sm font-medium\">\n Target Field Name{\" \"}\n <span className=\"text-muted-foreground\">\n (where the result will be stored)\n </span>\n </Label>\n {targetFields.length > 0 ? (\n <div className=\"mt-2 space-y-2\">\n <Select\n value={targetFieldName}\n onValueChange={setTargetFieldName}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select target field...\" />\n </SelectTrigger>\n <SelectContent className=\"z-[100003]\">\n {targetFields.map((field) => (\n <SelectItem key={field.path} value={field.path}>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono\">{field.path}</span>\n <Badge variant=\"outline\" className=\"text-xs\">\n {field.isList ? `[${field.type}]` : field.type}\n </Badge>\n {field.isNonNull && (\n <span className=\"text-[var(--color-status-error-text)] text-xs\">\n *\n </span>\n )}\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-xs text-muted-foreground\">\n Or enter a custom field name:\n </p>\n <Input\n id=\"target-field-name\"\n placeholder=\"e.g., messageIds, userNames, totalPrice\"\n value={targetFieldName}\n onChange={(e) => setTargetFieldName(e.target.value)}\n className=\"font-mono\"\n />\n </div>\n ) : (\n <Input\n id=\"target-field-name\"\n placeholder=\"e.g., messageIds, userNames, totalPrice\"\n value={targetFieldName}\n onChange={(e) => setTargetFieldName(e.target.value)}\n className=\"mt-2\"\n />\n )}\n </div>\n\n <Tabs\n value={activeTab}\n onValueChange={setActiveTab}\n className=\"w-full\"\n >\n <TabsList className=\"grid w-full grid-cols-4\">\n <TabsTrigger value=\"builder\">Builder</TabsTrigger>\n <TabsTrigger value=\"examples\">Examples</TabsTrigger>\n <TabsTrigger value=\"editor\">Editor</TabsTrigger>\n <TabsTrigger value=\"help\">Help</TabsTrigger>\n </TabsList>\n\n {/* Builder Tab - Guided UI for creating mappings */}\n <TabsContent value=\"builder\" className=\"space-y-4 mt-4\">\n {mappingType === \"array\" && (\n <>\n {/* Source Array Selection */}\n <div className=\"grid gap-2\">\n <Label>1. Select Source Array</Label>\n {arrayFields.length > 0 ? (\n <Select\n value={selectedSourceArray}\n onValueChange={handleSourceArrayChange}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Choose an array field...\" />\n </SelectTrigger>\n <SelectContent className=\"z-[100003]\">\n {arrayFields.map((field) => (\n <SelectItem key={field.path} value={field.path}>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono\">{field.path}</span>\n <Badge variant=\"outline\" className=\"text-xs\">\n [{field.type}]\n </Badge>\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <div className=\"p-3 border border-default rounded-md bg-muted\">\n <p className=\"text-sm text-muted-foreground\">\n No array fields found in schema. Enter the array path\n manually:\n </p>\n <Input\n placeholder=\"e.g., searchEmails.emails\"\n value={selectedSourceArray}\n onChange={(e) =>\n handleSourceArrayChange(e.target.value)\n }\n className=\"mt-2 font-mono\"\n />\n </div>\n )}\n </div>\n\n {/* Item Property Selection */}\n <div className=\"grid gap-2\">\n <Label>2. Extract Property from Each Item</Label>\n {arrayItemFields.length > 0 ? (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap gap-1 max-h-[120px] overflow-y-auto p-1\">\n {arrayItemFields.map((field) => (\n <Badge\n key={field.path}\n variant={\n itemExpression === field.path\n ? \"default\"\n : \"outline\"\n }\n className={`cursor-pointer hover:bg-primary hover:text-primary-foreground ${field.isNested ? \"ml-2 border-dashed\" : \"\"}`}\n onClick={() =>\n handleItemExpressionChange(field.path)\n }\n >\n {field.isNested ? (\n <span className=\"font-mono text-xs\">\n {field.path}\n </span>\n ) : (\n field.name\n )}\n <span className=\"ml-1 opacity-60 text-[10px]\">\n ({field.type})\n </span>\n </Badge>\n ))}\n </div>\n <p className=\"text-xs text-muted-foreground\">\n Click a field above or enter a custom path:\n </p>\n <Input\n placeholder=\"e.g., metadata.id, user.email\"\n value={itemExpression}\n onChange={(e) =>\n handleItemExpressionChange(e.target.value)\n }\n className=\"font-mono\"\n />\n </div>\n ) : (\n <Input\n placeholder=\"e.g., metadata.id, user.email, id\"\n value={itemExpression}\n onChange={(e) =>\n handleItemExpressionChange(e.target.value)\n }\n className=\"font-mono\"\n />\n )}\n </div>\n\n {/* Generated Expression Preview */}\n <div className=\"grid gap-2\">\n <Label>3. Generated Expression</Label>\n <div className=\"p-3 bg-muted rounded-md border border-default\">\n <code className=\"text-sm break-all block font-mono\">\n {expression ||\n \"${output.arrayField.map(item => item.property)}\"}\n </code>\n </div>\n </div>\n\n {/* Visual Preview */}\n {selectedSourceArray && itemExpression && (\n <div className=\"p-3 bg-[var(--color-status-success-bg-subtle)] rounded-md border border-[var(--color-status-success-border)]\">\n <Label className=\"text-[var(--color-status-success-text)]\">\n Result Preview:\n </Label>\n <div className=\"mt-2 flex items-center gap-2 text-sm\">\n <code className=\"bg-surface px-2 py-1 rounded\">\n {targetFieldName || \"result\"}\n </code>\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n <code className=\"bg-surface px-2 py-1 rounded\">\n [{itemExpression}, {itemExpression}, ...]\n </code>\n </div>\n </div>\n )}\n </>\n )}\n\n {mappingType !== \"array\" && (\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-sm text-muted-foreground\">\n The guided builder is optimized for <strong>Array</strong>{\" \"}\n mappings. For {mappingType} mappings, use the{\" \"}\n <strong>Examples</strong> or <strong>Editor</strong> tabs.\n </p>\n </div>\n )}\n\n {/* Available Source Fields Reference */}\n {sourceFields.length > 0 && (\n <div className=\"grid gap-2\">\n <Label>Available Source Fields</Label>\n <div className=\"p-3 border rounded-md max-h-[150px] overflow-y-auto bg-muted/50\">\n <div className=\"space-y-1\">\n {sourceFields.slice(0, 15).map((field) => (\n <div\n key={field.path}\n className=\"flex items-center gap-2 text-xs\"\n >\n <code className=\"font-mono\">{field.path}</code>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {field.isList ? `[${field.type}]` : field.type}\n </Badge>\n </div>\n ))}\n {sourceFields.length > 15 && (\n <p className=\"text-xs text-muted-foreground mt-2\">\n ...and {sourceFields.length - 15} more fields\n </p>\n )}\n </div>\n </div>\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"examples\" className=\"space-y-4 mt-4\">\n {examples.length > 0 && (\n <div className=\"grid gap-2\">\n <Label>Select an example to start with:</Label>\n <Select\n value={selectedExample}\n onValueChange={handleExampleChange}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Choose an example\" />\n </SelectTrigger>\n <SelectContent className=\"z-[100003]\">\n <SelectItem value=\"choose\">Choose an example</SelectItem>\n {examples.map(\n (example: { name: string; description: string }) => (\n <SelectItem key={example.name} value={example.name}>\n {example.name} - {example.description}\n </SelectItem>\n ),\n )}\n </SelectContent>\n </Select>\n </div>\n )}\n\n <div className=\"grid gap-2\">\n <Label>Quick Examples:</Label>\n <div className=\"grid grid-cols-1 gap-2 max-h-[200px] overflow-y-auto\">\n {examples\n .slice(0, 8)\n .map(\n (example: {\n name: string;\n expression: string;\n description: string;\n }) => (\n <div\n key={example.name}\n className=\"p-2 border rounded-md cursor-pointer hover:bg-muted transition-colors\"\n onClick={() => {\n setExpression(example.expression);\n setActiveTab(\"editor\");\n }}\n >\n <div className=\"font-medium text-sm\">\n {example.name}\n </div>\n <code className=\"text-xs text-muted-foreground block mt-1 break-all\">\n {example.expression}\n </code>\n </div>\n ),\n )}\n </div>\n </div>\n </TabsContent>\n\n <TabsContent value=\"editor\" className=\"space-y-4 mt-4\">\n {/* Quick Insert Buttons */}\n <div className=\"grid gap-2\">\n <Label>Quick Insert:</Label>\n <div className=\"flex flex-wrap gap-1\">\n {getQuickInserts().map((item) => (\n <Badge\n key={item.label}\n variant=\"secondary\"\n className=\"cursor-pointer hover:bg-primary hover:text-primary-foreground\"\n onClick={() => insertSnippet(item.snippet)}\n >\n {item.label}\n </Badge>\n ))}\n </div>\n </div>\n\n {/* Expression Input */}\n <div className=\"grid gap-2\">\n <Label htmlFor=\"expression-input\">Template Expression</Label>\n <Textarea\n id=\"expression-input\"\n placeholder={getPlaceholder()}\n value={expression}\n onChange={(e) => setExpression(e.target.value)}\n className=\"h-32 font-mono text-sm\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Use JavaScript template literal syntax:{\" \"}\n <code className=\"bg-muted px-1 rounded\">\n ${\"{\"}expression{\"}\"}\n </code>\n </p>\n </div>\n\n {/* Field Context */}\n {(sourceField || targetField) && (\n <div className=\"p-3 bg-muted rounded-md\">\n <h4 className=\"text-sm font-medium mb-2\">Mapping Context</h4>\n <div className=\"text-xs space-y-1\">\n {sourceField && (\n <div>\n <span className=\"text-muted-foreground\">\n Source field:\n </span>{\" \"}\n <code className=\"bg-background px-1 rounded\">\n {sourceField}\n </code>\n </div>\n )}\n {targetField && (\n <div>\n <span className=\"text-muted-foreground\">\n Target field:\n </span>{\" \"}\n <code className=\"bg-background px-1 rounded\">\n {targetField}\n </code>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Preview */}\n <div className=\"p-3 bg-muted rounded-md\">\n <h4 className=\"text-sm font-medium mb-2\">Mapping Value</h4>\n <code className=\"text-xs break-all block\">\n {expression || \"(empty)\"}\n </code>\n </div>\n </TabsContent>\n\n <TabsContent value=\"help\" className=\"space-y-4 mt-4\">\n {/* Available Variables */}\n <div className=\"p-3 bg-muted rounded-md\">\n <h4 className=\"text-sm font-medium mb-2\">\n Available Variables\n </h4>\n <div className=\"text-xs space-y-2\">\n <div>\n <code className=\"bg-background px-1 rounded\">output</code> -\n Output from the previous node\n </div>\n <div>\n <code className=\"bg-background px-1 rounded\">\n TriggerInput\n </code>{\" \"}\n - Original trigger payload\n </div>\n <div>\n <code className=\"bg-background px-1 rounded\">\n WorkflowState\n </code>{\" \"}\n - Outputs from all previous nodes\n </div>\n <div>\n <code className=\"bg-background px-1 rounded\">\n RunContext\n </code>{\" \"}\n - Workflow execution metadata\n </div>\n <div>\n <code className=\"bg-background px-1 rounded\">item</code> -\n Current item (in array operations)\n </div>\n <div>\n <code className=\"bg-background px-1 rounded\">index</code> -\n Current index (in array operations)\n </div>\n </div>\n </div>\n\n {/* Safe Builtins */}\n {safeBuiltins.length > 0 && (\n <div className=\"p-3 bg-muted rounded-md\">\n <h4 className=\"text-sm font-medium mb-2\">\n Available Functions\n </h4>\n <div className=\"text-xs grid grid-cols-3 gap-1\">\n {safeBuiltins.map((func: string) => (\n <code key={func} className=\"bg-background px-1 rounded\">\n {func}\n </code>\n ))}\n </div>\n </div>\n )}\n\n {/* Syntax Tips */}\n <div className=\"p-3 bg-muted rounded-md\">\n <h4 className=\"text-sm font-medium mb-2\">Syntax Tips</h4>\n <div className=\"text-xs space-y-1\">\n <div>\n <strong>Optional chaining:</strong>{\" \"}\n <code className=\"bg-background px-1 rounded\">\n output.user?.email\n </code>\n </div>\n <div>\n <strong>Nullish coalescing:</strong>{\" \"}\n <code className=\"bg-background px-1 rounded\">{`output.value ?? 'default'`}</code>\n </div>\n <div>\n <strong>Ternary:</strong>{\" \"}\n <code className=\"bg-background px-1 rounded\">{`output.active ? 'Yes' : 'No'`}</code>\n </div>\n <div>\n <strong>Array access:</strong>{\" \"}\n <code className=\"bg-background px-1 rounded\">\n output.items[0].name\n </code>\n </div>\n </div>\n </div>\n </TabsContent>\n </Tabs>\n </div>\n\n {/* Footer */}\n <div className=\"p-6 border-t\">\n {!isFormValid && (\n <div className=\"mb-3 p-2 bg-[var(--color-status-warning-bg-subtle)] border border-[var(--color-status-warning-border)] rounded-md\">\n <p className=\"text-sm text-[var(--color-status-warning-text)]\">\n {getValidationMessage()}\n </p>\n </div>\n )}\n <div className=\"flex justify-between items-center\">\n <div className=\"text-xs text-muted-foreground\">\n {targetFieldName && expression && (\n <code className=\"bg-muted px-2 py-1 rounded\">\n {targetFieldName}:{\" \"}\n {expression.length > 40\n ? expression.substring(0, 40) + \"...\"\n : expression}\n </code>\n )}\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button onClick={handleSave} disabled={!isFormValid}>\n Apply Mapping\n </Button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","import type { GraphQLSchema } from \"./types\";\nimport {\n getReturnTypeForOperation,\n getInputTypeForOperation,\n} from \"../mapper/config/data\";\n\n/**\n * Mapping Scope - Available variables in template literals\n * Based on the backend TemplateMapperService architecture\n */\nexport interface MappingScope {\n output: Record<string, unknown>;\n TriggerInput: Record<string, unknown>;\n WorkflowState: Record<string, NodeOutput>;\n RunContext: RunContext;\n item?: unknown;\n index?: number;\n}\n\nexport interface NodeOutput {\n output: Record<string, unknown>;\n status: string;\n}\n\nexport interface RunContext {\n runId: string;\n workflowKey: string;\n version: string;\n tenantId: string;\n workspaceId: string;\n projectId?: string;\n triggeredAt: string;\n triggeredBy?: string;\n}\n\n/**\n * Template Literal Mapper Configuration\n */\nexport interface MapperConfig {\n timeout?: number; // Default: 5000ms\n maxTemplateLength?: number; // Default: 10000 chars\n debug?: boolean;\n}\n\nconst DEFAULT_CONFIG: MapperConfig = {\n timeout: 5000,\n maxTemplateLength: 10000,\n debug: false,\n};\n\n/**\n * Template Parse Result\n */\ninterface TemplateParseResult {\n isTemplate: boolean;\n expression: string | null;\n error: string | null;\n}\n\n/**\n * Safe built-ins available in the sandbox\n */\nconst SAFE_GLOBALS = {\n // Type conversion\n parseInt,\n parseFloat,\n isNaN,\n isFinite,\n Number,\n String,\n Boolean,\n\n // Safe built-ins\n JSON: {\n parse: JSON.parse,\n stringify: JSON.stringify,\n },\n Date,\n Math,\n Array,\n Object,\n\n // Console (for debugging)\n console: {\n log: (..._args: unknown[]) => {},\n error: (...args: unknown[]) => console.error(\"[Mapper]\", ...args),\n warn: (...args: unknown[]) => console.warn(\"[Mapper]\", ...args),\n },\n};\n\n/**\n * Parse a template string to extract the expression\n * Template literals must be in the format: ${expression}\n */\nexport function parseTemplate(template: string): TemplateParseResult {\n if (typeof template !== \"string\") {\n return { isTemplate: false, expression: null, error: null };\n }\n\n // Check if this is a template literal\n const templateRegex = /^\\$\\{(.+)\\}$/s;\n const match = template.match(templateRegex);\n\n if (!match) {\n return { isTemplate: false, expression: null, error: null };\n }\n\n const expression = match[1].trim();\n\n if (!expression) {\n return {\n isTemplate: true,\n expression: null,\n error: \"Empty template expression\",\n };\n }\n\n return { isTemplate: true, expression, error: null };\n}\n\n/**\n * Build the sandbox with safe globals and scope variables\n */\nfunction buildSandbox(scope: MappingScope): Record<string, unknown> {\n return {\n ...SAFE_GLOBALS,\n output: scope.output,\n TriggerInput: scope.TriggerInput,\n WorkflowState: scope.WorkflowState,\n RunContext: scope.RunContext,\n item: scope.item,\n index: scope.index,\n };\n}\n\n/**\n * Evaluate a JavaScript expression in a sandboxed environment\n */\nexport async function evaluateExpression(\n expression: string,\n scope: MappingScope,\n config: MapperConfig = DEFAULT_CONFIG,\n): Promise<unknown> {\n const sandbox = buildSandbox(scope);\n\n // Extract sandbox parameters\n const paramNames = Object.keys(sandbox);\n const paramValues = Object.values(sandbox);\n\n try {\n // Create function with restricted scope\n const fn = new Function(\n ...paramNames,\n `\"use strict\"; return (${expression});`,\n );\n\n // Execute with timeout protection\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(\n () => reject(new Error(\"Execution timeout exceeded\")),\n config.timeout || DEFAULT_CONFIG.timeout!,\n );\n });\n\n const resultPromise = Promise.resolve(fn(...paramValues));\n const result = await Promise.race([resultPromise, timeoutPromise]);\n\n return result;\n } catch (error) {\n if (config.debug) {\n console.error(\"[Mapper] Expression evaluation error:\", error);\n }\n throw error;\n }\n}\n\n/**\n * Map a definition object using template literals\n * This is the main entry point for applying mappings\n */\nexport async function mapDefinition(\n definition: unknown,\n scope: MappingScope,\n config: MapperConfig = DEFAULT_CONFIG,\n): Promise<unknown> {\n // Handle null/undefined\n if (definition === null || definition === undefined) {\n return definition;\n }\n\n // Handle primitives (non-string)\n if (typeof definition !== \"object\" && typeof definition !== \"string\") {\n return definition;\n }\n\n // Handle strings (potential template literals)\n if (typeof definition === \"string\") {\n const parseResult = parseTemplate(definition);\n\n if (!parseResult.isTemplate) {\n // Not a template, return as-is\n return definition;\n }\n\n if (parseResult.error) {\n throw new Error(parseResult.error);\n }\n\n // Evaluate the template expression\n return evaluateExpression(parseResult.expression!, scope, config);\n }\n\n // Handle arrays\n if (Array.isArray(definition)) {\n const results = await Promise.all(\n definition.map((item) => mapDefinition(item, scope, config)),\n );\n return results;\n }\n\n // Handle objects\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(definition as Record<string, unknown>)) {\n result[key] = await mapDefinition(\n (definition as Record<string, unknown>)[key],\n scope,\n config,\n );\n }\n return result;\n}\n\n/**\n * Validate a mapping definition for syntax errors\n * Returns an array of error messages\n */\nexport function validateMapping(definition: unknown, path = \"root\"): string[] {\n const errors: string[] = [];\n\n if (definition === null || definition === undefined) {\n return errors;\n }\n\n if (typeof definition === \"string\") {\n const parseResult = parseTemplate(definition);\n if (parseResult.isTemplate && parseResult.error) {\n errors.push(`${path}: ${parseResult.error}`);\n }\n return errors;\n }\n\n if (Array.isArray(definition)) {\n definition.forEach((item, index) => {\n errors.push(...validateMapping(item, `${path}[${index}]`));\n });\n return errors;\n }\n\n if (typeof definition === \"object\") {\n for (const key of Object.keys(definition)) {\n errors.push(\n ...validateMapping(\n (definition as Record<string, unknown>)[key],\n `${path}.${key}`,\n ),\n );\n }\n }\n\n return errors;\n}\n\n/**\n * Generate default mapping between source and target schemas\n */\nexport function generateDefaultMapping(\n sourceSchema: GraphQLSchema,\n sourceNode: string,\n sourceOperation: string,\n targetSchema: GraphQLSchema,\n targetNode: string,\n targetOperation: string,\n): Record<string, unknown> {\n const mapping: Record<string, unknown> = {};\n\n // Get source operation output type using the configuration\n const sourceReturnTypeName = getReturnTypeForOperation(\n sourceNode,\n sourceOperation,\n );\n let sourceOutputType = null;\n\n if (sourceReturnTypeName) {\n sourceOutputType = sourceSchema.types[sourceReturnTypeName];\n } else {\n // Fallback to schema lookup\n let sourceOperationField = null;\n if (\n sourceSchema.queryType &&\n sourceSchema.types[sourceSchema.queryType]?.fields[sourceOperation]\n ) {\n sourceOperationField =\n sourceSchema.types[sourceSchema.queryType].fields[sourceOperation];\n } else if (\n sourceSchema.mutationType &&\n sourceSchema.types[sourceSchema.mutationType]?.fields[sourceOperation]\n ) {\n sourceOperationField =\n sourceSchema.types[sourceSchema.mutationType].fields[sourceOperation];\n }\n\n if (sourceOperationField) {\n const sourceOutputTypeName = sourceOperationField.type;\n sourceOutputType = sourceSchema.types[sourceOutputTypeName];\n }\n }\n\n // Get the target input type from target schema\n const targetInputTypeName = getInputTypeForOperation(\n targetNode,\n targetOperation,\n );\n const targetInputType = targetInputTypeName\n ? targetSchema.types[targetInputTypeName]\n : null;\n\n if (!sourceOutputType || !targetInputType) {\n return mapping;\n }\n\n // Get source fields from the output type\n const sourceFields = sourceOutputType.fields || {};\n\n // Get target fields from the input type\n const targetFields =\n targetInputType.inputFields || targetInputType.fields || {};\n\n // Helper function to add a mapping with nested path support\n const addMapping = (path: string, sourcePath: string) => {\n // Use new template literal syntax\n const templateValue = `\\${output.${sourcePath}}`;\n\n if (path.includes(\".\")) {\n const pathParts = path.split(\".\");\n let currentObj: Record<string, unknown> = mapping;\n\n // Create nested objects for each part of the path except the last one\n for (let i = 0; i < pathParts.length - 1; i++) {\n const part = pathParts[i];\n if (!currentObj[part]) {\n currentObj[part] = {};\n }\n currentObj = currentObj[part] as Record<string, unknown>;\n }\n\n // Set the value at the final path\n currentObj[pathParts[pathParts.length - 1]] = templateValue;\n } else {\n mapping[path] = templateValue;\n }\n };\n\n // Process fields and create mappings\n const processFields = (fields: Record<string, unknown>, parentPath = \"\") => {\n for (const fieldName in fields) {\n const field = fields[fieldName] as { type?: string };\n const fullPath = parentPath ? `${parentPath}.${fieldName}` : fieldName;\n\n // If this is a complex type, process its fields recursively\n if (\n field.type &&\n targetSchema.types[field.type] &&\n (targetSchema.types[field.type].kind === \"type\" ||\n targetSchema.types[field.type].kind === \"input\")\n ) {\n const nestedFields =\n targetSchema.types[field.type].fields ||\n targetSchema.types[field.type].inputFields ||\n {};\n processFields(nestedFields, fullPath);\n } else {\n // Try to match fields with the same name or similar names\n if (sourceFields[fieldName]) {\n addMapping(fullPath, fieldName);\n continue;\n }\n\n // Look for case-insensitive match\n const lowerTargetField = fieldName.toLowerCase();\n for (const sourceFieldName in sourceFields) {\n if (sourceFieldName.toLowerCase() === lowerTargetField) {\n addMapping(fullPath, sourceFieldName);\n break;\n }\n }\n }\n }\n };\n\n // Start processing from top-level fields\n processFields(targetFields);\n\n return mapping;\n}\n\n/**\n * Apply a mapping to input data using the new template literal syntax\n * This is used for preview/testing in the UI\n */\nexport async function applyMapping(\n mapping: Record<string, unknown>,\n inputData: Record<string, unknown>,\n config: MapperConfig = DEFAULT_CONFIG,\n): Promise<Record<string, unknown>> {\n // Build a basic scope for evaluation\n const scope: MappingScope = {\n output: inputData,\n TriggerInput: {},\n WorkflowState: {},\n RunContext: {\n runId: \"preview-run\",\n workflowKey: \"preview-workflow\",\n version: \"1.0.0\",\n tenantId: \"preview-tenant\",\n workspaceId: \"preview-workspace\",\n triggeredAt: new Date().toISOString(),\n },\n };\n\n const result = await mapDefinition(mapping, scope, config);\n return result as Record<string, unknown>;\n}\n\n/**\n * Convert old mapping syntax to new template literal syntax\n * This handles migration from $expr, $cast, $transform, __loop__ to ${...}\n */\nexport function convertToTemplateLiteral(oldMapping: unknown): unknown {\n if (oldMapping === null || oldMapping === undefined) {\n return oldMapping;\n }\n\n // Handle primitives\n if (typeof oldMapping !== \"object\") {\n // Check for old $.field syntax\n if (typeof oldMapping === \"string\" && oldMapping.startsWith(\"$.\")) {\n const path = oldMapping.slice(2);\n return `\\${output.${path}}`;\n }\n return oldMapping;\n }\n\n // Handle arrays\n if (Array.isArray(oldMapping)) {\n return oldMapping.map((item) => convertToTemplateLiteral(item));\n }\n\n const obj = oldMapping as Record<string, unknown>;\n\n // Check for $expr (expression mapping)\n if (\"$expr\" in obj && Object.keys(obj).length === 1) {\n const expr = obj.$expr as string;\n // Replace 'input.' with 'output.' and 'doc.' with 'item.'\n const converted = expr\n .replace(/\\binput\\./g, \"output.\")\n .replace(/\\bdoc\\./g, \"item.\")\n .replace(/\\bdoc\\[/g, \"item[\")\n .replace(/\\bi\\b/g, \"index\");\n return `\\${${converted}}`;\n }\n\n // Check for $cast (cast mapping)\n if (\"$cast\" in obj) {\n const cast = obj.$cast as { value: string; type: string };\n const path = cast.value.startsWith(\"$.\") ? cast.value.slice(2) : cast.value;\n\n switch (cast.type) {\n case \"int\":\n return `\\${parseInt(output.${path})}`;\n case \"float\":\n return `\\${parseFloat(output.${path})}`;\n case \"str\":\n return `\\${String(output.${path})}`;\n case \"bool\":\n return `\\${Boolean(output.${path})}`;\n default:\n return `\\${output.${path}}`;\n }\n }\n\n // Check for $transform (transform mapping)\n if (\"$transform\" in obj) {\n const transform = obj.$transform as { function: string; args: string[] };\n const args = transform.args.map((arg) => {\n if (typeof arg === \"string\" && arg.startsWith(\"$.\")) {\n return `output.${arg.slice(2)}`;\n }\n return JSON.stringify(arg);\n });\n\n switch (transform.function) {\n case \"uppercase\":\n return `\\${${args[0]}.toUpperCase()}`;\n case \"lowercase\":\n return `\\${${args[0]}.toLowerCase()}`;\n case \"trim\":\n return `\\${${args[0]}.trim()}`;\n case \"concat\":\n return `\\${${args.join(\" + \")}}`;\n case \"split\":\n return `\\${${args[0]}.split(${args[1]})}`;\n case \"join\":\n return `\\${${args[0]}.join(${args[1]})}`;\n case \"add\":\n return `\\${${args[0]} + ${args[1]}}`;\n case \"subtract\":\n return `\\${${args[0]} - ${args[1]}}`;\n case \"multiply\":\n return `\\${${args[0]} * ${args[1]}}`;\n default:\n return `\\${${args[0]}}`;\n }\n }\n\n // Check for __loop__ (loop mapping)\n if (\"__loop__\" in obj) {\n const loop = obj.__loop__ as {\n path: string;\n template: Record<string, unknown>;\n fallback?: unknown;\n };\n const path = loop.path.startsWith(\"$.\") ? loop.path.slice(2) : loop.path;\n\n // Convert template to inline map expression\n const templateKeys = Object.keys(loop.template);\n if (templateKeys.length === 1) {\n // Simple single-value extraction\n const key = templateKeys[0];\n const value = loop.template[key];\n if (typeof value === \"object\" && value && \"$expr\" in value) {\n const expr = (value as { $expr: string }).$expr\n .replace(/\\bdoc\\./g, \"item.\")\n .replace(/\\bdoc\\[/g, \"item[\");\n return `\\${output.${path}.map(item => ${expr})}`;\n }\n }\n\n // Complex template - map to object creation\n const mappings = templateKeys.map((key) => {\n const value = loop.template[key];\n if (typeof value === \"object\" && value && \"$expr\" in value) {\n const expr = (value as { $expr: string }).$expr\n .replace(/\\bdoc\\./g, \"item.\")\n .replace(/\\bdoc\\[/g, \"item[\")\n .replace(/\\bi\\b/g, \"index\");\n return `${key}: ${expr}`;\n }\n return `${key}: ${JSON.stringify(value)}`;\n });\n\n const fallback = loop.fallback ? JSON.stringify(loop.fallback) : \"[]\";\n return `\\${(output.${path} || ${fallback}).map((item, index) => ({ ${mappings.join(\", \")} }))}`;\n }\n\n // Recursively process nested objects\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n result[key] = convertToTemplateLiteral(obj[key]);\n }\n return result;\n}\n\n/**\n * Helper function to get a nested value from an object\n */\nexport function getNestedValue(\n obj: Record<string, unknown>,\n path: string,\n): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n}\n\n/**\n * Helper function to set a nested value in an object\n */\nexport function setNestedValue(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): void {\n const parts = path.split(\".\");\n let current = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!current[part]) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n\n current[parts[parts.length - 1]] = value;\n}\n","import { useRef, useCallback, useEffect, useState } from \"react\";\nimport {\n ReactFlow,\n ReactFlowProvider,\n Panel,\n Background,\n Controls,\n MiniMap,\n useNodesState,\n useEdgesState,\n addEdge,\n type Connection,\n type Edge,\n type Node,\n type NodeMouseHandler,\n type NodeTypes,\n type EdgeTypes,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { SchemaNode, type SchemaNodeData } from \"./schema-node\";\nimport type { SchemaNodeData as SchemaFlowNodeData } from \"../lib/types\";\nimport { MappingEdge } from \"./mapping-edge\";\nimport { NodeGroup } from \"./node-group\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n DropdownMenuSeparator,\n DropdownMenuLabel,\n} from \"@burdenoff/fe-libs/ui\";\nimport {\n PlusCircle,\n Code,\n Type,\n Hash,\n List,\n Braces,\n Workflow,\n ChevronDown,\n} from \"lucide-react\";\nimport type { GraphQLSchema } from \"../lib/types\";\nimport { generateSchemaNodes } from \"../lib/node-generator\";\nimport { useToast } from \"../hooks/use-toast\";\nimport { areTypesCompatible } from \"../lib/type-utils\";\nimport { MappingDialog, type MappingType } from \"./mapping-dialog\";\nimport { parseTemplate } from \"../lib/mapping-utils\";\n\n// Define node and edge types for React Flow\nconst nodeTypes: NodeTypes = {\n schemaNode: SchemaNode,\n nodeGroup: NodeGroup,\n};\n\nconst edgeTypes: EdgeTypes = {\n mappingEdge: MappingEdge,\n};\n\n// Type for selected node with schema data\ninterface SelectedSchemaNode {\n id: string;\n data: SchemaNodeData;\n}\n\n// Type guard to check if node data has schema fields (path, type)\nfunction isSchemaNodeData(data: object): data is SchemaNodeData {\n return (\n data !== null &&\n typeof data === \"object\" &&\n \"path\" in data &&\n \"type\" in data &&\n \"side\" in data\n );\n}\n\ninterface VisualMapperProps {\n sourceSchema: GraphQLSchema;\n targetSchema: GraphQLSchema;\n sourceNode: string;\n sourceOperation: string;\n targetNode: string;\n targetOperation: string;\n mapping: Record<string, unknown>;\n onMappingChange: (mapping: Record<string, unknown>) => void;\n}\n\n/**\n * Detect the mapping type from a template literal expression\n */\nfunction detectMappingType(value: unknown): string {\n if (typeof value !== \"string\") return \"direct\";\n\n const parseResult = parseTemplate(value);\n if (!parseResult.isTemplate) return \"direct\";\n\n const expr = parseResult.expression || \"\";\n\n // Check for array operations\n if (\n expr.includes(\".map(\") ||\n expr.includes(\".filter(\") ||\n expr.includes(\".reduce(\") ||\n expr.includes(\".find(\") ||\n expr.includes(\".some(\") ||\n expr.includes(\".every(\") ||\n expr.includes(\".flat(\") ||\n expr.includes(\".flatMap(\") ||\n expr.includes(\".sort(\")\n ) {\n return \"array\";\n }\n\n // Check for object operations\n if (\n expr.includes(\"Object.keys(\") ||\n expr.includes(\"Object.values(\") ||\n expr.includes(\"Object.entries(\") ||\n expr.includes(\"Object.assign(\") ||\n expr.includes(\"Object.fromEntries(\") ||\n expr.startsWith(\"({\") ||\n expr.startsWith(\"{ ...\")\n ) {\n return \"object\";\n }\n\n // Check for cast operations\n if (\n expr.startsWith(\"parseInt(\") ||\n expr.startsWith(\"parseFloat(\") ||\n expr.startsWith(\"String(\") ||\n expr.startsWith(\"Boolean(\") ||\n expr.startsWith(\"Number(\")\n ) {\n return \"cast\";\n }\n\n // Check for context variables\n if (\n expr.includes(\"TriggerInput.\") ||\n expr.includes(\"WorkflowState.\") ||\n expr.includes(\"RunContext.\")\n ) {\n return \"context\";\n }\n\n // Check for transform operations\n if (\n expr.includes(\".toUpperCase()\") ||\n expr.includes(\".toLowerCase()\") ||\n expr.includes(\".trim()\") ||\n expr.includes(\".split(\") ||\n expr.includes(\".join(\") ||\n expr.includes(\".replace(\") ||\n expr.includes(\".substring(\") ||\n expr.includes(\".slice(\")\n ) {\n return \"transform\";\n }\n\n // Check for expression (math, ternary, etc.)\n if (\n expr.includes(\" + \") ||\n expr.includes(\" - \") ||\n expr.includes(\" * \") ||\n expr.includes(\" / \") ||\n expr.includes(\" ? \") ||\n expr.includes(\" && \") ||\n expr.includes(\" || \") ||\n expr.includes(\" ?? \") ||\n expr.includes(\"Math.\")\n ) {\n return \"expression\";\n }\n\n // Simple field access\n return \"direct\";\n}\n\n/**\n * Get the color for a mapping type\n */\nfunction getMappingTypeColor(mappingType: string): string {\n switch (mappingType) {\n case \"direct\":\n return \"#3b82f6\"; // blue\n case \"expression\":\n return \"#8b5cf6\"; // violet\n case \"transform\":\n return \"#ec4899\"; // pink\n case \"cast\":\n return \"#10b981\"; // emerald\n case \"array\":\n return \"#f97316\"; // orange\n case \"object\":\n return \"#6366f1\"; // indigo\n case \"context\":\n return \"#14b8a6\"; // teal\n default:\n return \"#6b7280\"; // gray\n }\n}\n\nfunction VisualMapperContent({\n sourceSchema,\n targetSchema,\n sourceNode,\n sourceOperation,\n targetNode,\n targetOperation,\n mapping,\n onMappingChange,\n}: VisualMapperProps) {\n const { toast } = useToast();\n const reactFlowWrapper = useRef<HTMLDivElement>(null);\n const [selectedSourceNode, setSelectedSourceNode] =\n useState<SelectedSchemaNode | null>(null);\n const [selectedTargetNode, setSelectedTargetNode] =\n useState<SelectedSchemaNode | null>(null);\n const [mappingDialogOpen, setMappingDialogOpen] = useState(false);\n const [currentMappingType, setCurrentMappingType] =\n useState<MappingType>(\"expression\");\n\n // Generate nodes based on schema — use default Node type for xyflow compatibility\n const [nodes, setNodes, onNodesChange] = useNodesState<Node>([]);\n const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);\n\n // Generate nodes when inputs change\n useEffect(() => {\n if (\n sourceSchema &&\n targetSchema &&\n sourceNode &&\n sourceOperation &&\n targetNode &&\n targetOperation\n ) {\n const { nodes: generatedNodes } = generateSchemaNodes(\n sourceSchema,\n sourceNode,\n sourceOperation,\n targetSchema,\n targetNode,\n targetOperation,\n );\n\n if (generatedNodes.length === 0) {\n toast({\n title: \"No fields found\",\n description:\n \"Could not find fields to map between these nodes and operations.\",\n variant: \"destructive\",\n });\n } else {\n // Set the generated nodes — SchemaFlowNodeData from lib/types matches Node structure\n setNodes(generatedNodes as unknown as Node[]);\n\n // Add a small delay before fitting the view to ensure nodes are properly rendered\n setTimeout(() => {\n document\n .querySelector(\".react-flow__controls-fitview\")\n ?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n }, 100);\n }\n }\n }, [\n sourceSchema,\n targetSchema,\n sourceNode,\n sourceOperation,\n targetNode,\n targetOperation,\n setNodes,\n toast,\n ]);\n\n // Update edges when mapping changes\n useEffect(() => {\n // Convert mapping to edges\n const newEdges: Edge[] = [];\n\n // Helper function to process nested mappings\n const processMapping = (obj: Record<string, unknown>, parentPath = \"\") => {\n for (const key in obj) {\n const value = obj[key];\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n\n if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value)\n ) {\n // Process nested object\n processMapping(value as Record<string, unknown>, currentPath);\n } else if (typeof value === \"string\") {\n // Check if this is a template literal\n const parseResult = parseTemplate(value);\n const mappingType = detectMappingType(value);\n\n // Find the target node (only look at schema nodes with paths)\n const targetNodeObj = nodes.find(\n (n) =>\n isSchemaNodeData(n.data) &&\n n.data.path === currentPath &&\n n.data.side === \"target\",\n );\n\n if (targetNodeObj && isSchemaNodeData(targetNodeObj.data)) {\n if (parseResult.isTemplate) {\n // Extract source field from expression if it's a simple field access\n const expr = parseResult.expression || \"\";\n const simpleFieldMatch = expr.match(/^output\\.([a-zA-Z0-9_.]+)$/);\n\n if (simpleFieldMatch && mappingType === \"direct\") {\n // Simple direct mapping - try to find source node\n const sourcePath = simpleFieldMatch[1];\n const sourceNodeObj = nodes.find(\n (n) =>\n isSchemaNodeData(n.data) &&\n n.data.path === sourcePath &&\n n.data.side === \"source\",\n );\n\n if (sourceNodeObj && isSchemaNodeData(sourceNodeObj.data)) {\n const isCompatible = areTypesCompatible(\n sourceNodeObj.data.type,\n targetNodeObj.data.type,\n );\n\n newEdges.push({\n id: `${sourceNodeObj.id}-${targetNodeObj.id}`,\n source: sourceNodeObj.id,\n target: targetNodeObj.id,\n type: \"mappingEdge\",\n animated: true,\n data: {\n mappingType: \"direct\",\n isCompatible,\n color: isCompatible ? \"#3b82f6\" : \"#ef4444\",\n },\n });\n continue;\n }\n }\n\n // Complex expression - create edge from virtual source\n newEdges.push({\n id: `mapping-${currentPath}`,\n source: \"virtual-source\",\n target: targetNodeObj.id,\n type: \"mappingEdge\",\n animated: true,\n data: {\n mappingType,\n expression: value,\n color: getMappingTypeColor(mappingType),\n },\n });\n }\n }\n }\n }\n };\n\n // Process the mapping\n processMapping(mapping);\n\n setEdges(newEdges);\n }, [mapping, nodes, setEdges]);\n\n const onConnect = useCallback(\n (connection: Connection) => {\n // Check if this is a valid mapping connection (source to target)\n const sourceNodeObj = nodes.find((n) => n.id === connection.source);\n const targetNodeObj = nodes.find((n) => n.id === connection.target);\n\n // Ensure both nodes are schema nodes with proper data\n if (\n sourceNodeObj &&\n targetNodeObj &&\n isSchemaNodeData(sourceNodeObj.data) &&\n isSchemaNodeData(targetNodeObj.data) &&\n sourceNodeObj.data.side === \"source\" &&\n targetNodeObj.data.side === \"target\"\n ) {\n // Check if the types are compatible\n const sourceType = sourceNodeObj.data.type;\n const targetType = targetNodeObj.data.type;\n const isCompatible = areTypesCompatible(sourceType, targetType);\n\n // Create the edge with compatibility information\n const newEdge = {\n ...connection,\n type: \"mappingEdge\",\n animated: true,\n data: {\n mappingType: \"direct\",\n isCompatible,\n color: isCompatible ? \"#3b82f6\" : \"#ef4444\",\n },\n };\n setEdges((eds) => addEdge(newEdge, eds));\n\n // Update the mapping object with template literal syntax\n const updatedMapping = { ...mapping };\n const sourcePath = sourceNodeObj.data.path;\n const targetPath = targetNodeObj.data.path;\n\n // Use new template literal syntax\n const templateValue = `\\${output.${sourcePath}}`;\n\n // Handle nested paths properly\n if (targetPath.includes(\".\")) {\n const pathParts = targetPath.split(\".\");\n let currentObj: Record<string, unknown> = updatedMapping;\n\n // Create nested objects for each part of the path except the last one\n for (let i = 0; i < pathParts.length - 1; i++) {\n const part = pathParts[i];\n if (!currentObj[part]) {\n currentObj[part] = {};\n } else if (typeof currentObj[part] !== \"object\") {\n currentObj[part] = {};\n }\n currentObj = currentObj[part] as Record<string, unknown>;\n }\n\n // Set the value at the final path\n currentObj[pathParts[pathParts.length - 1]] = templateValue;\n } else {\n // Simple direct mapping for non-nested paths\n updatedMapping[targetPath] = templateValue;\n }\n\n onMappingChange(updatedMapping);\n\n // Show appropriate toast based on type compatibility\n if (isCompatible) {\n toast({\n title: \"Mapping created\",\n description: `Mapped ${sourcePath} (${sourceType}) to ${targetPath} (${targetType})`,\n });\n } else {\n toast({\n title: \"Type mismatch warning\",\n description: `Mapped ${sourcePath} (${sourceType}) to ${targetPath} (${targetType}). Types may not be compatible.`,\n variant: \"destructive\",\n });\n }\n } else {\n toast({\n title: \"Invalid mapping\",\n description: \"You can only map from source to target fields\",\n variant: \"destructive\",\n });\n }\n },\n [nodes, mapping, onMappingChange, toast, setEdges],\n );\n\n const onEdgeDelete = useCallback(\n (edge: Edge) => {\n const targetNodeObj = nodes.find((n) => n.id === edge.target);\n if (targetNodeObj && isSchemaNodeData(targetNodeObj.data)) {\n const targetPath = targetNodeObj.data.path;\n const updatedMapping = { ...mapping };\n\n if (targetPath.includes(\".\")) {\n const pathParts = targetPath.split(\".\");\n let currentObj: Record<string, unknown> = updatedMapping;\n let parentObj: Record<string, unknown> | null = null;\n let lastPart: string | null = null;\n\n // Navigate to the parent of the property to delete\n for (let i = 0; i < pathParts.length - 1; i++) {\n const part = pathParts[i];\n if (!currentObj[part] || typeof currentObj[part] !== \"object\") {\n return; // Path doesn't exist or isn't an object\n }\n parentObj = currentObj;\n currentObj = currentObj[part] as Record<string, unknown>;\n lastPart = pathParts[i + 1];\n }\n\n // Delete the property\n if (parentObj && lastPart) {\n delete currentObj[pathParts[pathParts.length - 1]];\n\n // Clean up empty objects\n if (Object.keys(currentObj).length === 0 && pathParts.length > 1) {\n delete parentObj[pathParts[pathParts.length - 2]];\n }\n }\n } else {\n delete updatedMapping[targetPath];\n }\n\n onMappingChange(updatedMapping);\n }\n setEdges((eds) => eds.filter((e) => e.id !== edge.id));\n },\n [nodes, mapping, onMappingChange, setEdges],\n );\n\n const onNodeClick: NodeMouseHandler = useCallback((_event, node) => {\n if (\n node.data &&\n typeof node.data === \"object\" &&\n isSchemaNodeData(node.data as object)\n ) {\n const schemaNode: SelectedSchemaNode = {\n id: node.id,\n data: node.data as unknown as SchemaNodeData,\n };\n if (schemaNode.data.side === \"source\") {\n setSelectedSourceNode(schemaNode);\n } else if (schemaNode.data.side === \"target\") {\n setSelectedTargetNode(schemaNode);\n }\n }\n }, []);\n\n const openMappingDialog = (type: MappingType) => {\n setCurrentMappingType(type);\n setMappingDialogOpen(true);\n };\n\n const handleSaveMappingDialog = (\n expression: string,\n targetFieldName?: string,\n ) => {\n // Use targetFieldName from dialog if provided, otherwise use selected node\n const targetPath = targetFieldName || selectedTargetNode?.data?.path;\n\n if (!targetPath) {\n toast({\n title: \"No target field specified\",\n description:\n \"Please enter a target field name or select a target field in the visual mapper\",\n variant: \"destructive\",\n });\n return;\n }\n\n const updatedMapping = { ...mapping };\n\n // Handle nested paths properly\n if (targetPath.includes(\".\")) {\n const pathParts = targetPath.split(\".\");\n let currentObj: Record<string, unknown> = updatedMapping;\n\n // Create nested objects for each part of the path except the last one\n for (let i = 0; i < pathParts.length - 1; i++) {\n const part = pathParts[i];\n if (!currentObj[part]) {\n currentObj[part] = {};\n } else if (typeof currentObj[part] !== \"object\") {\n currentObj[part] = {};\n }\n currentObj = currentObj[part] as Record<string, unknown>;\n }\n\n // Set the mapping expression at the final path\n currentObj[pathParts[pathParts.length - 1]] = expression;\n } else {\n // Simple mapping for non-nested paths\n updatedMapping[targetPath] = expression;\n }\n\n onMappingChange(updatedMapping);\n\n const mappingType = detectMappingType(expression);\n toast({\n title: `${mappingType.charAt(0).toUpperCase() + mappingType.slice(1)} mapping created`,\n description: `Applied mapping to ${targetPath}`,\n });\n };\n\n // Mapping type menu items with icons\n const mappingTypeItems = [\n {\n type: \"direct\" as MappingType,\n label: \"Direct\",\n icon: Type,\n description: \"Simple field access\",\n },\n {\n type: \"expression\" as MappingType,\n label: \"Expression\",\n icon: Code,\n description: \"Custom JavaScript expression\",\n },\n {\n type: \"transform\" as MappingType,\n label: \"Transform\",\n icon: Type,\n description: \"String transformations\",\n },\n {\n type: \"cast\" as MappingType,\n label: \"Cast\",\n icon: Hash,\n description: \"Type conversions\",\n },\n {\n type: \"array\" as MappingType,\n label: \"Array\",\n icon: List,\n description: \"Array operations (map, filter, reduce)\",\n },\n {\n type: \"object\" as MappingType,\n label: \"Object\",\n icon: Braces,\n description: \"Object manipulation\",\n },\n {\n type: \"context\" as MappingType,\n label: \"Context\",\n icon: Workflow,\n description: \"Workflow state access\",\n },\n ];\n\n return (\n <div className=\"h-[550px] w-full border rounded-md\" ref={reactFlowWrapper}>\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n onEdgeClick={(_, edge) => onEdgeDelete(edge)}\n onNodeClick={onNodeClick}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n fitView\n fitViewOptions={{ padding: 0.2 }}\n minZoom={0.4}\n maxZoom={1.5}\n defaultViewport={{ x: 0, y: 0, zoom: 0.7 }}\n attributionPosition=\"bottom-right\"\n >\n <Controls />\n <MiniMap />\n <Background gap={12} size={1} />\n <Panel position=\"top-right\">\n <div className=\"flex flex-col gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex items-center gap-1\"\n >\n <PlusCircle className=\"h-4 w-4\" />\n Add Mapping\n <ChevronDown className=\"h-3 w-3\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56 z-[100000]\">\n <DropdownMenuLabel>Mapping Types</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {mappingTypeItems.map((item) => (\n <DropdownMenuItem\n key={item.type}\n onClick={() => openMappingDialog(item.type)}\n className=\"flex items-start gap-2 cursor-pointer\"\n >\n <item.icon\n className=\"h-4 w-4 mt-0.5\"\n style={{ color: getMappingTypeColor(item.type) }}\n />\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{item.label}</span>\n <span className=\"text-xs text-muted-foreground\">\n {item.description}\n </span>\n </div>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Selected field indicator */}\n {selectedTargetNode && (\n <div className=\"p-2 bg-muted rounded-md text-xs\">\n <div className=\"text-muted-foreground\">Target:</div>\n <div className=\"font-mono\">{selectedTargetNode.data.path}</div>\n </div>\n )}\n </div>\n </Panel>\n </ReactFlow>\n\n <MappingDialog\n open={mappingDialogOpen}\n onOpenChange={setMappingDialogOpen}\n onSave={handleSaveMappingDialog}\n mappingType={currentMappingType}\n sourceField={selectedSourceNode?.data?.path}\n targetField={selectedTargetNode?.data?.path}\n sourceSchema={sourceSchema}\n sourceOperation={sourceOperation}\n targetSchema={targetSchema}\n targetOperation={targetOperation}\n />\n </div>\n );\n}\n\nexport function VisualMapper(props: VisualMapperProps) {\n return (\n <ReactFlowProvider>\n <VisualMapperContent {...props} />\n </ReactFlowProvider>\n );\n}\n","import { useEffect, useRef, type FocusEvent } from \"react\";\nimport { Card } from \"@burdenoff/fe-libs/ui\";\n\ninterface CodeEditorProps {\n value: string;\n onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n language?: string;\n onBlur?: (e: FocusEvent<HTMLTextAreaElement>) => void; // Add onBlur prop\n}\n\nexport function CodeEditor({\n value,\n onChange,\n language: _language = \"json\",\n onBlur,\n}: CodeEditorProps) {\n const editorRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (editorRef.current) {\n editorRef.current.value = value;\n }\n }, [value]);\n\n return (\n <Card className=\"relative \">\n <textarea\n ref={editorRef}\n className=\"w-full h-[400px] p-4 font-mono bg-surface text-sm resize-none focus:outline-none focus:ring-2 focus:ring-primary transition-shadow duration-200\"\n defaultValue={value}\n onChange={onChange}\n spellCheck={false}\n onBlur={onBlur}\n />\n </Card>\n );\n}\n","import { Card, CardContent } from \"@burdenoff/fe-libs/ui\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@burdenoff/fe-libs/ui\";\nimport { applyMapping } from \"../lib/mapping-utils\";\nimport { useMemo } from \"react\";\n\ninterface MappingPreviewProps {\n input: Record<string, unknown>;\n mapping: Record<string, unknown>;\n output: Record<string, unknown> | null;\n}\n\nexport function MappingPreview({\n input,\n mapping,\n output,\n}: MappingPreviewProps) {\n // Generate output when input or mapping changes - use useMemo instead of effect\n const generatedOutput = useMemo(() => {\n try {\n const result = applyMapping(mapping, input);\n return result;\n } catch (error) {\n console.error(\"Error applying mapping:\", error);\n return {\n error: true,\n message:\n error instanceof Error\n ? error.message\n : \"Unknown error occurred while applying mapping\",\n input: input,\n };\n }\n }, [input, mapping]);\n\n return (\n <Tabs defaultValue=\"input\">\n <TabsList className=\"mb-4\">\n <TabsTrigger value=\"input\">Input</TabsTrigger>\n <TabsTrigger value=\"mapping\">Mapping</TabsTrigger>\n <TabsTrigger value=\"output\">Output</TabsTrigger>\n </TabsList>\n <TabsContent value=\"input\">\n <Card>\n <CardContent className=\"p-4\">\n <pre className=\"text-sm overflow-auto max-h-[400px]\">\n {JSON.stringify(input, null, 2)}\n </pre>\n </CardContent>\n </Card>\n </TabsContent>\n <TabsContent value=\"mapping\">\n <Card>\n <CardContent className=\"p-4\">\n <pre className=\"text-sm overflow-auto max-h-[400px]\">\n {JSON.stringify(mapping, null, 2)}\n </pre>\n </CardContent>\n </Card>\n </TabsContent>\n <TabsContent value=\"output\">\n <Card>\n <CardContent className=\"p-4\">\n <pre className=\"text-sm overflow-auto max-h-[400px]\">\n {output\n ? JSON.stringify(output, null, 2)\n : generatedOutput\n ? JSON.stringify(generatedOutput, null, 2)\n : \"No output generated yet\"}\n </pre>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@burdenoff/fe-libs/ui\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@burdenoff/fe-libs/ui\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { Badge } from \"@burdenoff/fe-libs/ui\";\nimport { VisualMapper } from \"./visual-mapper\";\nimport { CodeEditor } from \"./code-editor\";\nimport { MappingPreview } from \"./mapping-preview\";\nimport type { GraphQLSchema } from \"../lib/types\";\nimport {\n generateDefaultMapping,\n applyMapping,\n validateMapping,\n parseTemplate,\n} from \"../lib/mapping-utils\";\nimport { useToast } from \"../hooks/use-toast\";\nimport { getReturnTypeForOperation } from \"./config/data\";\nimport { AlertCircle, CheckCircle2 } from \"lucide-react\";\n\n// Helper function to generate sample values based on type (moved outside component)\nfunction generateSampleValueForType(\n typeName: string,\n schema: GraphQLSchema,\n): unknown {\n // Handle list types\n if (typeName.startsWith(\"[\") && typeName.endsWith(\"]\")) {\n const innerType = typeName\n .substring(1, typeName.length - 1)\n .replace(/!$/, \"\");\n return [generateSampleValueForType(innerType, schema)];\n }\n\n // Handle non-null types\n const isNonNull = typeName.endsWith(\"!\");\n const baseType = isNonNull ? typeName.slice(0, -1) : typeName;\n\n // Generate values based on type\n switch (baseType) {\n case \"String\":\n return \"Sample string\";\n case \"Int\":\n return 42;\n case \"Float\":\n return 3.14;\n case \"Boolean\":\n return true;\n case \"ID\":\n return \"id-123456\";\n default:\n // For complex types, check if it exists in the schema\n if (schema.types[baseType]) {\n const type = schema.types[baseType];\n\n // For object types, recursively generate sample values\n if (type.kind === \"type\" || type.kind === \"input\") {\n const obj: Record<string, unknown> = {};\n for (const fieldName in type.fields || {}) {\n obj[fieldName] = generateSampleValueForType(\n type.fields[fieldName].type,\n schema,\n );\n }\n return obj;\n }\n\n // For enum types, return a placeholder\n if (type.kind === \"enum\") {\n return `ENUM_${baseType}`;\n }\n }\n\n // Default for unknown types\n return null;\n }\n}\n\n// Generate sample input based on schema (moved outside component)\nfunction generateSampleInput(\n schema: GraphQLSchema,\n nodeType: string,\n operation: string,\n): Record<string, unknown> {\n // Get the return type for the operation\n const returnTypeName = getReturnTypeForOperation(nodeType, operation);\n if (!returnTypeName || !schema.types[returnTypeName]) {\n return {};\n }\n\n const returnType = schema.types[returnTypeName];\n const result: Record<string, unknown> = {};\n\n // Generate sample data for each field\n for (const fieldName in returnType.fields || {}) {\n const field = returnType.fields[fieldName];\n result[fieldName] = generateSampleValueForType(field.type, schema);\n }\n return result;\n}\n\ninterface MappingEditorProps {\n sourceSchema: GraphQLSchema;\n targetSchema: GraphQLSchema;\n sourceNode: string;\n sourceOperation: string;\n targetNode: string;\n targetOperation: string;\n className?: string;\n setEdges?: (edges: unknown) => void;\n edgeId?: string;\n}\n\nexport function MappingEditor({\n sourceSchema,\n targetSchema,\n sourceNode,\n sourceOperation,\n targetNode,\n targetOperation,\n className,\n setEdges,\n edgeId,\n}: MappingEditorProps) {\n const { toast } = useToast();\n const [mappingJson, setMappingJson] = useState<Record<string, unknown>>({});\n const [jsonDataString, setJsonDataString] = useState(\n JSON.stringify(mappingJson, null, 2),\n );\n const [jsonError, setJsonError] = useState<string | null>(null);\n const [validationErrors, setValidationErrors] = useState<string[]>([]);\n const [sampleInput, setSampleInput] = useState<Record<string, unknown>>({});\n const [previewOutput, setPreviewOutput] = useState<Record<\n string,\n unknown\n > | null>(null);\n const [isTestingMapping, setIsTestingMapping] = useState(false);\n\n useEffect(() => {\n const defaultMapping = generateDefaultMapping(\n sourceSchema,\n sourceNode,\n sourceOperation,\n targetSchema,\n targetNode,\n targetOperation,\n );\n setMappingJson(defaultMapping);\n setJsonDataString(JSON.stringify(defaultMapping, null, 2));\n\n // Generate sample input based on the source schema structure\n const generatedSampleInput = generateSampleInput(\n sourceSchema,\n sourceNode,\n sourceOperation,\n );\n setSampleInput(generatedSampleInput);\n\n // Validate the default mapping\n const errors = validateMapping(defaultMapping);\n setValidationErrors(errors);\n }, [\n sourceSchema,\n targetSchema,\n sourceNode,\n sourceOperation,\n targetNode,\n targetOperation,\n ]);\n\n const handleJsonStringChange = (\n e: React.ChangeEvent<HTMLTextAreaElement>,\n ) => {\n setJsonDataString(e.target.value);\n // Clear previous errors while typing\n setJsonError(null);\n };\n\n // Handler to parse and validate JSON when the textarea loses focus\n const handleJsonBlur = () => {\n try {\n const parsed = JSON.parse(jsonDataString);\n setMappingJson(parsed);\n setJsonError(null);\n\n // Validate the mapping\n const errors = validateMapping(parsed);\n setValidationErrors(errors);\n } catch (error) {\n console.error(\"JSON parsing error:\", error);\n setJsonError(\"Invalid JSON format. Please correct it.\");\n }\n };\n\n const handleMappingChange = (newMapping: Record<string, unknown>) => {\n setMappingJson(newMapping);\n setJsonDataString(JSON.stringify(newMapping, null, 2));\n\n // Validate the new mapping\n const errors = validateMapping(newMapping);\n setValidationErrors(errors);\n\n // Auto-save to edge when mapping changes\n if (setEdges && edgeId && errors.length === 0) {\n setEdges((edges: unknown[]) => {\n return (edges as { id: string; mapping?: unknown }[]).map((edge) => {\n if (edge.id === edgeId) {\n return {\n ...edge,\n mapping: {\n definition: newMapping,\n comment: `Mapping from ${sourceNode}.${sourceOperation} to ${targetNode}.${targetOperation}`,\n },\n };\n }\n return edge;\n });\n });\n }\n };\n\n const checkJsonValidity = () => {\n setJsonError(null);\n try {\n const parsedData = JSON.parse(jsonDataString);\n setMappingJson(parsedData);\n\n // Validate template literal syntax\n const errors = validateMapping(parsedData);\n if (errors.length > 0) {\n setValidationErrors(errors);\n throw new Error(`Validation errors: ${errors.join(\", \")}`);\n }\n\n if (setEdges && edgeId) {\n setEdges((edges: unknown[]) => {\n return (edges as { id: string; mapping?: unknown }[]).map((edge) => {\n if (edge.id === edgeId) {\n return {\n ...edge,\n mapping: {\n definition: parsedData,\n comment: `Mapping from ${sourceNode}.${sourceOperation} to ${targetNode}.${targetOperation}`,\n },\n };\n }\n return edge;\n });\n });\n }\n\n return parsedData;\n } catch (error) {\n if (error instanceof SyntaxError) {\n setJsonError(\"Cannot submit: Mapping data must be valid JSON.\");\n }\n console.error(\"Submission failed:\", error);\n throw error;\n }\n };\n\n const handleSaveMapping = () => {\n try {\n checkJsonValidity();\n toast({\n title: \"Mapping saved\",\n description: \"Your mapping configuration has been saved successfully.\",\n });\n } catch (error) {\n toast({\n title: \"Error saving mapping\",\n description:\n error instanceof Error\n ? error.message\n : \"Invalid mapping configuration\",\n variant: \"destructive\",\n });\n }\n };\n\n const handleTestMapping = async () => {\n try {\n setIsTestingMapping(true);\n const parsedData = checkJsonValidity();\n\n // Apply the mapping using the new template literal evaluator\n const result = await applyMapping(parsedData, sampleInput);\n setPreviewOutput(result);\n\n toast({\n title: \"Mapping tested\",\n description: \"Test completed successfully.\",\n });\n } catch (error) {\n console.error(\"Test mapping error:\", error);\n toast({\n title: \"Mapping test failed\",\n description:\n error instanceof Error ? error.message : \"Error executing mapping\",\n variant: \"destructive\",\n });\n } finally {\n setIsTestingMapping(false);\n }\n };\n\n // Detect mapping types used in the current mapping\n const detectMappingTypes = (\n mapping: Record<string, unknown>,\n ): Set<string> => {\n const types = new Set<string>();\n\n const processValue = (value: unknown) => {\n if (typeof value === \"string\") {\n const parseResult = parseTemplate(value);\n if (parseResult.isTemplate) {\n const expr = parseResult.expression || \"\";\n\n if (\n expr.includes(\".map(\") ||\n expr.includes(\".filter(\") ||\n expr.includes(\".reduce(\")\n ) {\n types.add(\"array\");\n } else if (expr.includes(\"Object.\") || expr.startsWith(\"({\")) {\n types.add(\"object\");\n } else if (\n expr.startsWith(\"parseInt(\") ||\n expr.startsWith(\"parseFloat(\") ||\n expr.startsWith(\"String(\")\n ) {\n types.add(\"cast\");\n } else if (\n expr.includes(\"TriggerInput.\") ||\n expr.includes(\"WorkflowState.\") ||\n expr.includes(\"RunContext.\")\n ) {\n types.add(\"context\");\n } else if (\n expr.includes(\".toUpperCase()\") ||\n expr.includes(\".toLowerCase()\") ||\n expr.includes(\".trim()\")\n ) {\n types.add(\"transform\");\n } else if (\n expr.includes(\" + \") ||\n expr.includes(\" ? \") ||\n expr.includes(\"Math.\")\n ) {\n types.add(\"expression\");\n } else {\n types.add(\"direct\");\n }\n }\n } else if (typeof value === \"object\" && value !== null) {\n Object.values(value).forEach(processValue);\n }\n };\n\n Object.values(mapping).forEach(processValue);\n return types;\n };\n\n const usedMappingTypes = detectMappingTypes(mappingJson);\n\n return (\n <div className={className}>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between\">\n <span>Mapping Configuration</span>\n {validationErrors.length === 0 ? (\n <Badge\n variant=\"outline\"\n className=\"text-[var(--color-status-success-text)] border-[var(--color-status-success-border)]\"\n >\n <CheckCircle2 className=\"h-3 w-3 mr-1\" />\n Valid\n </Badge>\n ) : (\n <Badge\n variant=\"outline\"\n className=\"text-[var(--color-status-error-text)] border-[var(--color-status-error-border)]\"\n >\n <AlertCircle className=\"h-3 w-3 mr-1\" />\n {validationErrors.length} Error\n {validationErrors.length > 1 ? \"s\" : \"\"}\n </Badge>\n )}\n </CardTitle>\n <CardDescription>\n Create a mapping from {sourceNode}.{sourceOperation} to {targetNode}\n .{targetOperation}\n </CardDescription>\n {usedMappingTypes.size > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {Array.from(usedMappingTypes).map((type) => (\n <Badge key={type} variant=\"secondary\" className=\"text-xs\">\n {type}\n </Badge>\n ))}\n </div>\n )}\n </CardHeader>\n <CardContent>\n <Tabs defaultValue=\"visual\" className=\"w-full\">\n <TabsList className=\"mb-4\">\n <TabsTrigger value=\"visual\">Visual Mapper</TabsTrigger>\n <TabsTrigger value=\"code\">JSON Editor</TabsTrigger>\n <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n </TabsList>\n <TabsContent value=\"visual\">\n <VisualMapper\n sourceSchema={sourceSchema}\n targetSchema={targetSchema}\n sourceNode={sourceNode}\n sourceOperation={sourceOperation}\n targetNode={targetNode}\n targetOperation={targetOperation}\n mapping={mappingJson}\n onMappingChange={handleMappingChange}\n />\n </TabsContent>\n <TabsContent value=\"code\">\n <CodeEditor\n value={jsonDataString}\n onBlur={handleJsonBlur}\n onChange={handleJsonStringChange}\n />\n <div className=\"mt-2 space-y-1\">\n <p className=\"text-xs text-muted-foreground\">\n Use JavaScript template literal syntax:{\" \"}\n <code className=\"bg-muted px-1 rounded\">\n ${\"{\"}output.field{\"}\"}\n </code>\n </p>\n {jsonError && (\n <p className=\"text-sm text-[var(--color-status-error-text)]\">\n {jsonError}\n </p>\n )}\n {validationErrors.length > 0 && (\n <div className=\"p-2 bg-[var(--color-status-error-bg-subtle)] rounded-md\">\n <p className=\"text-sm font-medium text-[var(--color-status-error-text)]\">\n Validation Errors:\n </p>\n <ul className=\"text-xs text-[var(--color-status-error-text)]/80 mt-1 list-disc list-inside\">\n {validationErrors.map((error, index) => (\n <li key={index}>{error}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n </TabsContent>\n <TabsContent value=\"preview\">\n <MappingPreview\n input={sampleInput}\n mapping={mappingJson}\n output={previewOutput}\n />\n </TabsContent>\n </Tabs>\n\n <div className=\"mt-6 flex justify-end space-x-2\">\n <Button\n variant=\"outline\"\n onClick={handleTestMapping}\n disabled={isTestingMapping}\n >\n {isTestingMapping ? \"Testing...\" : \"Test Mapping\"}\n </Button>\n <Button onClick={handleSaveMapping}>Save Mapping</Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n","import type { GraphQLSchema as CustomGraphQLSchema } from \"./types\";\nimport {\n buildSchema,\n type GraphQLSchema,\n GraphQLObjectType,\n GraphQLInputObjectType,\n GraphQLEnumType,\n GraphQLInterfaceType,\n GraphQLUnionType,\n GraphQLList,\n GraphQLNonNull,\n type GraphQLField,\n type GraphQLInputField,\n type GraphQLArgument,\n} from \"graphql\";\n\nexport function parseGraphQLSchema(sdl: string): CustomGraphQLSchema {\n // Initialize our custom schema structure\n const customSchema: CustomGraphQLSchema = {\n types: {},\n queryType: null,\n mutationType: null,\n subscriptionType: null,\n };\n\n try {\n // Parse the SDL using the GraphQL library\n const schema: GraphQLSchema = buildSchema(sdl);\n\n // Get root types\n const queryType = schema.getQueryType();\n const mutationType = schema.getMutationType();\n const subscriptionType = schema.getSubscriptionType();\n\n if (queryType) {\n customSchema.queryType = queryType.name;\n }\n\n if (mutationType) {\n customSchema.mutationType = mutationType.name;\n }\n\n if (subscriptionType) {\n customSchema.subscriptionType = subscriptionType.name;\n }\n\n // Get all types from the schema\n const typeMap = schema.getTypeMap();\n\n // Process each type\n Object.values(typeMap).forEach((type) => {\n // Skip built-in types (those starting with \"__\")\n if (type.name.startsWith(\"__\")) {\n return;\n }\n\n // Process different kinds of types\n if (type instanceof GraphQLObjectType) {\n processObjectType(type, customSchema);\n } else if (type instanceof GraphQLInputObjectType) {\n processInputObjectType(type, customSchema);\n } else if (type instanceof GraphQLEnumType) {\n processEnumType(type, customSchema);\n } else if (type instanceof GraphQLInterfaceType) {\n processInterfaceType(type, customSchema);\n } else if (type instanceof GraphQLUnionType) {\n processUnionType(type, customSchema);\n }\n });\n return customSchema;\n } catch (error) {\n console.error(\"Error parsing GraphQL schema:\", error);\n return customSchema;\n }\n}\n\n// Processed field structure\ninterface ProcessedField {\n name: string;\n type: string;\n isNonNull: boolean;\n isList: boolean;\n args: ProcessedArgument[];\n}\n\ninterface ProcessedArgument {\n name: string;\n type: string;\n isNonNull: boolean;\n isList: boolean;\n}\n\n// Process GraphQL Object Type\nfunction processObjectType(\n type: GraphQLObjectType,\n customSchema: CustomGraphQLSchema,\n) {\n const fields = type.getFields();\n const processedFields: Record<string, ProcessedField> = {};\n\n Object.values(fields).forEach((field) => {\n processedFields[field.name] = processField(field);\n });\n\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"type\",\n fields: processedFields,\n };\n}\n\n// Processed input field structure\ninterface ProcessedInputField {\n name: string;\n type: string;\n isNonNull: boolean;\n isList: boolean;\n args: ProcessedArgument[];\n}\n\n// Process GraphQL Input Object Type\nfunction processInputObjectType(\n type: GraphQLInputObjectType,\n customSchema: CustomGraphQLSchema,\n) {\n const fields = type.getFields();\n const processedFields: Record<string, ProcessedInputField> = {};\n\n Object.values(fields).forEach((field) => {\n processedFields[field.name] = processInputField(field);\n });\n\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"input\",\n fields: processedFields,\n inputFields: processedFields,\n };\n}\n\n// Process GraphQL Enum Type\nfunction processEnumType(\n type: GraphQLEnumType,\n customSchema: CustomGraphQLSchema,\n) {\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"enum\",\n fields: {},\n };\n}\n\n// Process GraphQL Interface Type\nfunction processInterfaceType(\n type: GraphQLInterfaceType,\n customSchema: CustomGraphQLSchema,\n) {\n const fields = type.getFields();\n const processedFields: Record<string, ProcessedField> = {};\n\n Object.values(fields).forEach((field) => {\n processedFields[field.name] = processField(field);\n });\n\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"interface\",\n fields: processedFields,\n };\n}\n\n// Process GraphQL Union Type\nfunction processUnionType(\n type: GraphQLUnionType,\n customSchema: CustomGraphQLSchema,\n) {\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"union\",\n fields: {},\n };\n}\n\n// Process a GraphQL Field\nfunction processField(\n field: GraphQLField<Record<string, unknown>, Record<string, unknown>>,\n): ProcessedField {\n const fieldType = field.type;\n const typeInfo = getTypeInfo(fieldType);\n\n const args = field.args.map((arg) => processArgument(arg));\n\n return {\n name: field.name,\n type: typeInfo.typeName,\n isNonNull: typeInfo.isNonNull,\n isList: typeInfo.isList,\n args: args,\n };\n}\n\n// Process a GraphQL Input Field\nfunction processInputField(field: GraphQLInputField): ProcessedInputField {\n const fieldType = field.type;\n const typeInfo = getTypeInfo(fieldType);\n\n return {\n name: field.name,\n type: typeInfo.typeName,\n isNonNull: typeInfo.isNonNull,\n isList: typeInfo.isList,\n args: [],\n };\n}\n\n// Process a GraphQL Argument\nfunction processArgument(arg: GraphQLArgument): ProcessedArgument {\n const argType = arg.type;\n const typeInfo = getTypeInfo(argType);\n\n return {\n name: arg.name,\n type: typeInfo.typeName,\n isNonNull: typeInfo.isNonNull,\n isList: typeInfo.isList,\n };\n}\n\n// GraphQL type with name and ofType properties\ninterface GraphQLTypeWithName {\n name?: string;\n ofType?: GraphQLTypeWithName | null;\n}\n\n// Extract type information from a GraphQL type\nfunction getTypeInfo(inputType: GraphQLTypeWithName): {\n typeName: string;\n isNonNull: boolean;\n isList: boolean;\n} {\n let typeName = \"\";\n let isNonNull = false;\n let isList = false;\n let currentType: GraphQLTypeWithName = inputType;\n\n // Handle non-null types\n if (currentType instanceof GraphQLNonNull) {\n isNonNull = true;\n currentType = currentType.ofType as GraphQLTypeWithName;\n }\n\n // Handle list types\n if (currentType instanceof GraphQLList) {\n isList = true;\n currentType = currentType.ofType as GraphQLTypeWithName;\n\n // Check if list items are non-null\n if (currentType instanceof GraphQLNonNull) {\n currentType = currentType.ofType as GraphQLTypeWithName;\n }\n }\n\n // Get the base type name\n if (currentType.name) {\n typeName = currentType.name;\n } else if (currentType.ofType?.name) {\n typeName = currentType.ofType.name;\n }\n\n return { typeName, isNonNull, isList };\n}\n\n// Merge multiple schemas into one\nexport function mergeGraphQLSchemas(\n schemas: CustomGraphQLSchema[],\n): CustomGraphQLSchema {\n const mergedSchema: CustomGraphQLSchema = {\n types: {},\n queryType: null,\n mutationType: null,\n subscriptionType: null,\n };\n\n for (const schema of schemas) {\n // Merge types\n for (const typeName in schema.types) {\n if (!mergedSchema.types[typeName]) {\n mergedSchema.types[typeName] = schema.types[typeName];\n } else {\n // If type already exists, merge fields\n const existingType = mergedSchema.types[typeName];\n const newType = schema.types[typeName];\n\n for (const fieldName in newType.fields) {\n if (!existingType.fields[fieldName]) {\n existingType.fields[fieldName] = newType.fields[fieldName];\n }\n }\n\n if (newType.inputFields) {\n if (!existingType.inputFields) {\n existingType.inputFields = {};\n }\n for (const fieldName in newType.inputFields) {\n if (!existingType.inputFields[fieldName]) {\n existingType.inputFields[fieldName] =\n newType.inputFields[fieldName];\n }\n }\n }\n }\n }\n\n // Set root types if not already set\n if (schema.queryType && !mergedSchema.queryType) {\n mergedSchema.queryType = schema.queryType;\n }\n if (schema.mutationType && !mergedSchema.mutationType) {\n mergedSchema.mutationType = schema.mutationType;\n }\n if (schema.subscriptionType && !mergedSchema.subscriptionType) {\n mergedSchema.subscriptionType = schema.subscriptionType;\n }\n }\n\n return mergedSchema;\n}\n","import type { DataConfig } from \"./data-config-context\";\n\n/**\n * Default data config for the mapper component.\n *\n * Note: Node configurations (with schemas) are passed dynamically via props\n * from the edge component. This default config only contains mapping type\n * examples and type compatibility rules.\n */\nconst defaultDataConfig: DataConfig = {\n // Nodes are added dynamically from the workflow edge component\n // Each node's schema comes from the node's data when clicking the mapper button\n nodes: {},\n mappingTypes: {\n // Direct field mapping using template literals\n direct: {\n displayName: \"Direct Mapping\",\n description:\n \"Map a source field directly to a target field using ${output.field} syntax\",\n color: {\n compatible: \"#3b82f6\", // blue-500\n incompatible: \"#ef4444\", // red-500\n },\n examples: [\n {\n name: \"Simple field access\",\n expression: \"${output.fieldName}\",\n description: \"Access a direct field from the output\",\n },\n {\n name: \"Nested field access\",\n expression: \"${output.user.email}\",\n description: \"Access nested properties\",\n },\n {\n name: \"Array element access\",\n expression: \"${output.items[0].name}\",\n description: \"Access specific array elements\",\n },\n {\n name: \"With fallback\",\n expression: \"${output.user?.email || 'default@example.com'}\",\n description: \"Safe access with default value\",\n },\n ],\n },\n // Expression mapping using JavaScript template literals\n expression: {\n displayName: \"Expression Mapping\",\n description:\n \"Create a custom JavaScript expression to transform the data\",\n color: \"#8b5cf6\", // violet-500\n examples: [\n {\n name: \"String concatenation\",\n expression: \"${output.firstName + ' ' + output.lastName}\",\n description: \"Combine first and last name\",\n },\n {\n name: \"Template literal string\",\n expression: \"${`Hello ${output.name}!`}\",\n description: \"Use nested template literals for formatting\",\n },\n {\n name: \"Mathematical operation\",\n expression: \"${output.price * (1 - output.discount)}\",\n description: \"Calculate discounted price\",\n },\n {\n name: \"Conditional logic (ternary)\",\n expression: \"${output.age >= 18 ? 'Adult' : 'Minor'}\",\n description: \"Determine if adult or minor\",\n },\n {\n name: \"Nullish coalescing\",\n expression: \"${output.value ?? 'default'}\",\n description: \"Use default if null/undefined\",\n },\n {\n name: \"Logical OR fallback\",\n expression: \"${output.error || 'Success'}\",\n description: \"Fallback for falsy values\",\n },\n {\n name: \"Array length\",\n expression: \"${output.items?.length || 0}\",\n description: \"Get the length of an array safely\",\n },\n {\n name: \"Min value\",\n expression: \"${Math.min(...output.values)}\",\n description: \"Get the minimum value in an array\",\n },\n {\n name: \"Max value\",\n expression: \"${Math.max(...output.values)}\",\n description: \"Get the maximum value in an array\",\n },\n {\n name: \"Round number\",\n expression: \"${Math.round(output.value)}\",\n description: \"Round to nearest integer\",\n },\n {\n name: \"JSON parsing\",\n expression: \"${JSON.parse(output.jsonString)}\",\n description: \"Parse a JSON string to an object\",\n },\n {\n name: \"JSON stringify\",\n expression: \"${JSON.stringify(output.data)}\",\n description: \"Convert object to JSON string\",\n },\n {\n name: \"Current timestamp\",\n expression: \"${new Date().toISOString()}\",\n description: \"Get current date/time in ISO format\",\n },\n {\n name: \"Object creation\",\n expression: \"${({ id: output.user.id, email: output.user.email })}\",\n description: \"Create a new object from fields\",\n },\n ],\n // Safe builtins available in the sandbox\n safeBuiltins: [\n \"parseInt\",\n \"parseFloat\",\n \"isNaN\",\n \"isFinite\",\n \"Number\",\n \"String\",\n \"Boolean\",\n \"Math.min\",\n \"Math.max\",\n \"Math.round\",\n \"Math.floor\",\n \"Math.ceil\",\n \"Math.abs\",\n \"Array.isArray\",\n \"JSON.parse\",\n \"JSON.stringify\",\n \"Object.keys\",\n \"Object.values\",\n \"Object.entries\",\n \"Object.assign\",\n \"Date\",\n \"new Date()\",\n ],\n },\n // String transformations\n transform: {\n displayName: \"Transform Mapping\",\n description: \"Apply string and data transformation functions\",\n color: \"#ec4899\", // pink-500\n examples: [\n {\n name: \"Uppercase\",\n expression: \"${output.field.toUpperCase()}\",\n description: \"Convert text to uppercase\",\n },\n {\n name: \"Lowercase\",\n expression: \"${output.field.toLowerCase()}\",\n description: \"Convert text to lowercase\",\n },\n {\n name: \"Trim whitespace\",\n expression: \"${output.field.trim()}\",\n description: \"Remove leading/trailing whitespace\",\n },\n {\n name: \"Split string\",\n expression: \"${output.field.split(',')}\",\n description: \"Split string into array by delimiter\",\n },\n {\n name: \"Join array\",\n expression: \"${output.items.join(', ')}\",\n description: \"Join array elements with delimiter\",\n },\n {\n name: \"Replace text\",\n expression: \"${output.field.replace(/old/g, 'new')}\",\n description: \"Replace all occurrences of text\",\n },\n {\n name: \"Substring\",\n expression: \"${output.field.substring(0, 10)}\",\n description: \"Extract part of a string\",\n },\n {\n name: \"Slice\",\n expression: \"${output.field.slice(-5)}\",\n description: \"Get last 5 characters\",\n },\n {\n name: \"Includes check\",\n expression: \"${output.field.includes('search')}\",\n description: \"Check if string contains text\",\n },\n {\n name: \"Starts with\",\n expression: \"${output.field.startsWith('prefix')}\",\n description: \"Check if string starts with text\",\n },\n ],\n functions: [\n {\n name: \"toUpperCase\",\n displayName: \"Uppercase\",\n description: \"Convert text to uppercase\",\n example: \"${output.field.toUpperCase()}\",\n },\n {\n name: \"toLowerCase\",\n displayName: \"Lowercase\",\n description: \"Convert text to lowercase\",\n example: \"${output.field.toLowerCase()}\",\n },\n {\n name: \"trim\",\n displayName: \"Trim\",\n description: \"Remove whitespace from start and end\",\n example: \"${output.field.trim()}\",\n },\n {\n name: \"split\",\n displayName: \"Split\",\n description: \"Split string into array by delimiter\",\n example: \"${output.field.split(',')}\",\n },\n {\n name: \"join\",\n displayName: \"Join\",\n description: \"Join array elements with delimiter\",\n example: \"${output.items.join('-')}\",\n },\n {\n name: \"replace\",\n displayName: \"Replace\",\n description: \"Replace text in string\",\n example: \"${output.field.replace('old', 'new')}\",\n },\n {\n name: \"concat\",\n displayName: \"Concatenate\",\n description: \"Join multiple strings together\",\n example: \"${output.first + ' ' + output.last}\",\n },\n ],\n },\n // Type casting using native JavaScript functions\n cast: {\n displayName: \"Cast Mapping\",\n description:\n \"Convert data from one type to another using JavaScript functions\",\n color: \"#10b981\", // emerald-500\n examples: [\n {\n name: \"String to Integer\",\n expression: \"${parseInt(output.numberString)}\",\n description: \"Convert string to integer\",\n },\n {\n name: \"String to Float\",\n expression: \"${parseFloat(output.decimalString)}\",\n description: \"Convert string to decimal number\",\n },\n {\n name: \"To String\",\n expression: \"${String(output.value)}\",\n description: \"Convert any value to string\",\n },\n {\n name: \"To Boolean\",\n expression: \"${Boolean(output.value)}\",\n description: \"Convert to true/false\",\n },\n {\n name: \"Number with default\",\n expression: \"${Number(output.value) || 0}\",\n description: \"Convert to number with fallback\",\n },\n {\n name: \"Parse with radix\",\n expression: \"${parseInt(output.hex, 16)}\",\n description: \"Parse hexadecimal string\",\n },\n {\n name: \"Fixed decimals\",\n expression: \"${parseFloat(output.price).toFixed(2)}\",\n description: \"Format number with 2 decimal places\",\n },\n ],\n types: [\n {\n name: \"parseInt\",\n displayName: \"Integer\",\n description: \"Convert to whole number\",\n example: \"${parseInt(output.field)}\",\n },\n {\n name: \"parseFloat\",\n displayName: \"Float\",\n description: \"Convert to decimal number\",\n example: \"${parseFloat(output.field)}\",\n },\n {\n name: \"String\",\n displayName: \"String\",\n description: \"Convert to text\",\n example: \"${String(output.field)}\",\n },\n {\n name: \"Boolean\",\n displayName: \"Boolean\",\n description: \"Convert to true/false\",\n example: \"${Boolean(output.field)}\",\n },\n {\n name: \"Number\",\n displayName: \"Number\",\n description: \"Convert to number\",\n example: \"${Number(output.field)}\",\n },\n ],\n },\n // Array operations using .map(), .filter(), .reduce()\n array: {\n displayName: \"Array Mapping\",\n description:\n \"Transform arrays using map, filter, reduce and other array methods\",\n color: \"#f97316\", // orange-500\n examples: [\n {\n name: \"Map - Extract IDs\",\n expression: \"${output.users.map(u => u.id)}\",\n description: \"Extract a single field from each item\",\n },\n {\n name: \"Map - Transform objects\",\n expression:\n \"${output.items.map(item => ({ name: item.name, value: item.value }))}\",\n description: \"Transform each item to new shape\",\n },\n {\n name: \"Map - With index\",\n expression:\n \"${output.items.map((item, index) => ({ ...item, position: index + 1 }))}\",\n description: \"Include index in transformation\",\n },\n {\n name: \"Filter - Active users\",\n expression: \"${output.users.filter(u => u.active)}\",\n description: \"Keep only items matching condition\",\n },\n {\n name: \"Filter - By value\",\n expression: \"${output.items.filter(item => item.price > 100)}\",\n description: \"Filter by numeric comparison\",\n },\n {\n name: \"Filter + Map\",\n expression: \"${output.users.filter(u => u.active).map(u => u.id)}\",\n description: \"Chain filter and map operations\",\n },\n {\n name: \"Reduce - Sum\",\n expression:\n \"${output.items.reduce((sum, item) => sum + item.price, 0)}\",\n description: \"Calculate total of all prices\",\n },\n {\n name: \"Reduce - Average\",\n expression:\n \"${output.items.reduce((sum, item) => sum + item.value, 0) / output.items.length}\",\n description: \"Calculate average value\",\n },\n {\n name: \"Reduce - Group by\",\n expression:\n \"${output.items.reduce((acc, item) => ({ ...acc, [item.category]: [...(acc[item.category] || []), item] }), {})}\",\n description: \"Group items by category\",\n },\n {\n name: \"Find - First match\",\n expression:\n \"${output.items.find(item => item.id === TriggerInput.itemId)}\",\n description: \"Find first item matching condition\",\n },\n {\n name: \"Some - Any match\",\n expression: \"${output.items.some(item => item.active)}\",\n description: \"Check if any item matches\",\n },\n {\n name: \"Every - All match\",\n expression: \"${output.items.every(item => item.valid)}\",\n description: \"Check if all items match\",\n },\n {\n name: \"Flat - Flatten array\",\n expression: \"${output.nestedArrays.flat()}\",\n description: \"Flatten one level of nesting\",\n },\n {\n name: \"FlatMap - Map and flatten\",\n expression: \"${output.users.flatMap(u => u.permissions)}\",\n description: \"Map then flatten results\",\n },\n {\n name: \"Sort - Ascending\",\n expression: \"${[...output.items].sort((a, b) => a.price - b.price)}\",\n description: \"Sort items by price ascending\",\n },\n {\n name: \"Sort - Descending\",\n expression: \"${[...output.items].sort((a, b) => b.price - a.price)}\",\n description: \"Sort items by price descending\",\n },\n {\n name: \"Slice - First N\",\n expression: \"${output.items.slice(0, 5)}\",\n description: \"Get first 5 items\",\n },\n {\n name: \"Slice - Last N\",\n expression: \"${output.items.slice(-3)}\",\n description: \"Get last 3 items\",\n },\n {\n name: \"Unique values\",\n expression: \"${[...new Set(output.items.map(i => i.category))]}\",\n description: \"Get unique categories\",\n },\n {\n name: \"Concat arrays\",\n expression: \"${output.list1.concat(output.list2)}\",\n description: \"Combine two arrays\",\n },\n {\n name: \"Includes check\",\n expression: \"${output.tags.includes('important')}\",\n description: \"Check if array contains value\",\n },\n {\n name: \"Index of\",\n expression: \"${output.items.findIndex(i => i.id === 'target')}\",\n description: \"Find index of matching item\",\n },\n ],\n },\n // Object operations\n object: {\n displayName: \"Object Mapping\",\n description: \"Transform and manipulate objects\",\n color: \"#6366f1\", // indigo-500\n examples: [\n {\n name: \"Get keys\",\n expression: \"${Object.keys(output.metadata)}\",\n description: \"Get all property names as array\",\n },\n {\n name: \"Get values\",\n expression: \"${Object.values(output.metadata)}\",\n description: \"Get all property values as array\",\n },\n {\n name: \"Get entries\",\n expression: \"${Object.entries(output.metadata)}\",\n description: \"Get key-value pairs as array\",\n },\n {\n name: \"Merge objects\",\n expression: \"${Object.assign({}, output.user, output.preferences)}\",\n description: \"Combine multiple objects\",\n },\n {\n name: \"Spread merge\",\n expression: \"${{ ...output.defaults, ...output.overrides }}\",\n description: \"Merge with spread operator\",\n },\n {\n name: \"Pick fields\",\n expression: \"${({ id: output.user.id, email: output.user.email })}\",\n description: \"Select specific fields only\",\n },\n {\n name: \"From entries\",\n expression: \"${Object.fromEntries(output.pairs)}\",\n description: \"Create object from key-value pairs\",\n },\n {\n name: \"Has property\",\n expression: \"${'email' in output.user}\",\n description: \"Check if property exists\",\n },\n ],\n },\n // Workflow context variables\n context: {\n displayName: \"Workflow Context\",\n description:\n \"Access workflow execution context and state from previous nodes\",\n color: \"#14b8a6\", // teal-500\n examples: [\n {\n name: \"Trigger input\",\n expression: \"${TriggerInput.userId}\",\n description: \"Access original trigger payload\",\n },\n {\n name: \"Trigger nested data\",\n expression: \"${TriggerInput.webhookData.eventType}\",\n description: \"Access nested trigger data\",\n },\n {\n name: \"Previous node output\",\n expression: \"${WorkflowState.fetch_user.output.name}\",\n description: \"Access output from a specific previous node\",\n },\n {\n name: \"Node status\",\n expression: \"${WorkflowState.validate_data.status}\",\n description: \"Check status of a previous node\",\n },\n {\n name: \"Combine node outputs\",\n expression:\n \"${WorkflowState.step1.output.count + WorkflowState.step2.output.count}\",\n description: \"Combine data from multiple nodes\",\n },\n {\n name: \"Run ID\",\n expression: \"${RunContext.runId}\",\n description: \"Current workflow run identifier\",\n },\n {\n name: \"Workflow key\",\n expression: \"${RunContext.workflowKey}\",\n description: \"Workflow definition identifier\",\n },\n {\n name: \"Tenant ID\",\n expression: \"${RunContext.tenantId}\",\n description: \"Current tenant identifier\",\n },\n {\n name: \"Workspace ID\",\n expression: \"${RunContext.workspaceId}\",\n description: \"Current workspace identifier\",\n },\n {\n name: \"Triggered at\",\n expression: \"${RunContext.triggeredAt}\",\n description: \"Workflow trigger timestamp\",\n },\n {\n name: \"Triggered by\",\n expression: \"${RunContext.triggeredBy}\",\n description: \"User who triggered the workflow\",\n },\n ],\n },\n },\n typeCompatibility: {\n String: [\"ID\", \"String\"],\n ID: [\"String\", \"ID\"],\n Int: [\"Float\", \"Int\", \"String\"],\n Float: [\"String\", \"Float\"],\n Boolean: [\"Boolean\", \"String\"],\n },\n sampleData: {\n search: {\n response: [\n {\n metadata: {\n title: \"Introduction to Machine Learning\",\n source: \"https://example.com/ml-intro\",\n sourceLabel: \"Example ML Guide\",\n sourceType: \"webpage\",\n sourceInfo: \"Educational resource\",\n partition: \"default\",\n score: 0.95,\n images: [\"https://example.com/ml-image.jpg\"],\n },\n content: \"Machine learning is a branch of artificial intelligence...\",\n },\n {\n metadata: {\n title: \"Deep Learning Fundamentals\",\n source: \"https://example.com/dl-basics\",\n sourceLabel: \"Deep Learning Guide\",\n sourceType: \"webpage\",\n sourceInfo: \"Technical documentation\",\n partition: \"default\",\n score: 0.87,\n images: [\"https://example.com/dl-image.jpg\"],\n },\n content: \"Deep learning is a subset of machine learning...\",\n },\n ],\n },\n insert: {\n success: true,\n count: 1,\n },\n },\n};\n\nexport default defaultDataConfig;\n","import { useState, useEffect, useMemo } from \"react\";\nimport { ThemeProvider } from \"./theme-provider\";\nimport { Toaster } from \"@burdenoff/fe-libs/ui\";\nimport { MappingEditor } from \"./mapping-editor\";\nimport type { GraphQLSchema, GraphQLField } from \"../lib/types\";\nimport { parseGraphQLSchema } from \"../lib/schema-parser\";\nimport { initializeConfig } from \"./config/data\";\nimport {\n DataConfigProvider,\n type DataConfig,\n} from \"./config/data-config-context\";\n\n// Import the default data config\nimport defaultDataConfig from \"./config/default-data-config\";\n\n// Inline schema field definition\ninterface InlineSchemaField {\n name: string;\n type: string;\n required?: boolean;\n}\n\n// Inline schema definition\ninterface InlineSchema {\n inputFields?: InlineSchemaField[];\n outputFields?: InlineSchemaField[];\n}\n\n// Node info from data config\ninterface NodeInfo {\n displayName: string;\n category: \"source\" | \"target\" | \"both\";\n style: { source: string; target: string };\n url?: string;\n headers?: Record<string, string>;\n schema?: string | InlineSchema;\n}\n\n// Convert inline schema to GraphQL schema format - defined outside component\nfunction convertInlineSchemaToGraphQL(\n inlineSchema: InlineSchema,\n nodeType: string,\n): GraphQLSchema {\n const schema: GraphQLSchema = {\n types: {},\n queryType: \"Query\",\n mutationType: null,\n subscriptionType: null,\n };\n\n // Create output type from outputFields\n if (inlineSchema.outputFields && inlineSchema.outputFields.length > 0) {\n const outputFields: Record<string, GraphQLField> = {};\n inlineSchema.outputFields.forEach((field: InlineSchemaField) => {\n outputFields[field.name] = {\n name: field.name,\n type: field.type,\n isNonNull: field.required || false,\n isList: field.type.startsWith(\"[\"),\n args: [],\n };\n });\n\n const outputTypeName = `${nodeType}Output`;\n schema.types[outputTypeName] = {\n name: outputTypeName,\n kind: \"type\",\n fields: outputFields,\n };\n\n // Create Query type that returns the output\n schema.types[\"Query\"] = {\n name: \"Query\",\n kind: \"type\",\n fields: {\n execute: {\n name: \"execute\",\n type: outputTypeName,\n isNonNull: false,\n isList: false,\n args: [],\n },\n },\n };\n }\n\n // Create input type from inputFields\n if (inlineSchema.inputFields && inlineSchema.inputFields.length > 0) {\n const inputFields: Record<string, GraphQLField> = {};\n inlineSchema.inputFields.forEach((field: InlineSchemaField) => {\n inputFields[field.name] = {\n name: field.name,\n type: field.type,\n isNonNull: field.required || false,\n isList: field.type.startsWith(\"[\"),\n args: [],\n };\n });\n\n const inputTypeName = `${nodeType}Input`;\n schema.types[inputTypeName] = {\n name: inputTypeName,\n kind: \"input\",\n fields: {},\n inputFields,\n };\n }\n\n return schema;\n}\n\ninterface AppProps {\n dataConfig?: DataConfig;\n sourceSchema?: GraphQLSchema;\n targetSchema?: GraphQLSchema;\n sourceNode?: string;\n targetNode?: string;\n sourceOperation?: string;\n targetOperation?: string;\n setEdges?: (edges: unknown) => void;\n edgeId?: string;\n}\n\nexport default function App({\n dataConfig = defaultDataConfig,\n sourceSchema: propSourceSchema,\n targetSchema: propTargetSchema,\n sourceOperation,\n targetOperation,\n sourceNode,\n targetNode,\n setEdges,\n edgeId,\n}: AppProps) {\n // Initialize parsed schemas using useMemo to avoid effect-based setState\n const initialParsedSchemas = useMemo(() => {\n const parsed: Record<string, GraphQLSchema> = {};\n initializeConfig(parsed, dataConfig);\n return parsed;\n }, [dataConfig]);\n\n // Store parsed schemas - will be updated by the second useEffect\n const [parsedSchemas, setParsedSchemas] =\n useState<Record<string, GraphQLSchema>>(initialParsedSchemas);\n\n // Sync parsedSchemas when initialParsedSchemas changes (dataConfig dependency)\n const configInitialized =\n parsedSchemas === initialParsedSchemas ||\n Object.keys(parsedSchemas).length > 0;\n\n // Selection state - initialized from props\n // Note: setters are currently unused as the node selector UI is commented out\n const [selectedSourceNode, _setSelectedSourceNode] = useState<string | null>(\n sourceNode ?? null,\n );\n const [selectedSourceOperation, _setSelectedSourceOperation] = useState<\n string | null\n >(sourceOperation ?? null);\n const [selectedTargetNode, _setSelectedTargetNode] = useState<string | null>(\n targetNode ?? null,\n );\n const [selectedTargetOperation, _setSelectedTargetOperation] = useState<\n string | null\n >(targetOperation ?? null);\n // Prevent unused variable warnings\n void _setSelectedSourceNode;\n void _setSelectedSourceOperation;\n void _setSelectedTargetNode;\n void _setSelectedTargetOperation;\n\n // Use schemas from props if available, otherwise initialize with empty schemas\n // No more API calls for introspection - schemas are passed dynamically\n useEffect(() => {\n if (configInitialized) {\n const initializeSchemas = () => {\n const newParsedSchemas: Record<string, GraphQLSchema> = {};\n\n // Use prop schemas if available\n if (propSourceSchema && selectedSourceNode) {\n newParsedSchemas[selectedSourceNode] = propSourceSchema;\n }\n if (propTargetSchema && selectedTargetNode) {\n newParsedSchemas[selectedTargetNode] = propTargetSchema;\n }\n\n // For nodes without schemas, create empty schemas\n Object.keys(dataConfig.nodes).forEach((nodeKey) => {\n if (!newParsedSchemas[nodeKey]) {\n const nodeInfo = dataConfig.nodes[nodeKey] as NodeInfo;\n // Check for inline schema in config\n if (\n nodeInfo?.schema &&\n typeof nodeInfo.schema !== \"string\" &&\n (nodeInfo.schema.inputFields || nodeInfo.schema.outputFields)\n ) {\n newParsedSchemas[nodeKey] = convertInlineSchemaToGraphQL(\n nodeInfo.schema,\n nodeKey,\n );\n } else {\n newParsedSchemas[nodeKey] = {\n types: {},\n queryType: null,\n mutationType: null,\n subscriptionType: null,\n };\n }\n }\n });\n\n // Update parsed schemas\n setParsedSchemas((prev) => {\n const merged = { ...prev, ...newParsedSchemas };\n return merged;\n });\n\n // Initialize config with schemas\n initializeConfig(newParsedSchemas, dataConfig);\n };\n\n initializeSchemas();\n }\n }, [\n configInitialized,\n dataConfig,\n propSourceSchema,\n propTargetSchema,\n selectedSourceNode,\n selectedTargetNode,\n ]);\n\n // Get schema for a node\n const getSchemaForNode = (nodeType: string | null, isSource: boolean) => {\n if (!nodeType) return null;\n\n // First check if schema was passed as prop\n if (isSource && propSourceSchema) {\n return propSourceSchema;\n }\n if (!isSource && propTargetSchema) {\n return propTargetSchema;\n }\n // Check if the schema exists in parsedSchemas\n if (parsedSchemas[nodeType]) {\n return parsedSchemas[nodeType];\n }\n\n // If not found in parsed schemas, try to use inline schema from dataConfig\n const nodeInfo = dataConfig.nodes[nodeType] as NodeInfo | undefined;\n if (nodeInfo) {\n // Check for inline schema definition\n if (\n nodeInfo.schema &&\n typeof nodeInfo.schema !== \"string\" &&\n (nodeInfo.schema.inputFields || nodeInfo.schema.outputFields)\n ) {\n const convertedSchema = convertInlineSchemaToGraphQL(\n nodeInfo.schema,\n nodeType,\n );\n // Cache the converted schema for future use\n setParsedSchemas((prev) => ({ ...prev, [nodeType]: convertedSchema }));\n return convertedSchema;\n }\n\n // Try to parse raw GraphQL schema string\n if (typeof nodeInfo.schema === \"string\") {\n const parsedSchema = parseGraphQLSchema(nodeInfo.schema);\n setParsedSchemas((prev) => ({ ...prev, [nodeType]: parsedSchema }));\n return parsedSchema;\n }\n }\n\n console.warn(`Could not find or parse schema for node type: ${nodeType}`);\n return null;\n };\n\n // Get current schemas - prefer prop schemas if available\n const currentSourceSchema =\n propSourceSchema || getSchemaForNode(selectedSourceNode, true);\n const currentTargetSchema =\n propTargetSchema || getSchemaForNode(selectedTargetNode, false);\n\n return (\n <DataConfigProvider config={dataConfig}>\n <ThemeProvider defaultTheme=\"light\" storageKey=\"vite-ui-theme\">\n <div className=\"min-h-screen bg-background\">\n {/* <header className=\"sticky top-0 z-10 border-b bg-background\">\n <div className=\"container flex h-auto py-4 flex-col items-start justify-between\">\n <div className=\"flex w-full items-center justify-between mb-4\">\n <h1 className=\"text-xl font-semibold\">GraphQL Data Mapping</h1>\n </div>\n\n <div className=\"flex items-center gap-4\">\n {(isLoading.source || isLoading.target || fetchingSchemas) && (\n <div className=\"flex items-center text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 mr-2 animate-spin\" />\n {fetchingSchemas ? \"Fetching schemas...\" : \"Loading schemas...\"}\n </div>\n )}\n {(fetchErrors.source || fetchErrors.target) && (\n <div className=\"text-sm text-[var(--color-status-error-text)]\">Error: {fetchErrors.source || fetchErrors.target}</div>\n )}\n </div>\n </div>\n </header> */}\n <main className=\"container py-6\">\n {/* <div className=\"grid grid-cols-1 gap-6 md:grid-cols-2\">\n <div>\n <h2 className=\"mb-4 text-lg font-medium\">Source</h2>\n <NodeSelector\n nodeTypes={null}\n selectedNode={selectedSourceNode}\n onSelectNode={(nodeType) => handleNodeSelect(nodeType, true)}\n filterType=\"source\"\n isLoading={isLoading.source || fetchingSchemas}\n error={fetchErrors.source}\n dataConfig={dataConfig}\n />\n {selectedSourceNode && (\n <OperationSelector\n nodeType={selectedSourceNode}\n selectedOperation={selectedSourceOperation}\n onSelectOperation={setSelectedSourceOperation}\n className=\"mt-4\"\n parsedSchemas={parsedSchemas}\n />\n )}\n </div>\n <div>\n <h2 className=\"mb-4 text-lg font-medium\">Target</h2>\n <NodeSelector\n nodeTypes={null}\n selectedNode={selectedTargetNode}\n onSelectNode={(nodeType) => handleNodeSelect(nodeType, false)}\n filterType=\"target\"\n isLoading={isLoading.target || fetchingSchemas}\n error={fetchErrors.target}\n dataConfig={dataConfig}\n />\n {selectedTargetNode && (\n <OperationSelector\n nodeType={selectedTargetNode}\n selectedOperation={selectedTargetOperation}\n onSelectOperation={setSelectedTargetOperation}\n className=\"mt-4\"\n parsedSchemas={parsedSchemas}\n />\n )}\n </div>\n </div> */}\n\n {currentSourceSchema &&\n currentTargetSchema &&\n selectedSourceNode &&\n selectedSourceOperation &&\n selectedTargetNode &&\n selectedTargetOperation && (\n <div className=\"mt-8 p-4 border rounded-lg\">\n <h2 className=\"text-lg font-medium mb-4\">Data Mapping</h2>\n <MappingEditor\n sourceSchema={currentSourceSchema}\n targetSchema={currentTargetSchema}\n sourceNode={selectedSourceNode}\n sourceOperation={selectedSourceOperation}\n targetNode={selectedTargetNode}\n targetOperation={selectedTargetOperation}\n setEdges={setEdges}\n edgeId={edgeId}\n />\n </div>\n )}\n\n {/* Debug information - hidden in production */}\n {process.env.NODE_ENV === \"development\" && (\n <div className=\"mt-8 p-4 border border-default rounded-lg bg-muted\">\n <h3 className=\"text-md font-medium mb-2\">Debug Information</h3>\n <div className=\"text-sm\">\n <p>Source Node: {selectedSourceNode || \"None\"}</p>\n <p>Source Operation: {selectedSourceOperation || \"None\"}</p>\n <p>Target Node: {selectedTargetNode || \"None\"}</p>\n <p>Target Operation: {selectedTargetOperation || \"None\"}</p>\n <p>\n Source Schema:{\" \"}\n {currentSourceSchema ? \"Available\" : \"Not available\"}\n </p>\n <p>\n Target Schema:{\" \"}\n {currentTargetSchema ? \"Available\" : \"Not available\"}\n </p>\n <p>\n Parsed Schemas:{\" \"}\n {Object.keys(parsedSchemas).join(\", \") || \"None\"}\n </p>\n <details>\n <summary>Schema Details</summary>\n <pre className=\"text-xs mt-2 overflow-auto max-h-[200px]\">\n {JSON.stringify(\n {\n sourceSchema: currentSourceSchema\n ? Object.keys(currentSourceSchema.types).length +\n \" types\"\n : \"Not available\",\n targetSchema: currentTargetSchema\n ? Object.keys(currentTargetSchema.types).length +\n \" types\"\n : \"Not available\",\n },\n null,\n 2,\n )}\n </pre>\n </details>\n </div>\n </div>\n )}\n </main>\n </div>\n <Toaster />\n </ThemeProvider>\n </DataConfigProvider>\n );\n}\n","import type React from \"react\";\n\nimport { useState, useEffect, useMemo, useCallback } from \"react\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@burdenoff/fe-libs/ui\";\nimport { Input } from \"@burdenoff/fe-libs/ui\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { Label } from \"@burdenoff/fe-libs/ui\";\nimport { Badge } from \"@burdenoff/fe-libs/ui\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@burdenoff/fe-libs/ui\";\nimport { Card, CardContent } from \"@burdenoff/fe-libs/ui\";\nimport { ScrollArea } from \"@burdenoff/fe-libs/ui\";\nimport {\n Trash2,\n Plus,\n Layers,\n Copy,\n Info,\n ChevronRight,\n ChevronDown,\n AlertCircle,\n} from \"lucide-react\";\nimport { toast } from \"sonner\";\n\n// Constants\nconst OPERATORS: { [key: string]: Operator[] } = {\n string: [\n { value: \"==\", label: \"Equals\" },\n { value: \"contains\", label: \"Contains\" },\n { value: \"startsWith\", label: \"Starts with\" },\n { value: \"endsWith\", label: \"Ends with\" },\n { value: \"isNull\", label: \"Is Null\" },\n { value: \"isNotNull\", label: \"Is Not Null\" },\n ],\n number: [\n { value: \"==\", label: \"Equals\" },\n { value: \"!=\", label: \"Not equals\" },\n { value: \">\", label: \"Greater than\" },\n { value: \">=\", label: \"Greater than or equal\" },\n { value: \"<\", label: \"Less than\" },\n { value: \"<=\", label: \"Less than or equal\" },\n { value: \"isNull\", label: \"Is Null\" },\n { value: \"isNotNull\", label: \"Is Not Null\" },\n ],\n integer: [\n { value: \"==\", label: \"Equals\" },\n { value: \"!=\", label: \"Not equals\" },\n { value: \">\", label: \"Greater than\" },\n { value: \">=\", label: \"Greater than or equal\" },\n { value: \"<\", label: \"Less than\" },\n { value: \"<=\", label: \"Less than or equal\" },\n { value: \"isNull\", label: \"Is Null\" },\n { value: \"isNotNull\", label: \"Is Not Null\" },\n ],\n boolean: [\n { value: \"isTrue\", label: \"Is True\" },\n { value: \"isFalse\", label: \"Is False\" },\n { value: \"isNull\", label: \"Is Null\" },\n { value: \"isNotNull\", label: \"Is Not Null\" },\n ],\n array: [\n { value: \"isEmpty\", label: \"Is Empty Array\" },\n { value: \"isNotEmpty\", label: \"Is Not Empty Array\" },\n { value: \"contains\", label: \"Contains Element\" },\n { value: \"isNull\", label: \"Is Null\" },\n { value: \"isNotNull\", label: \"Is Not Null\" },\n ],\n object: [\n { value: \"isEmpty\", label: \"Is Empty Object\" },\n { value: \"isNotEmpty\", label: \"Is Not Empty Object\" },\n { value: \"hasProperty\", label: \"Has Property\" },\n { value: \"isNull\", label: \"Is Null\" },\n { value: \"isNotNull\", label: \"Is Not Null\" },\n ],\n};\n\ninterface SchemaField {\n path: string;\n type: string;\n}\ninterface Operator {\n value: string;\n label: string;\n}\n\n// Schema property definition for JSON schema-like structure\ninterface SchemaPropertyDefinition {\n type: string;\n description?: string;\n properties?: Record<string, SchemaPropertyDefinition>;\n items?: SchemaPropertyDefinition;\n}\n\ninterface OutputSchema {\n type: string;\n properties?: Record<string, SchemaPropertyDefinition>;\n items?: SchemaPropertyDefinition;\n}\n\n// Type for rule values (primitives that can be used in conditions)\ntype RuleValue = string | number | boolean | null;\n\n// Update the parseSchema function to properly handle all levels of nesting\nconst parseSchema = (\n schema: OutputSchema | SchemaPropertyDefinition | null,\n currentPath = \"\",\n fields: SchemaField[] = [],\n): SchemaField[] => {\n if (!schema || typeof schema !== \"object\") return fields;\n const knownTypes = [\n \"string\",\n \"number\",\n \"integer\",\n \"boolean\",\n \"array\",\n \"object\",\n ];\n\n if (schema.type === \"object\" && schema.properties) {\n for (const key in schema.properties) {\n const property = schema.properties[key];\n const newPath = currentPath ? `${currentPath}.${key}` : key;\n\n // Add the object field itself\n if (property?.type && knownTypes.includes(property.type)) {\n fields.push({ path: newPath, type: property.type });\n }\n\n // Recursively process nested objects\n if (property?.type === \"object\" && property.properties) {\n parseSchema(property, newPath, fields);\n }\n\n // Handle array items that are objects\n if (\n property?.type === \"array\" &&\n property.items &&\n property.items.type === \"object\"\n ) {\n // Add array field\n fields.push({ path: newPath, type: \"array\" });\n\n // Process the object items inside the array\n if (property.items.properties) {\n for (const itemKey in property.items.properties) {\n const itemProperty = property.items.properties[itemKey];\n const itemPath = `${newPath}.${itemKey}`;\n\n // Add the item field\n if (itemProperty?.type && knownTypes.includes(itemProperty.type)) {\n fields.push({ path: itemPath, type: itemProperty.type });\n }\n\n // Recursively process nested objects in array items\n if (itemProperty?.type === \"object\" && itemProperty.properties) {\n parseSchema(itemProperty, itemPath, fields);\n }\n }\n }\n }\n }\n }\n\n // Sort fields by path for better organization in the dropdown\n fields.sort((a, b) => a.path.localeCompare(b.path));\n\n // Remove duplicates\n const uniqueFields = Array.from(\n new Map(fields.map((f) => [f.path, f])).values(),\n );\n return uniqueFields;\n};\n\nconst getOperatorsForType = (type: string): Operator[] =>\n OPERATORS[type] || [\n { value: \"isNull\", label: \"Is Null\" },\n { value: \"isNotNull\", label: \"Is Not Null\" },\n ];\n\n// Tree Structure Interfaces\ntype NodeType = \"rule\" | \"group\";\n\ninterface BaseNode {\n id: string;\n type: NodeType;\n}\n\n// Represents a single condition\nexport interface RuleNode extends BaseNode {\n type: \"rule\";\n field: string;\n operator: string;\n value: RuleValue;\n}\n\n// Represents a group of conditions/groups\nexport interface GroupNode extends BaseNode {\n type: \"group\";\n combinator: \"AND\" | \"OR\";\n children: ConditionNode[];\n}\n\nexport type ConditionNode = RuleNode | GroupNode;\n\n// Utility Functions\nconst generateId = (): string =>\n Date.now().toString(36) + Math.random().toString(36).substring(2);\n\nconst createEmptyGroup = (id?: string): GroupNode => ({\n id: id || generateId(),\n type: \"group\",\n combinator: \"AND\",\n children: [],\n});\n\nconst createEmptyRule = (id?: string): RuleNode => ({\n id: id || generateId(),\n type: \"rule\",\n field: \"\",\n operator: \"\",\n value: \"\",\n});\n\n// Prop Interface\ninterface ConditionBuilderProps {\n outputSchema: OutputSchema;\n initialCondition?: GroupNode | null;\n onConditionChange: (condition: GroupNode) => void;\n predefinedFields?: SchemaField[]; // Add this prop to accept predefined fields\n}\n\n// Recursive Helper for Immutable Updates\nconst findAndModifyNode = (\n node: ConditionNode,\n targetId: string,\n modification: (node: ConditionNode) => ConditionNode | null,\n): ConditionNode | null => {\n if (node.id === targetId) {\n return modification(node);\n }\n\n if (node.type === \"group\") {\n let childrenChanged = false;\n const newChildren = node.children\n .map((child) => {\n const modifiedChild = findAndModifyNode(child, targetId, modification);\n if (modifiedChild !== child) {\n childrenChanged = true;\n }\n return modifiedChild;\n })\n .filter((child) => child !== null) as ConditionNode[];\n\n if (childrenChanged) {\n return { ...node, children: newChildren };\n }\n }\n\n return node;\n};\n\nconst findAndAddNode = (\n node: ConditionNode,\n parentId: string,\n nodeToAdd: ConditionNode,\n): ConditionNode => {\n if (node.id === parentId && node.type === \"group\") {\n return {\n ...node,\n children: [...node.children, nodeToAdd],\n };\n }\n\n if (node.type === \"group\") {\n let childrenChanged = false;\n const newChildren = node.children.map((child) => {\n const updatedChild = findAndAddNode(child, parentId, nodeToAdd);\n if (updatedChild !== child) childrenChanged = true;\n return updatedChild;\n });\n if (childrenChanged) {\n return { ...node, children: newChildren };\n }\n }\n return node;\n};\n\n// Condition Node Display Component (Recursive)\ninterface ConditionNodeDisplayProps {\n node: ConditionNode;\n path: string[];\n fieldMap: Map<string, string>;\n parsedFields: SchemaField[];\n onUpdateNode: (id: string, updates: Partial<RuleNode | GroupNode>) => void;\n onRemoveNode: (id: string) => void;\n onAddRule: (parentId: string) => void;\n onAddGroup: (parentId: string) => void;\n onDuplicateNode?: (id: string) => void;\n level: number;\n}\n\nconst ConditionNodeDisplay: React.FC<ConditionNodeDisplayProps> = ({\n node,\n path,\n fieldMap,\n parsedFields,\n onUpdateNode,\n onRemoveNode,\n onAddRule,\n onAddGroup,\n onDuplicateNode,\n level,\n}) => {\n const [isExpanded, setIsExpanded] = useState(true);\n\n const handleUpdate = useCallback(\n (updates: Partial<RuleNode | GroupNode>) => {\n onUpdateNode(node.id, updates);\n },\n [node.id, onUpdateNode],\n );\n\n const handleRemove = useCallback(() => {\n onRemoveNode(node.id);\n }, [node.id, onRemoveNode]);\n\n const handleDuplicate = useCallback(() => {\n if (onDuplicateNode) onDuplicateNode(node.id);\n }, [node.id, onDuplicateNode]);\n\n // Rule Rendering Logic\n if (node.type === \"rule\") {\n const { field, operator, value } = node;\n const selectedFieldType = fieldMap.get(field);\n const availableOperators = selectedFieldType\n ? getOperatorsForType(selectedFieldType)\n : [];\n const noValueOperators = [\n \"isTrue\",\n \"isFalse\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"isNull\",\n \"isNotNull\",\n ];\n const needsValue =\n field && operator && !noValueOperators.includes(operator);\n\n const renderValueInputForRule = () => {\n if (!needsValue) return null;\n\n switch (selectedFieldType) {\n case \"number\":\n case \"integer\":\n return (\n <Input\n type=\"number\"\n placeholder=\"Number\"\n value={typeof value === \"boolean\" ? \"\" : (value ?? \"\")}\n onChange={(e) =>\n handleUpdate({\n value: e.target.value === \"\" ? null : Number(e.target.value),\n })\n }\n className=\"w-full flex-grow\"\n />\n );\n case \"boolean\":\n return (\n <span className=\"text-sm text-muted-foreground italic p-2\">\n Use &apos;Is True&apos; / &apos;Is False&apos;\n </span>\n );\n case \"string\":\n default:\n return (\n <Input\n type=\"text\"\n placeholder=\"Value\"\n value={typeof value === \"boolean\" ? String(value) : (value ?? \"\")}\n onChange={(e) => handleUpdate({ value: e.target.value })}\n className=\"w-full flex-grow\"\n />\n );\n }\n };\n\n return (\n <Card className=\"overflow-hidden border-muted-foreground/20 shadow-sm transition-all hover:shadow-md\">\n <CardContent className=\"p-3\">\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2\">\n {/* Field Selector */}\n <div className=\"w-full sm:w-[30%]\">\n <Select\n value={field}\n onValueChange={(val) =>\n handleUpdate({ field: val, operator: \"\", value: \"\" })\n }\n >\n <SelectTrigger className=\"h-9\">\n <SelectValue placeholder=\"Select field\" />\n </SelectTrigger>\n <SelectContent className=\"max-h-[300px] z-[100000]\">\n {parsedFields.map((f) => (\n <SelectItem key={f.path} value={f.path}>\n <div className=\"flex items-center gap-2 w-full\">\n <span className=\"overflow-visible whitespace-normal break-words\">\n {f.path}\n </span>\n <Badge\n variant=\"outline\"\n className=\"ml-auto shrink-0 text-xs\"\n >\n {f.type}\n </Badge>\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Operator Selector */}\n <div className=\"w-full sm:w-[25%]\">\n <Select\n value={operator}\n onValueChange={(val) =>\n handleUpdate({ operator: val, value: \"\" })\n }\n disabled={!field}\n >\n <SelectTrigger className=\"h-9\">\n <SelectValue placeholder=\"Operator\" />\n </SelectTrigger>\n <SelectContent className=\"z-[100000]\">\n {availableOperators.map((op) => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Value Input */}\n <div\n className={`w-full ${needsValue ? \"sm:w-[35%]\" : \"sm:w-[25%]\"} flex items-center`}\n >\n {renderValueInputForRule()}\n {!needsValue && operator && (\n <span className=\"text-sm text-muted-foreground italic p-2\">\n No value needed\n </span>\n )}\n </div>\n\n {/* Action Buttons */}\n <div className=\"w-full sm:w-[10%] flex justify-end sm:justify-center gap-1\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleDuplicate}\n className=\"h-8 w-8\"\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Duplicate rule</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleRemove}\n className=\"h-8 w-8 text-destructive hover:text-destructive/90 hover:bg-destructive/10\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Remove rule</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n // Group Rendering Logic\n if (node.type === \"group\") {\n const { combinator, children } = node;\n const isRoot = path.length === 1 && path[0] === \"root\";\n const hasChildren = children.length > 0;\n\n const handleCombinatorChange = (value: \"AND\" | \"OR\") => {\n handleUpdate({ combinator: value });\n };\n\n const handleAddRuleClick = () => onAddRule(node.id);\n const handleAddGroupClick = () => onAddGroup(node.id);\n const toggleExpanded = () => setIsExpanded(!isExpanded);\n\n // Calculate background color based on nesting level for visual hierarchy\n const getBgColor = () => {\n if (isRoot) return \"bg-background\";\n\n // Alternate between subtle background colors based on nesting level\n return level % 2 === 0 ? \"bg-muted/30\" : \"bg-background\";\n };\n\n return (\n <div\n className={`rounded-lg border ${isRoot ? \"border-primary/30\" : \"border-muted-foreground/20\"} ${getBgColor()} transition-all`}\n >\n <div className=\"p-3\">\n {/* Group Header */}\n <div className=\"flex items-center gap-2 mb-2\">\n {/* Expand/Collapse Button */}\n {hasChildren && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={toggleExpanded}\n className=\"h-7 w-7 p-0\"\n >\n {isExpanded ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : (\n <ChevronRight className=\"h-4 w-4\" />\n )}\n </Button>\n )}\n\n {/* Group Title */}\n <div className=\"flex items-center\">\n <Badge\n variant={combinator === \"AND\" ? \"default\" : \"secondary\"}\n className=\"mr-2 px-2 py-0.5 text-xs font-medium\"\n >\n {combinator}\n </Badge>\n\n <Select value={combinator} onValueChange={handleCombinatorChange}>\n <SelectTrigger className=\"w-[80px] h-7 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"AND\">AND</SelectItem>\n <SelectItem value=\"OR\">OR</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Group Actions */}\n <div className=\"flex items-center gap-1 ml-auto\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n onClick={handleAddRuleClick}\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n >\n <Plus className=\"mr-1 h-3 w-3\" /> Rule\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Add a new rule</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n onClick={handleAddGroupClick}\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n >\n <Layers className=\"mr-1 h-3 w-3\" /> Group\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Add a nested group</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n {!isRoot && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleRemove}\n className=\"h-7 w-7 text-destructive hover:text-destructive/90 hover:bg-destructive/10\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Remove group</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </div>\n\n {/* Children Area */}\n {isExpanded && (\n <div\n className={`space-y-3 mt-3 ${!isRoot ? \"pl-4 border-l-2 border-muted/50\" : \"\"}`}\n >\n {children.length === 0 && (\n <div className=\"flex items-center gap-2 p-3 text-sm text-muted-foreground bg-muted/20 rounded-md\">\n <AlertCircle className=\"h-4 w-4\" />\n <p>Group is empty. Add a rule or group to get started.</p>\n </div>\n )}\n\n {children.map((childNode) => (\n <ConditionNodeDisplay\n key={childNode.id}\n node={childNode}\n path={[...path, childNode.id]}\n fieldMap={fieldMap}\n parsedFields={parsedFields}\n onUpdateNode={onUpdateNode}\n onRemoveNode={onRemoveNode}\n onAddRule={onAddRule}\n onAddGroup={onAddGroup}\n onDuplicateNode={onDuplicateNode}\n level={level + 1}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n }\n\n return null;\n};\n\n// Main Condition Builder Component\nconst ConditionBuilder: React.FC<ConditionBuilderProps> = ({\n outputSchema,\n initialCondition,\n onConditionChange,\n predefinedFields,\n}) => {\n // State holds the entire condition tree, starting with a root group\n const [conditionTree, setConditionTree] = useState<GroupNode>(\n () => initialCondition || createEmptyGroup(\"root\"),\n );\n\n const [showDebug, setShowDebug] = useState(false);\n\n // Use predefined fields if provided, otherwise parse from schema\n const parsedFields = useMemo(() => {\n if (predefinedFields && predefinedFields.length > 0) {\n return predefinedFields;\n }\n return parseSchema(outputSchema);\n }, [outputSchema, predefinedFields]);\n\n const fieldMap = useMemo(() => {\n return new Map(parsedFields.map((f) => [f.path, f.type]));\n }, [parsedFields]);\n\n // Effect to notify parent component of changes\n useEffect(() => {\n onConditionChange(conditionTree);\n }, [conditionTree, onConditionChange]);\n\n // Top-Level Callback Handlers\n const handleUpdateNode = useCallback(\n (nodeId: string, updates: Partial<RuleNode> | Partial<GroupNode>) => {\n setConditionTree((prevTree) => {\n const updatedTree = findAndModifyNode(prevTree, nodeId, (node) => {\n // Important: Extract only the updatable fields, excluding 'type' and 'id'\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const validUpdates: Record<string, any> = {};\n if (\"field\" in updates)\n validUpdates.field = (updates as Partial<RuleNode>).field;\n if (\"operator\" in updates)\n validUpdates.operator = (updates as Partial<RuleNode>).operator;\n if (\"value\" in updates)\n validUpdates.value = (updates as Partial<RuleNode>).value;\n if (\"combinator\" in updates)\n validUpdates.combinator = (\n updates as Partial<GroupNode>\n ).combinator;\n if (\"children\" in updates)\n validUpdates.children = (updates as Partial<GroupNode>).children;\n return { ...node, ...validUpdates };\n });\n return updatedTree as GroupNode;\n });\n },\n [],\n );\n\n const handleRemoveNode = useCallback((id: string) => {\n if (id === \"root\") {\n console.warn(\"Cannot remove the root node.\");\n return;\n }\n setConditionTree((prevTree) => {\n const updatedTree = findAndModifyNode(prevTree, id, () => null);\n return updatedTree as GroupNode;\n });\n }, []);\n\n const handleAddRule = useCallback((parentId: string) => {\n const newRule = createEmptyRule();\n setConditionTree(\n (prevTree) => findAndAddNode(prevTree, parentId, newRule) as GroupNode,\n );\n }, []);\n\n const handleAddGroup = useCallback((parentId: string) => {\n const newGroup = createEmptyGroup();\n setConditionTree(\n (prevTree) => findAndAddNode(prevTree, parentId, newGroup) as GroupNode,\n );\n }, []);\n\n const handleDuplicateNode = useCallback((id: string) => {\n setConditionTree((prevTree) => {\n // First find the node to duplicate\n let nodeToDuplicate: ConditionNode | null = null;\n\n findAndModifyNode(prevTree, id, (node) => {\n nodeToDuplicate = JSON.parse(JSON.stringify(node)); // Deep clone\n return node; // Return original, we're just reading\n });\n\n if (!nodeToDuplicate) return prevTree;\n\n // Find the parent to add the duplicate to\n const findParent = (\n node: ConditionNode,\n targetId: string,\n ): string | null => {\n if (node.type === \"group\") {\n for (const child of node.children) {\n if (child.id === targetId) {\n return node.id;\n }\n const result = findParent(child, targetId);\n if (result) return result;\n }\n }\n return null;\n };\n\n const parentId = findParent(prevTree, id) || \"root\";\n\n // Create a new duplicate with new IDs\n const assignNewIds = (node: ConditionNode): ConditionNode => {\n const newId = generateId();\n if (node.type === \"rule\") {\n return { ...node, id: newId };\n } else {\n return {\n ...node,\n id: newId,\n children: node.children.map((child) => assignNewIds(child)),\n };\n }\n };\n\n const duplicateWithNewIds = assignNewIds(nodeToDuplicate);\n\n // Add the duplicate to the parent\n return findAndAddNode(\n prevTree,\n parentId,\n duplicateWithNewIds,\n ) as GroupNode;\n });\n }, []);\n\n const handleCopyToClipboard = useCallback(() => {\n navigator.clipboard\n .writeText(JSON.stringify(conditionTree, null, 2))\n .then(() => {\n toast.info(\"Condition tree copied to clipboard!\");\n })\n .catch((err) => {\n console.error(\"Failed to copy: \", err);\n });\n }, [conditionTree]);\n\n return (\n <div className=\"space-y-4 p-4 bg-background border rounded-lg shadow-sm\">\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-lg font-semibold\">Condition Builder</h2>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\">\n <Info className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-sm\">\n <p>\n Build complex query conditions by adding rules and groups.\n Rules are individual conditions, while groups combine multiple\n conditions with AND/OR logic.\n </p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowDebug(!showDebug)}\n className=\"text-xs\"\n >\n {showDebug ? \"Hide JSON\" : \"Show JSON\"}\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleCopyToClipboard}\n className=\"text-xs\"\n >\n <Copy className=\"h-3 w-3 mr-1\" /> Copy JSON\n </Button>\n </div>\n </div>\n\n {/* Main Builder Area */}\n <div className=\"relative\">\n <ScrollArea className=\"max-h-[600px] pr-4\">\n <ConditionNodeDisplay\n node={conditionTree}\n path={[\"root\"]}\n fieldMap={fieldMap}\n parsedFields={parsedFields}\n onUpdateNode={handleUpdateNode}\n onRemoveNode={handleRemoveNode}\n onAddRule={handleAddRule}\n onAddGroup={handleAddGroup}\n onDuplicateNode={handleDuplicateNode}\n level={0}\n />\n </ScrollArea>\n </div>\n\n {/* Debug Output */}\n {showDebug && (\n <div className=\"mt-6 border-t pt-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <Label className=\"text-sm font-medium\">Condition Tree JSON:</Label>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCopyToClipboard}\n className=\"h-7 text-xs\"\n >\n <Copy className=\"h-3 w-3 mr-1\" /> Copy\n </Button>\n </div>\n <div className=\"relative\">\n <ScrollArea className=\"h-[200px]\">\n <pre className=\"p-4 bg-muted rounded-md text-xs font-mono\">\n <code>{JSON.stringify(conditionTree, null, 2)}</code>\n </pre>\n </ScrollArea>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default ConditionBuilder;\n","import { useMemo, useEffect } from \"react\";\nimport ConditionBuilder, { type GroupNode } from \"./custom-condition-edge\";\nimport { AlertCircle } from \"lucide-react\";\n\n// Inline Alert components (not available in fe-libs)\nconst Alert = ({\n children,\n variant,\n className,\n}: {\n children: React.ReactNode;\n variant?: string;\n className?: string;\n}) => (\n <div\n className={`relative w-full rounded-lg border p-4 ${variant === \"destructive\" ? \"border-destructive/50 text-destructive bg-destructive/10\" : \"border-border\"} ${className || \"\"}`}\n >\n <div className=\"flex gap-3\">{children}</div>\n </div>\n);\nconst AlertTitle = ({ children }: { children: React.ReactNode }) => (\n <h5 className=\"mb-1 font-medium leading-none tracking-tight\">{children}</h5>\n);\nconst AlertDescription = ({ children }: { children: React.ReactNode }) => (\n <div className=\"text-sm opacity-90\">{children}</div>\n);\n\n// GraphQL schema type definitions\ninterface GraphQLField {\n path: string;\n type: string;\n}\n\ninterface GraphQLFieldDefinition {\n type: string;\n description?: string;\n args?: GraphQLArgumentDefinition[];\n isList?: boolean;\n isNonNull?: boolean;\n}\n\ninterface GraphQLArgumentDefinition {\n name: string;\n type: string;\n description?: string;\n}\n\ninterface GraphQLTypeDefinition {\n name: string;\n kind: \"scalar\" | \"type\" | \"enum\" | \"input\" | \"interface\" | \"union\";\n fields?: Record<string, GraphQLFieldDefinition>;\n description?: string;\n}\n\ninterface GraphQLIntrospectionData {\n queryType: string;\n mutationType?: string;\n types: Record<string, GraphQLTypeDefinition>;\n}\n\ninterface SchemaProperty {\n type: string;\n description?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n}\n\ninterface BuiltSchema {\n type: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n}\n\ninterface GraphQLConditionBuilderProps {\n introspectionData: GraphQLIntrospectionData | null;\n operationName: string;\n initialCondition: GroupNode | null;\n onConditionChange: (condition: GroupNode) => void;\n}\n\n// Helper functions moved outside component to avoid \"accessed before declared\" issues\n\n// Find a type in the schema by name\nconst findTypeInSchema = (\n types: Record<string, GraphQLTypeDefinition>,\n typeName: string,\n): GraphQLTypeDefinition | undefined => {\n return types[typeName];\n};\n\n// Map GraphQL scalar types to JSON schema types\nconst mapGraphQLTypeToJSONType = (graphqlType: string): string => {\n const typeMap: Record<string, string> = {\n String: \"string\",\n Int: \"integer\",\n Float: \"number\",\n Boolean: \"boolean\",\n ID: \"string\",\n };\n\n return typeMap[graphqlType] || \"string\";\n};\n\n// Extract all fields from the schema\nconst extractFields = (schemaToExtract: BuiltSchema): GraphQLField[] => {\n const extractedFields: GraphQLField[] = [];\n\n const processObject = (obj: SchemaProperty | BuiltSchema, path = \"\") => {\n if (!obj || typeof obj !== \"object\") return;\n\n // Add the current object if it has a type\n if (obj.type) {\n extractedFields.push({ path, type: obj.type });\n }\n\n // Process properties for objects\n if (obj.type === \"object\" && obj.properties) {\n Object.keys(obj.properties).forEach((key) => {\n const newPath = path ? `${path}.${key}` : key;\n const property = obj.properties![key];\n\n // Add the property\n extractedFields.push({ path: newPath, type: property.type });\n\n // Recursively process nested objects\n if (property.type === \"object\" && property.properties) {\n processObject(property, newPath);\n }\n\n // Process array items\n if (property.type === \"array\" && property.items) {\n // Add array field\n extractedFields.push({ path: newPath, type: \"array\" });\n\n // Process array items if they're objects\n if (property.items.type === \"object\" && property.items.properties) {\n Object.keys(property.items.properties).forEach((itemKey) => {\n const itemPath = `${newPath}.${itemKey}`;\n const itemProperty = property.items!.properties![itemKey];\n\n // Add the item field\n extractedFields.push({ path: itemPath, type: itemProperty.type });\n\n // Recursively process nested objects in array items\n if (itemProperty.type === \"object\" && itemProperty.properties) {\n processObject(itemProperty, itemPath);\n }\n });\n }\n }\n });\n }\n };\n\n processObject(schemaToExtract);\n\n // Sort fields by path for better organization\n extractedFields.sort((a, b) => a.path.localeCompare(b.path));\n\n // Remove duplicates and empty paths\n return extractedFields.filter(\n (field, index, self) =>\n field.path && self.findIndex((f) => f.path === field.path) === index,\n );\n};\n\n// Build schema for operation\nconst buildSchemaForOperation = (\n types: Record<string, GraphQLTypeDefinition>,\n typeObj: GraphQLTypeDefinition,\n): BuiltSchema => {\n // Create a hardcoded schema specifically for the GmailSearchResult\n // This ensures we have all the nested fields properly defined\n if (typeObj.name === \"GmailSearchResult\") {\n return {\n type: \"object\",\n properties: {\n emails: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n metadata: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n threadId: { type: \"string\" },\n subject: { type: \"string\" },\n from: { type: \"string\" },\n to: { type: \"string\" },\n date: { type: \"string\" },\n labels: { type: \"array\", items: { type: \"string\" } },\n },\n },\n snippet: { type: \"string\" },\n body: { type: \"string\" },\n error: { type: \"string\" },\n },\n },\n },\n error: { type: \"string\" },\n },\n };\n }\n\n // Add a special case for GmailBatchActionResult in the buildSchemaForOperation function\n if (typeObj.name === \"GmailBatchActionResult\") {\n return {\n type: \"object\",\n properties: {\n succeededIds: {\n type: \"array\",\n items: { type: \"string\" },\n },\n failedItems: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n messageId: { type: \"string\" },\n error: { type: \"string\" },\n },\n },\n },\n },\n };\n }\n\n // For other types, use a generic approach\n const builtSchema: BuiltSchema = {\n type: \"object\",\n properties: {},\n };\n\n // Helper function to recursively build schema for nested types\n const buildNestedSchema = (\n nestedTypeObj: GraphQLTypeDefinition,\n ): SchemaProperty => {\n if (!nestedTypeObj) return { type: \"string\" };\n\n const result: SchemaProperty = {\n type:\n nestedTypeObj.kind === \"scalar\"\n ? mapGraphQLTypeToJSONType(nestedTypeObj.name)\n : \"object\",\n };\n\n // For result types, we need to build a schema for each field\n if (nestedTypeObj.kind === \"type\" && nestedTypeObj.fields) {\n result.properties = {};\n\n Object.keys(nestedTypeObj.fields).forEach((fieldName) => {\n const field = nestedTypeObj.fields![fieldName];\n const fieldType = field.type;\n const fieldTypeObj = findTypeInSchema(types, fieldType);\n\n if (!fieldTypeObj) return;\n\n if (fieldTypeObj.kind === \"scalar\") {\n // Handle scalar types\n result.properties![fieldName] = {\n type: mapGraphQLTypeToJSONType(fieldTypeObj.name),\n description: field.description || \"\",\n };\n } else if (fieldTypeObj.kind === \"type\" && field.isList) {\n // Handle lists of objects\n result.properties![fieldName] = {\n type: \"array\",\n description: field.description || \"\",\n items: buildNestedSchema(fieldTypeObj),\n };\n } else if (fieldTypeObj.kind === \"type\") {\n // Handle nested objects\n result.properties![fieldName] = buildNestedSchema(fieldTypeObj);\n }\n });\n }\n\n return result;\n };\n\n // Process each field in the result type\n if (typeObj.kind === \"type\" && typeObj.fields) {\n Object.keys(typeObj.fields).forEach((fieldName) => {\n const field = typeObj.fields![fieldName];\n const fieldType = field.type;\n const fieldTypeObj = findTypeInSchema(types, fieldType);\n\n if (!fieldTypeObj) return;\n\n if (fieldTypeObj.kind === \"scalar\") {\n // Handle scalar types\n builtSchema.properties![fieldName] = {\n type: mapGraphQLTypeToJSONType(fieldTypeObj.name),\n description: field.description || \"\",\n };\n } else if (field.isList) {\n // Handle lists\n builtSchema.properties![fieldName] = {\n type: \"array\",\n items: buildNestedSchema(fieldTypeObj),\n };\n } else if (fieldTypeObj.kind === \"type\") {\n // Handle regular objects\n builtSchema.properties![fieldName] = buildNestedSchema(fieldTypeObj);\n }\n });\n }\n\n return builtSchema;\n};\n\n// Result type for schema building\ninterface SchemaResult {\n schema: BuiltSchema | null;\n fields: GraphQLField[];\n error: string | null;\n}\n\nconst GraphQLConditionBuilder = ({\n introspectionData,\n operationName,\n initialCondition,\n onConditionChange,\n}: GraphQLConditionBuilderProps) => {\n // Build schema synchronously using useMemo\n const { schema, fields, error } = useMemo<SchemaResult>(() => {\n try {\n if (!introspectionData || !operationName) {\n return { schema: null, fields: [], error: null };\n }\n\n // Check if the operation is a query or mutation\n const queryType = introspectionData.queryType;\n const mutationType = introspectionData.mutationType;\n const queryTypeObj = introspectionData.types[queryType];\n const mutationTypeObj = mutationType\n ? introspectionData.types[mutationType]\n : undefined;\n\n // First check if it's a query operation\n if (\n queryTypeObj &&\n queryTypeObj.fields &&\n queryTypeObj.fields[operationName]\n ) {\n const operation = queryTypeObj.fields[operationName];\n const returnType = operation.type;\n const returnTypeObj = findTypeInSchema(\n introspectionData.types,\n returnType,\n );\n\n if (!returnTypeObj) {\n return {\n schema: null,\n fields: [],\n error: `Return type \"${returnType}\" not found in schema`,\n };\n }\n\n // Build schema for the condition builder\n const builtSchema = buildSchemaForOperation(\n introspectionData.types,\n returnTypeObj,\n );\n\n // Extract all fields from the schema\n const extractedFields = extractFields(builtSchema);\n\n return { schema: builtSchema, fields: extractedFields, error: null };\n }\n\n // If not found in queries, check if it's a mutation operation\n if (\n mutationTypeObj &&\n mutationTypeObj.fields &&\n mutationTypeObj.fields[operationName]\n ) {\n const operation = mutationTypeObj.fields[operationName];\n const returnType = operation.type;\n const returnTypeObj = findTypeInSchema(\n introspectionData.types,\n returnType,\n );\n\n if (!returnTypeObj) {\n return {\n schema: null,\n fields: [],\n error: `Return type \"${returnType}\" not found in schema`,\n };\n }\n\n // Build schema for the condition builder\n const builtSchema = buildSchemaForOperation(\n introspectionData.types,\n returnTypeObj,\n );\n\n // Extract all fields from the schema\n const extractedFields = extractFields(builtSchema);\n\n return { schema: builtSchema, fields: extractedFields, error: null };\n }\n\n // If we get here, the operation wasn't found in either queries or mutations\n return {\n schema: null,\n fields: [],\n error: `Operation \"${operationName}\" not found in schema`,\n };\n } catch (err) {\n console.error(\"Error building schema:\", err);\n return {\n schema: null,\n fields: [],\n error: \"Failed to build schema from introspection data\",\n };\n }\n }, [introspectionData, operationName]);\n\n // Debug logging for schema and fields\n useEffect(() => {\n if (schema) {\n }\n }, [schema, fields]);\n\n if (error) {\n return (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n );\n }\n\n if (!schema) {\n return <div>Loading schema...</div>;\n }\n\n return (\n <ConditionBuilder\n outputSchema={schema}\n initialCondition={initialCondition}\n onConditionChange={onConditionChange}\n predefinedFields={fields}\n />\n );\n};\n\nexport default GraphQLConditionBuilder;\n","// Type for rule values (primitives that can be used in conditions)\ntype RuleValue = string | number | boolean | null;\n\ntype RuleNode = {\n id: string;\n type: \"rule\";\n field: string;\n operator: string;\n value: RuleValue;\n};\n\ntype GroupNode = {\n id: string;\n type: \"group\";\n combinator: \"AND\" | \"OR\";\n children: (RuleNode | GroupNode)[];\n};\n\nexport function buildConditionString(conditionJson: GroupNode): string {\n const getFallback = (operator: string, isLast: boolean): string => {\n if (!isLast) return \"{}\";\n if (operator === \"contains\") return `''`;\n return \"0\";\n };\n\n // Update the parseField function to better handle nested fields\n const parseField = (field: string, operator: string): string => {\n const parts = field.split(\".\");\n\n // Special handling for array fields (like emails.metadata.id)\n if (parts[0] === \"emails\" && parts.length > 1) {\n // For array fields, we need to use array methods\n const arrayPath = parts[0];\n const remainingPath = parts.slice(1).join(\".\");\n\n // For array operations, we'll use .find() or .some() depending on the operator\n if (operator === \"contains\" || operator === \"==\") {\n return `output.${arrayPath}.some(item => item.${remainingPath})`;\n } else if (operator === \"!=\" || operator === \"isNotNull\") {\n return `output.${arrayPath}.some(item => item.${remainingPath})`;\n } else {\n // For other operators, we'll use the first item that matches\n return `output.${arrayPath}[0]?.${remainingPath}`;\n }\n }\n\n // Standard handling for non-array fields\n const chain = parts.map((key, i) => {\n const isLast = i === parts.length - 1;\n const fallback = getFallback(operator, isLast);\n return `.get('${key}', ${fallback})`;\n });\n return `output${chain.join(\"\")}`;\n };\n\n // Update the parseRule function to handle array fields\n const parseRule = (rule: RuleNode): string => {\n const { field, operator, value } = rule;\n const parts = field.split(\".\");\n\n // Special handling for array fields (like emails.metadata.id)\n if (parts[0] === \"emails\" && parts.length > 1) {\n const remainingPath = parts.slice(1).join(\".\");\n const stringValue = typeof value === \"string\" ? `'${value}'` : value;\n\n if (operator === \"contains\") {\n return `output.emails.some(item => item.${remainingPath}?.includes(${stringValue}))`;\n } else if (operator === \"==\") {\n return `output.emails.some(item => item.${remainingPath} === ${stringValue})`;\n } else if (operator === \"!=\") {\n return `output.emails.some(item => item.${remainingPath} !== ${stringValue})`;\n } else if (operator === \">\") {\n return `output.emails.some(item => item.${remainingPath} > ${stringValue})`;\n } else if (operator === \">=\") {\n return `output.emails.some(item => item.${remainingPath} >= ${stringValue})`;\n } else if (operator === \"<\") {\n return `output.emails.some(item => item.${remainingPath} < ${stringValue})`;\n } else if (operator === \"<=\") {\n return `output.emails.some(item => item.${remainingPath} <= ${stringValue})`;\n } else if (operator === \"isNull\") {\n return `output.emails.some(item => item.${remainingPath} === null || item.${remainingPath} === undefined)`;\n } else if (operator === \"isNotNull\") {\n return `output.emails.some(item => item.${remainingPath} !== null && item.${remainingPath} !== undefined)`;\n } else if (operator === \"hasProperty\") {\n return `output.emails.some(item => '${value}' in item.${remainingPath})`;\n }\n }\n\n // Standard handling for non-array fields\n const fieldStr = parseField(field, operator);\n const stringValue = typeof value === \"string\" ? `'${value}'` : value;\n\n const opMap: Record<string, string> = {\n contains: \"includes\",\n \"==\": \"==\",\n \"!=\": \"!=\",\n \">\": \">\",\n \"<\": \"<\",\n \">=\": \">=\",\n \"<=\": \"<=\",\n hasProperty: \"hasProperty\",\n };\n\n if (operator === \"contains\") {\n return `${fieldStr}.includes(${stringValue})`;\n } else if (operator === \"hasProperty\") {\n const fieldParts = field.split(\".\");\n const baseChain = fieldParts\n .map((part) => `.get('${part}', {})`)\n .join(\"\");\n return `'${value}' in output${baseChain}`;\n } else {\n return `${fieldStr} ${opMap[operator] ?? operator} ${stringValue}`;\n }\n };\n\n const parseGroup = (group: GroupNode): string => {\n const combinator = group.combinator.toLowerCase();\n const conditions = group.children.map((child) => {\n if (child.type === \"rule\") {\n return parseRule(child);\n } else {\n return `(${parseGroup(child)})`;\n }\n });\n return conditions.join(` ${combinator} `);\n };\n\n return parseGroup(conditionJson);\n}\n","import { useState, useEffect, useMemo } from \"react\";\nimport GraphQLConditionBuilder from \"./graphql-condition-builder\";\nimport { buildConditionString } from \"./custom-condition-tree-converter\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@burdenoff/fe-libs/ui\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@burdenoff/fe-libs/ui\";\nimport { ScrollArea } from \"@burdenoff/fe-libs/ui\";\nimport { AlertCircle } from \"lucide-react\";\nimport { useReactFlow, type Edge } from \"@xyflow/react\";\nimport type { GraphQLSchema } from \"../../../../lib/types\";\nimport type { GroupNode } from \"./custom-condition-edge\";\n\n// GraphQL introspection data structure expected by GraphQLConditionBuilder\ninterface GraphQLIntrospectionData {\n queryType: string;\n mutationType?: string;\n types: Record<\n string,\n {\n name: string;\n kind: \"scalar\" | \"type\" | \"enum\" | \"input\" | \"interface\" | \"union\";\n fields?: Record<\n string,\n {\n type: string;\n description?: string;\n args?: Array<{ name: string; type: string; description?: string }>;\n isList?: boolean;\n isNonNull?: boolean;\n }\n >;\n description?: string;\n }\n >;\n}\n\n// Source node data structure\ninterface NodeData {\n operation_name?: string;\n schema?: GraphQLSchema;\n nodeData?: {\n schema?: GraphQLSchema;\n };\n}\n\ninterface SourceNode {\n id: string;\n type: string;\n data?: NodeData;\n}\n\ninterface ConditionBuilderProps {\n sourceNode: SourceNode | null;\n sourceOperation: string;\n edgeId: string;\n // Schema is passed dynamically from the node data\n schema?: GraphQLSchema | null;\n}\n\n// Convert GraphQLSchema to GraphQLIntrospectionData format\nfunction convertToIntrospectionData(\n schema: GraphQLSchema,\n): GraphQLIntrospectionData | null {\n if (!schema.queryType) {\n return null;\n }\n\n return {\n queryType: schema.queryType,\n mutationType: schema.mutationType ?? undefined,\n types: Object.fromEntries(\n Object.entries(schema.types).map(([key, value]) => [\n key,\n {\n name: value.name,\n kind: value.kind as\n | \"scalar\"\n | \"type\"\n | \"enum\"\n | \"input\"\n | \"interface\"\n | \"union\",\n fields: value.fields\n ? Object.fromEntries(\n Object.entries(value.fields).map(([fieldKey, fieldValue]) => [\n fieldKey,\n {\n type: fieldValue.type,\n isList: fieldValue.isList,\n isNonNull: fieldValue.isNonNull,\n },\n ]),\n )\n : undefined,\n },\n ]),\n ),\n };\n}\n\nexport default function ConditionBuilder({\n sourceNode,\n sourceOperation,\n edgeId,\n schema,\n}: ConditionBuilderProps) {\n const { setEdges } = useReactFlow();\n const [conditionTree, setConditionTree] = useState<GroupNode | null>(null);\n const [conditionString, setConditionString] = useState<string>(\"\");\n\n // Use the operation name from props or fall back to node data\n const selectedOperation =\n sourceOperation || sourceNode?.data?.operation_name || \"\";\n\n // Use schema passed via props - no more API calls\n const rawSchema =\n schema ||\n sourceNode?.data?.schema ||\n sourceNode?.data?.nodeData?.schema ||\n null;\n\n // Convert to introspection data format\n const introspectionData = useMemo(() => {\n if (!rawSchema) return null;\n return convertToIntrospectionData(rawSchema);\n }, [rawSchema]);\n\n const handleConditionChange = (newTree: GroupNode) => {\n setConditionTree(newTree);\n try {\n const condString = buildConditionString(newTree);\n setConditionString(condString);\n } catch (error) {\n console.error(\"Error building condition string:\", error);\n }\n };\n useEffect(() => {\n setEdges((edges: Edge[]) => {\n return edges.map((edge: Edge) => {\n if (edge.id === edgeId) {\n return { ...edge, condition: conditionString };\n } else {\n return edge;\n }\n });\n });\n }, [conditionString, edgeId, setEdges]);\n\n // Show message if no schema is available\n if (!introspectionData) {\n return (\n <div className=\"flex items-center justify-center min-h-[200px] text-muted-foreground\">\n <AlertCircle className=\"h-6 w-6 mr-2\" />\n <span>\n No schema available for this node. Configure the node schema first.\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"container mx-auto py-8\">\n {/* <Card className=\"mb-6\">\n <CardHeader>\n <CardTitle>GraphQL Condition Builder</CardTitle>\n <CardDescription>Build conditions for GraphQL operations using introspection data</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-4\">\n <h3 className=\"text-lg font-medium mb-2\">Select Operation</h3>\n <div className=\"flex flex-wrap gap-2\">\n {getAvailableOperations().map((op:any) => (\n <Button\n key={op.name}\n variant={selectedOperation === op.name ? \"default\" : \"outline\"}\n onClick={() => handleOperationChange(op.name)}\n >\n <Badge variant={op.type === \"mutation\" ? \"destructive\" : \"default\"} className=\"mr-2\">\n {op.type}\n </Badge>\n {op.name}\n </Button>\n ))}\n </div>\n </div>\n </CardContent>\n </Card> */}\n\n {introspectionData && selectedOperation && (\n <Tabs defaultValue=\"builder\" className=\"w-full\">\n <TabsList className=\"mb-4\">\n <TabsTrigger value=\"builder\">Condition Builder</TabsTrigger>\n <TabsTrigger value=\"output\">Generated Output</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"builder\">\n <GraphQLConditionBuilder\n introspectionData={introspectionData}\n operationName={selectedOperation}\n initialCondition={\n conditionTree || {\n id: \"root\",\n type: \"group\",\n combinator: \"AND\",\n children: [],\n }\n }\n onConditionChange={handleConditionChange}\n />\n </TabsContent>\n\n <TabsContent value=\"output\">\n <Card>\n <CardHeader>\n <CardTitle>Generated Condition</CardTitle>\n <CardDescription>\n The condition string that will be used to filter{\" \"}\n {selectedOperation} results\n </CardDescription>\n </CardHeader>\n <CardContent>\n <ScrollArea className=\"h-[300px] w-full rounded-md border p-4\">\n <pre className=\"font-mono text-sm\">\n {conditionString || \"No condition generated yet\"}\n </pre>\n </ScrollArea>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n )}\n </div>\n );\n}\n","import type { GraphQLSchema, GraphQLField, GraphQLArgument } from \"./types\";\n\n/**\n * GraphQL Introspection Type Reference\n */\ninterface IntrospectionTypeRef {\n kind: string;\n name: string | null;\n ofType: IntrospectionTypeRef | null;\n}\n\n/**\n * GraphQL Introspection Input Value (for args and input fields)\n */\ninterface IntrospectionInputValue {\n name: string;\n description: string | null;\n type: IntrospectionTypeRef;\n defaultValue: string | null;\n}\n\n/**\n * GraphQL Introspection Field\n */\ninterface IntrospectionField {\n name: string;\n description: string | null;\n args: IntrospectionInputValue[];\n type: IntrospectionTypeRef;\n isDeprecated: boolean;\n deprecationReason: string | null;\n}\n\n/**\n * GraphQL Introspection Type\n */\ninterface IntrospectionType {\n kind: string;\n name: string;\n description: string | null;\n fields: IntrospectionField[] | null;\n inputFields: IntrospectionInputValue[] | null;\n interfaces: IntrospectionTypeRef[] | null;\n enumValues: Array<{ name: string; description: string | null }> | null;\n possibleTypes: IntrospectionTypeRef[] | null;\n}\n\n/**\n * GraphQL Introspection Schema\n */\ninterface IntrospectionSchema {\n queryType: { name: string } | null;\n mutationType: { name: string } | null;\n subscriptionType: { name: string } | null;\n types: IntrospectionType[];\n directives: Array<{\n name: string;\n description: string | null;\n locations: string[];\n args: IntrospectionInputValue[];\n }>;\n}\n\n/**\n * GraphQL Introspection Result - the raw response from introspection query\n */\nexport interface IntrospectionResult {\n __schema?: IntrospectionSchema;\n data?: {\n __schema: IntrospectionSchema;\n };\n}\n\n/**\n * Fetch GraphQL introspection data from an endpoint\n */\nexport async function fetchIntrospectionSchema(\n endpoint: string,\n headers: Record<string, string> = {},\n method: \"GET\" | \"POST\" = \"POST\",\n): Promise<IntrospectionResult> {\n const introspectionQuery = `\n query IntrospectionQuery {\n __schema {\n queryType {\n name\n }\n mutationType {\n name\n }\n subscriptionType {\n name\n }\n types {\n ...FullType\n }\n directives {\n name\n description\n locations\n args {\n ...InputValue\n }\n }\n }\n }\n\n fragment FullType on __Type {\n kind\n name\n description\n fields(includeDeprecated: true) {\n name\n description\n args {\n ...InputValue\n }\n type {\n ...TypeRef\n }\n isDeprecated\n deprecationReason\n }\n inputFields {\n ...InputValue\n }\n interfaces {\n ...TypeRef\n }\n enumValues(includeDeprecated: true) {\n name\n description\n isDeprecated\n deprecationReason\n }\n possibleTypes {\n ...TypeRef\n }\n }\n\n fragment InputValue on __InputValue {\n name\n description\n type {\n ...TypeRef\n }\n defaultValue\n }\n\n fragment TypeRef on __Type {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n }\n }\n }\n }\n }\n }\n }\n }\n `;\n\n try {\n let response;\n\n if (method === \"GET\") {\n // For GET requests, assume the endpoint already returns introspection data\n response = await fetch(endpoint, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n ...headers,\n },\n });\n } else {\n // For POST requests, send the introspection query\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({ query: introspectionQuery }),\n });\n }\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n console.error(\"Error fetching introspection schema:\", error);\n throw error;\n }\n}\n\n/**\n * Parse GraphQL introspection data into our internal schema format\n */\nexport function parseIntrospectionSchema(\n introspectionData: IntrospectionResult,\n): GraphQLSchema {\n // Initialize our custom schema structure\n const customSchema: GraphQLSchema = {\n types: {},\n queryType: null,\n mutationType: null,\n subscriptionType: null,\n };\n\n try {\n // Extract schema from introspection data\n // Handle both formats:\n // 1. Direct format from nodeSchemaIntrospection: { __schema: {...} }\n // 2. Standard introspection format: { data: { __schema: {...} } }\n const schema =\n introspectionData.__schema || introspectionData.data?.__schema;\n\n if (!schema) {\n console.error(\n \"Invalid introspection data: missing __schema\",\n introspectionData,\n );\n return customSchema;\n }\n\n // Get root types\n if (schema.queryType) {\n customSchema.queryType = schema.queryType.name;\n }\n\n if (schema.mutationType) {\n customSchema.mutationType = schema.mutationType.name;\n }\n\n if (schema.subscriptionType) {\n customSchema.subscriptionType = schema.subscriptionType.name;\n }\n\n // Process all types\n if (Array.isArray(schema.types)) {\n schema.types.forEach((type: IntrospectionType) => {\n // Skip built-in types (those starting with \"__\")\n if (type.name && type.name.startsWith(\"__\")) {\n return;\n }\n\n // Process different kinds of types\n switch (type.kind) {\n case \"OBJECT\":\n processObjectType(type, customSchema);\n // Log Query and Mutation type fields\n if (\n type.name === customSchema.queryType ||\n type.name === customSchema.mutationType\n ) {\n }\n break;\n case \"INPUT_OBJECT\":\n processInputObjectType(type, customSchema);\n break;\n case \"ENUM\":\n processEnumType(type, customSchema);\n break;\n case \"INTERFACE\":\n processInterfaceType(type, customSchema);\n break;\n case \"UNION\":\n processUnionType(type, customSchema);\n break;\n case \"SCALAR\":\n processScalarType(type, customSchema);\n break;\n }\n });\n }\n // Log mutation fields if available\n if (\n customSchema.mutationType &&\n customSchema.types[customSchema.mutationType]\n ) {\n const mutationFields = Object.keys(\n customSchema.types[customSchema.mutationType].fields || {},\n );\n }\n\n return customSchema;\n } catch (error) {\n console.error(\"Error parsing introspection schema:\", error);\n return customSchema;\n }\n}\n\n// Process GraphQL Object Type\nfunction processObjectType(\n type: IntrospectionType,\n customSchema: GraphQLSchema,\n) {\n const fields: Record<string, GraphQLField> = {};\n\n if (Array.isArray(type.fields)) {\n type.fields.forEach((field: IntrospectionField) => {\n fields[field.name] = processField(field);\n });\n }\n\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"type\",\n fields: fields,\n };\n}\n\n// Process GraphQL Input Object Type\nfunction processInputObjectType(\n type: IntrospectionType,\n customSchema: GraphQLSchema,\n) {\n const inputFields: Record<string, GraphQLField> = {};\n\n if (Array.isArray(type.inputFields)) {\n type.inputFields.forEach((field: IntrospectionInputValue) => {\n inputFields[field.name] = processInputFieldValue(field);\n });\n }\n\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"input\",\n fields: {}, // Empty fields for input types\n inputFields: inputFields,\n };\n}\n\n// Process GraphQL Enum Type\nfunction processEnumType(type: IntrospectionType, customSchema: GraphQLSchema) {\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"enum\",\n fields: {},\n };\n}\n\n// Process GraphQL Interface Type\nfunction processInterfaceType(\n type: IntrospectionType,\n customSchema: GraphQLSchema,\n) {\n const fields: Record<string, GraphQLField> = {};\n\n if (Array.isArray(type.fields)) {\n type.fields.forEach((field: IntrospectionField) => {\n fields[field.name] = processField(field);\n });\n }\n\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"interface\",\n fields: fields,\n };\n}\n\n// Process GraphQL Union Type\nfunction processUnionType(\n type: IntrospectionType,\n customSchema: GraphQLSchema,\n) {\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"union\",\n fields: {},\n };\n}\n\n// Process GraphQL Scalar Type\nfunction processScalarType(\n type: IntrospectionType,\n customSchema: GraphQLSchema,\n) {\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"scalar\",\n fields: {},\n };\n}\n\n// Process a GraphQL Field\nfunction processField(field: IntrospectionField): GraphQLField {\n const args: GraphQLArgument[] = [];\n\n if (Array.isArray(field.args)) {\n field.args.forEach((arg: IntrospectionInputValue) => {\n args.push(processInputValue(arg));\n });\n }\n\n const typeInfo = extractTypeInfo(field.type);\n\n return {\n name: field.name,\n type: typeInfo.typeName,\n isNonNull: typeInfo.isNonNull,\n isList: typeInfo.isList,\n args: args,\n };\n}\n\n// Process a GraphQL Input Value (used for arguments)\nfunction processInputValue(\n inputValue: IntrospectionInputValue,\n): GraphQLArgument {\n const typeInfo = extractTypeInfo(inputValue.type);\n\n return {\n name: inputValue.name,\n type: typeInfo.typeName,\n isNonNull: typeInfo.isNonNull,\n isList: typeInfo.isList,\n };\n}\n\n// Process a GraphQL Input Field Value (used for input object fields)\nfunction processInputFieldValue(\n inputValue: IntrospectionInputValue,\n): GraphQLField {\n const typeInfo = extractTypeInfo(inputValue.type);\n\n return {\n name: inputValue.name,\n type: typeInfo.typeName,\n isNonNull: typeInfo.isNonNull,\n isList: typeInfo.isList,\n args: [], // Input fields don't have arguments\n };\n}\n\n// Extract type information from a GraphQL type reference\nfunction extractTypeInfo(typeRef: IntrospectionTypeRef | null): {\n typeName: string;\n isNonNull: boolean;\n isList: boolean;\n} {\n let typeName = \"\";\n let isNonNull = false;\n let isList = false;\n\n // Handle the nested type structure in GraphQL introspection\n function processTypeRef(ref: IntrospectionTypeRef | null): string {\n if (!ref) return \"Unknown\";\n\n if (ref.kind === \"NON_NULL\") {\n isNonNull = true;\n return processTypeRef(ref.ofType);\n }\n\n if (ref.kind === \"LIST\") {\n isList = true;\n return processTypeRef(ref.ofType);\n }\n\n return ref.name || \"Unknown\";\n }\n\n typeName = processTypeRef(typeRef);\n\n return { typeName, isNonNull, isList };\n}\n","import {\n EdgeLabelRenderer,\n type EdgeProps,\n type Edge,\n getBezierPath,\n getSmoothStepPath,\n useReactFlow,\n} from \"@xyflow/react\";\nimport { Loader2, Plus, Trash2, GitBranch } from \"lucide-react\";\nimport { useEffect, useState, useCallback } from \"react\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { createPortal } from \"react-dom\";\nimport Mapper from \"../../../mapper/app\";\nimport ConditionBuilder from \"./conditionBuilder/index\";\nimport { parseIntrospectionSchema } from \"../../../lib/introspection-parser\";\nimport type { GraphQLSchema } from \"../../../lib/types\";\nimport { getFluidGridsClient } from \"../../../../../graphql/client\";\nimport {\n NodeSchemaIntrospectionDocument,\n type NodeSchemaIntrospectionQuery,\n} from \"../../../../../generated/operations\";\nimport { useFlowStore } from \"../../../../stores/flow-store\";\nimport { useShallow } from \"zustand/shallow\";\n\nconst NODE_SCHEMA_INTROSPECTION = NodeSchemaIntrospectionDocument;\n\n// Edge with conditions extension\ninterface EdgeWithConditions extends Edge {\n conditions?: Rule[];\n condition?: string;\n}\n\ntype Rule = {\n field: string;\n operator: string;\n value: string;\n};\n\n// Node data structure for workflow nodes\ninterface WorkflowNodeData {\n operation_name?: string;\n nodeData?: {\n name?: string;\n version?: string;\n };\n}\n\ninterface WorkflowNode {\n id: string;\n type: string;\n data?: WorkflowNodeData;\n}\n\nexport default function CustomDeletableEdge(props: EdgeProps) {\n const {\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n source,\n markerEnd,\n } = props;\n\n const { setEdges, getEdges, getNode } = useReactFlow();\n\n // Get node execution statuses from store\n const nodeStatuses = useFlowStore(\n useShallow((s) => s.execution.nodeStatuses),\n );\n\n // Determine edge animation state based on source node status\n const sourceNodeStatus = nodeStatuses[source] || \"idle\";\n const isRunning = sourceNodeStatus === \"running\";\n const isSuccess = sourceNodeStatus === \"success\";\n const isError = sourceNodeStatus === \"error\";\n\n // Get the smooth step path for custom rendering\n const [edgePath] = getSmoothStepPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n // Get label position from bezier path\n const bezierResult = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n const labelX = bezierResult[1];\n const labelY = bezierResult[2];\n\n // Initialize edge conditions only once on mount\n useEffect(() => {\n // Get the initial rules from the edge conditions\n const edges = getEdges() as EdgeWithConditions[];\n const currentEdge = edges?.find((e: EdgeWithConditions) => e.id === id);\n\n // Only update if the edge doesn't already have conditions set\n if (currentEdge && !currentEdge.conditions) {\n setEdges((currentEdges: Edge[]) => {\n return currentEdges.map((edge: Edge) => {\n if (edge.id === id) {\n return { ...edge, conditions: [] };\n }\n return edge;\n });\n });\n }\n // Only run on mount - use getEdges inside effect to avoid dependency issues\n }, [id, setEdges, getEdges]);\n\n const [showModal, setShowModal] = useState(false);\n const [showConditionModal, setConditionShowModal] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n\n // Schema fetching state\n const [sourceSchema, setSourceSchema] = useState<GraphQLSchema | null>(null);\n const [targetSchema, setTargetSchema] = useState<GraphQLSchema | null>(null);\n const [isLoadingSchemas, setIsLoadingSchemas] = useState(false);\n const [schemaError, setSchemaError] = useState<string | null>(null);\n\n // Stop event propagation\n const handleModalClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n };\n\n const sourceNodeData = getNode(props.source) as WorkflowNode | undefined;\n const targetNodeData = getNode(props.target) as WorkflowNode | undefined;\n\n // Fetch schemas when mapper modal opens via workflow-svc GraphQL\n const fetchSchemas = useCallback(async () => {\n if (!sourceNodeData || !targetNodeData) return;\n\n setIsLoadingSchemas(true);\n setSchemaError(null);\n\n try {\n const client = getFluidGridsClient();\n\n // Fetch schema introspection via workflow-svc (proxies to node endpoints)\n const [sourceResult, targetResult] = await Promise.all([\n client\n .query<NodeSchemaIntrospectionQuery>({\n query: NODE_SCHEMA_INTROSPECTION,\n variables: {\n nodeType: sourceNodeData.type,\n version: sourceNodeData.data?.nodeData?.version || \"1.0.0\",\n },\n })\n .catch((err) => {\n console.error(\"Error fetching source schema introspection:\", err);\n return null;\n }),\n client\n .query<NodeSchemaIntrospectionQuery>({\n query: NODE_SCHEMA_INTROSPECTION,\n variables: {\n nodeType: targetNodeData.type,\n version: targetNodeData.data?.nodeData?.version || \"1.0.0\",\n },\n })\n .catch((err) => {\n console.error(\"Error fetching target schema introspection:\", err);\n return null;\n }),\n ]);\n\n const sourceData = sourceResult?.data?.nodeSchemaIntrospection;\n const targetData = targetResult?.data?.nodeSchemaIntrospection;\n // Parse the schemas\n if (sourceData) {\n const parsedSource = parseIntrospectionSchema(sourceData);\n setSourceSchema(parsedSource);\n }\n\n if (targetData) {\n const parsedTarget = parseIntrospectionSchema(targetData);\n setTargetSchema(parsedTarget);\n }\n\n if (!sourceData && !targetData) {\n setSchemaError(\n \"Failed to fetch schemas. Node endpoints may not be available.\",\n );\n }\n } catch (error) {\n console.error(\"Error fetching schemas:\", error);\n setSchemaError(\n error instanceof Error ? error.message : \"Failed to fetch schemas\",\n );\n } finally {\n setIsLoadingSchemas(false);\n }\n }, [sourceNodeData, targetNodeData]);\n\n // Fetch schemas when modal opens\n useEffect(() => {\n if (showModal && !sourceSchema && !targetSchema) {\n fetchSchemas();\n }\n }, [showModal, fetchSchemas, sourceSchema, targetSchema]);\n\n // Also fetch for condition modal\n useEffect(() => {\n if (showConditionModal && !sourceSchema) {\n fetchSchemas();\n }\n }, [showConditionModal, fetchSchemas, sourceSchema]);\n\n // Config without introspection URLs - schemas are passed directly via props\n const sourceType = sourceNodeData?.type ?? \"source\";\n const targetType = targetNodeData?.type ?? \"target\";\n const defaultDataConfig = {\n nodes: {\n [sourceType]: {\n displayName:\n sourceNodeData?.data?.nodeData?.name ||\n sourceNodeData?.type ||\n \"source\",\n category: \"source\" as const,\n style: {\n source: \"border-[var(--color-status-info-border)]\",\n target: \"border-[var(--color-status-info-border)]/60\",\n },\n // No URL - schemas are passed directly to Mapper component\n },\n [targetType]: {\n displayName:\n targetNodeData?.data?.nodeData?.name ||\n targetNodeData?.type ||\n \"target\",\n category: \"target\" as const,\n style: {\n source: \"border-[var(--color-status-warning-border)]\",\n target: \"border-[var(--color-status-warning-border)]/60\",\n },\n // No URL - schemas are passed directly to Mapper component\n },\n },\n mappingTypes: {\n direct: {\n displayName: \"Direct Mapping\",\n description: \"Map a source field directly to a target field\",\n color: {\n compatible: \"#3b82f6\", // blue-500\n incompatible: \"#ef4444\", // red-500\n },\n },\n expression: {\n displayName: \"Expression Mapping\",\n description: \"Create a custom expression to transform the data\",\n color: \"#8b5cf6\", // violet-500\n examples: [\n {\n name: \"Concatenate strings\",\n expression: \"input.firstName + ' ' + input.lastName\",\n description: \"Combine first and last name\",\n },\n {\n name: \"Mathematical operation\",\n expression: \"input.price * (1 - input.discount)\",\n description: \"Calculate discounted price\",\n },\n {\n name: \"Conditional logic\",\n expression: \"input.age >= 18 ? 'Adult' : 'Minor'\",\n description: \"Determine if adult or minor\",\n },\n {\n name: \"Array length\",\n expression: \"input.items ? input.items.length : 0\",\n description: \"Get the length of an array\",\n },\n {\n name: \"Min/Max values\",\n expression: \"Math.min(...input.values)\",\n description: \"Get the minimum value in an array\",\n },\n {\n name: \"JSON parsing\",\n expression: \"JSON.parse(input.jsonString)\",\n description: \"Parse a JSON string to an object\",\n },\n ],\n // Match the safe builtins from the Python backend\n safeBuiltins: [\n \"parseInt\",\n \"parseFloat\",\n \"String\",\n \"Boolean\",\n \"Math.min\",\n \"Math.max\",\n \"Array.isArray\",\n \"JSON.parse\",\n \"JSON.stringify\",\n \"Object.keys\",\n \"Object.values\",\n \"Object.entries\",\n ],\n },\n transform: {\n displayName: \"Transform Mapping\",\n description: \"Apply a predefined transformation function\",\n color: \"#ec4899\", // pink-500\n functions: [\n {\n name: \"uppercase\",\n displayName: \"Uppercase\",\n description: \"Convert text to uppercase\",\n argCount: 1,\n example: \"HELLO WORLD\",\n },\n {\n name: \"lowercase\",\n displayName: \"Lowercase\",\n description: \"Convert text to lowercase\",\n argCount: 1,\n example: \"hello world\",\n },\n {\n name: \"multiply\",\n displayName: \"Multiply\",\n description: \"Multiply two numbers\",\n argCount: 2,\n example: \"10 (from 5 * 2)\",\n },\n {\n name: \"concat\",\n displayName: \"Concatenate\",\n description: \"Join multiple strings together\",\n argCount: -1, // Variable number of arguments\n example: \"hello world\",\n },\n {\n name: \"add\",\n displayName: \"Add\",\n description: \"Add two numbers\",\n argCount: 2,\n example: \"8 (from 5 + 3)\",\n },\n {\n name: \"subtract\",\n displayName: \"Subtract\",\n description: \"Subtract second number from first\",\n argCount: 2,\n example: \"2 (from 5 - 3)\",\n },\n {\n name: \"trim\",\n displayName: \"Trim\",\n description: \"Remove whitespace from start and end\",\n argCount: 1,\n example: \"hello world\",\n },\n {\n name: \"split\",\n displayName: \"Split\",\n description: \"Split string into array by delimiter\",\n argCount: 2,\n example: \"['hello', 'world']\",\n },\n {\n name: \"join\",\n displayName: \"Join\",\n description: \"Join array elements with delimiter\",\n argCount: 2,\n example: \"hello-world\",\n },\n ],\n },\n cast: {\n displayName: \"Cast Mapping\",\n description: \"Convert data from one type to another\",\n color: \"#10b981\", // emerald-500\n types: [\n {\n name: \"int\",\n displayName: \"Integer\",\n description: \"Convert to whole number\",\n example: \"42\",\n },\n {\n name: \"float\",\n displayName: \"Float\",\n description: \"Convert to decimal number\",\n example: \"3.14\",\n },\n {\n name: \"str\",\n displayName: \"String\",\n description: \"Convert to text\",\n example: '\"hello\"',\n },\n {\n name: \"bool\",\n displayName: \"Boolean\",\n description: \"Convert to true/false\",\n example: \"true\",\n },\n ],\n },\n array: {\n displayName: \"Array Mapping\",\n description:\n \"Transform arrays using map, filter, reduce and other array methods\",\n color: \"#f97316\", // orange-500\n examples: [\n {\n name: \"Map - Extract IDs\",\n expression: \"${output.users.map(u => u.id)}\",\n description: \"Extract a single field from each item\",\n },\n {\n name: \"Map - Transform objects\",\n expression:\n \"${output.items.map(item => ({ name: item.name, value: item.value }))}\",\n description: \"Transform each item to new shape\",\n },\n {\n name: \"Map - With index\",\n expression:\n \"${output.items.map((item, index) => ({ ...item, position: index + 1 }))}\",\n description: \"Include index in transformation\",\n },\n {\n name: \"Filter - Active users\",\n expression: \"${output.users.filter(u => u.active)}\",\n description: \"Keep only items matching condition\",\n },\n {\n name: \"Filter - By value\",\n expression: \"${output.items.filter(item => item.price > 100)}\",\n description: \"Filter by numeric comparison\",\n },\n {\n name: \"Filter + Map\",\n expression: \"${output.users.filter(u => u.active).map(u => u.id)}\",\n description: \"Chain filter and map operations\",\n },\n {\n name: \"Reduce - Sum\",\n expression:\n \"${output.items.reduce((sum, item) => sum + item.price, 0)}\",\n description: \"Calculate total of all prices\",\n },\n {\n name: \"Reduce - Average\",\n expression:\n \"${output.items.reduce((sum, item) => sum + item.value, 0) / output.items.length}\",\n description: \"Calculate average value\",\n },\n {\n name: \"Find - First match\",\n expression:\n \"${output.items.find(item => item.id === TriggerInput.itemId)}\",\n description: \"Find first item matching condition\",\n },\n {\n name: \"Some - Any match\",\n expression: \"${output.items.some(item => item.active)}\",\n description: \"Check if any item matches\",\n },\n {\n name: \"Every - All match\",\n expression: \"${output.items.every(item => item.valid)}\",\n description: \"Check if all items match\",\n },\n {\n name: \"Flat - Flatten array\",\n expression: \"${output.nestedArrays.flat()}\",\n description: \"Flatten one level of nesting\",\n },\n {\n name: \"FlatMap - Map and flatten\",\n expression: \"${output.users.flatMap(u => u.permissions)}\",\n description: \"Map then flatten results\",\n },\n {\n name: \"Sort - Ascending\",\n expression:\n \"${[...output.items].sort((a, b) => a.price - b.price)}\",\n description: \"Sort items by price ascending\",\n },\n {\n name: \"Sort - Descending\",\n expression:\n \"${[...output.items].sort((a, b) => b.price - a.price)}\",\n description: \"Sort items by price descending\",\n },\n {\n name: \"Slice - First N\",\n expression: \"${output.items.slice(0, 5)}\",\n description: \"Get first 5 items\",\n },\n {\n name: \"Slice - Last N\",\n expression: \"${output.items.slice(-3)}\",\n description: \"Get last 3 items\",\n },\n {\n name: \"Unique values\",\n expression: \"${[...new Set(output.items.map(i => i.category))]}\",\n description: \"Get unique categories\",\n },\n ],\n },\n object: {\n displayName: \"Object Mapping\",\n description: \"Transform and manipulate objects\",\n color: \"#6366f1\", // indigo-500\n examples: [\n {\n name: \"Get keys\",\n expression: \"${Object.keys(output.metadata)}\",\n description: \"Get all property names as array\",\n },\n {\n name: \"Get values\",\n expression: \"${Object.values(output.metadata)}\",\n description: \"Get all property values as array\",\n },\n {\n name: \"Get entries\",\n expression: \"${Object.entries(output.metadata)}\",\n description: \"Get key-value pairs as array\",\n },\n {\n name: \"Merge objects\",\n expression: \"${Object.assign({}, output.user, output.preferences)}\",\n description: \"Combine multiple objects\",\n },\n {\n name: \"Spread merge\",\n expression: \"${{ ...output.defaults, ...output.overrides }}\",\n description: \"Merge with spread operator\",\n },\n {\n name: \"Pick fields\",\n expression: \"${({ id: output.user.id, email: output.user.email })}\",\n description: \"Select specific fields only\",\n },\n {\n name: \"From entries\",\n expression: \"${Object.fromEntries(output.pairs)}\",\n description: \"Create object from key-value pairs\",\n },\n {\n name: \"Has property\",\n expression: \"${'email' in output.user}\",\n description: \"Check if property exists\",\n },\n ],\n },\n context: {\n displayName: \"Workflow Context\",\n description:\n \"Access workflow execution context and state from previous nodes\",\n color: \"#14b8a6\", // teal-500\n examples: [\n {\n name: \"Trigger input\",\n expression: \"${TriggerInput.userId}\",\n description: \"Access original trigger payload\",\n },\n {\n name: \"Trigger nested data\",\n expression: \"${TriggerInput.webhookData.eventType}\",\n description: \"Access nested trigger data\",\n },\n {\n name: \"Previous node output\",\n expression: \"${WorkflowState.fetch_user.output.name}\",\n description: \"Access output from a specific previous node\",\n },\n {\n name: \"Node status\",\n expression: \"${WorkflowState.validate_data.status}\",\n description: \"Check status of a previous node\",\n },\n {\n name: \"Combine node outputs\",\n expression:\n \"${WorkflowState.step1.output.count + WorkflowState.step2.output.count}\",\n description: \"Combine data from multiple nodes\",\n },\n {\n name: \"Run ID\",\n expression: \"${RunContext.runId}\",\n description: \"Current workflow run identifier\",\n },\n {\n name: \"Workflow key\",\n expression: \"${RunContext.workflowKey}\",\n description: \"Workflow definition identifier\",\n },\n {\n name: \"Tenant ID\",\n expression: \"${RunContext.tenantId}\",\n description: \"Current tenant identifier\",\n },\n {\n name: \"Workspace ID\",\n expression: \"${RunContext.workspaceId}\",\n description: \"Current workspace identifier\",\n },\n {\n name: \"Triggered at\",\n expression: \"${RunContext.triggeredAt}\",\n description: \"Workflow trigger timestamp\",\n },\n ],\n },\n },\n typeCompatibility: {\n String: [\"ID\", \"String\"],\n ID: [\"String\", \"ID\"],\n Int: [\"Float\", \"Int\", \"String\"],\n Float: [\"String\", \"Float\"],\n Boolean: [\"Boolean\", \"String\"],\n },\n sampleData: {\n search: {\n response: [\n {\n metadata: {\n title: \"Introduction to Machine Learning\",\n source: \"https://example.com/ml-intro\",\n sourceLabel: \"Example ML Guide\",\n sourceType: \"webpage\",\n sourceInfo: \"Educational resource\",\n partition: \"default\",\n score: 0.95,\n images: [\"https://example.com/ml-image.jpg\"],\n },\n content:\n \"Machine learning is a branch of artificial intelligence...\",\n },\n {\n metadata: {\n title: \"Deep Learning Fundamentals\",\n source: \"https://example.com/dl-basics\",\n sourceLabel: \"Deep Learning Guide\",\n sourceType: \"webpage\",\n sourceInfo: \"Technical documentation\",\n partition: \"default\",\n score: 0.87,\n images: [\"https://example.com/dl-image.jpg\"],\n },\n content: \"Deep learning is a subset of machine learning...\",\n },\n ],\n },\n insert: {\n success: true,\n count: 1,\n },\n },\n };\n // Determine edge styles based on execution state\n const getEdgeStyle = () => {\n if (isRunning) {\n return {\n stroke: \"#22c55e\", // Green for running\n strokeWidth: 2,\n strokeDasharray: \"5 5\",\n };\n }\n if (isSuccess) {\n return {\n stroke: \"#22c55e\", // Green for success\n strokeWidth: 2,\n };\n }\n if (isError) {\n return {\n stroke: \"#ef4444\", // Red for error\n strokeWidth: 2,\n };\n }\n return {\n stroke: \"var(--color-text-tertiary)\", // Theme-aware default color\n strokeWidth: 1.5,\n };\n };\n\n const edgeStyle = getEdgeStyle();\n\n // Build className for edge based on state\n const edgeClassName = [isRunning && \"animated-edge edge-glow\"]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <>\n {/* Invisible wider path for hover detection */}\n <path\n d={edgePath}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={20}\n style={{ cursor: \"pointer\" }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n />\n {/* Background edge path (for glow effect) */}\n {(isRunning || isSuccess) && (\n <path\n d={edgePath}\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth={4}\n strokeOpacity={0.3}\n style={{ pointerEvents: \"none\" }}\n />\n )}\n {/* Main edge path */}\n <path\n id={id}\n className={edgeClassName}\n d={edgePath}\n fill=\"none\"\n style={edgeStyle}\n markerEnd={markerEnd}\n />\n {/* Animated flow particles for running state */}\n {isRunning && (\n <path\n d={edgePath}\n fill=\"none\"\n stroke=\"#22c55e\"\n strokeWidth={2}\n strokeDasharray=\"3 7\"\n className=\"animate-edge-flow\"\n style={{ pointerEvents: \"none\" }}\n />\n )}\n <EdgeLabelRenderer>\n {/* Edge action buttons - only visible on hover */}\n <div\n className={`pointer-events-auto absolute flex items-center gap-1 transition-all duration-200 ${\n isHovered\n ? \"opacity-100 scale-100\"\n : \"opacity-0 scale-75 pointer-events-none\"\n }`}\n style={{\n transform: `translate(${labelX}px, ${labelY}px) translate(-50%, -50%)`,\n zIndex: 1000,\n }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {/* Mapper Button */}\n <button\n type=\"button\"\n title=\"Mapper\"\n className=\"size-6 flex items-center justify-center rounded-md bg-card border border-card-foreground/20 text-card-foreground shadow-sm transition-colors hover:bg-card-foreground/10 hover:border-card-foreground/30\"\n onClick={() => setShowModal(true)}\n >\n <Plus className=\"size-3.5\" />\n </button>\n\n {/* Delete Button */}\n <button\n type=\"button\"\n title=\"Delete\"\n className=\"size-6 flex items-center justify-center rounded-md bg-card border border-card-foreground/20 text-card-foreground shadow-sm transition-colors hover:bg-[var(--color-status-error-bg-subtle)] hover:border-[var(--color-status-error-border)] hover:text-[var(--color-status-error-text)]\"\n onClick={() =>\n setEdges((edges) => edges.filter((edge) => edge.id !== id))\n }\n >\n <Trash2 className=\"size-3.5\" />\n </button>\n\n {/* Add Condition Button with Tooltip */}\n {/* <div className=\"relative group\">\n\n <button\n type=\"button\"\n className=\"size-5 flex items-center justify-center rounded-full bg-card text-green-500 transition-colors hover:bg-card-foreground/10\"\n onClick={handleAddCondition}\n >\n\n <Plus className=\"size-3 transition group-hover:scale-75\" />\n </button>\n\n <div className=\"absolute bottom-full left-1/2 mb-1 hidden w-max -translate-x-1/2 rounded-md bg-gray-700 px-2 py-1 text-xs text-white group-hover:block\">\n Add Condition\n </div>\n </div> */}\n {/* <div className=\"flex items-center justify-center min-h-screen bg-gray-100\"> */}\n {/* <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n \n <div className=\"relative group\">\n <button\n\n type=\"button\"\n className=\"size-5 flex items-center justify-center rounded-full bg-card text-green-500 transition-colors hover:bg-card-foreground/10\"\n onClick={handleAddCondition}\n >\n <Plus className=\"size-3 transition group-hover:scale-75\" />\n </button>\n <div className=\"absolute bottom-full left-1/2 mb-1 hidden w-max -translate-x-1/2 rounded-md bg-gray-700 px-2 py-1 text-xs text-white group-hover:block\">\n Add Condition\n </div>\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-80\">\n <div className=\"space-y-4\">\n <h3 className=\"font-medium text-lg\">Rule Builder</h3>\n {rules.map((rule, index) => (\n <div key={index} className=\"space-y-2 bg-gray-50 p-3 rounded-md relative\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute right-2 top-2\"\n onClick={() => removeRule(index)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n <Select\n value={rule.field}\n onValueChange={(value) => updateRule(index, 'field', value)}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select field\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"country_population\">Country Population</SelectItem>\n <SelectItem value=\"country_area\">Country Area</SelectItem>\n <SelectItem value=\"country_gdp\">Country GDP</SelectItem>\n </SelectContent>\n </Select>\n <Select\n value={rule.operator}\n onValueChange={(value) => updateRule(index, 'operator', value)}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select operator\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\">\">&gt;</SelectItem>\n <SelectItem value=\">=\">&gt;=</SelectItem>\n <SelectItem value=\"<\">&lt;</SelectItem>\n <SelectItem value=\"<=\">&lt;=</SelectItem>\n <SelectItem value=\"==\">==</SelectItem>\n </SelectContent>\n </Select>\n <Input\n type=\"number\"\n placeholder=\"Enter value\"\n value={rule.value}\n onChange={(e) => updateRule(index, 'value', e.target.value)}\n />\n </div>\n ))}\n <Button onClick={addRule} className=\"w-full\">Add Rule</Button>\n </div>\n <ConditionBuilder sourceNode={sourceNodeData} sourceOperation={sourceNodeData?.data?.operation_name} />\n </PopoverContent>\n </Popover> */}\n {/* Condition Button */}\n <button\n type=\"button\"\n title=\"Condition\"\n className=\"size-6 flex items-center justify-center rounded-md bg-card border border-card-foreground/20 text-card-foreground shadow-sm transition-colors hover:bg-[var(--color-status-success-bg-subtle)] hover:border-[var(--color-status-success-border)] hover:text-[var(--color-status-success-text)]\"\n onClick={() => setConditionShowModal(true)}\n >\n <GitBranch className=\"size-3.5\" />\n </button>\n </div>\n\n {/* Modals - rendered outside of hover container */}\n {showModal &&\n createPortal(\n <div\n className=\"fixed inset-0 bg-black/50 z-[99999] flex items-center justify-center\"\n onClick={() => setShowModal(false)}\n >\n <div\n className=\"bg-surface z-[100000] flex flex-col w-[95%] h-[95%] rounded-lg overflow-hidden pointer-events-auto\"\n onClick={handleModalClick}\n >\n <div className=\"flex justify-between items-center p-4 border-b bg-muted\">\n <h2 className=\"text-2xl font-bold text-primary\">\n GraphQL Mapper\n </h2>\n <div className=\"flex items-center gap-4\">\n {isLoadingSchemas && (\n <span className=\"flex items-center text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 mr-2 animate-spin\" />\n Loading schemas...\n </span>\n )}\n {schemaError && (\n <span className=\"text-sm text-[var(--color-status-error-text)]\">\n {schemaError}\n </span>\n )}\n <Button\n variant=\"outline\"\n onClick={() => setShowModal(false)}\n >\n Close\n </Button>\n </div>\n </div>\n <div className=\"flex-1 overflow-auto p-4\">\n <div className=\"pointer-events-auto\">\n {isLoadingSchemas ? (\n <div className=\"flex flex-col items-center justify-center h-64\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary mb-4\" />\n <p className=\"text-muted-foreground\">\n Fetching node schemas...\n </p>\n <p className=\"text-sm text-muted-foreground mt-2\">\n Source: {sourceNodeData?.type} | Target:{\" \"}\n {targetNodeData?.type}\n </p>\n </div>\n ) : (\n <Mapper\n dataConfig={defaultDataConfig}\n sourceNode={sourceNodeData?.type}\n targetNode={targetNodeData?.type}\n sourceOperation={\n sourceNodeData?.data?.operation_name || \"execute\"\n }\n targetOperation={\n targetNodeData?.data?.operation_name || \"execute\"\n }\n sourceSchema={sourceSchema || undefined}\n targetSchema={targetSchema || undefined}\n setEdges={setEdges as (edges: unknown) => void}\n edgeId={id}\n />\n )}\n </div>\n </div>\n </div>\n </div>,\n document.body,\n )}\n\n {showConditionModal &&\n createPortal(\n <div\n className=\"fixed inset-0 bg-black/50 z-[99999] flex items-center justify-center\"\n onClick={() => setConditionShowModal(false)}\n >\n <div\n className=\"bg-surface z-[100000] flex flex-col w-[95%] h-[95%] rounded-lg overflow-hidden pointer-events-auto\"\n onClick={handleModalClick}\n >\n <div className=\"flex justify-between items-center p-4 border-b bg-muted\">\n <h2 className=\"text-2xl font-bold text-primary\">Condition</h2>\n <div className=\"flex items-center gap-4\">\n {isLoadingSchemas && (\n <span className=\"flex items-center text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 mr-2 animate-spin\" />\n Loading schema...\n </span>\n )}\n <Button\n variant=\"outline\"\n onClick={() => setConditionShowModal(false)}\n >\n Close\n </Button>\n </div>\n </div>\n <div className=\"flex-1 overflow-auto p-4\">\n <div className=\"pointer-events-auto\">\n {isLoadingSchemas ? (\n <div className=\"flex flex-col items-center justify-center h-64\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary mb-4\" />\n <p className=\"text-muted-foreground\">\n Fetching node schema...\n </p>\n </div>\n ) : (\n <ConditionBuilder\n sourceNode={\n (sourceNodeData as {\n id: string;\n type: string;\n data?: Record<string, unknown>;\n }) ?? null\n }\n sourceOperation={\n sourceNodeData?.data?.operation_name || \"execute\"\n }\n edgeId={id}\n schema={sourceSchema}\n />\n )}\n </div>\n </div>\n </div>\n </div>,\n document.body,\n )}\n {/* Shadcn Dialog for Rule Builder */}\n {/* <Dialog open={isDialogOpen} onOpenChange={setDialogOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Rule Builder</DialogTitle>\n </DialogHeader>\n \n <RuleBuilder/>\n </DialogContent>\n </Dialog> */}\n </EdgeLabelRenderer>\n </>\n );\n}\n","import type { FinalConnectionState } from \"@xyflow/react\";\nimport { create } from \"zustand\";\n\ninterface State {\n anchorPosition: {\n x: number;\n y: number;\n };\n dropPosition: {\n x: number;\n y: number;\n };\n showMenu: boolean;\n incomingNodeMetadetails: FinalConnectionState | null;\n}\n\ninterface Actions {\n actions: {\n setAnchorPosition: (position: { x: number; y: number }) => void;\n setDropPosition: (position: { x: number; y: number }) => void;\n setShowMenu: (show: boolean) => void;\n setIncomingNodeMetadetails: (detail: FinalConnectionState | null) => void;\n };\n}\n\ninterface IAddNodeOnEdgeDropState extends State {\n actions: Actions[\"actions\"];\n}\n\nexport const useAddNodeOnEdgeDropStore = create<IAddNodeOnEdgeDropState>()(\n (set) => ({\n anchorPosition: { x: 0, y: 0 },\n dropPosition: { x: 0, y: 0 },\n showMenu: false,\n incomingNodeMetadetails: null,\n actions: {\n setAnchorPosition: (position) => set({ anchorPosition: position }),\n setDropPosition: (position) => set({ dropPosition: position }),\n setShowMenu: (show) => set({ showMenu: show }),\n setIncomingNodeMetadetails: (detail) =>\n set({ incomingNodeMetadetails: detail }),\n },\n }),\n);\n\nexport type AddNodeOnEdgeDropState = State;\n","import { useAddNodeOnEdgeDropStore } from \"../stores/add-node-on-edge-drop-state\";\nimport { type FinalConnectionState, useReactFlow } from \"@xyflow/react\";\nimport { nanoid } from \"nanoid/non-secure\";\nimport { useCallback, useRef } from \"react\";\nimport { useInsertNode } from \"./use-insert-node\";\nimport { useShallow } from \"zustand/shallow\";\nimport { ExtendedNodeType } from \"../components/flow-builder/components/blocks/types\";\n\nexport function useAddNodeOnEdgeDrop() {\n const [\n dropPosition,\n incomingNodeMetadetails,\n setAnchorPosition,\n setDropPosition,\n setShowMenu,\n setIncomingNodeMetadetails,\n ] = useAddNodeOnEdgeDropStore(\n useShallow((s) => [\n s.dropPosition,\n s.incomingNodeMetadetails,\n s.actions.setAnchorPosition,\n s.actions.setDropPosition,\n s.actions.setShowMenu,\n s.actions.setIncomingNodeMetadetails,\n ]),\n );\n\n const { screenToFlowPosition, addEdges } = useReactFlow();\n const insertNode = useInsertNode();\n\n const floatingMenuWrapperRef = useRef<HTMLDivElement>(null);\n\n const handleAddConnectedNode = useCallback(\n (type: ExtendedNodeType) => {\n if (\n !incomingNodeMetadetails ||\n !incomingNodeMetadetails.fromHandle ||\n !incomingNodeMetadetails.fromNode\n ) {\n return;\n }\n const newNode = insertNode(type, dropPosition);\n\n if (incomingNodeMetadetails.fromHandle.type === \"source\") {\n addEdges({\n id: nanoid(),\n type: \"deletable\",\n target: newNode.id,\n sourceHandle: incomingNodeMetadetails.fromHandle.id,\n source: incomingNodeMetadetails.fromNode.id,\n });\n } else if (incomingNodeMetadetails.fromHandle.type === \"target\") {\n addEdges({\n id: nanoid(),\n type: \"deletable\",\n target: incomingNodeMetadetails.fromNode.id,\n targetHandle: incomingNodeMetadetails.fromHandle.id,\n source: newNode.id,\n });\n }\n\n setShowMenu(false);\n setIncomingNodeMetadetails(null);\n },\n [\n insertNode,\n addEdges,\n setShowMenu,\n setIncomingNodeMetadetails,\n incomingNodeMetadetails,\n dropPosition,\n ],\n );\n\n const onConnectEnd = useCallback(\n (e: MouseEvent | TouchEvent, connectionState: FinalConnectionState) => {\n if (!connectionState.isValid && floatingMenuWrapperRef.current) {\n const { clientX, clientY } =\n \"changedTouches\" in e ? e.changedTouches[0] : e;\n\n const _anchorPositionPadding = 20;\n const _floatingMenuWrapperRect =\n floatingMenuWrapperRef.current.getBoundingClientRect();\n const _addNodeFloatingMenuAnchorPosition = {\n x:\n (clientX > _floatingMenuWrapperRect.width + _anchorPositionPadding\n ? _floatingMenuWrapperRect.width - _anchorPositionPadding\n : clientX < _anchorPositionPadding\n ? _anchorPositionPadding\n : clientX) - _floatingMenuWrapperRect.x,\n y:\n clientY > _floatingMenuWrapperRect.height + _anchorPositionPadding\n ? _floatingMenuWrapperRect.height - _anchorPositionPadding\n : clientY < _anchorPositionPadding\n ? _anchorPositionPadding\n : clientY - _floatingMenuWrapperRect.y,\n };\n\n setAnchorPosition(_addNodeFloatingMenuAnchorPosition);\n setShowMenu(true);\n setIncomingNodeMetadetails(connectionState);\n setDropPosition(screenToFlowPosition({ x: clientX, y: clientY }));\n }\n },\n [\n setAnchorPosition,\n setShowMenu,\n setIncomingNodeMetadetails,\n screenToFlowPosition,\n floatingMenuWrapperRef,\n setDropPosition,\n ],\n );\n\n return {\n handleOnEdgeDropConnectEnd: onConnectEnd,\n floatingMenuWrapperRef,\n handleAddConnectedNode,\n };\n}\n","import { useReactFlow } from \"@xyflow/react\";\nimport { type DragEvent, useCallback } from \"react\";\nimport { useInsertNode } from \"./use-insert-node\";\nimport { NODE_TYPE_DRAG_DATA_FORMAT } from \"../contants/symbols\";\nimport { BuilderNode } from \"../components/flow-builder/components/blocks/types\";\n\nexport function useDragDropFlowBuilder() {\n const { screenToFlowPosition } = useReactFlow();\n const insertNode = useInsertNode();\n\n const onDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n }, []);\n\n const onDrop = useCallback(\n (e: DragEvent) => {\n e.preventDefault();\n\n const type = e.dataTransfer.getData(NODE_TYPE_DRAG_DATA_FORMAT);\n if (typeof type === \"undefined\" || !type) return;\n\n insertNode(\n type as BuilderNode,\n screenToFlowPosition({\n x: e.clientX,\n y: e.clientY,\n }),\n );\n },\n [insertNode, screenToFlowPosition],\n );\n\n return [onDragOver, onDrop];\n}\n","import {\n type Connection,\n type Edge,\n type Node,\n getOutgoers,\n} from \"@xyflow/react\";\nimport { useCallback } from \"react\";\n\nfunction findTargetNode(nodes: Node[], connection: Edge | Connection) {\n return nodes.find((node) => node.id === connection.target);\n}\n\nfunction hasCycle(\n node: Node,\n connection: Edge | Connection,\n nodes: Node[],\n edges: Edge[],\n visited: Set<string> = new Set<string>(),\n) {\n if (visited.has(node.id)) return false;\n\n visited.add(node.id);\n\n for (const outgoer of getOutgoers(node, nodes, edges)) {\n if (outgoer.id === connection.source) return true;\n if (hasCycle(outgoer, connection, nodes, edges, visited)) return true;\n }\n}\n\nexport function useIsValidConnection(nodes: Node[], edges: Edge[]) {\n return useCallback(\n (connection: Edge | Connection) => {\n const target = findTargetNode(nodes, connection);\n\n if (target?.id === connection.source) return false;\n return target ? !hasCycle(target, connection, nodes, edges) : true;\n },\n [nodes, edges],\n );\n}\n","/**\n * CanvasControls — Enhanced bottom-right control panel for the workflow canvas.\n *\n * Features:\n * - MiniMap toggle (show/hide overview map)\n * - Fit view\n * - Zoom in / out with live percentage\n * - Hide / show edges\n * - Tidy up: auto-layout nodes left-to-right via topological sort (no external deps)\n */\nimport { useState, useCallback } from \"react\";\nimport {\n MiniMap,\n type ReactFlowState,\n useReactFlow,\n useStore,\n} from \"@xyflow/react\";\nimport { shallow } from \"zustand/shallow\";\nimport { Icon } from \"@iconify/react\";\nimport { Maximize2, LayoutGrid } from \"lucide-react\";\n\nconst ZOOM_DURATION = 500;\nconst NODE_WIDTH = 220;\nconst NODE_HEIGHT = 80;\nconst H_GAP = 80;\nconst V_GAP = 48;\n\nfunction zoomSelector(s: ReactFlowState) {\n return {\n zoom: s.transform[2],\n minZoomReached: s.transform[2] <= s.minZoom,\n maxZoomReached: s.transform[2] >= s.maxZoom,\n };\n}\n\nfunction ControlBtn({\n onClick,\n title,\n disabled,\n active,\n children,\n}: {\n onClick?: () => void;\n title: string;\n disabled?: boolean;\n active?: boolean;\n children: React.ReactNode;\n}) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={[\n \"flex items-center justify-center size-8 rounded-md transition-colors\",\n \"text-card-foreground/70 hover:text-card-foreground hover:bg-card-foreground/10\",\n active ? \"bg-primary/15 text-primary hover:text-primary\" : \"\",\n disabled ? \"opacity-40 cursor-not-allowed\" : \"cursor-pointer\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </button>\n );\n}\n\nexport function CanvasControls() {\n const searchParams = new URLSearchParams(window.location.search);\n const isReadOnly = searchParams.get(\"readonly\") === \"true\";\n\n const [showMinimap, setShowMinimap] = useState(false);\n const [edgesHidden, setEdgesHidden] = useState(false);\n\n const { zoom, minZoomReached, maxZoomReached } = useStore(\n zoomSelector,\n shallow,\n );\n const { zoomIn, zoomOut, fitView, setEdges, getEdges, getNodes, setNodes } =\n useReactFlow();\n\n // ── Hide / show edges ────────────────────────────────────────────────────\n const toggleEdges = useCallback(() => {\n setEdgesHidden((prev) => {\n const next = !prev;\n setEdges((edges) => edges.map((e) => ({ ...e, hidden: next })));\n return next;\n });\n }, [setEdges]);\n\n // ── Tidy up: topological-sort-based left-to-right auto layout ────────────\n const tidyUp = useCallback(() => {\n const nodes = getNodes();\n const edges = getEdges();\n\n if (nodes.length === 0) return;\n\n // Build adjacency\n const outgoing: Record<string, string[]> = {};\n const inDegree: Record<string, number> = {};\n\n for (const n of nodes) {\n outgoing[n.id] = [];\n inDegree[n.id] = 0;\n }\n for (const e of edges) {\n outgoing[e.source]?.push(e.target);\n if (e.target in inDegree) inDegree[e.target]++;\n }\n\n // Kahn's algorithm → assign column (level) per node\n const level: Record<string, number> = {};\n const queue = nodes.filter((n) => inDegree[n.id] === 0).map((n) => n.id);\n queue.forEach((id) => (level[id] = 0));\n\n const visited = new Set<string>();\n while (queue.length > 0) {\n const id = queue.shift()!;\n if (visited.has(id)) continue;\n visited.add(id);\n for (const target of outgoing[id] ?? []) {\n level[target] = Math.max(level[target] ?? 0, (level[id] ?? 0) + 1);\n inDegree[target]--;\n if (inDegree[target] <= 0) queue.push(target);\n }\n }\n\n // Any node not reached (cycles) gets its own level\n for (const n of nodes) {\n if (!(n.id in level)) level[n.id] = 0;\n }\n\n // Group by level → assign row within each column\n const byLevel: Record<number, string[]> = {};\n for (const n of nodes) {\n const col = level[n.id] ?? 0;\n (byLevel[col] ??= []).push(n.id);\n }\n\n // Compute positions\n const posMap: Record<string, { x: number; y: number }> = {};\n for (const [colStr, ids] of Object.entries(byLevel)) {\n const col = Number(colStr);\n const totalH = ids.length * NODE_HEIGHT + (ids.length - 1) * V_GAP;\n ids.forEach((id, row) => {\n posMap[id] = {\n x: col * (NODE_WIDTH + H_GAP),\n y: row * (NODE_HEIGHT + V_GAP) - totalH / 2,\n };\n });\n }\n\n setNodes((nds) =>\n nds.map((n) => (posMap[n.id] ? { ...n, position: posMap[n.id] } : n)),\n );\n\n setTimeout(() => fitView({ duration: ZOOM_DURATION, padding: 0.15 }), 50);\n }, [getNodes, getEdges, setNodes, fitView]);\n\n return (\n <>\n {/* MiniMap — rendered outside the panel so it floats above it */}\n {showMinimap && (\n <MiniMap\n position=\"bottom-left\"\n style={{\n position: \"fixed\",\n bottom: 52,\n left: \"calc(var(--canvas-left, 64px) + 12px)\" as unknown as number,\n marginBottom: 4,\n backgroundColor: \"var(--color-card)\",\n }}\n className=\"!rounded-lg !border !border-card-foreground/10 !shadow-lg\"\n nodeColor=\"var(--color-primary)\"\n nodeStrokeColor=\"transparent\"\n maskColor=\"rgba(0,0,0,0.45)\"\n zoomable\n pannable\n />\n )}\n\n {/* Control panel */}\n <div\n className=\"fixed bottom-3 z-50 flex items-center gap-1 rounded-xl border border-card-foreground/10 bg-card px-2 py-1.5 shadow-lg\"\n style={{ left: \"calc(var(--canvas-left, 64px) + 12px)\" }}\n >\n {/* Minimap toggle */}\n <ControlBtn\n title={showMinimap ? \"Hide minimap\" : \"Show minimap\"}\n active={showMinimap}\n onClick={() => setShowMinimap((v) => !v)}\n >\n <Icon icon=\"mynaui:map\" className=\"size-4\" />\n </ControlBtn>\n\n <div className=\"w-px h-5 bg-card-foreground/10 mx-0.5\" />\n\n {/* Fit view */}\n <ControlBtn\n title=\"Fit view\"\n onClick={() => fitView({ duration: ZOOM_DURATION, padding: 0.15 })}\n >\n <Maximize2 className=\"size-4\" />\n </ControlBtn>\n\n {/* Zoom out */}\n <ControlBtn\n title=\"Zoom out\"\n disabled={minZoomReached}\n onClick={() => zoomOut({ duration: ZOOM_DURATION })}\n >\n <Icon icon=\"mynaui:minus\" className=\"size-4\" />\n </ControlBtn>\n\n {/* Zoom percentage */}\n <button\n title=\"Reset zoom to 100%\"\n onClick={() => fitView({ duration: ZOOM_DURATION })}\n className=\"min-w-[44px] text-center text-xs font-medium text-card-foreground/60 hover:text-card-foreground transition-colors tabular-nums cursor-pointer\"\n >\n {Math.round(zoom * 100)}%\n </button>\n\n {/* Zoom in */}\n <ControlBtn\n title=\"Zoom in\"\n disabled={maxZoomReached}\n onClick={() => zoomIn({ duration: ZOOM_DURATION })}\n >\n <Icon icon=\"mynaui:plus\" className=\"size-4\" />\n </ControlBtn>\n\n {!isReadOnly && (\n <>\n <div className=\"w-px h-5 bg-card-foreground/10 mx-0.5\" />\n\n {/* Hide / show edges */}\n <ControlBtn\n title={edgesHidden ? \"Show connections\" : \"Hide connections\"}\n active={edgesHidden}\n onClick={toggleEdges}\n >\n <Icon\n icon={edgesHidden ? \"mynaui:link-slash\" : \"mynaui:link\"}\n className=\"size-4\"\n />\n </ControlBtn>\n\n {/* Tidy up */}\n <ControlBtn title=\"Tidy up layout\" onClick={tidyUp}>\n <LayoutGrid className=\"size-4\" />\n </ControlBtn>\n </>\n )}\n </div>\n </>\n );\n}\n","import { ExtendedNodeType } from \"../../blocks/types\";\nimport { AVAILABLE_NODES, NODES_METADATA } from \"../../blocks\";\nimport { Icon } from \"@iconify/react\";\n\ntype NodeListProps = Readonly<{\n nodes: Array<\n (typeof AVAILABLE_NODES)[number] & {\n __meta: (typeof NODES_METADATA)[ExtendedNodeType];\n __enabled: boolean;\n }\n >;\n onNodeAdd: (type: ExtendedNodeType) => void;\n}>;\n\nexport default function NodeList({ nodes, onNodeAdd }: NodeListProps) {\n return (\n <div className=\"flex flex-col gap-y-0.5 p-1\">\n {nodes.map((node) => (\n <button\n onClick={() => {\n onNodeAdd(node.type);\n }}\n type=\"button\"\n disabled={!node.__enabled}\n key={node.type}\n className=\"flex items-center rounded-xl bg-transparent p-1 transition disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-20 active:bg-card-foreground/10 hover:bg-card-foreground/10\"\n >\n <div className=\"size-7 flex shrink-0 items-center justify-center border border-card-foreground/10 rounded-lg bg-card\">\n <Icon icon={node.icon} className={\"size-4 text-card-foreground\"} />\n </div>\n\n <div className=\"ml-2 text-sm text-card-foreground/80\">\n {node.title}\n </div>\n </button>\n ))}\n </div>\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { useAddNodeOnEdgeDropStore } from \"../../../../stores/add-node-on-edge-drop-state\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@burdenoff/fe-libs/ui\";\nimport NodeList from \"./components/node-list\";\nimport { useShallow } from \"zustand/shallow\";\nimport { BuilderNode, ExtendedNodeType } from \"../blocks/types\";\nimport { AVAILABLE_NODES, NODES_METADATA } from \"../blocks\";\n\ntype AddNodeFloatingMenuProps = Readonly<{\n onNodeAdd: (type: ExtendedNodeType) => void;\n}>;\n\nexport default function AddNodeFloatingMenu({\n onNodeAdd,\n}: AddNodeFloatingMenuProps) {\n const [showMenu, setShowMenu, anchorPosition, _incomingNodeMetadetails] =\n useAddNodeOnEdgeDropStore(\n useShallow((s) => [\n s.showMenu,\n s.actions.setShowMenu,\n s.anchorPosition,\n s.incomingNodeMetadetails,\n ]),\n );\n const onOutsideClick = useCallback(() => {\n setShowMenu(false);\n }, [setShowMenu]);\n\n const handleOnNodeAdd = useCallback(\n (type: ExtendedNodeType) => {\n setShowMenu(false);\n onNodeAdd(type);\n },\n [onNodeAdd, setShowMenu],\n );\n\n const incomingNodeMetadetails = useMemo(\n () => _incomingNodeMetadetails,\n [_incomingNodeMetadetails],\n );\n\n const nodesWithMetadata = useMemo(() => {\n const mapNodesWithMetadata = (\n types: ExtendedNodeType[],\n ): Array<\n (typeof AVAILABLE_NODES)[number] & {\n __meta: (typeof NODES_METADATA)[ExtendedNodeType];\n __enabled: boolean;\n }\n > =>\n types.map((type) => {\n const meta = NODES_METADATA[type];\n const isFromSource =\n incomingNodeMetadetails?.fromHandle?.type === \"source\";\n const isFromTarget =\n incomingNodeMetadetails?.fromHandle?.type === \"target\";\n\n const enabled =\n (isFromSource && meta?.connection?.inputs > 0) ||\n (isFromTarget && meta?.connection?.outputs > 0) ||\n !incomingNodeMetadetails;\n\n return {\n type,\n title: meta?.detail?.title ?? \"\",\n icon: meta?.detail?.icon ?? \"\",\n description: meta?.detail?.description,\n gradientColor: meta?.detail?.gradientColor ?? \"gray\",\n __meta: meta,\n __enabled: enabled,\n manifest: meta?.manifest,\n };\n });\n\n const fromHandleId = _incomingNodeMetadetails?.fromHandle?.id as\n | string\n | undefined;\n return {\n availableNodes: mapNodesWithMetadata(\n fromHandleId === \"source\" || fromHandleId === \"target\"\n ? AVAILABLE_NODES.map((node) => node.type)\n : AVAILABLE_NODES.filter((node) =>\n node?.manifest?.kind?.includes(fromHandleId ?? \"\"),\n ).map((node) => node.type),\n ),\n additionalNodes: mapNodesWithMetadata([BuilderNode.END]),\n };\n }, [_incomingNodeMetadetails, incomingNodeMetadetails]);\n\n return (\n <Popover open={showMenu}>\n <PopoverTrigger asChild>\n <div\n className=\"left absolute size-0 bg-card\"\n style={{\n left: `${anchorPosition.x}px`,\n top: `${anchorPosition.y}px`,\n }}\n />\n </PopoverTrigger>\n <PopoverContent\n className=\"isolate p-0 w-fit z-10 transform origin-[var(--radix-popover-content-transform-origin)] data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=open]:animate-in animate-duration-200 select-none overflow-clip border border-card-foreground/10 rounded-xl bg-card/40 shadow-2xl shadow-card/30 backdrop-blur-2xl\"\n side=\"bottom\"\n align=\"start\"\n tabIndex={-1}\n updatePositionStrategy=\"always\"\n onFocusOutside={() => onOutsideClick()}\n onInteractOutside={() => onOutsideClick()}\n onEscapeKeyDown={() => onOutsideClick()}\n >\n <div tabIndex={-1} className=\"w-60 flex flex-col outline-none\">\n <NodeList\n nodes={nodesWithMetadata.availableNodes}\n onNodeAdd={handleOnNodeAdd}\n />\n\n <div className=\"my-0.5 h-px bg-card-foreground/10\" />\n\n <NodeList\n nodes={nodesWithMetadata.additionalNodes}\n onNodeAdd={handleOnNodeAdd}\n />\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","import {\n BuilderNode,\n BuilderNodeType,\n type ChannelNodeData,\n} from \"../components/flow-builder/components/blocks/types\";\nimport {\n type Edge,\n type Node,\n getConnectedEdges,\n useReactFlow,\n} from \"@xyflow/react\";\nimport { useCallback, useState } from \"react\";\n\n/**\n * Check if a node type is a trigger node based on its type string alone.\n * Does NOT include integration/channel — that type is role-based (see isNodeTrigger).\n */\nfunction isTriggerNodeType(type: string | undefined): boolean {\n if (!type) return false;\n return (\n type === \"trigger\" ||\n type === \"trigger:api\" ||\n type.startsWith(\"trigger:\") ||\n type.startsWith(\"internal:schedule\") ||\n type.startsWith(\"internal:webhook\") ||\n type.startsWith(\"internal:api\") ||\n type.startsWith(\"internal:form\") ||\n type.startsWith(\"internal:mcp\") ||\n type.endsWith(\"_trigger\") ||\n type.endsWith(\"Trigger\") ||\n type.endsWith(\"-trigger\")\n );\n}\n\n/**\n * Determine if a node acts as a trigger, accounting for role-based types.\n * integration/channel nodes can be either a trigger (receive) or an action (send)\n * depending on their configured role / operation_name.\n */\nfunction isNodeTrigger(node: Node): boolean {\n if (isTriggerNodeType(node.type)) return true;\n if (node.type === \"integration/channel\") {\n const data = node.data as ChannelNodeData;\n // Check both top-level role (legacy) and args.state.role (property panel stores it here)\n const role = data.role ?? data.args?.state?.role;\n const opName = data.operation_name;\n return (\n role === \"trigger\" ||\n (typeof opName === \"string\" && opName.startsWith(\"on\"))\n );\n }\n return false;\n}\n\nfunction findEdges(node: Node, connectedEdges: Edge[]) {\n const outgoingEdges = connectedEdges.filter(\n (edge) => edge.source === node.id,\n );\n const incomingEdges = connectedEdges.filter(\n (edge) => edge.target === node.id,\n );\n return { outgoingEdges, incomingEdges };\n}\n\nfunction checkFlowTerminalNode(\n outgoingEdges: Edge[],\n incomingEdges: Edge[],\n isTrigger: boolean,\n type: string,\n) {\n if (isTrigger) {\n return outgoingEdges.length >= 1;\n }\n switch (type) {\n case BuilderNode.END:\n return incomingEdges.length >= 1;\n default:\n return false;\n }\n}\n\nfunction checkLoneNode(\n outgoingEdges: Edge[],\n incomingEdges: Edge[],\n isTrigger: boolean,\n) {\n if (isTrigger) {\n return outgoingEdges.length === 0;\n }\n return incomingEdges.length === 0;\n}\n\nexport function useFlowValidator(\n onValidate?: (isValid: boolean) => void,\n): [boolean, () => void] {\n const [isValidating, setIsValidating] = useState(false);\n const { getNodes, getEdges } = useReactFlow();\n\n const validate = useCallback(async () => {\n setIsValidating(true);\n\n await new Promise((resolve) => setTimeout(resolve, 300));\n\n const nodes = getNodes();\n const edges = getEdges();\n const connectedEdges = getConnectedEdges(nodes, edges);\n\n let isTriggerConnected = false;\n let hasTriggerNode = false;\n let hasEndNode = false;\n let isEndConnected = false;\n const nodesWithEmptyTarget: Node[] = [];\n\n for (const node of nodes) {\n const { outgoingEdges, incomingEdges } = findEdges(node, connectedEdges);\n const isTrigger = isNodeTrigger(node);\n\n if (isTrigger) {\n hasTriggerNode = true;\n if (\n checkFlowTerminalNode(\n outgoingEdges,\n incomingEdges,\n true,\n node.type as string,\n )\n ) {\n isTriggerConnected = true;\n }\n } else if (node.type === BuilderNode.END) {\n hasEndNode = true;\n isEndConnected = checkFlowTerminalNode(\n outgoingEdges,\n incomingEdges,\n false,\n BuilderNode.END,\n );\n }\n\n if (checkLoneNode(outgoingEdges, incomingEdges, isTrigger))\n nodesWithEmptyTarget.push(node);\n }\n\n const hasAnyLoneNode = nodesWithEmptyTarget.length > 0;\n // END node is optional - if it exists, it must be connected; if not, workflow is still valid\n const isEndValid = !hasEndNode || isEndConnected;\n // Trigger node is required - at least one trigger must exist and be connected\n const isFlowComplete =\n hasTriggerNode && isTriggerConnected && isEndValid && !hasAnyLoneNode;\n\n onValidate?.(isFlowComplete);\n\n setIsValidating(false);\n }, [getNodes, getEdges, onValidate]);\n\n return [isValidating, validate];\n}\n","/**\n * Shared workflow save hook.\n *\n * Extracts the save-to-backend logic used by both SaveFlowButton and WorkflowToolbar\n * into a single source of truth. After a successful save, invokes the configured\n * `onWorkflowSaved` callback so host apps can sync metadata to their own backends.\n */\nimport { useState, useCallback } from \"react\";\nimport { useParams, useNavigate } from \"react-router-dom\";\nimport { useShallow } from \"zustand/shallow\";\nimport { toast } from \"sonner\";\nimport { useFlowStore } from \"../stores/flow-store\";\nimport { getFluidGridsClient } from \"../../graphql/client\";\nimport { getFluidGridsConfig, type WorkflowSavedResult } from \"../../config\";\nimport {\n CreateWorkflowDefinitionDocument,\n CreateWorkflowVersionDocument,\n UpdateWorkflowDefinitionDocument,\n type CreateWorkflowDefinitionMutation,\n type CreateWorkflowVersionMutation,\n type UpdateWorkflowDefinitionMutation,\n} from \"../../generated/operations\";\n\ninterface UseSaveWorkflowReturn {\n saveToBackend: () => Promise<void>;\n isSaving: boolean;\n}\n\nexport function useSaveWorkflow(): UseSaveWorkflowReturn {\n const [isSaving, setIsSaving] = useState(false);\n const params = useParams<{ id?: string; version?: string }>();\n const navigate = useNavigate();\n\n const [saveWorkflow, setWorkflow] = useFlowStore(\n useShallow((s) => [s.actions.saveWorkflow, s.actions.setWorkflow]),\n );\n\n const saveToBackend = useCallback(async () => {\n setIsSaving(true);\n try {\n const workflow = saveWorkflow();\n // Resolve workflow key: route param > store id > generate new\n const workflowKey = params?.id || workflow?.id;\n\n if (!workflowKey) {\n throw new Error(\n \"Workflow key not found. Navigate to /workflow/{key}/v1 to create a workflow.\",\n );\n }\n\n const isDraft = !workflow.status || workflow.status === \"DRAFT\";\n const client = getFluidGridsClient();\n\n // Prepare workflow data with nodes merged\n const preparedWorkflow = {\n ...workflow,\n nodes: workflow.nodes?.map((n) => {\n const { nodeData: _ignoredNodeData, ...flattenedData } = (n.data ??\n {}) as Record<string, unknown>;\n void _ignoredNodeData;\n return { ...n, ...flattenedData };\n }),\n };\n\n const definitionJson = {\n key: workflowKey,\n name: workflow?.name,\n description: workflow?.name || \"Workflow Description\",\n workflow_type: \"query-conditional\",\n data: {\n ...preparedWorkflow,\n version: workflow.version,\n alias: workflow?.alias || null,\n },\n meta: {\n creator: \"api_update\",\n version: workflow.version,\n },\n tags: [\n \"rag\",\n \"cache\",\n \"websearch\",\n \"conditional\",\n \"python_expr\",\n \"retry\",\n \"api_trigger\",\n ],\n };\n\n // Track saved state locally (not from store) to avoid stale reads\n let savedVersion = workflow.version;\n let savedDbId = workflow.dbId;\n let operation: WorkflowSavedResult[\"operation\"] = \"updated\";\n\n if (isDraft && workflow.dbId) {\n // ── DRAFT with existing record: update in-place ──────────────\n const { data } = await client.mutate<UpdateWorkflowDefinitionMutation>({\n mutation: UpdateWorkflowDefinitionDocument,\n variables: {\n id: workflow.dbId,\n input: {\n definitionJson,\n name: workflow?.name,\n description: workflow?.name || \"Workflow update\",\n alias: workflow?.alias || undefined,\n },\n },\n });\n\n if (data?.updateWorkflowDefinition) {\n savedVersion = data.updateWorkflowDefinition.version;\n savedDbId = data.updateWorkflowDefinition.id;\n operation = \"updated\";\n toast.success(\"Workflow saved\", {\n description: `Updated version ${savedVersion}`,\n dismissible: true,\n });\n } else {\n throw new Error(\"Failed to save workflow\");\n }\n } else if (isDraft && !workflow.dbId) {\n // ── DRAFT but no DB record (eager creation failed): create it now\n const { data } = await client.mutate<CreateWorkflowDefinitionMutation>({\n mutation: CreateWorkflowDefinitionDocument,\n variables: {\n input: {\n workflowKey,\n version: workflow.version || params?.version || \"v1\",\n name: workflow?.name || \"Untitled Workflow\",\n description: workflow?.name || \"Untitled Workflow\",\n definitionJson,\n },\n },\n });\n\n if (data?.createWorkflowDefinition) {\n savedVersion = data.createWorkflowDefinition.version;\n savedDbId = data.createWorkflowDefinition.id;\n operation = \"created\";\n\n // Populate the store so subsequent saves take the update-in-place path\n setWorkflow({\n dbId: savedDbId,\n status: data.createWorkflowDefinition.status ?? \"DRAFT\",\n version: savedVersion,\n });\n\n toast.success(\"Workflow saved\", {\n description: `Created version ${savedVersion}`,\n dismissible: true,\n });\n } else {\n throw new Error(\"Failed to create workflow\");\n }\n } else {\n // ── ACTIVE/ARCHIVED: create a new DRAFT version ──────────────\n const { data } = await client.mutate<CreateWorkflowVersionMutation>({\n mutation: CreateWorkflowVersionDocument,\n variables: {\n workflowKey,\n input: {\n definitionJson,\n description: workflow?.name || \"Workflow update\",\n },\n },\n });\n\n if (data?.createWorkflowVersion?.success) {\n const newWorkflow = data.createWorkflowVersion.workflow;\n savedVersion = newWorkflow?.version ?? workflow.version;\n savedDbId = newWorkflow?.id ?? workflow.dbId;\n operation = \"versioned\";\n\n // Update the store with the new version info\n setWorkflow({\n version: savedVersion,\n dbId: savedDbId,\n status: \"DRAFT\",\n });\n\n // Navigate to the new version URL so the address bar stays in sync\n navigate(`../workflow/${workflowKey}/${savedVersion}`, {\n replace: true,\n });\n\n toast.success(\"New version created\", {\n description: `Saved as version ${savedVersion} (Draft)`,\n dismissible: true,\n });\n } else {\n throw new Error(\n data?.createWorkflowVersion?.message || \"Failed to save workflow\",\n );\n }\n }\n\n // ── Invoke onWorkflowSaved callback ──────────────────────────\n // Errors are isolated so a host-app bug never blocks the user's save.\n if (savedDbId) {\n const config = getFluidGridsConfig();\n if (config.onWorkflowSaved) {\n try {\n await config.onWorkflowSaved({\n dbId: savedDbId,\n workflowKey,\n version: savedVersion,\n name: workflow?.name || \"Untitled Workflow\",\n description: workflow?.alias || workflow?.name || undefined,\n operation,\n });\n } catch (callbackError) {\n console.warn(\n \"[useSaveWorkflow] onWorkflowSaved callback failed:\",\n callbackError,\n );\n }\n }\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"Error saving workflow:\", message);\n toast.error(\"Failed to save workflow\", {\n description: message,\n });\n } finally {\n setIsSaving(false);\n }\n }, [saveWorkflow, setWorkflow, params?.id, params?.version, navigate]);\n\n return { saveToBackend, isSaving };\n}\n","import { Button } from \"@burdenoff/fe-libs/ui\";\nimport { useFlowValidator } from \"../../../../hooks/use-flow-validator\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { useSaveWorkflow } from \"../../../../hooks/use-save-workflow\";\n\nexport const SaveFlowButton = () => {\n const { saveToBackend, isSaving } = useSaveWorkflow();\n\n const [isValidating, validateFlow] = useFlowValidator(async (isValid) => {\n if (isValid) {\n await saveToBackend();\n } else {\n toast.error(\"Flow is invalid\", {\n description:\n \"Please check if the flow is complete and has no lone nodes\",\n });\n }\n });\n\n return (\n <div>\n <Button\n onClick={validateFlow}\n disabled={isValidating || isSaving}\n variant={\"outline\"}\n size={\"sm\"}\n className=\"flex gap-4\"\n >\n <Icon icon=\"fluent:save-28-filled\" />\n {isSaving ? \"Saving...\" : \"Save Flow\"}\n </Button>\n </div>\n );\n};\n","import { useState, useCallback, useEffect } from \"react\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n} from \"../../../../../ui/dialog\";\nimport { Icon } from \"@iconify/react\";\n\ninterface TriggerDataDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onExecute: (triggerData: Record<string, unknown>) => void;\n isExecuting: boolean;\n}\n\nconst PLACEHOLDER_JSON = `{\n \"message\": \"Hello, what can you help me with?\",\n \"agentName\": \"faq_agent\"\n}`;\n\nexport function TriggerDataDialog({\n open,\n onOpenChange,\n onExecute,\n isExecuting,\n}: TriggerDataDialogProps) {\n const [jsonValue, setJsonValue] = useState(\"\");\n const [parseError, setParseError] = useState<string | null>(null);\n // Track whether we've submitted; close the dialog once isExecuting becomes true\n const [submitted, setSubmitted] = useState(false);\n\n // Reset state when the dialog closes; clear parseError when it reopens\n useEffect(() => {\n if (!open) {\n setJsonValue(\"\");\n setParseError(null);\n setSubmitted(false);\n } else {\n setParseError(null);\n }\n }, [open]);\n\n // Close the dialog once the parent has started executing (isExecuting flipped true)\n useEffect(() => {\n if (submitted && isExecuting) {\n onOpenChange(false);\n setSubmitted(false);\n }\n }, [submitted, isExecuting, onOpenChange]);\n\n const handleExecute = useCallback(() => {\n const valueToparse = jsonValue.trim() || \"{}\";\n try {\n const parsed = JSON.parse(valueToparse);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n setParseError(\n \"Trigger data must be a JSON object (not an array or primitive)\",\n );\n return;\n }\n setParseError(null);\n setSubmitted(true);\n onExecute(parsed);\n } catch {\n setParseError(\"Invalid JSON. Please check your syntax.\");\n }\n }, [jsonValue, onExecute]);\n\n const handleRunEmpty = useCallback(() => {\n setParseError(null);\n setSubmitted(true);\n onExecute({});\n }, [onExecute]);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Icon\n icon=\"mdi:play-circle-outline\"\n className=\"size-5 text-[var(--color-status-success-text)]\"\n />\n Execute Workflow\n </DialogTitle>\n <DialogDescription>\n Provide the trigger data (JSON) that will be passed to the first\n node in the workflow. This is the input your workflow will process.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-2\">\n <label\n htmlFor=\"trigger-data-json\"\n className=\"text-sm font-medium text-foreground\"\n >\n Trigger Data (JSON)\n </label>\n <textarea\n id=\"trigger-data-json\"\n value={jsonValue}\n onChange={(e) => {\n setJsonValue(e.target.value);\n setParseError(null);\n }}\n className=\"w-full h-48 rounded-md border border-input bg-background px-3 py-2 text-sm font-mono ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 resize-y\"\n placeholder={PLACEHOLDER_JSON}\n spellCheck={false}\n />\n {parseError && (\n <p className=\"text-sm text-[var(--color-status-error-text)]\">\n {parseError}\n </p>\n )}\n <p className=\"text-xs text-muted-foreground\">\n This data is available to nodes as trigger input. For example, a\n Botlit node expects{\" \"}\n <code className=\"bg-muted px-1 rounded\">message</code> and{\" \"}\n <code className=\"bg-muted px-1 rounded\">agentName</code>. A Web\n Scraper node expects{\" \"}\n <code className=\"bg-muted px-1 rounded\">url</code>.\n </p>\n </div>\n\n <DialogFooter className=\"gap-2 sm:gap-0\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRunEmpty}\n disabled={isExecuting}\n >\n Run Empty\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleExecute}\n disabled={isExecuting}\n className=\"bg-[var(--color-status-success-bg)] hover:bg-[var(--color-status-success-bg)]/90 text-[var(--color-text-on-status)]\"\n >\n <Icon icon=\"mdi:play\" className=\"size-4 mr-1\" />\n {isExecuting ? \"Running...\" : \"Execute\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { useFlowValidator } from \"../../../../hooks/use-flow-validator\";\nimport { useFlowStore } from \"../../../../stores/flow-store\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { useShallow } from \"zustand/shallow\";\nimport { useNodeExecution } from \"../../../../../hooks/useNodeExecution\";\nimport { TriggerDataDialog } from \"./trigger-data-dialog\";\n\nexport const ExecuteWorkflowButton = () => {\n const { executeFullWorkflow } = useNodeExecution();\n const [dialogOpen, setDialogOpen] = useState(false);\n\n const [isExecuting] = useFlowStore(\n useShallow((s) => [s.execution.isExecuting]),\n );\n\n const executeWorkflow = useCallback(\n async (triggerData: Record<string, unknown>) => {\n try {\n const result = await executeFullWorkflow(triggerData);\n\n if (result.success) {\n toast.success(\"Workflow execution started\", {\n description: `Run ID: ${result.runId}`,\n dismissible: true,\n });\n } else {\n throw new Error(result.error || \"Failed to trigger workflow\");\n }\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"[ExecuteWorkflowButton] Error:\", message);\n toast.error(\"Failed to execute workflow\", {\n description: message,\n });\n }\n },\n [executeFullWorkflow],\n );\n\n const [isValidating, validateFlow] = useFlowValidator(async (isValid) => {\n if (isValid) {\n setDialogOpen(true);\n } else {\n toast.error(\"Flow is invalid\", {\n description:\n \"Please fix the flow before executing. Ensure trigger node is connected.\",\n });\n }\n });\n\n return (\n <>\n <Button\n onClick={validateFlow}\n disabled={isValidating || isExecuting}\n variant=\"default\"\n size=\"sm\"\n className=\"flex gap-2 bg-[var(--color-status-success-bg)] hover:bg-[var(--color-status-success-bg)]/90 text-[var(--color-text-on-status)]\"\n >\n <Icon icon=\"mdi:play\" className=\"size-4\" />\n {isExecuting\n ? \"Running...\"\n : isValidating\n ? \"Validating...\"\n : \"Execute\"}\n </Button>\n\n <TriggerDataDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n onExecute={executeWorkflow}\n isExecuting={isExecuting}\n />\n </>\n );\n};\n","import { useState, useCallback, useRef, useEffect } from \"react\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { Icon } from \"@iconify/react\";\nimport { useFlowStore } from \"../../../../stores/flow-store\";\nimport type { ExecutionLog } from \"../../../../../types/execution\";\nimport { useShallow } from \"zustand/shallow\";\n\n// JSON Viewer Component\nconst JsonView = ({ data }: { data: Record<string, unknown> | null }) => {\n if (!data) return <div className=\"text-tertiary p-4\">No data</div>;\n\n return (\n <pre className=\"text-xs overflow-auto p-4 bg-card/50 rounded h-full\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n};\n\n// Table View Component\nconst TableView = ({ data }: { data: Record<string, unknown> | null }) => {\n if (!data) return <div className=\"text-tertiary p-4\">No data</div>;\n\n const entries = Object.entries(data);\n if (entries.length === 0)\n return <div className=\"text-tertiary p-4\">Empty object</div>;\n\n return (\n <div className=\"overflow-auto h-full\">\n <table className=\"w-full text-xs\">\n <thead className=\"bg-card-foreground/10 sticky top-0\">\n <tr>\n <th className=\"text-left p-2\">Field</th>\n <th className=\"text-left p-2\">Type</th>\n <th className=\"text-left p-2\">Value</th>\n </tr>\n </thead>\n <tbody>\n {entries.map(([key, value]) => (\n <tr key={key} className=\"border-b border-card-foreground/10\">\n <td className=\"p-2 font-medium text-accent\">{key}</td>\n <td className=\"p-2 text-secondary\">{typeof value}</td>\n <td className=\"p-2 truncate max-w-[200px]\">\n {typeof value === \"object\"\n ? JSON.stringify(value)\n : String(value)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n};\n\n// Log List Item\nconst LogListItem = ({\n log,\n isSelected,\n onClick,\n}: {\n log: ExecutionLog;\n isSelected: boolean;\n onClick: () => void;\n}) => {\n const statusIcon = {\n pending: \"mdi:clock-outline\",\n running: \"svg-spinners:ring-resize\",\n completed: \"mdi:check-circle\",\n failed: \"mdi:close-circle\",\n }[log.status];\n\n const statusColor = {\n pending: \"text-tertiary\",\n running: \"text-accent\",\n completed: \"text-[var(--color-status-success-text)]\",\n failed: \"text-[var(--color-status-error-text)]\",\n }[log.status];\n\n return (\n <button\n onClick={onClick}\n className={cn(\n \"w-full text-left p-2 flex items-center gap-2 text-xs transition-colors\",\n isSelected\n ? \"bg-primary/20 border-l-2 border-primary\"\n : \"hover:bg-card-foreground/10\",\n )}\n >\n <Icon icon={statusIcon} className={cn(\"size-4\", statusColor)} />\n <span className=\"truncate flex-1\">{log.nodeName}</span>\n {log.duration && (\n <span className=\"text-tertiary text-[10px]\">\n {log.duration.toFixed(2)}s\n </span>\n )}\n </button>\n );\n};\n\n// Log Detail View\nconst LogDetailView = ({ log }: { log: ExecutionLog | null }) => {\n const [activeTab, setActiveTab] = useState<\"input\" | \"output\">(\"output\");\n const [viewMode, setViewMode] = useState<\"json\" | \"table\">(\"json\");\n\n if (!log) {\n return (\n <div className=\"flex-1 flex items-center justify-center text-tertiary text-sm\">\n Select a step to view details\n </div>\n );\n }\n\n const statusColor = {\n pending: \"text-tertiary\",\n running: \"text-accent\",\n completed: \"text-[var(--color-status-success-text)]\",\n failed: \"text-[var(--color-status-error-text)]\",\n }[log.status];\n\n const data = activeTab === \"input\" ? log.inputArgs : log.output;\n const itemCount = data ? Object.keys(data).length : 0;\n\n return (\n <div className=\"flex-1 flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-2 border-b border-card-foreground/10\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{log.nodeName}</span>\n <span className={cn(\"text-xs capitalize\", statusColor)}>\n {log.status === \"completed\" ? \"Success\" : log.status}\n </span>\n {log.duration && (\n <span className=\"text-xs text-gray-500\">\n in {(log.duration * 1000).toFixed(0)}ms\n </span>\n )}\n </div>\n\n {/* View Toggle */}\n <div className=\"flex items-center gap-1\">\n <Button\n variant={viewMode === \"json\" ? \"secondary\" : \"ghost\"}\n size=\"icon\"\n className=\"size-6\"\n onClick={() => setViewMode(\"json\")}\n title=\"JSON View\"\n >\n <Icon icon=\"mdi:code-json\" className=\"size-3\" />\n </Button>\n <Button\n variant={viewMode === \"table\" ? \"secondary\" : \"ghost\"}\n size=\"icon\"\n className=\"size-6\"\n onClick={() => setViewMode(\"table\")}\n title=\"Table View\"\n >\n <Icon icon=\"mdi:table\" className=\"size-3\" />\n </Button>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"flex border-b border-card-foreground/10\">\n <button\n className={cn(\n \"px-4 py-2 text-xs font-medium transition-colors duration-200\",\n activeTab === \"input\"\n ? \"border-b-2 border-primary text-primary\"\n : \"text-secondary hover:text-primary\",\n )}\n onClick={() => setActiveTab(\"input\")}\n >\n Input\n </button>\n <button\n className={cn(\n \"px-4 py-2 text-xs font-medium transition-colors duration-200\",\n activeTab === \"output\"\n ? \"border-b-2 border-primary text-primary\"\n : \"text-secondary hover:text-primary\",\n )}\n onClick={() => setActiveTab(\"output\")}\n >\n Output\n </button>\n <div className=\"flex-1\" />\n <span className=\"px-4 py-2 text-xs text-tertiary\">\n {itemCount} item{itemCount !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto\">\n {log.error && activeTab === \"output\" ? (\n <div className=\"p-4 bg-[var(--color-status-error-bg-subtle)] text-[var(--color-status-error-text)] text-xs\">\n <div className=\"font-medium mb-1\">Error:</div>\n {log.error}\n </div>\n ) : viewMode === \"json\" ? (\n <JsonView data={data} />\n ) : (\n <TableView data={data} />\n )}\n </div>\n </div>\n );\n};\n\n// Main LogsPanel Component\nexport const LogsPanel = () => {\n const [\n logs,\n selectedLogId,\n panelExpanded,\n selectLog,\n togglePanel,\n clearLogs,\n ] = useFlowStore(\n useShallow((s) => [\n s.execution.logs,\n s.execution.selectedLogId,\n s.execution.panelExpanded,\n s.actions.execution.selectLog,\n s.actions.execution.togglePanel,\n s.actions.execution.clearLogs,\n ]),\n );\n\n const selectedLog = logs.find((l) => l.id === selectedLogId) || null;\n\n // Resizable panel state\n const [panelHeight, setPanelHeight] = useState(350);\n const isResizing = useRef(false);\n const startY = useRef(0);\n const startHeight = useRef(0);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n isResizing.current = true;\n startY.current = e.clientY;\n startHeight.current = panelHeight;\n document.body.style.cursor = \"ns-resize\";\n document.body.style.userSelect = \"none\";\n },\n [panelHeight],\n );\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing.current) return;\n\n const deltaY = startY.current - e.clientY;\n const newHeight = Math.max(\n 150,\n Math.min(600, startHeight.current + deltaY),\n );\n setPanelHeight(newHeight);\n };\n\n const handleMouseUp = () => {\n isResizing.current = false;\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, []);\n\n if (!panelExpanded && logs.length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n \"relative border-t border-card-foreground/10 bg-card/95 backdrop-blur-sm transition-[height] duration-150\",\n !panelExpanded && \"h-10\",\n )}\n style={{ height: panelExpanded ? panelHeight : 40 }}\n >\n {/* Resize Handle */}\n {panelExpanded && (\n <div\n className=\"absolute top-0 left-0 right-0 h-1.5 cursor-ns-resize bg-transparent hover:bg-primary/30 transition-colors z-10 group\"\n onMouseDown={handleMouseDown}\n >\n <div className=\"absolute top-0.5 left-1/2 -translate-x-1/2 w-8 h-0.5 rounded-full bg-card-foreground/20 group-hover:bg-primary/50 transition-colors\" />\n </div>\n )}\n\n {/* Header */}\n <div className=\"h-10 flex items-center justify-between px-3 border-b border-card-foreground/10\">\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6\"\n onClick={togglePanel}\n >\n <Icon\n icon={panelExpanded ? \"mdi:chevron-down\" : \"mdi:chevron-up\"}\n className=\"size-4\"\n />\n </Button>\n <span className=\"text-sm font-medium\">Logs</span>\n {logs.length > 0 && (\n <span className=\"text-xs text-tertiary\">({logs.length} steps)</span>\n )}\n </div>\n\n {logs.length > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 text-xs\"\n onClick={clearLogs}\n >\n <Icon icon=\"mdi:trash-can-outline\" className=\"size-3 mr-1\" />\n Clear execution\n </Button>\n )}\n </div>\n\n {/* Content */}\n {panelExpanded && (\n <div className=\"flex h-[calc(100%-40px)]\">\n {/* Log List (Left) */}\n <div className=\"w-[200px] border-r border-card-foreground/10 overflow-y-auto\">\n {logs.length === 0 ? (\n <div className=\"p-4 text-xs text-tertiary text-center\">\n No execution logs yet\n </div>\n ) : (\n logs.map((log) => (\n <LogListItem\n key={log.id}\n log={log}\n isSelected={log.id === selectedLogId}\n onClick={() => selectLog(log.id)}\n />\n ))\n )}\n </div>\n\n {/* Log Detail (Right) */}\n <LogDetailView log={selectedLog} />\n </div>\n )}\n </div>\n );\n};\n\nexport default LogsPanel;\n","/**\n * ChatPanel — Embedded chat interface for testing AI Agent workflows.\n * Similar to n8n's chat trigger panel. Opens at the bottom of the workflow builder.\n *\n * When a workflow has a Chat Trigger or AI Agent node, users can send messages\n * and see AI responses inline — no external tools needed.\n *\n * Uses the Zustand flow store's execution.logs (populated by real-time WebSocket\n * subscriptions from useNodeExecution) to detect when the AI Agent completes,\n * avoiding the need for separate HTTP polling.\n */\nimport { useState, useRef, useEffect, useCallback } from \"react\";\nimport { useShallow } from \"zustand/shallow\";\nimport { Icon } from \"@iconify/react\";\nimport { useFlowStore } from \"../../../../stores/flow-store\";\nimport { useNodeExecution } from \"../../../../../hooks/useNodeExecution\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\n\ninterface ChatMessage {\n id: string;\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp: Date;\n runId?: string;\n status?: \"sending\" | \"complete\" | \"error\";\n duration?: string;\n}\n\nexport const ChatPanel = () => {\n const [messages, setMessages] = useState<ChatMessage[]>([\n {\n id: \"system-welcome\",\n role: \"system\",\n content: \"Send a message to test your AI workflow\",\n timestamp: new Date(),\n },\n ]);\n const [inputValue, setInputValue] = useState(\"\");\n const [isWaiting, setIsWaiting] = useState(false);\n const [panelHeight, setPanelHeight] = useState(350);\n const [isOpen, setIsOpen] = useState(false);\n const chatEndRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const isResizing = useRef(false);\n const startY = useRef(0);\n const startHeight = useRef(0);\n // Track which runId we're currently waiting for\n const pendingRunRef = useRef<{ runId: string; messageId: string } | null>(\n null,\n );\n\n const { executeFullWorkflow } = useNodeExecution();\n\n const [nodes, executionLogs, isExecutionRunning] = useFlowStore(\n useShallow((s) => [\n s.workflow.nodes,\n s.execution.logs,\n s.execution.isExecuting,\n ]),\n );\n\n // Detect if workflow has chat trigger or AI agent nodes\n const hasChatNodes = nodes?.some(\n (n) => n.type === \"store/chat-trigger\" || n.type === \"store/ai-agent\",\n );\n\n // Auto-scroll to bottom on new messages\n useEffect(() => {\n chatEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n // Watch execution logs for AI Agent completion (instead of HTTP polling).\n // The WebSocket subscription in useNodeExecution populates execution.logs in real time.\n useEffect(() => {\n if (!pendingRunRef.current || !isWaiting) return;\n\n const { runId, messageId } = pendingRunRef.current;\n\n // Find logs for this run\n const runLogs = executionLogs.filter((log) => log.runId === runId);\n if (runLogs.length === 0) return;\n\n // Check if the AI Agent node completed or failed\n const agentLog = runLogs.find(\n (log) =>\n log.nodeType === \"store/ai-agent\" &&\n (log.status === \"completed\" || log.status === \"failed\"),\n );\n\n if (agentLog) {\n if (agentLog.status === \"completed\" && agentLog.output) {\n const output =\n typeof agentLog.output === \"string\"\n ? JSON.parse(agentLog.output)\n : agentLog.output;\n\n const response =\n output?.conversationalAgent?.response ||\n output?.response ||\n JSON.stringify(output);\n\n const duration = agentLog.duration\n ? `${Number(agentLog.duration).toFixed(1)}s`\n : undefined;\n\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? { ...m, content: response, status: \"complete\", duration }\n : m,\n ),\n );\n } else {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? {\n ...m,\n content: `Error: ${agentLog.error || \"AI Agent execution failed\"}`,\n status: \"error\",\n }\n : m,\n ),\n );\n }\n pendingRunRef.current = null;\n setIsWaiting(false);\n return;\n }\n\n // Check if any node failed (may arrive before agent log or without agent)\n const failedLog = runLogs.find((l) => l.status === \"failed\");\n if (failedLog) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? {\n ...m,\n content: `Error: ${failedLog.error || \"Workflow execution failed\"}`,\n status: \"error\",\n }\n : m,\n ),\n );\n pendingRunRef.current = null;\n setIsWaiting(false);\n return;\n }\n\n // Also check if the entire execution is done (no AI agent found — maybe no agent node)\n if (!isExecutionRunning && runLogs.some((l) => l.status === \"completed\")) {\n // All completed but no AI agent — find the last completed node's output\n const lastCompleted = runLogs\n .filter((l) => l.status === \"completed\")\n .pop();\n const output = lastCompleted?.output\n ? typeof lastCompleted.output === \"string\"\n ? lastCompleted.output\n : JSON.stringify(lastCompleted.output, null, 2)\n : \"Workflow completed with no output\";\n\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? { ...m, content: output, status: \"complete\" }\n : m,\n ),\n );\n pendingRunRef.current = null;\n setIsWaiting(false);\n }\n }, [executionLogs, isExecutionRunning, isWaiting]);\n\n // Safety timeout — if 90 seconds pass without a response, mark as timed out\n useEffect(() => {\n if (!isWaiting || !pendingRunRef.current) return;\n\n const timeout = setTimeout(() => {\n if (pendingRunRef.current) {\n const { messageId } = pendingRunRef.current;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? {\n ...m,\n content: \"Timed out waiting for response\",\n status: \"error\",\n }\n : m,\n ),\n );\n pendingRunRef.current = null;\n setIsWaiting(false);\n }\n }, 90_000);\n\n return () => clearTimeout(timeout);\n }, [isWaiting]);\n\n // Resize handlers\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n isResizing.current = true;\n startY.current = e.clientY;\n startHeight.current = panelHeight;\n document.body.style.cursor = \"ns-resize\";\n document.body.style.userSelect = \"none\";\n },\n [panelHeight],\n );\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing.current) return;\n const deltaY = startY.current - e.clientY;\n const newHeight = Math.max(\n 200,\n Math.min(600, startHeight.current + deltaY),\n );\n setPanelHeight(newHeight);\n };\n const handleMouseUp = () => {\n isResizing.current = false;\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, []);\n\n const handleSend = useCallback(async () => {\n const message = inputValue.trim();\n if (!message || isWaiting) return;\n\n setInputValue(\"\");\n setIsWaiting(true);\n\n // Add user message\n const userMsgId = `user-${Date.now()}`;\n setMessages((prev) => [\n ...prev,\n {\n id: userMsgId,\n role: \"user\",\n content: message,\n timestamp: new Date(),\n },\n ]);\n\n // Add placeholder assistant message\n const assistantMsgId = `assistant-${Date.now()}`;\n setMessages((prev) => [\n ...prev,\n {\n id: assistantMsgId,\n role: \"assistant\",\n content: \"\",\n timestamp: new Date(),\n status: \"sending\",\n },\n ]);\n\n try {\n const result = await executeFullWorkflow({ message });\n\n if (result.success && result.runId) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMsgId ? { ...m, runId: result.runId } : m,\n ),\n );\n // Track this run — the useEffect watching executionLogs will pick up the result\n pendingRunRef.current = {\n runId: result.runId!,\n messageId: assistantMsgId,\n };\n } else {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMsgId\n ? {\n ...m,\n content: `Error: ${result.error || \"Failed to trigger workflow\"}`,\n status: \"error\",\n }\n : m,\n ),\n );\n setIsWaiting(false);\n }\n } catch (err) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMsgId\n ? {\n ...m,\n content: `Error: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n status: \"error\",\n }\n : m,\n ),\n );\n setIsWaiting(false);\n }\n }, [inputValue, isWaiting, executeFullWorkflow]);\n\n // Don't render if no chat-compatible nodes\n if (!hasChatNodes) return null;\n\n // Collapsed bar\n if (!isOpen) {\n return (\n <div className=\"border-t border-card-foreground/10 bg-card/95 backdrop-blur-sm h-10 flex items-center px-3 gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs gap-1.5\"\n onClick={() => setIsOpen(true)}\n >\n <Icon icon=\"mdi:chat-processing\" className=\"size-4 text-primary\" />\n Chat\n </Button>\n <span className=\"text-xs text-tertiary\">\n Test your AI workflow with messages\n </span>\n </div>\n );\n }\n\n return (\n <div\n className=\"relative border-t border-card-foreground/10 bg-card/95 backdrop-blur-sm flex flex-col\"\n style={{ height: panelHeight }}\n >\n {/* Resize Handle */}\n <div\n className=\"absolute top-0 left-0 right-0 h-1.5 cursor-ns-resize bg-transparent hover:bg-primary/30 transition-colors z-10 group\"\n onMouseDown={handleMouseDown}\n >\n <div className=\"absolute top-0.5 left-1/2 -translate-x-1/2 w-8 h-0.5 rounded-full bg-card-foreground/20 group-hover:bg-primary/50 transition-colors\" />\n </div>\n\n {/* Header */}\n <div className=\"h-10 flex items-center justify-between px-3 border-b border-card-foreground/10 shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6\"\n onClick={() => setIsOpen(false)}\n >\n <Icon icon=\"mdi:chevron-down\" className=\"size-4\" />\n </Button>\n <Icon icon=\"mdi:chat-processing\" className=\"size-4 text-primary\" />\n <span className=\"text-sm font-medium\">Chat</span>\n {messages.filter((m) => m.role === \"user\").length > 0 && (\n <span className=\"text-xs text-tertiary\">\n ({messages.filter((m) => m.role === \"user\").length} messages)\n </span>\n )}\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 text-xs\"\n onClick={() => {\n setMessages([\n {\n id: \"system-welcome\",\n role: \"system\",\n content: \"Send a message to test your AI workflow\",\n timestamp: new Date(),\n },\n ]);\n }}\n >\n <Icon icon=\"mdi:trash-can-outline\" className=\"size-3 mr-1\" />\n Clear chat\n </Button>\n </div>\n\n {/* Messages */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3 space-y-3\">\n {messages.map((msg) => (\n <div\n key={msg.id}\n className={cn(\n \"flex\",\n msg.role === \"user\" && \"justify-end\",\n msg.role === \"system\" && \"justify-center\",\n msg.role === \"assistant\" && \"justify-start\",\n )}\n >\n {msg.role === \"system\" ? (\n <span className=\"text-xs text-tertiary italic\">\n {msg.content}\n </span>\n ) : (\n <div\n className={cn(\n \"max-w-[75%] rounded-2xl px-4 py-2.5 text-sm leading-relaxed\",\n msg.role === \"user\" &&\n \"bg-primary text-primary-foreground rounded-br-md\",\n msg.role === \"assistant\" &&\n \"bg-card-foreground/5 border border-card-foreground/10 rounded-bl-md\",\n msg.status === \"error\" &&\n \"bg-destructive/10 border-destructive/30 text-destructive\",\n )}\n >\n {msg.status === \"sending\" && !msg.content ? (\n <div className=\"flex items-center gap-1.5 py-1\">\n <div className=\"size-1.5 rounded-full bg-card-foreground/40 animate-bounce [animation-delay:0ms]\" />\n <div className=\"size-1.5 rounded-full bg-card-foreground/40 animate-bounce [animation-delay:150ms]\" />\n <div className=\"size-1.5 rounded-full bg-card-foreground/40 animate-bounce [animation-delay:300ms]\" />\n </div>\n ) : (\n <span className=\"whitespace-pre-wrap\">{msg.content}</span>\n )}\n {msg.runId && (\n <div className=\"text-[10px] mt-1 opacity-50\">\n Run: {msg.runId.slice(0, 8)}...\n </div>\n )}\n </div>\n )}\n </div>\n ))}\n <div ref={chatEndRef} />\n </div>\n\n {/* Input */}\n <div className=\"shrink-0 border-t border-card-foreground/10 px-3 py-2 flex gap-2\">\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n }}\n placeholder=\"Type a message...\"\n disabled={isWaiting}\n className={cn(\n \"flex-1 px-3 py-2 rounded-lg border border-card-foreground/15 bg-card text-sm\",\n \"focus:outline-none focus:ring-1 focus:ring-primary/50 focus:border-primary/50\",\n \"placeholder:text-card-foreground/30\",\n \"disabled:opacity-50\",\n )}\n />\n <Button\n size=\"sm\"\n onClick={handleSend}\n disabled={isWaiting || !inputValue.trim()}\n className=\"px-4\"\n >\n {isWaiting ? (\n <Icon icon=\"mdi:loading\" className=\"size-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:send\" className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n );\n};\n\nexport default ChatPanel;\n","/**\n * VersionHistoryPanel — Displays all versions of the current workflow\n * with status badges and a \"Restore\" button per version for rollback.\n */\nimport { useState } from \"react\";\nimport { useParams, useNavigate } from \"react-router-dom\";\nimport { toast } from \"sonner\";\nimport { History, RotateCcw, Loader2 } from \"lucide-react\";\nimport {\n Button,\n Badge,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from \"@burdenoff/fe-libs/ui\";\nimport {\n useWorkflowVersions,\n useRestoreWorkflowVersion,\n} from \"../../../../../hooks/useWorkflows\";\n\nconst STATUS_STYLES: Record<\n string,\n {\n label: string;\n variant: \"default\" | \"secondary\" | \"outline\" | \"destructive\";\n }\n> = {\n DRAFT: { label: \"Draft\", variant: \"secondary\" },\n ACTIVE: { label: \"Active\", variant: \"default\" },\n ARCHIVED: { label: \"Archived\", variant: \"outline\" },\n DEPRECATED: { label: \"Deprecated\", variant: \"destructive\" },\n};\n\nexport function VersionHistoryPanel() {\n const params = useParams<{ id?: string; version?: string }>();\n const navigate = useNavigate();\n const workflowKey = params?.id ?? \"\";\n const currentVersion = params?.version ?? \"\";\n\n const { versions, loading, refetch } = useWorkflowVersions(workflowKey);\n const { restoreVersion, loading: restoring } = useRestoreWorkflowVersion();\n const [restoringVersion, setRestoringVersion] = useState<string | null>(null);\n\n const handleRestore = async (version: string) => {\n setRestoringVersion(version);\n try {\n const result = await restoreVersion(workflowKey, version);\n if (result?.success && result.workflow) {\n toast.success(\"Version restored\", {\n description: `Created ${result.workflow.version} from ${version}`,\n dismissible: true,\n });\n // Navigate to the new version\n navigate(\n `../workflow/${result.workflow.workflowKey}/${result.workflow.version}`,\n );\n } else {\n throw new Error(result?.message || \"Failed to restore version\");\n }\n } catch (error) {\n toast.error(\"Failed to restore version\", {\n description: error instanceof Error ? error.message : \"Unknown error\",\n });\n } finally {\n setRestoringVersion(null);\n }\n };\n\n const handleSwitchVersion = (version: string) => {\n navigate(`../workflow/${workflowKey}/${version}`);\n };\n\n return (\n <Sheet>\n <SheetTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex gap-1\"\n onClick={() => refetch()}\n >\n <History className=\"size-4\" />\n Versions\n </Button>\n </SheetTrigger>\n <SheetContent side=\"right\" className=\"w-[380px] sm:w-[420px]\">\n <SheetHeader>\n <SheetTitle className=\"flex items-center gap-2\">\n <History className=\"size-5\" />\n Version History\n </SheetTitle>\n </SheetHeader>\n\n <div className=\"mt-4 space-y-2 overflow-y-auto max-h-[calc(100vh-120px)]\">\n {loading ? (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 className=\"size-5 animate-spin text-muted-foreground\" />\n <span className=\"ml-2 text-muted-foreground text-sm\">\n Loading versions...\n </span>\n </div>\n ) : versions.length === 0 ? (\n <p className=\"text-muted-foreground text-sm text-center py-8\">\n No versions found.\n </p>\n ) : (\n versions.map((v) => {\n const isCurrent = v.version === currentVersion;\n const statusInfo =\n STATUS_STYLES[v.status ?? \"DRAFT\"] ?? STATUS_STYLES.DRAFT;\n\n return (\n <div\n key={v.id}\n className={`p-3 rounded-lg border transition-colors ${\n isCurrent\n ? \"border-primary/50 bg-primary/5\"\n : \"border-border hover:bg-accent/50\"\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-sm font-medium\">\n {v.version}\n </span>\n <Badge\n variant={statusInfo.variant}\n className=\"text-[10px] px-1.5 py-0 h-5\"\n >\n {statusInfo.label}\n </Badge>\n {isCurrent && (\n <Badge\n variant=\"outline\"\n className=\"text-[10px] px-1.5 py-0 h-5 border-primary text-primary\"\n >\n Current\n </Badge>\n )}\n </div>\n </div>\n\n {v.alias && (\n <p className=\"text-xs text-muted-foreground mt-1\">\n Alias: {v.alias}\n </p>\n )}\n\n <p className=\"text-xs text-muted-foreground mt-1\">\n {v.updatedAt\n ? new Intl.DateTimeFormat(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(new Date(v.updatedAt))\n : \"N/A\"}\n </p>\n\n {!isCurrent && (\n <div className=\"flex gap-2 mt-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => handleSwitchVersion(v.version)}\n >\n View\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n disabled={restoring}\n onClick={() => handleRestore(v.version)}\n >\n {restoringVersion === v.version ? (\n <Loader2 className=\"size-3 animate-spin mr-1\" />\n ) : (\n <RotateCcw className=\"size-3 mr-1\" />\n )}\n Restore\n </Button>\n </div>\n )}\n </div>\n );\n })\n )}\n </div>\n </SheetContent>\n </Sheet>\n );\n}\n","/**\n * ActivateWorkflowButton — Toggles workflow status between DRAFT and ACTIVE.\n *\n * - DRAFT → \"Activate\" (green button) — sets status to ACTIVE\n * - ACTIVE → \"Deactivate\" (outline button) — sets status back to DRAFT\n *\n * After activation, saving the workflow will create a new DRAFT version\n * instead of updating in-place, preserving the active version.\n */\nimport { useState } from \"react\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { useFlowStore } from \"../../../../stores/flow-store\";\nimport { useShallow } from \"zustand/shallow\";\nimport {\n useActivateWorkflow,\n useDeactivateWorkflow,\n} from \"../../../../../hooks/useWorkflows\";\n\nexport const ActivateWorkflowButton = () => {\n const [isProcessing, setIsProcessing] = useState(false);\n const [dbId, status, setWorkflow] = useFlowStore(\n useShallow((s) => [\n s.workflow.dbId,\n s.workflow.status,\n s.actions.setWorkflow,\n ]),\n );\n\n const { activateWorkflow } = useActivateWorkflow();\n const { deactivateWorkflow } = useDeactivateWorkflow();\n\n const isDraft = !status || status === \"DRAFT\";\n\n const handleToggle = async () => {\n if (!dbId) {\n toast.error(\"Please save the workflow first before activating.\");\n return;\n }\n\n setIsProcessing(true);\n try {\n if (isDraft) {\n const result = await activateWorkflow(dbId);\n if (result) {\n setWorkflow({ status: result.status });\n toast.success(\"Workflow activated\", {\n description: `Version ${result.version} is now ACTIVE. Future saves will create a new draft version.`,\n dismissible: true,\n });\n }\n } else {\n const result = await deactivateWorkflow(dbId);\n if (result) {\n setWorkflow({ status: result.status });\n toast.success(\"Workflow deactivated\", {\n description: `Version ${result.version} is now a DRAFT. Saves will update in-place.`,\n dismissible: true,\n });\n }\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n toast.error(isDraft ? \"Failed to activate\" : \"Failed to deactivate\", {\n description: message,\n });\n } finally {\n setIsProcessing(false);\n }\n };\n\n return (\n <Button\n onClick={handleToggle}\n disabled={isProcessing || !dbId}\n variant={isDraft ? \"default\" : \"outline\"}\n size=\"sm\"\n className={`flex gap-1 ${isDraft ? \"bg-green-600 hover:bg-green-700 text-white\" : \"\"}`}\n >\n <Icon\n icon={isDraft ? \"mynaui:check-circle\" : \"mynaui:pause-circle\"}\n className=\"size-4\"\n />\n {isProcessing ? \"Processing...\" : isDraft ? \"Activate\" : \"Deactivate\"}\n </Button>\n );\n};\n","import {\n Background,\n type EdgeTypes,\n MarkerType,\n type NodeChange,\n type NodeTypes,\n ReactFlow,\n useReactFlow,\n} from \"@xyflow/react\";\nimport { useCallback, useEffect, useState, useRef, useMemo } from \"react\";\nimport { useDeleteKeyCode } from \"../../hooks/use-delete-key-code\";\nimport { useOnNodesDelete } from \"../../hooks/use-on-nodes-delete\";\nimport { useNodeAutoAdjust } from \"../../hooks/use-node-auto-adjust\";\nimport CustomDeletableEdge from \"./components/edges/custom-deletable-edge\";\nimport { useAddNodeOnEdgeDrop } from \"../../hooks/use-add-node-on-edge-drop\";\nimport { useDragDropFlowBuilder } from \"../../hooks/use-drag-drop-flow-builder\";\nimport { useIsValidConnection } from \"../../hooks/use-is-valid-connection\";\nimport { CanvasControls } from \"./components/controls/canvas-controls\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport AddNodeFloatingMenu from \"./components/add-node-floating-menu/add-node-floating-menu\";\nimport { useFlowStore } from \"../../stores/flow-store\";\nimport { useShallow } from \"zustand/shallow\";\nimport {\n NODE_TYPES,\n NODE_CONFIGS,\n onNodeTypesUpdate,\n} from \"./components/blocks\";\nimport {\n getNodeMetadata,\n type NodeOperation,\n} from \"./components/blocks/nodes/node/node\";\nimport { Card, Button, Input } from \"@burdenoff/fe-libs/ui\";\nimport { SaveFlowButton } from \"./components/ui/save-flow-button\";\nimport { ExecuteWorkflowButton } from \"./components/ui/execute-workflow-button\";\nimport { Icon } from \"@iconify/react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { useParams } from \"react-router-dom\";\nimport { LogsPanel } from \"./components/logs-panel\";\nimport { ChatPanel } from \"./components/chat-panel\";\nimport { VersionHistoryPanel } from \"./components/ui/version-history-panel\";\nimport { ActivateWorkflowButton } from \"./components/ui/activate-workflow-button\";\n\nconst edgeTypes: EdgeTypes = {\n deletable: CustomDeletableEdge,\n};\nconst edgeOptions = {\n type: \"smoothstep\",\n markerEnd: {\n type: MarkerType.ArrowClosed,\n width: 21,\n height: 21,\n },\n style: {\n stroke: \"var(--color-text-tertiary)\", // Theme-aware edge color\n strokeWidth: 1.5,\n },\n};\nexport const FlowBuilder = () => {\n const searchParams = new URLSearchParams(window.location.search);\n const isReadOnly = searchParams.get(\"readonly\") === \"true\";\n const setWorkflow = useFlowStore((s) => s.actions.setWorkflow);\n const navigate = useNavigate();\n const { id } = useParams();\n // const router = useRouter();\n const [name, nodes, edges, alias, onNodesChange, onEdgesChange, onConnect] =\n useFlowStore(\n useShallow((s) => {\n return [\n s.workflow.name,\n s.workflow.nodes,\n s.workflow.edges,\n s.workflow.alias,\n s.actions.nodes.onNodesChange,\n s.actions.edges.onEdgesChange,\n s.actions.edges.onConnect,\n ];\n }),\n );\n\n // Track NODE_TYPES version to force re-render when dynamic nodes are loaded\n const [nodeTypesVersion, setNodeTypesVersion] = useState(0);\n useEffect(() => {\n return onNodeTypesUpdate(() => setNodeTypesVersion((v) => v + 1));\n }, []);\n\n // Create a new nodeTypes reference when NODE_TYPES is updated.\n // Also creates fallback components for any workflow node types not yet in NODE_TYPES.\n // This prevents the React Flow \"Node type not found\" race condition where the workflow\n // data loads before dynamic node configs are fetched.\n const nodeTypes = useMemo(() => {\n const merged = { ...NODE_TYPES } as NodeTypes;\n\n // Find workflow node types that are missing from NODE_TYPES and create fallback components\n for (const node of nodes) {\n if (node.type && !merged[node.type]) {\n // Create a generic NodeComponent for this type using the same factory as dynamic nodes\n const fallback = getNodeMetadata({\n type: node.type,\n defaultData: {\n version: (node.data as Record<string, unknown>)?.version as\n | string\n | undefined,\n nodeData: (node.data as Record<string, unknown>)?.nodeData as\n | Record<string, unknown>\n | undefined,\n },\n operations: (node.data as Record<string, unknown>)?.operations as\n | NodeOperation[]\n | undefined,\n });\n if (fallback?.node) {\n merged[node.type] = fallback.node;\n }\n }\n }\n\n return merged;\n }, [nodeTypesVersion, nodes]); // deps intentionally limited\n\n const [workflowName, setWorkflowName] = useState(name);\n const [workflowAlias, setWorkflowAlias] = useState(alias || \"\");\n\n useEffect(() => {\n setWorkflowName(name);\n }, [name]);\n\n useEffect(() => {\n setWorkflowAlias(alias || \"\");\n }, [alias]);\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newName = e.target.value;\n setWorkflowName(newName);\n setWorkflow({ name: newName, id: id, alias: workflowAlias });\n };\n\n const handleAliasChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newAlias = e.target.value;\n setWorkflowAlias(newAlias);\n setWorkflow({ name: workflowName, id: id, alias: newAlias });\n };\n\n const { getNodes } = useReactFlow();\n\n const {\n handleOnEdgeDropConnectEnd,\n floatingMenuWrapperRef,\n handleAddConnectedNode,\n } = useAddNodeOnEdgeDrop();\n\n const deleteKeyCode = useDeleteKeyCode();\n const onNodesDelete = useOnNodesDelete(nodes);\n\n const [onDragOver, onDrop] = useDragDropFlowBuilder();\n const isValidConnection = useIsValidConnection(nodes, edges);\n\n const autoAdjustNode = useNodeAutoAdjust();\n\n // Use a ref to enable recursive callback\n const handleAutoAdjustNodeAfterNodeMeasuredRef = useRef<(id: string) => void>(\n () => {},\n );\n\n const handleAutoAdjustNodeAfterNodeMeasured = useCallback(\n (id: string) => {\n setTimeout(() => {\n const node = getNodes().find((n) => n.id === id);\n if (!node) {\n return;\n }\n\n if (node.measured === undefined) {\n handleAutoAdjustNodeAfterNodeMeasuredRef.current(id);\n return;\n }\n\n autoAdjustNode(node);\n });\n },\n [autoAdjustNode, getNodes],\n );\n\n // Keep ref updated with latest callback - must be in useEffect to avoid accessing refs during render\n useEffect(() => {\n handleAutoAdjustNodeAfterNodeMeasuredRef.current =\n handleAutoAdjustNodeAfterNodeMeasured;\n }, [handleAutoAdjustNodeAfterNodeMeasured]);\n\n const handleNodesChange = useCallback(\n (changes: NodeChange[]) => {\n changes.forEach((change) => {\n if (change.type === \"dimensions\") {\n const node = getNodes().find((n) => n.id === change.id);\n if (node) {\n autoAdjustNode(node);\n }\n }\n\n if (change.type === \"add\") {\n handleAutoAdjustNodeAfterNodeMeasured(change.item.id);\n }\n });\n onNodesChange(changes);\n },\n [\n autoAdjustNode,\n getNodes,\n handleAutoAdjustNodeAfterNodeMeasured,\n onNodesChange,\n ],\n );\n\n return (\n <div className=\"flex flex-col h-full w-full overflow-hidden\">\n {!isReadOnly && (\n <Card className=\"h-14 shrink-0 border-0 from-primary/40 p-2 to-transparent rounded-none bg-gradient-to-r w-full items-center flex justify-between border-b border-card-foreground/10\">\n <div className=\"inline-flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"text-primary-foreground font-bold\"\n onClick={() => {\n navigate(\"../list\");\n }}\n >\n <Icon\n icon=\"ion:arrow-back-outline\"\n className=\"size-6 text-card-foreground\"\n />\n </Button>\n {/* <input className=\"text-card-foreground font-bold\">{name}</input> */}\n <Input\n className=\"text-card-foreground font-bold\"\n type=\"email\"\n placeholder=\"Workflow Name\"\n value={workflowName || name}\n onChange={handleNameChange}\n />\n <Input\n className=\"text-card-foreground font-bold ml-2\"\n type=\"text\"\n placeholder=\"Version Alias (optional)\"\n value={workflowAlias}\n onChange={handleAliasChange}\n />\n </div>\n\n {name !== \"\" && (\n <div className=\"inline-flex items-center gap-2\">\n <VersionHistoryPanel />\n <Button\n onClick={() => {\n navigate(`../runs/${id}`);\n }}\n variant={\"outline\"}\n size={\"sm\"}\n className=\"flex gap-4\"\n >\n View Runs\n </Button>\n <SaveFlowButton />\n <ActivateWorkflowButton />\n <ExecuteWorkflowButton />\n </div>\n )}\n </Card>\n )}\n <div\n ref={(el) => {\n if (!el) return;\n const update = () =>\n el.style.setProperty(\n \"--canvas-left\",\n `${el.getBoundingClientRect().left}px`,\n );\n update();\n const ro = new ResizeObserver(update);\n ro.observe(document.documentElement);\n // Cleanup stored on element to avoid stale closures\n (el as HTMLDivElement & { _ro?: ResizeObserver })._ro?.disconnect();\n (el as HTMLDivElement & { _ro?: ResizeObserver })._ro = ro;\n }}\n className=\"relative w-full flex-1\"\n >\n <CanvasControls />\n <ReactFlow\n proOptions={{ hideAttribution: true }}\n onInit={({ fitView }) => fitView().then()}\n nodeTypes={nodeTypes}\n nodes={nodes}\n onNodesChange={handleNodesChange}\n edgeTypes={edgeTypes}\n edges={edges}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n onConnectEnd={handleOnEdgeDropConnectEnd}\n onDrop={onDrop}\n onDragOver={onDragOver}\n onNodeDragStop={(_, node) => {\n autoAdjustNode(node);\n }}\n onNodesDelete={onNodesDelete}\n isValidConnection={isValidConnection}\n multiSelectionKeyCode={null}\n deleteKeyCode={deleteKeyCode}\n snapGrid={[16, 16]}\n snapToGrid\n fitView\n defaultEdgeOptions={edgeOptions}\n >\n <Background gap={24} />\n </ReactFlow>\n {/* Empty state overlay when no nodes exist */}\n {nodes.length === 0 && !isReadOnly && (\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <div className=\"size-16 flex items-center justify-center rounded-full bg-primary/10 border-2 border-dashed border-primary/30\">\n <Icon\n icon=\"solar:play-bold\"\n className=\"size-7 text-primary/60\"\n />\n </div>\n <div className=\"text-lg font-medium text-foreground/70\">\n Add a trigger to start\n </div>\n <div className=\"text-sm text-foreground/40 max-w-xs\">\n Drag a trigger node from the sidebar to begin building your\n workflow\n </div>\n </div>\n </div>\n )}\n </div>\n <ChatPanel />\n <LogsPanel />\n <div\n className={cn(\n \"pointer-events-none absolute inset-0 backdrop-blur-3xl transition-all\",\n \"opacity-0 bg-zinc-800/0 backdrop-saturate-100 pointer-events-none\",\n )}\n >\n <div ref={floatingMenuWrapperRef} className=\"relative size-full\">\n <AddNodeFloatingMenu onNodeAdd={handleAddConnectedNode} />\n </div>\n </div>\n </div>\n );\n};\n","import { SidebarModule } from \"../../../components/flow-builder/components/blocks/sidebar/sidebar-module\";\nimport { FlowBuilder } from \"../../../components/flow-builder/flow-builder\";\nimport { useFlowStore, type IFlowState } from \"../../../stores/flow-store\";\nimport { ReactFlowProvider, useReactFlow } from \"@xyflow/react\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { produce } from \"immer\";\nimport {\n registerWorkflowNodeTypes,\n ensureNodeConfigsLoaded,\n} from \"../../../components/flow-builder/components/blocks\";\n\n/**\n * Handle return from the integrations page after OAuth authentication.\n * Reads `integrationConnectionId` and `channelNodeId` from URL params,\n * auto-fills the integration ID in the matching channel node's args.state,\n * and cleans up the URL.\n */\nfunction IntegrationReturnHandler() {\n const { setNodes, getNodes } = useReactFlow();\n const zustandSetNodes = useFlowStore((s) => s.actions.nodes.setNodes);\n const hasProcessed = useRef(false);\n\n useEffect(() => {\n if (hasProcessed.current) return;\n\n const params = new URLSearchParams(window.location.search);\n const integrationConnectionId = params.get(\"integrationConnectionId\");\n const channelNodeId = params.get(\"channelNodeId\");\n\n if (!integrationConnectionId || !channelNodeId) return;\n\n // Find the channel node and update its integrationId.\n // Do NOT mark hasProcessed until the target node is found — if nodes haven't\n // hydrated yet (empty ReactFlow state on first render), the effect will retry\n // on subsequent renders until the node is available.\n const nodes = getNodes();\n const targetNode = nodes.find((n) => n.id === channelNodeId);\n if (!targetNode) return; // nodes not hydrated yet — retry on next render\n\n hasProcessed.current = true;\n\n const updatedNodes = produce(nodes, (draft) => {\n const node = draft.find((n) => n.id === channelNodeId);\n if (node && node.data) {\n const data = node.data as Record<string, unknown>;\n const args = (data.args ?? {}) as Record<string, unknown>;\n const state = (args.state ?? {}) as Record<string, unknown>;\n state.integrationId = integrationConnectionId;\n args.state = state;\n data.args = args;\n }\n });\n\n setNodes(updatedNodes);\n zustandSetNodes(updatedNodes);\n\n // Clean up URL params so they don't get re-processed\n params.delete(\"integrationConnectionId\");\n params.delete(\"channelNodeId\");\n const cleanUrl = params.toString()\n ? `${window.location.pathname}?${params.toString()}`\n : window.location.pathname;\n window.history.replaceState(null, \"\", cleanUrl);\n }, [getNodes, setNodes, zustandSetNodes]);\n\n return null;\n}\n\nexport const FlowBuilderPage = ({\n workflow,\n}: {\n workflow: IFlowState[\"workflow\"];\n}) => {\n const setWorkflow = useFlowStore((s) => s.actions.setWorkflow);\n const searchParams = new URLSearchParams(window.location.search);\n const isReadOnly = searchParams.get(\"readonly\") === \"true\";\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n\n // Gate FlowBuilder rendering until the Zustand store is hydrated.\n // We use a ref (not state) to avoid a double-render. The ref is set\n // synchronously in useLayoutEffect, which runs BEFORE the browser paints.\n const [isStoreReady, setIsStoreReady] = useState(false);\n const hasHydrated = useRef(false);\n\n // useLayoutEffect runs synchronously AFTER DOM mutations but BEFORE paint.\n // This ensures the Zustand store is hydrated and NODE_TYPES are registered\n // before FlowBuilder mounts and React Flow processes nodes.\n useLayoutEffect(() => {\n if (hasHydrated.current) return;\n hasHydrated.current = true;\n\n // 1. Register fallback node type components for ALL workflow node types.\n if (workflow?.nodes) {\n registerWorkflowNodeTypes(workflow.nodes);\n }\n\n // 2. Reset and hydrate the Zustand store.\n resetWorkflow();\n if (workflow) {\n setWorkflow(workflow);\n }\n\n // 3. Allow FlowBuilder to mount.\n setIsStoreReady(true);\n }, [resetWorkflow, setWorkflow, workflow]);\n\n useEffect(() => {\n // Kick off dynamic node config loading in the background.\n // When it completes, the onNodeTypesUpdate subscriber in FlowBuilder\n // will trigger a re-render with the full node metadata (richer than fallbacks).\n ensureNodeConfigsLoaded().catch(() => {\n // Silently ignore — fallback components are already rendering\n });\n }, []);\n\n if (!isStoreReady) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-muted-foreground text-sm\">Loading workflow...</div>\n </div>\n );\n }\n\n return (\n <ReactFlowProvider>\n <IntegrationReturnHandler />\n <div className=\"flex flex-col h-full\">\n <div className=\"flex grow divide-x divide-card-foreground/10\">\n <div className=\"grow bg-card md:bg-transparent\">\n <FlowBuilder />\n </div>\n {/* <SidebarModule /> */}\n {!isReadOnly && <SidebarModule />}\n </div>\n </div>\n </ReactFlowProvider>\n );\n};\n","import { useParams } from \"react-router-dom\";\nimport { FlowBuilderPage } from \"../_components/flow-builder\";\nimport { useEffect, useState, useRef, useMemo } from \"react\";\nimport { useFlowStore, type IFlowState } from \"../../../stores/flow-store\";\nimport {\n useLazyWorkflowDefinition,\n useCreateWorkflow,\n} from \"../../../../hooks/useWorkflows\";\n\ninterface WorkflowDefinitionData {\n nodes: IFlowState[\"workflow\"][\"nodes\"];\n edges: IFlowState[\"workflow\"][\"edges\"];\n sidebar: IFlowState[\"workflow\"][\"sidebar\"];\n}\n\nexport default function WorkflowItem({\n readonly = false,\n}: {\n readonly?: boolean;\n}) {\n if (readonly) {\n const queryParams = new URLSearchParams(window.location.search);\n queryParams.set(\"readonly\", \"true\");\n const newUrl = `${window.location.pathname}?${queryParams.toString()}`;\n window.history.replaceState(null, \"\", newUrl);\n }\n const { id, version } = useParams();\n const [workflow, setWorkflow] = useState<IFlowState[\"workflow\"] | null>(null);\n const [isLoading, setIsLoading] = useState(true); // Local loading state\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n const { getWorkflow } = useLazyWorkflowDefinition();\n const { createWorkflow } = useCreateWorkflow();\n const creatingRef = useRef(false); // Prevent duplicate creation\n\n const newWorkflow = useMemo(\n () => ({\n id: id ?? \"\",\n workflowKey: id ?? \"\",\n version: version ?? \"\",\n name: \"Untitled Workflow\",\n edges: [] as IFlowState[\"workflow\"][\"edges\"],\n nodes: [] as IFlowState[\"workflow\"][\"nodes\"],\n sidebar: {\n active: \"available-nodes\" as const,\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n }),\n [id, version],\n );\n\n useEffect(() => {\n let mounted = true;\n const loadWorkflow = async () => {\n try {\n // Always reset the store first\n resetWorkflow();\n\n if (!version) {\n if (mounted) {\n setWorkflow(newWorkflow);\n setIsLoading(false);\n }\n return;\n }\n\n // Use GraphQL to fetch workflow by workflowKey + version\n const result = await getWorkflow(id, undefined, version);\n const definitionJson = result?.definitionJson as {\n data?: WorkflowDefinitionData;\n nodes?: unknown[];\n edges?: unknown[];\n } | null;\n\n // Support both { data: { nodes, edges } } and flat { nodes, edges } structures\n const defData =\n definitionJson?.data ??\n (definitionJson?.nodes\n ? (definitionJson as unknown as WorkflowDefinitionData)\n : undefined);\n\n if (mounted && defData) {\n // Map GraphQL response to workflow format - EXISTING workflow\n setWorkflow({\n ...defData,\n id: result?.workflowKey ?? \"\",\n workflowKey: result?.workflowKey ?? \"\",\n version: result?.version ?? \"\",\n name: result?.name ?? \"\",\n alias: result?.alias ?? \"\",\n dbId: result?.id ?? \"\",\n status: result?.status ?? \"DRAFT\",\n });\n } else if (mounted) {\n // Workflow not found - CREATE it in the database\n if (!creatingRef.current) {\n creatingRef.current = true;\n const initialDefinitionJson = {\n key: id,\n name: newWorkflow.name,\n description: newWorkflow.name,\n workflow_type: \"query-conditional\",\n data: {\n ...newWorkflow,\n },\n meta: {\n creator: \"api_create\",\n version: version,\n },\n tags: [],\n };\n\n try {\n const created = await createWorkflow({\n workflowKey: id!,\n version: version!,\n name: newWorkflow.name,\n description: newWorkflow.name,\n definitionJson: initialDefinitionJson,\n });\n\n if (created && mounted) {\n setWorkflow({\n ...newWorkflow,\n id: created.workflowKey,\n workflowKey: created.workflowKey,\n version: created.version,\n dbId: created.id,\n status: created.status ?? \"DRAFT\",\n });\n } else if (mounted) {\n // Fallback to template if creation fails\n console.warn(\n \"[debug] Workflow creation returned null, using template\",\n );\n setWorkflow(newWorkflow);\n }\n } catch (createError) {\n console.error(\"[debug] Error creating workflow:\", createError);\n if (mounted) {\n setWorkflow(newWorkflow);\n }\n }\n }\n }\n } catch (error) {\n console.error(\n \"[debug][workflowItem.useEffect] Error fetching workflow:\",\n error,\n );\n if (mounted) {\n setWorkflow(newWorkflow);\n }\n } finally {\n if (mounted) {\n setIsLoading(false);\n creatingRef.current = false;\n }\n }\n };\n\n loadWorkflow();\n return () => {\n mounted = false;\n };\n }, [id, version, createWorkflow, getWorkflow, newWorkflow, resetWorkflow]);\n\n if (isLoading) return <div>Loading...</div>;\n\n return workflow && !isLoading && <FlowBuilderPage workflow={workflow} />;\n}\n","import { ThemeProvider } from \"../builder/components/theme-provider\";\nimport WorkflowItem from \"../builder/app/workflow/work/page\";\nimport { ErrorBoundary } from \"@burdenoff/fe-libs/shared/components\";\nimport { useNavigate } from \"react-router-dom\";\nimport \"@xyflow/react/dist/style.css\";\n\n/**\n * WorkflowBuilder page with ErrorBoundary for graceful crash recovery.\n * If the builder throws (React Flow error, node rendering crash, etc.),\n * the user sees a recovery UI instead of a blank screen.\n */\nexport function WorkflowBuilder() {\n const navigate = useNavigate();\n\n return (\n <ErrorBoundary\n fallback={(error) => (\n <div className=\"flex flex-col items-center justify-center min-h-[60vh] gap-4 p-8\">\n <div className=\"rounded-lg border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bg-subtle)] p-6 max-w-lg w-full text-center\">\n <h2 className=\"text-lg font-semibold text-[var(--color-status-error-text)] mb-2\">\n Workflow Builder Error\n </h2>\n <p className=\"text-sm text-[var(--color-text-secondary)] mb-4\">\n Something went wrong while loading the workflow builder. This may\n be caused by invalid workflow data or a rendering issue.\n </p>\n {error && (\n <details className=\"text-left mb-4\">\n <summary className=\"text-xs text-[var(--color-text-tertiary)] cursor-pointer hover:text-[var(--color-text-secondary)]\">\n Error details\n </summary>\n <pre className=\"mt-2 p-2 bg-[var(--color-bg-canvas)] rounded text-xs overflow-auto max-h-32 text-[var(--color-text-tertiary)]\">\n {error.message}\n </pre>\n </details>\n )}\n <div className=\"flex gap-3 justify-center\">\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"px-4 py-2 text-sm font-medium rounded-md bg-[var(--color-bg-accent)] text-[var(--color-text-on-accent)] hover:opacity-90 transition-opacity\"\n >\n Reload Page\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(\"../list\")}\n className=\"px-4 py-2 text-sm font-medium rounded-md border border-default text-[var(--color-text-secondary)] hover:bg-[var(--color-bg-elevated)] transition-colors\"\n >\n Back to Workflows\n </button>\n </div>\n </div>\n </div>\n )}\n >\n <ThemeProvider>\n <WorkflowItem />\n </ThemeProvider>\n </ErrorBoundary>\n );\n}\n"]}