@burdenoff/fluidgrids-fe-sdk 2026.731.3 → 2026.731.4
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.
- package/dist/{WorkflowBuilder-65FSMSCD.js → WorkflowBuilder-734VD3ZO.js} +3 -3
- package/dist/{WorkflowBuilder-65FSMSCD.js.map → WorkflowBuilder-734VD3ZO.js.map} +1 -1
- package/dist/{chunk-UHUNDVWH.js → chunk-BWUUCBIC.js} +31 -5
- package/dist/chunk-BWUUCBIC.js.map +1 -0
- package/dist/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-UHUNDVWH.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../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-wrapper.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/components/sidebar-panel-heading.tsx","../src/builder/components/flow-builder/components/ui/header-with-icon.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/components/FluidGridsProvider.tsx","../src/hooks/store/useGlobalStoreClient.ts","../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/panels/store-browse/store-categories.ts","../src/hooks/store/useStoreNodes.ts","../src/hooks/store/useInstalledNodes.ts","../src/hooks/store/useRefreshAvailableNodes.ts","../src/hooks/store/useInstallNode.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/useTemplateDetail.ts","../src/hooks/store/useImportWorkflowTemplate.ts","../src/hooks/store/usePublishToStore.ts","../src/builder/components/flow-builder/components/store/store-node-availability.ts","../src/builder/components/flow-builder/components/blocks/sidebar/panels/store-browse/components/store-node-list-item.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/store-browse/components/store-category-list.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/store-browse/components/store-category-nodes.tsx","../src/builder/components/flow-builder/components/store/UninstallNodeDialog.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/store-browse/components/store-node-operations.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/store-browse/components/store-node-detail.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/store-browse/store-browse-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/ui/card.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/hooks/use-insert-sticky-note.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/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/lib/field-schema.ts","../src/builder/components/ndv/field-tree.tsx","../src/builder/components/ndv/condition-builder.tsx","../src/builder/components/ndv/code-editor-field.tsx","../src/builder/components/ndv/webhook-url-field.tsx","../src/hooks/useWebhookRegistration.ts","../src/builder/components/ndv/node-detail-view.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":["cn","jsx","jsxs","Button","Icon","useMemo","useContext","useEffect","useState","Input","gql","useCallback","Fragment","NodePropertyPanel","useReactFlow","produce","useQuery","useMutation","error","count","Trash2","React","Badge","Star","Download","Loader2","Dialog","DialogContent","DialogHeader","Sparkles","DialogTitle","DialogDescription","RefreshCw","lazy","InstallWorkflowNodeDocument","getFluidGridsConfig","toast","applyTemplateInputs","getFluidGridsClient","getGlobalStoreClient","NODE_CONFIGS","ensureNodeConfigsLoaded","BrowseWorkflowNodesDocument","Suspense","useShallow","a","b","x","y","React2","FeLibsThemeProvider","typeCompatibility","Card","CardContent","memo","props","createContext","extractFields","X","nodeTypes","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuItem","useRef","Tabs","TabsList","TabsTrigger","TabsContent","CardHeader","CardTitle","AlertCircle","CardDescription","parsedSchemas","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","ChevronDown","ChevronRight","Label","stringValue","ConditionBuilder","ScrollArea","processObjectType","processInputObjectType","processEnumType","processInterfaceType","processUnionType","processField","getBezierPath","defaultDataConfig","Plus","createPortal","MiniMap","fallbackOperations","OPERATORS","SECTION_LABEL","useNavigate","edgeTypes","useParams","id","ReactFlow","Background","ReactFlowProvider","LazyTemplateConfigurationModal"],"mappings":"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","file":"chunk-BWUUCBIC.js","sourcesContent":["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\";\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(\n \"flex flex-col w-80 h-full bg-background/40 backdrop-blur-sm\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\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 { Icon } from \"@iconify/react\";\n\ninterface HeaderWithIconProps {\n icon: string;\n title: string;\n}\n\nexport const HeaderWithIcon = ({ icon, title }: HeaderWithIconProps) => {\n return (\n <div className=\"flex items-center\">\n <Icon icon={icon} className={`size-4`} />\n <div className=\"ml-2.5 flex items-center text-xs font-medium leading-none tracking-wide uppercase opacity-80\">\n <span className=\"translate-y-px\">{title}</span>\n </div>\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","import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport { ApolloProvider } from \"@apollo/client/react\";\nimport { type ApolloClient } from \"@apollo/client/core\";\nimport {\n createFluidGridsClient,\n setFluidGridsClient,\n resetFluidGridsClient,\n type FluidGridsClientConfig,\n} from \"../graphql/client\";\nimport {\n createGlobalStoreClient,\n setGlobalStoreClient,\n resetGlobalStoreClient,\n} from \"../graphql/global-client\";\nimport { refetchStoreNodes } from \"../builder/components/flow-builder/components/blocks\";\nimport {\n setFluidGridsConfig,\n resetFluidGridsConfig,\n validateTrustedOrigin,\n} from \"../config\";\n\nexport interface FluidGridsProviderProps {\n /** API Gateway URL (workspace gateway) */\n apiGatewayUrl?: string;\n /** Global API Gateway URL (for store operations) */\n globalApiUrl?: string;\n /** Auth token */\n authToken?: string;\n /** Workspace token for x-workspace-authorization header */\n workspaceToken?: string;\n /** Workspace ID */\n workspaceId: string;\n /** Optional host allowlist for embedded deployments */\n trustedOrigins?: string[];\n /** Tenant ID */\n tenantId?: string;\n /** Organization ID */\n organizationId?: string;\n /** Optional: provide your own workspace Apollo client */\n workspaceClient?: ApolloClient;\n /** Optional: provide your own global Apollo client */\n globalClient?: ApolloClient;\n /** @deprecated Use workspaceClient instead */\n apolloClient?: ApolloClient;\n /** Children */\n children: ReactNode;\n}\n\ninterface FluidGridsContextValue {\n apiGatewayUrl?: string;\n globalApiUrl?: string;\n authToken?: string;\n workspaceId: string;\n trustedOrigins?: string[];\n tenantId?: string;\n organizationId?: string;\n workspaceClient?: ApolloClient;\n globalClient?: ApolloClient;\n}\n\nexport const FluidGridsContext = createContext<FluidGridsContextValue | null>(\n null,\n);\n\nexport function FluidGridsProvider({\n apiGatewayUrl,\n globalApiUrl,\n authToken,\n workspaceToken,\n workspaceId,\n trustedOrigins,\n tenantId,\n organizationId,\n workspaceClient: externalWorkspaceClient,\n globalClient: externalGlobalClient,\n apolloClient: legacyClient,\n children,\n}: FluidGridsProviderProps) {\n validateTrustedOrigin(trustedOrigins);\n\n // Create or use provided workspace Apollo client\n const workspaceClient = useMemo(() => {\n // Priority: workspaceClient > apolloClient (legacy) > create new\n if (externalWorkspaceClient) {\n return externalWorkspaceClient;\n }\n if (legacyClient) {\n return legacyClient;\n }\n if (apiGatewayUrl) {\n return createFluidGridsClient({\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n });\n }\n throw new Error(\n \"FluidGridsProvider: Either provide workspaceClient or apiGatewayUrl\",\n );\n }, [\n apiGatewayUrl,\n authToken,\n workspaceToken,\n workspaceId,\n tenantId,\n externalWorkspaceClient,\n legacyClient,\n ]);\n\n // Create or use provided global Apollo client\n const globalClient = useMemo(() => {\n if (externalGlobalClient) {\n return externalGlobalClient;\n }\n // Only create if globalApiUrl is provided\n if (globalApiUrl) {\n return createGlobalStoreClient({\n globalApiUrl,\n authToken,\n workspaceId,\n tenantId,\n organizationId,\n });\n }\n // Return undefined if no global client provided (store features won't work)\n return undefined;\n }, [\n globalApiUrl,\n authToken,\n workspaceId,\n tenantId,\n organizationId,\n externalGlobalClient,\n ]);\n\n // Set the module-level workspace client for hooks that need direct access\n useEffect(() => {\n setFluidGridsClient(workspaceClient);\n return () => {\n resetFluidGridsClient();\n };\n }, [workspaceClient]);\n\n // Set the module-level global store client so blocks/index can query installed nodes,\n // then trigger a refetch so loadInstalledStoreNodes runs with the client available.\n useEffect(() => {\n setGlobalStoreClient(globalClient ?? null);\n if (globalClient) {\n void refetchStoreNodes();\n }\n return () => {\n resetGlobalStoreClient();\n };\n }, [globalClient]);\n\n // Configure the SDK settings\n useEffect(() => {\n setFluidGridsConfig({\n apiGatewayUrl,\n globalApiUrl,\n authToken,\n workspaceId,\n trustedOrigins,\n tenantId,\n organizationId,\n });\n return () => {\n resetFluidGridsConfig();\n };\n }, [\n apiGatewayUrl,\n globalApiUrl,\n authToken,\n workspaceId,\n trustedOrigins,\n tenantId,\n organizationId,\n ]);\n\n const contextValue = useMemo(() => {\n return {\n apiGatewayUrl,\n globalApiUrl,\n authToken,\n workspaceId,\n trustedOrigins,\n tenantId,\n organizationId,\n workspaceClient,\n globalClient,\n };\n }, [\n apiGatewayUrl,\n globalApiUrl,\n authToken,\n workspaceId,\n trustedOrigins,\n tenantId,\n organizationId,\n workspaceClient,\n globalClient,\n ]);\n\n return (\n <FluidGridsContext.Provider value={contextValue}>\n <ApolloProvider client={workspaceClient}>{children}</ApolloProvider>\n </FluidGridsContext.Provider>\n );\n}\n\nexport function useFluidGridsContext() {\n const context = useContext(FluidGridsContext);\n if (!context) {\n throw new Error(\n \"useFluidGridsContext must be used within FluidGridsProvider\",\n );\n }\n return context;\n}\n","import { useContext } from \"react\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { getGlobalStoreClient } from \"../../graphql/global-client\";\n\n/**\n * Hook to get the Global Store Apollo client\n *\n * Priority:\n * 1. FluidGridsProvider context (if available)\n * 2. Module-level singleton set via setGlobalStoreClient()\n *\n * @throws Error if no global client is available from either source\n */\nexport function useGlobalStoreClient() {\n const context = useContext(FluidGridsContext);\n\n // Try context first (FluidGridsProvider)\n if (context?.globalClient) {\n return context.globalClient;\n }\n\n // Fallback to module-level singleton\n const singletonClient = getGlobalStoreClient();\n if (singletonClient) {\n return singletonClient;\n }\n\n // No client available from either source\n throw new Error(\n \"useGlobalStoreClient: No global client available. \" +\n \"Either wrap your component tree with <FluidGridsProvider globalClient={...}> \" +\n \"or call setGlobalStoreClient(client) before rendering.\",\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\" | \"INACTIVE\" | \"ERROR\" | \"ARCHIVED\" | \"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\nimport { throwIfResultError } from \"../../../../../../../../../../graphql/errors\";\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\" | \"action\" | 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 | 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 throwIfResultError(\n await globalClient.mutate({\n mutation: LINK_INTEGRATION_MUTATION,\n variables: { integrationConnectionId: integrationId, channelId },\n refetchQueries: [\n { query: GET_CHANNEL, variables: { id: channelId } },\n ],\n awaitRefetchQueries: true,\n }),\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 & 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","export interface CategoryItem {\n key: string;\n label: string;\n description: string;\n icon: string;\n /** Semantic chart-token CSS var driving the category's icon accent color. */\n color: string;\n}\n\nexport const STORE_CATEGORIES: CategoryItem[] = [\n {\n key: \"ai\",\n label: \"AI & Automation\",\n description: \"AI models, agents, and intelligent automation\",\n icon: \"mynaui:sparkles\",\n color: \"--color-chart-1\",\n },\n {\n key: \"integration\",\n label: \"Action in an App\",\n description: \"Connect with apps like Slack, Notion, Google Sheets\",\n icon: \"mynaui:puzzle\",\n color: \"--color-chart-2\",\n },\n {\n key: \"data\",\n label: \"Data & Transform\",\n description: \"Manipulate, filter, or convert data\",\n icon: \"mynaui:database\",\n color: \"--color-chart-3\",\n },\n {\n key: \"flow\",\n label: \"Flow & Logic\",\n description: \"Branch, merge, or loop the flow\",\n icon: \"mynaui:git-branch\",\n color: \"--color-chart-4\",\n },\n {\n key: \"core\",\n label: \"Core\",\n description: \"HTTP requests, code, webhooks, and more\",\n icon: \"mynaui:cog\",\n color: \"--color-chart-5\",\n },\n {\n key: \"communication\",\n label: \"Communication\",\n description: \"Email, messaging, and notifications\",\n icon: \"mynaui:message-dots\",\n color: \"--color-chart-6\",\n },\n {\n key: \"trigger\",\n label: \"Triggers\",\n description: \"Start your workflow automatically\",\n icon: \"mynaui:zap\",\n color: \"--color-chart-7\",\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> | 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 { useContext } from \"react\";\nimport { useQuery } from \"@apollo/client/react\";\nimport {\n GetMyNodeInstallationsDocument,\n type GetMyNodeInstallationsQuery,\n type GetMyNodeInstallationsQueryVariables,\n} from \"../../generated/global-operations\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../config\";\n\n/** Shape of a single installation item from the query */\ntype InstallationItem =\n GetMyNodeInstallationsQuery[\"myStoreAppInstallations\"][\"items\"][number];\n\n/**\n * Hook to get installed nodes for the current workspace\n *\n * Fetches installations from the Store service to show \"Already Installed\" status\n * in the Store popup and display installed count.\n */\nexport function useInstalledNodes() {\n const client = useGlobalStoreClient();\n\n // Try to get context, but don't throw if not available\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n\n const { data, loading, error, refetch } = useQuery<\n GetMyNodeInstallationsQuery,\n GetMyNodeInstallationsQueryVariables\n >(GetMyNodeInstallationsDocument, {\n client,\n variables: {\n workspaceId: workspaceId || \"\",\n limit: 100,\n offset: 0,\n },\n skip: !workspaceId,\n fetchPolicy: \"cache-and-network\",\n });\n\n const installations = data?.myStoreAppInstallations?.items || [];\n const activeInstallations = installations.filter(\n (item: InstallationItem) => item.status === \"ACTIVE\",\n );\n\n const installedAppIds = new Set(\n activeInstallations.map((item: InstallationItem) => item.productId),\n );\n\n // Create a map of productId -> installation details for easy lookup\n const installationsMap = new Map(\n activeInstallations.map((item: InstallationItem) => [\n item.productId,\n {\n installedVersion: item.version ?? undefined,\n installationId: item.id,\n installedAt: item.installedAt,\n },\n ]),\n );\n\n // Nodes the user installed that are now UNLISTED/deprecated\n const deprecatedInstallations = activeInstallations.filter(\n (item: InstallationItem) => item.productStatus === \"UNLISTED\",\n );\n\n return {\n installations,\n installedAppIds,\n installationsMap,\n deprecatedInstallations,\n installedNodeTypes: new Set<string>(),\n totalCount: data?.myStoreAppInstallations?.total || 0,\n loading,\n error,\n refetch,\n };\n}\n","import { useCallback } from \"react\";\nimport {\n AVAILABLE_NODES,\n refetchStoreNodes,\n} from \"../../builder/components/flow-builder/components/blocks\";\n\n/**\n * Hook to refresh the available nodes list after installing/uninstalling nodes.\n * Re-fetches all nodes from the workflow-svc (single source of truth).\n */\nexport function useRefreshAvailableNodes() {\n const refreshAvailableNodes = useCallback(async () => {\n try {\n console.log(\"[useRefreshAvailableNodes] Refreshing available nodes...\");\n\n // Re-fetch all nodes from workflow-svc and rebuild arrays\n await refetchStoreNodes();\n\n console.log(\n `[useRefreshAvailableNodes] Refresh complete. Total available nodes: ${AVAILABLE_NODES.length}`,\n );\n\n return {\n success: true,\n totalNodes: AVAILABLE_NODES.length,\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"[useRefreshAvailableNodes] Refresh failed:\", message);\n return {\n success: false,\n error: message,\n };\n }\n }, []);\n\n return {\n refreshAvailableNodes,\n };\n}\n","import { useState, useCallback, useContext } from \"react\";\nimport { useMutation } from \"@apollo/client/react\";\nimport {\n InstallWorkflowNodeDocument,\n InstallPurchasedNodeDocument,\n type InstallWorkflowNodeMutation,\n type InstallWorkflowNodeMutationVariables,\n type InstallPurchasedNodeMutation,\n type InstallPurchasedNodeMutationVariables,\n} from \"../../generated/global-operations\";\nimport type { StoreProduct } from \"../../generated/global-types\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { useInstalledNodes } from \"./useInstalledNodes\";\nimport { useRefreshAvailableNodes } from \"./useRefreshAvailableNodes\";\nimport { getFluidGridsConfig } from \"../../config\";\n\n/**\n * Hook to install a workflow node from the store\n */\nexport function useInstallNode() {\n const globalClient = useGlobalStoreClient();\n\n // Try to get context, but don't throw if not available\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n const tenantId = context?.tenantId ?? getFluidGridsConfig().tenantId;\n\n const { refetch: refetchInstalled } = useInstalledNodes();\n const { refreshAvailableNodes } = useRefreshAvailableNodes();\n const [installing, setInstalling] = useState<string | null>(null);\n\n const [installMutation] = useMutation<\n InstallWorkflowNodeMutation,\n InstallWorkflowNodeMutationVariables\n >(InstallWorkflowNodeDocument, {\n client: globalClient,\n });\n\n const [installPurchasedMutation] = useMutation<\n InstallPurchasedNodeMutation,\n InstallPurchasedNodeMutationVariables\n >(InstallPurchasedNodeDocument, {\n client: globalClient,\n });\n\n const installNode = useCallback(\n async (node: StoreProduct) => {\n try {\n setInstalling(node.id);\n\n // Determine if this is a purchased node (paid nodes that have been purchased)\n const isPurchasedNode =\n node.isPurchased && node.pricingModel !== \"FREE\";\n\n // Step 1: Install the app/node (create database record)\n let installationResult;\n\n if (isPurchasedNode) {\n // Use installPurchasedApp for purchased nodes (validates purchase via order)\n console.log(`[useInstallNode] Installing purchased node: ${node.id}`);\n const result = await installPurchasedMutation({\n variables: {\n productId: node.id,\n workspaceId,\n // orderId is optional - backend will auto-find most recent PROCESSED order\n },\n });\n\n if (result.error || !result.data?.installPurchasedApp?.success) {\n throw new Error(\n result.data?.installPurchasedApp?.error ||\n result.error?.message ||\n \"Installation failed\",\n );\n }\n\n installationResult = result.data.installPurchasedApp.installation;\n console.log(\n \"[useInstallNode] Purchased node installation successful. Node registration handled by backend.\",\n );\n } else {\n // Use recordAppInstallation for FREE nodes (existing flow)\n console.log(`[useInstallNode] Installing free node: ${node.id}`);\n const result = await installMutation({\n variables: {\n input: {\n productId: node.id,\n workspaceId,\n workspaceName: undefined, // Optional\n workspaceType: undefined, // Optional\n organizationId: tenantId,\n version: node.manifestVersion,\n manifest: node.manifest,\n metadata: undefined, // Optional\n },\n },\n });\n\n if (result.error || !result.data?.recordAppInstallation) {\n throw new Error(result.error?.message || \"Installation failed\");\n }\n\n installationResult = result.data.recordAppInstallation;\n console.log(\n \"[useInstallNode] Free node installation successful. Node registration handled by backend.\",\n );\n }\n\n // Step 2: Refresh available nodes in the builder from store manifest\n // The manifest stored in the installation record is the source of truth —\n // no ZIP download needed. refetchStoreNodes() re-fetches workflow-svc\n // BUILTIN nodes AND overlays installed store nodes from the global store.\n const refreshResult = await refreshAvailableNodes();\n if (refreshResult.success) {\n console.log(\n `[useInstallNode] Available nodes refreshed. Total: ${refreshResult.totalNodes}`,\n );\n }\n\n // Step 3: Refresh installations list\n await refetchInstalled();\n\n return {\n success: true,\n installation: installationResult,\n };\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : \"Installation failed\";\n console.error(\"[useInstallNode] Installation failed:\", error);\n return {\n success: false,\n error: errorMessage,\n };\n } finally {\n setInstalling(null);\n }\n },\n [\n installMutation,\n installPurchasedMutation,\n workspaceId,\n tenantId,\n refetchInstalled,\n refreshAvailableNodes,\n ],\n );\n\n return {\n installNode,\n installing,\n };\n}\n","import { useState, useCallback, useContext } from \"react\";\nimport { useMutation } from \"@apollo/client/react\";\nimport {\n InstallWorkflowNodeDocument,\n type InstallWorkflowNodeMutation,\n type InstallWorkflowNodeMutationVariables,\n} from \"../../generated/global-operations\";\nimport type { StoreProduct } from \"../../generated/global-types\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../config\";\nimport { useInstalledNodes } from \"./useInstalledNodes\";\nimport { useRefreshAvailableNodes } from \"./useRefreshAvailableNodes\";\n\n/**\n * Hook to update an installed workflow node to the latest version from the store.\n *\n * Reuses the recordAppInstallation upsert path — calling it with the new\n * manifestVersion updates the existing installation record in place, which\n * clears the \"Update available\" badge on the next refetch.\n */\nexport function useUpdateNode() {\n const globalClient = useGlobalStoreClient();\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n const tenantId = context?.tenantId ?? getFluidGridsConfig().tenantId;\n\n const { refetch: refetchInstalled } = useInstalledNodes();\n const { refreshAvailableNodes } = useRefreshAvailableNodes();\n const [updating, setUpdating] = useState<string | null>(null);\n\n const [installMutation] = useMutation<\n InstallWorkflowNodeMutation,\n InstallWorkflowNodeMutationVariables\n >(InstallWorkflowNodeDocument, {\n client: globalClient,\n });\n\n const updateNode = useCallback(\n async (node: StoreProduct, _installationId: string) => {\n try {\n setUpdating(node.id);\n\n const result = await installMutation({\n variables: {\n input: {\n productId: node.id,\n workspaceId,\n organizationId: tenantId,\n version: node.manifestVersion,\n manifest: node.manifest,\n },\n },\n });\n\n if (result.error || !result.data?.recordAppInstallation) {\n throw new Error(result.error?.message || \"Update failed\");\n }\n\n await refreshAvailableNodes();\n await refetchInstalled();\n\n return { success: true };\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 installMutation,\n workspaceId,\n tenantId,\n refetchInstalled,\n refreshAvailableNodes,\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\nimport { throwIfResultError } from \"../../graphql/errors\";\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 = throwIfResultError(\n await client.mutate<\n RemoveNodeFromWorkflowsMutation,\n RemoveNodeFromWorkflowsMutationVariables\n >({\n mutation: RemoveNodeFromWorkflowsDocument,\n variables: {\n nodeType,\n nodeVersion,\n workflowIds,\n },\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, useMemo } from \"react\";\nimport { gql } from \"@apollo/client/core\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport type { StoreProduct } from \"../../generated/global-types\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../config\";\n\n// Inline GraphQL document to avoid dependency on generated types\n// (which requires codegen to be run). Will be replaced by generated\n// import once codegen is executed.\nconst GET_WORKFLOW_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 videoUrls\n rating\n reviewCount\n downloads\n viewCount\n price\n pricingModel\n currency\n featured\n content\n manifest\n manifestVersion\n authorName\n license\n category\n tags\n compatibleProducts\n publisher {\n id\n name\n email\n websiteUrl\n logoUrl\n isVerified\n }\n createdAt\n updatedAt\n publishedAt\n }\n }\n`;\n\n/**\n * Hook to lazily fetch full details of a workflow template from the store.\n *\n * Unlike `useWorkflowTemplates` which fetches browse-level metadata,\n * this hook fetches the full product detail including the `content` field\n * which contains the workflow definitionJson.\n *\n * Uses a manual query (not useQuery) to only fetch when explicitly requested.\n */\nexport function useTemplateDetail() {\n const client = useGlobalStoreClient();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\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 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 /**\n * Fetch full template detail including content (definitionJson).\n * Returns the full StoreProduct with content populated.\n */\n const fetchTemplateDetail = useCallback(\n async (templateId: string): Promise<StoreProduct | null> => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.query({\n query: GET_WORKFLOW_TEMPLATE_DETAIL,\n variables: { id: templateId },\n fetchPolicy: \"network-only\",\n context:\n Object.keys(contextHeaders).length > 0\n ? { headers: contextHeaders }\n : undefined,\n });\n\n if (result.error) {\n throw result.error;\n }\n\n const data = result.data as { product?: StoreProduct } | undefined;\n return data?.product ?? null;\n } catch (err) {\n const fetchError =\n err instanceof Error\n ? err\n : new Error(\"Failed to fetch template detail\");\n setError(fetchError);\n console.error(\"[useTemplateDetail] Error:\", err);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client, contextHeaders],\n );\n\n return {\n fetchTemplateDetail,\n loading,\n error,\n };\n}\n","import { useState, useCallback, useContext } from \"react\";\nimport { gql } from \"@apollo/client/core\";\nimport { getFluidGridsClient } from \"../../graphql/client\";\nimport { getFluidGridsConfig } from \"../../config\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { useTemplateDetail } from \"./useTemplateDetail\";\nimport { useInstallNode } from \"./useInstallNode\";\nimport type { StoreProduct } from \"../../generated/global-types\";\nimport type {\n WorkflowTemplateContent,\n TemplateRequiredNode,\n TemplateNodeCheckResult,\n ImportWorkflowTemplateOptions,\n} from \"../../types/workflow-template-content\";\nimport {\n applyTemplateInputs,\n deepClone,\n} from \"../../utils/template-input-applicator\";\n\n// ============================================================================\n// Inline GraphQL Documents\n// These will be replaced by generated document imports once codegen runs.\n// ============================================================================\n\nconst IMPORT_WORKFLOW_TEMPLATE = gql`\n mutation ImportWorkflowTemplate($input: ImportWorkflowTemplateInput!) {\n importWorkflowTemplate(input: $input) {\n success\n message\n workflow {\n id\n workflowKey\n version\n name\n description\n status\n definitionJson\n tags\n category\n icon\n createdAt\n }\n }\n }\n`;\n\nconst RECORD_DOWNLOAD = gql`\n mutation RecordDownload($productId: String!) {\n recordDownload(productId: $productId) {\n id\n downloadedAt\n }\n }\n`;\n\n// Use the shared InstallWorkflowNodeDocument from generated operations\n// to avoid duplicate GQL definitions (also used in desktop-sidebar-fragment)\nimport { InstallWorkflowNodeDocument } from \"../../generated/global-operations\";\n\nimport { throwIfResultError } from \"../../graphql/errors\";\n\nconst NODE_ENDPOINT_CONFIGS = gql`\n query NodeEndpointConfigsForTemplateCheck {\n nodeEndpointConfigs(pagination: { limit: 500, offset: 0 }) {\n items {\n nodeType\n nodeVersion\n publishType\n status\n }\n total\n }\n }\n`;\n\nconst WORKFLOW_DEFINITIONS = gql`\n query WorkflowDefinitions($input: ListWorkflowDefinitionsInput!) {\n workflowDefinitions(input: $input) {\n items {\n id\n workflowKey\n name\n version\n status\n }\n total\n hasMore\n }\n }\n`;\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ImportResult {\n success: boolean;\n workflow: {\n id: string;\n workflowKey: string;\n version: string;\n name: string;\n description?: string | null;\n status: string;\n } | null;\n message: string;\n /** Nodes that were installed during import */\n installedNodes: string[];\n /** Credential types that need to be configured */\n requiredCredentials: string[];\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to orchestrate importing a workflow template from the store.\n *\n * Frontend-orchestrated flow:\n * 1. Fetch full template detail from global store (lazy load content)\n * 2. Check which nodes are missing from the workspace\n * 3. Auto-install free/builtin missing nodes (with user confirmation)\n * 4. Apply user-provided template inputs to definitionJson\n * 5. Create workflow via importWorkflowTemplate mutation (workspace gateway)\n * 6. Record download in store (global gateway)\n */\nexport function useImportWorkflowTemplate() {\n const [importing, setImporting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const { fetchTemplateDetail, loading: fetchingDetail } = useTemplateDetail();\n const { installNode } = useInstallNode();\n\n const globalClient = useGlobalStoreClient();\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n\n // ========================================================================\n // Step 1: Fetch full template detail (lazy)\n // ========================================================================\n\n const getTemplateDetail = useCallback(\n async (templateId: string) => {\n return fetchTemplateDetail(templateId);\n },\n [fetchTemplateDetail],\n );\n\n // ========================================================================\n // Step 2: Parse content and check node dependencies\n // ========================================================================\n\n /**\n * Parse the template content from a StoreProduct.\n * Returns null if the product doesn't have valid workflow template content.\n */\n const parseTemplateContent = useCallback(\n (template: StoreProduct): WorkflowTemplateContent | null => {\n try {\n const content = template.content as WorkflowTemplateContent | null;\n if (!content?.definitionJson) {\n console.warn(\n \"[useImportWorkflowTemplate] Template has no definitionJson in content:\",\n template.id,\n );\n return null;\n }\n return content;\n } catch {\n console.error(\n \"[useImportWorkflowTemplate] Failed to parse template content:\",\n template.id,\n );\n return null;\n }\n },\n [],\n );\n\n /**\n * Check which nodes from the template are missing in the workspace.\n * Queries the workspace's installed nodes and compares with required nodes.\n */\n const checkMissingNodes = useCallback(\n async (\n requiredNodeTypes: TemplateRequiredNode[],\n ): Promise<TemplateNodeCheckResult> => {\n if (!requiredNodeTypes || requiredNodeTypes.length === 0) {\n return {\n installed: [],\n missing: [],\n missingPaid: [],\n canImport: true,\n };\n }\n\n try {\n const client = getFluidGridsClient();\n const result = await client.query({\n query: NODE_ENDPOINT_CONFIGS,\n fetchPolicy: \"network-only\",\n });\n\n const data = result.data as\n | {\n nodeEndpointConfigs?: {\n items: Array<{ nodeType: string }>;\n };\n }\n | undefined;\n const installedNodeTypes = new Set(\n (data?.nodeEndpointConfigs?.items || []).map(\n (n: { nodeType: string }) => n.nodeType,\n ),\n );\n\n const installed: TemplateRequiredNode[] = [];\n const missing: TemplateRequiredNode[] = [];\n const missingPaid: TemplateRequiredNode[] = [];\n\n for (const node of requiredNodeTypes) {\n if (\n installedNodeTypes.has(node.nodeType) ||\n node.publishType === \"BUILTIN\"\n ) {\n installed.push(node);\n } else if (node.publishType === \"STORE\" && node.storeProductId) {\n // Store node with a product reference — needs separate purchase check\n missingPaid.push(node);\n } else {\n missing.push(node);\n }\n }\n\n return {\n installed,\n missing,\n missingPaid,\n canImport: missingPaid.length === 0,\n };\n } catch (err) {\n console.error(\n \"[useImportWorkflowTemplate] Failed to check node dependencies:\",\n err,\n );\n // On error, assume all nodes are available (don't block import)\n return {\n installed: requiredNodeTypes,\n missing: [],\n missingPaid: [],\n canImport: true,\n };\n }\n },\n [],\n );\n\n // ========================================================================\n // Step 3: Install missing nodes\n // ========================================================================\n\n /**\n * Install missing free/builtin nodes.\n * Returns list of successfully installed node display names.\n */\n const installMissingNodes = useCallback(\n async (nodes: StoreProduct[]): Promise<string[]> => {\n const installed: string[] = [];\n for (const node of nodes) {\n try {\n const result = await installNode(node);\n if (result.success) {\n installed.push(node.name);\n }\n } catch (err) {\n console.warn(\n `[useImportWorkflowTemplate] Failed to install node: ${node.name}`,\n err,\n );\n }\n }\n return installed;\n },\n [installNode],\n );\n\n // ========================================================================\n // Step 4 + 5 + 6: Full import flow\n // ========================================================================\n\n /**\n * Import a workflow template into the workspace.\n *\n * @param template - The full StoreProduct (with content populated)\n * @param options - Import options (name override, template inputs, etc.)\n * @returns Import result with the created workflow\n */\n const importTemplate = useCallback(\n async (\n template: StoreProduct,\n options?: ImportWorkflowTemplateOptions,\n ): Promise<ImportResult> => {\n setImporting(true);\n setError(null);\n\n try {\n // 1. Parse template content\n const content = parseTemplateContent(template);\n if (!content) {\n throw new Error(\n \"Template does not contain valid workflow definition data\",\n );\n }\n\n // 2. Apply user template inputs to definitionJson\n let definitionJson = deepClone(content.definitionJson);\n if (options?.templateInputs) {\n definitionJson = applyTemplateInputs(\n definitionJson,\n options.templateInputs,\n );\n }\n\n // 3. Build context with product isolation\n const config = getFluidGridsConfig();\n const importContext: Record<string, unknown> = {\n ...(options?.context || {}),\n ...(config.productId ? { productId: config.productId } : {}),\n ...(config.productName ? { productName: config.productName } : {}),\n };\n\n // 4. Create workflow via workspace gateway\n const client = getFluidGridsClient();\n const result = throwIfResultError(\n await client.mutate({\n mutation: IMPORT_WORKFLOW_TEMPLATE,\n variables: {\n input: {\n definitionJson,\n name:\n options?.name || content.defaultWorkflowName || template.name,\n description: options?.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 projectId: options?.projectId,\n context: importContext,\n },\n },\n refetchQueries: [WORKFLOW_DEFINITIONS],\n }),\n );\n\n const mutationData = result.data as\n | {\n importWorkflowTemplate?: {\n success: boolean;\n message?: string;\n workflow?: {\n id: string;\n workflowKey: string;\n version: string;\n name: string;\n description?: string | null;\n status: string;\n };\n };\n }\n | undefined;\n const importResult = mutationData?.importWorkflowTemplate;\n if (!importResult?.success || !importResult.workflow) {\n throw new Error(\n importResult?.message || \"Failed to create workflow from template\",\n );\n }\n\n // 5. Record download in store (analytics, best-effort)\n try {\n throwIfResultError(\n await globalClient.mutate({\n mutation: RECORD_DOWNLOAD,\n variables: {\n productId: template.id,\n },\n }),\n );\n } catch {\n // Best-effort: don't fail import if analytics recording fails\n console.warn(\n \"[useImportWorkflowTemplate] Failed to record store download\",\n );\n }\n\n // 6. Record installation in store (so template shows in /store/installed)\n try {\n throwIfResultError(\n await globalClient.mutate({\n mutation: InstallWorkflowNodeDocument,\n variables: {\n input: {\n productId: template.id,\n workspaceId,\n organizationId:\n context?.tenantId ?? getFluidGridsConfig().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(\n \"[useImportWorkflowTemplate] Failed to record app installation\",\n );\n }\n\n return {\n success: true,\n workflow: importResult.workflow,\n message: importResult.message || \"Template imported successfully\",\n installedNodes: [],\n requiredCredentials: content.requiredCredentialTypes || [],\n };\n } catch (err) {\n const importError =\n err instanceof Error ? err : new Error(\"Template import failed\");\n setError(importError);\n console.error(\"[useImportWorkflowTemplate] Import failed:\", err);\n return {\n success: false,\n workflow: null,\n message: importError.message,\n installedNodes: [],\n requiredCredentials: [],\n };\n } finally {\n setImporting(false);\n }\n },\n [parseTemplateContent, globalClient, workspaceId],\n );\n\n return {\n /** Fetch full template content from store (lazy load) */\n getTemplateDetail,\n /** Parse WorkflowTemplateContent from a StoreProduct */\n parseTemplateContent,\n /** Check which template nodes are missing from workspace */\n checkMissingNodes,\n /** Install missing free nodes */\n installMissingNodes,\n /** Full import: apply inputs -> create workflow -> record analytics */\n importTemplate,\n /** Whether we're fetching template detail */\n fetchingDetail,\n /** Whether we're importing */\n importing,\n /** Last error */\n error,\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\nimport { throwIfResultError } from \"../../graphql/errors\";\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 = throwIfResultError(\n 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\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 { AVAILABLE_NODES, NODE_CONFIGS } from \"../blocks\";\n\n/**\n * Operations a user may actually pick for a node type: adapter operations\n * (supplyModel/supplyTool/…) and `internal` ones (the AI Agent's planStep) are\n * executor plumbing, chosen automatically, and must not count as user choices.\n */\nfunction userSelectableOperationCount(nodeType: string | undefined): number {\n if (!nodeType) return 0;\n const ops = (NODE_CONFIGS.find((c) => c.type === nodeType)?.operations ??\n []) as Array<{ isAdapterOperation?: boolean; internal?: boolean }>;\n return ops.filter((op) => !op.isAdapterOperation && !op.internal).length;\n}\n\ninterface StoreNodeAvailabilityProduct {\n slug: string;\n manifest?: Record<string, unknown> | null;\n}\n\nexport interface StoreNodeAvailability {\n nodeType?: string;\n isPrebuilt: boolean;\n isDraggable: boolean;\n}\n\n/**\n * Resolve the workflow node type for a store node.\n *\n * Installed nodes can fall back to the historical slug-based type when older\n * manifests did not yet include `manifest.nodeType`.\n */\nexport function getStoreNodeType(\n node: StoreNodeAvailabilityProduct,\n isInstalled: boolean,\n): string | undefined {\n const manifestNodeType = (node.manifest as { nodeType?: string } | null)\n ?.nodeType;\n\n return manifestNodeType ?? (isInstalled ? `store/${node.slug}` : undefined);\n}\n\n/**\n * A node is considered prebuilt when it is already present in the workflow\n * registry/available nodes list even though the workspace does not have a store\n * installation record for it.\n */\nexport function getStoreNodeAvailability(\n node: StoreNodeAvailabilityProduct,\n isInstalled: boolean,\n): StoreNodeAvailability {\n const nodeType = getStoreNodeType(node, isInstalled);\n const isInternalBuiltin = !!nodeType && nodeType.startsWith(\"internal:\");\n // Only BUILTIN nodes count as \"prebuilt\" (available without installation).\n // STORE/CUSTOM nodes that appear in AVAILABLE_NODES were added because they\n // were registered in nodeEndpointConfigs, but they still require a user install.\n const isRegistryBacked =\n !!nodeType &&\n AVAILABLE_NODES.some(\n (availableNode) =>\n availableNode.type === nodeType &&\n (availableNode.publishType === \"BUILTIN\" ||\n availableNode.publishType === undefined),\n );\n const isPrebuilt = !isInstalled && (isInternalBuiltin || isRegistryBacked);\n\n const available = !!nodeType && (isInstalled || isPrebuilt);\n\n // A multi-operation node (Gmail, GitHub, …) must NOT be draggable as a bare\n // card: dropping it sets no operation, so it lands on the canvas as\n // \"Not configured\". For those the user drags a specific operation row instead.\n // Nodes with 0 or 1 user-selectable operation (internal nodes, the AI Agent,\n // sub-nodes) stay draggable and auto-pin — matching how n8n treats\n // single-purpose nodes.\n const isDraggable = available && userSelectableOperationCount(nodeType) <= 1;\n\n return { nodeType, isPrebuilt, isDraggable };\n}\n","import { useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { NODE_TYPE_DRAG_DATA_FORMAT } from \"../../../../../../../../contants/symbols\";\n\ninterface StoreNodeListItemProps {\n name: string;\n description: string | null | undefined;\n icon: string | null | undefined;\n isInstalled: boolean;\n isPrebuilt?: boolean;\n hasUpdate: boolean;\n isDeprecated?: boolean;\n /** nodeType from product manifest — enables drag-to-canvas when the node is available */\n nodeType?: string;\n /** Whether this node can currently be dragged onto the canvas */\n isDraggable?: boolean;\n onClick: () => void;\n}\n\nexport function StoreNodeListItem({\n name,\n description,\n icon,\n isInstalled,\n isPrebuilt,\n hasUpdate,\n isDeprecated,\n nodeType,\n isDraggable,\n onClick,\n}: StoreNodeListItemProps) {\n const handleDragStart = useCallback(\n (e: React.DragEvent<HTMLButtonElement>) => {\n if (!isDraggable || !nodeType) return;\n e.dataTransfer.setData(NODE_TYPE_DRAG_DATA_FORMAT, nodeType);\n e.dataTransfer.effectAllowed = \"move\";\n },\n [isDraggable, nodeType],\n );\n\n return (\n <button\n onClick={onClick}\n draggable={isDraggable && !!nodeType}\n onDragStart={handleDragStart}\n title={isDraggable ? `${name} — drag to add to canvas` : name}\n className=\"w-full flex items-center gap-3 px-2 py-2.5 rounded-md hover:bg-muted/60 transition-colors text-left group\"\n style={isDraggable ? { cursor: \"grab\" } : undefined}\n >\n <div className=\"relative size-9 shrink-0 rounded-lg bg-muted flex items-center justify-center overflow-hidden\">\n {icon ? (\n <img src={icon} alt={name} className=\"w-full h-full object-cover\" />\n ) : (\n <span className=\"text-sm font-bold text-muted-foreground\">\n {name.charAt(0).toUpperCase()}\n </span>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n <span className=\"text-sm font-medium text-foreground group-hover:text-primary transition-colors truncate\">\n {name}\n </span>\n {isDeprecated && (\n <span\n title=\"This node is no longer supported. Consider migrating to a newer alternative.\"\n className=\"shrink-0 inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-[10px] font-semibold cursor-help\"\n style={{\n background: \"var(--color-status-warning-bgSubtle)\",\n color: \"var(--color-status-warning-text)\",\n }}\n >\n Deprecated\n </span>\n )}\n {hasUpdate && !isDeprecated && (\n <span\n className=\"shrink-0 inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-semibold\"\n style={{\n background: \"var(--color-status-warning-bgSubtle)\",\n color: \"var(--color-status-warning-text)\",\n }}\n >\n Update\n </span>\n )}\n {isInstalled && !hasUpdate && !isDeprecated && (\n <span\n className=\"shrink-0 inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-[10px] font-semibold\"\n style={{\n background: \"var(--color-status-success-bgSubtle)\",\n color: \"var(--color-status-success-text)\",\n }}\n >\n <span\n className=\"size-1.5 rounded-full inline-block\"\n style={{ background: \"var(--color-status-success-bg)\" }}\n />\n Installed\n </span>\n )}\n {isPrebuilt && !isInstalled && !hasUpdate && !isDeprecated && (\n <span\n className=\"shrink-0 inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-[10px] font-semibold\"\n style={{\n background: \"var(--color-status-info-bgSubtle)\",\n color: \"var(--color-status-info-text)\",\n }}\n >\n <span\n className=\"size-1.5 rounded-full inline-block\"\n style={{ background: \"var(--color-status-info-bg)\" }}\n />\n Prebuilt\n </span>\n )}\n </div>\n {description && (\n <p className=\"text-xs text-muted-foreground truncate mt-0.5 leading-snug\">\n {description}\n </p>\n )}\n </div>\n\n {isDraggable ? (\n <Icon\n icon=\"mynaui:drag-dots-vertical\"\n className=\"size-4 shrink-0 text-foreground/40 group-hover:text-primary transition-colors\"\n />\n ) : (\n <Icon\n icon=\"mynaui:chevron-right\"\n className=\"size-4 shrink-0 text-foreground/40\"\n />\n )}\n </button>\n );\n}\n","import { useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Input } from \"../../../../../../../../../ui/input\";\nimport { STORE_CATEGORIES, type CategoryItem } from \"../store-categories\";\nimport type { BrowseWorkflowNodesQuery } from \"../../../../../../../../../generated/global-operations\";\nimport {\n useStoreNodes,\n useInstalledNodes,\n} from \"../../../../../../../../../hooks/store\";\nimport { getStoreNodeAvailability } from \"../../../../../store/store-node-availability\";\nimport { StoreNodeListItem } from \"./store-node-list-item\";\nimport type { GetMyNodeInstallationsQuery } from \"../../../../../../../../../generated/global-operations\";\n\ntype DeprecatedItem =\n GetMyNodeInstallationsQuery[\"myStoreAppInstallations\"][\"items\"][number];\n\ntype StoreProductResult =\n BrowseWorkflowNodesQuery[\"browseStore\"][\"products\"][number];\n\ninterface StoreCategoryListProps {\n searchTerm: string;\n onSearchChange: (term: string) => void;\n onSelectCategory: (category: CategoryItem) => void;\n onSelectNode: (node: StoreProductResult) => void;\n}\n\nfunction deprecatedItemToProduct(item: DeprecatedItem): StoreProductResult {\n return {\n id: item.productId,\n name: item.productName ?? \"Unknown Node\",\n icon: item.productIcon ?? null,\n description: null,\n type: null,\n subType: null,\n slug: \"\",\n rating: null,\n reviewCount: null,\n downloads: null,\n price: null,\n pricingModel: \"FREE\",\n currency: null,\n featured: false,\n manifest: item.manifest ?? null,\n manifestVersion: item.version ?? null,\n authorName: null,\n license: null,\n compatibleProducts: null,\n requiredPermissions: null,\n integrationDeps: null,\n zipFileUrl: null,\n isPurchased: null,\n publisher: null,\n } as unknown as StoreProductResult;\n}\n\nexport function StoreCategoryList({\n searchTerm,\n onSearchChange,\n onSelectCategory,\n onSelectNode,\n}: StoreCategoryListProps) {\n const isSearching = searchTerm.trim().length > 0;\n const [showDeprecated, setShowDeprecated] = useState(false);\n\n const { products, loading, hasMore, fetchMore } = useStoreNodes({\n filter: {\n type: \"NODE\",\n compatibleWith: \"fluidgrids\",\n search: isSearching ? searchTerm.trim() : undefined,\n },\n });\n\n const { installedAppIds, installationsMap, deprecatedInstallations } =\n useInstalledNodes();\n\n const filteredDeprecated = isSearching\n ? deprecatedInstallations.filter((item: DeprecatedItem) =>\n (item.productName ?? \"\")\n .toLowerCase()\n .includes(searchTerm.trim().toLowerCase()),\n )\n : deprecatedInstallations;\n\n return (\n <div className=\"flex flex-col h-full overflow-hidden\">\n {/* Search bar */}\n <div className=\"px-3 pt-3 pb-2 shrink-0\">\n <div className=\"relative\">\n <Icon\n icon=\"mynaui:search\"\n className=\"absolute left-2.5 top-1/2 -translate-y-1/2 size-4 text-muted-foreground pointer-events-none\"\n />\n <Input\n value={searchTerm}\n onChange={(e) => {\n onSearchChange(e.target.value);\n setShowDeprecated(false);\n }}\n placeholder=\"Search nodes...\"\n className=\"pl-8 text-sm h-9\"\n />\n {searchTerm && (\n <button\n onClick={() => onSearchChange(\"\")}\n className=\"absolute right-2.5 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors\"\n >\n <Icon icon=\"mynaui:x\" className=\"size-3.5\" />\n </button>\n )}\n </div>\n </div>\n\n {isSearching ? (\n /* Search results — deprecated nodes that match appear inline */\n <div className=\"flex-1 overflow-y-auto px-2 pb-2\">\n {loading &&\n products.length === 0 &&\n filteredDeprecated.length === 0 ? (\n <div className=\"flex items-center justify-center py-10\">\n <Icon\n icon=\"mynaui:spinner\"\n className=\"size-5 text-primary animate-spin\"\n />\n </div>\n ) : products.length === 0 && filteredDeprecated.length === 0 ? (\n <div className=\"text-center py-10 px-4\">\n <p className=\"text-sm text-muted-foreground\">\n No nodes found for “{searchTerm}”\n </p>\n </div>\n ) : (\n <>\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground font-medium\">\n {products.length + filteredDeprecated.length} result\n {products.length + filteredDeprecated.length !== 1 ? \"s\" : \"\"}\n </p>\n <div className=\"flex flex-col gap-0.5\">\n {products.map((node) => {\n const installation = installationsMap.get(node.id);\n const isInstalled = installedAppIds.has(node.id);\n const hasUpdate =\n isInstalled &&\n !!installation?.installedVersion &&\n !!node.manifestVersion &&\n installation.installedVersion !== node.manifestVersion;\n const { nodeType, isPrebuilt, isDraggable } =\n getStoreNodeAvailability(node, isInstalled);\n\n return (\n <StoreNodeListItem\n key={node.id}\n name={node.name}\n description={node.description}\n icon={node.icon}\n isInstalled={isInstalled}\n isPrebuilt={isPrebuilt}\n hasUpdate={hasUpdate}\n nodeType={nodeType}\n isDraggable={isDraggable}\n onClick={() => onSelectNode(node)}\n />\n );\n })}\n {filteredDeprecated.map((item: DeprecatedItem) => (\n <StoreNodeListItem\n key={item.productId}\n name={item.productName ?? \"Unknown Node\"}\n description={null}\n icon={item.productIcon ?? undefined}\n isInstalled={true}\n hasUpdate={false}\n isDeprecated={true}\n onClick={() => onSelectNode(deprecatedItemToProduct(item))}\n />\n ))}\n </div>\n {hasMore && (\n <button\n onClick={fetchMore}\n className=\"w-full mt-2 py-2 text-xs text-primary hover:text-primary/80 font-medium transition-colors\"\n >\n Load more\n </button>\n )}\n </>\n )}\n </div>\n ) : showDeprecated ? (\n /* Deprecated nodes list — shown when user drills into the Deprecated category */\n <div className=\"flex-1 overflow-y-auto px-2 pb-2\">\n <button\n onClick={() => setShowDeprecated(false)}\n className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors px-2 py-2\"\n >\n <Icon icon=\"mynaui:chevron-left\" className=\"size-3.5\" />\n Back\n </button>\n <p className=\"px-2 py-1 text-xs text-muted-foreground font-medium\">\n {deprecatedInstallations.length} deprecated node\n {deprecatedInstallations.length !== 1 ? \"s\" : \"\"}\n </p>\n <div className=\"flex flex-col gap-0.5\">\n {deprecatedInstallations.map((item: DeprecatedItem) => (\n <StoreNodeListItem\n key={item.productId}\n name={item.productName ?? \"Unknown Node\"}\n description={null}\n icon={item.productIcon ?? undefined}\n isInstalled={true}\n hasUpdate={false}\n isDeprecated={true}\n onClick={() => onSelectNode(deprecatedItemToProduct(item))}\n />\n ))}\n </div>\n </div>\n ) : (\n /* Main category list */\n <div className=\"flex-1 overflow-y-auto px-2 pb-2\">\n <div className=\"flex flex-col gap-0.5 pt-1\">\n {STORE_CATEGORIES.map((cat) => (\n <button\n key={cat.key}\n onClick={() => onSelectCategory(cat)}\n className=\"w-full flex items-center gap-3 px-2 py-3 rounded-lg border border-transparent hover:border-default hover:bg-muted/60 transition-colors text-left group\"\n >\n <div\n className=\"size-9 shrink-0 rounded-lg flex items-center justify-center\"\n style={{\n backgroundColor: `color-mix(in oklab, var(${cat.color}) 16%, transparent)`,\n }}\n >\n <Icon\n icon={cat.icon}\n className=\"size-5\"\n style={{ color: `var(${cat.color})` }}\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground group-hover:text-primary transition-colors\">\n {cat.label}\n </p>\n <p className=\"text-xs text-muted-foreground truncate mt-0.5\">\n {cat.description}\n </p>\n </div>\n <Icon\n icon=\"mynaui:chevron-right\"\n className=\"size-4 shrink-0 text-foreground/40 group-hover:translate-x-0.5 transition-transform\"\n />\n </button>\n ))}\n\n {/* Deprecated category — only shown when user has deprecated installed nodes */}\n {deprecatedInstallations.length > 0 && (\n <button\n onClick={() => setShowDeprecated(true)}\n className=\"w-full flex items-center gap-3 px-2 py-3 rounded-lg border border-transparent hover:border-default hover:bg-muted/60 transition-colors text-left group\"\n >\n <div\n className=\"size-9 shrink-0 rounded-lg flex items-center justify-center\"\n style={{\n backgroundColor:\n \"var(--color-status-warning-bgSubtle, color-mix(in oklab, #f59e0b 16%, transparent))\",\n }}\n >\n <Icon\n icon=\"mynaui:circle-warning\"\n className=\"size-5\"\n style={{\n color: \"var(--color-status-warning-text, #d97706)\",\n }}\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p\n className=\"text-sm font-medium group-hover:text-primary transition-colors\"\n style={{\n color: \"var(--color-status-warning-text, #d97706)\",\n }}\n >\n Deprecated\n </p>\n <p className=\"text-xs text-muted-foreground truncate mt-0.5\">\n {deprecatedInstallations.length} node\n {deprecatedInstallations.length !== 1 ? \"s\" : \"\"} no longer\n supported\n </p>\n </div>\n <Icon\n icon=\"mynaui:chevron-right\"\n className=\"size-4 shrink-0 text-foreground/40 group-hover:translate-x-0.5 transition-transform\"\n />\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Input } from \"../../../../../../../../../ui/input\";\nimport type { CategoryItem } from \"../store-categories\";\nimport type { BrowseWorkflowNodesQuery } from \"../../../../../../../../../generated/global-operations\";\nimport {\n useStoreNodes,\n useInstalledNodes,\n} from \"../../../../../../../../../hooks/store\";\nimport { getStoreNodeAvailability } from \"../../../../../store/store-node-availability\";\nimport { StoreNodeListItem } from \"./store-node-list-item\";\n\ntype StoreProductResult =\n BrowseWorkflowNodesQuery[\"browseStore\"][\"products\"][number];\n\ninterface StoreCategoryNodesProps {\n category: CategoryItem;\n onBack: () => void;\n onSelectNode: (node: StoreProductResult) => void;\n}\n\nexport function StoreCategoryNodes({\n category,\n onBack,\n onSelectNode,\n}: StoreCategoryNodesProps) {\n const [searchTerm, setSearchTerm] = useState(\"\");\n\n const { products, loading, hasMore, fetchMore } = useStoreNodes({\n filter: {\n type: \"NODE\",\n compatibleWith: \"fluidgrids\",\n category: category.key || undefined,\n search: searchTerm.trim() || undefined,\n },\n });\n\n const { installedAppIds, installationsMap } = useInstalledNodes();\n\n return (\n <div className=\"flex flex-col h-full overflow-hidden\">\n {/* Header */}\n <div className=\"px-3 pt-3 pb-2 shrink-0\">\n <button\n onClick={onBack}\n className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground mb-3 transition-colors\"\n >\n <Icon icon=\"mynaui:chevron-left\" className=\"size-3.5\" />\n Back\n </button>\n\n <div className=\"flex items-center gap-2.5 mb-3\">\n <div className=\"size-8 shrink-0 rounded-lg bg-muted flex items-center justify-center\">\n <Icon icon={category.icon} className=\"size-4 text-primary\" />\n </div>\n <div className=\"min-w-0\">\n <h3 className=\"text-sm font-semibold text-foreground leading-tight\">\n {category.label}\n </h3>\n <p className=\"text-xs text-muted-foreground truncate\">\n {category.description}\n </p>\n </div>\n </div>\n\n {/* Search within category */}\n <div className=\"relative\">\n <Icon\n icon=\"mynaui:search\"\n className=\"absolute left-2.5 top-1/2 -translate-y-1/2 size-4 text-muted-foreground pointer-events-none\"\n />\n <Input\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder={`Search in ${category.label}...`}\n className=\"pl-8 text-sm h-9\"\n />\n {searchTerm && (\n <button\n onClick={() => setSearchTerm(\"\")}\n className=\"absolute right-2.5 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors\"\n >\n <Icon icon=\"mynaui:x\" className=\"size-3.5\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Node list */}\n <div className=\"flex-1 overflow-y-auto px-2 pb-2\">\n {loading && products.length === 0 ? (\n <div className=\"flex items-center justify-center py-10\">\n <Icon\n icon=\"mynaui:spinner\"\n className=\"size-5 text-primary animate-spin\"\n />\n </div>\n ) : products.length === 0 ? (\n <div className=\"text-center py-10 px-4\">\n <p className=\"text-sm text-muted-foreground\">\n {searchTerm\n ? `No nodes found for \"${searchTerm}\"`\n : \"No nodes in this category yet\"}\n </p>\n </div>\n ) : (\n <div className=\"flex flex-col gap-0.5\">\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground font-medium\">\n {products.length} node{products.length !== 1 ? \"s\" : \"\"}\n {searchTerm ? ` matching \"${searchTerm}\"` : \"\"}\n </p>\n {products.map((node) => {\n const installation = installationsMap.get(node.id);\n const isInstalled = installedAppIds.has(node.id);\n const hasUpdate =\n isInstalled &&\n !!installation?.installedVersion &&\n !!node.manifestVersion &&\n installation.installedVersion !== node.manifestVersion;\n const { nodeType, isPrebuilt, isDraggable } =\n getStoreNodeAvailability(node, isInstalled);\n\n return (\n <StoreNodeListItem\n key={node.id}\n name={node.name}\n description={node.description}\n icon={node.icon}\n isInstalled={isInstalled}\n isPrebuilt={isPrebuilt}\n hasUpdate={hasUpdate}\n nodeType={nodeType}\n isDraggable={isDraggable}\n onClick={() => onSelectNode(node)}\n />\n );\n })}\n {hasMore && (\n <button\n onClick={fetchMore}\n className=\"w-full mt-2 py-2 text-xs text-primary hover:text-primary/80 font-medium transition-colors\"\n >\n Load more\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n );\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 { useCallback, useEffect, useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport {\n NODE_TYPE_DRAG_DATA_FORMAT,\n NODE_OPERATION_DRAG_DATA_FORMAT,\n} from \"../../../../../../../../contants/symbols\";\nimport { NODE_CONFIGS, onNodeTypesUpdate } from \"../../../..\";\nimport type { NodeOperation } from \"../../../../nodes/node/node\";\n\n/** Operation shape enriched with the optional manifest fields we surface here. */\ntype StoreOperation = NodeOperation & {\n description?: string;\n role?: string;\n delivery?: string;\n};\n\ninterface StoreNodeOperationsProps {\n /** Resolved node type (e.g. \"store/gmail_reader\"); undefined until installed. */\n nodeType: string | undefined;\n}\n\nfunction isTriggerOperation(op: StoreOperation): boolean {\n return op.role === \"trigger\" || !!op.delivery || op.type === \"subscription\";\n}\n\n/**\n * Operations a user may actually pick.\n *\n * Two kinds of operation are plumbing and must never reach the picker:\n * - `isAdapterOperation` (supplyModel / supplyTool / supplyMemory …) — invoked\n * automatically by the executor when the node is attached to an adapter port\n * (the n8n `supplyData` equivalent). The user's selection is ignored for\n * these, so offering them is misleading.\n * - `internal` (e.g. the AI Agent's planStep) — driven by the executor loop.\n */\nexport function userSelectableOperations(\n ops: readonly StoreOperation[] | undefined,\n): StoreOperation[] {\n return (ops ?? []).filter(\n (op) => !op.isAdapterOperation && !(op as { internal?: boolean }).internal,\n );\n}\n\n/**\n * n8n-style operation picker shown in the Node Store node-detail view once a\n * node is installed. Each operation is an individual draggable row; dropping it\n * on the canvas inserts a node already pinned to that operation (the on-card\n * operation dropdown was removed). Operations are read from the in-memory node\n * registry (NODE_CONFIGS) which is populated on install / builder init.\n */\nexport function StoreNodeOperations({ nodeType }: StoreNodeOperationsProps) {\n // Re-render when the registry is (re)populated after install/refresh.\n const [, bump] = useState(0);\n useEffect(() => onNodeTypesUpdate(() => bump((n) => n + 1)), []);\n\n const config = nodeType\n ? NODE_CONFIGS.find((c) => c.type === nodeType)\n : undefined;\n // Adapter/internal operations are executor plumbing, never user choices.\n // Filtering here means a node whose ONLY operations are adapter ops (a pure\n // sub-node) falls through to the single \"Add to canvas\" row below — i.e. it\n // becomes a zero-operation node, matching n8n's sub-node model.\n const operations = userSelectableOperations(\n config?.operations as StoreOperation[] | undefined,\n );\n\n const handleDragStart = useCallback(\n (e: React.DragEvent<HTMLButtonElement>, opName?: string) => {\n if (!nodeType) return;\n e.dataTransfer.setData(NODE_TYPE_DRAG_DATA_FORMAT, nodeType);\n if (opName)\n e.dataTransfer.setData(NODE_OPERATION_DRAG_DATA_FORMAT, opName);\n e.dataTransfer.effectAllowed = \"move\";\n },\n [nodeType],\n );\n\n if (!nodeType) return null;\n\n // Nodes with no operations (e.g. self-configuring channel/conversation nodes)\n // are still addable as a single generic drag row — no operation to pin.\n if (operations.length === 0) {\n return (\n <div className=\"px-3 pt-3 pb-1\">\n <button\n draggable\n onDragStart={(e) => handleDragStart(e)}\n title=\"Drag to add to canvas\"\n className=\"w-full flex items-center gap-2.5 px-2 py-2 rounded-md hover:bg-muted/60 transition-colors text-left group\"\n style={{ cursor: \"grab\" }}\n >\n <div className=\"size-7 shrink-0 rounded-md bg-muted flex items-center justify-center\">\n <Icon icon=\"mynaui:plus\" className=\"size-3.5 text-primary\" />\n </div>\n <span className=\"flex-1 text-sm font-medium text-foreground group-hover:text-primary transition-colors\">\n Add to canvas\n </span>\n <Icon\n icon=\"mynaui:drag-dots-vertical\"\n className=\"size-4 shrink-0 text-foreground/40 group-hover:text-primary transition-colors\"\n />\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"px-3 pt-3 pb-1\">\n <p className=\"px-1 pb-2 text-xs font-medium text-muted-foreground\">\n Operations — drag one onto the canvas\n </p>\n <div className=\"flex flex-col gap-0.5\">\n {operations.map((op) => {\n const isTrigger = isTriggerOperation(op);\n return (\n <button\n key={op.name}\n draggable\n onDragStart={(e) => handleDragStart(e, op.name)}\n title={`${op.name} — drag to add to canvas`}\n className=\"w-full flex items-center gap-2.5 px-2 py-2 rounded-md hover:bg-muted/60 transition-colors text-left group\"\n style={{ cursor: \"grab\" }}\n >\n <div className=\"size-7 shrink-0 rounded-md bg-muted flex items-center justify-center\">\n <Icon\n icon={isTrigger ? \"solar:play-bold\" : \"mynaui:zap\"}\n className=\"size-3.5 text-primary\"\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-sm font-medium text-foreground group-hover:text-primary transition-colors truncate\">\n {op.name}\n </span>\n <span\n className=\"shrink-0 inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-semibold\"\n style={{\n background: isTrigger\n ? \"var(--color-status-info-bgSubtle)\"\n : \"var(--color-status-neutral-bgSubtle, var(--muted))\",\n color: isTrigger\n ? \"var(--color-status-info-text)\"\n : \"var(--muted-foreground)\",\n }}\n >\n {isTrigger ? \"Trigger\" : \"Action\"}\n </span>\n </div>\n {op.description && (\n <p className=\"text-xs text-muted-foreground truncate mt-0.5 leading-snug\">\n {op.description}\n </p>\n )}\n </div>\n <Icon\n icon=\"mynaui:drag-dots-vertical\"\n className=\"size-4 shrink-0 text-foreground/40 group-hover:text-primary transition-colors\"\n />\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useState, useContext } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"../../../../../../../../../ui/button\";\nimport type { BrowseWorkflowNodesQuery } from \"../../../../../../../../../generated/global-operations\";\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 type { WorkflowUsage } from \"../../../../../../../../../hooks/store/useNodeUsageInWorkflows\";\nimport { UninstallNodeDialog } from \"../../../../../store/UninstallNodeDialog\";\nimport { StoreNodeOperations } from \"./store-node-operations\";\nimport { FluidGridsContext } from \"../../../../../../../../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../../../../../../../../config\";\nimport { toast } from \"sonner\";\nimport { getStoreNodeAvailability } from \"../../../../../store/store-node-availability\";\nimport {\n Loader2,\n Star,\n Download,\n RefreshCw,\n Trash2,\n DollarSign,\n BadgeCheck,\n} from \"lucide-react\";\n\ntype StoreProductResult =\n BrowseWorkflowNodesQuery[\"browseStore\"][\"products\"][number];\n\ninterface StoreNodeDetailProps {\n node: StoreProductResult;\n onBack: () => void;\n}\n\nfunction formatDownloads(count: number): string {\n if (count >= 1_000_000) return `${(count / 1_000_000).toFixed(1)}M`;\n if (count >= 1_000) return `${(count / 1_000).toFixed(1)}k`;\n return count.toString();\n}\n\nexport function StoreNodeDetail({ node, onBack }: StoreNodeDetailProps) {\n const { installNode, installing } = useInstallNode();\n const { updateNode, updating } = useUpdateNode();\n const { uninstallNode, loading: uninstalling } = useUninstallNode();\n const { checkNodeUsage } = useNodeUsageInWorkflows();\n const { removeNodeFromWorkflows } = useRemoveNodeFromWorkflows();\n const { createOrder, creating: creatingOrder } = useCreateOrder();\n const {\n installedAppIds,\n installationsMap,\n refetch: refetchInstalledNodes,\n } = useInstalledNodes();\n const { refreshAvailableNodes } = useRefreshAvailableNodes();\n\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: WorkflowUsage[];\n }>({ isUsed: false, workflows: [] });\n\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n\n const isInstalled = installedAppIds.has(node.id);\n const { nodeType, isPrebuilt } = getStoreNodeAvailability(node, isInstalled);\n const installation = installationsMap.get(node.id);\n const installedVersion = installation?.installedVersion;\n const installationId = installation?.installationId;\n const latestVersion = node.manifestVersion;\n const hasUpdate =\n isInstalled &&\n !!installedVersion &&\n !!latestVersion &&\n installedVersion !== latestVersion;\n\n const isFree = node.pricingModel === \"FREE\";\n const isPurchased = node.isPurchased === true;\n const canInstall = !isPrebuilt && (isFree || isPurchased);\n const isInstalling = installing === node.id;\n const isUpdating = updating === node.id;\n\n const handleInstall = async () => {\n const result = await installNode(node as StoreProduct);\n if (result.success) {\n toast.success(\"Node installed!\", {\n description: `${node.name} is now available in your workflow builder.`,\n });\n await refreshAvailableNodes();\n await refetchInstalledNodes();\n } else {\n toast.error(\"Installation failed\", {\n description: result.error || \"Please try again.\",\n });\n }\n };\n\n const handleUpdate = async () => {\n if (!installationId) {\n toast.error(\"Cannot update node\", {\n description: \"Installation ID not found. Please reinstall.\",\n });\n return;\n }\n const result = await updateNode(node as StoreProduct, installationId);\n if (result.success) {\n toast.success(\"Node updated!\", {\n description: `${node.name} updated to v${latestVersion}.`,\n });\n await refreshAvailableNodes();\n await refetchInstalledNodes();\n } else {\n toast.error(\"Update failed\", {\n description: result.error || \"Please try again.\",\n });\n }\n };\n\n const handleUninstallClick = async () => {\n if (!installationId || !workspaceId) return;\n try {\n setCheckingNodeUsage(true);\n const usage = await checkNodeUsage(\n workspaceId,\n node.name,\n installedVersion || latestVersion || \"1.0.0\",\n );\n setNodeUsage(usage);\n setShowUninstallDialog(true);\n } catch {\n toast.error(\"Failed to check node usage. Please try again.\");\n } finally {\n setCheckingNodeUsage(false);\n }\n };\n\n const handleConfirmUninstall = async () => {\n if (!workspaceId) return;\n try {\n if (nodeUsage.isUsed && nodeUsage.workflows.length > 0) {\n setRemovingFromWorkflows(true);\n const removeResult = await removeNodeFromWorkflows(\n node.name,\n installedVersion || latestVersion || \"1.0.0\",\n nodeUsage.workflows.map((wf) => wf.id),\n );\n if (!removeResult.success) {\n throw new Error(\"Failed to remove node from workflows\");\n }\n setRemovingFromWorkflows(false);\n }\n\n const result = await uninstallNode({ productId: node.id, workspaceId });\n if (result) {\n toast.success(\"Node uninstalled\", {\n description: `${node.name} has been removed from your workspace.`,\n });\n setShowUninstallDialog(false);\n await refreshAvailableNodes();\n await refetchInstalledNodes();\n } else {\n throw new Error(\"Uninstall failed\");\n }\n } catch (err) {\n toast.error(\"Uninstall failed\", {\n description: err instanceof Error ? err.message : \"Please try again.\",\n });\n } finally {\n setRemovingFromWorkflows(false);\n }\n };\n\n const handlePurchase = async () => {\n try {\n toast.info(\"Creating order\", {\n description: `Preparing checkout for ${node.name}...`,\n });\n const unitPrice = node.price || 0;\n const result = await createOrder({\n total: unitPrice,\n lineItems: [\n {\n productId: node.id,\n name: node.name,\n quantity: 1,\n unitPrice,\n subtotal: unitPrice,\n itemType: \"DIGITAL\",\n pricingModel: node.pricingModel || \"PAID_ONETIME\",\n version: node.manifestVersion || undefined,\n },\n ],\n billingAccountId: \"\",\n });\n if (result.success && result.order?.id) {\n window.location.href = `/billing/checkout/store/${result.order.id}`;\n } else {\n throw new Error(result.error || \"Failed to create order\");\n }\n } catch (err) {\n toast.error(\"Failed to start checkout\", {\n description: err instanceof Error ? err.message : \"Please try again.\",\n });\n }\n };\n\n return (\n <div className=\"flex flex-col h-full overflow-hidden\">\n {/* Back button */}\n <div className=\"px-3 pt-3 pb-1 shrink-0\">\n <button\n onClick={onBack}\n className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n >\n <Icon icon=\"mynaui:chevron-left\" className=\"size-3.5\" />\n Back\n </button>\n </div>\n\n {/* Scrollable content */}\n <div className=\"flex-1 overflow-y-auto px-3 pb-2\">\n {/* Icon + name */}\n <div className=\"flex flex-col items-center text-center py-4\">\n <div className=\"size-16 rounded-xl bg-muted flex items-center justify-center overflow-hidden mb-3\">\n {node.icon ? (\n <img\n src={node.icon}\n alt={node.name}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <span className=\"text-2xl font-bold text-muted-foreground\">\n {node.name.charAt(0).toUpperCase()}\n </span>\n )}\n </div>\n <h2 className=\"text-base font-semibold text-foreground leading-tight\">\n {node.name}\n </h2>\n {(node.authorName || node.publisher?.name) && (\n <p className=\"text-xs text-muted-foreground mt-1 flex items-center gap-1\">\n by {node.authorName || node.publisher?.name}\n {node.publisher?.isVerified && (\n <BadgeCheck className=\"size-3.5 text-primary\" />\n )}\n </p>\n )}\n </div>\n\n {/* Status badges */}\n {(isInstalled || isPrebuilt || hasUpdate || node.featured) && (\n <div className=\"flex items-center justify-center gap-2 mb-4 flex-wrap\">\n {hasUpdate && (\n <span\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-semibold\"\n style={{\n background: \"var(--color-status-warning-bgSubtle)\",\n color: \"var(--color-status-warning-text)\",\n }}\n >\n <Icon icon=\"mynaui:refresh\" className=\"size-3\" />\n Update available — v{latestVersion}\n </span>\n )}\n {isInstalled && !hasUpdate && (\n <span\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-semibold\"\n style={{\n background: \"var(--color-status-success-bgSubtle)\",\n color: \"var(--color-status-success-text)\",\n }}\n >\n <span\n className=\"size-1.5 rounded-full\"\n style={{ background: \"var(--color-status-success-bg)\" }}\n />\n Installed{installedVersion ? ` v${installedVersion}` : \"\"}\n </span>\n )}\n {isPrebuilt && (\n <span\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-semibold\"\n style={{\n background: \"var(--color-status-info-bgSubtle)\",\n color: \"var(--color-status-info-text)\",\n }}\n >\n <span\n className=\"size-1.5 rounded-full\"\n style={{ background: \"var(--color-status-info-bg)\" }}\n />\n Prebuilt\n </span>\n )}\n {node.featured && !isInstalled && (\n <span className=\"inline-flex items-center gap-1 px-2 py-1 rounded-full text-xs font-semibold bg-primary/10 text-primary\">\n Featured\n </span>\n )}\n </div>\n )}\n\n {/* Stats row */}\n <div className=\"flex items-center justify-center gap-4 text-xs text-muted-foreground mb-4\">\n {node.rating != null && (\n <span className=\"flex items-center gap-1\">\n <Star className=\"size-3 fill-yellow-400 text-yellow-400\" />\n {node.rating.toFixed(1)}\n <span className=\"opacity-60\">({node.reviewCount ?? 0})</span>\n </span>\n )}\n <span className=\"flex items-center gap-1\">\n <Download className=\"size-3\" />\n {formatDownloads(node.downloads ?? 0)}\n </span>\n {latestVersion && (\n <span className=\"opacity-80\">v{latestVersion}</span>\n )}\n </div>\n\n {/* Description */}\n {node.description && (\n <p className=\"text-sm text-foreground/80 leading-relaxed mb-4\">\n {node.description}\n </p>\n )}\n\n {/* Operations picker — only once installed. Drag an operation onto the\n canvas to add a node pinned to it (n8n-style). */}\n {(isInstalled || isPrebuilt) && (\n <div className=\"mb-4 -mx-3 rounded-lg border border-border/50\">\n <StoreNodeOperations nodeType={nodeType} />\n </div>\n )}\n\n {/* Publisher info */}\n {node.publisher && (\n <div className=\"mb-4 p-2.5 rounded-lg bg-muted/50 flex items-center gap-2\">\n <div className=\"size-6 rounded bg-muted flex items-center justify-center shrink-0\">\n <span className=\"text-xs font-bold text-muted-foreground\">\n {node.publisher.name.charAt(0)}\n </span>\n </div>\n <span className=\"text-xs text-foreground font-medium flex-1 min-w-0 truncate\">\n {node.publisher.name}\n </span>\n {node.publisher.isVerified && (\n <BadgeCheck className=\"size-4 text-primary shrink-0\" />\n )}\n </div>\n )}\n\n {/* License */}\n {node.license && (\n <p className=\"text-xs text-muted-foreground mb-4\">\n License:{\" \"}\n <span className=\"font-medium text-foreground/70\">\n {node.license}\n </span>\n </p>\n )}\n\n {/* Compatible products */}\n {node.compatibleProducts && node.compatibleProducts.length > 0 && (\n <div className=\"mb-2\">\n <p className=\"text-xs text-muted-foreground mb-1.5\">\n Compatible with\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {node.compatibleProducts.map((p) => (\n <span\n key={p}\n className=\"px-2 py-0.5 rounded-full text-xs bg-muted text-muted-foreground\"\n >\n {p}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Action buttons — sticky footer */}\n <div className=\"shrink-0 px-3 pb-3 pt-2 border-t border-border/50 flex flex-col gap-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.5 mr-1.5 animate-spin\" />\n Updating...\n </>\n ) : (\n <>\n <RefreshCw className=\"size-3.5 mr-1.5\" />\n Update to v{latestVersion}\n </>\n )}\n </Button>\n )}\n\n {isInstalled ? (\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 || removingFromWorkflows ? (\n <>\n <Loader2 className=\"size-3.5 mr-1.5 animate-spin\" />\n Uninstalling...\n </>\n ) : checkingNodeUsage ? (\n <>\n <Loader2 className=\"size-3.5 mr-1.5 animate-spin\" />\n Checking usage...\n </>\n ) : (\n <>\n <Trash2 className=\"size-3.5 mr-1.5\" />\n Uninstall\n </>\n )}\n </Button>\n ) : isPrebuilt ? (\n <div\n className=\"w-full rounded-md px-3 py-2 text-center text-sm font-medium\"\n style={{\n background: \"var(--color-status-info-bgSubtle)\",\n color: \"var(--color-status-info-text)\",\n }}\n >\n Prebuilt — drag operations above onto the canvas\n </div>\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.5 mr-1.5 animate-spin\" />\n Installing...\n </>\n ) : (\n \"Install\"\n )}\n </Button>\n ) : (\n <Button\n size=\"sm\"\n className=\"w-full\"\n onClick={handlePurchase}\n disabled={creatingOrder}\n >\n {creatingOrder ? (\n <>\n <Loader2 className=\"size-3.5 mr-1.5 animate-spin\" />\n Creating order...\n </>\n ) : (\n <>\n <DollarSign className=\"size-3.5 mr-1.5\" />$\n {node.price?.toFixed(2) ?? \"0.00\"}\n </>\n )}\n </Button>\n )}\n </div>\n\n {showUninstallDialog && (\n <UninstallNodeDialog\n nodeName={node.name}\n nodeType={node.name}\n isUsed={nodeUsage.isUsed}\n workflows={nodeUsage.workflows}\n loading={uninstalling || removingFromWorkflows}\n onConfirm={handleConfirmUninstall}\n onCancel={() => setShowUninstallDialog(false)}\n />\n )}\n </div>\n );\n}\n","import { useState, useCallback, useEffect } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport SidebarPanelWrapper from \"../../components/sidebar-panel-wrapper\";\nimport type { CategoryItem } from \"./store-categories\";\nimport type { BrowseWorkflowNodesQuery } from \"../../../../../../../../generated/global-operations\";\nimport { ensureNodeConfigsLoaded, isNodeConfigsInitialized } from \"../../..\";\nimport { StoreCategoryList } from \"./components/store-category-list\";\nimport { StoreCategoryNodes } from \"./components/store-category-nodes\";\nimport { StoreNodeDetail } from \"./components/store-node-detail\";\n\ntype StoreProductResult =\n BrowseWorkflowNodesQuery[\"browseStore\"][\"products\"][number];\n\ntype StoreView =\n | { type: \"categories\" }\n | { type: \"category-nodes\"; category: CategoryItem }\n | {\n type: \"node-detail\";\n node: StoreProductResult;\n from:\n | { type: \"categories\" }\n | { type: \"category-nodes\"; category: CategoryItem };\n };\n\nexport default function StoreBrowsePanel() {\n const [view, setView] = useState<StoreView>({ type: \"categories\" });\n const [globalSearch, setGlobalSearch] = useState(\"\");\n // Track node config load state so children re-render once AVAILABLE_NODES is ready\n const [, setNodesReady] = useState(isNodeConfigsInitialized);\n\n useEffect(() => {\n void ensureNodeConfigsLoaded().then(() => setNodesReady(true));\n }, []);\n\n const openCategory = useCallback((category: CategoryItem) => {\n setView({ type: \"category-nodes\", category });\n setGlobalSearch(\"\");\n }, []);\n\n const openNodeDetail = useCallback((node: StoreProductResult) => {\n setView((prev) => ({\n type: \"node-detail\",\n node,\n from: prev.type === \"node-detail\" ? prev.from : prev,\n }));\n }, []);\n\n const goBack = useCallback(() => {\n setView((prev) => {\n if (prev.type === \"node-detail\") return prev.from;\n return { type: \"categories\" };\n });\n }, []);\n\n return (\n <SidebarPanelWrapper>\n {/* Panel header — only shown on categories root view */}\n {view.type === \"categories\" && (\n <div className=\"px-4 pt-4 pb-2 shrink-0 flex items-center gap-2\">\n <div className=\"size-7 flex items-center justify-center rounded-lg bg-primary\">\n <Icon icon=\"mynaui:store\" className=\"size-4 text-white\" />\n </div>\n <div>\n <p className=\"text-sm font-semibold text-foreground leading-tight\">\n Node Store\n </p>\n <p className=\"text-xs text-muted-foreground\">\n Browse & install workflow nodes\n </p>\n </div>\n </div>\n )}\n\n <div className=\"flex-1 overflow-hidden flex flex-col\">\n {view.type === \"categories\" && (\n <StoreCategoryList\n searchTerm={globalSearch}\n onSearchChange={setGlobalSearch}\n onSelectCategory={openCategory}\n onSelectNode={openNodeDetail}\n />\n )}\n {view.type === \"category-nodes\" && (\n <StoreCategoryNodes\n category={view.category}\n onBack={goBack}\n onSelectNode={openNodeDetail}\n />\n )}\n {view.type === \"node-detail\" && (\n <StoreNodeDetail node={view.node} onBack={goBack} />\n )}\n </div>\n </SidebarPanelWrapper>\n );\n}\n","import type { ComponentType } from \"react\";\nimport { NodePropertiesPanel } from \"../panels/node-properties/node-properties-panel\";\nimport StoreBrowsePanel from \"../panels/store-browse/store-browse-panel\";\n\nexport const PANEL_COMPONENTS: Record<\n \"node-properties\" | \"store-browse\" | \"none\",\n ComponentType\n> = {\n \"node-properties\": NodePropertiesPanel,\n \"store-browse\": StoreBrowsePanel,\n none: () => null,\n};\n","import { PANEL_COMPONENTS } from \"../constants/panels\";\n\ntype SwitchSidebarPanelProps = Readonly<{\n active: \"node-properties\" | \"store-browse\" | \"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 { 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 { 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 { TemplatesModal } from \"../../../templates/TemplatesModal\";\nimport { Sparkles } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport type {\n StoreProduct,\n InputMaybe,\n ProductType,\n StoreSortBy,\n} from \"../../../../../../../generated/global-types\";\nimport type {\n WorkflowTemplateContent,\n TemplateNodeCheckResult,\n} from \"../../../../../../../types/workflow-template-content\";\nimport { useInstalledNodes } from \"../../../../../../../hooks/store/useInstalledNodes\";\n\nimport { throwIfResultError } from \"../../../../../../../graphql/errors\";\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\" | \"store-browse\" | \"none\";\n setActivePanel: (panel: \"node-properties\" | \"store-browse\" | \"none\") => void;\n}>;\n\nexport function DesktopSidebarFragment({\n activePanel,\n setActivePanel,\n}: DesktopSidebarFragmentProps) {\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 const [installProgress, setInstallProgress] = useState<{\n current: number;\n total: number;\n nodeName: string;\n } | null>(null);\n\n const navigate = useNavigate();\n const { installedAppIds } = useInstalledNodes();\n\n /**\n * Build the node check result from template content + currently installed nodes.\n * Uses real installed-app IDs to classify nodes as installed / missing / missingPaid.\n */\n const buildNodeCheck = useCallback(\n (content: WorkflowTemplateContent): TemplateNodeCheckResult => {\n const allNodes = content.requiredNodeTypes || [];\n const installed = allNodes.filter(\n (n) =>\n n.publishType === \"BUILTIN\" ||\n (n.storeProductId && installedAppIds.has(n.storeProductId)),\n );\n const notInstalled = allNodes.filter(\n (n) =>\n n.publishType !== \"BUILTIN\" &&\n (!n.storeProductId || !installedAppIds.has(n.storeProductId)),\n );\n const missing = notInstalled.filter((n) => !n.requiresPurchase);\n const missingPaid = notInstalled.filter((n) => !!n.requiresPurchase);\n return {\n installed,\n missing,\n missingPaid,\n canImport: missingPaid.length === 0,\n };\n },\n [installedAppIds],\n );\n\n /**\n * Perform the actual import of a template.\n *\n * Flow:\n * 1. Install missing free nodes one-by-one (with progress updates)\n * 2. Create the workflow via importWorkflowTemplate mutation\n * 3. Record template installation in the store\n * 4. Navigate to the new workflow in the builder\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 nodeCheck?: TemplateNodeCheckResult | null,\n ) => {\n try {\n setImporting(true);\n\n // Step 1: Install missing free nodes sequentially with progress\n const nodesToInstall = (nodeCheck?.missing ?? []).filter(\n (n) => !!n.storeProductId,\n );\n\n if (nodesToInstall.length > 0) {\n const { getGlobalStoreClient: getStore } =\n await import(\"../../../../../../../graphql/global-client\");\n const { InstallWorkflowNodeDocument } =\n await import(\"../../../../../../../generated/global-operations\");\n const { getFluidGridsConfig } =\n await import(\"../../../../../../../config\");\n\n const storeClient = getStore();\n const cfg = getFluidGridsConfig();\n\n for (let i = 0; i < nodesToInstall.length; i++) {\n const node = nodesToInstall[i];\n setInstallProgress({\n current: i + 1,\n total: nodesToInstall.length,\n nodeName: node.displayName || node.nodeType,\n });\n\n try {\n if (storeClient) {\n throwIfResultError(\n await storeClient.mutate({\n mutation: InstallWorkflowNodeDocument,\n variables: {\n input: {\n productId: node.storeProductId!,\n workspaceId: cfg.workspaceId,\n organizationId: cfg.tenantId,\n version: node.nodeVersion,\n manifest: null,\n },\n },\n }),\n );\n }\n } catch (nodeErr) {\n console.warn(\n `[performImport] Failed to install node ${node.nodeType}:`,\n nodeErr,\n );\n }\n }\n\n setInstallProgress(null);\n }\n\n // Step 2: Create the workflow from the template\n toast.loading(\"Creating workflow...\", { id: \"template-import\" });\n\n // Apply template inputs if provided\n // Normalize: some templates store a nested API response as definitionJson\n // (e.g. { data: { workflowDefinition: { definitionJson: <actual canvas> } } }).\n // Unwrap to get the actual canvas state.\n const rawDef = JSON.parse(\n JSON.stringify(content.definitionJson),\n ) as Record<string, unknown>;\n const nestedDef = (\n rawDef as {\n data?: { workflowDefinition?: { definitionJson?: unknown } };\n }\n )?.data?.workflowDefinition?.definitionJson;\n let definitionJson = (\n nestedDef && typeof nestedDef === \"object\" ? nestedDef : rawDef\n ) as Record<string, unknown>;\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 = throwIfResultError(\n await client.mutate({\n mutation: IMPORT_MUTATION,\n variables: {\n input: {\n definitionJson,\n name:\n overrides?.name ||\n content.defaultWorkflowName ||\n 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\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 // Step 3: Record template installation in store\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 throwIfResultError(\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 }\n } catch {\n // Best-effort: don't fail import if installation recording fails\n console.warn(\n \"[performImport] Failed to record template installation\",\n );\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 // Step 4: Navigate to the newly created workflow\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 setInstallProgress(null);\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 \"Use Template\" click from the TemplatesModal.\n *\n * Flow:\n * 1. Fetch full template detail from the store\n * 2. Parse content, check node dependencies against installed nodes\n * 3. If template has required inputs, missing nodes, or credentials -> show config modal\n * 4. Otherwise -> import directly\n */\n const handleUseTemplate = useCallback(\n async (template: StoreProduct) => {\n try {\n toast.loading(\"Loading template...\", { id: \"template-load\" });\n\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 manifestVersion\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 — WORKFLOW apps may store canvas in manifest rather than content.definitionJson\n let content = fullTemplate.content as WorkflowTemplateContent | null;\n if (!content?.definitionJson) {\n const m = fullTemplate.manifest as Record<string, unknown> | null;\n let nodes:\n WorkflowTemplateContent[\"definitionJson\"][\"nodes\"] | undefined;\n let edges: WorkflowTemplateContent[\"definitionJson\"][\"edges\"] = [];\n let workflowName: string | undefined;\n\n if (m) {\n if (Array.isArray(m.nodes)) {\n // manifest has flat { nodes, edges } — direct canvas format\n nodes =\n m.nodes as WorkflowTemplateContent[\"definitionJson\"][\"nodes\"];\n edges = (m.edges ??\n []) as WorkflowTemplateContent[\"definitionJson\"][\"edges\"];\n workflowName = m.name as string | undefined;\n } else if (typeof m.jsonContent === \"string\") {\n // manifest.jsonContent is a JSON string (Store Listing JSON editor)\n try {\n const parsed = JSON.parse(m.jsonContent) as Record<\n string,\n unknown\n >;\n if (Array.isArray(parsed.nodes)) {\n nodes =\n parsed.nodes as WorkflowTemplateContent[\"definitionJson\"][\"nodes\"];\n edges = (parsed.edges ??\n []) as WorkflowTemplateContent[\"definitionJson\"][\"edges\"];\n workflowName = parsed.name as string | undefined;\n }\n } catch {\n /* ignore */\n }\n }\n }\n\n if (nodes) {\n // Auto-detect which node types in this workflow are not yet installed.\n // We check NODE_CONFIGS (populated with builtin + installed store nodes)\n // and query the store for storeProductId on any missing types, so the\n // TemplateConfigurationModal can offer one-click installation.\n const requiredNodeTypes: WorkflowTemplateContent[\"requiredNodeTypes\"] =\n [];\n try {\n const { NODE_CONFIGS, ensureNodeConfigsLoaded } =\n await import(\"../../\");\n await ensureNodeConfigsLoaded().catch(() => {});\n\n const workflowNodeTypes = [\n ...new Set(\n (nodes as Array<{ type?: string }>)\n .map((n) => n.type)\n .filter((t): t is string => Boolean(t)),\n ),\n ];\n\n const missingTypes = workflowNodeTypes.filter(\n (type) => !NODE_CONFIGS.some((c) => c.type === type),\n );\n\n if (missingTypes.length > 0) {\n // Fetch all FluidGrids-compatible store nodes to resolve\n // missing type strings to their storeProductId values.\n const { BrowseWorkflowNodesDocument } =\n await import(\"../../../../../../../generated/global-operations\");\n const storeResult = await client.query({\n query: BrowseWorkflowNodesDocument,\n variables: {\n input: {\n filter: {\n type: \"NODE\" as InputMaybe<ProductType>,\n compatibleWith: \"fluidgrids\",\n },\n sortBy: \"DOWNLOADS\" as InputMaybe<StoreSortBy>,\n pagination: { limit: 200, offset: 0 },\n },\n },\n fetchPolicy: \"cache-first\",\n });\n\n const storeNodes =\n (\n storeResult.data as {\n browseStore?: { products?: StoreProduct[] };\n }\n )?.browseStore?.products ?? [];\n\n // Map nodeType string → store product via manifest.nodeType\n const nodeTypeToProduct = new Map<string, StoreProduct>();\n for (const product of storeNodes) {\n const mNodeType = (\n product.manifest as Record<string, unknown> | null\n )?.nodeType as string | undefined;\n if (mNodeType) nodeTypeToProduct.set(mNodeType, product);\n }\n\n for (const type of workflowNodeTypes) {\n const isInstalled = NODE_CONFIGS.some((c) => c.type === type);\n if (isInstalled) {\n // Already installed/builtin — mark BUILTIN so buildNodeCheck\n // places it in the \"installed\" bucket.\n requiredNodeTypes.push({\n nodeType: type,\n nodeVersion: \"1.0\",\n publishType: \"BUILTIN\",\n displayName: type,\n });\n } else {\n const product = nodeTypeToProduct.get(type);\n requiredNodeTypes.push({\n nodeType: type,\n nodeVersion: product?.manifestVersion ?? \"1.0\",\n publishType: \"STORE\",\n storeProductId: product?.id,\n displayName: product?.name ?? type,\n requiresPurchase:\n product !== undefined &&\n product.pricingModel !== \"FREE\",\n });\n }\n }\n }\n } catch {\n // NODE_CONFIGS check or store query failed — skip dependency check\n }\n\n content = {\n definitionJson: { nodes, edges },\n requiredNodeTypes,\n defaultWorkflowName: workflowName ?? fullTemplate.name,\n };\n } else {\n toast.error(\"Template does not contain valid workflow data\");\n return;\n }\n }\n\n // Check node dependencies against actually-installed nodes\n const nodeCheck = buildNodeCheck(content);\n\n const needsConfig =\n (content.requiredInputs && content.requiredInputs.length > 0) ||\n nodeCheck.missing.length > 0 ||\n nodeCheck.missingPaid.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(nodeCheck);\n setConfigModalOpen(true);\n setTemplatesModalOpen(false);\n } else {\n // Direct import — no config needed, all nodes installed\n setTemplatesModalOpen(false);\n await performImport(fullTemplate, content, undefined, nodeCheck);\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 [buildNodeCheck, performImport],\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 // Guard: paid blockers should have disabled the button, but double-check\n if (configNodeCheck && !configNodeCheck.canImport) return;\n\n await performImport(\n configTemplate,\n configContent,\n config,\n configNodeCheck,\n );\n\n setConfigModalOpen(false);\n },\n [configTemplate, configContent, configNodeCheck, performImport],\n );\n\n return (\n <div className=\"relative max-w-sm w-fit flex shrink-0 divide-x divide-card-foreground/10 rounded-xl overflow-hidden border border-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 === \"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={activePanel === \"store-browse\"}\n onClick={() =>\n setActivePanel(\n activePanel === \"store-browse\" ? \"none\" : \"store-browse\",\n )\n }\n title=\"Browse custom nodes from the store\"\n >\n <Icon icon=\"mynaui: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 <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 installProgress={installProgress}\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 'Is True' / 'Is False'\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\" | \"type\" | \"enum\" | \"input\" | \"interface\" | \"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 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 // Curved (bezier) path + its label midpoint.\n const [edgePath, labelX, labelY] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\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: 2,\n };\n };\n\n const edgeStyle = getEdgeStyle();\n const isIdle = !isRunning && !isSuccess && !isError;\n\n // Flow-dash color follows the SOURCE node's role (trigger green / logic amber\n // / action blue) — matches the node accents so an edge reads as \"coming from\n // a trigger\", etc.\n const srcType = (sourceNodeData?.type || \"\").toLowerCase();\n const srcOpType = (\n (sourceNodeData?.data as { operation_type?: string } | undefined)\n ?.operation_type || \"\"\n ).toLowerCase();\n const srcIsTrigger = srcOpType === \"trigger\" || srcType.includes(\"trigger\");\n const srcIsLogic =\n /(if|switch|merge|loop|filter|branch|router|condition|aggregate)/.test(\n srcType,\n );\n const flowAccent = srcIsTrigger\n ? \"#10b981\"\n : srcIsLogic\n ? \"#f59e0b\"\n : \"#3b82f6\";\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. When idle it's just a faint accent-colored track so\n the animated marching dash below reads clearly (a thick grey base made\n the flow hard to see). */}\n <path\n id={id}\n className={edgeClassName}\n d={edgePath}\n fill=\"none\"\n style={\n isIdle\n ? { stroke: flowAccent, strokeWidth: 1.25, strokeOpacity: 0.22 }\n : edgeStyle\n }\n markerEnd={markerEnd}\n />\n {/* Idle: always-on flowing dash in the source node's accent (marching\n ants). Inline SMIL animation (not a CSS class) so it works regardless\n of which build's CSS the host app loaded. */}\n {isIdle && (\n <path\n d={edgePath}\n fill=\"none\"\n stroke={flowAccent}\n strokeWidth={2}\n strokeDasharray=\"6 8\"\n style={{ pointerEvents: \"none\" }}\n >\n <animate\n attributeName=\"stroke-dashoffset\"\n values=\"0;-14\"\n dur=\"0.55s\"\n repeatCount=\"indefinite\"\n />\n </path>\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=\">\">></SelectItem>\n <SelectItem value=\">=\">>=</SelectItem>\n <SelectItem value=\"<\"><</SelectItem>\n <SelectItem value=\"<=\"><=</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 {\n NODE_TYPE_DRAG_DATA_FORMAT,\n NODE_OPERATION_DRAG_DATA_FORMAT,\n} 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 // Optional: operation the node should be pinned to (set by Node Store\n // operation rows). Empty string when dragging a generic node.\n const operationName =\n e.dataTransfer.getData(NODE_OPERATION_DRAG_DATA_FORMAT) || undefined;\n\n insertNode(\n type as BuilderNode,\n screenToFlowPosition({\n x: e.clientX,\n y: e.clientY,\n }),\n operationName,\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","import { useCallback } from \"react\";\nimport { useReactFlow } from \"@xyflow/react\";\nimport { buildStickyNode } from \"../components/flow-builder/components/blocks/nodes/sticky-note/sticky-note-node\";\n\n/**\n * Inserts a sticky note at (roughly) the viewport center. Deliberately bypasses\n * useInsertNode: stickies have no operations to pin and no registry defaults.\n * Same imperative addNodes path as useInsertNode, so store sync matches.\n */\nexport function useInsertStickyNote() {\n const { addNodes, getNodes, screenToFlowPosition, updateNode } =\n useReactFlow();\n\n return useCallback(() => {\n const position = screenToFlowPosition({\n x: window.innerWidth / 2,\n y: window.innerHeight / 2,\n });\n // Slight jitter so repeated inserts don't stack perfectly.\n position.x += Math.round((Math.random() - 0.5) * 40);\n position.y += Math.round((Math.random() - 0.5) * 40);\n\n getNodes().forEach((n) => {\n if (n.selected) updateNode(n.id, { selected: false });\n });\n\n const sticky = buildStickyNode(position);\n addNodes(sticky);\n return sticky;\n }, [addNodes, getNodes, screenToFlowPosition, updateNode]);\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, useEffect } 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\";\nimport { useInsertStickyNote } from \"../../../../hooks/use-insert-sticky-note\";\nimport { STICKY_NOTE_TYPE } from \"../../../../contants/symbols\";\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 const insertStickyNote = useInsertStickyNote();\n\n // Shift+S inserts a sticky note (n8n parity) — ignored while typing.\n useEffect(() => {\n if (isReadOnly) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (!e.shiftKey || e.key.toLowerCase() !== \"s\") return;\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n const t = e.target as HTMLElement | null;\n if (\n t &&\n (t.tagName === \"INPUT\" ||\n t.tagName === \"TEXTAREA\" ||\n t.isContentEditable)\n )\n return;\n e.preventDefault();\n insertStickyNote();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [insertStickyNote, isReadOnly]);\n\n // ── Tidy up: topological-sort-based left-to-right auto layout ────────────\n const tidyUp = useCallback(() => {\n // Sticky notes are free-floating annotations — auto-layout must not move\n // them into the graph grid.\n const nodes = getNodes().filter((n) => n.type !== STICKY_NOTE_TYPE);\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 {/* Add sticky note */}\n <ControlBtn\n title=\"Add sticky note (Shift+S)\"\n onClick={insertStickyNote}\n >\n <Icon icon=\"mdi:note-plus-outline\" 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 | undefined;\n // STORE nodes are multi-operation and can only be added from the Node Store\n // (drag a specific operation), so they are excluded from the edge-drop menu.\n const connectableNodes = AVAILABLE_NODES.filter(\n (node) => node.publishType !== \"STORE\",\n );\n return {\n availableNodes: mapNodesWithMetadata(\n fromHandleId === \"source\" || fromHandleId === \"target\"\n ? connectableNodes.map((node) => node.type)\n : connectableNodes\n .filter((node) =>\n node?.manifest?.kind?.includes(fromHandleId ?? \"\"),\n )\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\";\nimport { STICKY_NOTE_TYPE } from \"../contants/symbols\";\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/** Read the declared operations array, tolerating the `{ operations: [...] }` wrapper. */\nfunction readDeclaredOperations(\n nodeData: ChannelNodeData[\"nodeData\"],\n): Array<{ name?: string; role?: string }> {\n const ops = (nodeData as { operations?: unknown } | undefined)?.operations;\n if (Array.isArray(ops)) return ops as Array<{ name?: string; role?: string }>;\n const wrapped = (ops as { operations?: unknown } | undefined)?.operations;\n return Array.isArray(wrapped)\n ? (wrapped as Array<{ name?: string; role?: string }>)\n : [];\n}\n\n/**\n * Determine if a node acts as a trigger, accounting for role-based types.\n * integration/channel AND store/* nodes can be either a trigger (receive) or an\n * action (send) depending on their selected operation's role — e.g. the Gmail\n * Reader node (`store/gmail_reader`) is a trigger when its `onNewEmail`\n * (role: \"trigger\") operation is selected, and an action for `sendEmail`.\n */\nexport function isNodeTrigger(node: Node): boolean {\n if (isTriggerNodeType(node.type)) return true;\n const type = node.type ?? \"\";\n if (type === \"integration/channel\" || type.startsWith(\"store/\")) {\n const data = node.data as ChannelNodeData;\n // An explicit role override (top-level legacy or args.state.role) always wins.\n const explicitRole = data.role ?? data.args?.state?.role;\n if (explicitRole === \"trigger\") return true;\n if (explicitRole === \"action\") return false;\n // Otherwise resolve the selected operation's declared role from the manifest.\n const opName = data.operation_name;\n if (typeof opName === \"string\") {\n const op = readDeclaredOperations(data.nodeData).find(\n (o) => o.name === opName,\n );\n if (op?.role === \"trigger\") return true;\n if (op?.role === \"action\") return false;\n // Fallback heuristic for manifests that omit explicit roles.\n return 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 // Sticky notes are canvas annotations — no edges by design; they must\n // never fail lone-node validation or block save/run.\n if (node.type === STICKY_NOTE_TYPE) continue;\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","import { Button } from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport { useFlowValidator } from \"../../../../hooks/use-flow-validator\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { useSaveWorkflow } from \"../../../../hooks/use-save-workflow\";\nimport { SdkPermissionButton } from \"../../../../../permissions/PermissionsBridge\";\nimport { FLUIDGRIDS_PERMISSIONS } from \"../../../../../permissions/constants\";\n\nexport const SaveFlowButton = ({ className }: { className?: string }) => {\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 <SdkPermissionButton\n permission={[\n FLUIDGRIDS_PERMISSIONS.WORKFLOW_UPDATE,\n FLUIDGRIDS_PERMISSIONS.WORKFLOW_CREATE,\n ]}\n deniedTooltip=\"You don't have permission to save workflows\"\n >\n <Button\n onClick={validateFlow}\n disabled={isValidating || isSaving}\n variant={\"outline\"}\n size={\"sm\"}\n className={cn(\"flex gap-4\", className)}\n >\n <Icon icon=\"fluent:save-28-filled\" />\n {isSaving ? \"Saving...\" : \"Save\"}\n </Button>\n </SdkPermissionButton>\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 { cn } from \"@burdenoff/fe-libs/utils\";\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\";\nimport { SdkPermissionButton } from \"../../../../../permissions/PermissionsBridge\";\nimport { FLUIDGRIDS_PERMISSIONS } from \"../../../../../permissions/constants\";\n\nexport const ExecuteWorkflowButton = ({\n className,\n}: {\n className?: string;\n}) => {\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 <SdkPermissionButton\n permission={FLUIDGRIDS_PERMISSIONS.WORKFLOW_EXECUTE}\n deniedTooltip=\"You don't have permission to execute workflows\"\n >\n <Button\n onClick={validateFlow}\n disabled={isValidating || isExecuting}\n variant=\"default\"\n size=\"sm\"\n className={cn(\n \"flex items-center justify-center gap-2 h-8 rounded-l-lg rounded-r-none px-3 bg-[var(--color-status-success-bg)] hover:bg-[var(--color-status-success-bg)]/90 text-[var(--color-text-on-status)] font-medium\",\n className,\n )}\n >\n <Icon icon=\"mdi:play\" className=\"size-4\" />\n {isExecuting ? \"Running...\" : isValidating ? \"Validating...\" : \"Run\"}\n </Button>\n </SdkPermissionButton>\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 * Field-schema walker for the n8n-style NDV mapper.\n *\n * Builds a nested, draggable field tree from a node operation's\n * `input_fields` / `output_fields`. Handles BOTH shapes the platform uses:\n *\n * 1. Flat manifest fields (depth-1):\n * output_fields: { \"emails\": \"array\", \"error\": \"string\" }\n * input_fields: { \"query\": { type: \"string\", required: true } }\n *\n * 2. Nested JSON Schema (deep trees):\n * output_fields: {\n * emails: { type: \"array\", items: { type: \"object\",\n * properties: { subject: { type: \"string\" }, ... } } }\n * }\n *\n * The same component renders the result for the INPUT and OUTPUT panes.\n */\n\n/** A single node in the rendered field tree. */\nexport interface FieldNode {\n /** Display label for this field. */\n key: string;\n /**\n * Path relative to the operation output root, e.g. `emails[0].subject`.\n * The mapper turns this into the expression `${output.<path>}`.\n */\n path: string;\n /** Resolved type label (string | number | boolean | array | object | any). */\n type: string;\n required?: boolean;\n description?: string;\n /** Present for object/array branches. */\n children?: FieldNode[];\n}\n\n/** A field spec as found in a manifest: a bare type string, a descriptor, or a JSON Schema. */\ntype FieldSpec =\n | string\n | {\n type?: string;\n required?: boolean;\n description?: string;\n properties?: Record<string, FieldSpec>;\n items?: FieldSpec;\n [key: string]: unknown;\n }\n | null\n | undefined;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** True for keys usable with dot-notation (`a.b`); others need bracket access. */\nfunction isIdentifier(key: string): boolean {\n return /^[A-Za-z_$][\\w$]*$/.test(key);\n}\n\n/**\n * Join a child key onto a base path, using bracket notation for keys that are\n * not valid JS identifiers (e.g. `content-type`) so the resulting expression is\n * runtime-safe: `headers[\"content-type\"]`, not `headers.content-type`.\n */\nfunction joinPath(base: string, key: string): string {\n if (isIdentifier(key)) return base ? `${base}.${key}` : key;\n const bracket = `[${JSON.stringify(key)}]`;\n return base ? `${base}${bracket}` : bracket;\n}\n\n/**\n * Wrap a field path into the `${output.<path>}` expression the runtime mapper\n * evaluates. Handles paths that start with a bracket (`[0]`, `[\"x\"]`).\n */\nexport function pathToExpression(path: string): string {\n if (!path) return \"${output}\";\n const accessor = path.startsWith(\"[\") ? `output${path}` : `output.${path}`;\n return \"${\" + accessor + \"}\";\n}\n\nfunction fieldFromSpec(key: string, path: string, spec: FieldSpec): FieldNode {\n // Bare type string, e.g. \"array\" / \"string\" — a leaf we cannot expand.\n if (typeof spec === \"string\") {\n return { key, path, type: spec };\n }\n\n if (isRecord(spec)) {\n const declaredType = typeof spec.type === \"string\" ? spec.type : undefined;\n const description =\n typeof spec.description === \"string\" ? spec.description : undefined;\n const required = spec.required === true;\n\n // JSON Schema object → recurse into properties.\n if (isRecord(spec.properties)) {\n const children = Object.entries(spec.properties).map(([k, v]) =>\n fieldFromSpec(k, joinPath(path, k), v as FieldSpec),\n );\n return { key, path, type: \"object\", required, description, children };\n }\n\n // JSON Schema array → recurse into the element schema as `[0]`.\n if (spec.items !== undefined) {\n const element = fieldFromSpec(\"0\", `${path}[0]`, spec.items as FieldSpec);\n return {\n key,\n path,\n type: \"array\",\n required,\n description,\n children: [element],\n };\n }\n\n // Descriptor leaf (input_fields style) or typed leaf.\n return { key, path, type: declaredType ?? \"any\", required, description };\n }\n\n return { key, path, type: \"any\" };\n}\n\n/**\n * Build a field tree from an operation's `input_fields` / `output_fields` map.\n * `root` optionally prefixes every path (unused for `output`, which is the implicit root).\n */\nexport function fieldsFromIO(io: unknown, root = \"\"): FieldNode[] {\n if (!isRecord(io)) return [];\n return Object.entries(io).map(([key, spec]) =>\n fieldFromSpec(key, joinPath(root, key), spec as FieldSpec),\n );\n}\n\n/** Minimal shape of an operation as carried in node manifests. */\nexport interface NodeOperationLike {\n name?: string;\n type?: string;\n description?: string;\n input_fields?: unknown;\n output_fields?: unknown;\n}\n\n/** Normalize the various `operations` containers into a flat array. */\nexport function normalizeOperations(raw: unknown): NodeOperationLike[] {\n if (Array.isArray(raw)) return raw as NodeOperationLike[];\n if (isRecord(raw) && Array.isArray(raw.operations)) {\n return raw.operations as NodeOperationLike[];\n }\n return [];\n}\n\n/**\n * Resolve the operations array + the currently selected operation for a node,\n * mirroring the property panel's resolution order:\n * node.data.nodeData.operations → fallback registry operations\n */\nexport function resolveNodeOperation(\n data: Record<string, unknown> | undefined,\n fallbackOperations?: unknown,\n): {\n operations: NodeOperationLike[];\n selected: NodeOperationLike | undefined;\n} {\n const nodeData = isRecord(data?.nodeData) ? data?.nodeData : undefined;\n let operations = normalizeOperations(nodeData?.operations);\n if (operations.length === 0) {\n operations = normalizeOperations(data?.operations);\n }\n if (operations.length === 0 && fallbackOperations !== undefined) {\n operations = normalizeOperations(fallbackOperations);\n }\n\n const opName =\n typeof data?.operation_name === \"string\" ? data.operation_name : undefined;\n const selected = operations.find((op) => op.name === opName) ?? operations[0];\n\n return { operations, selected };\n}\n","import { useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { pathToExpression, type FieldNode } from \"../../lib/field-schema\";\n\n/** MIME type used to carry a field path across the drag from INPUT → param. */\nexport const FIELD_PATH_MIME = \"application/x-fg-field-path\";\n\nconst TYPE_ICON: Record<string, string> = {\n string: \"mdi:format-text\",\n number: \"mdi:numeric\",\n integer: \"mdi:numeric\",\n boolean: \"mdi:toggle-switch-outline\",\n array: \"mdi:code-brackets\",\n object: \"mdi:code-braces\",\n any: \"mdi:help-circle-outline\",\n};\n\ninterface FieldRowProps {\n field: FieldNode;\n depth: number;\n draggable: boolean;\n}\n\nfunction FieldRow({ field, depth, draggable }: FieldRowProps) {\n const [open, setOpen] = useState(depth < 1);\n const hasChildren = !!field.children && field.children.length > 0;\n\n const handleDragStart = (e: React.DragEvent) => {\n e.dataTransfer.setData(FIELD_PATH_MIME, field.path);\n e.dataTransfer.setData(\"text/plain\", pathToExpression(field.path));\n e.dataTransfer.effectAllowed = \"copy\";\n };\n\n return (\n <div>\n <div\n className={`group flex items-center gap-1.5 rounded-md py-1 pr-2 text-xs hover:bg-muted ${\n draggable ? \"cursor-grab active:cursor-grabbing\" : \"\"\n }`}\n style={{ paddingLeft: `${depth * 14 + 6}px` }}\n draggable={draggable}\n onDragStart={draggable ? handleDragStart : undefined}\n data-field-path={field.path}\n title={field.description || field.path}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex size-4 items-center justify-center text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={open ? \"mdi:chevron-down\" : \"mdi:chevron-right\"}\n className=\"size-3.5\"\n />\n </button>\n ) : (\n <span className=\"inline-block size-4\" />\n )}\n <Icon\n icon={TYPE_ICON[field.type] ?? TYPE_ICON.any}\n className=\"size-3.5 shrink-0 text-primary/70\"\n />\n <span className=\"truncate font-medium text-foreground\">\n {field.key}\n </span>\n <span className=\"ml-auto shrink-0 text-[10px] lowercase tracking-wide text-muted-foreground\">\n {field.type}\n {field.required ? \" *\" : \"\"}\n </span>\n </div>\n {hasChildren && open && (\n <div>\n {field.children!.map((child) => (\n <FieldRow\n key={child.path}\n field={child}\n depth={depth + 1}\n draggable={draggable}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\ninterface FieldTreeProps {\n fields: FieldNode[];\n /** When true, rows are draggable (INPUT pane). OUTPUT pane is read-only. */\n draggable?: boolean;\n emptyMessage?: string;\n}\n\nexport function FieldTree({\n fields,\n draggable = false,\n emptyMessage = \"No fields available.\",\n}: FieldTreeProps) {\n if (fields.length === 0) {\n return (\n <div className=\"px-2 py-4 text-xs text-card-foreground/50\">\n {emptyMessage}\n </div>\n );\n }\n return (\n <div className=\"flex flex-col gap-0.5\">\n {fields.map((field) => (\n <FieldRow\n key={field.path}\n field={field}\n depth={0}\n draggable={draggable}\n />\n ))}\n </div>\n );\n}\n","/**\n * NDV condition widgets (n8n-style typed conditions).\n *\n * - <ConditionTreeBuilder> edits a structured rule/group tree that the\n * backend evaluates natively (condition-tree.ts in both executors).\n * - <SwitchRulesEditor> edits Switch \"rules mode\": an ordered list of named\n * rules (first match wins) + fallback, and keeps the `cases` record\n * (label → handle) in sync so the node card renders one output per rule.\n *\n * The operator catalog mirrors the backend evaluator exactly.\n */\nimport { Icon } from \"@iconify/react\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\n\nimport type { FieldNode } from \"../../lib/field-schema\";\n\n// ---------------------------------------------------------------------------\n// Tree shape (mirrors IConditionRule / IConditionGroup in the executors)\n// ---------------------------------------------------------------------------\n\nexport interface ConditionRule {\n type: \"rule\";\n field: string;\n operator: string;\n value?: string | number | boolean | null;\n}\n\nexport interface ConditionGroup {\n type: \"group\";\n combinator: \"AND\" | \"OR\";\n children: Array<ConditionRule | ConditionGroup>;\n}\n\nexport interface SwitchRule {\n name: string;\n handle: string;\n conditionTree: ConditionGroup;\n}\n\nexport function emptyGroup(): ConditionGroup {\n return { type: \"group\", combinator: \"AND\", children: [] };\n}\n\nfunction emptyRule(field = \"\"): ConditionRule {\n return { type: \"rule\", field, operator: \"==\", value: \"\" };\n}\n\n// ---------------------------------------------------------------------------\n// Operator catalog — keep in lockstep with condition-tree.ts evaluateRule\n// ---------------------------------------------------------------------------\n\ninterface OperatorDef {\n value: string;\n label: string;\n needsValue: boolean;\n}\n\nconst OPERATORS: Record<string, OperatorDef[]> = {\n string: [\n { value: \"==\", label: \"equals\", needsValue: true },\n { value: \"!=\", label: \"not equals\", needsValue: true },\n { value: \"contains\", label: \"contains\", needsValue: true },\n { value: \"notContains\", label: \"does not contain\", needsValue: true },\n { value: \"startsWith\", label: \"starts with\", needsValue: true },\n { value: \"endsWith\", label: \"ends with\", needsValue: true },\n { value: \"regex\", label: \"matches regex\", needsValue: true },\n { value: \"isEmpty\", label: \"is empty\", needsValue: false },\n { value: \"isNotEmpty\", label: \"is not empty\", needsValue: false },\n { value: \"isNull\", label: \"is null\", needsValue: false },\n { value: \"isNotNull\", label: \"is not null\", needsValue: false },\n ],\n number: [\n { value: \"==\", label: \"equals\", needsValue: true },\n { value: \"!=\", label: \"not equals\", needsValue: true },\n { value: \">\", label: \"greater than\", needsValue: true },\n { value: \">=\", label: \"greater or equal\", needsValue: true },\n { value: \"<\", label: \"less than\", needsValue: true },\n { value: \"<=\", label: \"less or equal\", needsValue: true },\n { value: \"isNull\", label: \"is null\", needsValue: false },\n { value: \"isNotNull\", label: \"is not null\", needsValue: false },\n ],\n boolean: [\n { value: \"isTrue\", label: \"is true\", needsValue: false },\n { value: \"isFalse\", label: \"is false\", needsValue: false },\n { value: \"isNull\", label: \"is null\", needsValue: false },\n { value: \"isNotNull\", label: \"is not null\", needsValue: false },\n ],\n array: [\n { value: \"contains\", label: \"contains\", needsValue: true },\n { value: \"notContains\", label: \"does not contain\", needsValue: true },\n { value: \"isEmpty\", label: \"is empty\", needsValue: false },\n { value: \"isNotEmpty\", label: \"is not empty\", needsValue: false },\n { value: \"isNull\", label: \"is null\", needsValue: false },\n { value: \"isNotNull\", label: \"is not null\", needsValue: false },\n ],\n object: [\n { value: \"hasProperty\", label: \"has property\", needsValue: true },\n { value: \"isEmpty\", label: \"is empty\", needsValue: false },\n { value: \"isNotEmpty\", label: \"is not empty\", needsValue: false },\n { value: \"isNull\", label: \"is null\", needsValue: false },\n { value: \"isNotNull\", label: \"is not null\", needsValue: false },\n ],\n any: [\n { value: \"==\", label: \"equals\", needsValue: true },\n { value: \"!=\", label: \"not equals\", needsValue: true },\n { value: \">\", label: \"greater than\", needsValue: true },\n { value: \"<\", label: \"less than\", needsValue: true },\n { value: \"contains\", label: \"contains\", needsValue: true },\n { value: \"isEmpty\", label: \"is empty\", needsValue: false },\n { value: \"isNotEmpty\", label: \"is not empty\", needsValue: false },\n { value: \"isNull\", label: \"is null\", needsValue: false },\n { value: \"isNotNull\", label: \"is not null\", needsValue: false },\n ],\n};\n\nfunction operatorsFor(type: string | undefined): OperatorDef[] {\n return OPERATORS[type ?? \"any\"] ?? OPERATORS.any!;\n}\n\n// ---------------------------------------------------------------------------\n// Field picker source: flatten the NDV's upstream FieldNode tree\n// ---------------------------------------------------------------------------\n\nexport interface PickerField {\n path: string;\n type: string;\n}\n\nexport function flattenFields(nodes: FieldNode[]): PickerField[] {\n const out: PickerField[] = [];\n const walk = (list: FieldNode[]) => {\n for (const node of list) {\n if (node.path) out.push({ path: node.path, type: node.type ?? \"any\" });\n if (Array.isArray(node.children)) walk(node.children);\n }\n };\n walk(nodes);\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\n// ---------------------------------------------------------------------------\n// Rule row\n// ---------------------------------------------------------------------------\n\nconst rowInput =\n \"rounded-md border border-input bg-background px-2 py-1 text-xs outline-none focus:border-primary\";\n\nfunction RuleRow({\n rule,\n fields,\n onChange,\n onRemove,\n}: Readonly<{\n rule: ConditionRule;\n fields: PickerField[];\n onChange: (next: ConditionRule) => void;\n onRemove: () => void;\n}>) {\n const fieldType = fields.find((f) => f.path === rule.field)?.type ?? \"any\";\n const ops = operatorsFor(fieldType);\n const currentOp = ops.find((o) => o.value === rule.operator) ?? ops[0]!;\n const knownField = fields.some((f) => f.path === rule.field);\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1.5\"\n data-testid=\"condition-rule\"\n >\n {/* Field: dropdown of upstream fields with free-text fallback */}\n {fields.length > 0 && (knownField || rule.field === \"\") ? (\n <select\n value={rule.field}\n onChange={(e) => {\n const nextField = e.target.value;\n const nextType =\n fields.find((f) => f.path === nextField)?.type ?? \"any\";\n const nextOps = operatorsFor(nextType);\n const operator = nextOps.some((o) => o.value === rule.operator)\n ? rule.operator\n : nextOps[0]!.value;\n onChange({ ...rule, field: nextField, operator });\n }}\n className={cn(rowInput, \"max-w-[180px] flex-1\")}\n data-testid=\"condition-field\"\n >\n <option value=\"\">Select field…</option>\n {fields.map((f) => (\n <option key={f.path} value={f.path}>\n {f.path} ({f.type})\n </option>\n ))}\n <option value=\"__custom__\">Custom path…</option>\n </select>\n ) : (\n <input\n type=\"text\"\n value={rule.field === \"__custom__\" ? \"\" : rule.field}\n placeholder=\"field.path\"\n onChange={(e) => onChange({ ...rule, field: e.target.value })}\n className={cn(rowInput, \"max-w-[180px] flex-1 font-mono\")}\n data-testid=\"condition-field\"\n />\n )}\n\n <select\n value={currentOp.value}\n onChange={(e) => onChange({ ...rule, operator: e.target.value })}\n className={rowInput}\n data-testid=\"condition-operator\"\n >\n {ops.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n\n {currentOp.needsValue && (\n <input\n type={fieldType === \"number\" ? \"number\" : \"text\"}\n value={\n rule.value === null || rule.value === undefined\n ? \"\"\n : String(rule.value)\n }\n placeholder=\"value\"\n onChange={(e) => {\n const raw = e.target.value;\n const value =\n fieldType === \"number\" &&\n raw.trim() !== \"\" &&\n !Number.isNaN(Number(raw))\n ? Number(raw)\n : raw;\n onChange({ ...rule, value });\n }}\n className={cn(rowInput, \"min-w-[90px] flex-1\")}\n data-testid=\"condition-value\"\n />\n )}\n\n <button\n type=\"button\"\n onClick={onRemove}\n title=\"Remove condition\"\n className=\"rounded p-1 text-muted-foreground hover:text-[var(--color-status-error-text)]\"\n >\n <Icon icon=\"mynaui:trash\" className=\"size-3.5\" />\n </button>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Group editor (recursive)\n// ---------------------------------------------------------------------------\n\nfunction GroupEditor({\n group,\n fields,\n depth,\n onChange,\n onRemove,\n}: Readonly<{\n group: ConditionGroup;\n fields: PickerField[];\n depth: number;\n onChange: (next: ConditionGroup) => void;\n onRemove?: () => void;\n}>) {\n const setChild = (index: number, child: ConditionRule | ConditionGroup) => {\n const children = group.children.slice();\n children[index] = child;\n onChange({ ...group, children });\n };\n const removeChild = (index: number) => {\n onChange({\n ...group,\n children: group.children.filter((_, i) => i !== index),\n });\n };\n\n return (\n <div\n className={cn(\n \"flex flex-col gap-1.5 rounded-md\",\n depth > 0 && \"border border-border/70 bg-muted/20 p-2\",\n )}\n data-testid={`condition-group-depth-${depth}`}\n >\n <div className=\"flex items-center gap-1.5\">\n <div className=\"flex overflow-hidden rounded-md border border-input text-[10px] font-semibold\">\n {([\"AND\", \"OR\"] as const).map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => onChange({ ...group, combinator: c })}\n className={cn(\n \"px-2 py-0.5\",\n group.combinator === c\n ? \"bg-primary text-primary-foreground\"\n : \"bg-background text-muted-foreground hover:text-foreground\",\n )}\n data-testid={`combinator-${c}`}\n >\n {c}\n </button>\n ))}\n </div>\n <span className=\"text-[10px] text-muted-foreground\">\n {group.combinator === \"AND\"\n ? \"all conditions must match\"\n : \"any condition may match\"}\n </span>\n {onRemove && (\n <button\n type=\"button\"\n onClick={onRemove}\n title=\"Remove group\"\n className=\"ml-auto rounded p-1 text-muted-foreground hover:text-[var(--color-status-error-text)]\"\n >\n <Icon icon=\"mynaui:trash\" className=\"size-3.5\" />\n </button>\n )}\n </div>\n\n {group.children.map((child, index) =>\n child.type === \"rule\" ? (\n <RuleRow\n key={index}\n rule={child}\n fields={fields}\n onChange={(next) => setChild(index, next)}\n onRemove={() => removeChild(index)}\n />\n ) : (\n <GroupEditor\n key={index}\n group={child}\n fields={fields}\n depth={depth + 1}\n onChange={(next) => setChild(index, next)}\n onRemove={() => removeChild(index)}\n />\n ),\n )}\n\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...group,\n children: [...group.children, emptyRule(fields[0]?.path ?? \"\")],\n })\n }\n className=\"flex items-center gap-1 text-[11px] font-medium text-primary hover:underline\"\n data-testid=\"add-condition\"\n >\n <Icon icon=\"basil:add-solid\" className=\"size-3.5\" /> Add condition\n </button>\n {depth < 2 && (\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...group,\n children: [...group.children, emptyGroup()],\n })\n }\n className=\"flex items-center gap-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n data-testid=\"add-group\"\n >\n <Icon icon=\"basil:add-solid\" className=\"size-3.5\" /> Add group\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Public widgets\n// ---------------------------------------------------------------------------\n\nexport function ConditionTreeBuilder({\n value,\n fields,\n onChange,\n}: Readonly<{\n value: unknown;\n fields: PickerField[];\n onChange: (tree: ConditionGroup | undefined) => void;\n}>) {\n const tree: ConditionGroup =\n value &&\n typeof value === \"object\" &&\n (value as ConditionGroup).type === \"group\"\n ? (value as ConditionGroup)\n : emptyGroup();\n\n return (\n <div data-testid=\"condition-tree-builder\">\n <GroupEditor\n group={tree}\n fields={fields}\n depth={0}\n onChange={(next) =>\n onChange(next.children.length === 0 ? undefined : next)\n }\n />\n </div>\n );\n}\n\n/** Stable handle id for a new rule (must survive rename/reorder). */\nfunction newRuleHandle(existing: SwitchRule[]): string {\n let n = existing.length;\n const taken = new Set(existing.map((r) => r.handle));\n let handle = `rule-${n}`;\n while (taken.has(handle)) handle = `rule-${++n}`;\n return handle;\n}\n\n/** Derive the `cases` record (label → handle) that drives the node card's\n * dynamic output handles and the exact-match legacy path. */\nexport function casesFromRules(rules: SwitchRule[]): Record<string, string> {\n const cases: Record<string, string> = {};\n rules.forEach((rule, index) => {\n cases[rule.name || `Rule ${index + 1}`] = rule.handle;\n });\n return cases;\n}\n\nexport function SwitchRulesEditor({\n rules,\n fallbackHandle,\n fields,\n onChange,\n}: Readonly<{\n rules: SwitchRule[];\n fallbackHandle: string;\n fields: PickerField[];\n onChange: (next: { rules: SwitchRule[]; fallbackHandle: string }) => void;\n}>) {\n const setRule = (index: number, rule: SwitchRule) => {\n const next = rules.slice();\n next[index] = rule;\n onChange({ rules: next, fallbackHandle });\n };\n const move = (index: number, dir: -1 | 1) => {\n const target = index + dir;\n if (target < 0 || target >= rules.length) return;\n const next = rules.slice();\n const tmp = next[index]!;\n next[index] = next[target]!;\n next[target] = tmp;\n onChange({ rules: next, fallbackHandle });\n };\n\n return (\n <div className=\"flex flex-col gap-2\" data-testid=\"switch-rules-editor\">\n {rules.map((rule, index) => (\n <div\n key={rule.handle}\n className=\"rounded-md border border-border/70 bg-muted/10 p-2\"\n data-testid={`switch-rule-${index}`}\n >\n <div className=\"mb-1.5 flex items-center gap-1.5\">\n <span className=\"text-[10px] font-semibold text-muted-foreground\">\n {index + 1}.\n </span>\n <input\n type=\"text\"\n value={rule.name}\n placeholder={`Rule ${index + 1}`}\n onChange={(e) =>\n setRule(index, { ...rule, name: e.target.value })\n }\n className={cn(rowInput, \"flex-1 font-medium\")}\n data-testid=\"switch-rule-name\"\n />\n <button\n type=\"button\"\n onClick={() => move(index, -1)}\n disabled={index === 0}\n title=\"Move up\"\n className=\"rounded p-0.5 text-muted-foreground hover:text-foreground disabled:opacity-30\"\n >\n <Icon icon=\"mdi:chevron-up\" className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => move(index, 1)}\n disabled={index === rules.length - 1}\n title=\"Move down\"\n className=\"rounded p-0.5 text-muted-foreground hover:text-foreground disabled:opacity-30\"\n >\n <Icon icon=\"mdi:chevron-down\" className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n rules: rules.filter((_, i) => i !== index),\n fallbackHandle,\n })\n }\n title=\"Remove rule\"\n className=\"rounded p-0.5 text-muted-foreground hover:text-[var(--color-status-error-text)]\"\n >\n <Icon icon=\"mynaui:trash\" className=\"size-3.5\" />\n </button>\n </div>\n <ConditionTreeBuilder\n value={rule.conditionTree}\n fields={fields}\n onChange={(tree) =>\n setRule(index, { ...rule, conditionTree: tree ?? emptyGroup() })\n }\n />\n </div>\n ))}\n\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n rules: [\n ...rules,\n {\n name: `Rule ${rules.length + 1}`,\n handle: newRuleHandle(rules),\n conditionTree: emptyGroup(),\n },\n ],\n fallbackHandle,\n })\n }\n className=\"flex w-fit items-center gap-1 text-[11px] font-medium text-primary hover:underline\"\n data-testid=\"add-switch-rule\"\n >\n <Icon icon=\"basil:add-solid\" className=\"size-3.5\" /> Add rule\n </button>\n\n <div className=\"mt-1 flex items-center gap-2\">\n <span className=\"text-[11px] text-muted-foreground\">\n Fallback output (no rule matches):\n </span>\n <input\n type=\"text\"\n value={fallbackHandle}\n placeholder=\"default\"\n onChange={(e) => onChange({ rules, fallbackHandle: e.target.value })}\n className={cn(rowInput, \"w-28\")}\n data-testid=\"switch-fallback\"\n />\n </div>\n <p className=\"text-[10px] leading-snug text-muted-foreground\">\n Rules are checked top-down; the first matching rule routes the item to\n its output. Each rule renders as an output handle on the node.\n </p>\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { javascript } from \"@codemirror/lang-javascript\";\nimport { python } from \"@codemirror/lang-python\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\n\n/** Languages the code node's `runtime` field can select. */\nexport type CodeEditorLanguage = \"javascript\" | \"python\";\n\nexport function normalizeCodeLanguage(value: unknown): CodeEditorLanguage {\n return typeof value === \"string\" && value.toLowerCase().startsWith(\"py\")\n ? \"python\"\n : \"javascript\";\n}\n\n/**\n * Follows the app shell's `.dark` class on <html> so the editor theme matches\n * the surrounding UI (fe-libs toggles that class; there is no context to read).\n */\nfunction useIsDarkTheme(): boolean {\n const [dark, setDark] = useState(\n () =>\n typeof document !== \"undefined\" &&\n document.documentElement.classList.contains(\"dark\"),\n );\n useEffect(() => {\n const root = document.documentElement;\n const observer = new MutationObserver(() =>\n setDark(root.classList.contains(\"dark\")),\n );\n observer.observe(root, { attributes: true, attributeFilter: [\"class\"] });\n return () => observer.disconnect();\n }, []);\n return dark;\n}\n\ninterface CodeEditorFieldProps {\n value: string;\n language: CodeEditorLanguage;\n placeholder?: string;\n onChange: (value: string) => void;\n \"data-testid\"?: string;\n className?: string;\n}\n\n/**\n * CodeMirror-backed editor for `code`-typed NDV parameters (n8n-style Code\n * node). Purely presentational — the stored value stays a plain string in\n * `args.state`, exactly like the single-line input it replaces.\n */\nexport function CodeEditorField({\n value,\n language,\n placeholder,\n onChange,\n className,\n \"data-testid\": testId,\n}: CodeEditorFieldProps) {\n const dark = useIsDarkTheme();\n const extensions = useMemo(\n () => [language === \"python\" ? python() : javascript()],\n [language],\n );\n return (\n <div\n data-testid={testId}\n className={cn(\n \"overflow-hidden rounded-md border border-input text-sm transition-colors focus-within:border-primary\",\n className,\n )}\n // CodeMirror captures its own key/mouse events; stop them from reaching\n // canvas-level handlers (node deletion on Backspace, drag selection).\n onKeyDown={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <CodeMirror\n value={value}\n onChange={onChange}\n extensions={extensions}\n theme={dark ? \"dark\" : \"light\"}\n placeholder={placeholder}\n minHeight=\"180px\"\n maxHeight=\"420px\"\n basicSetup={{\n lineNumbers: true,\n foldGutter: true,\n highlightActiveLine: true,\n autocompletion: true,\n bracketMatching: true,\n closeBrackets: true,\n indentOnInput: true,\n }}\n />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\n\nconst SECTION_LABEL =\n \"text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground\";\n\ninterface WebhookUrlFieldProps {\n webhookUrl: string | null;\n loading: boolean;\n}\n\n/**\n * Read-only copyable webhook ingress URL for a webhook trigger node. The URL is\n * minted server-side when the workflow is saved, so until a registration exists\n * we prompt the user to save the workflow.\n */\nexport function WebhookUrlField({ webhookUrl, loading }: WebhookUrlFieldProps) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n if (!webhookUrl) return;\n try {\n await navigator.clipboard.writeText(webhookUrl);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n } catch {\n // Clipboard can be unavailable (insecure context / denied permission);\n // fail silently — the URL is still selectable in the input.\n }\n };\n\n return (\n <div className=\"space-y-2\" data-testid=\"ndv-webhook-url\">\n <div className={SECTION_LABEL}>Webhook URL</div>\n {webhookUrl ? (\n <>\n <div className=\"flex items-stretch gap-2\">\n <input\n readOnly\n value={webhookUrl}\n onFocus={(e) => e.currentTarget.select()}\n className=\"min-w-0 flex-1 rounded-md border border-border bg-muted/40 px-3 py-2 font-mono text-xs text-foreground outline-none focus:border-primary\"\n />\n <button\n type=\"button\"\n onClick={handleCopy}\n className={cn(\n \"inline-flex shrink-0 items-center gap-1.5 rounded-md border border-border px-3 py-2 text-xs font-medium transition-colors\",\n copied\n ? \"border-primary bg-primary/10 text-primary\"\n : \"bg-background text-foreground hover:bg-muted\",\n )}\n aria-label=\"Copy webhook URL\"\n >\n <Icon\n icon={copied ? \"mdi:check\" : \"mdi:content-copy\"}\n className=\"h-4 w-4\"\n />\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n Send HTTP requests to this URL to trigger the workflow.\n </p>\n </>\n ) : (\n <div className=\"rounded-md border border-dashed border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground\">\n {loading\n ? \"Loading webhook URL…\"\n : \"Save the workflow to generate its webhook URL.\"}\n </div>\n )}\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { getFluidGridsClientSafe } from \"../graphql/client\";\nimport {\n EventRegistrationsDocument,\n type EventRegistrationsQuery,\n type EventRegistrationsQueryVariables,\n} from \"../generated/operations\";\n\nexport interface WebhookRegistration {\n id: string;\n triggerNodeId: string;\n eventSource: string;\n eventType: string;\n webhookToken?: string | null;\n webhookUrl?: string | null;\n}\n\ninterface UseWebhookRegistrationResult {\n registration: WebhookRegistration | null;\n /** Copyable ingress URL for this trigger, once the workflow has been saved. */\n webhookUrl: string | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\n/**\n * Fetch the EventRegistration backing a webhook trigger node so the builder can\n * show its copyable ingress URL. The registration only exists once the workflow\n * has been saved (it is synced from the trigger node by wspace-workflow-svc), so\n * `webhookUrl` is null until then.\n *\n * Uses Apollo Client directly (mirrors useNodeEndpoints) to avoid Vite bundling\n * issues with @apollo/client hooks.\n */\nexport function useWebhookRegistration(\n workflowKey: string | undefined,\n triggerNodeId: string | undefined,\n enabled = true,\n): UseWebhookRegistrationResult {\n const [registration, setRegistration] = useState<WebhookRegistration | null>(\n null,\n );\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!enabled || !workflowKey || !triggerNodeId) {\n setRegistration(null);\n return;\n }\n\n const client = getFluidGridsClientSafe();\n if (!client) return;\n\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<\n EventRegistrationsQuery,\n EventRegistrationsQueryVariables\n >({\n query: EventRegistrationsDocument,\n variables: { workflowKey },\n fetchPolicy: \"network-only\",\n });\n const match =\n result.data?.eventRegistrations?.find(\n (r) => r.triggerNodeId === triggerNodeId,\n ) ?? null;\n setRegistration(match);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [enabled, workflowKey, triggerNodeId]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n registration,\n webhookUrl: registration?.webhookUrl ?? null,\n loading,\n error,\n refetch: fetchData,\n };\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { Edge } from \"@xyflow/react\";\nimport { Icon } from \"@iconify/react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport { useFlowStore } from \"../../stores/flow-store\";\nimport { NODE_CONFIGS } from \"../flow-builder/components/blocks\";\nimport { getNodeDetail } from \"../flow-builder/components/blocks/utils\";\nimport {\n fieldsFromIO,\n pathToExpression,\n resolveNodeOperation,\n type NodeOperationLike,\n} from \"../../lib/field-schema\";\nimport type { ExtendedNodeType, EdgeMapping } from \"../../../types/node\";\nimport { FieldTree, FIELD_PATH_MIME } from \"./field-tree\";\nimport {\n ConditionTreeBuilder,\n SwitchRulesEditor,\n casesFromRules,\n flattenFields,\n type SwitchRule,\n} from \"./condition-builder\";\nimport { ConnectionSelector } from \"../../../modules/connections/components\";\nimport { CodeEditorField, normalizeCodeLanguage } from \"./code-editor-field\";\nimport { WebhookUrlField } from \"./webhook-url-field\";\nimport { useWebhookRegistration } from \"../../../hooks/useWebhookRegistration\";\n\ntype EdgeWithMapping = Edge & { mapping?: EdgeMapping };\n\n/** Connection adapter declared by a node/operation manifest. */\ninterface ConnectionAdapter {\n name: string;\n provider: string;\n}\n\n/** A connection reference stored on the node's args. */\ninterface SelectedConnection {\n connectionId: string;\n adapter: string;\n}\n\ninterface ParamField {\n name: string;\n type: string;\n required: boolean;\n description?: string;\n options?: string[];\n defaultValue?: unknown;\n}\n\ntype FieldMode = \"fixed\" | \"expression\";\n\n/** Coerce a numeric input string to a real number (or undefined when empty/NaN). */\nfunction coerceNumber(type: string, raw: string): number | undefined {\n if (raw.trim() === \"\") return undefined;\n const n = type === \"integer\" ? parseInt(raw, 10) : parseFloat(raw);\n return Number.isNaN(n) ? undefined : n;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction fallbackOperations(type: string | undefined): unknown {\n if (!type) return undefined;\n return NODE_CONFIGS.find((c) => c.type === type)?.operations;\n}\n\nfunction selectedOperationOf(\n data: Record<string, unknown> | undefined,\n type: string | undefined,\n): NodeOperationLike | undefined {\n return resolveNodeOperation(data, fallbackOperations(type)).selected;\n}\n\nfunction paramsFromOperation(op: NodeOperationLike | undefined): ParamField[] {\n const io = asRecord(op?.input_fields);\n if (!io) return [];\n return Object.entries(io).map(([name, spec]) => {\n const rec = asRecord(spec);\n const optsRaw = rec?.options ?? rec?.enum;\n const options = Array.isArray(optsRaw)\n ? optsRaw\n .map((o) =>\n typeof o === \"string\"\n ? o\n : ((asRecord(o)?.value ?? asRecord(o)?.name) as unknown),\n )\n .filter((v): v is string => typeof v === \"string\")\n : undefined;\n return {\n name,\n type:\n typeof spec === \"string\"\n ? spec\n : typeof rec?.type === \"string\"\n ? (rec.type as string)\n : \"any\",\n required: rec?.required === true,\n description:\n typeof rec?.description === \"string\" ? rec.description : undefined,\n options,\n defaultValue: rec?.default,\n };\n });\n}\n\nfunction nodeTitle(\n node: { id: string; type?: string; data?: unknown } | undefined,\n): string {\n if (!node) return \"Node\";\n const data = asRecord(node.data);\n const label = typeof data?.label === \"string\" ? data.label : \"\";\n return label || getNodeDetail(node.type).title || node.id;\n}\n\nfunction nodeSubtitle(\n node: { data?: unknown } | undefined,\n): string | undefined {\n const data = asRecord(node?.data);\n return typeof data?.operation_name === \"string\"\n ? data.operation_name\n : undefined;\n}\n\nconst SECTION_LABEL =\n \"text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground\";\n\nexport function NodeDetailView() {\n const ndv = useFlowStore((s) => s.workflow.ndv);\n const nodes = useFlowStore((s) => s.workflow.nodes);\n const edges = useFlowStore((s) => s.workflow.edges) as EdgeWithMapping[];\n const closeNdv = useFlowStore((s) => s.actions.ndv.close);\n const showNodePropertiesOf = useFlowStore(\n (s) => s.actions.sidebar.showNodePropertiesOf,\n );\n\n const open = !!ndv;\n const node = useMemo(\n () => (ndv ? nodes.find((n) => n.id === ndv.nodeId) : undefined),\n [ndv, nodes],\n );\n\n const incoming = useMemo(\n () => (ndv ? edges.filter((e) => e.target === ndv.nodeId) : []),\n [edges, ndv],\n );\n const sourceIds = useMemo(() => incoming.map((e) => e.source), [incoming]);\n const sourceKey = sourceIds.join(\",\");\n\n const [selectedSource, setSelectedSource] = useState<string | undefined>();\n const [tab, setTab] = useState<\"parameters\" | \"settings\">(\"parameters\");\n const [outputView, setOutputView] = useState<\"schema\" | \"json\">(\"schema\");\n const [dragField, setDragField] = useState<string | null>(null);\n // Per-field fixed/expression mode override (n8n style). Falls back to a value\n // derived from current state when a field has no explicit override.\n const [modeByField, setModeByField] = useState<Record<string, FieldMode>>({});\n\n // Resizable panes (n8n-style draggable dividers)\n const panesRef = useRef<HTMLDivElement>(null);\n const dragCleanupRef = useRef<(() => void) | null>(null);\n const [leftPct, setLeftPct] = useState(30);\n const [rightPct, setRightPct] = useState(30);\n const startDrag = (which: \"left\" | \"right\") => (e: React.MouseEvent) => {\n e.preventDefault();\n const el = panesRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const onMove = (ev: MouseEvent) => {\n const pct = ((ev.clientX - rect.left) / rect.width) * 100;\n if (which === \"left\") setLeftPct(Math.min(55, Math.max(15, pct)));\n else setRightPct(Math.min(55, Math.max(15, 100 - pct)));\n };\n const cleanup = () => {\n window.removeEventListener(\"mousemove\", onMove);\n window.removeEventListener(\"mouseup\", cleanup);\n dragCleanupRef.current = null;\n };\n dragCleanupRef.current = cleanup;\n window.addEventListener(\"mousemove\", onMove);\n window.addEventListener(\"mouseup\", cleanup);\n };\n // Detach any in-progress resize listeners if the modal unmounts mid-drag.\n useEffect(() => () => dragCleanupRef.current?.(), []);\n\n useEffect(() => {\n setSelectedSource((prev) =>\n prev && sourceIds.includes(prev) ? prev : sourceIds[0],\n );\n }, [ndv?.nodeId, sourceKey, sourceIds]);\n\n useEffect(() => {\n if (open) setTab(\"parameters\");\n }, [open, ndv?.nodeId]);\n\n // Reset per-field modes when the node or the selected source changes, so a\n // field's mode re-derives from the (new) edge's mapping rather than leaking\n // across sources on multi-input nodes.\n useEffect(() => {\n setModeByField({});\n }, [ndv?.nodeId, selectedSource]);\n\n const sourceNode = useMemo(\n () => nodes.find((n) => n.id === selectedSource),\n [nodes, selectedSource],\n );\n const currentEdge = useMemo(\n () => incoming.find((e) => e.source === selectedSource),\n [incoming, selectedSource],\n );\n\n const currentOp = useMemo(\n () => selectedOperationOf(asRecord(node?.data), node?.type),\n [node],\n );\n const sourceOp = useMemo(\n () => selectedOperationOf(asRecord(sourceNode?.data), sourceNode?.type),\n [sourceNode],\n );\n\n const inputFields = useMemo(\n () => fieldsFromIO(sourceOp?.output_fields),\n [sourceOp],\n );\n const outputFields = useMemo(\n () => fieldsFromIO(currentOp?.output_fields),\n [currentOp],\n );\n const params = useMemo(() => paramsFromOperation(currentOp), [currentOp]);\n\n // Webhook trigger nodes declare a `webhookUrl` output. When present, surface\n // the copyable ingress URL (minted server-side once the workflow is saved).\n const isWebhookTrigger = useMemo(\n () => !!asRecord(currentOp?.output_fields)?.webhookUrl,\n [currentOp],\n );\n const workflowKey = useFlowStore((s) => s.workflow.workflowKey);\n const { webhookUrl, loading: webhookUrlLoading } = useWebhookRegistration(\n workflowKey || undefined,\n node?.id,\n isWebhookTrigger && open,\n );\n\n // Flat upstream field list for the condition builder's field picker.\n const pickerFields = useMemo(() => flattenFields(inputFields), [inputFields]);\n\n const mapping = (currentEdge?.mapping?.definition ?? {}) as Record<\n string,\n string\n >;\n\n // The node's own static parameter values (where the side panel also writes).\n const argsState = useMemo(() => {\n const data = asRecord(node?.data);\n const args = asRecord(data?.args);\n return (asRecord(args?.state) ?? {}) as Record<string, unknown>;\n }, [node]);\n\n // ---- Connections (credentials) — mirror the side property panel ----------\n // Connection adapters: operation-level first, then node-level; accept both the\n // new `connectionAdapters` and legacy `credentialAdapters` shapes.\n const connectionAdapters = useMemo<ConnectionAdapter[]>(() => {\n const op = asRecord(currentOp);\n const manifest = asRecord(asRecord(node?.data)?.nodeData);\n const raw =\n op?.connectionAdapters ??\n op?.credentialAdapters ??\n manifest?.connectionAdapters ??\n manifest?.credentialAdapters;\n if (!Array.isArray(raw)) return [];\n return raw\n .map((a) => asRecord(a))\n .filter((a): a is Record<string, unknown> => !!a)\n .map((a) => ({\n name: String(a.name ?? \"\"),\n provider: String(a.provider ?? \"\"),\n }))\n .filter((a) => a.name && a.provider);\n }, [currentOp, node]);\n\n // Selected connections from the node args — prefer new `connections`, fall\n // back to the legacy `credentials` shape for backward compatibility.\n const selectedConnections = useMemo<SelectedConnection[]>(() => {\n const args = asRecord(asRecord(node?.data)?.args);\n const fromList = (\n list: unknown,\n idKey: \"connectionId\" | \"id\",\n ): SelectedConnection[] => {\n if (!Array.isArray(list)) return [];\n return list\n .map((c) => asRecord(c))\n .filter((c): c is Record<string, unknown> => !!c)\n .map((c) => ({\n connectionId: String(c[idKey] ?? \"\"),\n adapter: String(c.adapter ?? \"\"),\n }))\n .filter((c) => c.connectionId);\n };\n const connections = fromList(args?.connections, \"connectionId\");\n if (connections.length > 0) return connections;\n return fromList(args?.credentials, \"id\");\n }, [node]);\n\n // Persist connection changes into the node's `args.connections` (new format),\n // clearing the legacy `args.credentials` field. Writes through the store the\n // same way `writeFixed` does so the side panel and NDV stay in sync.\n const handleConnectionsChange = (connections: SelectedConnection[]) => {\n if (!ndv) return;\n const store = useFlowStore.getState();\n const next = store.workflow.nodes.map((n) => {\n if (n.id !== ndv.nodeId) return n;\n const data = { ...(asRecord(n.data) ?? {}) };\n const args = { ...(asRecord(data.args) ?? {}) };\n delete args.credentials; // drop legacy field\n args.connections = connections.map((c) => ({\n connectionId: c.connectionId,\n adapter: c.adapter,\n }));\n data.args = args;\n return { ...n, data };\n });\n store.actions.nodes.setNodes(next);\n };\n\n const writeMapping = (field: string, value: string) => {\n if (!currentEdge) return;\n const store = useFlowStore.getState();\n const freshEdges = store.workflow.edges as EdgeWithMapping[];\n const next = freshEdges.map((e) => {\n if (e.id !== currentEdge.id) return e;\n const def: Record<string, string> = { ...(e.mapping?.definition ?? {}) };\n if (value.trim()) def[field] = value;\n else delete def[field];\n return {\n ...e,\n mapping: {\n definition: def,\n comment:\n e.mapping?.comment ??\n `Map ${selectedSource} → ${ndv?.nodeId ?? \"\"}`,\n },\n };\n });\n store.actions.edges.setEdges(next as Edge[]);\n };\n\n // Remove a field's mapping from EVERY incoming edge of the node (not just the\n // selected source). The runtime only reads one incoming edge, so a stale\n // mapping on another edge could otherwise override the fixed value.\n const clearMappingFromAllIncoming = (field: string) => {\n if (!ndv) return;\n const store = useFlowStore.getState();\n const fresh = store.workflow.edges as EdgeWithMapping[];\n let changed = false;\n const next = fresh.map((e) => {\n if (e.target !== ndv.nodeId || !e.mapping?.definition) return e;\n if (!(field in e.mapping.definition)) return e;\n const def = { ...e.mapping.definition };\n delete def[field];\n changed = true;\n return { ...e, mapping: { ...e.mapping, definition: def } };\n });\n if (changed) store.actions.edges.setEdges(next as Edge[]);\n };\n\n // Write a typed literal to the node's args.state (same place the side panel\n // writes), and clear that field from all incoming edge mappings so the fixed\n // value wins (incl. multi-input nodes).\n const writeFixed = (field: string, value: unknown) => {\n if (!ndv) return;\n const store = useFlowStore.getState();\n const next = store.workflow.nodes.map((n) => {\n if (n.id !== ndv.nodeId) return n;\n const data = { ...(asRecord(n.data) ?? {}) };\n const args = { ...(asRecord(data.args) ?? {}) };\n const state = { ...(asRecord(args.state) ?? {}) };\n if (value === undefined || value === null || value === \"\") {\n delete state[field];\n } else {\n state[field] = value;\n }\n args.state = state;\n data.args = args;\n return { ...n, data };\n });\n store.actions.nodes.setNodes(next);\n clearMappingFromAllIncoming(field); // a fixed value owns the field\n };\n\n const toggleMode = (field: string, current: FieldMode) => {\n if (current === \"expression\") {\n // → fixed: clear the field from all incoming edges so the static value wins\n clearMappingFromAllIncoming(field);\n }\n setModeByField((m) => ({\n ...m,\n [field]: current === \"expression\" ? \"fixed\" : \"expression\",\n }));\n };\n\n const handleDropOnParam = (field: string) => (e: React.DragEvent) => {\n e.preventDefault();\n setDragField(null);\n const path = e.dataTransfer.getData(FIELD_PATH_MIME);\n if (path) {\n writeMapping(field, pathToExpression(path));\n setModeByField((m) => ({ ...m, [field]: \"expression\" }));\n }\n };\n\n const openClassicPanel = () => {\n if (!ndv) return;\n showNodePropertiesOf({\n id: ndv.nodeId,\n type: ndv.type as ExtendedNodeType,\n });\n closeNdv();\n };\n\n const headerIcon = getNodeDetail(node?.type).icon;\n\n return (\n <Dialog open={open} onOpenChange={(o) => !o && closeNdv()}>\n <DialogContent\n // Inline sizing (not Tailwind classes): in local dev the app's Tailwind\n // scans the fe-sdk *dist*, not the source it serves, so novel arbitrary\n // size utilities here wouldn't generate. Inline style is scan-independent.\n // Near-fullscreen, centered with a margin (the dialog's default\n // center-translate keeps it centered, so the gap shows the dimmed\n // overlay around it). Inline sizing because the app's Tailwind scans\n // the fe-sdk dist, not the source served in dev.\n style={{\n width: \"94vw\",\n height: \"92vh\",\n maxWidth: \"none\",\n maxHeight: \"92vh\",\n // Above the app shell navbar so the header (title/close) isn't occluded.\n zIndex: 1000,\n }}\n className=\"flex flex-col gap-0 overflow-hidden border-border bg-background p-0\"\n data-testid=\"ndv-modal\"\n >\n {/* Header */}\n <DialogHeader className=\"flex shrink-0 flex-row items-center gap-3 space-y-0 border-b border-border px-4 py-3\">\n <div className=\"flex size-7 shrink-0 items-center justify-center rounded-md bg-muted\">\n <Icon icon={headerIcon} className=\"size-4 text-foreground\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <DialogTitle className=\"truncate text-sm font-semibold leading-tight\">\n {nodeTitle(node)}\n </DialogTitle>\n {nodeSubtitle(node) && (\n <DialogDescription className=\"truncate text-xs leading-tight\">\n {nodeSubtitle(node)}\n </DialogDescription>\n )}\n </div>\n <button\n type=\"button\"\n onClick={openClassicPanel}\n className=\"rounded-md px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n Side panel\n </button>\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={closeNdv}\n className=\"rounded-md p-1.5 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <Icon icon=\"mdi:close\" className=\"size-4\" />\n </button>\n </DialogHeader>\n\n {/* Three panes */}\n <div ref={panesRef} className=\"flex min-h-0 flex-1\">\n {/* ---------- INPUT ---------- */}\n <section\n style={{ width: `${leftPct}%` }}\n className=\"flex min-h-0 min-w-[180px] flex-col bg-card/40\"\n >\n <div className=\"flex items-center gap-2 px-4 py-2.5\">\n <span className={SECTION_LABEL}>Input</span>\n {sourceIds.length > 0 && (\n <select\n className=\"ml-auto max-w-[60%] truncate rounded-md border border-input bg-background px-2 py-1 text-xs text-foreground outline-none focus:border-primary\"\n value={selectedSource ?? \"\"}\n onChange={(e) => setSelectedSource(e.target.value)}\n data-testid=\"ndv-source-selector\"\n >\n {sourceIds.map((sid) => {\n const sn = nodes.find((n) => n.id === sid);\n return (\n <option key={sid} value={sid}>\n {nodeTitle(sn)}\n </option>\n );\n })}\n </select>\n )}\n </div>\n <div\n className=\"min-h-0 flex-1 overflow-auto px-2 pb-3\"\n data-testid=\"ndv-input-tree\"\n >\n {inputFields.length > 0 ? (\n <FieldTree fields={inputFields} draggable />\n ) : (\n <EmptyState\n icon=\"mdi:tray-arrow-down\"\n title=\"No input data\"\n hint={\n sourceIds.length === 0\n ? \"Connect an upstream node to map its fields.\"\n : \"The selected source has no declared output fields.\"\n }\n />\n )}\n </div>\n </section>\n\n <ResizeHandle onStart={startDrag(\"left\")} />\n\n {/* ---------- PARAMETERS ---------- */}\n <section className=\"flex min-h-0 min-w-[280px] flex-1 flex-col\">\n <div className=\"flex shrink-0 items-center gap-4 border-b border-border px-4\">\n <TabButton\n active={tab === \"parameters\"}\n onClick={() => setTab(\"parameters\")}\n >\n Parameters\n </TabButton>\n <TabButton\n active={tab === \"settings\"}\n onClick={() => setTab(\"settings\")}\n >\n Settings\n </TabButton>\n </div>\n\n {tab === \"parameters\" ? (\n <div\n className=\"min-h-0 flex-1 space-y-4 overflow-auto p-4\"\n data-testid=\"ndv-params\"\n >\n {/* Webhook trigger: copyable ingress URL */}\n {isWebhookTrigger && (\n <WebhookUrlField\n webhookUrl={webhookUrl}\n loading={webhookUrlLoading}\n />\n )}\n {/* Connections (credentials) — same selector as the side panel */}\n {connectionAdapters.length > 0 && (\n <div className=\"space-y-2\" data-testid=\"ndv-connections\">\n <div className={SECTION_LABEL}>Connections</div>\n <ConnectionSelector\n adapters={connectionAdapters}\n selectedConnections={selectedConnections}\n onChange={handleConnectionsChange}\n compact\n />\n </div>\n )}\n {!currentEdge && (\n <div className=\"rounded-md border border-dashed border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground\">\n No upstream node connected — set fixed values below, or\n connect a node to map fields with expressions.\n </div>\n )}\n {params.length === 0 ? (\n <div className=\"py-6 text-center text-xs text-muted-foreground\">\n This operation has no input parameters.\n </div>\n ) : (\n params.map((p) => {\n // n8n-style structured condition widgets (IF/Filter tree,\n // Switch rules). These own their own layout — no\n // fixed/expression toggle, they write args.state directly.\n if (p.type === \"condition\") {\n return (\n <div key={p.name} className=\"flex flex-col gap-1.5\">\n <label className=\"text-xs font-medium text-foreground\">\n {p.name === \"conditionTree\" ? \"Conditions\" : p.name}\n </label>\n <ConditionTreeBuilder\n value={argsState[p.name]}\n fields={pickerFields}\n onChange={(tree) => writeFixed(p.name, tree)}\n />\n {p.description && (\n <span className=\"text-[11px] leading-snug text-muted-foreground\">\n {p.description}\n </span>\n )}\n </div>\n );\n }\n if (p.type === \"switch-rules\") {\n const rules = Array.isArray(argsState[p.name])\n ? (argsState[p.name] as SwitchRule[])\n : [];\n const fallbackHandle =\n typeof argsState.fallbackHandle === \"string\"\n ? (argsState.fallbackHandle as string)\n : \"default\";\n return (\n <div key={p.name} className=\"flex flex-col gap-1.5\">\n <label className=\"text-xs font-medium text-foreground\">\n Routing rules\n </label>\n <SwitchRulesEditor\n rules={rules}\n fallbackHandle={fallbackHandle}\n fields={pickerFields}\n onChange={(next) => {\n writeFixed(p.name, next.rules);\n writeFixed(\"cases\", casesFromRules(next.rules));\n writeFixed(\"fallbackHandle\", next.fallbackHandle);\n }}\n />\n </div>\n );\n }\n\n const mode: FieldMode =\n modeByField[p.name] ??\n (mapping[p.name] !== undefined ? \"expression\" : \"fixed\");\n const exprValue = mapping[p.name] ?? \"\";\n const fixedValue = argsState[p.name];\n // Code-editor widget: fields seeded as `code`, plus the\n // Code node's `code` field (seeded as `string` before the\n // Input.CodeEditor manifest type existed).\n const isCodeParam =\n p.type === \"code\" ||\n (node?.type === \"internal:code\" && p.name === \"code\");\n const highlight = dragField === p.name;\n const inputCx = cn(\n \"w-full rounded-md border bg-background px-2.5 py-1.5 text-sm outline-none transition-colors disabled:opacity-50\",\n highlight\n ? \"border-primary ring-1 ring-primary\"\n : \"border-input focus:border-primary\",\n );\n return (\n <div\n key={p.name}\n className=\"flex flex-col gap-1.5\"\n onDragOver={(e) => e.preventDefault()}\n onDragEnter={() => setDragField(p.name)}\n onDragLeave={() =>\n setDragField((f) => (f === p.name ? null : f))\n }\n onDrop={handleDropOnParam(p.name)}\n >\n <div className=\"flex items-center gap-1\">\n <label className=\"text-xs font-medium text-foreground\">\n {p.name}\n </label>\n {p.required && (\n <span className=\"text-destructive\">*</span>\n )}\n <span className=\"ml-auto text-[10px] uppercase tracking-wide text-muted-foreground\">\n {p.type}\n </span>\n <button\n type=\"button\"\n onClick={() => toggleMode(p.name, mode)}\n title={\n mode === \"expression\"\n ? \"Switch to a fixed value\"\n : \"Switch to an expression\"\n }\n data-testid={`ndv-mode-${p.name}`}\n className={cn(\n \"ml-1 rounded p-0.5 hover:text-foreground\",\n mode === \"expression\"\n ? \"text-primary\"\n : \"text-muted-foreground\",\n )}\n >\n <Icon\n icon={\n mode === \"expression\"\n ? \"mdi:variable\"\n : \"mdi:form-textbox\"\n }\n className=\"size-3.5\"\n />\n </button>\n </div>\n\n {mode === \"expression\" ? (\n <input\n type=\"text\"\n value={exprValue}\n placeholder={\n currentEdge\n ? \"Drop a field or type ${output.…}\"\n : \"Connect an upstream node to use expressions\"\n }\n disabled={!currentEdge}\n onChange={(e) =>\n writeMapping(p.name, e.target.value)\n }\n data-testid={`ndv-param-${p.name}`}\n className={cn(inputCx, \"font-mono text-primary\")}\n />\n ) : isCodeParam ? (\n <CodeEditorField\n value={\n typeof fixedValue === \"string\" ? fixedValue : \"\"\n }\n language={normalizeCodeLanguage(\n argsState.runtime ??\n params.find((f) => f.name === \"runtime\")\n ?.defaultValue,\n )}\n placeholder={\n typeof p.defaultValue === \"string\"\n ? p.defaultValue\n : p.description\n }\n onChange={(v) => writeFixed(p.name, v)}\n data-testid={`ndv-param-${p.name}`}\n />\n ) : p.type === \"boolean\" ? (\n <label className=\"flex w-fit cursor-pointer items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={fixedValue === true}\n onChange={(e) =>\n writeFixed(p.name, e.target.checked)\n }\n data-testid={`ndv-param-${p.name}`}\n className=\"size-4\"\n />\n <span className=\"text-muted-foreground\">\n {fixedValue === undefined\n ? \"Not set (default)\"\n : fixedValue === true\n ? \"true\"\n : \"false\"}\n </span>\n </label>\n ) : p.options && p.options.length > 0 ? (\n <select\n value={\n typeof fixedValue === \"string\" ? fixedValue : \"\"\n }\n onChange={(e) => writeFixed(p.name, e.target.value)}\n data-testid={`ndv-param-${p.name}`}\n className={inputCx}\n >\n <option value=\"\">\n {p.defaultValue !== undefined\n ? `Default (${String(p.defaultValue)})`\n : \"Select…\"}\n </option>\n {p.options.map((o) => (\n <option key={o} value={o}>\n {o}\n </option>\n ))}\n </select>\n ) : p.type === \"integer\" || p.type === \"number\" ? (\n <input\n type=\"number\"\n step={p.type === \"integer\" ? \"1\" : \"any\"}\n value={\n typeof fixedValue === \"number\"\n ? String(fixedValue)\n : \"\"\n }\n placeholder={\n p.defaultValue !== undefined\n ? `Default: ${String(p.defaultValue)}`\n : \"Enter a number\"\n }\n onChange={(e) =>\n writeFixed(\n p.name,\n coerceNumber(p.type, e.target.value),\n )\n }\n data-testid={`ndv-param-${p.name}`}\n className={inputCx}\n />\n ) : (\n <input\n type=\"text\"\n value={\n fixedValue === undefined || fixedValue === null\n ? \"\"\n : String(fixedValue)\n }\n placeholder={\n p.defaultValue !== undefined\n ? `Default: ${String(p.defaultValue)}`\n : \"Enter a value\"\n }\n onChange={(e) => writeFixed(p.name, e.target.value)}\n data-testid={`ndv-param-${p.name}`}\n className={inputCx}\n />\n )}\n\n {p.description && (\n <span className=\"text-[11px] leading-snug text-muted-foreground\">\n {p.description}\n </span>\n )}\n </div>\n );\n })\n )}\n </div>\n ) : (\n <div className=\"min-h-0 flex-1 overflow-auto p-4 text-xs text-muted-foreground\">\n No additional settings for this node.\n </div>\n )}\n </section>\n\n <ResizeHandle onStart={startDrag(\"right\")} />\n\n {/* ---------- OUTPUT ---------- */}\n <section\n style={{ width: `${rightPct}%` }}\n className=\"flex min-h-0 min-w-[180px] flex-col bg-card/40\"\n >\n <div className=\"flex items-center gap-2 px-4 py-2.5\">\n <span className={SECTION_LABEL}>Output</span>\n {outputFields.length > 0 && (\n <div className=\"ml-auto flex items-center gap-1\">\n <ToggleChip\n active={outputView === \"schema\"}\n onClick={() => setOutputView(\"schema\")}\n >\n Schema\n </ToggleChip>\n <ToggleChip\n active={outputView === \"json\"}\n onClick={() => setOutputView(\"json\")}\n >\n JSON\n </ToggleChip>\n </div>\n )}\n </div>\n <div\n className=\"min-h-0 flex-1 overflow-auto px-2 pb-3\"\n data-testid=\"ndv-output-tree\"\n >\n {outputFields.length === 0 ? (\n <EmptyState\n icon=\"mdi:tray-arrow-up\"\n title=\"No output data\"\n hint=\"This operation has no declared output fields.\"\n />\n ) : outputView === \"schema\" ? (\n <FieldTree fields={outputFields} />\n ) : (\n <pre className=\"whitespace-pre-wrap break-words px-2 text-[11px] leading-relaxed text-muted-foreground\">\n {JSON.stringify(currentOp?.output_fields ?? {}, null, 2)}\n </pre>\n )}\n </div>\n </section>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ResizeHandle({ onStart }: { onStart: (e: React.MouseEvent) => void }) {\n return (\n <div\n onMouseDown={onStart}\n role=\"separator\"\n aria-orientation=\"vertical\"\n className=\"group flex w-1.5 shrink-0 cursor-col-resize items-center justify-center bg-border/60 hover:bg-primary/40\"\n >\n <div className=\"h-8 w-0.5 rounded bg-muted-foreground/40 group-hover:bg-primary\" />\n </div>\n );\n}\n\nfunction TabButton({\n active,\n onClick,\n children,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"-mb-px border-b-2 py-2.5 text-sm transition-colors\",\n active\n ? \"border-primary font-medium text-foreground\"\n : \"border-transparent text-muted-foreground hover:text-foreground\",\n )}\n >\n {children}\n </button>\n );\n}\n\nfunction ToggleChip({\n active,\n onClick,\n children,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"rounded px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide transition-colors\",\n active\n ? \"bg-primary/10 text-primary\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {children}\n </button>\n );\n}\n\nfunction EmptyState({\n icon,\n title,\n hint,\n}: {\n icon: string;\n title: string;\n hint: string;\n}) {\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-2 px-6 text-center\">\n <Icon icon={icon} className=\"size-7 text-muted-foreground/50\" />\n <div className=\"text-sm font-medium text-foreground/80\">{title}</div>\n <div className=\"max-w-[14rem] text-xs text-muted-foreground\">{hint}</div>\n </div>\n );\n}\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 { cn } from \"@burdenoff/fe-libs/utils\";\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({ className }: { className?: string }) {\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={cn(\"flex gap-1\", className)}\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 { cn } from \"@burdenoff/fe-libs/utils\";\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 className,\n}: {\n className?: string;\n}) => {\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={cn(\n \"flex gap-1\",\n isDraft && \"bg-green-600 hover:bg-green-700 text-white\",\n className,\n )}\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 {\n Card,\n Button,\n Input,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n DropdownMenuItem,\n} 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 { NodeDetailView } from \"../ndv/node-detail-view\";\nimport { VersionHistoryPanel } from \"./components/ui/version-history-panel\";\nimport { ActivateWorkflowButton } from \"./components/ui/activate-workflow-button\";\n\n/** Run button with an attached chevron opening a small menu (currently just \"View Runs\"). */\nfunction RunWithViewRuns({\n onViewRuns,\n canViewRuns,\n className,\n runButtonClassName,\n}: {\n onViewRuns: () => void;\n canViewRuns: boolean;\n className?: string;\n runButtonClassName?: string;\n}) {\n return (\n <div className={cn(\"inline-flex items-center\", className)}>\n <ExecuteWorkflowButton className={runButtonClassName} />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"default\"\n size=\"icon\"\n className=\"flex items-center justify-center h-8 w-6 rounded-r-lg rounded-l-none border-l border-white/20 bg-[var(--color-status-success-bg)] hover:bg-[var(--color-status-success-bg)]/90\"\n >\n <Icon\n icon=\"mynaui:chevron-down\"\n className=\"size-3.5 text-[var(--color-text-on-status)]\"\n />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onViewRuns} disabled={!canViewRuns}>\n View Runs\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n\nconst edgeTypes: EdgeTypes = {\n deletable: CustomDeletableEdge,\n};\nconst edgeOptions = {\n type: \"deletable\",\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 = ({ readOnly = false }: { readOnly?: boolean }) => {\n const searchParams = new URLSearchParams(window.location.search);\n const isReadOnly = readOnly || 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 | undefined,\n nodeData: (node.data as Record<string, unknown>)?.nodeData as\n Record<string, unknown> | undefined,\n },\n operations: (node.data as Record<string, unknown>)?.operations as\n NodeOperation[] | 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 const [isEditingName, setIsEditingName] = useState(false);\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 handleViewRuns = useCallback(() => {\n // Open the runs LIST filtered to this workflow. (Navigating to\n // `../runs/${id}` hit the run-detail route with the workflowKey\n // as a runId, which never resolves — \"Execution not found\".)\n // Guard: an unsaved workflow (/new) has no key, so navigating\n // with an empty workflowKey would show every run.\n if (!id) return;\n navigate(`../runs?workflowKey=${encodeURIComponent(id)}`);\n }, [id, navigate]);\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-t-xl rounded-b-none bg-gradient-to-l backdrop-blur-sm mt-2 mx-4 items-center flex justify-between border border-card-foreground/10 border-b-0\">\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 {isEditingName ? (\n <Input\n autoFocus\n className=\"text-card-foreground font-bold w-48\"\n type=\"email\"\n placeholder=\"Workflow Name\"\n value={workflowName || name}\n onChange={handleNameChange}\n onBlur={() => setIsEditingName(false)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") setIsEditingName(false);\n }}\n />\n ) : (\n <div className=\"group flex items-center gap-1.5\">\n <div\n title={workflowName || name || \"Untitled Workflow\"}\n className=\"w-48 overflow-x-auto whitespace-nowrap text-card-foreground font-bold [scrollbar-width:thin]\"\n >\n {workflowName || name || \"Untitled Workflow\"}\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 shrink-0 opacity-60 group-hover:opacity-100\"\n onClick={() => setIsEditingName(true)}\n >\n <Icon\n icon=\"mynaui:pencil\"\n className=\"size-3.5 text-card-foreground\"\n />\n </Button>\n </div>\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 <>\n {/* Full action row — collapses into a menu below the lg breakpoint */}\n <div className=\"hidden lg:inline-flex items-center gap-2\">\n <VersionHistoryPanel />\n <SaveFlowButton />\n <ActivateWorkflowButton />\n <RunWithViewRuns\n onViewRuns={handleViewRuns}\n canViewRuns={!!id}\n />\n </div>\n\n {/* Overflow menu — small screens only, same actions/handlers */}\n <div className=\"lg:hidden\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"text-card-foreground\"\n >\n <Icon icon=\"mynaui:dots-vertical\" className=\"size-5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"flex flex-col gap-1.5 p-2 w-56\"\n >\n <VersionHistoryPanel className=\"w-full justify-start\" />\n <SaveFlowButton className=\"w-full justify-start\" />\n <ActivateWorkflowButton className=\"w-full justify-start\" />\n <RunWithViewRuns\n onViewRuns={handleViewRuns}\n canViewRuns={!!id}\n className=\"w-full\"\n runButtonClassName=\"flex-1 justify-start rounded-l-lg\"\n />\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </>\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 rounded-b-xl border border-card-foreground/10 border-t-0 overflow-hidden ml-4 mb-1\"\n >\n <CanvasControls />\n <ReactFlow\n proOptions={{ hideAttribution: true }}\n onInit={({ fitView }) => fitView({ minZoom: 1, maxZoom: 1 }).then()}\n nodeTypes={nodeTypes}\n nodes={nodes}\n onNodesChange={handleNodesChange}\n edgeTypes={edgeTypes}\n edges={edges}\n onEdgesChange={onEdgesChange}\n onConnect={isReadOnly ? undefined : onConnect}\n onConnectEnd={isReadOnly ? undefined : handleOnEdgeDropConnectEnd}\n onDrop={isReadOnly ? undefined : onDrop}\n onDragOver={isReadOnly ? undefined : onDragOver}\n onNodeDragStop={(_, node) => {\n autoAdjustNode(node);\n }}\n onNodesDelete={onNodesDelete}\n isValidConnection={isValidConnection}\n nodesDraggable={!isReadOnly}\n nodesConnectable={!isReadOnly}\n elementsSelectable={!isReadOnly}\n multiSelectionKeyCode={null}\n deleteKeyCode={isReadOnly ? null : deleteKeyCode}\n snapGrid={[16, 16]}\n snapToGrid\n fitView\n fitViewOptions={{ minZoom: 1, maxZoom: 1 }}\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 <NodeDetailView />\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 { Icon } from \"@iconify/react\";\nimport { 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 readOnly = false,\n}: {\n workflow: IFlowState[\"workflow\"];\n readOnly?: boolean;\n}) => {\n const setWorkflow = useFlowStore((s) => s.actions.setWorkflow);\n const searchParams = new URLSearchParams(window.location.search);\n const isReadOnly = readOnly || searchParams.get(\"readonly\") === \"true\";\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n\n // Gate FlowBuilder rendering until the Zustand store is hydrated.\n const [isStoreReady, setIsStoreReady] = useState(false);\n // Track which workflow object was last synced to Zustand. When the workflow\n // prop changes (e.g. after navigation reuses this component), we re-sync.\n // Using reference equality means StrictMode's double-fire (same reference)\n // correctly skips re-hydration, while a new workflow prop triggers it.\n const syncedWorkflowRef = useRef<IFlowState[\"workflow\"] | null>(null);\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 (syncedWorkflowRef.current !== workflow) {\n syncedWorkflowRef.current = workflow;\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\n // 3. Allow FlowBuilder to mount (idempotent after first call).\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 // Same loading treatment as the Available Nodes panel.\n <div className=\"flex h-full w-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <Icon\n icon=\"mynaui:spinner\"\n className=\"size-6 animate-spin text-primary\"\n />\n <span className=\"text-sm text-foreground/60\">\n Loading workflow...\n </span>\n </div>\n </div>\n );\n }\n\n return (\n <ReactFlowProvider>\n <IntegrationReturnHandler />\n <div className=\"flex flex-col h-full\">\n {/* min-h-0 so this row stays bounded by the parent's height instead of\n growing to fit a tall sidebar panel (e.g. the Node Store trigger\n list). Without it the row's default min-height:auto expands and the\n whole canvas scrolls; with it, the sidebar panel scrolls internally. */}\n <div className=\"flex grow min-h-0 divide-x divide-card-foreground/10\">\n <div className=\"grow bg-card md:bg-transparent\">\n <FlowBuilder readOnly={isReadOnly} />\n </div>\n {/* <SidebarModule /> */}\n {!isReadOnly && <SidebarModule />}\n </div>\n </div>\n </ReactFlowProvider>\n );\n};\n","import { useParams } from \"react-router-dom\";\nimport { Icon } from \"@iconify/react\";\nimport { FlowBuilderPage } from \"../_components/flow-builder\";\nimport {\n useEffect,\n useState,\n useRef,\n useMemo,\n useCallback,\n lazy,\n Suspense,\n} from \"react\";\nimport { useFlowStore, type IFlowState } from \"../../../stores/flow-store\";\nimport {\n useLazyWorkflowDefinition,\n useCreateWorkflow,\n} from \"../../../../hooks/useWorkflows\";\nimport { useInstalledNodes } from \"../../../../hooks/store/useInstalledNodes\";\nimport { mergeStickyNotes } from \"../../../lib/sticky-notes\";\nimport type {\n TemplateRequiredNode,\n TemplateNodeCheckResult,\n WorkflowTemplateContent,\n} from \"../../../../types/workflow-template-content\";\nimport type {\n StoreProduct,\n InputMaybe,\n ProductType,\n StoreSortBy,\n} from \"../../../../generated/global-types\";\n\n// Lazy-load the modal to avoid bundle-size impact on non-shared-workflow routes\nconst LazyTemplateConfigurationModal = lazy(() =>\n import(\"../../../components/flow-builder/components/templates/TemplateConfigurationModal\").then(\n (m) => ({ default: m.TemplateConfigurationModal }),\n ),\n);\n\ninterface WorkflowDefinitionData {\n nodes: IFlowState[\"workflow\"][\"nodes\"];\n edges: IFlowState[\"workflow\"][\"edges\"];\n sidebar: IFlowState[\"workflow\"][\"sidebar\"];\n /** Canvas annotations persisted separately from executable nodes. */\n stickyNotes?: IFlowState[\"workflow\"][\"nodes\"];\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);\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n const { getWorkflow } = useLazyWorkflowDefinition();\n const { createWorkflow } = useCreateWorkflow();\n const creatingRef = useRef(false);\n const fromSharedLoadedRef = useRef(false);\n const fetchedWorkflowRef = useRef<IFlowState[\"workflow\"] | null>(null);\n\n // ── Missing-nodes modal state (shared workflow path) ─────────────────────\n const { installedAppIds } = useInstalledNodes();\n const [pendingSharedWorkflow, setPendingSharedWorkflow] = useState<\n IFlowState[\"workflow\"] | null\n >(null);\n const [sharedNodeCheck, setSharedNodeCheck] =\n useState<TemplateNodeCheckResult | null>(null);\n const [configModalOpen, setConfigModalOpen] = useState(false);\n const [installing, setInstalling] = useState(false);\n const [installProgress, setInstallProgress] = useState<{\n current: number;\n total: number;\n nodeName: string;\n } | null>(null);\n\n // Classify requiredNodeTypes into installed / missing / missingPaid.\n // Logic mirrors buildNodeCheck in desktop-sidebar-fragment.\n const buildNodeCheck = useCallback(\n (requiredNodeTypes: TemplateRequiredNode[]): TemplateNodeCheckResult => {\n const installed = requiredNodeTypes.filter(\n (n) =>\n n.publishType === \"BUILTIN\" ||\n (n.storeProductId && installedAppIds.has(n.storeProductId)),\n );\n const notInstalled = requiredNodeTypes.filter(\n (n) =>\n n.publishType !== \"BUILTIN\" &&\n (!n.storeProductId || !installedAppIds.has(n.storeProductId)),\n );\n const missing = notInstalled.filter((n) => !n.requiresPurchase);\n const missingPaid = notInstalled.filter((n) => !!n.requiresPurchase);\n return {\n installed,\n missing,\n missingPaid,\n canImport: missingPaid.length === 0,\n };\n },\n [installedAppIds],\n );\n\n // Keep a ref so the loadWorkflow effect can call buildNodeCheck without\n // taking it as a reactive dependency (which would re-trigger the effect\n // on every render and cause infinite CreateWorkflowDefinition mutations).\n const buildNodeCheckRef = useRef(buildNodeCheck);\n useEffect(() => {\n buildNodeCheckRef.current = buildNodeCheck;\n });\n\n // Install missing free nodes then open the pending shared workflow in the builder.\n const handleSharedConfirm = useCallback(async () => {\n if (!pendingSharedWorkflow) return;\n const nodesToInstall = (sharedNodeCheck?.missing ?? []).filter(\n (n) => !!n.storeProductId,\n );\n\n if (nodesToInstall.length > 0) {\n setInstalling(true);\n try {\n const { getGlobalStoreClient } =\n await import(\"../../../../graphql/global-client\");\n const { InstallWorkflowNodeDocument } =\n await import(\"../../../../generated/global-operations\");\n const { getFluidGridsConfig } = await import(\"../../../../config\");\n\n const storeClient = getGlobalStoreClient();\n const cfg = getFluidGridsConfig();\n\n for (let i = 0; i < nodesToInstall.length; i++) {\n const node = nodesToInstall[i];\n setInstallProgress({\n current: i + 1,\n total: nodesToInstall.length,\n nodeName: node.displayName || node.nodeType,\n });\n try {\n if (storeClient) {\n await storeClient.mutate({\n mutation: InstallWorkflowNodeDocument,\n variables: {\n input: {\n productId: node.storeProductId!,\n workspaceId: cfg.workspaceId,\n organizationId: cfg.tenantId,\n version: node.nodeVersion,\n manifest: null,\n },\n },\n });\n }\n } catch {\n // Best-effort: continue installing remaining nodes\n }\n }\n } finally {\n setInstalling(false);\n setInstallProgress(null);\n }\n }\n\n setConfigModalOpen(false);\n setWorkflow(pendingSharedWorkflow);\n setPendingSharedWorkflow(null);\n setSharedNodeCheck(null);\n }, [pendingSharedWorkflow, sharedNodeCheck]);\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: \"store-browse\" 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 // For versioned workflows, set loading so FlowBuilderPage unmounts\n // before Zustand is cleared. This prevents the flash of an empty\n // canvas when the component is reused across route navigations.\n if (version && mounted) {\n setIsLoading(true);\n }\n\n if (!version) {\n // Check for a manifest copied from a public shared workflow\n const fromSharedId =\n typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search).get(\"fromShared\")\n : null;\n const pendingManifestJson =\n fromSharedId && typeof localStorage !== \"undefined\"\n ? localStorage.getItem(\"pendingSharedWorkflow\")\n : null;\n\n if (fromSharedId && pendingManifestJson) {\n try {\n // Do NOT remove from localStorage here — React StrictMode double-fires\n // effects (mount → cleanup → mount). If we remove on the first run,\n // the second run finds null and falls through to an empty workflow.\n // We remove it inside `if (mounted)` so only the \"winning\" run\n // (the one whose mounted flag is still true) clears the entry.\n const manifest = JSON.parse(pendingManifestJson) as {\n nodes?: IFlowState[\"workflow\"][\"nodes\"];\n edges?: IFlowState[\"workflow\"][\"edges\"];\n name?: string;\n };\n\n const sharedWorkflow: IFlowState[\"workflow\"] = {\n ...newWorkflow,\n name: manifest.name ?? \"Copied Workflow\",\n nodes: manifest.nodes ?? [],\n edges: manifest.edges ?? [],\n };\n\n // Detect node types not installed in this workspace and resolve\n // each to its storeProductId so the TemplateConfigurationModal\n // can offer one-click installation (same logic as handleUseTemplate).\n const requiredNodeTypes: TemplateRequiredNode[] = [];\n try {\n const { NODE_CONFIGS, ensureNodeConfigsLoaded } =\n await import(\"../../../components/flow-builder/components/blocks\");\n await ensureNodeConfigsLoaded().catch(() => {});\n\n const workflowNodeTypes = [\n ...new Set(\n sharedWorkflow.nodes\n .map((n) => n.type)\n .filter((t): t is string => Boolean(t)),\n ),\n ];\n\n const missingTypes = workflowNodeTypes.filter(\n (type) => !NODE_CONFIGS.some((c) => c.type === type),\n );\n\n if (missingTypes.length > 0) {\n const { getGlobalStoreClient } =\n await import(\"../../../../graphql/global-client\");\n const { BrowseWorkflowNodesDocument } =\n await import(\"../../../../generated/global-operations\");\n\n const storeClient = getGlobalStoreClient();\n if (storeClient) {\n const storeResult = await storeClient.query({\n query: BrowseWorkflowNodesDocument,\n variables: {\n input: {\n filter: {\n type: \"NODE\" as InputMaybe<ProductType>,\n compatibleWith: \"fluidgrids\",\n },\n sortBy: \"DOWNLOADS\" as InputMaybe<StoreSortBy>,\n pagination: { limit: 200, offset: 0 },\n },\n },\n fetchPolicy: \"cache-first\",\n });\n\n const storeNodes =\n (\n storeResult.data as {\n browseStore?: { products?: StoreProduct[] };\n }\n )?.browseStore?.products ?? [];\n\n const nodeTypeToProduct = new Map<string, StoreProduct>();\n for (const product of storeNodes) {\n const mNodeType = (\n product.manifest as Record<string, unknown> | null\n )?.nodeType as string | undefined;\n if (mNodeType) nodeTypeToProduct.set(mNodeType, product);\n }\n\n for (const type of workflowNodeTypes) {\n const isInstalled = NODE_CONFIGS.some(\n (c) => c.type === type,\n );\n if (isInstalled) {\n requiredNodeTypes.push({\n nodeType: type,\n nodeVersion: \"1.0\",\n publishType: \"BUILTIN\",\n displayName: type,\n });\n } else {\n const product = nodeTypeToProduct.get(type);\n requiredNodeTypes.push({\n nodeType: type,\n nodeVersion: product?.manifestVersion ?? \"1.0\",\n publishType: \"STORE\",\n storeProductId: product?.id,\n displayName: product?.name ?? type,\n requiresPurchase:\n product !== undefined &&\n product.pricingModel !== \"FREE\",\n });\n }\n }\n }\n }\n } catch {\n // NODE_CONFIGS check or store query failed — skip dependency check\n }\n\n if (mounted) {\n // Safe to clear now — this is the winning effect run.\n localStorage.removeItem(\"pendingSharedWorkflow\");\n\n if (requiredNodeTypes.length > 0) {\n // Use the ref so this effect doesn't re-run every time\n // installedAppIds changes (which would cause infinite mutations).\n const nodeCheck =\n buildNodeCheckRef.current(requiredNodeTypes);\n const needsConfig =\n nodeCheck.missing.length > 0 ||\n nodeCheck.missingPaid.length > 0;\n\n if (needsConfig) {\n // Surface the TemplateConfigurationModal before creating\n // the workflow so the user can install missing nodes first.\n setPendingSharedWorkflow(sharedWorkflow);\n setSharedNodeCheck(nodeCheck);\n setConfigModalOpen(true);\n setIsLoading(false);\n fromSharedLoadedRef.current = true;\n return;\n }\n }\n\n setWorkflow(sharedWorkflow);\n setIsLoading(false);\n fromSharedLoadedRef.current = true;\n }\n return;\n } catch (e) {\n console.error(\"[WorkflowItem] parse error:\", e);\n // Corrupted localStorage entry — only clear if we're the winning run.\n if (mounted) localStorage.removeItem(\"pendingSharedWorkflow\");\n }\n }\n\n // If a previous effect run already loaded the shared workflow, don't overwrite it\n if (fromSharedId && fromSharedLoadedRef.current) {\n if (mounted) setIsLoading(false);\n return;\n }\n\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 (defData) {\n // Build the workflow state — store in ref regardless of mounted status so\n // a subsequent effect run can use it if its own getWorkflow call fails.\n const workflowState: IFlowState[\"workflow\"] = {\n ...defData,\n // Sticky notes are stored under a separate definition key — merge\n // them back onto the canvas alongside the executable nodes.\n nodes: mergeStickyNotes(defData) as IFlowState[\"workflow\"][\"nodes\"],\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 fetchedWorkflowRef.current = workflowState;\n if (mounted) {\n setWorkflow(workflowState);\n }\n return;\n }\n\n if (mounted) {\n // If a previous effect run already fetched the workflow (but was cancelled),\n // use its result rather than trying to create a new workflow.\n if (fetchedWorkflowRef.current) {\n setWorkflow(fetchedWorkflowRef.current);\n return;\n }\n\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 setWorkflow(newWorkflow);\n }\n } catch (createError) {\n console.error(\n \"[WorkflowItem] Error creating workflow:\",\n createError,\n );\n if (mounted) {\n setWorkflow(fetchedWorkflowRef.current ?? newWorkflow);\n }\n }\n }\n }\n } catch (error) {\n console.error(\"[WorkflowItem] Error loading workflow:\", error);\n if (mounted) {\n setWorkflow(fetchedWorkflowRef.current ?? 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 }, [\n id,\n version,\n createWorkflow,\n getWorkflow,\n newWorkflow,\n resetWorkflow,\n // buildNodeCheckRef is intentionally omitted — it's a ref (stable by definition)\n // and including buildNodeCheck here caused infinite re-runs because installedAppIds\n // produces a new Set reference on every render.\n ]);\n\n if (isLoading)\n return (\n // Same loading treatment as the Available Nodes panel, centered on the\n // full canvas area while the workflow definition is fetched.\n <div className=\"flex h-full min-h-[60vh] w-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <Icon\n icon=\"mynaui:spinner\"\n className=\"size-6 animate-spin text-primary\"\n />\n <span className=\"text-sm text-foreground/60\">\n Loading workflow...\n </span>\n </div>\n </div>\n );\n\n // Build a minimal WorkflowTemplateContent shell so TemplateConfigurationModal\n // can render. The definitionJson is not needed for the modal's node-check UI.\n const sharedModalContent: WorkflowTemplateContent | null =\n pendingSharedWorkflow\n ? {\n definitionJson: { nodes: [], edges: [] },\n requiredNodeTypes: sharedNodeCheck\n ? [\n ...sharedNodeCheck.installed,\n ...sharedNodeCheck.missing,\n ...sharedNodeCheck.missingPaid,\n ]\n : [],\n defaultWorkflowName: pendingSharedWorkflow.name,\n }\n : null;\n\n return (\n <>\n {/* Missing-nodes modal shown before a shared workflow is opened in the builder.\n Mirrors the TemplateConfigurationModal used by the template import flow so\n users get the same install / purchase experience regardless of entry point. */}\n {configModalOpen && pendingSharedWorkflow && (\n <Suspense fallback={null}>\n <LazyTemplateConfigurationModal\n open={configModalOpen}\n onOpenChange={(open) => {\n if (!open && pendingSharedWorkflow) {\n // Dismissed without confirming — open anyway (user can install later)\n setConfigModalOpen(false);\n setWorkflow(pendingSharedWorkflow);\n setPendingSharedWorkflow(null);\n setSharedNodeCheck(null);\n }\n }}\n template={null}\n content={sharedModalContent}\n nodeCheckResult={sharedNodeCheck}\n onConfirm={handleSharedConfirm}\n importing={installing}\n installProgress={installProgress}\n />\n </Suspense>\n )}\n\n {workflow && !isLoading && <FlowBuilderPage workflow={workflow} />}\n </>\n );\n}\n","import 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 <WorkflowItem />\n </ErrorBoundary>\n );\n}\n"]}
|