@burdenoff/fluidgrids-fe-sdk 2026.709.2 → 2026.710.2

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/builder/components/theme-provider.tsx","../src/builder/hooks/use-delete-node.ts","../src/builder/components/flow-builder/components/ui/node-card.tsx","../src/builder/components/flow-builder/components/handles/custom-handler.tsx","../src/builder/components/flow-builder/components/blocks/nodes/node/output-handles.tsx","../src/builder/components/flow-builder/components/blocks/nodes/node/logic-node-card.tsx","../src/modules/ui-blocks/registry.ts","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/property-panels/internal/ExpressionEditor.tsx","../src/modules/ui-blocks/blocks/ExpressionEditorBlock.tsx","../src/modules/ui-blocks/blocks/JsonBlock.tsx","../src/modules/ui-blocks/blocks/KeyValueBlock.tsx","../src/modules/ui-blocks/blocks/builtins.ts","../src/modules/ui-blocks/path.ts","../src/modules/adaptive-cards/components/coerce.ts","../src/modules/adaptive-cards/components/index.tsx","../src/modules/ui-blocks/parse.ts","../src/modules/ui-blocks/hooks/use-stable-json.ts","../src/modules/ui-blocks/components/AdaptiveCardBlock.tsx","../src/modules/ui-blocks/components/UnknownBlock.tsx","../src/modules/ui-blocks/components/BlocksRenderer.tsx","../src/modules/connections/hooks/useConnections.ts","../src/modules/connections/utils/provider-helpers.ts","../src/modules/connections/components/provider-forms/base/OAuth2BaseForm.tsx","../src/modules/connections/components/provider-forms/base/ApiKeyBaseForm.tsx","../src/modules/connections/components/provider-forms/base/BasicAuthBaseForm.tsx","../src/modules/connections/components/provider-forms/base/BearerTokenBaseForm.tsx","../src/modules/connections/components/provider-forms/providers/GoogleGmailForm.tsx","../src/modules/connections/components/provider-forms/providers/GoogleDriveForm.tsx","../src/modules/connections/components/provider-forms/providers/GoogleCalendarForm.tsx","../src/modules/connections/components/provider-forms/providers/GoogleSheetsForm.tsx","../src/modules/connections/components/provider-forms/providers/GoogleDocsForm.tsx","../src/modules/connections/components/provider-forms/providers/MicrosoftOutlookForm.tsx","../src/modules/connections/components/provider-forms/providers/MicrosoftOneDriveForm.tsx","../src/modules/connections/components/provider-forms/providers/MicrosoftTeamsForm.tsx","../src/modules/connections/components/provider-forms/providers/MicrosoftExcelForm.tsx","../src/modules/connections/components/provider-forms/providers/GitHubForm.tsx","../src/modules/connections/components/provider-forms/providers/SlackForm.tsx","../src/modules/connections/components/provider-forms/providers/HubSpotForm.tsx","../src/modules/connections/components/provider-forms/providers/SalesforceForm.tsx","../src/modules/connections/components/provider-forms/providers/NotionForm.tsx","../src/modules/connections/components/provider-forms/providers/AirtableForm.tsx","../src/modules/connections/components/provider-forms/providers/OpenAIForm.tsx","../src/modules/connections/components/provider-forms/providers/AnthropicForm.tsx","../src/modules/connections/components/provider-forms/providers/LinearForm.tsx","../src/modules/connections/components/provider-forms/providers/BigConsoleForm.tsx","../src/modules/connections/components/provider-forms/providers/SendGridForm.tsx","../src/modules/connections/components/provider-forms/providers/TwilioForm.tsx","../src/modules/connections/components/provider-forms/providers/GenericOAuth2Form.tsx","../src/modules/connections/components/provider-forms/providers/GenericApiKeyForm.tsx","../src/modules/connections/components/provider-forms/providers/GenericBasicAuthForm.tsx","../src/modules/connections/components/provider-forms/index.ts","../src/modules/connections/components/ProviderPicker.tsx","../src/modules/connections/hooks/useConnectionDialog.ts","../src/modules/connections/components/ConnectionFormDialog.tsx","../src/modules/connections/components/ConnectionSelector.tsx","../src/modules/connections/components/ConfigSchemaForm.tsx","../src/builder/hooks/use-save-workflow.ts","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/property-panels/property-panel.tsx","../src/builder/components/flow-builder/components/ui/NodeInfoButtonWithModal.tsx","../src/hooks/useNodeExecution.ts","../src/builder/components/flow-builder/components/blocks/nodes/node/node.tsx","../src/builder/components/flow-builder/components/blocks/index.ts","../src/builder/components/flow-builder/components/blocks/utils.ts","../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/contants/symbols.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-insert-node.ts","../src/builder/hooks/use-add-node-on-edge-drop.ts","../src/builder/hooks/use-drag-drop-flow-builder.ts","../src/builder/hooks/use-is-valid-connection.ts","../src/builder/components/flow-builder/components/controls/canvas-controls.tsx","../src/builder/components/flow-builder/components/add-node-floating-menu/components/node-list.tsx","../src/builder/components/flow-builder/components/add-node-floating-menu/add-node-floating-menu.tsx","../src/builder/hooks/use-flow-validator.ts","../src/builder/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/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":["FeLibsThemeProvider","jsx","cn","nodeLookup","edges","getConnectedEdges","useMemo","jsxs","count","Icon","useState","useCallback","forwardRef","ExpressionEditorBlock","JsonBlock","useImperativeHandle","KeyValueBlock","Input","Button","AdaptiveCardRenderer","sampleData","useRef","useEffect","AdaptiveCardBlock","UnknownBlock","config","gql","Fragment","useShallow","toast","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","isTriggerNodeType","useStore","useReactFlow","Handle","Position","node","nanoid","useContext","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuItem","NodePropertyPanel","produce","useQuery","useMutation","error","NODE_ENDPOINT_CONFIGS","Trash2","Card","React","Badge","Star","Download","Loader2","Sparkles","RefreshCw","lazy","useNavigate","InstallWorkflowNodeDocument","getFluidGridsConfig","applyTemplateInputs","getFluidGridsClient","getGlobalStoreClient","Suspense","a","b","x","y","ThemeProvider","React4","typeCompatibility","memo","CardContent","props","React5","createContext","extractFields","X","Textarea","nodeTypes","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","isRecord","fallbackOperations","OPERATORS","useParams","edgeTypes","id","ReactFlow","Background","ReactFlowProvider"],"mappings":"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","file":"chunk-V67QXGBK.js","sourcesContent":["import * as React from \"react\";\nimport { ThemeProvider as FeLibsThemeProvider } from \"@burdenoff/fe-libs/shared/providers/shell\";\n\nexport interface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: string;\n storageKey?: string;\n}\n\nexport function ThemeProvider({ children }: ThemeProviderProps) {\n return <FeLibsThemeProvider>{children}</FeLibsThemeProvider>;\n}\n","import { useFlowStore } from \"../stores/flow-store\";\nimport { getConnectedEdges, useReactFlow } from \"@xyflow/react\";\nimport { useCallback } from \"react\";\nimport { useShallow } from \"zustand/shallow\";\n\nexport function useDeleteNode() {\n const { getNode, getEdges, deleteElements } = useReactFlow();\n const [deleteNode, deleteEdge] = useFlowStore(\n useShallow((state) => [\n state.actions.nodes.deleteNode,\n state.actions.edges.deleteEdge,\n ]),\n );\n\n return useCallback(\n (id: string) => {\n const node = getNode(id);\n if (!node) return;\n\n const edges = getEdges();\n const connectedEdges = getConnectedEdges([node], edges);\n\n deleteElements({ nodes: [node], edges: connectedEdges }).then();\n deleteNode(node);\n for (const edge of connectedEdges) {\n deleteEdge(edge);\n }\n },\n [deleteElements, getEdges, getNode, deleteNode, deleteEdge],\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport { Icon } from \"@iconify/react\";\n\n// Execution status type\ntype ExecutionStatus = \"idle\" | \"running\" | \"success\" | \"error\";\n\n// ============================================================================\n// Per-node accent color (the tinted icon square + provider identity)\n// ----------------------------------------------------------------------------\n// Node icons are mostly monochrome and the manifest `gradientColor` is a\n// generic default, so we derive a stable accent per provider: a small brand\n// map for well-known apps, hashing the node key otherwise. This is a node\n// *identity* accent (like an avatar color), not themeable chrome — structural\n// colors (card, text, borders) still use semantic tokens below.\n// ============================================================================\n\nconst BRAND_ACCENTS: Array<[RegExp, string]> = [\n [/gmail|google/, \"#ea4335\"],\n [/slack/, \"#611f69\"],\n [/github/, \"#334155\"],\n [/gitlab/, \"#fc6d26\"],\n [/stripe/, \"#635bff\"],\n [/discord/, \"#5865f2\"],\n [/notion/, \"#111827\"],\n [/telegram/, \"#2aabee\"],\n [/whatsapp/, \"#25d366\"],\n [/openai/, \"#10a37f\"],\n [/anthropic|claude/, \"#d97757\"],\n [/twilio/, \"#f22f46\"],\n [/sheet|excel/, \"#21a366\"],\n [/http|api|webhook|rest/, \"#6366f1\"],\n [/db|sql|postgres|mysql|mongo/, \"#0ea5e9\"],\n];\n\nconst HASH_PALETTE = [\n \"#6366f1\",\n \"#0ea5e9\",\n \"#10b981\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#a855f7\",\n \"#ec4899\",\n \"#14b8a6\",\n \"#f97316\",\n \"#8b5cf6\",\n];\n\nexport function nodeAccent(key: string): string {\n const k = (key || \"\").toLowerCase();\n for (const [re, hex] of BRAND_ACCENTS) if (re.test(k)) return hex;\n let h = 0;\n for (let i = 0; i < k.length; i++) h = (h * 31 + k.charCodeAt(i)) >>> 0;\n return HASH_PALETTE[h % HASH_PALETTE.length];\n}\n\n/** Translucent tint of an accent that layers cleanly over light/dark cards. */\nfunction tint(hex: string, pct = 14): string {\n return `color-mix(in srgb, ${hex} ${pct}%, transparent)`;\n}\n\n// ============================================================================\n// NodeCard — the outer container: card box + trigger badge + hover toolbar +\n// execution decorations. Children are the header / body / footer sections and\n// the connection handles.\n// ============================================================================\n\ninterface NodeCardProps extends React.HTMLAttributes<HTMLDivElement> {\n selected?: boolean;\n executionStatus?: ExecutionStatus;\n itemCount?: number;\n /** Show the entry/trigger lightning badge. */\n isTrigger?: boolean;\n /** Role accent (trigger green / action blue / logic amber) for the top\n * border strip and the focus ring. */\n accent?: string;\n /** Toolbar handlers (rendered floating above the card on hover/select). */\n onSettings?: () => void;\n onExecute?: () => void;\n onDelete?: () => void;\n isExecuting?: boolean;\n /** Optional info button (e.g. NodeInfoButtonWithModal) rendered in the toolbar. */\n infoButton?: React.ReactNode;\n}\n\nconst NodeCard = React.forwardRef<HTMLDivElement, NodeCardProps>(\n (\n {\n className,\n selected = false,\n executionStatus = \"idle\",\n itemCount,\n isTrigger = false,\n accent = \"#3b82f6\",\n onSettings,\n onExecute,\n onDelete,\n isExecuting = false,\n infoButton,\n children,\n ...props\n },\n ref,\n ) => {\n const [hovered, setHovered] = React.useState(false);\n\n const statusRing =\n executionStatus === \"running\"\n ? \"ring-2 ring-[var(--color-status-success-border)] animate-pulse-border\"\n : executionStatus === \"success\"\n ? \"ring-2 ring-[var(--color-status-success-border)]\"\n : executionStatus === \"error\"\n ? \"ring-2 ring-[var(--color-status-error-border)]\"\n : \"\";\n\n return (\n <div\n className=\"group/node relative\"\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n {/* Item count badge — shown above the node after execution */}\n {itemCount !== undefined && itemCount > 0 && (\n <div className=\"absolute -top-7 left-1/2 -translate-x-1/2 z-10\">\n <div className=\"rounded-full border border-border bg-card px-2 py-0.5 text-[10px] font-medium text-muted-foreground shadow-sm\">\n {itemCount} item{itemCount !== 1 ? \"s\" : \"\"}\n </div>\n </div>\n )}\n\n {/* Floating action toolbar — appears on hover only, above the node */}\n {(onSettings || onExecute || onDelete || infoButton) && (\n <div\n className={cn(\n \"absolute right-1 z-20 flex items-center gap-0.5 rounded-lg border border-border bg-card p-0.5 shadow-md transition-all duration-150\",\n hovered\n ? \"pointer-events-auto opacity-100\"\n : \"pointer-events-none opacity-0\",\n )}\n style={{\n // Inline offset (not a `-top-*` class) so it survives the host\n // app's Tailwind scan of fe-sdk source, which drops some spacing\n // utilities. The toolbar is ~30px tall; top:-15px centers it on\n // the card's top edge (half outside, half over the card).\n top: -15,\n transform: hovered ? \"translateY(0)\" : \"translateY(4px)\",\n }}\n onDoubleClick={(e) => e.stopPropagation()}\n >\n {onSettings && (\n <ToolbarButton title=\"Configure\" onClick={onSettings}>\n <Icon icon=\"lucide:sliders-horizontal\" className=\"size-4\" />\n </ToolbarButton>\n )}\n {onExecute && (\n <ToolbarButton\n title=\"Execute step\"\n onClick={onExecute}\n disabled={isExecuting}\n >\n {isExecuting ? (\n <Icon\n icon=\"svg-spinners:ring-resize\"\n className=\"size-4 text-[var(--color-status-success-text)]\"\n />\n ) : (\n <Icon\n icon=\"mdi:play\"\n className=\"size-4 text-[var(--color-status-success-text)]\"\n />\n )}\n </ToolbarButton>\n )}\n {infoButton}\n {onDelete && (\n <ToolbarButton title=\"Delete\" onClick={onDelete}>\n <Icon\n icon=\"mynaui:trash\"\n className=\"size-4 text-[var(--color-status-error-text)]\"\n />\n </ToolbarButton>\n )}\n </div>\n )}\n\n {/* The card box. Lifts 2px with a deeper shadow on hover (the group is\n the whole node, so hovering anywhere lifts the card). */}\n <div\n ref={ref}\n data-selected={selected}\n className={cn(\n \"relative w-72 rounded-xl border border-border bg-card shadow-sm will-change-transform\",\n statusRing,\n executionStatus === \"success\" && \"animate-success-glow\",\n className,\n )}\n style={{\n borderTop: `3px solid ${accent}`,\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n transform: hovered ? \"translateY(-2px)\" : \"none\",\n boxShadow: hovered\n ? \"0 2px 4px rgba(16,24,40,0.06), 0 16px 34px -12px rgba(16,24,40,0.24)\"\n : undefined,\n }}\n {...props}\n >\n {/* Focus ring — clean role-accent border on ALL sides when the node\n is hovered or selected (matches the accent top border). Selected\n adds a soft outer halo to read a touch stronger than hover. */}\n <div\n className=\"pointer-events-none absolute -inset-0.5 transition-opacity duration-150\"\n style={{\n borderRadius: 14,\n opacity: selected || hovered ? 1 : 0,\n boxShadow: selected\n ? `0 0 0 2px ${accent}, 0 0 0 5px ${tint(accent, 18)}`\n : `0 0 0 2px ${accent}`,\n }}\n />\n\n {/* Trigger / entry badge. Colors are inline (CSS vars) because the\n host app's Tailwind doesn't generate arbitrary `bg-[var(...)]`\n classes from fe-sdk source — inline styles are scan-independent. */}\n {isTrigger && (\n <div\n className=\"absolute -top-2 -left-2 z-10 flex size-5 items-center justify-center rounded-full shadow-md ring-2 ring-card\"\n style={{ backgroundColor: \"var(--color-status-success-text)\" }}\n >\n <Icon\n icon=\"mdi:lightning-bolt\"\n className=\"size-3\"\n style={{ color: \"var(--color-status-success-text-inverse)\" }}\n />\n </div>\n )}\n\n {children}\n </div>\n\n {/* Execution status corner icon */}\n {executionStatus === \"success\" && (\n <StatusCorner icon=\"mdi:check\" tone=\"success\" />\n )}\n {executionStatus === \"error\" && (\n <StatusCorner icon=\"mdi:close\" tone=\"error\" />\n )}\n {executionStatus === \"running\" && (\n <StatusCorner icon=\"svg-spinners:ring-resize\" tone=\"success\" />\n )}\n </div>\n );\n },\n);\nNodeCard.displayName = \"NodeCard\";\n\nfunction ToolbarButton({\n title,\n onClick,\n disabled,\n children,\n}: {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n title={title}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n onClick?.();\n }}\n className=\"flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50\"\n >\n {children}\n </button>\n );\n}\n\nfunction StatusCorner({\n icon,\n tone,\n}: {\n icon: string;\n tone: \"success\" | \"error\";\n}) {\n const bg =\n tone === \"success\"\n ? \"var(--color-status-success-bg)\"\n : \"var(--color-status-error-bg)\";\n const fg =\n tone === \"success\"\n ? \"var(--color-status-success-text-inverse)\"\n : \"var(--color-status-error-text-inverse)\";\n return (\n <div className=\"absolute -bottom-1.5 -right-1.5 z-10\">\n <div\n className=\"rounded-full p-0.5 shadow-md animate-in zoom-in duration-200\"\n style={{ backgroundColor: bg }}\n >\n <Icon icon={icon} className=\"size-3\" style={{ color: fg }} />\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// NodeCardHeader — tinted icon square + provider name + type badge\n// ============================================================================\n\ninterface NodeCardHeaderProps {\n icon: string;\n /** Short provider/app label (e.g. GMAIL, SLACK). */\n appName: string;\n /** Accent key (node type/title) used to pick the icon-square color. */\n accentKey: string;\n}\n\nconst NodeCardHeader = React.forwardRef<HTMLDivElement, NodeCardHeaderProps>(\n ({ icon, appName, accentKey }, ref) => {\n const accent = nodeAccent(accentKey);\n return (\n <div ref={ref} className=\"flex items-center gap-2.5 px-3 pb-3 pt-4\">\n <div\n className=\"flex size-8 shrink-0 items-center justify-center rounded-lg\"\n style={{\n backgroundColor: tint(accent, 13),\n color: accent,\n border: `1px solid ${tint(accent, 26)}`,\n }}\n >\n <Icon icon={icon} className=\"size-[18px]\" />\n </div>\n <span className=\"min-w-0 flex-1 truncate text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {appName}\n </span>\n </div>\n );\n },\n);\nNodeCardHeader.displayName = \"NodeCardHeader\";\n\n// ============================================================================\n// NodeCardBody — OPERATION label + operation name + description\n// ============================================================================\n\ninterface NodeCardBodyProps {\n operationName: string;\n description?: string;\n}\n\nconst NodeCardBody = React.forwardRef<HTMLDivElement, NodeCardBodyProps>(\n ({ operationName, description }, ref) => (\n <div\n ref={ref}\n className=\"rounded-b-xl border-t border-border/60 px-3 pb-3 pt-2.5\"\n >\n <div className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n Operation\n </div>\n <div className=\"mt-0.5 truncate font-mono text-[13px] font-bold text-card-foreground\">\n {operationName}\n </div>\n {description ? (\n <p className=\"mt-1 line-clamp-2 text-xs leading-snug text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n ),\n);\nNodeCardBody.displayName = \"NodeCardBody\";\n\nexport { NodeCard, NodeCardHeader, NodeCardBody };\n","import { cn } from \"@burdenoff/fe-libs/utils\";\nimport {\n type Edge,\n Handle,\n type HandleProps,\n type InternalNode,\n type Node,\n getConnectedEdges,\n useNodeId,\n useStore,\n} from \"@xyflow/react\";\nimport { useMemo } from \"react\";\n\ntype CustomHandleProps = Readonly<\n Omit<HandleProps, \"isConnectable\"> & {\n isConnectable:\n | boolean\n | number\n | undefined\n | ((value: {\n node: InternalNode<Node>;\n connectedEdges: Edge[];\n }) => boolean);\n /** Role accent color — renders the port as an accent ring with a halo. */\n accent?: string;\n }\n>;\n\nexport default function CustomHandle({\n className,\n isConnectable,\n accent,\n ...props\n}: CustomHandleProps) {\n const { nodeLookup, edges } = useStore(({ nodeLookup, edges }) => ({\n nodeLookup,\n edges,\n }));\n const nodeId = useNodeId();\n\n const isHandleConnectable = useMemo<boolean | undefined>(() => {\n if (!nodeId) return false;\n\n const node = nodeLookup.get(nodeId);\n if (!node) return false;\n\n const connectedEdges = getConnectedEdges([node], edges);\n\n if (typeof isConnectable === \"function\")\n return isConnectable({ node, connectedEdges });\n\n if (typeof isConnectable === \"number\")\n return connectedEdges.length < isConnectable;\n\n return isConnectable;\n }, [edges, isConnectable, nodeId, nodeLookup]);\n\n return (\n <span>\n <Handle\n className={cn(\n \"cursor-crosshair transition-transform hover:scale-110\",\n !accent &&\n \"size-3 border-2 border-card-foreground/40 hover:border-primary/50\",\n className,\n )}\n isConnectable={isHandleConnectable}\n style={\n accent\n ? {\n width: 14,\n height: 14,\n borderRadius: \"50%\",\n background: \"var(--card, #fff)\",\n border: `2.5px solid ${accent}`,\n boxShadow: `0 0 0 3px color-mix(in srgb, ${accent} 12%, transparent)`,\n }\n : undefined\n }\n {...props}\n />\n </span>\n );\n}\n","import { Position, useUpdateNodeInternals } from \"@xyflow/react\";\nimport { useEffect, useMemo } from \"react\";\n\nimport CustomHandle from \"../../../handles/custom-handler\";\n\n/**\n * Connection handle spec — mirrors IInternalNodeManifest.outputHandles in\n * wspace-workflow-svc (seeded into node_endpoint_configs.operations and\n * surfaced by the nodeManifest resolver).\n */\nexport interface NodeHandleSpec {\n /** Handle id — MUST match the activeHandle values the executor returns */\n id: string;\n /** Short label rendered next to the handle (n8n-style) */\n label: string;\n /** Visual tone for the handle/label */\n tone?: \"success\" | \"error\" | \"warning\" | \"info\" | \"neutral\";\n}\n\nexport interface DynamicOutputHandles {\n /** Node state key holding Record<label, handleId> (e.g. Switch `cases`) */\n fromStateRecord: string;\n /** Static trailing handles always rendered (e.g. Switch `default`) */\n extra?: NodeHandleSpec[];\n}\n\nexport type OutputHandlesSpec = NodeHandleSpec[] | DynamicOutputHandles;\n\n/** Tones map to the same accent language the redesigned card uses. */\nconst TONE_COLORS: Record<NonNullable<NodeHandleSpec[\"tone\"]>, string> = {\n success: \"var(--color-status-success-text)\",\n error: \"var(--color-status-error-text)\",\n warning: \"var(--color-status-warning-text)\",\n info: \"#3b82f6\",\n neutral: \"var(--muted-foreground, #6b7280)\",\n};\n\nfunction isDynamicSpec(\n spec: OutputHandlesSpec | undefined,\n): spec is DynamicOutputHandles {\n return (\n !!spec && !Array.isArray(spec) && typeof spec.fromStateRecord === \"string\"\n );\n}\n\n/** The default single unlabeled source handle (legacy card behavior). */\nconst DEFAULT_HANDLES: NodeHandleSpec[] = [{ id: \"source\", label: \"\" }];\n\n/**\n * Resolve the output handles a node card should render.\n *\n * Reads the manifest handle spec from `data.nodeData.outputHandles`; dynamic\n * specs (Switch cases) additionally read the configured record from the\n * node's `args.state` (NDV writes there) falling back to top-level data\n * (legacy panels wrote there).\n */\nexport function resolveOutputHandles(\n data: Record<string, unknown> | undefined,\n): NodeHandleSpec[] {\n const nodeData = data?.nodeData as\n | {\n outputHandles?: OutputHandlesSpec;\n operations?: { outputHandles?: OutputHandlesSpec };\n }\n | undefined;\n // Top-level (surfaced by the nodeManifest resolver) with a fallback to the\n // seeded operations blob (covers svc deployments predating the resolver\n // change — the spec rides inside operations either way).\n const spec = nodeData?.outputHandles ?? nodeData?.operations?.outputHandles;\n\n if (!spec) return DEFAULT_HANDLES;\n\n if (isDynamicSpec(spec)) {\n const args = data?.args as { state?: Record<string, unknown> } | undefined;\n const record =\n (args?.state?.[spec.fromStateRecord] as\n | Record<string, string>\n | undefined) ??\n (data?.[spec.fromStateRecord] as Record<string, string> | undefined) ??\n {};\n\n const dynamic: NodeHandleSpec[] = Object.entries(record)\n .filter(([, handleId]) => typeof handleId === \"string\" && handleId)\n .map(([label, handleId]) => ({ id: handleId, label }));\n\n return [...dynamic, ...(spec.extra ?? [])];\n }\n\n if (spec.length === 0) return DEFAULT_HANDLES;\n return spec;\n}\n\n/**\n * Right-edge output handles for the node card.\n *\n * A single-handle spec renders exactly like the legacy card (one centered\n * unlabeled port). Multi-handle specs render n8n-style: evenly distributed\n * ports on the right edge, each with a small tone-colored label inside the\n * card. Handle geometry is re-measured whenever the resolved set changes\n * (e.g. Switch cases edited in the NDV).\n */\nexport function OutputHandles({\n nodeId,\n handles,\n accent,\n isConnectable,\n}: Readonly<{\n nodeId: string;\n handles: NodeHandleSpec[];\n accent: string;\n isConnectable: boolean | undefined;\n}>) {\n const updateNodeInternals = useUpdateNodeInternals();\n const signature = useMemo(\n () => handles.map((h) => h.id).join(\"|\"),\n [handles],\n );\n\n useEffect(() => {\n updateNodeInternals(nodeId);\n }, [nodeId, signature, updateNodeInternals]);\n\n if (handles.length === 1) {\n const handle = handles[0]!;\n return (\n <CustomHandle\n type=\"source\"\n id={handle.id}\n position={Position.Right}\n isConnectable={isConnectable}\n accent={handle.tone ? TONE_COLORS[handle.tone] : accent}\n />\n );\n }\n\n const total = handles.length;\n return (\n <>\n {handles.map((handle, index) => {\n const top = `${((index + 1) / (total + 1)) * 100}%`;\n const color = handle.tone ? TONE_COLORS[handle.tone] : accent;\n return (\n <div\n key={handle.id}\n className=\"absolute right-0\"\n style={{ top, transform: \"translateY(-50%)\" }}\n >\n <CustomHandle\n type=\"source\"\n id={handle.id}\n position={Position.Right}\n isConnectable={isConnectable}\n accent={color}\n />\n {/* n8n-style: the output label sits OUTSIDE the card, to the\n right of its handle. Inline positioning (not utility classes):\n the host app's Tailwind scans the fe-sdk dist, so novel\n placement utilities may not generate. */}\n {handle.label && (\n <span\n className=\"pointer-events-none absolute whitespace-nowrap text-[10px] font-medium leading-none\"\n style={{\n color,\n left: \"100%\",\n marginLeft: 16,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n }}\n title={handle.label}\n >\n {handle.label}\n </span>\n )}\n </div>\n );\n })}\n </>\n );\n}\n\n/** The default single unlabeled input target (legacy card behavior). */\nconst DEFAULT_INPUT_HANDLES: NodeHandleSpec[] = [{ id: \"target\", label: \"\" }];\n\n/**\n * Resolve the input handles a node card should render (e.g. Merge Input 1/2,\n * Compare Datasets A/B). Defaults to the single \"target\" handle.\n */\nexport function resolveInputHandles(\n data: Record<string, unknown> | undefined,\n): NodeHandleSpec[] {\n const nodeData = data?.nodeData as\n | {\n inputHandles?: NodeHandleSpec[];\n operations?: { inputHandles?: NodeHandleSpec[] };\n }\n | undefined;\n const spec = nodeData?.inputHandles ?? nodeData?.operations?.inputHandles;\n if (!Array.isArray(spec) || spec.length === 0) return DEFAULT_INPUT_HANDLES;\n return spec;\n}\n\n/**\n * Left-edge input handles, mirroring OutputHandles: single specs render as\n * the classic centered target; multi-input specs distribute down the left\n * edge with n8n-style labels OUTSIDE the card.\n */\nexport function InputHandles({\n nodeId,\n handles,\n accent,\n isConnectable,\n}: Readonly<{\n nodeId: string;\n handles: NodeHandleSpec[];\n accent: string;\n isConnectable: boolean | undefined;\n}>) {\n const updateNodeInternals = useUpdateNodeInternals();\n const signature = useMemo(\n () => handles.map((h) => h.id).join(\"|\"),\n [handles],\n );\n\n useEffect(() => {\n updateNodeInternals(nodeId);\n }, [nodeId, signature, updateNodeInternals]);\n\n if (handles.length === 1) {\n const handle = handles[0]!;\n return (\n <CustomHandle\n type=\"target\"\n id={handle.id}\n position={Position.Left}\n isConnectable={isConnectable}\n accent={handle.tone ? TONE_COLORS[handle.tone] : accent}\n />\n );\n }\n\n const total = handles.length;\n return (\n <>\n {handles.map((handle, index) => {\n const top = `${((index + 1) / (total + 1)) * 100}%`;\n const color = handle.tone ? TONE_COLORS[handle.tone] : accent;\n return (\n <div\n key={handle.id}\n className=\"absolute left-0\"\n style={{ top, transform: \"translateY(-50%)\" }}\n >\n <CustomHandle\n type=\"target\"\n id={handle.id}\n position={Position.Left}\n isConnectable={isConnectable}\n accent={color}\n />\n {handle.label && (\n <span\n className=\"pointer-events-none absolute whitespace-nowrap text-[10px] font-medium leading-none\"\n style={{\n color,\n right: \"100%\",\n marginRight: 16,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n }}\n title={handle.label}\n >\n {handle.label}\n </span>\n )}\n </div>\n );\n })}\n </>\n );\n}\n\n/**\n * Extra vertical room (px) the card body needs so multi-handle rows don't\n * crowd the header/body content. Zero for the standard 1-2 handle cards.\n */\nexport function outputHandlesSpacerHeight(count: number): number {\n return count > 2 ? (count - 2) * 26 : 0;\n}\n","import { Icon } from \"@iconify/react\";\n\nimport { NodeCard } from \"../../../ui/node-card\";\nimport {\n InputHandles,\n OutputHandles,\n type NodeHandleSpec,\n} from \"./output-handles\";\n\n/**\n * Compact n8n-style card for internal control-flow nodes (IF, Switch, Merge,\n * Loop, Compare Datasets, …).\n *\n * App/action nodes keep the rich card (brand header, operation, description);\n * logic nodes read better as small squares whose whole story is their labeled\n * output handles — rendered OUTSIDE the right edge, n8n-style, so they never\n * collide with the card content. Height grows with the handle count.\n */\nexport function LogicNodeCard({\n title,\n subtitle,\n icon,\n accent,\n selected,\n executionStatus,\n itemCount,\n isTrigger,\n isExecuting,\n nodeId,\n inputHandles,\n outputHandles,\n isConnectable,\n onDoubleClick,\n onSettings,\n onExecute,\n onDelete,\n infoButton,\n}: Readonly<{\n title: string;\n subtitle?: string;\n icon: string;\n accent: string;\n selected: boolean;\n executionStatus: \"idle\" | \"running\" | \"success\" | \"error\";\n itemCount?: number;\n isTrigger: boolean;\n isExecuting: boolean;\n nodeId: string;\n inputHandles: NodeHandleSpec[];\n outputHandles: NodeHandleSpec[];\n isConnectable: boolean | undefined;\n onDoubleClick: () => void;\n onSettings?: () => void;\n onExecute?: () => void;\n onDelete?: () => void;\n infoButton?: React.ReactNode;\n}>) {\n // Give each labeled handle row breathing room; keep the compact square\n // feel for 1-2 handles.\n const minHeight = Math.max(\n 64,\n Math.max(outputHandles.length, inputHandles.length) * 30 + 24,\n );\n\n return (\n <NodeCard\n className=\"w-48\"\n data-selected={selected}\n selected={selected}\n onDoubleClick={onDoubleClick}\n executionStatus={executionStatus}\n itemCount={itemCount}\n isTrigger={isTrigger}\n accent={accent}\n isExecuting={isExecuting}\n onSettings={onSettings}\n onExecute={onExecute}\n onDelete={onDelete}\n infoButton={infoButton}\n >\n <div\n className=\"flex flex-col items-center justify-center gap-1 px-3 py-3 text-center\"\n style={{ minHeight }}\n >\n <div className=\"flex size-9 items-center justify-center rounded-lg bg-muted\">\n <Icon icon={icon} className=\"size-5\" style={{ color: accent }} />\n </div>\n <span className=\"max-w-full truncate text-sm font-semibold leading-tight\">\n {title}\n </span>\n {subtitle && (\n <span\n className=\"max-w-full truncate font-mono text-[10px] text-muted-foreground\"\n title={subtitle}\n >\n {subtitle}\n </span>\n )}\n </div>\n\n <InputHandles\n nodeId={nodeId}\n handles={inputHandles}\n accent={accent}\n isConnectable={isConnectable}\n />\n\n <OutputHandles\n nodeId={nodeId}\n handles={outputHandles}\n accent={accent}\n isConnectable={isConnectable}\n />\n </NodeCard>\n );\n}\n","import type { CustomBlockComponent } from \"./types\";\n\n/**\n * Registry of named custom block components.\n *\n * Manifests reference blocks by name only — they never ship code. fe-sdk\n * registers the built-in blocks at module load; host apps may register\n * heavyweight blocks (e.g. a monaco-based \"code-editor\") via\n * registerCustomBlock without those dependencies entering fe-sdk.\n */\nconst registry = new Map<string, CustomBlockComponent>();\n\nexport function registerCustomBlock(\n name: string,\n component: CustomBlockComponent,\n): void {\n if (registry.has(name)) {\n console.warn(`ui-blocks: overwriting registered block \"${name}\"`);\n }\n registry.set(name, component);\n}\n\nexport function getCustomBlock(name: string): CustomBlockComponent | undefined {\n return registry.get(name);\n}\n\nexport function listCustomBlocks(): string[] {\n return [...registry.keys()];\n}\n","import { useRef, useState, useCallback } from \"react\";\nimport { Card } from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\n\ninterface ExpressionEditorProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n className?: string;\n rows?: number;\n label?: string;\n helpText?: string;\n}\n\n/**\n * Expression Editor Component\n * A textarea-based code editor for template expressions like {{input.field}}\n */\nexport function ExpressionEditor({\n value,\n onChange,\n placeholder = \"Enter expression...\",\n className,\n rows = 4,\n label,\n helpText,\n}: ExpressionEditorProps) {\n const editorRef = useRef<HTMLTextAreaElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n onChange(e.target.value);\n },\n [onChange],\n );\n\n const insertTemplate = useCallback(\n (template: string) => {\n const textarea = editorRef.current;\n if (!textarea) return;\n\n const start = textarea.selectionStart;\n const end = textarea.selectionEnd;\n const newValue =\n value.substring(0, start) + template + value.substring(end);\n onChange(newValue);\n\n // Set cursor position after inserted text\n setTimeout(() => {\n textarea.focus();\n textarea.setSelectionRange(\n start + template.length,\n start + template.length,\n );\n }, 0);\n },\n [value, onChange],\n );\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n {label && (\n <label className=\"text-sm font-medium text-foreground\">{label}</label>\n )}\n\n <Card\n className={cn(\n \"relative overflow-hidden transition-all\",\n isFocused && \"ring-2 ring-primary ring-offset-1\",\n )}\n >\n {/* Quick insert buttons */}\n <div className=\"flex items-center gap-1 px-2 py-1.5 border-b bg-muted/30\">\n <span className=\"text-xs text-muted-foreground mr-2\">Insert:</span>\n <button\n type=\"button\"\n onClick={() => insertTemplate(\"${TriggerInput.}\")}\n className=\"text-xs px-2 py-0.5 rounded bg-primary/10 text-primary hover:bg-primary/20 transition-colors\"\n >\n {\"${TriggerInput}\"}\n </button>\n <button\n type=\"button\"\n onClick={() => insertTemplate(\"${output.}\")}\n className=\"text-xs px-2 py-0.5 rounded bg-primary/10 text-primary hover:bg-primary/20 transition-colors\"\n >\n {\"${output}\"}\n </button>\n <button\n type=\"button\"\n onClick={() => insertTemplate(\"${WorkflowState[''].output}\")}\n className=\"text-xs px-2 py-0.5 rounded bg-primary/10 text-primary hover:bg-primary/20 transition-colors\"\n >\n {\"${WorkflowState}\"}\n </button>\n </div>\n\n <textarea\n ref={editorRef}\n value={value}\n onChange={handleChange}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n placeholder={placeholder}\n rows={rows}\n spellCheck={false}\n className={cn(\n \"w-full p-3 font-mono text-sm bg-background resize-none\",\n \"focus:outline-none\",\n \"placeholder:text-muted-foreground/50\",\n )}\n />\n </Card>\n\n {helpText && <p className=\"text-xs text-muted-foreground\">{helpText}</p>}\n </div>\n );\n}\n\nexport default ExpressionEditor;\n","import { forwardRef, useImperativeHandle, useState } from \"react\";\nimport { ExpressionEditor } from \"../../../builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/property-panels/internal/ExpressionEditor\";\nimport type { CustomBlockProps, UiBlockHandle } from \"../types\";\n\n/**\n * Built-in \"expression-editor\" block — a template-expression editor for a\n * single string field. Manifest props: path (required), label, helpText,\n * placeholder, rows, default, language (shown as a hint only).\n */\nexport const ExpressionEditorBlock = forwardRef<\n UiBlockHandle,\n CustomBlockProps\n>(function ExpressionEditorBlock({ path, initialValue, options }, ref) {\n const [draft, setDraft] = useState(() =>\n initialValue === undefined || initialValue === null\n ? \"\"\n : String(initialValue),\n );\n\n useImperativeHandle(\n ref,\n () => ({ collectValues: () => ({ [path]: draft }) }),\n [path, draft],\n );\n\n const language =\n typeof options.language === \"string\" ? options.language : undefined;\n const helpText =\n typeof options.helpText === \"string\" ? options.helpText : undefined;\n\n return (\n <ExpressionEditor\n value={draft}\n onChange={setDraft}\n label={typeof options.label === \"string\" ? options.label : undefined}\n placeholder={\n typeof options.placeholder === \"string\"\n ? options.placeholder\n : undefined\n }\n rows={typeof options.rows === \"number\" ? options.rows : undefined}\n helpText={\n language\n ? helpText\n ? `${helpText} · ${language}`\n : language\n : helpText\n }\n />\n );\n});\n","import { forwardRef, useImperativeHandle, useState } from \"react\";\nimport { Textarea } from \"@burdenoff/fe-libs/ui\";\nimport type { CustomBlockProps, UiBlockHandle } from \"../types\";\n\nfunction seedDraft(initialValue: unknown): string {\n if (initialValue === undefined || initialValue === null) return \"\";\n if (typeof initialValue === \"string\") return initialValue;\n try {\n return JSON.stringify(initialValue, null, 2);\n } catch {\n return \"\";\n }\n}\n\n/**\n * Built-in \"json\" block — edits a JSON value stored at `path` with live\n * validation. While the draft is invalid JSON, collectValues() contributes\n * nothing, so Apply never writes a broken value; the inline error stays\n * visible until the user fixes or reverts the draft.\n * Manifest props: path (required), label, helpText, rows.\n */\nexport const JsonBlock = forwardRef<UiBlockHandle, CustomBlockProps>(\n function JsonBlock({ path, initialValue, options }, ref) {\n const [draft, setDraft] = useState(() => seedDraft(initialValue));\n const [error, setError] = useState<string | null>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n collectValues() {\n if (draft.trim() === \"\") return {};\n try {\n return { [path]: JSON.parse(draft) };\n } catch {\n return {};\n }\n },\n }),\n [path, draft],\n );\n\n const handleChange = (value: string) => {\n setDraft(value);\n if (value.trim() === \"\") {\n setError(null);\n return;\n }\n try {\n JSON.parse(value);\n setError(null);\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Invalid JSON\");\n }\n };\n\n return (\n <div className=\"space-y-2\">\n {typeof options.label === \"string\" && (\n <label className=\"text-sm font-medium text-foreground\">\n {options.label}\n </label>\n )}\n <Textarea\n value={draft}\n onChange={(e) => handleChange(e.target.value)}\n rows={typeof options.rows === \"number\" ? options.rows : 6}\n spellCheck={false}\n className=\"font-mono text-sm\"\n placeholder={\n typeof options.placeholder === \"string\" ? options.placeholder : \"{}\"\n }\n />\n {error ? (\n <p className=\"text-xs text-[var(--color-status-error-text)]\">\n {error}\n </p>\n ) : typeof options.helpText === \"string\" ? (\n <p className=\"text-xs text-muted-foreground\">{options.helpText}</p>\n ) : null}\n </div>\n );\n },\n);\n","import { forwardRef, useImperativeHandle, useState } from \"react\";\nimport { Button, Input } from \"@burdenoff/fe-libs/ui\";\nimport { Icon } from \"@iconify/react\";\nimport type { CustomBlockProps, UiBlockHandle } from \"../types\";\n\ninterface Row {\n key: string;\n value: string;\n}\n\nfunction seedRows(initialValue: unknown): Row[] {\n if (\n initialValue !== null &&\n typeof initialValue === \"object\" &&\n !Array.isArray(initialValue)\n ) {\n return Object.entries(initialValue as Record<string, unknown>).map(\n ([key, value]) => ({ key, value: String(value ?? \"\") }),\n );\n }\n return [];\n}\n\n/**\n * Built-in \"key-value\" block — edits a flat string map stored at `path`.\n * Manifest props: path (required), label, keyPlaceholder, valuePlaceholder.\n */\nexport const KeyValueBlock = forwardRef<UiBlockHandle, CustomBlockProps>(\n function KeyValueBlock({ path, initialValue, options }, ref) {\n const [rows, setRows] = useState<Row[]>(() => seedRows(initialValue));\n\n useImperativeHandle(\n ref,\n () => ({\n collectValues: () => ({\n [path]: Object.fromEntries(\n rows.filter((row) => row.key).map((row) => [row.key, row.value]),\n ),\n }),\n }),\n [path, rows],\n );\n\n const updateRow = (index: number, patch: Partial<Row>) => {\n setRows((prev) =>\n prev.map((row, i) => (i === index ? { ...row, ...patch } : row)),\n );\n };\n\n return (\n <div className=\"space-y-2\">\n {typeof options.label === \"string\" && (\n <label className=\"text-sm font-medium text-foreground\">\n {options.label}\n </label>\n )}\n\n {rows.map((row, index) => (\n // Index keys are fine here: rows are an ordered editable list with\n // no stable identity beyond their position.\n <div key={index} className=\"flex items-center gap-2\">\n <Input\n value={row.key}\n onChange={(e) => updateRow(index, { key: e.target.value })}\n placeholder={\n typeof options.keyPlaceholder === \"string\"\n ? options.keyPlaceholder\n : \"Key\"\n }\n className=\"h-8 flex-1\"\n />\n <Input\n value={row.value}\n onChange={(e) => updateRow(index, { value: e.target.value })}\n placeholder={\n typeof options.valuePlaceholder === \"string\"\n ? options.valuePlaceholder\n : \"Value\"\n }\n className=\"h-8 flex-1\"\n />\n <button\n type=\"button\"\n aria-label=\"Remove row\"\n onClick={() =>\n setRows((prev) => prev.filter((_, i) => i !== index))\n }\n className=\"p-1 rounded text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors\"\n >\n <Icon icon=\"lucide:x\" className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setRows((prev) => [...prev, { key: \"\", value: \"\" }])}\n >\n <Icon icon=\"lucide:plus\" className=\"w-3.5 h-3.5 mr-1\" />\n Add\n </Button>\n </div>\n );\n },\n);\n","import { registerCustomBlock } from \"../registry\";\nimport { ExpressionEditorBlock } from \"./ExpressionEditorBlock\";\nimport { JsonBlock } from \"./JsonBlock\";\nimport { KeyValueBlock } from \"./KeyValueBlock\";\n\nlet registered = false;\n\n/**\n * Registers the fe-sdk built-in custom blocks. Called by BlocksRenderer so\n * built-ins are guaranteed available wherever blocks render, regardless of\n * import order or tree-shaking of barrel side effects.\n */\nexport function ensureBuiltinBlocks(): void {\n if (registered) return;\n registered = true;\n registerCustomBlock(\"expression-editor\", ExpressionEditorBlock);\n registerCustomBlock(\"key-value\", KeyValueBlock);\n registerCustomBlock(\"json\", JsonBlock);\n}\n","/**\n * Reads a value at a dot path (e.g. \"a.b.c\") from a nested record.\n * Read-only counterpart of the nested-path writer in the property panel's\n * submittedData(); returns undefined when any segment is missing.\n */\nexport function getAtPath(\n obj: Record<string, unknown> | undefined,\n path: string,\n): unknown {\n if (!obj || !path) return undefined;\n\n let current: unknown = obj;\n for (const key of path.split(\".\")) {\n if (current === null || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[key];\n }\n return current;\n}\n","import type { AdaptiveCardElement, AdaptiveCardPayload } from \"./types\";\n\n/**\n * Coerces submitted data from the card based on input types.\n * Handles Input.Number (converts to number) and Input.Toggle (converts to\n * boolean). The type map is built by walking the card body, containers,\n * column sets, and the nested cards of Action.ShowCard actions — inputs in\n * show cards are collected by getAllInputs() and must coerce identically.\n */\nexport function coerceSubmittedDataFromCard(\n submittedData: Record<string, unknown>,\n cardData: AdaptiveCardPayload,\n): Record<string, unknown> {\n const fieldTypeMap: Record<string, string> = {};\n /** Fields whose numeric value must be a whole number */\n const integerFields = new Set<string>();\n\n // Recursive function to extract input IDs and their types\n function extractInputTypes(elements: AdaptiveCardElement[]) {\n for (const element of elements) {\n if (element.type?.startsWith(\"Input\") && element.id) {\n fieldTypeMap[element.id] = element.type;\n // Opt-in integer coercion: set isInteger: true on an Input.Number element\n // in the Adaptive Card JSON to enforce whole-number storage\n if (element.type === \"Input.Number\" && element.isInteger === true) {\n integerFields.add(element.id);\n }\n }\n\n // If container or other composite element, recurse into items\n if (Array.isArray(element.items)) {\n extractInputTypes(element.items);\n }\n if (Array.isArray(element.columns)) {\n for (const column of element.columns) {\n if (column.items) {\n extractInputTypes(column.items);\n }\n }\n }\n // ActionSet elements may hold Action.ShowCard with nested inputs\n if (Array.isArray(element.actions)) {\n extractFromActions(element.actions as Array<Record<string, unknown>>);\n }\n }\n }\n\n // Walk Action.ShowCard nested cards (their inputs are part of getAllInputs())\n function extractFromActions(actions: Array<Record<string, unknown>>) {\n for (const action of actions) {\n const nested = action?.card as\n | { body?: unknown; actions?: unknown }\n | undefined;\n if (nested && typeof nested === \"object\") {\n if (Array.isArray(nested.body)) {\n extractInputTypes(nested.body as AdaptiveCardElement[]);\n }\n if (Array.isArray(nested.actions)) {\n extractFromActions(nested.actions as Array<Record<string, unknown>>);\n }\n }\n }\n }\n\n if (Array.isArray(cardData.body)) {\n extractInputTypes(cardData.body);\n }\n if (Array.isArray(cardData.actions)) {\n extractFromActions(\n cardData.actions as unknown as Array<Record<string, unknown>>,\n );\n }\n\n // Coerce submitted data based on field types\n const coercedData: Record<string, unknown> = {};\n for (const key in submittedData) {\n const value = submittedData[key];\n const type = fieldTypeMap[key];\n\n switch (type) {\n case \"Input.Number\":\n // Empty string means the user cleared the field — treat as undefined\n // so optional numeric parameters are unset rather than silently becoming 0\n if (value === undefined || value === \"\") {\n coercedData[key] = undefined;\n } else if (integerFields.has(key)) {\n // Integer fields: parse and truncate to prevent float leaking into int-only args\n coercedData[key] = Math.trunc(Number(value));\n } else {\n coercedData[key] = Number(value);\n }\n break;\n case \"Input.Toggle\":\n // Coerce to actual boolean so downstream node state types are correct\n coercedData[key] = value === \"true\" || value === true;\n break;\n default:\n coercedData[key] = value;\n }\n }\n\n return coercedData;\n}\n","import React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport * as AdaptiveCards from \"adaptivecards\";\nimport type {\n AdaptiveCardRendererHandle,\n AdaptiveCardRendererProps,\n AdaptiveCardPayload,\n} from \"./types\";\nimport { coerceSubmittedDataFromCard } from \"./coerce\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\n\n/** Type guard to check if card data has the expected Adaptive Card type field */\nfunction isAdaptiveCard(data: AdaptiveCardPayload): boolean {\n return (data as unknown as Record<string, unknown>).type === \"AdaptiveCard\";\n}\n\n/** Checks if card data is using a custom (non-Adaptive Card) format with inputs */\nfunction isCustomFormat(data: AdaptiveCardPayload): boolean {\n const record = data as unknown as Record<string, unknown>;\n return record.type !== \"AdaptiveCard\" && \"inputs\" in record;\n}\n\n/** Adaptive Cards SDK input with defaultValue — the SDK types are incomplete */\ninterface AdaptiveCardInputWithDefault extends AdaptiveCards.Input {\n defaultValue: string;\n}\n\n/**\n * Simple template expansion - replaces ${variable} with values from data\n * This is a lightweight alternative to adaptivecards-templating\n */\nfunction expandTemplate(obj: unknown, data: Record<string, unknown>): unknown {\n if (typeof obj === \"string\") {\n // Check if the entire string is a single template expression like \"${query}\"\n const singleVarMatch = obj.match(/^\\$\\{([^}]+)\\}$/);\n if (singleVarMatch) {\n const key = singleVarMatch[1].trim();\n const value = data[key];\n // Return the actual value (preserving type: number, boolean, etc.)\n if (value !== undefined && value !== null) {\n // Convert booleans to strings for Adaptive Cards compatibility (Input.Toggle)\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n return value;\n }\n return \"\"; // Return empty string if no value\n }\n\n // For strings with embedded expressions like \"Hello ${name}!\", replace with string values\n return obj.replace(/\\$\\{([^}]+)\\}/g, (_match, key) => {\n const trimmedKey = key.trim();\n const value = data[trimmedKey];\n if (value !== undefined && value !== null) {\n return String(value);\n }\n return \"\";\n });\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => expandTemplate(item, data));\n }\n\n if (obj !== null && typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n // Skip the defaultValue field itself\n if (key === \"defaultValue\") {\n continue;\n }\n result[key] = expandTemplate(value, data);\n }\n return result;\n }\n\n return obj;\n}\n\n/**\n * Apply custom styles to override Adaptive Cards SDK inline styles\n */\nfunction applyCustomStyles(container: HTMLElement) {\n // Common input styles\n const inputStyles = {\n width: \"100%\",\n padding: \"0.5rem 0.75rem\",\n fontSize: \"0.875rem\",\n lineHeight: \"1.5\",\n borderRadius: \"0.375rem\",\n border: \"1px solid hsl(var(--input))\",\n backgroundColor: \"hsl(var(--background))\",\n color: \"hsl(var(--foreground))\",\n outline: \"none\",\n transition: \"border-color 0.2s ease, box-shadow 0.2s ease\",\n };\n\n // Helper to add hover and focus states to an input element\n const addInputInteractivity = (input: HTMLElement) => {\n // Store original border for reset\n const originalBorder = \"1px solid hsl(var(--input))\";\n\n input.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== input) {\n input.style.borderColor = \"hsl(var(--foreground) / 0.3)\";\n }\n });\n\n input.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== input) {\n input.style.border = originalBorder;\n }\n });\n\n input.addEventListener(\"focus\", () => {\n input.style.borderColor = \"hsl(var(--ring))\";\n input.style.boxShadow = \"0 0 0 2px hsl(var(--ring) / 0.2)\";\n });\n\n input.addEventListener(\"blur\", () => {\n input.style.border = originalBorder;\n input.style.boxShadow = \"none\";\n });\n };\n\n // Style all input types: text, number, date, time\n const allInputs = container.querySelectorAll<HTMLInputElement>(\n \".ac-textInput, .ac-numberInput, .ac-dateInput, .ac-timeInput\",\n );\n allInputs.forEach((input) => {\n Object.assign(input.style, inputStyles);\n addInputInteractivity(input);\n });\n\n // Style multiline text inputs (textarea)\n const textareas =\n container.querySelectorAll<HTMLTextAreaElement>(\".ac-multiline\");\n textareas.forEach((textarea) => {\n Object.assign(textarea.style, {\n ...inputStyles,\n minHeight: \"80px\",\n resize: \"vertical\",\n });\n addInputInteractivity(textarea);\n });\n\n // Style dropdown/select inputs (Input.ChoiceSet compact)\n const selects = container.querySelectorAll<HTMLSelectElement>(\n \".ac-choiceSetInput-compact, select\",\n );\n selects.forEach((select) => {\n Object.assign(select.style, {\n ...inputStyles,\n cursor: \"pointer\",\n appearance: \"none\",\n backgroundImage: `url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e\")`,\n backgroundPosition: \"right 0.5rem center\",\n backgroundRepeat: \"no-repeat\",\n backgroundSize: \"1.5em 1.5em\",\n paddingRight: \"2.5rem\",\n });\n addInputInteractivity(select);\n });\n\n // Style radio button groups (Input.ChoiceSet expanded)\n const radioGroups = container.querySelectorAll<HTMLElement>(\n \".ac-choiceSetInput-expanded\",\n );\n radioGroups.forEach((group) => {\n Object.assign(group.style, {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n });\n });\n\n // Style radio buttons\n const radios = container.querySelectorAll<HTMLInputElement>(\n 'input[type=\"radio\"]',\n );\n radios.forEach((radio) => {\n Object.assign(radio.style, {\n width: \"1rem\",\n height: \"1rem\",\n accentColor: \"hsl(var(--primary))\",\n cursor: \"pointer\",\n transition: \"transform 0.1s ease\",\n });\n\n radio.addEventListener(\"mouseenter\", () => {\n radio.style.transform = \"scale(1.1)\";\n });\n\n radio.addEventListener(\"mouseleave\", () => {\n radio.style.transform = \"scale(1)\";\n });\n\n radio.addEventListener(\"focus\", () => {\n radio.style.outline = \"2px solid hsl(var(--ring) / 0.3)\";\n radio.style.outlineOffset = \"2px\";\n });\n\n radio.addEventListener(\"blur\", () => {\n radio.style.outline = \"none\";\n });\n });\n\n // Style checkboxes (Input.Toggle)\n const checkboxes = container.querySelectorAll<HTMLInputElement>(\n 'input[type=\"checkbox\"]',\n );\n checkboxes.forEach((checkbox) => {\n Object.assign(checkbox.style, {\n width: \"1rem\",\n height: \"1rem\",\n accentColor: \"hsl(var(--primary))\",\n cursor: \"pointer\",\n transition: \"transform 0.1s ease\",\n });\n\n checkbox.addEventListener(\"mouseenter\", () => {\n checkbox.style.transform = \"scale(1.1)\";\n });\n\n checkbox.addEventListener(\"mouseleave\", () => {\n checkbox.style.transform = \"scale(1)\";\n });\n\n checkbox.addEventListener(\"focus\", () => {\n checkbox.style.outline = \"2px solid hsl(var(--ring) / 0.3)\";\n checkbox.style.outlineOffset = \"2px\";\n });\n\n checkbox.addEventListener(\"blur\", () => {\n checkbox.style.outline = \"none\";\n });\n });\n\n // Style buttons (Action.Submit, Action.OpenUrl, etc.)\n const buttons =\n container.querySelectorAll<HTMLButtonElement>(\".ac-pushButton\");\n buttons.forEach((button) => {\n Object.assign(button.style, {\n padding: \"0.5rem 1rem\",\n fontSize: \"0.875rem\",\n fontWeight: \"500\",\n borderRadius: \"0.375rem\",\n border: \"none\",\n backgroundColor: \"hsl(var(--primary))\",\n color: \"hsl(var(--primary-foreground))\",\n cursor: \"pointer\",\n transition:\n \"background-color 0.2s ease, transform 0.1s ease, box-shadow 0.2s ease\",\n });\n\n // Add hover state\n button.addEventListener(\"mouseenter\", () => {\n button.style.backgroundColor = \"hsl(var(--primary) / 0.9)\";\n button.style.boxShadow = \"0 2px 4px hsl(var(--primary) / 0.3)\";\n });\n\n button.addEventListener(\"mouseleave\", () => {\n button.style.backgroundColor = \"hsl(var(--primary))\";\n button.style.boxShadow = \"none\";\n });\n\n // Add focus state\n button.addEventListener(\"focus\", () => {\n button.style.boxShadow = \"0 0 0 2px hsl(var(--ring) / 0.3)\";\n });\n\n button.addEventListener(\"blur\", () => {\n button.style.boxShadow = \"none\";\n });\n\n // Add active/pressed state\n button.addEventListener(\"mousedown\", () => {\n button.style.transform = \"scale(0.98)\";\n });\n\n button.addEventListener(\"mouseup\", () => {\n button.style.transform = \"scale(1)\";\n });\n });\n\n // Style labels/text blocks\n const textBlocks = container.querySelectorAll<HTMLElement>(\".ac-textBlock\");\n textBlocks.forEach((textBlock) => {\n // Skip if it's inside a toggle (checkbox label) or radio label\n if (\n textBlock.closest(\".ac-toggleInput\") ||\n textBlock.closest(\".ac-choiceSetInput-expanded\")\n ) {\n Object.assign(textBlock.style, {\n fontSize: \"0.875rem\",\n fontWeight: \"400\",\n color: \"hsl(var(--foreground) / 0.8)\",\n });\n } else {\n Object.assign(textBlock.style, {\n fontSize: \"0.8125rem\",\n fontWeight: \"500\",\n color: \"hsl(var(--foreground) / 0.8)\",\n marginBottom: \"0.25rem\",\n });\n }\n });\n\n // Style action set container\n const actionSets = container.querySelectorAll<HTMLElement>(\".ac-actionSet\");\n actionSets.forEach((actionSet) => {\n Object.assign(actionSet.style, {\n marginTop: \"0.75rem\",\n paddingTop: \"0.75rem\",\n borderTop: \"1px solid hsl(var(--border))\",\n gap: \"0.5rem\",\n });\n });\n\n // Reduce separator heights\n const separators = container.querySelectorAll<HTMLElement>(\n \".ac-horizontal-separator\",\n );\n separators.forEach((separator) => {\n Object.assign(separator.style, {\n height: \"0.5rem\",\n });\n });\n\n // Style images\n const images = container.querySelectorAll<HTMLImageElement>(\".ac-image img\");\n images.forEach((img) => {\n Object.assign(img.style, {\n borderRadius: \"0.375rem\",\n });\n });\n}\n\n/**\n * AdaptiveCardRenderer - Renders Adaptive Cards with template support\n *\n * Features:\n * - Parses Adaptive Card JSON definitions\n * - Expands templates using sample/context data\n * - Handles form submissions with automatic type coercion\n * - Manages input value changes\n */\nconst AdaptiveCardRenderer = forwardRef<\n AdaptiveCardRendererHandle,\n AdaptiveCardRendererProps\n>(function AdaptiveCardRenderer(\n { cardData, sampleData, onSubmit, onAction, className },\n ref,\n) {\n const cardContainerRef = useRef<HTMLDivElement>(null);\n // Parsed SDK card instance for the imperative collectValues() handle\n const adaptiveCardInstanceRef = useRef<AdaptiveCards.AdaptiveCard | null>(\n null,\n );\n // Track if we've done the initial render - we don't want to re-render when sampleData changes\n // because that would reset user inputs. sampleData is only used for initial values.\n const initialSampleDataRef = useRef(sampleData);\n const hasRenderedRef = useRef(false);\n\n // Use refs for callbacks so we always call the latest version without triggering re-renders\n const onSubmitRef = useRef(onSubmit);\n const onActionRef = useRef(onAction);\n\n // Keep refs updated with latest callbacks\n useEffect(() => {\n onSubmitRef.current = onSubmit;\n }, [onSubmit]);\n\n useEffect(() => {\n onActionRef.current = onAction;\n }, [onAction]);\n\n // Keep initialSampleDataRef in sync with latest sampleData so that if the card\n // legitimately re-renders (e.g. cardData template change), it uses the most\n // recent values instead of stale initial ones.\n useEffect(() => {\n initialSampleDataRef.current = sampleData;\n }, [sampleData]);\n\n useEffect(() => {\n if (!cardData || !cardContainerRef.current) {\n adaptiveCardInstanceRef.current = null;\n return;\n }\n\n // Validate that cardData has the correct format\n if (!isAdaptiveCard(cardData)) {\n console.warn(\n 'AdaptiveCardRenderer: Invalid format. Expected type \"AdaptiveCard\"',\n );\n // Clear stale card DOM so the previous node's fields don't remain visible\n cardContainerRef.current.innerHTML = \"\";\n adaptiveCardInstanceRef.current = null;\n return;\n }\n\n const adaptiveCard = new AdaptiveCards.AdaptiveCard();\n\n // Configure host config for styling\n adaptiveCard.hostConfig = new AdaptiveCards.HostConfig({\n fontFamily: \"inherit\",\n spacing: {\n small: 6,\n default: 10,\n medium: 14,\n large: 18,\n extraLarge: 22,\n padding: 12,\n },\n separator: {\n lineThickness: 1,\n lineColor: \"#e5e7eb\",\n },\n containerStyles: {\n default: {\n backgroundColor: \"transparent\",\n foregroundColors: {\n default: { default: \"#374151\", subtle: \"#6b7280\" },\n accent: { default: \"#3b82f6\", subtle: \"#60a5fa\" },\n },\n },\n },\n });\n\n let cardToRender = cardData;\n\n // Get default values from card data and merge with sampleData\n // Use initialSampleDataRef for subsequent renders to avoid resetting user inputs\n const defaultValues = (cardData as unknown as Record<string, unknown>)\n .defaultValue as Record<string, unknown> | undefined;\n const dataToUse = hasRenderedRef.current\n ? initialSampleDataRef.current\n : sampleData;\n const mergedData: Record<string, unknown> = {\n ...defaultValues,\n ...dataToUse,\n };\n\n // Mark as rendered after first render\n hasRenderedRef.current = true;\n\n // Expand templates: replace ${variable} with actual values\n cardToRender = expandTemplate(cardData, mergedData) as AdaptiveCardPayload;\n\n // Parse the expanded card data — SDK parse() accepts loose typing\n adaptiveCard.parse(cardToRender);\n adaptiveCardInstanceRef.current = adaptiveCard;\n\n // If we have default values, set them on the inputs after parsing\n if (Object.keys(mergedData).length > 0) {\n const allInputs = adaptiveCard.getAllInputs();\n for (const input of allInputs) {\n if (input.id && mergedData[input.id] !== undefined) {\n // Set default value if input doesn't already have a value\n if (!input.value || input.value === \"\") {\n // Set defaultValue — SDK Input type doesn't expose this property\n (input as AdaptiveCardInputWithDefault).defaultValue = String(\n mergedData[input.id],\n );\n }\n }\n }\n }\n\n // Set up event listener for actions\n adaptiveCard.onExecuteAction = (action: AdaptiveCards.Action) => {\n if (action instanceof AdaptiveCards.SubmitAction) {\n // Collect all input values from the card\n const allInputs = adaptiveCard.getAllInputs();\n const submittedData: Record<string, unknown> = {};\n\n for (const input of allInputs) {\n if (input.id) {\n submittedData[input.id] = input.value;\n }\n }\n\n // Also include any data from the action itself\n const actionData = (action.data || {}) as Record<string, unknown>;\n Object.assign(submittedData, actionData);\n\n const parsedData = coerceSubmittedDataFromCard(submittedData, cardData);\n onSubmitRef.current?.(parsedData);\n }\n\n // Also call onAction for all action types\n onActionRef.current?.(action);\n };\n\n // Render the card into the container\n const renderedCard = adaptiveCard.render();\n cardContainerRef.current.innerHTML = \"\"; // Clear previous card\n\n if (renderedCard) {\n cardContainerRef.current.appendChild(renderedCard);\n\n // Apply custom styles programmatically to override SDK inline styles\n applyCustomStyles(cardContainerRef.current);\n }\n // Note: sampleData, onSubmit, and onAction are intentionally NOT in the dependency array\n // - sampleData: We only use it for initial values\n // - onSubmit/onAction: We use refs to always call the latest version\n // Including them would cause the card to re-render and reset user inputs.\n }, [cardData]); // deps intentionally limited\n\n // Imperative handle: collect current input values without a submit action.\n // Same collection + coercion as the Action.Submit path above.\n useImperativeHandle(\n ref,\n () => ({\n validateInputs() {\n const adaptiveCard = adaptiveCardInstanceRef.current;\n if (!adaptiveCard) return true;\n\n const invalidInputs = adaptiveCard\n .getAllInputs()\n .filter((input) => !input.validateValue());\n invalidInputs[0]?.focus();\n\n return invalidInputs.length === 0;\n },\n collectValues() {\n const adaptiveCard = adaptiveCardInstanceRef.current;\n if (!adaptiveCard || !cardData) return {};\n\n const collected: Record<string, unknown> = {};\n for (const input of adaptiveCard.getAllInputs()) {\n if (input.id) {\n collected[input.id] = input.value;\n }\n }\n return coerceSubmittedDataFromCard(collected, cardData);\n },\n }),\n [cardData],\n );\n\n if (!cardData) {\n return null;\n }\n\n // Check if card is in custom format (not Adaptive Card schema)\n if (isCustomFormat(cardData)) {\n return (\n <div className=\"p-4 border border-[var(--color-status-warning-border)] rounded bg-[var(--color-status-warning-bg-subtle)] text-sm\">\n <p className=\"font-semibold text-[var(--color-status-warning-text)]\">\n Invalid Adaptive Card Format\n </p>\n <p className=\"text-[var(--color-status-warning-text)] mt-1\">\n The adaptive_card is using a custom format. Please update it to use\n the Microsoft Adaptive Card schema.\n </p>\n <details className=\"mt-2\">\n <summary className=\"cursor-pointer text-[var(--color-status-warning-text)]\">\n View current data\n </summary>\n <pre className=\"mt-2 text-xs overflow-auto max-h-40\">\n {JSON.stringify(cardData, null, 2)}\n </pre>\n </details>\n </div>\n );\n }\n\n return (\n <div\n ref={cardContainerRef}\n className={cn(\"adaptive-card-container\", className)}\n />\n );\n});\n\nexport default AdaptiveCardRenderer;\nexport { AdaptiveCardRenderer };\nexport type {\n AdaptiveCardRendererHandle,\n AdaptiveCardRendererProps,\n} from \"./types\";\n","import type { ResolvedUiSpec, UiBlock, UiSpec } from \"./types\";\n\n/** Minimal shape of a manifest operation as far as UI resolution cares. */\nexport interface UiCapableOperation {\n name?: string;\n adaptive_card?: Record<string, unknown>;\n /**\n * Per-field input descriptors, keyed by field name (e.g.\n * `{ to: { type: \"array\", required: true, description: \"...\" } }`). The node\n * catalog stores `input_fields` even for operations that ship no\n * `adaptive_card`; we synthesize a form from it as a last resort.\n */\n input_fields?: Record<string, unknown>;\n ui?: unknown;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Title-case a snake/camelCase field name for a label, e.g. `htmlBody` → \"Html Body\". */\nfunction humanizeFieldName(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Synthesize a minimal AdaptiveCard form from an operation's `input_fields`\n * map. Mirrors the manifest card convention: one `Input.Text` per field with\n * id `args.state.<field>` (the path the panel writes into), value bound to\n * `${<field>}`, plus a single Submit action so the card's own submit flow\n * applies the values. Returns null when there are no fields.\n */\nfunction synthesizeCardFromInputFields(\n inputFields: Record<string, unknown>,\n): Record<string, unknown> | null {\n const names = Object.keys(inputFields);\n if (names.length === 0) return null;\n\n const body: Array<Record<string, unknown>> = [];\n for (const name of names) {\n const field = isRecord(inputFields[name]) ? inputFields[name] : {};\n const description =\n typeof field.description === \"string\" ? field.description : undefined;\n const required = field.required === true;\n const multiline = name === \"body\" || name === \"htmlBody\";\n const label = humanizeFieldName(name);\n\n body.push({\n type: \"TextBlock\",\n text: required ? `${label} *` : label,\n wrap: true,\n });\n body.push({\n type: \"Input.Text\",\n id: `args.state.${name}`,\n value: `\\${${name}}`,\n ...(description ? { placeholder: description } : {}),\n ...(multiline ? { isMultiline: true } : {}),\n ...(required\n ? { isRequired: true, errorMessage: `${label} is required` }\n : {}),\n });\n }\n body.push({\n type: \"ActionSet\",\n actions: [{ type: \"Action.Submit\", title: \"Apply\" }],\n });\n\n return { type: \"AdaptiveCard\", version: \"1.5\", body };\n}\n\n/**\n * Validates a raw `ui` declaration from a manifest. Returns the typed spec or\n * an error string. Manifests are third-party data — never throw on them.\n */\nfunction validateUiSpec(raw: unknown): UiSpec | string {\n if (!isRecord(raw)) return \"ui is not an object\";\n if (raw.version !== 1)\n return `unsupported ui.version: ${String(raw.version)}`;\n if (!Array.isArray(raw.blocks) || raw.blocks.length === 0) {\n return \"ui.blocks must be a non-empty array\";\n }\n\n const seenIds = new Set<string>();\n const blocks: UiBlock[] = [];\n\n for (const [index, rawBlock] of raw.blocks.entries()) {\n if (!isRecord(rawBlock)) return `ui.blocks[${index}] is not an object`;\n\n const id = rawBlock.id;\n if (typeof id !== \"string\" || id.length === 0) {\n return `ui.blocks[${index}] is missing a non-empty string id`;\n }\n if (seenIds.has(id)) return `ui.blocks has duplicate id \"${id}\"`;\n seenIds.add(id);\n\n if (rawBlock.type === \"adaptive_card\") {\n if (!isRecord(rawBlock.card)) {\n return `ui.blocks[${index}] (\"${id}\") has no card object`;\n }\n blocks.push({ id, type: \"adaptive_card\", card: rawBlock.card });\n } else if (rawBlock.type === \"custom\") {\n if (typeof rawBlock.component !== \"string\" || !rawBlock.component) {\n return `ui.blocks[${index}] (\"${id}\") has no component name`;\n }\n blocks.push({\n id,\n type: \"custom\",\n component: rawBlock.component,\n props: isRecord(rawBlock.props) ? rawBlock.props : undefined,\n });\n } else {\n return `ui.blocks[${index}] (\"${id}\") has unknown type \"${String(rawBlock.type)}\"`;\n }\n }\n\n return {\n version: 1,\n blocks,\n ...(typeof raw.applyLabel === \"string\" && raw.applyLabel.trim().length > 0\n ? { applyLabel: raw.applyLabel }\n : {}),\n };\n}\n\n/**\n * Resolves an operation's UI declaration to a block spec.\n *\n * - Valid `ui` → declared spec (panel-level Apply, per-card submits stripped).\n * - Malformed `ui` → console.warn + fall through to legacy synthesis.\n * - No `ui` but `adaptive_card` → synthesized single-card spec rendered in\n * legacy mode (the card's own Action.Submit flow, exactly as before).\n * - Neither → null (\"No Properties\").\n */\nexport function resolveUiSpec(\n operation: UiCapableOperation | undefined,\n): ResolvedUiSpec | null {\n if (!operation) return null;\n\n if (operation.ui !== undefined) {\n const result = validateUiSpec(operation.ui);\n if (typeof result !== \"string\") {\n return { spec: result, synthesized: false };\n }\n console.warn(\n `ui-blocks: invalid ui declaration on operation \"${operation.name ?? \"?\"}\" (${result}); falling back to adaptive_card`,\n );\n }\n\n if (isRecord(operation.adaptive_card)) {\n return {\n spec: {\n version: 1,\n blocks: [\n { id: \"main\", type: \"adaptive_card\", card: operation.adaptive_card },\n ],\n },\n synthesized: true,\n };\n }\n\n // Last resort: many catalog operations carry `input_fields` but no\n // `adaptive_card` (the card is stripped at registration). Synthesize a basic\n // form so the panel still shows the operation's inputs instead of nothing.\n if (isRecord(operation.input_fields)) {\n const card = synthesizeCardFromInputFields(operation.input_fields);\n if (card) {\n return {\n spec: {\n version: 1,\n blocks: [{ id: \"main\", type: \"adaptive_card\", card }],\n },\n synthesized: true,\n };\n }\n }\n\n return null;\n}\n\ninterface StrippableElement {\n type?: unknown;\n actions?: unknown;\n items?: unknown;\n columns?: unknown;\n [key: string]: unknown;\n}\n\nfunction isSubmitAction(action: unknown): boolean {\n return isRecord(action) && action.type === \"Action.Submit\";\n}\n\n/**\n * Filters submit actions out of an actions array and recurses into the\n * nested card of any retained Action.ShowCard so submits inside show-card\n * bodies/actions are stripped too.\n */\nfunction stripFromActions(actions: unknown[]): unknown[] {\n return actions\n .filter((action) => !isSubmitAction(action))\n .map((action) =>\n isRecord(action) && isRecord(action.card)\n ? { ...action, card: stripSubmitActions(action.card) }\n : action,\n );\n}\n\nfunction stripFromElements(elements: unknown[]): unknown[] {\n const result: unknown[] = [];\n\n for (const element of elements) {\n if (!isRecord(element)) {\n result.push(element);\n continue;\n }\n\n const el = { ...element } as StrippableElement;\n\n if (el.type === \"ActionSet\" && Array.isArray(el.actions)) {\n const remaining = stripFromActions(el.actions);\n // Drop the whole ActionSet when only submit actions were inside;\n // otherwise keep it with the non-submit actions (e.g. Action.OpenUrl).\n if (remaining.length === 0) continue;\n el.actions = remaining;\n }\n\n if (Array.isArray(el.items)) {\n el.items = stripFromElements(el.items);\n }\n if (Array.isArray(el.columns)) {\n el.columns = el.columns.map((column) =>\n isRecord(column) && Array.isArray(column.items)\n ? { ...column, items: stripFromElements(column.items) }\n : column,\n );\n }\n\n result.push(el);\n }\n\n return result;\n}\n\n/**\n * Returns a copy of the card with every Action.Submit removed — from the\n * card-level `actions` array and from ActionSet body elements (recursing into\n * containers and column sets). Non-submit actions are preserved. The input is\n * never mutated: manifest objects are cached and shared by reference.\n */\nexport function stripSubmitActions(\n card: Record<string, unknown>,\n): Record<string, unknown> {\n const result = { ...card };\n\n if (Array.isArray(result.actions)) {\n result.actions = stripFromActions(result.actions);\n }\n if (Array.isArray(result.body)) {\n result.body = stripFromElements(result.body);\n }\n\n return result;\n}\n","import { useMemo, useRef } from \"react\";\n\n/**\n * Returns a reference-stable version of `value`: the same object reference is\n * kept as long as the JSON serialization is unchanged.\n *\n * Needed because updateData deep-clones node data on every change, handing\n * consumers new object references with identical content. AdaptiveCardRenderer\n * rebuilds the card DOM (resetting user inputs) whenever its cardData\n * reference changes, so card JSON must be stabilized per block instance.\n */\nexport function useStableJson<T>(value: T | undefined): T | undefined {\n const jsonRef = useRef<string | undefined>(undefined);\n const stableRef = useRef<T | undefined>(undefined);\n\n return useMemo(() => {\n const json = value === undefined ? undefined : JSON.stringify(value);\n if (json !== jsonRef.current) {\n jsonRef.current = json;\n stableRef.current = value;\n }\n return stableRef.current;\n }, [value]);\n}\n","import { forwardRef, useImperativeHandle, useMemo, useRef } from \"react\";\nimport AdaptiveCardRenderer from \"../../adaptive-cards/components\";\nimport type {\n AdaptiveCardPayload,\n AdaptiveCardRendererHandle,\n} from \"../../adaptive-cards/components/types\";\nimport { stripSubmitActions } from \"../parse\";\nimport { useStableJson } from \"../hooks/use-stable-json\";\nimport type { UiBlockAdaptiveCard, UiBlockHandle } from \"../types\";\n\ninterface AdaptiveCardBlockProps {\n card: UiBlockAdaptiveCard[\"card\"];\n state: Record<string, unknown>;\n /**\n * \"card\": legacy single-card flow — the card keeps its own Action.Submit\n * and submits through onSubmit, exactly as before ui-blocks existed.\n * \"panel\": multi-block flow — submit actions are stripped from the card\n * and values are gathered via collectValues() by the panel-level Apply.\n */\n submitMode: \"card\" | \"panel\";\n onSubmit?: (data: Record<string, unknown>) => void;\n}\n\n/**\n * One Adaptive Card section of a block-composed property panel.\n * Owns the per-instance card-reference stabilization that prevents the\n * renderer from rebuilding the card DOM (and wiping user input) when node\n * data is deep-cloned by updates elsewhere in the panel.\n */\nexport const AdaptiveCardBlock = forwardRef<\n UiBlockHandle,\n AdaptiveCardBlockProps\n>(function AdaptiveCardBlock({ card, state, submitMode, onSubmit }, ref) {\n const rendererRef = useRef<AdaptiveCardRendererHandle>(null);\n\n // Strip first, then stabilize, so the stable reference is the one the\n // renderer actually receives. In legacy \"card\" mode the original card\n // object passes through untouched.\n const cardToRender = useMemo(\n () => (submitMode === \"panel\" ? stripSubmitActions(card) : card),\n [card, submitMode],\n );\n const stableCard = useStableJson(cardToRender);\n\n // Empty deps are intentional: the handle only dereferences the mutable\n // rendererRef at call time, so it never goes stale.\n useImperativeHandle(\n ref,\n () => ({\n validate() {\n return rendererRef.current?.validateInputs() ?? true;\n },\n collectValues() {\n return rendererRef.current?.collectValues() ?? {};\n },\n }),\n [],\n );\n\n return (\n <AdaptiveCardRenderer\n ref={rendererRef}\n // Manifest card JSON is untyped; the renderer validates the\n // AdaptiveCard shape at render time (same cast the panel used before).\n cardData={(stableCard ?? null) as unknown as AdaptiveCardPayload | null}\n sampleData={state}\n onSubmit={submitMode === \"card\" ? onSubmit : undefined}\n />\n );\n});\n","import { forwardRef, useImperativeHandle } from \"react\";\nimport type { UiBlockHandle } from \"../types\";\n\ninterface UnknownBlockProps {\n title: string;\n detail?: string;\n}\n\n/**\n * Fallback rendered when a custom block can't be resolved (unknown registry\n * name, missing required props). Contributes nothing on Apply so a broken\n * block in a third-party manifest can never corrupt node state.\n */\nexport const UnknownBlock = forwardRef<UiBlockHandle, UnknownBlockProps>(\n function UnknownBlock({ title, detail }, ref) {\n useImperativeHandle(ref, () => ({ collectValues: () => ({}) }), []);\n\n return (\n <div className=\"p-3 border border-[var(--color-status-warning-border)] rounded bg-[var(--color-status-warning-bg-subtle)] text-sm\">\n <p className=\"font-semibold text-[var(--color-status-warning-text)]\">\n {title}\n </p>\n {detail && (\n <p className=\"text-[var(--color-status-warning-text)] mt-1 text-xs\">\n {detail}\n </p>\n )}\n </div>\n );\n },\n);\n","import { useCallback, useRef } from \"react\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { ensureBuiltinBlocks } from \"../blocks/builtins\";\nimport { getAtPath } from \"../path\";\nimport { getCustomBlock } from \"../registry\";\nimport type { UiBlockHandle, UiSpec } from \"../types\";\nimport { AdaptiveCardBlock } from \"./AdaptiveCardBlock\";\nimport { UnknownBlock } from \"./UnknownBlock\";\n\nensureBuiltinBlocks();\n\ninterface BlocksRendererProps {\n spec: UiSpec;\n /**\n * true when the spec was synthesized from a legacy `adaptive_card`:\n * the single card keeps its own Action.Submit flow and no panel-level\n * Apply button is rendered — exactly the pre-ui-blocks behavior.\n */\n synthesized: boolean;\n /** Current args.state snapshot (template expansion + draft seeding). */\n state: Record<string, unknown>;\n /**\n * Receives one merged path→value record per Apply (or per legacy card\n * submit). Wire to the panel's existing submittedData().\n */\n onApply: (data: Record<string, unknown>) => void;\n}\n\n/**\n * Renders an operation's UI blocks in declaration order — Adaptive Card\n * blocks and registry custom blocks side by side — and gathers all their\n * values into a single state patch on Apply.\n */\nexport function BlocksRenderer({\n spec,\n synthesized,\n state,\n onApply,\n}: BlocksRendererProps) {\n const handlesRef = useRef(new Map<string, UiBlockHandle>());\n // Stable callback refs per block id so re-renders don't detach handles\n const refCallbacksRef = useRef(\n new Map<string, (handle: UiBlockHandle | null) => void>(),\n );\n\n const handleRefFor = (blockId: string) => {\n let callback = refCallbacksRef.current.get(blockId);\n if (!callback) {\n callback = (handle: UiBlockHandle | null) => {\n if (handle) {\n handlesRef.current.set(blockId, handle);\n } else {\n handlesRef.current.delete(blockId);\n }\n };\n refCallbacksRef.current.set(blockId, callback);\n }\n return callback;\n };\n\n const handleApply = useCallback(() => {\n const merged: Record<string, unknown> = {};\n\n for (const block of spec.blocks) {\n const handle = handlesRef.current.get(block.id);\n if (!handle?.validate) continue;\n\n if (!handle.validate()) {\n return;\n }\n }\n\n // Declaration order; on a path collision the later block wins.\n for (const block of spec.blocks) {\n const handle = handlesRef.current.get(block.id);\n if (!handle) continue;\n\n for (const [rawPath, value] of Object.entries(handle.collectValues())) {\n // AC blocks emit raw card field ids (\"args.state.query\"), custom\n // blocks emit state-relative paths (\"query\") — normalize so\n // collision detection compares like with like.\n const path = rawPath.replace(/^args\\.state\\./, \"\");\n if (path in merged) {\n console.warn(\n `ui-blocks: block \"${block.id}\" overwrites path \"${path}\" set by an earlier block`,\n );\n }\n merged[path] = value;\n }\n }\n\n onApply(merged);\n }, [spec, onApply]);\n\n return (\n <div className=\"flex flex-col gap-4\">\n {spec.blocks.map((block) => {\n if (block.type === \"adaptive_card\") {\n return (\n <AdaptiveCardBlock\n key={block.id}\n ref={handleRefFor(block.id)}\n card={block.card}\n state={state}\n submitMode={synthesized ? \"card\" : \"panel\"}\n onSubmit={synthesized ? onApply : undefined}\n />\n );\n }\n\n const Component = getCustomBlock(block.component);\n if (!Component) {\n return (\n <UnknownBlock\n key={block.id}\n title={`Unknown block component \"${block.component}\"`}\n detail=\"This block is not registered in this app. The rest of the panel works normally.\"\n />\n );\n }\n\n const path =\n typeof block.props?.path === \"string\" ? block.props.path : \"\";\n if (!path) {\n return (\n <UnknownBlock\n key={block.id}\n title={`Block \"${block.id}\" is missing required prop \"path\"`}\n detail=\"The node manifest must declare which args.state field this block edits.\"\n />\n );\n }\n\n return (\n <Component\n key={block.id}\n ref={handleRefFor(block.id)}\n blockId={block.id}\n path={path}\n initialValue={getAtPath(state, path) ?? block.props?.default}\n state={state}\n options={block.props ?? {}}\n />\n );\n })}\n\n {!synthesized && (\n <Button type=\"button\" onClick={handleApply} className=\"self-start\">\n {spec.applyLabel ?? \"Apply\"}\n </Button>\n )}\n </div>\n );\n}\n","/**\n * Custom hooks for fetching connections from the integrations service.\n *\n * These hooks query the wspace-integrations-svc via the federated GraphQL gateway.\n * Connections replace the legacy credentials system for third-party authentication.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { gql } from \"@apollo/client\";\nimport { getFluidGridsClient } from \"../../../graphql/client\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ConnectionStatus =\n | \"ACTIVE\"\n | \"INACTIVE\"\n | \"ERROR\"\n | \"EXPIRED\"\n | \"REVOKED\"\n | \"PENDING_AUTH\";\nexport type ProviderCategory =\n | \"CLOUD_STORAGE\"\n | \"COMMUNICATION\"\n | \"PRODUCTIVITY\"\n | \"CRM\"\n | \"EMAIL\"\n | \"CALENDAR\"\n | \"DEVELOPMENT\"\n | \"SOCIAL\"\n | \"PAYMENT\"\n | \"ANALYTICS\"\n | \"CUSTOM\";\nexport type AuthType =\n | \"OAUTH2\"\n | \"OAUTH1\"\n | \"API_KEY\"\n | \"BASIC_AUTH\"\n | \"BEARER_TOKEN\"\n | \"CUSTOM\";\n\nexport interface IntegrationProvider {\n id: string;\n key: string;\n name: string;\n description?: string;\n category: ProviderCategory;\n authType: AuthType;\n icon?: string;\n color?: string;\n website?: string;\n docsUrl?: string;\n isBuiltIn: boolean;\n isEnabled: boolean;\n}\n\nexport interface IntegrationConnection {\n id: string;\n name: string;\n description?: string;\n providerId: string;\n provider: IntegrationProvider;\n status: ConnectionStatus;\n lastHealthCheck?: string;\n lastUsedAt?: string;\n errorMessage?: string;\n externalAccountId?: string;\n externalAccountEmail?: string;\n externalAccountName?: string;\n grantedScopes: string[];\n createdBy: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ConnectionList {\n items: IntegrationConnection[];\n total: number;\n hasMore: boolean;\n}\n\nexport interface OAuthInitiationResult {\n redirectUrl: string;\n state: string;\n}\n\n// ============================================================================\n// GraphQL Fragments\n// ============================================================================\n\nconst PROVIDER_FIELDS = gql`\n fragment ProviderFields on IntegrationProvider {\n id\n key\n name\n description\n category\n authType\n icon\n color\n website\n docsUrl\n isBuiltIn\n isEnabled\n }\n`;\n\nconst CONNECTION_FIELDS = gql`\n ${PROVIDER_FIELDS}\n fragment ConnectionFields on IntegrationConnection {\n id\n name\n description\n providerId\n provider {\n ...ProviderFields\n }\n status\n lastHealthCheck\n lastUsedAt\n errorMessage\n externalAccountId\n externalAccountEmail\n externalAccountName\n grantedScopes\n createdBy\n createdAt\n updatedAt\n }\n`;\n\n// ============================================================================\n// GraphQL Queries\n// ============================================================================\n\nconst GET_CONNECTIONS = gql`\n ${CONNECTION_FIELDS}\n query GetConnections(\n $filter: ConnectionFilterInput\n $pagination: IntegrationsPaginationInput\n ) {\n getConnections(filter: $filter, pagination: $pagination) {\n items {\n ...ConnectionFields\n }\n total\n hasMore\n }\n }\n`;\n\nconst GET_CONNECTION = gql`\n ${CONNECTION_FIELDS}\n query GetConnection($id: ID!) {\n getConnection(id: $id) {\n ...ConnectionFields\n }\n }\n`;\n\nconst GET_CONNECTIONS_BY_PROVIDER = gql`\n ${CONNECTION_FIELDS}\n query GetConnectionsByProvider(\n $providerId: ID!\n $pagination: IntegrationsPaginationInput\n ) {\n getConnectionsByProvider(providerId: $providerId, pagination: $pagination) {\n items {\n ...ConnectionFields\n }\n total\n hasMore\n }\n }\n`;\n\nconst GET_PROVIDERS = gql`\n ${PROVIDER_FIELDS}\n query GetProviders(\n $filter: ProviderFilterInput\n $pagination: IntegrationsPaginationInput\n ) {\n getProviders(filter: $filter, pagination: $pagination) {\n items {\n ...ProviderFields\n }\n total\n hasMore\n }\n }\n`;\n\n// ============================================================================\n// GraphQL Mutations\n// ============================================================================\n\nconst INITIATE_OAUTH = gql`\n mutation InitiateOAuth($input: InitiateOAuthInput!) {\n initiateOAuth(input: $input) {\n redirectUrl\n state\n }\n }\n`;\n\nconst CREATE_CONNECTION = gql`\n ${CONNECTION_FIELDS}\n mutation CreateConnection($input: CreateConnectionInput!) {\n createConnection(input: $input) {\n ...ConnectionFields\n }\n }\n`;\n\n// ============================================================================\n// Query Hooks\n// ============================================================================\n\ninterface ConnectionFilterOptions {\n providerId?: string;\n status?: ConnectionStatus;\n providerCategory?: ProviderCategory;\n search?: string;\n}\n\ninterface UseConnectionsResult {\n connections: IntegrationConnection[];\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 connections from the integrations service.\n */\nexport function useConnections(\n filter?: ConnectionFilterOptions,\n): UseConnectionsResult {\n const [connections, setConnections] = useState<IntegrationConnection[]>([]);\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 client = getFluidGridsClient();\n const parsedFilter = filterKey ? JSON.parse(filterKey) : undefined;\n\n const result = await client.query<{ getConnections: ConnectionList }>({\n query: GET_CONNECTIONS,\n variables: {\n filter: parsedFilter,\n pagination: { limit: 100 },\n },\n fetchPolicy: \"network-only\",\n });\n\n setConnections(result.data?.getConnections?.items ?? []);\n setTotal(result.data?.getConnections?.total ?? 0);\n setHasMore(result.data?.getConnections?.hasMore ?? false);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [filterKey]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n connections,\n total,\n hasMore,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch a single connection by ID.\n */\nexport function useConnection(connectionId?: string) {\n const [connection, setConnection] = useState<IntegrationConnection | null>(\n null,\n );\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!connectionId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<{\n getConnection: IntegrationConnection | null;\n }>({\n query: GET_CONNECTION,\n variables: { id: connectionId },\n fetchPolicy: \"cache-first\",\n });\n setConnection(result.data?.getConnection ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [connectionId]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n connection,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch connections for a specific provider.\n */\nexport function useConnectionsByProvider(providerId?: string) {\n const [connections, setConnections] = useState<IntegrationConnection[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!providerId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<{\n getConnectionsByProvider: ConnectionList;\n }>({\n query: GET_CONNECTIONS_BY_PROVIDER,\n variables: { providerId, pagination: { limit: 100 } },\n fetchPolicy: \"network-only\",\n });\n setConnections(result.data?.getConnectionsByProvider?.items ?? []);\n setTotal(result.data?.getConnectionsByProvider?.total ?? 0);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [providerId]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n connections,\n total,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch available integration providers.\n */\nexport function useProviders(filter?: {\n category?: ProviderCategory;\n authType?: AuthType;\n isEnabled?: boolean;\n}) {\n const [providers, setProviders] = useState<IntegrationProvider[]>([]);\n const [total, setTotal] = useState(0);\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 client = getFluidGridsClient();\n const parsedFilter = filterKey ? JSON.parse(filterKey) : undefined;\n\n const result = await client.query<{\n getProviders: { items: IntegrationProvider[]; total: number };\n }>({\n query: GET_PROVIDERS,\n variables: {\n filter: parsedFilter,\n pagination: { limit: 100 },\n },\n fetchPolicy: \"cache-first\",\n });\n setProviders(result.data?.getProviders?.items ?? []);\n setTotal(result.data?.getProviders?.total ?? 0);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [filterKey]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n providers,\n total,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Mutation Hooks\n// ============================================================================\n\n/**\n * Hook to create a new connection.\n */\nexport function useCreateConnection() {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const createConnection = useCallback(\n async (input: {\n name: string;\n description?: string;\n providerId: string;\n config?: Record<string, unknown>;\n }) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.mutate<{\n createConnection: IntegrationConnection;\n }>({\n mutation: CREATE_CONNECTION,\n variables: { input },\n });\n return result.data?.createConnection ?? null;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [],\n );\n\n return {\n createConnection,\n loading,\n error,\n };\n}\n\n/**\n * Hook to initiate OAuth flow for a connection.\n */\nexport function useInitiateOAuth() {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const initiateOAuth = useCallback(\n async (input: {\n connectionId: string;\n scopes?: string[];\n redirectUri: string;\n }): Promise<OAuthInitiationResult | null> => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.mutate<{\n initiateOAuth: OAuthInitiationResult;\n }>({\n mutation: INITIATE_OAUTH,\n variables: { input },\n });\n return result.data?.initiateOAuth ?? null;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [],\n );\n\n return {\n initiateOAuth,\n loading,\n error,\n };\n}\n","/**\n * Provider display utilities — icons, labels, colors.\n *\n * Centralizes all provider display metadata for use across\n * the ConnectionSelector, ConnectionFormDialog, and provider forms.\n */\n\nimport type { AuthType, ProviderCategory } from \"../hooks/useConnections\";\nimport { getFluidGridsConfig } from \"../../../config\";\n\n// ============================================================================\n// Provider Icons (Iconify icon names)\n// ============================================================================\n\nconst PROVIDER_ICONS: Record<string, string> = {\n // Google services\n \"google-gmail\": \"logos:google-gmail\",\n \"google-drive\": \"logos:google-drive\",\n \"google-calendar\": \"logos:google-calendar\",\n \"google-sheets\": \"simple-icons:googlesheets\",\n \"google-docs\": \"simple-icons:googledocs\",\n // Microsoft services\n \"microsoft-outlook\": \"vscode-icons:file-type-outlook\",\n \"microsoft-onedrive\": \"simple-icons:onedrive\",\n \"microsoft-teams\": \"logos:microsoft-teams\",\n \"microsoft-excel\": \"vscode-icons:file-type-excel\",\n // Other OAuth2\n github: \"mdi:github\",\n slack: \"logos:slack-icon\",\n salesforce: \"logos:salesforce\",\n hubspot: \"simple-icons:hubspot\",\n notion: \"simple-icons:notion\",\n airtable: \"simple-icons:airtable\",\n // API Key\n openai: \"simple-icons:openai\",\n anthropic: \"simple-icons:anthropic\",\n linear: \"simple-icons:linear\",\n bigconsole: \"mdi:chart-box-outline\",\n sendgrid: \"simple-icons:sendgrid\",\n twilio: \"logos:twilio-icon\",\n // Infrastructure / misc\n stripe: \"logos:stripe\",\n postgres: \"logos:postgresql\",\n mysql: \"logos:mysql\",\n mongodb: \"logos:mongodb-icon\",\n redis: \"logos:redis\",\n aws: \"logos:aws\",\n gcp: \"logos:google-cloud\",\n azure: \"logos:azure-icon\",\n // Generic\n \"generic-oauth2\": \"mdi:key-chain\",\n \"generic-api-key\": \"mdi:key-variant\",\n \"generic-basic-auth\": \"mdi:lock-outline\",\n generic: \"mdi:link-variant\",\n};\n\n/**\n * Get the Iconify icon name for a provider key.\n */\nexport function getProviderIcon(providerKey: string): string {\n return PROVIDER_ICONS[providerKey.toLowerCase()] || PROVIDER_ICONS.generic;\n}\n\n// ============================================================================\n// Provider Colors\n// ============================================================================\n\nconst PROVIDER_COLORS: Record<string, string> = {\n // Google services\n \"google-gmail\": \"#EA4335\",\n \"google-drive\": \"#4285F4\",\n \"google-calendar\": \"#4285F4\",\n \"google-sheets\": \"#0F9D58\",\n \"google-docs\": \"#4285F4\",\n // Microsoft services\n \"microsoft-outlook\": \"#0078D4\",\n \"microsoft-onedrive\": \"#0078D4\",\n \"microsoft-teams\": \"#6264A7\",\n \"microsoft-excel\": \"#217346\",\n // Other OAuth2\n github: \"#24292F\",\n slack: \"#4A154B\",\n hubspot: \"#FF7A59\",\n salesforce: \"#00A1E0\",\n notion: \"#000000\",\n airtable: \"#18BFFF\",\n // API Key\n openai: \"#412991\",\n anthropic: \"#D4A373\",\n linear: \"#5E6AD2\",\n bigconsole: \"#6366F1\",\n sendgrid: \"#1A82E2\",\n twilio: \"#F22F46\",\n // Generic\n \"generic-oauth2\": \"#6B7280\",\n \"generic-api-key\": \"#6B7280\",\n \"generic-basic-auth\": \"#6B7280\",\n};\n\n/**\n * Get the brand color for a provider key.\n */\nexport function getProviderColor(providerKey: string): string {\n return PROVIDER_COLORS[providerKey.toLowerCase()] || \"#6B7280\";\n}\n\n// ============================================================================\n// Auth Type Labels\n// ============================================================================\n\nconst AUTH_TYPE_LABELS: Record<AuthType, string> = {\n OAUTH2: \"OAuth2 API\",\n OAUTH1: \"OAuth1\",\n API_KEY: \"API Key\",\n BASIC_AUTH: \"Basic Auth\",\n BEARER_TOKEN: \"Bearer Token\",\n CUSTOM: \"Custom\",\n};\n\n/**\n * Get a human-readable label for an auth type.\n */\nexport function getAuthTypeLabel(authType: AuthType): string {\n return AUTH_TYPE_LABELS[authType] || authType;\n}\n\n// ============================================================================\n// Category Labels\n// ============================================================================\n\nconst CATEGORY_LABELS: Record<ProviderCategory, string> = {\n CLOUD_STORAGE: \"Cloud Storage\",\n COMMUNICATION: \"Communication\",\n PRODUCTIVITY: \"Productivity\",\n CRM: \"CRM\",\n EMAIL: \"Email\",\n CALENDAR: \"Calendar\",\n DEVELOPMENT: \"Development\",\n SOCIAL: \"Social\",\n PAYMENT: \"Payment\",\n ANALYTICS: \"Analytics\",\n CUSTOM: \"Custom\",\n};\n\n/**\n * Get a human-readable label for a provider category.\n */\nexport function getCategoryLabel(category: ProviderCategory): string {\n return CATEGORY_LABELS[category] || category;\n}\n\n// ============================================================================\n// OAuth Callback URL\n// ============================================================================\n\n/**\n * Get the OAuth callback URL for the integrations service.\n *\n * Returns an ABSOLUTE URL, since OAuth providers require an absolute\n * redirect_uri. The host is derived from the configured wspace gateway base\n * (`apiGatewayUrl`) — which serves the `/integrations/oauth/callback` path —\n * not the app origin. Falls back to the current window origin only when no\n * gateway base is configured.\n */\nexport function getOAuthCallbackUrl(): string {\n const path = \"/integrations/oauth/callback\";\n\n // OAuth providers (Google, Microsoft, …) require an ABSOLUTE redirect_uri.\n // The callback is served by wspace-integrations-svc behind the wspace gateway,\n // so derive it from the configured gateway base — NOT the app origin, since the\n // app host (e.g. fluidgrids.local.burdenoff.com) does not proxy this path; only\n // the wspace gateway host does.\n const gatewayBase = getFluidGridsConfig().apiGatewayUrl;\n if (gatewayBase) {\n try {\n return new URL(path, gatewayBase).toString();\n } catch {\n // malformed base — fall through to host-based fallbacks\n }\n }\n\n // Fallback: raw localhost dev hits the integrations service directly.\n if (\n typeof window !== \"undefined\" &&\n window.location.hostname === \"localhost\"\n ) {\n return `http://localhost:3713${path}`;\n }\n\n // Last resort: same-origin absolute (still better than a relative path).\n if (typeof window !== \"undefined\") {\n return `${window.location.origin}${path}`;\n }\n\n return path;\n}\n","/**\n * Base OAuth2 Connection Form\n *\n * Used as a fallback for any OAuth2 provider that doesn't have\n * a dedicated provider-specific form. Shows a \"Sign in with {Provider}\"\n * button and handles the popup flow.\n */\n\nimport { useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\nimport { getProviderIcon } from \"../../../utils/provider-helpers\";\n\nexport function OAuth2BaseForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n });\n }, [connectionName, connectionDescription, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n {/* Help Banner */}\n {provider.docsUrl && (\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href={provider.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n )}\n\n {/* Connection Name */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder={`My ${provider.name} Connection`}\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* OAuth Info */}\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A new window will\n open for {provider.name} authorization\n </div>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon={getProviderIcon(provider.key)} className=\"w-5 h-5\" />\n )}\n {isSubmitting\n ? \"Waiting for authorization...\"\n : `Sign in with ${provider.name}`}\n </button>\n </div>\n );\n}\n","/**\n * Base API Key Connection Form\n *\n * Used as a fallback for any API_KEY provider that doesn't have\n * a dedicated provider-specific form. Shows a single API key input.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function ApiKeyBaseForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [apiKey, setApiKey] = useState(\"\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey,\n });\n }, [connectionName, connectionDescription, apiKey, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n {/* Help Banner */}\n {provider.docsUrl && (\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href={provider.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n )}\n\n {/* Connection Name */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder={`My ${provider.name} Connection`}\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* API Key */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"Enter your API key\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !apiKey.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Base Basic Auth Connection Form\n *\n * Used as a fallback for any BASIC_AUTH provider that doesn't have\n * a dedicated provider-specific form. Shows username + password fields.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function BasicAuthBaseForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [username, setUsername] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [showPassword, setShowPassword] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n username,\n password,\n });\n }, [connectionName, connectionDescription, username, password, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n {/* Help Banner */}\n {provider.docsUrl && (\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href={provider.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n )}\n\n {/* Connection Name */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder={`My ${provider.name} Connection`}\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Username */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Username <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:account\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type=\"text\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n placeholder=\"Username or email\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n </div>\n\n {/* Password */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Password <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:lock\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showPassword ? \"text\" : \"password\"}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Password\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showPassword ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !connectionName.trim() ||\n !username.trim() ||\n !password.trim()\n }\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Base Bearer Token Connection Form\n *\n * Used as a fallback for any BEARER_TOKEN provider that doesn't have\n * a dedicated provider-specific form. Shows a single token input.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function BearerTokenBaseForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [token, setToken] = useState(\"\");\n const [showToken, setShowToken] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n bearerToken: token,\n });\n }, [connectionName, connectionDescription, token, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n {/* Help Banner */}\n {provider.docsUrl && (\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href={provider.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n )}\n\n {/* Connection Name */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder={`My ${provider.name} Connection`}\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Bearer Token */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Bearer Token <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showToken ? \"text\" : \"password\"}\n value={token}\n onChange={(e) => setToken(e.target.value)}\n placeholder=\"Enter your bearer token\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowToken(!showToken)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showToken ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !token.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Google Gmail Connection Form — OAuth2\n *\n * Dedicated form for Gmail: messages, labels, threads, drafts.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst GMAIL_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/gmail.readonly\",\n label: \"Read messages and labels\",\n },\n {\n scope: \"https://www.googleapis.com/auth/gmail.send\",\n label: \"Send email on your behalf\",\n },\n {\n scope: \"https://www.googleapis.com/auth/gmail.modify\",\n label: \"Read, send, delete, and manage labels\",\n },\n {\n scope: \"https://www.googleapis.com/auth/gmail.compose\",\n label: \"Create and send new emails\",\n },\n {\n scope: \"https://www.googleapis.com/auth/gmail.labels\",\n label: \"Manage mailbox labels\",\n },\n];\n\nexport function GoogleGmailForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"https://www.googleapis.com/auth/gmail.readonly\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.google.com/gmail/api/reference/rest\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Gmail Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Gmail Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {GMAIL_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile) are always included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Google sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-white border border-border text-foreground hover:bg-accent transition-colors disabled:opacity-50 shadow-sm\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:google-gmail\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n}\n","/**\n * Google Drive Connection Form — OAuth2\n *\n * Dedicated form for Google Drive: files, folders, permissions.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst DRIVE_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/drive.readonly\",\n label: \"View files and folders\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive\",\n label: \"Full access to files and folders\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive.file\",\n label: \"Access files created by this app\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n label: \"View file metadata\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive.appdata\",\n label: \"Access app-specific data folder\",\n },\n];\n\nexport function GoogleDriveForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"https://www.googleapis.com/auth/drive.readonly\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.google.com/drive/api/reference/rest/v3\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Google Drive Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Drive Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {DRIVE_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile) are always included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Google sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-white border border-border text-foreground hover:bg-accent transition-colors disabled:opacity-50 shadow-sm\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:google-drive\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n}\n","/**\n * Google Calendar Connection Form — OAuth2\n *\n * Dedicated form for Google Calendar: events, calendars, free/busy.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst CALENDAR_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/calendar.readonly\",\n label: \"View calendar events\",\n },\n {\n scope: \"https://www.googleapis.com/auth/calendar\",\n label: \"Full access to calendars and events\",\n },\n {\n scope: \"https://www.googleapis.com/auth/calendar.events\",\n label: \"View and edit events\",\n },\n {\n scope: \"https://www.googleapis.com/auth/calendar.events.readonly\",\n label: \"View events only\",\n },\n {\n scope: \"https://www.googleapis.com/auth/calendar.settings.readonly\",\n label: \"View calendar settings\",\n },\n];\n\nexport function GoogleCalendarForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"https://www.googleapis.com/auth/calendar.readonly\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.google.com/calendar/api/v3/reference\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Google Calendar Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Calendar Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {CALENDAR_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile) are always included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Google sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-white border border-border text-foreground hover:bg-accent transition-colors disabled:opacity-50 shadow-sm\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:google-calendar\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n}\n","/**\n * Google Sheets Connection Form — OAuth2\n *\n * Dedicated form for Google Sheets: spreadsheets, values, charts.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst SHEETS_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/spreadsheets.readonly\",\n label: \"View spreadsheet data\",\n },\n {\n scope: \"https://www.googleapis.com/auth/spreadsheets\",\n label: \"Full access to spreadsheets\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive.readonly\",\n label: \"View Drive files (for file discovery)\",\n },\n];\n\nexport function GoogleSheetsForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"https://www.googleapis.com/auth/spreadsheets.readonly\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.google.com/sheets/api/reference/rest\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Google Sheets Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Sheets Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {SHEETS_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile) are always included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Google sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-white border border-border text-foreground hover:bg-accent transition-colors disabled:opacity-50 shadow-sm\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"simple-icons:googlesheets\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n}\n","/**\n * Google Docs Connection Form — OAuth2\n *\n * Dedicated form for Google Docs: documents, batch updates.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst DOCS_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/documents.readonly\",\n label: \"View documents\",\n },\n {\n scope: \"https://www.googleapis.com/auth/documents\",\n label: \"Full access to documents\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive.readonly\",\n label: \"View Drive files (for file discovery)\",\n },\n];\n\nexport function GoogleDocsForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"https://www.googleapis.com/auth/documents.readonly\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.google.com/docs/api/reference/rest\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Google Docs Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Docs Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {DOCS_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile) are always included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Google sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-white border border-border text-foreground hover:bg-accent transition-colors disabled:opacity-50 shadow-sm\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"simple-icons:googledocs\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n}\n","/**\n * Microsoft Outlook Connection Form — OAuth2\n *\n * Dedicated form for Outlook: messages, contacts, folders.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst OUTLOOK_SCOPES = [\n { scope: \"Mail.Read\", label: \"Read your mail\" },\n { scope: \"Mail.ReadWrite\", label: \"Read and write your mail\" },\n { scope: \"Mail.Send\", label: \"Send mail as you\" },\n { scope: \"Contacts.Read\", label: \"Read your contacts\" },\n { scope: \"Contacts.ReadWrite\", label: \"Read and write your contacts\" },\n { scope: \"MailboxSettings.Read\", label: \"Read mailbox settings\" },\n];\n\nexport function MicrosoftOutlookForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\"Mail.Read\"]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://learn.microsoft.com/en-us/graph/api/resources/mail-api-overview\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Outlook Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Outlook Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {OUTLOOK_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile, offline_access) are always\n included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Microsoft sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#0078D4] text-white hover:bg-[#0078D4]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:microsoft-icon\" className=\"w-5 h-5\" />\n )}\n {isSubmitting\n ? \"Waiting for authorization...\"\n : \"Sign in with Microsoft\"}\n </button>\n </div>\n );\n}\n","/**\n * Microsoft OneDrive Connection Form — OAuth2\n *\n * Dedicated form for OneDrive: files, folders, sharing, permissions.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst ONEDRIVE_SCOPES = [\n { scope: \"Files.Read\", label: \"Read your files\" },\n { scope: \"Files.ReadWrite\", label: \"Read and write your files\" },\n { scope: \"Files.Read.All\", label: \"Read all files you can access\" },\n {\n scope: \"Files.ReadWrite.All\",\n label: \"Read and write all files you can access\",\n },\n { scope: \"Sites.Read.All\", label: \"Read SharePoint sites\" },\n { scope: \"Sites.ReadWrite.All\", label: \"Read and write SharePoint sites\" },\n];\n\nexport function MicrosoftOneDriveForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"Files.Read\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://learn.microsoft.com/en-us/graph/api/resources/onedrive\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My OneDrive Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n OneDrive Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {ONEDRIVE_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile, offline_access) are always\n included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Microsoft sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#0078D4] text-white hover:bg-[#0078D4]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:microsoft-icon\" className=\"w-5 h-5\" />\n )}\n {isSubmitting\n ? \"Waiting for authorization...\"\n : \"Sign in with Microsoft\"}\n </button>\n </div>\n );\n}\n","/**\n * Microsoft Teams Connection Form — OAuth2\n *\n * Dedicated form for Teams: channels, messages, chats, members.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst TEAMS_SCOPES = [\n { scope: \"Team.ReadBasic.All\", label: \"Read teams info\" },\n { scope: \"Channel.ReadBasic.All\", label: \"Read channel info\" },\n { scope: \"ChannelMessage.Read.All\", label: \"Read channel messages\" },\n { scope: \"ChannelMessage.Send\", label: \"Send channel messages\" },\n { scope: \"Chat.Read\", label: \"Read your chat messages\" },\n { scope: \"Chat.ReadWrite\", label: \"Read and send chat messages\" },\n { scope: \"ChatMessage.Send\", label: \"Send chat messages\" },\n];\n\nexport function MicrosoftTeamsForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"Team.ReadBasic.All\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://learn.microsoft.com/en-us/graph/api/resources/teams-api-overview\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Teams Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Teams Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {TEAMS_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile, offline_access) are always\n included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Microsoft sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#6264A7] text-white hover:bg-[#6264A7]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:microsoft-teams\" className=\"w-5 h-5\" />\n )}\n {isSubmitting\n ? \"Waiting for authorization...\"\n : \"Sign in with Microsoft\"}\n </button>\n </div>\n );\n}\n","/**\n * Microsoft Excel Connection Form — OAuth2\n *\n * Dedicated form for Excel Online: workbooks, worksheets, ranges, tables.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst EXCEL_SCOPES = [\n { scope: \"Files.Read\", label: \"Read workbook files\" },\n { scope: \"Files.ReadWrite\", label: \"Read and write workbook files\" },\n { scope: \"Files.Read.All\", label: \"Read all workbook files you can access\" },\n { scope: \"Files.ReadWrite.All\", label: \"Full access to workbook files\" },\n];\n\nexport function MicrosoftExcelForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"Files.ReadWrite\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://learn.microsoft.com/en-us/graph/api/resources/excel\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Excel Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Excel Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {EXCEL_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile, offline_access) are always\n included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Microsoft sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#217346] text-white hover:bg-[#217346]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"vscode-icons:file-type-excel\" className=\"w-5 h-5\" />\n )}\n {isSubmitting\n ? \"Waiting for authorization...\"\n : \"Sign in with Microsoft\"}\n </button>\n </div>\n );\n}\n","/**\n * GitHub Connection Form — OAuth2\n *\n * Supports GitHub repos, issues, PRs, actions, gists.\n * Shows scope selection and \"Sign in with GitHub\" button.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst GITHUB_SCOPES = [\n {\n scope: \"repo\",\n label: \"Full repository access\",\n description: \"Private & public repos\",\n },\n {\n scope: \"public_repo\",\n label: \"Public repositories only\",\n description: \"Read/write public repos\",\n },\n {\n scope: \"repo:status\",\n label: \"Commit status\",\n description: \"Read/write commit status\",\n },\n {\n scope: \"read:org\",\n label: \"Read organizations\",\n description: \"View org membership\",\n },\n {\n scope: \"workflow\",\n label: \"GitHub Actions\",\n description: \"Update workflows\",\n },\n { scope: \"gist\", label: \"Gists\", description: \"Create gists\" },\n {\n scope: \"notifications\",\n label: \"Notifications\",\n description: \"Access notifications\",\n },\n];\n\nexport function GitHubForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\"repo\"]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n {/* Help Banner */}\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://docs.github.com/en/developers/apps/building-oauth-apps\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n {/* Connection Name */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My GitHub Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Scopes */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {GITHUB_SCOPES.map(({ scope, label, description }) => (\n <label\n key={scope}\n className=\"flex items-start gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1.5 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border mt-0.5\"\n />\n <div>\n <span className=\"text-sm font-medium text-foreground\">\n {label}\n </span>\n <p className=\"text-xs text-muted-foreground\">{description}</p>\n </div>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (user:email, read:user) are always included\n </p>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#24292F] text-white hover:bg-[#24292F]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:github\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with GitHub\"}\n </button>\n </div>\n );\n}\n","/**\n * Slack Connection Form — OAuth2\n *\n * Supports Slack messaging, channels, files, reactions.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst SLACK_SCOPES = [\n { scope: \"chat:write\", label: \"Send messages\" },\n { scope: \"channels:read\", label: \"View channels\" },\n { scope: \"channels:write\", label: \"Manage channels\" },\n { scope: \"files:read\", label: \"View files\" },\n { scope: \"files:write\", label: \"Upload files\" },\n { scope: \"reactions:read\", label: \"View reactions\" },\n { scope: \"reactions:write\", label: \"Add reactions\" },\n];\n\nexport function SlackForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"chat:write\",\n \"channels:read\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://api.slack.com/authentication/oauth-v2\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Slack Workspace\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Bot Scopes\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {SLACK_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (users:read, users:read.email) are always included\n </p>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#4A154B] text-white hover:bg-[#4A154B]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:slack-icon\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Add to Slack\"}\n </button>\n </div>\n );\n}\n","/**\n * HubSpot Connection Form — OAuth2\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst HUBSPOT_SCOPES = [\n { scope: \"crm.objects.contacts.read\", label: \"Read contacts\" },\n { scope: \"crm.objects.contacts.write\", label: \"Write contacts\" },\n { scope: \"crm.objects.deals.read\", label: \"Read deals\" },\n { scope: \"crm.objects.deals.write\", label: \"Write deals\" },\n { scope: \"crm.objects.companies.read\", label: \"Read companies\" },\n { scope: \"crm.objects.companies.write\", label: \"Write companies\" },\n { scope: \"sales-email-read\", label: \"Read sales emails\" },\n { scope: \"forms\", label: \"Access forms\" },\n];\n\nexport function HubSpotForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"crm.objects.contacts.read\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.hubspot.com/docs/api/oauth-quickstart-guide\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My HubSpot Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n CRM Scopes\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {HUBSPOT_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#FF7A59] text-white hover:bg-[#FF7A59]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"simple-icons:hubspot\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Connect HubSpot\"}\n </button>\n </div>\n );\n}\n","/**\n * Salesforce Connection Form — OAuth2\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst SF_SCOPES = [\n { scope: \"full\", label: \"Full access\" },\n { scope: \"chatter_api\", label: \"Access Chatter\" },\n];\n\nexport function SalesforceForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([]);\n const [environment, setEnvironment] = useState<\"production\" | \"sandbox\">(\n \"production\",\n );\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes, environment },\n });\n }, [\n connectionName,\n connectionDescription,\n selectedScopes,\n environment,\n onSubmit,\n ]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_web_server_flow.htm\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Salesforce Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Environment\n </label>\n <select\n value={environment}\n onChange={(e) =>\n setEnvironment(e.target.value as \"production\" | \"sandbox\")\n }\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n >\n <option value=\"production\">Production</option>\n <option value=\"sandbox\">Sandbox</option>\n </select>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Additional Scopes\n </label>\n <div className=\"space-y-1.5 border border-border rounded-md p-3\">\n {SF_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Core scopes (openid, api, refresh_token) are always included\n </p>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#00A1E0] text-white hover:bg-[#00A1E0]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:salesforce\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Connect Salesforce\"}\n </button>\n </div>\n );\n}\n","/**\n * Notion Connection Form — OAuth2\n *\n * Simple OAuth2 form — Notion doesn't use granular scopes,\n * permissions are managed within the Notion integration settings.\n */\n\nimport { useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function NotionForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n });\n }, [connectionName, connectionDescription, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.notion.com/docs/authorization\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Notion Workspace\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div className=\"p-3 rounded-md bg-muted/50 border border-border text-sm text-muted-foreground\">\n <p>\n Notion manages permissions through its integration settings.\n You&apos;ll select which pages and databases to share during the\n authorization step.\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Notion authorization\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-foreground text-background hover:bg-foreground/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"simple-icons:notion\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Connect Notion\"}\n </button>\n </div>\n );\n}\n","/**\n * Airtable Connection Form — OAuth2 with PKCE\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst AIRTABLE_SCOPES = [\n { scope: \"data.records:read\", label: \"Read records\", required: true },\n { scope: \"schema.bases:read\", label: \"Read base schema\", required: true },\n { scope: \"data.records:write\", label: \"Write records\" },\n { scope: \"data.recordComments:read\", label: \"Read comments\" },\n { scope: \"data.recordComments:write\", label: \"Write comments\" },\n { scope: \"webhook:manage\", label: \"Manage webhooks\" },\n];\n\nexport function AirtableForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"data.records:read\",\n \"schema.bases:read\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n const scopeConfig = AIRTABLE_SCOPES.find((s) => s.scope === scope);\n if (scopeConfig?.required) return; // Can't uncheck required scopes\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://airtable.com/developers/web/api/oauth-reference\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Airtable Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Permissions\n </label>\n <div className=\"space-y-1.5 border border-border rounded-md p-3\">\n {AIRTABLE_SCOPES.map(({ scope, label, required }) => (\n <label\n key={scope}\n className={`flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded ${required ? \"opacity-75\" : \"\"}`}\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting || required}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n {required && (\n <span className=\"text-xs text-muted-foreground\">\n (required)\n </span>\n )}\n </label>\n ))}\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#18BFFF] text-white hover:bg-[#18BFFF]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"simple-icons:airtable\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Connect Airtable\"}\n </button>\n </div>\n );\n}\n","/**\n * OpenAI Connection Form — API Key\n *\n * Fields: API Key (required) + Organization ID (optional)\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function OpenAIForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [apiKey, setApiKey] = useState(\"\");\n const [orgId, setOrgId] = useState(\"\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey,\n config: orgId ? { organization: orgId } : undefined,\n });\n }, [connectionName, connectionDescription, apiKey, orgId, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://platform.openai.com/docs/api-reference\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My OpenAI Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"sk-...\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Find your API key at platform.openai.com/api-keys\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Organization ID\n </label>\n <input\n type=\"text\"\n value={orgId}\n onChange={(e) => setOrgId(e.target.value)}\n placeholder=\"org-... (optional)\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Optional — only needed if you belong to multiple organizations\n </p>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !apiKey.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Anthropic Connection Form — API Key\n *\n * Fields: API Key (required) + Base URL (with default) + Custom Header toggle\n * Matches n8n's Anthropic credential form (Image 4).\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function AnthropicForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [apiKey, setApiKey] = useState(\"\");\n const [baseUrl, setBaseUrl] = useState(\"https://api.anthropic.com\");\n const [addCustomHeader, setAddCustomHeader] = useState(false);\n const [headerName, setHeaderName] = useState(\"\");\n const [headerValue, setHeaderValue] = useState(\"\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n const config: Record<string, unknown> = { baseUrl };\n if (addCustomHeader && headerName) {\n config.customHeader = { name: headerName, value: headerValue };\n }\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey,\n config,\n });\n }, [\n connectionName,\n connectionDescription,\n apiKey,\n baseUrl,\n addCustomHeader,\n headerName,\n headerValue,\n onSubmit,\n ]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://docs.anthropic.com/claude/reference\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Anthropic Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"sk-ant-...\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Base URL\n </label>\n <input\n type=\"text\"\n value={baseUrl}\n onChange={(e) => setBaseUrl(e.target.value)}\n placeholder=\"https://api.anthropic.com\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Custom Header Toggle */}\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={addCustomHeader}\n onClick={() => setAddCustomHeader(!addCustomHeader)}\n disabled={isSubmitting}\n className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${addCustomHeader ? \"bg-primary\" : \"bg-muted\"} disabled:opacity-50`}\n >\n <span\n className={`inline-block h-3.5 w-3.5 transform rounded-full bg-white transition-transform ${addCustomHeader ? \"translate-x-4.5\" : \"translate-x-0.5\"}`}\n />\n </button>\n <label className=\"text-sm font-medium text-foreground\">\n Add Custom Header\n </label>\n </div>\n\n {addCustomHeader && (\n <div className=\"space-y-3 pl-4 border-l-2 border-primary/20\">\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Header Name\n </label>\n <input\n type=\"text\"\n value={headerName}\n onChange={(e) => setHeaderName(e.target.value)}\n placeholder=\"X-Custom-Header\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Header Value\n </label>\n <input\n type=\"text\"\n value={headerValue}\n onChange={(e) => setHeaderValue(e.target.value)}\n placeholder=\"value\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !apiKey.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Linear Connection Form — API Key\n *\n * Fields: API Key (required)\n * Simple API key form for Linear issue tracking integration.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function LinearForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [apiKey, setApiKey] = useState(\"\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey,\n config: {},\n });\n }, [connectionName, connectionDescription, apiKey, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.linear.app/docs\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Linear Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <p className=\"text-xs text-muted-foreground mb-2\">\n Go to Linear Settings &rarr; API &rarr; Personal API keys to create\n one.\n </p>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"lin_api_...\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !apiKey.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * BigConsole DataSink Connection Form — API Key\n *\n * Fields: BigConsole URL (required), Workspace ID (required), API Key (required)\n * Used by the bigconsole_datasink_node to push workflow data to BigConsole DataSinks.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function BigConsoleForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [bigconsoleUrl, setBigconsoleUrl] = useState(\"\");\n const [workspaceId, setWorkspaceId] = useState(\"\");\n const [apiKey, setApiKey] = useState(\"\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n const config: Record<string, unknown> = {\n bigconsoleUrl,\n workspaceId,\n };\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey: apiKey || undefined,\n config,\n });\n }, [\n connectionName,\n connectionDescription,\n apiKey,\n bigconsoleUrl,\n workspaceId,\n onSubmit,\n ]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <Icon\n icon=\"mdi:information\"\n className=\"w-4 h-4 text-blue-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-blue-700\">\n Configure the BigConsole service URL and workspace to enable DataSink\n data ingestion from workflows.\n </span>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My BigConsole Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n BigConsole URL <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:link-variant\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type=\"text\"\n value={bigconsoleUrl}\n onChange={(e) => setBigconsoleUrl(e.target.value)}\n placeholder=\"http://localhost:3725\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n <p className=\"text-xs text-muted-foreground mt-1\">\n Base URL of the BigConsole service (e.g., http://localhost:3725)\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Workspace ID <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:identifier\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type=\"text\"\n value={workspaceId}\n onChange={(e) => setWorkspaceId(e.target.value)}\n placeholder=\"726333be-2164-436d-83a3-48097f21790f\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-3 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"Enter API key\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !connectionName.trim() ||\n !bigconsoleUrl.trim() ||\n !workspaceId.trim() ||\n !apiKey.trim()\n }\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * SendGrid Connection Form — API Key\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function SendGridForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [apiKey, setApiKey] = useState(\"\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey,\n });\n }, [connectionName, connectionDescription, apiKey, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://docs.sendgrid.com/api-reference\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My SendGrid Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"SG.xxxxx\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Create an API key in your SendGrid account under Settings &gt; API\n Keys\n </p>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !apiKey.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Twilio Connection Form — API Key (Account SID + Auth Token)\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function TwilioForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [accountSid, setAccountSid] = useState(\"\");\n const [authToken, setAuthToken] = useState(\"\");\n const [showToken, setShowToken] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n // Twilio uses Account SID + Auth Token, we store Auth Token as the API key\n // and Account SID in config for the backend to use\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey: authToken,\n config: { accountSid },\n });\n }, [connectionName, connectionDescription, accountSid, authToken, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://www.twilio.com/docs/usage/api\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Twilio Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Account SID <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={accountSid}\n onChange={(e) => setAccountSid(e.target.value)}\n placeholder=\"ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Found on your Twilio Console dashboard\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Auth Token <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:lock\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showToken ? \"text\" : \"password\"}\n value={authToken}\n onChange={(e) => setAuthToken(e.target.value)}\n placeholder=\"Your auth token\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowToken(!showToken)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showToken ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !connectionName.trim() ||\n !accountSid.trim() ||\n !authToken.trim()\n }\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Generic OAuth2 Connection Form\n *\n * Full OAuth2 configuration for custom/arbitrary providers.\n * User provides Auth URL, Token URL, Client ID, Client Secret, etc.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\nimport { getOAuthCallbackUrl } from \"../../../utils/provider-helpers\";\n\nexport function GenericOAuth2Form({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [clientId, setClientId] = useState(\"\");\n const [clientSecret, setClientSecret] = useState(\"\");\n const [authUrl, setAuthUrl] = useState(\"\");\n const [tokenUrl, setTokenUrl] = useState(\"\");\n const [scopes, setScopes] = useState(\"\");\n const [showSecret, setShowSecret] = useState(false);\n\n const callbackUrl = getOAuthCallbackUrl();\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: {\n clientId,\n clientSecret,\n authUrl,\n tokenUrl,\n scopes: scopes.split(/[\\s,]+/).filter(Boolean),\n },\n });\n }, [\n connectionName,\n connectionDescription,\n clientId,\n clientSecret,\n authUrl,\n tokenUrl,\n scopes,\n onSubmit,\n ]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Configure your custom OAuth2 provider\n </span>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Custom OAuth2 Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* OAuth Redirect URL (read-only) */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n OAuth Redirect URL\n </label>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={callbackUrl}\n readOnly\n className=\"flex-1 px-3 py-2 border border-border rounded-md bg-muted text-sm font-mono text-muted-foreground\"\n />\n <button\n type=\"button\"\n onClick={() => navigator.clipboard.writeText(callbackUrl)}\n className=\"px-3 py-2 border border-border rounded-md hover:bg-accent transition-colors\"\n title=\"Copy\"\n >\n <Icon icon=\"mdi:content-copy\" className=\"w-4 h-4\" />\n </button>\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Use this URL as the redirect/callback URI in your OAuth provider\n settings\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Authorization URL <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"url\"\n value={authUrl}\n onChange={(e) => setAuthUrl(e.target.value)}\n placeholder=\"https://example.com/oauth/authorize\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Token URL <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"url\"\n value={tokenUrl}\n onChange={(e) => setTokenUrl(e.target.value)}\n placeholder=\"https://example.com/oauth/token\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Client ID <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={clientId}\n onChange={(e) => setClientId(e.target.value)}\n placeholder=\"Your client ID\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Client Secret <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <input\n type={showSecret ? \"text\" : \"password\"}\n value={clientSecret}\n onChange={(e) => setClientSecret(e.target.value)}\n placeholder=\"Your client secret\"\n disabled={isSubmitting}\n className=\"w-full px-3 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowSecret(!showSecret)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showSecret ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Scopes\n </label>\n <input\n type=\"text\"\n value={scopes}\n onChange={(e) => setScopes(e.target.value)}\n placeholder=\"scope1 scope2 scope3 (space-separated)\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !connectionName.trim() ||\n !authUrl.trim() ||\n !tokenUrl.trim() ||\n !clientId.trim() ||\n !clientSecret.trim()\n }\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Authorize\"}\n </button>\n </div>\n );\n}\n","/**\n * Generic API Key Connection Form\n *\n * For connecting to arbitrary services via API key.\n * Fields: API Key + Base URL + Header Name + Header Prefix\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function GenericApiKeyForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [apiKey, setApiKey] = useState(\"\");\n const [baseUrl, setBaseUrl] = useState(\"\");\n const [headerName, setHeaderName] = useState(\"Authorization\");\n const [headerPrefix, setHeaderPrefix] = useState(\"Bearer\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey,\n config: { baseUrl: baseUrl || undefined, headerName, headerPrefix },\n });\n }, [\n connectionName,\n connectionDescription,\n apiKey,\n baseUrl,\n headerName,\n headerPrefix,\n onSubmit,\n ]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Configure a custom API key connection\n </span>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My API Key Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"Your API key\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Base URL\n </label>\n <input\n type=\"url\"\n value={baseUrl}\n onChange={(e) => setBaseUrl(e.target.value)}\n placeholder=\"https://api.example.com\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n API base URL (optional)\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Header Name\n </label>\n <input\n type=\"text\"\n value={headerName}\n onChange={(e) => setHeaderName(e.target.value)}\n placeholder=\"Authorization\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Header Prefix\n </label>\n <input\n type=\"text\"\n value={headerPrefix}\n onChange={(e) => setHeaderPrefix(e.target.value)}\n placeholder=\"Bearer\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Prefix added before the key (e.g., &quot;Bearer&quot;,\n &quot;Api-Key&quot;)\n </p>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !apiKey.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Generic Basic Auth Connection Form\n *\n * For connecting to arbitrary services via basic auth.\n * Fields: Username + Password + Base URL\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function GenericBasicAuthForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [username, setUsername] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [baseUrl, setBaseUrl] = useState(\"\");\n const [showPassword, setShowPassword] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n username,\n password,\n config: { baseUrl: baseUrl || undefined },\n });\n }, [\n connectionName,\n connectionDescription,\n username,\n password,\n baseUrl,\n onSubmit,\n ]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Configure a custom basic auth connection\n </span>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Basic Auth Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Username <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:account\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type=\"text\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n placeholder=\"Username or email\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Password <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:lock\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showPassword ? \"text\" : \"password\"}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Password\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showPassword ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Base URL\n </label>\n <input\n type=\"url\"\n value={baseUrl}\n onChange={(e) => setBaseUrl(e.target.value)}\n placeholder=\"https://api.example.com\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n API base URL (optional)\n </p>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !connectionName.trim() ||\n !username.trim() ||\n !password.trim()\n }\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Provider Form Registry\n *\n * Maps provider keys to their dedicated form components.\n * Falls back to base auth-type forms for unknown providers.\n */\n\nimport type { AuthType } from \"../../hooks/useConnections\";\nimport type { ProviderFormComponent } from \"./types\";\n\n// Base forms\nimport { OAuth2BaseForm } from \"./base/OAuth2BaseForm\";\nimport { ApiKeyBaseForm } from \"./base/ApiKeyBaseForm\";\nimport { BasicAuthBaseForm } from \"./base/BasicAuthBaseForm\";\nimport { BearerTokenBaseForm } from \"./base/BearerTokenBaseForm\";\n\n// Provider-specific forms — Google services\nimport { GoogleGmailForm } from \"./providers/GoogleGmailForm\";\nimport { GoogleDriveForm } from \"./providers/GoogleDriveForm\";\nimport { GoogleCalendarForm } from \"./providers/GoogleCalendarForm\";\nimport { GoogleSheetsForm } from \"./providers/GoogleSheetsForm\";\nimport { GoogleDocsForm } from \"./providers/GoogleDocsForm\";\n\n// Provider-specific forms — Microsoft services\nimport { MicrosoftOutlookForm } from \"./providers/MicrosoftOutlookForm\";\nimport { MicrosoftOneDriveForm } from \"./providers/MicrosoftOneDriveForm\";\nimport { MicrosoftTeamsForm } from \"./providers/MicrosoftTeamsForm\";\nimport { MicrosoftExcelForm } from \"./providers/MicrosoftExcelForm\";\n\n// Provider-specific forms — Other OAuth2\nimport { GitHubForm } from \"./providers/GitHubForm\";\nimport { SlackForm } from \"./providers/SlackForm\";\nimport { HubSpotForm } from \"./providers/HubSpotForm\";\nimport { SalesforceForm } from \"./providers/SalesforceForm\";\nimport { NotionForm } from \"./providers/NotionForm\";\nimport { AirtableForm } from \"./providers/AirtableForm\";\n\n// Provider-specific forms — API Key\nimport { OpenAIForm } from \"./providers/OpenAIForm\";\nimport { AnthropicForm } from \"./providers/AnthropicForm\";\nimport { LinearForm } from \"./providers/LinearForm\";\nimport { BigConsoleForm } from \"./providers/BigConsoleForm\";\nimport { SendGridForm } from \"./providers/SendGridForm\";\nimport { TwilioForm } from \"./providers/TwilioForm\";\n\n// Provider-specific forms — Generic\nimport { GenericOAuth2Form } from \"./providers/GenericOAuth2Form\";\nimport { GenericApiKeyForm } from \"./providers/GenericApiKeyForm\";\nimport { GenericBasicAuthForm } from \"./providers/GenericBasicAuthForm\";\n\n// ============================================================================\n// Registry\n// ============================================================================\n\n/**\n * Map of provider key → dedicated form component.\n */\nconst PROVIDER_FORM_REGISTRY: Record<string, ProviderFormComponent> = {\n // Google services\n \"google-gmail\": GoogleGmailForm,\n \"google-drive\": GoogleDriveForm,\n \"google-calendar\": GoogleCalendarForm,\n \"google-sheets\": GoogleSheetsForm,\n \"google-docs\": GoogleDocsForm,\n // Microsoft services\n \"microsoft-outlook\": MicrosoftOutlookForm,\n \"microsoft-onedrive\": MicrosoftOneDriveForm,\n \"microsoft-teams\": MicrosoftTeamsForm,\n \"microsoft-excel\": MicrosoftExcelForm,\n // Other OAuth2 providers\n github: GitHubForm,\n slack: SlackForm,\n hubspot: HubSpotForm,\n salesforce: SalesforceForm,\n notion: NotionForm,\n airtable: AirtableForm,\n // API Key providers\n openai: OpenAIForm,\n anthropic: AnthropicForm,\n linear: LinearForm,\n bigconsole: BigConsoleForm,\n sendgrid: SendGridForm,\n twilio: TwilioForm,\n // Generic providers\n \"generic-oauth2\": GenericOAuth2Form,\n \"generic-api-key\": GenericApiKeyForm,\n \"generic-basic-auth\": GenericBasicAuthForm,\n};\n\n/**\n * Get the base form component for a given auth type.\n */\nfunction getBaseFormByAuthType(authType: AuthType): ProviderFormComponent {\n switch (authType) {\n case \"OAUTH2\":\n return OAuth2BaseForm;\n case \"API_KEY\":\n return ApiKeyBaseForm;\n case \"BASIC_AUTH\":\n return BasicAuthBaseForm;\n case \"BEARER_TOKEN\":\n return BearerTokenBaseForm;\n default:\n return ApiKeyBaseForm; // Default fallback\n }\n}\n\n/**\n * Get the form component for a provider.\n *\n * Looks up the provider key in the registry first; if not found,\n * falls back to the base form for the provider's auth type.\n */\nexport function getProviderForm(\n providerKey: string,\n authType: AuthType,\n): ProviderFormComponent {\n return (\n PROVIDER_FORM_REGISTRY[providerKey.toLowerCase()] ??\n getBaseFormByAuthType(authType)\n );\n}\n\n// Re-export types\nexport type {\n ProviderFormProps,\n ProviderFormComponent,\n ConnectionFormData,\n ConnectionFormDialogProps,\n} from \"./types\";\n\n// Re-export base forms for direct use\nexport {\n OAuth2BaseForm,\n ApiKeyBaseForm,\n BasicAuthBaseForm,\n BearerTokenBaseForm,\n};\n\n// Re-export provider forms for direct use\nexport {\n // Google services\n GoogleGmailForm,\n GoogleDriveForm,\n GoogleCalendarForm,\n GoogleSheetsForm,\n GoogleDocsForm,\n // Microsoft services\n MicrosoftOutlookForm,\n MicrosoftOneDriveForm,\n MicrosoftTeamsForm,\n MicrosoftExcelForm,\n // Other OAuth2\n GitHubForm,\n SlackForm,\n HubSpotForm,\n SalesforceForm,\n NotionForm,\n AirtableForm,\n // API Key\n OpenAIForm,\n AnthropicForm,\n LinearForm,\n BigConsoleForm,\n SendGridForm,\n TwilioForm,\n // Generic\n GenericOAuth2Form,\n GenericApiKeyForm,\n GenericBasicAuthForm,\n};\n","/**\n * ProviderPicker — Searchable dropdown for selecting an integration provider.\n *\n * Used in the ConnectionFormDialog when no provider is pre-selected.\n * Shows installed providers with search, grouped by category.\n * Matches n8n's \"Add new credential\" modal (Image 2).\n */\n\nimport { useState, useMemo, useCallback, useRef, useEffect } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { IntegrationProvider } from \"../hooks/useConnections\";\nimport {\n getProviderIcon,\n getAuthTypeLabel,\n getCategoryLabel,\n} from \"../utils/provider-helpers\";\n\ninterface ProviderPickerProps {\n /** Available providers to choose from */\n providers: IntegrationProvider[];\n /** Whether providers are still loading */\n loading: boolean;\n /** Callback when a provider is selected */\n onSelect: (provider: IntegrationProvider) => void;\n}\n\nexport function ProviderPicker({\n providers,\n loading,\n onSelect,\n}: ProviderPickerProps) {\n const [search, setSearch] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Auto-focus the search input\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n // Filter by search\n const filtered = useMemo(() => {\n if (!search.trim()) return providers;\n const q = search.toLowerCase();\n return providers.filter(\n (p) =>\n p.name.toLowerCase().includes(q) ||\n p.description?.toLowerCase().includes(q) ||\n p.key.toLowerCase().includes(q) ||\n p.category.toLowerCase().includes(q),\n );\n }, [providers, search]);\n\n // Group by category\n const grouped = useMemo(() => {\n const groups: Record<string, IntegrationProvider[]> = {};\n filtered.forEach((p) => {\n const cat = p.category;\n if (!groups[cat]) groups[cat] = [];\n groups[cat].push(p);\n });\n return groups;\n }, [filtered]);\n\n const handleSelect = useCallback(\n (provider: IntegrationProvider) => {\n onSelect(provider);\n },\n [onSelect],\n );\n\n return (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-muted-foreground mb-3\">\n Select an app or service to connect to\n </p>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:magnify\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search providers...\"\n className=\"w-full pl-10 pr-3 py-2.5 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary\"\n />\n </div>\n </div>\n\n {loading ? (\n <div className=\"flex items-center justify-center py-8\">\n <Icon\n icon=\"mdi:loading\"\n className=\"w-6 h-6 animate-spin text-muted-foreground\"\n />\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"text-center py-8 text-sm text-muted-foreground\">\n No providers found matching &ldquo;{search}&rdquo;\n </div>\n ) : (\n <div className=\"max-h-[400px] overflow-y-auto space-y-1\">\n {Object.entries(grouped).map(([category, categoryProviders]) => (\n <div key={category}>\n <div className=\"px-2 py-1.5 text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n {getCategoryLabel(category as IntegrationProvider[\"category\"])}\n </div>\n {categoryProviders.map((provider) => (\n <button\n key={provider.id}\n type=\"button\"\n onClick={() => handleSelect(provider)}\n className=\"w-full flex items-center gap-3 px-3 py-2.5 rounded-md hover:bg-accent/50 transition-colors text-left\"\n >\n <Icon\n icon={getProviderIcon(provider.key)}\n className=\"w-6 h-6 flex-shrink-0\"\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-foreground\">\n {provider.name}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {getAuthTypeLabel(provider.authType)}\n </div>\n </div>\n </button>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Hook for managing connection form dialog state and mutations.\n *\n * Provides all GraphQL mutations required by the ConnectionFormDialog:\n * - createConnection\n * - initiateOAuth (+ popup + polling)\n * - authenticateWithApiKey\n * - authenticateWithBasicAuth\n * - authenticateWithBearerToken\n * - getProviderByKey / getProviderCatalog\n * - getConnection (for polling OAuth status)\n */\n\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport { gql } from \"@apollo/client\";\nimport { getFluidGridsClient } from \"../../../graphql/client\";\nimport type {\n IntegrationConnection,\n IntegrationProvider,\n OAuthInitiationResult,\n} from \"./useConnections\";\nimport { getOAuthCallbackUrl } from \"../utils/provider-helpers\";\n\n// ============================================================================\n// Additional GraphQL Operations\n// ============================================================================\n\nconst GET_PROVIDER_BY_KEY = gql`\n query GetProviderByKey($key: String!) {\n getProviderByKey(key: $key) {\n id\n key\n name\n description\n category\n authType\n icon\n color\n website\n docsUrl\n isBuiltIn\n isEnabled\n configSchema\n defaultScopes\n availableScopes\n supportedFeatures\n }\n }\n`;\n\nconst GET_PROVIDER_CATALOG = gql`\n query GetProviderCatalog($pagination: IntegrationsPaginationInput) {\n getProviderCatalog(pagination: $pagination) {\n items {\n id\n key\n name\n description\n category\n authType\n icon\n color\n website\n docsUrl\n isBuiltIn\n isEnabled\n configSchema\n supportedFeatures\n }\n total\n hasMore\n }\n }\n`;\n\nconst GET_CONNECTION_STATUS = gql`\n query GetConnectionStatus($id: ID!) {\n getConnection(id: $id) {\n id\n name\n status\n errorMessage\n externalAccountEmail\n externalAccountName\n provider {\n id\n key\n name\n icon\n }\n }\n }\n`;\n\nconst CREATE_CONNECTION_FOR_DIALOG = gql`\n mutation CreateConnectionForDialog($input: CreateConnectionInput!) {\n createConnection(input: $input) {\n id\n name\n status\n provider {\n id\n key\n name\n icon\n }\n }\n }\n`;\n\nconst INITIATE_OAUTH_FOR_DIALOG = gql`\n mutation InitiateOAuthForDialog($input: InitiateOAuthInput!) {\n initiateOAuth(input: $input) {\n redirectUrl\n state\n }\n }\n`;\n\nconst AUTHENTICATE_WITH_API_KEY = gql`\n mutation AuthenticateWithApiKey($input: AuthenticateWithApiKeyInput!) {\n authenticateWithApiKey(input: $input) {\n id\n name\n status\n provider {\n id\n key\n name\n icon\n }\n }\n }\n`;\n\nconst AUTHENTICATE_WITH_BASIC_AUTH = gql`\n mutation AuthenticateWithBasicAuth($input: AuthenticateWithBasicAuthInput!) {\n authenticateWithBasicAuth(input: $input) {\n id\n name\n status\n provider {\n id\n key\n name\n icon\n }\n }\n }\n`;\n\nconst AUTHENTICATE_WITH_BEARER_TOKEN = gql`\n mutation AuthenticateWithBearerToken(\n $input: AuthenticateWithBearerTokenInput!\n ) {\n authenticateWithBearerToken(input: $input) {\n id\n name\n status\n provider {\n id\n key\n name\n icon\n }\n }\n }\n`;\n\nconst TEST_CONNECTION = gql`\n mutation TestConnection($connectionId: ID!) {\n testConnection(connectionId: $connectionId) {\n success\n message\n latencyMs\n }\n }\n`;\n\n// ============================================================================\n// Extended Provider type with configSchema\n// ============================================================================\n\nexport interface IntegrationProviderFull extends IntegrationProvider {\n configSchema?: Record<string, unknown> | null;\n defaultScopes?: string[];\n availableScopes?: Array<{\n scope: string;\n description: string;\n required?: boolean;\n }>;\n supportedFeatures?: string[];\n}\n\n// ============================================================================\n// Hook: useProviderByKey\n// ============================================================================\n\nexport function useProviderByKey(key?: string) {\n const [provider, setProvider] = useState<IntegrationProviderFull | null>(\n null,\n );\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchProvider = useCallback(async (providerKey: string) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<{\n getProviderByKey: IntegrationProviderFull;\n }>({\n query: GET_PROVIDER_BY_KEY,\n variables: { key: providerKey },\n fetchPolicy: \"cache-first\",\n });\n const p = result.data?.getProviderByKey ?? null;\n setProvider(p);\n return p;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n if (key) {\n fetchProvider(key);\n }\n }, [key, fetchProvider]);\n\n return { provider, loading, error, fetchProvider };\n}\n\n// ============================================================================\n// Hook: useProviderCatalog\n// ============================================================================\n\nexport function useProviderCatalog() {\n const [providers, setProviders] = useState<IntegrationProviderFull[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchCatalog = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<{\n getProviderCatalog: { items: IntegrationProviderFull[]; total: number };\n }>({\n query: GET_PROVIDER_CATALOG,\n variables: { pagination: { limit: 100 } },\n fetchPolicy: \"cache-first\",\n });\n setProviders(result.data?.getProviderCatalog?.items ?? []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchCatalog();\n }, [fetchCatalog]);\n\n return { providers, loading, error, refetch: fetchCatalog };\n}\n\n// ============================================================================\n// Hook: useConnectionDialog (main hook)\n// ============================================================================\n\ninterface UseConnectionDialogOptions {\n onConnectionCreated?: (connection: {\n id: string;\n name: string;\n provider: IntegrationProvider;\n status: string;\n }) => void;\n onError?: (error: Error) => void;\n}\n\nexport function useConnectionDialog(options?: UseConnectionDialogOptions) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | undefined>();\n const [oauthWaiting, setOauthWaiting] = useState(false);\n const oauthPopupRef = useRef<Window | null>(null);\n const pollTimerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Cleanup polling on unmount\n useEffect(() => {\n return () => {\n if (pollTimerRef.current) clearInterval(pollTimerRef.current);\n if (oauthPopupRef.current && !oauthPopupRef.current.closed) {\n oauthPopupRef.current.close();\n }\n };\n }, []);\n\n /**\n * Create a connection and authenticate based on auth type.\n */\n const submitConnection = useCallback(\n async (data: {\n provider: IntegrationProvider;\n name: string;\n description?: string;\n apiKey?: string;\n username?: string;\n password?: string;\n bearerToken?: string;\n config?: Record<string, unknown>;\n scopes?: string[];\n }) => {\n setIsSubmitting(true);\n setError(undefined);\n\n try {\n const client = getFluidGridsClient();\n\n // Step 1: Create the connection\n const createResult = await client.mutate<{\n createConnection: IntegrationConnection;\n }>({\n mutation: CREATE_CONNECTION_FOR_DIALOG,\n variables: {\n input: {\n name: data.name.trim(),\n description: data.description?.trim(),\n providerId: data.provider.id,\n config: data.config,\n },\n },\n });\n\n const connection = createResult.data?.createConnection;\n if (!connection) {\n throw new Error(\"Failed to create connection\");\n }\n\n // Step 2: Authenticate based on auth type\n switch (data.provider.authType) {\n case \"OAUTH2\": {\n const oauthResult = await client.mutate<{\n initiateOAuth: OAuthInitiationResult;\n }>({\n mutation: INITIATE_OAUTH_FOR_DIALOG,\n variables: {\n input: {\n connectionId: connection.id,\n redirectUri: getOAuthCallbackUrl(),\n scopes: data.scopes,\n },\n },\n });\n\n const oauthData = oauthResult.data?.initiateOAuth;\n if (!oauthData?.redirectUrl) {\n throw new Error(\"Failed to initiate OAuth flow\");\n }\n\n // Open OAuth popup\n const width = 600;\n const height = 700;\n const left = window.screenX + (window.innerWidth - width) / 2;\n const top = window.screenY + (window.innerHeight - height) / 2;\n const popup = window.open(\n oauthData.redirectUrl,\n \"oauth_popup\",\n `width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no,scrollbars=yes,resizable=yes`,\n );\n oauthPopupRef.current = popup;\n setOauthWaiting(true);\n\n // Poll for OAuth completion (Google COOP headers break postMessage)\n return new Promise<void>((resolve, reject) => {\n if (pollTimerRef.current) clearInterval(pollTimerRef.current);\n pollTimerRef.current = setInterval(async () => {\n try {\n const pollResult = await client.query<{\n getConnection: {\n id: string;\n name: string;\n status: string;\n errorMessage?: string;\n provider: IntegrationProvider;\n };\n }>({\n query: GET_CONNECTION_STATUS,\n variables: { id: connection.id },\n fetchPolicy: \"network-only\",\n });\n\n const status = pollResult.data?.getConnection?.status;\n if (status && status !== \"PENDING_AUTH\") {\n // Stop polling\n if (pollTimerRef.current)\n clearInterval(pollTimerRef.current);\n pollTimerRef.current = null;\n\n // Close popup\n if (\n oauthPopupRef.current &&\n !oauthPopupRef.current.closed\n ) {\n oauthPopupRef.current.close();\n }\n oauthPopupRef.current = null;\n setOauthWaiting(false);\n setIsSubmitting(false);\n\n if (status === \"ACTIVE\") {\n const conn = pollResult.data!.getConnection;\n options?.onConnectionCreated?.({\n id: conn.id,\n name: conn.name,\n provider: conn.provider,\n status: conn.status,\n });\n resolve();\n } else {\n const errMsg =\n pollResult.data?.getConnection?.errorMessage ||\n \"OAuth authorization failed\";\n setError(errMsg);\n options?.onError?.(new Error(errMsg));\n reject(new Error(errMsg));\n }\n }\n } catch {\n // Ignore polling errors, keep trying\n }\n }, 2000);\n\n // Timeout after 5 minutes\n setTimeout(() => {\n if (pollTimerRef.current) {\n clearInterval(pollTimerRef.current);\n pollTimerRef.current = null;\n setOauthWaiting(false);\n setIsSubmitting(false);\n const errMsg = \"OAuth authorization timed out\";\n setError(errMsg);\n options?.onError?.(new Error(errMsg));\n reject(new Error(errMsg));\n }\n }, 300000);\n });\n }\n\n case \"API_KEY\": {\n if (!data.apiKey?.trim()) throw new Error(\"API key is required\");\n const apiKeyResult = await client.mutate<{\n authenticateWithApiKey: IntegrationConnection;\n }>({\n mutation: AUTHENTICATE_WITH_API_KEY,\n variables: {\n input: {\n connectionId: connection.id,\n apiKey: data.apiKey.trim(),\n },\n },\n });\n const conn = apiKeyResult.data?.authenticateWithApiKey;\n if (conn) {\n options?.onConnectionCreated?.({\n id: conn.id,\n name: conn.name,\n provider: conn.provider,\n status: conn.status,\n });\n }\n break;\n }\n\n case \"BASIC_AUTH\": {\n if (!data.username?.trim() || !data.password?.trim()) {\n throw new Error(\"Username and password are required\");\n }\n const basicResult = await client.mutate<{\n authenticateWithBasicAuth: IntegrationConnection;\n }>({\n mutation: AUTHENTICATE_WITH_BASIC_AUTH,\n variables: {\n input: {\n connectionId: connection.id,\n username: data.username.trim(),\n password: data.password.trim(),\n },\n },\n });\n const conn = basicResult.data?.authenticateWithBasicAuth;\n if (conn) {\n options?.onConnectionCreated?.({\n id: conn.id,\n name: conn.name,\n provider: conn.provider,\n status: conn.status,\n });\n }\n break;\n }\n\n case \"BEARER_TOKEN\": {\n if (!data.bearerToken?.trim())\n throw new Error(\"Bearer token is required\");\n const bearerResult = await client.mutate<{\n authenticateWithBearerToken: IntegrationConnection;\n }>({\n mutation: AUTHENTICATE_WITH_BEARER_TOKEN,\n variables: {\n input: {\n connectionId: connection.id,\n token: data.bearerToken.trim(),\n },\n },\n });\n const conn = bearerResult.data?.authenticateWithBearerToken;\n if (conn) {\n options?.onConnectionCreated?.({\n id: conn.id,\n name: conn.name,\n provider: conn.provider,\n status: conn.status,\n });\n }\n break;\n }\n\n default:\n options?.onConnectionCreated?.({\n id: connection.id,\n name: connection.name,\n provider: connection.provider,\n status: connection.status,\n });\n }\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Connection failed\";\n setError(errorMessage);\n options?.onError?.(\n err instanceof Error ? err : new Error(errorMessage),\n );\n } finally {\n if (!oauthWaiting) {\n setIsSubmitting(false);\n }\n }\n },\n [options, oauthWaiting],\n );\n\n /**\n * Test an existing connection.\n */\n const testConnection = useCallback(async (connectionId: string) => {\n try {\n const client = getFluidGridsClient();\n const result = await client.mutate<{\n testConnection: {\n success: boolean;\n message: string;\n latencyMs: number;\n };\n }>({\n mutation: TEST_CONNECTION,\n variables: { connectionId },\n });\n return result.data?.testConnection ?? null;\n } catch (err) {\n return { success: false, message: (err as Error).message, latencyMs: 0 };\n }\n }, []);\n\n const clearError = useCallback(() => setError(undefined), []);\n\n return {\n submitConnection,\n testConnection,\n isSubmitting,\n oauthWaiting,\n error,\n clearError,\n };\n}\n","/**\n * ConnectionFormDialog — n8n-style credential/connection popup.\n *\n * A modal dialog that renders the correct provider form based on the\n * provider key. Can be opened from any product (FluidGrids, Botlit,\n * BigConsole) by passing a provider key or showing the provider picker.\n *\n * Features:\n * - Left sidebar tabs: Connection, Sharing, Details (like n8n)\n * - Dynamic form based on provider auth type\n * - Provider-specific forms with tailored fields\n * - OAuth2 popup flow with polling\n * - API Key / Basic Auth / Bearer Token forms\n * - Provider search/picker when no provider is pre-selected\n */\n\nimport { useState, useCallback, useEffect, useMemo } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { getProviderForm } from \"./provider-forms\";\nimport { ProviderPicker } from \"./ProviderPicker\";\nimport type {\n ConnectionFormDialogProps,\n ConnectionFormData,\n} from \"./provider-forms/types\";\nimport type { IntegrationProvider } from \"../hooks/useConnections\";\nimport {\n useProviderByKey,\n useProviderCatalog,\n useConnectionDialog,\n} from \"../hooks/useConnectionDialog\";\nimport { getProviderIcon, getAuthTypeLabel } from \"../utils/provider-helpers\";\n\ntype DialogTab = \"connection\" | \"sharing\" | \"details\";\n\nexport function ConnectionFormDialog({\n open,\n onClose,\n providerKey,\n providerId,\n showProviderPicker: showPickerProp,\n connectionId,\n defaultName,\n onConnectionCreated,\n onError,\n}: ConnectionFormDialogProps) {\n // State\n const [activeTab, setActiveTab] = useState<DialogTab>(\"connection\");\n const [selectedProvider, setSelectedProvider] =\n useState<IntegrationProvider | null>(null);\n const [connectionName, setConnectionName] = useState(defaultName ?? \"\");\n const [connectionDescription, setConnectionDescription] = useState(\"\");\n const [showPicker, setShowPicker] = useState(\n showPickerProp ?? (!providerKey && !providerId),\n );\n const [success, setSuccess] = useState(false);\n\n // Hooks\n const { provider: fetchedProvider, loading: providerLoading } =\n useProviderByKey(\n providerKey && !selectedProvider ? providerKey : undefined,\n );\n const { providers: catalogProviders, loading: catalogLoading } =\n useProviderCatalog();\n\n const { submitConnection, isSubmitting, oauthWaiting, error, clearError } =\n useConnectionDialog({\n onConnectionCreated: (conn) => {\n setSuccess(true);\n onConnectionCreated?.(conn);\n },\n onError,\n });\n\n // Set provider from fetched data\n useEffect(() => {\n if (fetchedProvider && !selectedProvider) {\n setSelectedProvider(fetchedProvider);\n if (!connectionName) {\n setConnectionName(`${fetchedProvider.name} Connection`);\n }\n setShowPicker(false);\n }\n }, [fetchedProvider, selectedProvider, connectionName]);\n\n // Reset state when dialog opens/closes\n useEffect(() => {\n if (open) {\n setActiveTab(\"connection\");\n setSuccess(false);\n clearError();\n if (!providerKey && !providerId) {\n setSelectedProvider(null);\n setConnectionName(defaultName ?? \"\");\n setConnectionDescription(\"\");\n setShowPicker(showPickerProp ?? true);\n }\n }\n }, [open, providerKey, providerId, defaultName, showPickerProp, clearError]);\n\n // Provider selection from picker\n const handleProviderSelect = useCallback((provider: IntegrationProvider) => {\n setSelectedProvider(provider);\n setConnectionName(`${provider.name} Connection`);\n setShowPicker(false);\n }, []);\n\n // Form submission\n const handleFormSubmit = useCallback(\n async (data: ConnectionFormData) => {\n if (!selectedProvider) return;\n await submitConnection({\n provider: selectedProvider,\n name: data.name,\n description: data.description,\n apiKey: data.apiKey,\n username: data.username,\n password: data.password,\n bearerToken: data.bearerToken,\n config: data.config,\n scopes: (data.config?.scopes as string[]) ?? undefined,\n });\n },\n [selectedProvider, submitConnection],\n );\n\n // Get the form component for the selected provider\n const FormComponent = useMemo(() => {\n if (!selectedProvider) return null;\n return getProviderForm(selectedProvider.key, selectedProvider.authType);\n }, [selectedProvider]);\n\n // Tab items\n const tabs: { key: DialogTab; label: string; icon: string }[] = [\n { key: \"connection\", label: \"Connection\", icon: \"mdi:link-variant\" },\n { key: \"sharing\", label: \"Sharing\", icon: \"mdi:share-variant\" },\n { key: \"details\", label: \"Details\", icon: \"mdi:information\" },\n ];\n\n return (\n <Dialog.Root open={open} onOpenChange={(isOpen) => !isOpen && onClose()}>\n <Dialog.Portal>\n {/* zIndex via inline style (not the z-50 class) so this popup renders\n above high-z hosts like the node-detail-view dialog (zIndex 1000)\n when opened from a node's connection selector. */}\n <Dialog.Overlay\n style={{ zIndex: 1100 }}\n className=\"fixed inset-0 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\"\n />\n <Dialog.Content\n style={{ zIndex: 1101 }}\n className=\"fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-2xl max-h-[85vh] bg-background border border-border rounded-xl shadow-2xl data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] flex flex-col overflow-hidden\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-border flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n {selectedProvider ? (\n <>\n <Icon\n icon={getProviderIcon(selectedProvider.key)}\n className=\"w-7 h-7\"\n />\n <div>\n <Dialog.Title className=\"text-base font-semibold text-foreground\">\n {selectedProvider.name} account\n </Dialog.Title>\n <Dialog.Description className=\"text-xs text-muted-foreground\">\n {getAuthTypeLabel(selectedProvider.authType)}\n </Dialog.Description>\n </div>\n </>\n ) : (\n <div>\n <Dialog.Title className=\"text-base font-semibold text-foreground\">\n Add new credential\n </Dialog.Title>\n <Dialog.Description className=\"text-xs text-muted-foreground\">\n Select an app or service to connect to\n </Dialog.Description>\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {selectedProvider && !showPicker && !success && (\n <button\n type=\"button\"\n onClick={() =>\n handleFormSubmit({\n name: connectionName,\n description: connectionDescription,\n })\n }\n disabled={isSubmitting || !connectionName.trim()}\n className=\"px-4 py-1.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n Save\n </button>\n )}\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className=\"p-1.5 rounded-md hover:bg-accent transition-colors text-muted-foreground hover:text-foreground\"\n aria-label=\"Close\"\n >\n <Icon icon=\"mdi:close\" className=\"w-5 h-5\" />\n </button>\n </Dialog.Close>\n </div>\n </div>\n\n {/* Body */}\n <div className=\"flex flex-1 min-h-0 overflow-hidden\">\n {/* Provider Picker Mode */}\n {showPicker && !selectedProvider && (\n <div className=\"flex-1 p-5 overflow-y-auto\">\n <ProviderPicker\n providers={catalogProviders}\n loading={catalogLoading}\n onSelect={handleProviderSelect}\n />\n </div>\n )}\n\n {/* Loading */}\n {providerLoading && !selectedProvider && !showPicker && (\n <div className=\"flex-1 flex items-center justify-center\">\n <Icon\n icon=\"mdi:loading\"\n className=\"w-8 h-8 animate-spin text-muted-foreground\"\n />\n </div>\n )}\n\n {/* Success State */}\n {success && selectedProvider && (\n <div className=\"flex-1 flex flex-col items-center justify-center p-8 text-center\">\n <div className=\"p-3 rounded-full bg-green-500/10 mb-4\">\n <Icon\n icon=\"mdi:check-circle\"\n className=\"w-12 h-12 text-green-600\"\n />\n </div>\n <h3 className=\"text-lg font-semibold text-foreground mb-1\">\n Connection Created!\n </h3>\n <p className=\"text-sm text-muted-foreground mb-6\">\n Your {selectedProvider.name} connection has been set up\n successfully.\n </p>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"px-4 py-2 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors\"\n >\n Done\n </button>\n </div>\n )}\n\n {/* Form Mode (with sidebar tabs) */}\n {selectedProvider && !showPicker && !success && (\n <>\n {/* Left Sidebar Tabs */}\n <div className=\"w-40 border-r border-border flex-shrink-0 py-3\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={`w-full flex items-center gap-2 px-4 py-2 text-sm font-medium transition-colors ${\n activeTab === tab.key\n ? \"text-foreground bg-accent/50 border-l-2 border-primary\"\n : \"text-muted-foreground hover:text-foreground hover:bg-accent/30 border-l-2 border-transparent\"\n }`}\n >\n <Icon icon={tab.icon} className=\"w-4 h-4\" />\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Main Content Area */}\n <div className=\"flex-1 p-5 overflow-y-auto\">\n {/* Connection Tab */}\n {activeTab === \"connection\" && FormComponent && (\n <FormComponent\n provider={selectedProvider}\n connectionId={connectionId ?? null}\n connectionName={connectionName}\n connectionDescription={connectionDescription}\n onNameChange={setConnectionName}\n onDescriptionChange={setConnectionDescription}\n onSubmit={handleFormSubmit}\n isSubmitting={isSubmitting || oauthWaiting}\n error={error}\n />\n )}\n\n {/* Sharing Tab (placeholder) */}\n {activeTab === \"sharing\" && (\n <div className=\"space-y-4\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Sharing\n </h3>\n <div className=\"p-4 rounded-md bg-muted/50 border border-border text-center\">\n <Icon\n icon=\"mdi:share-variant\"\n className=\"w-8 h-8 mx-auto text-muted-foreground mb-2\"\n />\n <p className=\"text-sm text-muted-foreground\">\n Connection sharing settings will be available in a\n future update.\n </p>\n </div>\n </div>\n )}\n\n {/* Details Tab */}\n {activeTab === \"details\" && (\n <div className=\"space-y-4\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Details\n </h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3 p-3 rounded-md border border-border\">\n <Icon\n icon={getProviderIcon(selectedProvider.key)}\n className=\"w-8 h-8\"\n />\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n {selectedProvider.name}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {getAuthTypeLabel(selectedProvider.authType)}\n </p>\n </div>\n </div>\n {selectedProvider.description && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Description\n </label>\n <p className=\"text-sm text-foreground mt-1\">\n {selectedProvider.description}\n </p>\n </div>\n )}\n {selectedProvider.website && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Website\n </label>\n <a\n href={selectedProvider.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block text-sm text-primary hover:underline mt-1\"\n >\n {selectedProvider.website}\n </a>\n </div>\n )}\n {selectedProvider.docsUrl && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Documentation\n </label>\n <a\n href={selectedProvider.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block text-sm text-primary hover:underline mt-1\"\n >\n {selectedProvider.docsUrl}\n </a>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </>\n )}\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","/**\n * ConnectionSelector Component\n *\n * A dropdown selector for choosing integration connections in workflow nodes.\n * Replaces the legacy CredentialSelector and queries the integrations service.\n *\n * This component:\n * - Fetches connections from wspace-integrations-svc via the federated gateway\n * - Filters connections by provider adapters defined in node manifests\n * - Supports single and multiple selection modes\n * - Opens an inline ConnectionFormDialog popup for creating new connections (n8n-style)\n */\n\nimport { useState, useMemo, useCallback } from \"react\";\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 { formatDistanceToNow } from \"date-fns\";\nimport {\n useConnections,\n type IntegrationConnection,\n type ConnectionStatus,\n} from \"../hooks/useConnections\";\nimport { ConnectionFormDialog } from \"./ConnectionFormDialog\";\nimport { getProviderIcon } from \"../utils/provider-helpers\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ConnectionAdapter {\n /** Adapter name (e.g., \"gmail\", \"google-calendar\") */\n name: string;\n /** Provider key (e.g., \"google\", \"github\", \"slack\") */\n provider: string;\n}\n\ninterface SelectedConnection {\n /** Connection ID */\n connectionId: string;\n /** Adapter name for the node */\n adapter: string;\n}\n\ninterface ConnectionSelectorProps {\n /** Available connection adapters from node manifest */\n adapters: ConnectionAdapter[];\n /** Currently selected connections */\n selectedConnections: SelectedConnection[];\n /** Callback when connections change */\n onChange: (connections: SelectedConnection[]) => void;\n /** Whether multiple connections can be selected */\n multiple?: boolean;\n /** Show status indicators */\n showStatus?: boolean;\n /** Compact mode for smaller displays */\n compact?: boolean;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n// getProviderIcon imported from ../utils/provider-helpers\n\nfunction formatAge(dateString: string): string {\n try {\n return formatDistanceToNow(new Date(dateString), { addSuffix: true });\n } catch {\n return \"\";\n }\n}\n\nfunction getStatusColor(status: ConnectionStatus): string {\n switch (status) {\n case \"ACTIVE\":\n return \"text-[var(--color-status-success-text)]\";\n case \"INACTIVE\":\n return \"text-muted-foreground\";\n case \"ERROR\":\n case \"REVOKED\":\n return \"text-[var(--color-status-error-text)]\";\n case \"EXPIRED\":\n case \"PENDING_AUTH\":\n return \"text-[var(--color-status-warning-text)]\";\n default:\n return \"text-muted-foreground\";\n }\n}\n\nfunction getStatusIcon(status: ConnectionStatus): string {\n switch (status) {\n case \"ACTIVE\":\n return \"mdi:check-circle\";\n case \"INACTIVE\":\n return \"mdi:pause-circle\";\n case \"ERROR\":\n case \"REVOKED\":\n return \"mdi:alert-circle\";\n case \"EXPIRED\":\n return \"mdi:clock-alert\";\n case \"PENDING_AUTH\":\n return \"mdi:account-clock\";\n default:\n return \"mdi:help-circle\";\n }\n}\n\n// ============================================================================\n// Connection Chip Component\n// ============================================================================\n\ninterface ConnectionChipProps {\n connection: SelectedConnection;\n connectionData?: IntegrationConnection;\n onRemove: () => void;\n}\n\nfunction ConnectionChip({\n connection,\n connectionData,\n onRemove,\n}: ConnectionChipProps) {\n const providerKey = connectionData?.provider?.key || connection.adapter;\n const icon = connectionData?.provider?.icon || getProviderIcon(providerKey);\n const name = connectionData?.name || connection.connectionId;\n const status = connectionData?.status;\n\n return (\n <div className=\"flex items-center gap-1.5 px-2 py-1 bg-muted rounded-md text-sm group\">\n <Icon icon={icon} className=\"w-4 h-4\" />\n <span className=\"truncate max-w-32\">{name}</span>\n {status && (\n <Icon\n icon={getStatusIcon(status)}\n className={`w-3.5 h-3.5 ${getStatusColor(status)}`}\n />\n )}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"text-muted-foreground hover:text-destructive opacity-0 group-hover:opacity-100 transition-opacity\"\n >\n <Icon icon=\"mdi:close\" className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n );\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\nexport function ConnectionSelector({\n adapters,\n selectedConnections,\n onChange,\n multiple = false,\n showStatus = true,\n compact = false,\n}: ConnectionSelectorProps) {\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [dialogOpen, setDialogOpen] = useState(false);\n const [dialogProviderKey, setDialogProviderKey] = useState<\n string | undefined\n >();\n\n // Fetch all connections\n const {\n connections,\n loading: connectionsLoading,\n refetch,\n } = useConnections();\n\n // Filter connections by available adapters\n const availableConnections = useMemo(() => {\n if (!adapters || adapters.length === 0) return [];\n\n // Build a set of adapter identifiers for matching\n const adapterIdentifiers = new Set<string>();\n adapters.forEach((a) => {\n adapterIdentifiers.add(a.provider.toLowerCase());\n adapterIdentifiers.add(a.name.toLowerCase());\n });\n\n return connections.filter((conn) => {\n const providerKey = conn.provider?.key?.toLowerCase() || \"\";\n const category = conn.provider?.category?.toLowerCase() || \"\";\n\n // Match by provider key\n if (adapterIdentifiers.has(providerKey)) {\n return true;\n }\n\n // Check if any adapter matches the provider\n for (const identifier of adapterIdentifiers) {\n if (\n providerKey.includes(identifier) ||\n identifier.includes(providerKey)\n ) {\n return true;\n }\n // Also check category for broader matches\n if (category.includes(identifier)) {\n return true;\n }\n }\n\n return false;\n });\n }, [connections, adapters]);\n\n // Merge available connections with already-selected connections\n const mergedConnections = useMemo(() => {\n const allConnections = [...availableConnections];\n\n // Add any selected connections that aren't already in the filtered list\n selectedConnections.forEach((selected) => {\n const existsInAvailable = availableConnections.some(\n (c) => c.id === selected.connectionId,\n );\n if (!existsInAvailable) {\n const fullConn = connections.find(\n (c) => c.id === selected.connectionId,\n );\n if (fullConn) {\n allConnections.push(fullConn);\n }\n }\n });\n\n return allConnections;\n }, [availableConnections, selectedConnections, connections]);\n\n // Group connections by provider\n const groupedConnections = useMemo(() => {\n const groups: Record<string, IntegrationConnection[]> = {};\n\n mergedConnections.forEach((conn) => {\n const providerName = conn.provider?.name || \"Other\";\n if (!groups[providerName]) {\n groups[providerName] = [];\n }\n groups[providerName].push(conn);\n });\n\n return groups;\n }, [mergedConnections]);\n\n // Handlers\n const handleSelect = useCallback(\n (connection: IntegrationConnection) => {\n const providerKey = connection.provider?.key || \"\";\n\n // Find matching adapter\n const adapter = adapters.find(\n (a) =>\n a.provider.toLowerCase() === providerKey.toLowerCase() ||\n a.name.toLowerCase() === providerKey.toLowerCase(),\n );\n\n const newSelection: SelectedConnection = {\n connectionId: connection.id,\n adapter: adapter?.name || providerKey,\n };\n\n if (multiple) {\n // Toggle selection\n const isSelected = selectedConnections.some(\n (c) => c.connectionId === connection.id,\n );\n if (isSelected) {\n onChange(\n selectedConnections.filter((c) => c.connectionId !== connection.id),\n );\n } else {\n onChange([...selectedConnections, newSelection]);\n }\n } else {\n onChange([newSelection]);\n setIsDropdownOpen(false);\n }\n },\n [adapters, selectedConnections, onChange, multiple],\n );\n\n const handleRemove = useCallback(\n (connectionId: string) => {\n onChange(\n selectedConnections.filter((c) => c.connectionId !== connectionId),\n );\n },\n [selectedConnections, onChange],\n );\n\n const handleNewConnection = useCallback((providerKey?: string) => {\n setDialogProviderKey(providerKey);\n setDialogOpen(true);\n setIsDropdownOpen(false);\n }, []);\n\n const handleConnectionCreated = useCallback(\n (conn: {\n id: string;\n name: string;\n provider: { key?: string };\n status: string;\n }) => {\n // Auto-select the newly created connection\n const providerKey = conn.provider?.key || \"\";\n const adapter = adapters.find(\n (a) =>\n a.provider.toLowerCase() === providerKey.toLowerCase() ||\n a.name.toLowerCase() === providerKey.toLowerCase(),\n );\n if (adapter) {\n const newSelection = { connectionId: conn.id, adapter: adapter.name };\n if (multiple) {\n onChange([...selectedConnections, newSelection]);\n } else {\n onChange([newSelection]);\n }\n }\n setDialogOpen(false);\n // Refetch to include the new connection in the dropdown\n refetch();\n },\n [adapters, selectedConnections, onChange, multiple, refetch],\n );\n\n // Get connection data for display\n const getConnectionData = useCallback(\n (connectionId: string) => connections.find((c) => c.id === connectionId),\n [connections],\n );\n\n // No adapters = no connection requirements\n if (!adapters || adapters.length === 0) {\n return null;\n }\n\n return (\n <div className={compact ? \"space-y-2\" : \"space-y-3\"}>\n {/* Selected Connections */}\n {selectedConnections.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {selectedConnections.map((conn) => {\n const connData = getConnectionData(conn.connectionId);\n\n return (\n <ConnectionChip\n key={conn.connectionId}\n connection={conn}\n connectionData={connData}\n onRemove={() => handleRemove(conn.connectionId)}\n />\n );\n })}\n </div>\n )}\n\n {/* Dropdown Selector */}\n <div className=\"flex items-center gap-2\">\n <DropdownMenu open={isDropdownOpen} onOpenChange={setIsDropdownOpen}>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size={compact ? \"sm\" : \"default\"}\n className=\"justify-between min-w-[200px]\"\n >\n <span className=\"flex items-center gap-2\">\n <Icon\n icon=\"mdi:link-variant\"\n className=\"w-4 h-4 text-muted-foreground\"\n />\n {selectedConnections.length === 0\n ? \"Select connection\"\n : multiple\n ? `${selectedConnections.length} selected`\n : \"Change connection\"}\n </span>\n <Icon\n icon=\"mdi:chevron-down\"\n className=\"w-4 h-4 text-muted-foreground\"\n />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent\n align=\"start\"\n // Render above high-z-index hosts like the node-detail-view dialog\n // (zIndex 1000). The menu portals to <body> at z-50 by default, so\n // without this it opens *behind* the NDV and looks like it won't\n // open. Inline style (not a Tailwind class) so it applies regardless\n // of which build's CSS the host app scanned. Harmless in the side\n // panel, where nothing competes for stacking.\n style={{ zIndex: 1100 }}\n className=\"w-[280px] max-h-[400px] overflow-y-auto\"\n >\n {connectionsLoading ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n <Icon\n icon=\"mdi:loading\"\n className=\"w-6 h-6 mx-auto mb-2 animate-spin\"\n />\n <p>Loading connections...</p>\n </div>\n ) : Object.keys(groupedConnections).length === 0 ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n <Icon\n icon=\"mdi:link-off\"\n className=\"w-8 h-8 mx-auto mb-2 opacity-50\"\n />\n <p>No matching connections</p>\n <p className=\"text-xs mt-1\">Create one in Integrations</p>\n </div>\n ) : (\n Object.entries(groupedConnections).map(\n ([providerName, conns]) => (\n <div key={providerName}>\n <DropdownMenuLabel className=\"flex items-center gap-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\">\n <Icon\n icon={\n conns[0]?.provider?.icon ||\n getProviderIcon(conns[0]?.provider?.key || \"\")\n }\n className=\"w-4 h-4\"\n />\n {providerName}\n </DropdownMenuLabel>\n {conns.map((conn) => {\n const isSelected = selectedConnections.some(\n (c) => c.connectionId === conn.id,\n );\n const isActive = conn.status === \"ACTIVE\";\n\n return (\n <DropdownMenuItem\n key={conn.id}\n onClick={() => handleSelect(conn)}\n className={`flex items-center justify-between cursor-pointer ${\n isSelected ? \"bg-primary/10\" : \"\"\n } ${!isActive ? \"opacity-60\" : \"\"}`}\n >\n <div className=\"flex flex-col min-w-0\">\n <span className=\"font-medium truncate flex items-center gap-1.5\">\n {conn.name}\n {showStatus && (\n <span title={conn.status}>\n <Icon\n icon={getStatusIcon(conn.status)}\n className={`w-3.5 h-3.5 ${getStatusColor(conn.status)}`}\n />\n </span>\n )}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {conn.externalAccountEmail ||\n (conn.updatedAt &&\n `Updated ${formatAge(conn.updatedAt)}`)}\n </span>\n </div>\n {isSelected && (\n <Icon\n icon=\"mdi:check\"\n className=\"w-4 h-4 text-primary flex-shrink-0\"\n />\n )}\n </DropdownMenuItem>\n );\n })}\n <DropdownMenuSeparator />\n </div>\n ),\n )\n )}\n\n {/* New Connection Button */}\n <DropdownMenuItem\n onClick={() => {\n // If there's only one adapter, pre-select the provider\n const singleProvider =\n adapters.length === 1 ? adapters[0].provider : undefined;\n handleNewConnection(singleProvider);\n }}\n className=\"text-primary cursor-pointer\"\n >\n <Icon icon=\"mdi:plus\" className=\"w-4 h-4 mr-2\" />\n New connection\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Quick New Button */}\n {selectedConnections.length === 0 && !compact && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n const singleProvider =\n adapters.length === 1 ? adapters[0].provider : undefined;\n handleNewConnection(singleProvider);\n }}\n className=\"text-primary hover:text-primary/80\"\n >\n <Icon icon=\"mdi:plus\" className=\"w-4 h-4 mr-1\" />\n New\n </Button>\n )}\n </div>\n\n {/* Status indicator */}\n {showStatus &&\n selectedConnections.length === 0 &&\n adapters.length > 0 && (\n <div className=\"flex items-center gap-1.5 text-xs text-[var(--color-status-warning-text)]\">\n <Icon icon=\"mdi:alert-circle\" className=\"w-3.5 h-3.5\" />\n <span>Connection required for this node</span>\n </div>\n )}\n\n {/* Connection Form Dialog (n8n-style popup) */}\n <ConnectionFormDialog\n open={dialogOpen}\n onClose={() => setDialogOpen(false)}\n providerKey={dialogProviderKey}\n showProviderPicker={!dialogProviderKey}\n onConnectionCreated={handleConnectionCreated}\n />\n </div>\n );\n}\n","/**\n * ConfigSchemaForm — Dynamic form renderer for provider configSchema.\n *\n * Renders form fields based on a JSON Schema definition stored in\n * the provider's configSchema field. Supports string, number, boolean,\n * and array types with secret masking.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type {\n ConfigSchema,\n ConfigSchemaProperty,\n} from \"./provider-forms/types\";\n\ninterface ConfigSchemaFormProps {\n /** JSON Schema from provider.configSchema */\n schema: ConfigSchema;\n /** Current values */\n values: Record<string, unknown>;\n /** Callback when values change */\n onChange: (values: Record<string, unknown>) => void;\n /** Whether the form is disabled */\n disabled?: boolean;\n}\n\n/**\n * Renders a dynamic form from a JSON Schema object.\n */\nexport function ConfigSchemaForm({\n schema,\n values,\n onChange,\n disabled,\n}: ConfigSchemaFormProps) {\n const handleFieldChange = useCallback(\n (fieldName: string, value: unknown) => {\n onChange({ ...values, [fieldName]: value });\n },\n [values, onChange],\n );\n\n if (!schema?.properties) return null;\n\n const properties = Object.entries(schema.properties);\n const requiredFields = new Set(schema.required ?? []);\n\n return (\n <div className=\"space-y-4\">\n {properties.map(([key, prop]) => (\n <ConfigSchemaField\n key={key}\n name={key}\n property={prop}\n value={values[key]}\n required={requiredFields.has(key)}\n disabled={disabled}\n onChange={(val) => handleFieldChange(key, val)}\n />\n ))}\n </div>\n );\n}\n\n// ============================================================================\n// Individual Field Renderer\n// ============================================================================\n\ninterface ConfigSchemaFieldProps {\n name: string;\n property: ConfigSchemaProperty;\n value: unknown;\n required: boolean;\n disabled?: boolean;\n onChange: (value: unknown) => void;\n}\n\nfunction ConfigSchemaField({\n name,\n property,\n value,\n required,\n disabled,\n onChange,\n}: ConfigSchemaFieldProps) {\n const [showSecret, setShowSecret] = useState(false);\n\n const label = property.title || name;\n const placeholder = property.description || `Enter ${label.toLowerCase()}`;\n\n switch (property.type) {\n case \"string\": {\n if (property.enum) {\n return (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {label}\n {required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </label>\n <select\n value={(value as string) ?? property.default ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n >\n <option value=\"\">Select {label.toLowerCase()}</option>\n {property.enum.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n {property.description && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {property.description}\n </p>\n )}\n </div>\n );\n }\n\n const inputType = property.secret && !showSecret ? \"password\" : \"text\";\n\n return (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {label}\n {required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </label>\n <div className=\"relative\">\n <input\n type={inputType}\n value={(value as string) ?? property.default ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n className={`w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50 ${\n property.secret ? \"font-mono pr-10\" : \"\"\n }`}\n />\n {property.secret && (\n <button\n type=\"button\"\n onClick={() => setShowSecret(!showSecret)}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showSecret ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n )}\n </div>\n {property.description && !property.secret && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {property.description}\n </p>\n )}\n </div>\n );\n }\n\n case \"number\":\n return (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {label}\n {required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </label>\n <input\n type=\"number\"\n value={(value as number) ?? property.default ?? \"\"}\n onChange={(e) => onChange(Number(e.target.value))}\n placeholder={placeholder}\n disabled={disabled}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n {property.description && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {property.description}\n </p>\n )}\n </div>\n );\n\n case \"boolean\":\n return (\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={(value as boolean) ?? property.default ?? false}\n onClick={() => onChange(!(value as boolean))}\n disabled={disabled}\n className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${\n value ? \"bg-primary\" : \"bg-muted\"\n } disabled:opacity-50`}\n >\n <span\n className={`inline-block h-3.5 w-3.5 transform rounded-full bg-white transition-transform ${\n value ? \"translate-x-4.5\" : \"translate-x-0.5\"\n }`}\n />\n </button>\n <label className=\"text-sm font-medium text-foreground\">\n {label}\n {property.description && (\n <span className=\"text-muted-foreground font-normal ml-1\">\n — {property.description}\n </span>\n )}\n </label>\n </div>\n );\n\n case \"array\":\n return (\n <ArrayField\n label={label}\n required={required}\n description={property.description}\n value={(value as string[]) ?? []}\n onChange={onChange}\n disabled={disabled}\n />\n );\n\n default:\n return null;\n }\n}\n\n// ============================================================================\n// Array Field (tag-style input)\n// ============================================================================\n\ninterface ArrayFieldProps {\n label: string;\n required: boolean;\n description?: string;\n value: string[];\n onChange: (value: string[]) => void;\n disabled?: boolean;\n}\n\nfunction ArrayField({\n label,\n required,\n description,\n value,\n onChange,\n disabled,\n}: ArrayFieldProps) {\n const [inputValue, setInputValue] = useState(\"\");\n\n const handleAdd = useCallback(() => {\n const trimmed = inputValue.trim();\n if (trimmed && !value.includes(trimmed)) {\n onChange([...value, trimmed]);\n setInputValue(\"\");\n }\n }, [inputValue, value, onChange]);\n\n const handleRemove = useCallback(\n (index: number) => {\n onChange(value.filter((_, i) => i !== index));\n },\n [value, onChange],\n );\n\n return (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {label}\n {required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </label>\n <div className=\"flex flex-wrap gap-1.5 mb-2\">\n {value.map((item, i) => (\n <span\n key={i}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-muted rounded text-xs\"\n >\n {item}\n {!disabled && (\n <button\n type=\"button\"\n onClick={() => handleRemove(i)}\n className=\"text-muted-foreground hover:text-destructive\"\n >\n <Icon icon=\"mdi:close\" className=\"w-3 h-3\" />\n </button>\n )}\n </span>\n ))}\n </div>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleAdd();\n }\n }}\n placeholder=\"Type and press Enter\"\n disabled={disabled}\n className=\"flex-1 px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={handleAdd}\n disabled={disabled || !inputValue.trim()}\n className=\"px-3 py-2 text-sm font-medium rounded-md bg-muted hover:bg-accent transition-colors disabled:opacity-50\"\n >\n Add\n </button>\n </div>\n {description && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{description}</p>\n )}\n </div>\n );\n}\n","/**\n * Shared workflow save hook.\n *\n * Extracts the save-to-backend logic used by both SaveFlowButton and WorkflowToolbar\n * into a single source of truth. After a successful save, invokes the configured\n * `onWorkflowSaved` callback so host apps can sync metadata to their own backends.\n */\nimport { useState, useCallback } from \"react\";\nimport { useParams, useNavigate } from \"react-router-dom\";\nimport { useShallow } from \"zustand/shallow\";\nimport { toast } from \"sonner\";\nimport { useFlowStore } from \"../stores/flow-store\";\nimport { getFluidGridsClient } from \"../../graphql/client\";\nimport { getFluidGridsConfig, type WorkflowSavedResult } from \"../../config\";\nimport {\n CreateWorkflowDefinitionDocument,\n CreateWorkflowVersionDocument,\n UpdateWorkflowDefinitionDocument,\n type CreateWorkflowDefinitionMutation,\n type CreateWorkflowVersionMutation,\n type UpdateWorkflowDefinitionMutation,\n} from \"../../generated/operations\";\n\ninterface UseSaveWorkflowReturn {\n saveToBackend: () => Promise<boolean>;\n isSaving: boolean;\n}\n\n/**\n * Slim a node's `data.nodeData` down to ONLY the operation the node is pinned\n * to (`operation_name`), instead of persisting the full manifest (every\n * operation) for every node. The single-op nodeData keeps the saved workflow\n * small yet self-contained: on reopen the properties panel renders the form\n * from `data.nodeData.operations` without depending on the in-memory registry.\n *\n * If the node has no matching operation, nodeData is dropped entirely and the\n * node falls back to resolving its schema from the registry at load time.\n */\nexport function slimNodeDataToCurrentOperation(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const nodeData = data.nodeData as Record<string, unknown> | undefined;\n if (!nodeData) return data;\n\n const opName = data.operation_name as string | undefined;\n const rawOps = nodeData.operations;\n const opsArray: unknown[] = Array.isArray(rawOps)\n ? rawOps\n : Array.isArray((rawOps as { operations?: unknown[] })?.operations)\n ? ((rawOps as { operations?: unknown[] }).operations as unknown[])\n : [];\n\n const current = opName\n ? opsArray.find((o) => (o as { name?: string })?.name === opName)\n : undefined;\n\n if (!current) {\n const { nodeData: _omit, ...rest } = data;\n void _omit;\n return rest;\n }\n\n return { ...data, nodeData: { ...nodeData, operations: [current] } };\n}\n\nexport function useSaveWorkflow(): UseSaveWorkflowReturn {\n const [isSaving, setIsSaving] = useState(false);\n const params = useParams<{ id?: string; version?: string }>();\n const navigate = useNavigate();\n\n const [saveWorkflow, setWorkflow] = useFlowStore(\n useShallow((s) => [s.actions.saveWorkflow, s.actions.setWorkflow]),\n );\n\n const saveToBackend = useCallback(async (): Promise<boolean> => {\n setIsSaving(true);\n try {\n const workflow = saveWorkflow();\n // Resolve workflow key: route param > store id > generate new\n const workflowKey = params?.id || workflow?.id;\n\n if (!workflowKey) {\n throw new Error(\n \"Workflow key not found. Navigate to /workflow/{key}/v1 to create a workflow.\",\n );\n }\n\n const isDraft = !workflow.status || workflow.status === \"DRAFT\";\n const client = getFluidGridsClient();\n\n // Prepare workflow data with nodes merged\n const preparedWorkflow = {\n ...workflow,\n nodes: workflow.nodes?.map((n) => {\n // Slim the nested nodeData to the pinned operation, then flatten the\n // rest onto the node root (operation_name/type/args) for the executor.\n const slimData = slimNodeDataToCurrentOperation(\n (n.data ?? {}) as Record<string, unknown>,\n );\n const { nodeData: _slimNodeData, ...flattenedData } = slimData;\n void _slimNodeData;\n return { ...n, data: slimData, ...flattenedData };\n }),\n };\n\n const definitionJson = {\n key: workflowKey,\n name: workflow?.name,\n description: workflow?.name || \"Workflow Description\",\n workflow_type: \"query-conditional\",\n data: {\n ...preparedWorkflow,\n version: workflow.version,\n alias: workflow?.alias || null,\n },\n meta: {\n creator: \"api_update\",\n version: workflow.version,\n },\n tags: [\n \"rag\",\n \"cache\",\n \"websearch\",\n \"conditional\",\n \"python_expr\",\n \"retry\",\n \"api_trigger\",\n ],\n };\n\n // Track saved state locally (not from store) to avoid stale reads\n let savedVersion = workflow.version;\n let savedDbId = workflow.dbId;\n let operation: WorkflowSavedResult[\"operation\"] = \"updated\";\n\n if (isDraft && workflow.dbId) {\n // ── DRAFT with existing record: update in-place ──────────────\n const { data } = await client.mutate<UpdateWorkflowDefinitionMutation>({\n mutation: UpdateWorkflowDefinitionDocument,\n variables: {\n id: workflow.dbId,\n input: {\n definitionJson,\n name: workflow?.name,\n description: workflow?.name || \"Workflow update\",\n alias: workflow?.alias || undefined,\n },\n },\n });\n\n if (data?.updateWorkflowDefinition) {\n savedVersion = data.updateWorkflowDefinition.version;\n savedDbId = data.updateWorkflowDefinition.id;\n operation = \"updated\";\n toast.success(\"Workflow saved\", {\n description: `Updated version ${savedVersion}`,\n dismissible: true,\n });\n } else {\n throw new Error(\"Failed to save workflow\");\n }\n } else if (isDraft && !workflow.dbId) {\n // ── DRAFT but no DB record (eager creation failed): create it now\n const { data } = await client.mutate<CreateWorkflowDefinitionMutation>({\n mutation: CreateWorkflowDefinitionDocument,\n variables: {\n input: {\n workflowKey,\n version: workflow.version || params?.version || \"v1\",\n name: workflow?.name || \"Untitled Workflow\",\n description: workflow?.name || \"Untitled Workflow\",\n definitionJson,\n },\n },\n });\n\n if (data?.createWorkflowDefinition) {\n savedVersion = data.createWorkflowDefinition.version;\n savedDbId = data.createWorkflowDefinition.id;\n operation = \"created\";\n\n // Populate the store so subsequent saves take the update-in-place path\n setWorkflow({\n dbId: savedDbId,\n status: data.createWorkflowDefinition.status ?? \"DRAFT\",\n version: savedVersion,\n });\n\n toast.success(\"Workflow saved\", {\n description: `Created version ${savedVersion}`,\n dismissible: true,\n });\n } else {\n throw new Error(\"Failed to create workflow\");\n }\n } else {\n // ── ACTIVE/ARCHIVED: create a new DRAFT version ──────────────\n const { data } = await client.mutate<CreateWorkflowVersionMutation>({\n mutation: CreateWorkflowVersionDocument,\n variables: {\n workflowKey,\n input: {\n definitionJson,\n description: workflow?.name || \"Workflow update\",\n },\n },\n });\n\n if (data?.createWorkflowVersion?.success) {\n const newWorkflow = data.createWorkflowVersion.workflow;\n savedVersion = newWorkflow?.version ?? workflow.version;\n savedDbId = newWorkflow?.id ?? workflow.dbId;\n operation = \"versioned\";\n\n // Update the store with the new version info\n setWorkflow({\n version: savedVersion,\n dbId: savedDbId,\n status: \"DRAFT\",\n });\n\n // Navigate to the new version URL so the address bar stays in sync\n navigate(`../workflow/${workflowKey}/${savedVersion}`, {\n replace: true,\n });\n\n toast.success(\"New version created\", {\n description: `Saved as version ${savedVersion} (Draft)`,\n dismissible: true,\n });\n } else {\n throw new Error(\n data?.createWorkflowVersion?.message || \"Failed to save workflow\",\n );\n }\n }\n\n // ── Invoke onWorkflowSaved callback ──────────────────────────\n // Errors are isolated so a host-app bug never blocks the user's save.\n if (savedDbId) {\n const config = getFluidGridsConfig();\n if (config.onWorkflowSaved) {\n try {\n await config.onWorkflowSaved({\n dbId: savedDbId,\n workflowKey,\n version: savedVersion,\n name: workflow?.name || \"Untitled Workflow\",\n description: workflow?.alias || workflow?.name || undefined,\n operation,\n });\n } catch (callbackError) {\n console.warn(\n \"[useSaveWorkflow] onWorkflowSaved callback failed:\",\n callbackError,\n );\n }\n }\n }\n return true;\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"Error saving workflow:\", message);\n toast.error(\"Failed to save workflow\", {\n description: message,\n });\n return false;\n } finally {\n setIsSaving(false);\n }\n }, [saveWorkflow, setWorkflow, params?.id, params?.version, navigate]);\n\n return { saveToBackend, isSaving };\n}\n","import {\n BlocksRenderer,\n resolveUiSpec,\n} from \"../../../../../../../../../modules/ui-blocks\";\nimport { ConnectionSelector } from \"../../../../../../../../../modules/connections/components\";\nimport { Icon } from \"@iconify/react\";\n\nimport { BuilderNodeType } from \"../../../../types\";\nimport { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport { toast } from \"sonner\";\nimport { config } from \"../../../../../../../../../config\";\nimport { useFlowStore } from \"../../../../../../../../stores/flow-store\";\nimport { useSaveWorkflow } from \"../../../../../../../../hooks/use-save-workflow\";\nimport { NODE_CONFIGS } from \"../../../../index\";\n\ninterface AdaptiveCardOperation {\n name: string;\n /** Legacy single-card UI; used when no `ui` block list is declared */\n adaptive_card?: Record<string, unknown>;\n /** Optional UI block list ({ version: 1, blocks: [...] }) from the manifest */\n ui?: unknown;\n}\n\ninterface NodeDataOperations {\n operations?: AdaptiveCardOperation[];\n /** Connection adapters from node manifest (new format) */\n connectionAdapters?: ConnectionAdapter[];\n /** @deprecated Use connectionAdapters instead */\n credentialAdapters?: ConnectionAdapter[];\n}\n\ninterface ConnectionAdapter {\n name: string;\n provider: string;\n /**\n * Auto-managed adapters are required by the worker/runtime for token injection,\n * but must not be shown as user-selectable connections in the builder.\n */\n mode?: \"auto\" | \"manual\" | string;\n autoProvision?: boolean;\n autoManaged?: boolean;\n hidden?: boolean;\n}\n\n/** Connection reference stored in node args (new format) */\ninterface ConnectionArg {\n connectionId: string;\n adapter: string;\n}\n\n/** @deprecated Legacy credential reference - use ConnectionArg instead */\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 from integrations service (new format) */\n connections?: ConnectionArg[];\n /** @deprecated Legacy credentials - use connections instead */\n credentials?: CredentialArg[];\n };\n version?: string;\n}\n\ntype NodePropertyPanelProps = Readonly<{\n id: string;\n type: BuilderNodeType;\n data: NodeData;\n updateData: (data: Partial<NodeData>) => void;\n}>;\n\ninterface ScheduledJob {\n job_id: string;\n workflow_key: string;\n workflow_version: string;\n trigger_node_id: string;\n trigger_type: string;\n trigger_args: {\n hour?: number;\n minute?: number;\n timezone?: string;\n expression?: string;\n };\n is_active: boolean;\n}\n\nexport default function NodePropertyPanel({\n id,\n type,\n data,\n updateData,\n}: NodePropertyPanelProps) {\n // Note: These scheduling-related states are used in handleScheduleSubmit and related functions\n // even though the JSX is commented out\n const [hour, setHour] = useState(\"2\");\n const [minute, setMinute] = useState(\"30\");\n const [timezone, setTimezone] = useState(\"UTC\");\n const [selectedDays, setSelectedDays] = useState<number[]>([]);\n const [weeklyHour, setWeeklyHour] = useState(\"0\");\n const [weeklyMinute, setWeeklyMinute] = useState(\"0\");\n const [cronExpression, setCronExpression] = useState(\"* * * * *\");\n const [cronDescription, setCronDescription] = useState(\"\");\n const [cronError, setCronError] = useState(\"\");\n const [activeScheduleType, setActiveScheduleType] = useState(\"simple\");\n const [scheduledJobs, setScheduledJobs] = useState<ScheduledJob[]>([]);\n const [filteredJobs, setFilteredJobs] = useState<ScheduledJob[]>([]);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [dataSinkSaveState, setDataSinkSaveState] = useState<\n \"idle\" | \"saving\" | \"saved\" | \"error\"\n >(\"idle\");\n const [dataSinkSaveMessage, setDataSinkSaveMessage] = useState(\"\");\n const [dataSinkKeyDraft, setDataSinkKeyDraft] = useState(\"\");\n const dataSinkSaveInFlightRef = useRef(false);\n const dataSinkSaveNodeIdRef = useRef<string | null>(null);\n\n // Get workflow_key from the store\n const workflow_key = useFlowStore((s) => s.workflow.id);\n const { saveToBackend, isSaving } = useSaveWorkflow();\n\n // Suppress lint warnings for unused variables that are used in commented-out JSX\n // These are kept for future use when the scheduling UI is re-enabled\n void setHour;\n void setMinute;\n void setSelectedDays;\n void setWeeklyHour;\n void setWeeklyMinute;\n void setCronExpression;\n void setCronDescription;\n void setCronError;\n void setActiveScheduleType;\n void setSearchTerm;\n void filteredJobs;\n void isLoading;\n void cronDescription;\n void setTimezone;\n\n const parseCronExpression = (expression: string) => {\n try {\n // Split the cron expression into its components\n const [minute, hour, dayOfMonth, month, dayOfWeek, year = \"*\"] =\n expression.split(\" \");\n\n const parseField = (\n field: string,\n min: number,\n max: number,\n ): number | number[] | null => {\n if (field === \"*\") return null;\n\n // Handle lists (e.g., \"1,2,3\")\n if (field.includes(\",\")) {\n return field.split(\",\").map((f) => parseInt(f, 10));\n }\n\n // Handle ranges (e.g., \"1-5\")\n if (field.includes(\"-\")) {\n const [start, end] = field.split(\"-\").map((f) => parseInt(f, 10));\n if (start >= min && end <= max) {\n return [start, end];\n }\n }\n\n // Handle single values\n const value = parseInt(field, 10);\n if (!isNaN(value) && value >= min && value <= max) {\n return value;\n }\n\n return null;\n };\n\n return {\n minute: parseField(minute, 0, 59),\n hour: parseField(hour, 0, 23),\n day: parseField(dayOfMonth, 1, 31),\n month: parseField(month, 1, 12),\n day_of_week: parseField(dayOfWeek, 0, 6),\n year: year === \"*\" ? null : parseField(year, 1970, 2099),\n };\n } catch (error: unknown) {\n console.error(\"Error parsing cron expression:\", error);\n throw new Error(\"Invalid cron expression\");\n }\n };\n\n const handleScheduleSubmit = async () => {\n try {\n let triggerArgs;\n\n switch (activeScheduleType) {\n case \"simple\":\n triggerArgs = {\n hour: parseInt(hour),\n minute: parseInt(minute),\n timezone: timezone,\n };\n break;\n case \"weekly\":\n if (selectedDays.length === 0) {\n toast.error(\"Please select at least one day of the week\");\n return;\n }\n triggerArgs = {\n days: selectedDays,\n hour: parseInt(weeklyHour),\n minute: parseInt(weeklyMinute),\n timezone: timezone,\n };\n break;\n case \"cron\":\n if (cronError) {\n toast.error(\"Please enter a valid cron expression\");\n return;\n }\n try {\n const cronComponents = parseCronExpression(cronExpression);\n // Filter out null values\n const filteredComponents = Object.fromEntries(\n Object.entries(cronComponents).filter(\n ([_, value]) => value !== null,\n ),\n );\n triggerArgs = {\n ...filteredComponents,\n timezone: timezone,\n };\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n toast.error(\"Failed to parse cron expression: \" + errorMessage);\n return;\n }\n break;\n default:\n throw new Error(\"Invalid schedule type\");\n }\n const response = await fetch(\n `${config.apiGatewayUrl}/config/scheduled_jobs`,\n {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: config.authToken ? `Bearer ${config.authToken}` : \"\",\n Accept: \"application/json\",\n },\n body: JSON.stringify({\n job_id: `workflow_${workflow_key}_${Date.now()}`,\n workflow_key: workflow_key,\n workflow_version: data.version,\n trigger_node_id: id,\n trigger_type: \"cron\",\n trigger_args: triggerArgs,\n is_active: true,\n }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n toast.success(\"Schedule set successfully!\");\n } catch (error) {\n console.error(\"Error setting schedule:\", error);\n toast.error(\n `Error setting schedule: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n };\n\n // handleScheduleSubmit is used in commented-out JSX\n void handleScheduleSubmit;\n\n // Get operations from nodeData or fall back to NODE_CONFIGS registry\n // This handles the case where workflow is loaded from DB without full manifest data\n const operationsArray = useMemo(() => {\n // First try to get operations from nodeData (nested structure from manifest)\n const nodeDataOps = data?.nodeData?.operations as\n | { operations?: AdaptiveCardOperation[] }\n | AdaptiveCardOperation[]\n | undefined;\n\n if (nodeDataOps) {\n // Handle both nested { operations: [...] } and flat [...] formats\n const ops = Array.isArray(nodeDataOps)\n ? nodeDataOps\n : nodeDataOps.operations;\n if (ops && ops.length > 0) {\n return ops;\n }\n }\n\n // Fall back to NODE_CONFIGS registry if nodeData doesn't have operations\n const nodeConfig = NODE_CONFIGS.find((config) => config.type === type);\n if (nodeConfig?.operations) {\n return nodeConfig.operations as AdaptiveCardOperation[];\n }\n\n return [];\n }, [data?.nodeData?.operations, type]);\n\n // Get connection adapters - check operation-level first, then fall back to node-level\n // Supports both new 'connectionAdapters' and legacy 'credentialAdapters' formats\n // Memoized so downstream useMemos (resolvedUi) get a stable reference.\n const currentOperation = useMemo(\n () =>\n operationsArray.find(\n (op: AdaptiveCardOperation) => op.name === data?.operation_name,\n ) as\n | (AdaptiveCardOperation & {\n connectionAdapters?: ConnectionAdapter[];\n credentialAdapters?: ConnectionAdapter[];\n })\n | undefined,\n [operationsArray, data?.operation_name],\n );\n\n const effectiveCurrentOperation = useMemo(() => {\n const nodeType = String(type);\n if (\n nodeType === \"store/bigconsole_datasink\" &&\n currentOperation?.name === \"postDataToDataSink\"\n ) {\n return {\n ...currentOperation,\n // Force the DataSink-key UI below to win even if an older registry\n // manifest already has a connection-oriented `ui` declaration.\n // Use a block UI (not legacy AdaptiveCard submit mode) so the save\n // action is rendered by the app's Button component and reliably calls\n // the panel-level onApply handler.\n ui: {\n version: 1,\n applyLabel: \"Save Configuration\",\n blocks: [\n {\n id: \"main\",\n type: \"adaptive_card\",\n card: {\n type: \"AdaptiveCard\",\n version: \"1.5\",\n body: [\n {\n type: \"TextBlock\",\n text: \"Send Data to BigConsole DataSink\",\n weight: \"bolder\",\n size: \"medium\",\n },\n {\n type: \"TextBlock\",\n text: \"Choose the DataSink key. Data is taken automatically from the previous node, and the BigConsole connection is handled automatically.\",\n wrap: true,\n size: \"small\",\n isSubtle: true,\n },\n {\n type: \"Input.Text\",\n placeholder: \"Target DataSink key (e.g., users_analytics)\",\n id: \"args.state.dataSinkKey\",\n label: \"DataSink Key\",\n isRequired: true,\n value: \"${dataSinkKey}\",\n },\n ],\n defaultValue: { dataSinkKey: \"\" },\n },\n },\n ],\n },\n description:\n \"Push data to a BigConsole DataSink. Data is taken from the previous node's output; choose the target DataSink key and the BigConsole connection is handled automatically.\",\n input_fields: {\n ...(\n currentOperation as AdaptiveCardOperation & {\n input_fields?: Record<string, unknown>;\n }\n ).input_fields,\n dataSinkKey: {\n type: \"string\",\n required: true,\n description:\n \"Target DataSink key. The workflow writes directly to this DataSink and auto-links on first run.\",\n },\n },\n };\n }\n\n return currentOperation;\n }, [currentOperation, type]);\n\n const shouldSaveConfigurationToBackend = useMemo(\n () =>\n String(type) === \"store/bigconsole_datasink\" &&\n effectiveCurrentOperation?.name === \"postDataToDataSink\",\n [effectiveCurrentOperation?.name, type],\n );\n\n useEffect(() => {\n if (!shouldSaveConfigurationToBackend) {\n setDataSinkKeyDraft(\"\");\n setDataSinkSaveState(\"idle\");\n setDataSinkSaveMessage(\"\");\n return;\n }\n\n setDataSinkKeyDraft(String(data?.args?.state?.dataSinkKey ?? \"\"));\n if (\n dataSinkSaveInFlightRef.current &&\n dataSinkSaveNodeIdRef.current === id\n ) {\n return;\n }\n\n setDataSinkSaveState(\"idle\");\n setDataSinkSaveMessage(\"\");\n }, [data?.args?.state?.dataSinkKey, id, shouldSaveConfigurationToBackend]);\n\n // Use operation-specific adapters if available, otherwise use node-level\n // Prefer connectionAdapters (new) over credentialAdapters (legacy)\n const connectionAdapters = useMemo(\n () =>\n effectiveCurrentOperation?.connectionAdapters ||\n effectiveCurrentOperation?.credentialAdapters ||\n data?.nodeData?.connectionAdapters ||\n data?.nodeData?.credentialAdapters ||\n [],\n [\n effectiveCurrentOperation?.connectionAdapters,\n effectiveCurrentOperation?.credentialAdapters,\n data?.nodeData?.connectionAdapters,\n data?.nodeData?.credentialAdapters,\n ],\n );\n\n const isAutoManagedAdapter = useCallback(\n (adapter: ConnectionAdapter) => {\n const nodeType = String(type);\n const isBigConsoleDataSinkAutoAdapter =\n nodeType === \"store/bigconsole_datasink\" &&\n adapter.name === \"bigconsole\" &&\n adapter.provider === \"bigconsole\";\n return (\n isBigConsoleDataSinkAutoAdapter ||\n adapter.mode === \"auto\" ||\n adapter.autoProvision === true ||\n adapter.autoManaged === true ||\n adapter.hidden === true\n );\n },\n [type],\n );\n\n const visibleConnectionAdapters = useMemo(\n () =>\n connectionAdapters.filter((adapter) => !isAutoManagedAdapter(adapter)),\n [connectionAdapters, isAutoManagedAdapter],\n );\n\n const hasAutoManagedConnections = useMemo(\n () => connectionAdapters.some(isAutoManagedAdapter),\n [connectionAdapters, isAutoManagedAdapter],\n );\n\n // Selected connections from node data\n // Supports both new 'connections' and legacy 'credentials' formats for backward compatibility\n const selectedConnections = useMemo(() => {\n // Prefer new 'connections' format\n if (data?.args?.connections && data.args.connections.length > 0) {\n return data.args.connections.map((conn: ConnectionArg) => ({\n connectionId: conn.connectionId,\n adapter: conn.adapter,\n }));\n }\n // Fall back to legacy 'credentials' format for backward compatibility\n if (data?.args?.credentials && data.args.credentials.length > 0) {\n return data.args.credentials.map((cred: CredentialArg) => ({\n connectionId: cred.id,\n adapter: cred.adapter,\n }));\n }\n return [];\n }, [data?.args?.connections, data?.args?.credentials]);\n\n // Handle connection selection changes\n // Stores in new 'connections' format, clears legacy 'credentials' field.\n // Only updates args.connections — preserves all other data references\n // (especially nodeData) to avoid triggering an AdaptiveCard re-render.\n const handleConnectionsChange = useCallback(\n (connections: { connectionId: string; adapter: string }[]) => {\n const currentArgs = data?.args ?? {};\n const { credentials: _legacy, ...restArgs } = currentArgs;\n void _legacy; // Clear legacy field\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 const submittedData = (d: Record<string, unknown>) => {\n // Build updated state from submitted form values.\n // IMPORTANT: Only create new objects for args.state — preserve all other\n // data references (especially nodeData/operations) so the operationsArray\n // useMemo keeps its cached result and the AdaptiveCardRenderer's cardData\n // reference stays stable (preventing a full card DOM rebuild that would\n // reset user inputs).\n const currentState = (data?.args?.state ?? {}) as Record<string, unknown>;\n const newState: Record<string, unknown> = { ...currentState };\n\n for (const [rawPath, value] of Object.entries(d)) {\n // Adaptive Card field IDs use the full data path (e.g. \"args.state.query\").\n // Since we're writing directly into args.state, strip that prefix to avoid\n // double-nesting (args.state.args.state.query).\n const path = rawPath.replace(/^args\\.state\\./, \"\");\n\n const keys = path.split(\".\");\n let current: Record<string, unknown> = newState;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n // Shallow-copy intermediate objects to avoid mutating existing data\n current[key] = current[key]\n ? { ...(current[key] as Record<string, unknown>) }\n : {};\n current = current[key] as Record<string, unknown>;\n }\n\n current[keys[keys.length - 1]] = value;\n }\n\n if (\n shouldSaveConfigurationToBackend &&\n (isSaving || dataSinkSaveInFlightRef.current)\n ) {\n setDataSinkSaveState(\"saving\");\n setDataSinkSaveMessage(\"A workflow save is already in progress…\");\n toast.info(\"A workflow save is already in progress\");\n return;\n }\n\n if (shouldSaveConfigurationToBackend) {\n const dataSinkKey = String(newState.dataSinkKey ?? \"\").trim();\n if (!dataSinkKey) {\n setDataSinkSaveState(\"error\");\n setDataSinkSaveMessage(\"Enter a DataSink Key before saving.\");\n toast.error(\"Enter a DataSink Key before saving\");\n return;\n }\n\n dataSinkSaveInFlightRef.current = true;\n dataSinkSaveNodeIdRef.current = id;\n setDataSinkKeyDraft(dataSinkKey);\n\n // Store the trimmed key so the persisted workflow matches the value\n // confirmed in the UI feedback.\n newState.dataSinkKey = dataSinkKey;\n }\n\n // Partial update: only args.state changes, everything else (nodeData,\n // operation_name, version, args.context, args.connections) is preserved\n // by reference via the spread.\n updateData({\n args: {\n ...(data?.args ?? {}),\n state: newState,\n },\n } as Partial<NodeData>);\n\n if (shouldSaveConfigurationToBackend) {\n const dataSinkKey = String(newState.dataSinkKey ?? \"\");\n\n setDataSinkSaveState(\"saving\");\n setDataSinkSaveMessage(`Saving DataSink key “${dataSinkKey}”…`);\n const toastId = toast.loading(\"Saving DataSink key\", {\n description: dataSinkKey,\n });\n\n // Defer briefly so updateData's React Flow/Zustand sync is visible\n // before saveWorkflow() snapshots the current canvas for persistence.\n window.setTimeout(() => {\n void saveToBackend()\n .then((saved) => {\n if (!saved) {\n setDataSinkSaveState(\"error\");\n setDataSinkSaveMessage(\n \"Workflow save failed. The DataSink key was not persisted.\",\n );\n toast.error(\"Failed to save DataSink key\", {\n id: toastId,\n description: \"Workflow save failed.\",\n });\n return;\n }\n\n setDataSinkSaveState(\"saved\");\n setDataSinkSaveMessage(\n `DataSink key “${dataSinkKey}” saved to the workflow.`,\n );\n toast.success(\"DataSink key saved\", {\n id: toastId,\n description: \"Workflow configuration was saved successfully.\",\n });\n })\n .catch((error: unknown) => {\n const message =\n error instanceof Error\n ? error.message\n : \"Failed to save DataSink configuration\";\n setDataSinkSaveState(\"error\");\n setDataSinkSaveMessage(message);\n console.error(\"Error saving DataSink configuration:\", error);\n toast.error(\"Failed to save DataSink key\", {\n id: toastId,\n description: message,\n });\n })\n .finally(() => {\n dataSinkSaveInFlightRef.current = false;\n dataSinkSaveNodeIdRef.current = null;\n });\n }, 100);\n }\n };\n\n // Resolve the operation's UI: a declared `ui` block list, or a spec\n // synthesized from the legacy `adaptive_card` (rendered with the card's own\n // submit flow, exactly as before). Card reference stabilization — needed\n // because updateData deep-clones node data and an unstable cardData\n // reference would rebuild the card DOM and reset user inputs — now lives\n // per block inside AdaptiveCardBlock (useStableJson).\n const resolvedUi = useMemo(\n () => resolveUiSpec(effectiveCurrentOperation),\n [effectiveCurrentOperation],\n );\n\n // Memoize sampleData to prevent unnecessary re-renders of AdaptiveCardRenderer\n // This is critical - creating a new object every render causes the card to reset\n const sampleData = useMemo(() => {\n return data?.args?.state ?? {};\n }, [data?.args?.state]);\n\n const fetchScheduledJobs = useCallback(async () => {\n try {\n setIsLoading(true);\n const response = await fetch(\n `${config.apiGatewayUrl}/config/scheduled_jobs`,\n {\n method: \"GET\",\n headers: {\n Authorization: config.authToken ? `Bearer ${config.authToken}` : \"\",\n Accept: \"application/json\",\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const jobs = await response.json();\n const specificJobs = jobs.filter(\n (job: ScheduledJob) => job.trigger_node_id === id,\n );\n // Sort jobs with active ones first\n const sortedJobs = specificJobs.sort(\n (a: ScheduledJob, b: ScheduledJob) => {\n if (a.is_active === b.is_active) return 0;\n return a.is_active ? -1 : 1;\n },\n );\n setScheduledJobs(sortedJobs);\n setFilteredJobs(sortedJobs);\n } catch (error) {\n console.error(\"Error fetching scheduled jobs:\", error);\n } finally {\n setIsLoading(false);\n }\n }, [id]);\n\n useEffect(() => {\n fetchScheduledJobs();\n }, [fetchScheduledJobs]);\n\n useEffect(() => {\n const filtered = scheduledJobs.filter((job) => {\n const searchLower = searchTerm.toLowerCase();\n return (\n job.job_id.toLowerCase().includes(searchLower) ||\n job.workflow_key.toLowerCase().includes(searchLower) ||\n job.workflow_version.toLowerCase().includes(searchLower)\n );\n });\n setFilteredJobs(filtered);\n }, [searchTerm, scheduledJobs]);\n\n const toggleJobStatus = async (job: ScheduledJob, currentStatus: boolean) => {\n try {\n const response = await fetch(\n `${config.apiGatewayUrl}/config/scheduled_jobs`,\n {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: config.authToken ? `Bearer ${config.authToken}` : \"\",\n Accept: \"application/json\",\n },\n body: JSON.stringify({\n job_id: job.job_id,\n is_active: !currentStatus,\n workflow_key: job.workflow_key,\n workflow_version: job.workflow_version,\n trigger_node_id: job.trigger_node_id,\n trigger_type: job.trigger_type,\n trigger_args: job.trigger_args,\n }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n // Update local state\n setScheduledJobs((jobs) =>\n jobs.map((x) =>\n x.job_id === job.job_id ? { ...x, is_active: !currentStatus } : x,\n ),\n );\n } catch (error) {\n console.error(\"Error toggling job status:\", error);\n toast.error(\n `Error toggling job status: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n };\n\n // toggleJobStatus is used in commented-out JSX\n void toggleJobStatus;\n\n return (\n <div className=\"flex flex-col gap-4.5 p-4\">\n <div className=\"text-xs text-card-foreground/20 self-end \">{id}</div>\n\n {/* <div className=\"flex flex-col\">\n <div className=\"text-xs text-card-foreground/60 font-semibold mb-4\">\n Schedule Configuration\n </div>\n </div>\n\n <Tabs\n defaultValue=\"simple\"\n className=\"w-full mb-4\"\n onValueChange={(value) => setActiveScheduleType(value)}\n >\n <TabsList className=\"grid w-full grid-cols-3\">\n <TabsTrigger value=\"simple\">Simple</TabsTrigger>\n <TabsTrigger value=\"weekly\">Weekly</TabsTrigger>\n <TabsTrigger value=\"cron\">Cron</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"simple\">\n <div className=\"grid grid-cols-3 gap-4 mb-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"hour\">Hour (24h)</Label>\n <Input\n id=\"hour\"\n type=\"number\"\n min=\"0\"\n max=\"23\"\n value={hour}\n onChange={(e) => setHour(e.target.value)}\n placeholder=\"Hour\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"minute\">Minute</Label>\n <Input\n id=\"minute\"\n type=\"number\"\n min=\"0\"\n max=\"59\"\n value={minute}\n onChange={(e) => setMinute(e.target.value)}\n placeholder=\"Minute\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"timezone\">Timezone</Label>\n <Input\n id=\"timezone\"\n type=\"text\"\n value={timezone}\n onChange={(e) => setTimezone(e.target.value)}\n placeholder=\"Timezone\"\n />\n </div>\n </div>\n </TabsContent>\n\n <TabsContent value=\"weekly\">\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-7 gap-2\">\n {['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].map((day, index) => (\n <div key={day} className=\"flex flex-col items-center\">\n <Label htmlFor={`day-${index}`}>{day}</Label>\n <Checkbox\n id={`day-${index}`}\n checked={selectedDays.includes(index)}\n onCheckedChange={(checked) => {\n if (checked) {\n setSelectedDays([...selectedDays, index]);\n } else {\n setSelectedDays(selectedDays.filter(d => d !== index));\n }\n }}\n />\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"weeklyHour\">Hour (24h)</Label>\n <Input\n id=\"weeklyHour\"\n type=\"number\"\n min=\"0\"\n max=\"23\"\n value={weeklyHour}\n onChange={(e) => setWeeklyHour(e.target.value)}\n placeholder=\"Hour\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"weeklyMinute\">Minute</Label>\n <Input\n id=\"weeklyMinute\"\n type=\"number\"\n min=\"0\"\n max=\"59\"\n value={weeklyMinute}\n onChange={(e) => setWeeklyMinute(e.target.value)}\n placeholder=\"Minute\"\n />\n </div>\n </div>\n </div>\n </TabsContent>\n\n <TabsContent value=\"cron\">\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"cronExpression\">Cron Expression</Label>\n <Input\n id=\"cronExpression\"\n type=\"text\"\n value={cronExpression}\n onChange={(e) => {\n setCronExpression(e.target.value);\n try {\n const description = cronstrue.toString(e.target.value);\n setCronDescription(description);\n setCronError(\"\");\n } catch (error) {\n setCronError(\"Invalid cron expression\");\n setCronDescription(\"\");\n }\n }}\n placeholder=\"* * * * *\"\n />\n </div>\n {cronError ? (\n <div className=\"text-sm text-[var(--color-status-error-text)]\">{cronError}</div>\n ) : cronDescription ? (\n <div className=\"text-sm text-muted-foreground\">{cronDescription}</div>\n ) : null}\n </div>\n </TabsContent>\n </Tabs>\n\n <Button\n onClick={handleScheduleSubmit}\n className=\"mb-6\"\n >\n Set Schedule\n </Button>\n\n <div className=\"text-xs text-card-foreground/60 font-semibold mb-4\">\n Scheduled Jobs\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-2\">\n <Search className=\"w-4 h-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search jobs...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"h-8\"\n />\n </div>\n\n {isLoading ? (\n <div className=\"text-center py-4\">Loading scheduled jobs...</div>\n ) : (\n <div className=\"border rounded-md\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Status</TableHead>\n <TableHead>Job ID</TableHead>\n <TableHead>Workflow</TableHead>\n <TableHead>Schedule</TableHead>\n <TableHead>Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {filteredJobs.map((job) => (\n <TableRow key={job.job_id}>\n <TableCell>\n <Badge variant={job.is_active ? \"default\" : \"secondary\"}>\n {job.is_active ? \"Active\" : \"Inactive\"}\n </Badge>\n </TableCell>\n <TableCell className=\"font-mono text-xs\">\n {job.job_id}\n </TableCell>\n <TableCell>\n <div className=\"text-sm\">{job.workflow_key}</div>\n <div className=\"text-xs text-muted-foreground\">v{job.workflow_version}</div>\n </TableCell>\n <TableCell>\n <div className=\"text-sm\">\n {job.trigger_type === 'cron'\n ? cronstrue.toString(job.trigger_args.expression || \"* * * * *\")\n : `${job.trigger_args.hour}:${job.trigger_args.minute.toString().padStart(2, '0')}`\n }\n </div>\n <div className=\"text-xs text-muted-foreground\">{job.trigger_args.timezone}</div>\n </TableCell>\n <TableCell>\n <Switch\n checked={job.is_active}\n onCheckedChange={() => toggleJobStatus(job, job.is_active)}\n />\n </TableCell>\n </TableRow>\n ))}\n {filteredJobs.length === 0 && (\n <TableRow>\n <TableCell colSpan={5} className=\"text-center py-4\">\n No scheduled jobs found\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n )}\n </div> */}\n\n {/* Connections Section */}\n {visibleConnectionAdapters.length > 0 && (\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={visibleConnectionAdapters}\n selectedConnections={selectedConnections}\n onChange={handleConnectionsChange}\n compact\n />\n </div>\n )}\n\n {hasAutoManagedConnections && visibleConnectionAdapters.length === 0 && (\n <div className=\"flex items-start gap-2 rounded-md border border-border bg-muted/30 px-3 py-2 text-xs text-muted-foreground\">\n <Icon icon=\"mdi:shield-check\" className=\"mt-0.5 h-4 w-4 shrink-0\" />\n <div>\n <div className=\"font-medium text-card-foreground\">\n Connection handled automatically\n </div>\n <div>\n This node uses the workspace BigConsole app connection at run\n time. You only need to configure the DataSink target below.\n </div>\n </div>\n </div>\n )}\n\n {/* Properties Section */}\n <div className=\"flex pt-5 flex-col\">\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Properties\n </div>\n {shouldSaveConfigurationToBackend ? (\n <div className=\"flex flex-col gap-4 pt-2\">\n <div>\n <div className=\"text-lg font-semibold text-card-foreground\">\n Send Data to BigConsole DataSink\n </div>\n <p className=\"mt-3 text-sm text-muted-foreground\">\n Choose the DataSink key. Data is taken automatically from the\n previous node, and the BigConsole connection is handled\n automatically.\n </p>\n </div>\n\n <label className=\"flex flex-col gap-2 text-sm font-medium text-card-foreground\">\n <span>\n DataSink Key{\" \"}\n <span className=\"text-[var(--color-status-error-text)]\">*</span>\n </span>\n <input\n type=\"text\"\n value={dataSinkKeyDraft}\n onChange={(event) => {\n setDataSinkKeyDraft(event.target.value);\n if (dataSinkSaveState !== \"idle\") {\n setDataSinkSaveState(\"idle\");\n setDataSinkSaveMessage(\"\");\n }\n }}\n placeholder=\"Target DataSink key (e.g., users_analytics)\"\n className=\"w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground outline-none transition-colors placeholder:text-muted-foreground focus:border-primary focus:ring-2 focus:ring-primary/20 disabled:opacity-50\"\n disabled={dataSinkSaveState === \"saving\" || isSaving}\n />\n </label>\n\n <button\n type=\"button\"\n onClick={() => submittedData({ dataSinkKey: dataSinkKeyDraft })}\n disabled={dataSinkSaveState === \"saving\" || isSaving}\n className=\"self-start rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {dataSinkSaveState === \"saving\" || isSaving\n ? \"Saving…\"\n : \"Save Configuration\"}\n </button>\n\n {dataSinkSaveMessage ? (\n <div\n className={[\n \"rounded-md border px-3 py-2 text-xs\",\n dataSinkSaveState === \"saved\"\n ? \"border-[var(--color-status-success-border)] bg-[var(--color-status-success-bg-subtle)] text-[var(--color-status-success-text)]\"\n : dataSinkSaveState === \"error\"\n ? \"border-[var(--color-status-error-border)] bg-[var(--color-status-error-bg-subtle)] text-[var(--color-status-error-text)]\"\n : \"border-border bg-muted/30 text-muted-foreground\",\n ].join(\" \")}\n >\n {dataSinkSaveMessage}\n </div>\n ) : null}\n </div>\n ) : resolvedUi ? (\n <BlocksRenderer\n // Keyed per node + operation: switching either remounts all\n // blocks so card refs and custom-block drafts can't go stale.\n key={`${id}:${data?.operation_name ?? \"\"}`}\n spec={resolvedUi.spec}\n synthesized={resolvedUi.synthesized}\n state={sampleData}\n onApply={submittedData}\n />\n ) : (\n <div className=\"text-sm text-muted-foreground py-2\">\n No Properties\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { Button } from \"@burdenoff/fe-libs/ui\";\nimport {\n Dialog,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from \"@burdenoff/fe-libs/ui\";\nimport { InfoCircledIcon } from \"@radix-ui/react-icons\";\n\ninterface NodeMetadataProps {\n name?: string;\n version?: string;\n description?: string;\n className?: string;\n icon?: string;\n title?: string;\n handleDeleteNode?: () => void;\n handleShowNodeProperties?: () => void;\n gradientColor?: string;\n [key: string]: unknown;\n}\n\nconst nodeDetails = {\n node_type: \"gmail_reader\",\n version: \"1.0.0\",\n kind: [\"communication\", \"email\", \"gmail\"],\n name: \"Gmail Operator\",\n description: \"A node that executes Gmail operations to automate email tasks\",\n author: \"FluidGrids Team\",\n author_email: \"support@fluidgrids.ai\",\n website: \"https://fluidgrids.ai/\",\n copyright: \"Copyright 2025 Algoshred Technologies Private Limited\",\n license: \"MIT\",\n repository: {\n type: \"git\",\n url: \"https://github.com/algoshred/fluidgrids\",\n },\n maintainers: [\n {\n name: \"FluidGrids Team\",\n email: \"support@fluidgrids.ai\",\n },\n ],\n support: {\n email: \"support@fluidgrids.ai\",\n url: \"https://fluidgrids.ai/support\",\n docs: \"https://docs.fluidgrids.ai/nodes/gmail_reader\",\n },\n legal: {\n privacy_policy_url: \"https://fluidgrids.ai/privacy-policy\",\n terms_url: \"https://fluidgrids.ai/terms\",\n },\n metadata: {\n favicon: \"/assets/logo-color.png\", // fallback to public asset\n logo: \"/assets/logo-color.png\", // fallback to public asset\n keywords: [\"workflow\", \"node\", \"gmail\", \"email\", \"communication\"],\n category: \"communication\",\n },\n};\n\nexport function NodeInfoButtonWithModal({\n metadata,\n}: {\n metadata: NodeMetadataProps;\n}) {\n return (\n <Dialog>\n <DialogTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Show sponsored info\"\n className=\"w-6 h-6 p-0 flex items-center justify-center border-default bg-surface/60 hover:bg-[var(--color-status-info-bg-subtle)] hover:border-[var(--color-status-info-border)] transition-colors\"\n >\n <InfoCircledIcon className=\"w-4 h-4 text-[var(--color-status-info-text)]\" />\n </Button>\n </DialogTrigger>\n <DialogContent className=\"max-w-xl\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <img\n src={nodeDetails.metadata.logo}\n alt=\"logo\"\n className=\"w-8 h-8 rounded bg-white border border-gray-200\"\n />\n {nodeDetails.name}\n </DialogTitle>\n <DialogDescription>{nodeDetails.description}</DialogDescription>\n </DialogHeader>\n <div className=\"flex items-center gap-2 mb-2\">\n <img\n src={nodeDetails.metadata.favicon}\n alt=\"favicon\"\n className=\"w-4 h-4 rounded\"\n />\n <span className=\"text-xs text-gray-500\">\n {nodeDetails.node_type} v{nodeDetails.version}\n </span>\n </div>\n <div className=\"space-y-1 text-sm\">\n <div>\n <b>Kind:</b> {nodeDetails.kind.join(\", \")}\n </div>\n <div>\n <b>Author:</b> {nodeDetails.author} (\n <a\n href={`mailto:${nodeDetails.author_email}`}\n className=\"text-accent underline\"\n >\n {nodeDetails.author_email}\n </a>\n )\n </div>\n <div>\n <b>Website:</b>{\" \"}\n <a\n href={nodeDetails.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent underline\"\n >\n {nodeDetails.website}\n </a>\n </div>\n <div>\n <b>Repository:</b>{\" \"}\n <a\n href={nodeDetails.repository.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent underline\"\n >\n {nodeDetails.repository.url}\n </a>\n </div>\n <div>\n <b>Support:</b>{\" \"}\n <a\n href={`mailto:${nodeDetails.support.email}`}\n className=\"text-accent underline\"\n >\n {nodeDetails.support.email}\n </a>{\" \"}\n |{\" \"}\n <a\n href={nodeDetails.support.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent underline\"\n >\n Support Page\n </a>{\" \"}\n |{\" \"}\n <a\n href={nodeDetails.support.docs}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent underline\"\n >\n Docs\n </a>\n </div>\n <div>\n <b>Legal:</b>{\" \"}\n <a\n href={nodeDetails.legal.privacy_policy_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent underline\"\n >\n Privacy Policy\n </a>{\" \"}\n |{\" \"}\n <a\n href={nodeDetails.legal.terms_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent underline\"\n >\n Terms\n </a>\n </div>\n <div>\n <b>License:</b> {nodeDetails.license}\n </div>\n <div>\n <b>Copyright:</b> {nodeDetails.copyright}\n </div>\n <div>\n <b>Keywords:</b> {nodeDetails.metadata.keywords.join(\", \")}\n </div>\n <div>\n <b>Category:</b> {nodeDetails.metadata.category}\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { nanoid } from \"nanoid/non-secure\";\nimport { getFluidGridsClient } from \"../graphql/client\";\nimport {\n TriggerWorkflowDocument,\n WorkflowRunDocument,\n} from \"../generated/operations\";\nimport type { WorkflowRunQuery } from \"../generated/operations\";\nimport { useFlowStore } from \"../builder/stores/flow-store\";\nimport type { ExecutionLog } from \"../types/execution\";\nimport type { ChannelNodeData } from \"../builder/components/flow-builder/components/blocks/types\";\n\n// Alias for backward compatibility\nconst TRIGGER_WORKFLOW = TriggerWorkflowDocument;\nconst WORKFLOW_RUN = WorkflowRunDocument;\n\n/** Terminal run statuses that stop polling */\nconst TERMINAL_STATUSES = new Set([\n \"COMPLETED\",\n \"FAILED\",\n \"CANCELLED\",\n \"TERMINATED\",\n]);\n\n/** Polling interval in ms */\nconst POLL_INTERVAL = 1500;\n\n/**\n * How long to wait for the run record to appear in the DB after triggering.\n * Only used in the `if (!run)` path — active runs poll indefinitely until\n * the backend signals a terminal status (COMPLETED/FAILED/CANCELLED).\n */\nconst MAX_RUN_CREATION_WAIT = 60_000;\n\ninterface TriggerWorkflowResponse {\n triggerWorkflow: {\n runId: string;\n workflowKey: string;\n version: string;\n triggerNodeId: string;\n status: string;\n };\n}\n\n/**\n * Calculate item count from node output\n * Returns the number of items in the output (1 for single objects, array length for arrays)\n */\nfunction calculateItemCount(output: Record<string, unknown>): number {\n if (!output || Object.keys(output).length === 0) {\n return 0;\n }\n\n const values = Object.values(output);\n for (const value of values) {\n if (Array.isArray(value)) {\n return value.length;\n }\n if (typeof value === \"object\" && value !== null) {\n const nestedValues = Object.values(value as Record<string, unknown>);\n for (const nestedValue of nestedValues) {\n if (Array.isArray(nestedValue)) {\n return nestedValue.length;\n }\n }\n }\n }\n\n return 1;\n}\n\n/**\n * Hook to execute a workflow up to a specific node (n8n-style execution)\n *\n * When clicking \"Execute step\" on any node, this triggers the workflow\n * from the trigger node up to and including the clicked node.\n *\n * Uses polling instead of WebSocket subscriptions because the subscription\n * fields are not yet in the supergraph schema.\n */\nexport function useNodeExecution() {\n const pollTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pollStartRef = useRef<number>(0);\n /** Tracks the run ID of the active poll cycle; cleared by cleanup() */\n const activeRunIdRef = useRef<string | null>(null);\n\n const workflow = useFlowStore((s) => s.workflow);\n const startExecution = useFlowStore(\n (s) => s.actions.execution.startExecution,\n );\n const addLog = useFlowStore((s) => s.actions.execution.addLog);\n const updateLog = useFlowStore((s) => s.actions.execution.updateLog);\n const setNodeStatus = useFlowStore((s) => s.actions.execution.setNodeStatus);\n const setNodeItemCount = useFlowStore(\n (s) => s.actions.execution.setNodeItemCount,\n );\n const completeExecution = useFlowStore(\n (s) => s.actions.execution.completeExecution,\n );\n const clearLogs = useFlowStore((s) => s.actions.execution.clearLogs);\n\n /**\n * Stop any active polling\n */\n const cleanup = useCallback(() => {\n if (pollTimerRef.current) {\n clearTimeout(pollTimerRef.current);\n pollTimerRef.current = null;\n }\n activeRunIdRef.current = null;\n }, []);\n\n /**\n * Check if a node type represents a trigger node.\n */\n const isTriggerNodeType = useCallback(\n (type: string | undefined, data?: ChannelNodeData): boolean => {\n if (!type) return false;\n if (\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 return true;\n }\n // integration/channel is role-based: only a trigger when configured as receive\n if (type === \"integration/channel\") {\n const channelData = data as ChannelNodeData;\n // args.state.role is set by the property panel (current config) — prefer it.\n // Fall back to legacy top-level data.role for older persisted nodes.\n const role = channelData.args?.state?.role ?? channelData.role;\n const opName = channelData.operation_name;\n // Explicit action role → not a trigger\n if (role === \"action\") return false;\n // Explicit trigger role, or operation name starts with \"on\" (e.g. onChannelMessageReceived)\n if (\n role === \"trigger\" ||\n (typeof opName === \"string\" && opName.startsWith(\"on\"))\n )\n return true;\n // No explicit config yet — fall through to kind-based check\n }\n const kind = (data as ChannelNodeData).nodeData?.kind;\n if (kind && kind.some((k) => k.includes(\"trigger\"))) {\n return true;\n }\n return false;\n },\n [],\n );\n\n /**\n * Find the trigger node in the workflow\n */\n const findTriggerNode = useCallback(() => {\n const { nodes, edges } = workflow;\n\n const explicitTrigger = nodes.find((node) =>\n isTriggerNodeType(node.type, node.data as ChannelNodeData),\n );\n if (explicitTrigger) {\n return explicitTrigger;\n }\n\n const nodesWithIncomingEdges = new Set(edges.map((e) => e.target));\n const firstNode = nodes.find(\n (node) => !nodesWithIncomingEdges.has(node.id),\n );\n\n if (firstNode) {\n return firstNode;\n }\n\n if (nodes.length > 0) {\n return nodes[0];\n }\n\n console.error(\"[useNodeExecution] No nodes found in workflow\");\n return null;\n }, [workflow, isTriggerNodeType]);\n\n /**\n * Get node name from the workflow nodes\n */\n const getNodeName = useCallback(\n (nodeId: string) => {\n const node = workflow.nodes.find((n) => n.id === nodeId);\n if (!node) return `Node ${nodeId}`;\n const data = node.data as { operation_name?: string; name?: string };\n return (\n data?.operation_name || data?.name || node.type || `Node ${nodeId}`\n );\n },\n [workflow.nodes],\n );\n\n /**\n * Process node states from a polled WorkflowRun response.\n * Creates new logs or updates existing ones, and sets visual node status.\n */\n const processNodeStates = useCallback(\n (\n runId: string,\n nodeStates: NonNullable<WorkflowRunQuery[\"workflowRun\"]>[\"nodeStates\"],\n ) => {\n for (const nodeState of nodeStates) {\n const logId = `${runId}-${nodeState.nodeId}`;\n const rawStatus = nodeState.status.toLowerCase();\n // Map backend statuses to our 4-state model.\n // WAITING/DELAYED/WAITING_SUBWORKFLOW are paused-but-active states;\n // map them to \"running\" so the builder shows the node as in-progress.\n const status: \"pending\" | \"running\" | \"completed\" | \"failed\" =\n rawStatus === \"completed\"\n ? \"completed\"\n : rawStatus === \"failed\" || rawStatus === \"timeout\"\n ? \"failed\"\n : rawStatus === \"running\" ||\n rawStatus === \"waiting\" ||\n rawStatus === \"delayed\" ||\n rawStatus === \"waiting_subworkflow\"\n ? \"running\"\n : \"pending\";\n\n // Update visual node status indicators\n if (status === \"completed\") {\n setNodeStatus(nodeState.nodeId, \"success\");\n if (nodeState.output) {\n const itemCount = calculateItemCount(\n nodeState.output as Record<string, unknown>,\n );\n setNodeItemCount(nodeState.nodeId, itemCount);\n }\n } else if (status === \"failed\") {\n setNodeStatus(nodeState.nodeId, \"error\");\n } else if (status === \"running\") {\n setNodeStatus(nodeState.nodeId, \"running\");\n }\n\n // Create or update the log entry\n const existingLog = useFlowStore\n .getState()\n .execution.logs.find((l) => l.id === logId);\n\n if (!existingLog) {\n // Only add logs for nodes that have started (not PENDING)\n if (status === \"pending\") continue;\n const newLog: ExecutionLog = {\n id: logId,\n runId,\n nodeId: nodeState.nodeId,\n nodeType: nodeState.nodeType,\n nodeName: getNodeName(nodeState.nodeId),\n status,\n inputArgs: (nodeState.inputArgs as Record<string, unknown>) ?? null,\n output: (nodeState.output as Record<string, unknown>) ?? null,\n error: nodeState.error ?? null,\n duration: nodeState.duration ?? null,\n startTime: nodeState.startTime ?? new Date().toISOString(),\n endTime: nodeState.endTime ?? null,\n };\n addLog(newLog);\n } else {\n // Only update if something changed\n if (\n existingLog.status !== status ||\n (status === \"completed\" && !existingLog.output)\n ) {\n updateLog(logId, {\n status,\n inputArgs:\n (nodeState.inputArgs as Record<string, unknown>) ??\n existingLog.inputArgs,\n output:\n (nodeState.output as Record<string, unknown>) ??\n existingLog.output,\n error: nodeState.error ?? existingLog.error,\n duration: nodeState.duration ?? existingLog.duration,\n endTime: nodeState.endTime ?? existingLog.endTime,\n });\n }\n }\n }\n },\n [setNodeStatus, setNodeItemCount, addLog, updateLog, getNodeName],\n );\n\n /**\n * Poll the workflow run status and node states.\n * Replaces the broken WebSocket subscriptions with periodic GraphQL queries.\n */\n const pollRunUpdates = useCallback(\n (runId: string) => {\n const client = getFluidGridsClient();\n pollStartRef.current = Date.now();\n activeRunIdRef.current = runId;\n\n const doPoll = async () => {\n // Discard this response if a newer execution has started or we've been cleaned up\n if (activeRunIdRef.current !== runId) {\n return;\n }\n\n try {\n const result = await client.query<WorkflowRunQuery>({\n query: WORKFLOW_RUN,\n variables: { id: runId },\n fetchPolicy: \"network-only\",\n });\n\n // Check again after the async fetch in case cleanup ran while waiting\n if (activeRunIdRef.current !== runId) {\n return;\n }\n\n const run = result.data?.workflowRun;\n if (!run) {\n console.warn(\n \"[useNodeExecution] Poll returned no run data for\",\n runId,\n );\n // Run might not be created yet in DB — keep polling for up to MAX_RUN_CREATION_WAIT\n if (Date.now() - pollStartRef.current < MAX_RUN_CREATION_WAIT) {\n pollTimerRef.current = setTimeout(doPoll, POLL_INTERVAL);\n } else {\n console.warn(\n \"[useNodeExecution] Run data not found after timeout for\",\n runId,\n );\n // Run was never found — reset execution state so UI isn't permanently locked\n completeExecution();\n cleanup();\n }\n return;\n }\n\n // Process node states → create/update logs & visual statuses\n if (run.nodeStates?.length) {\n processNodeStates(runId, run.nodeStates);\n }\n\n // Check if run is in a terminal state\n if (TERMINAL_STATUSES.has(run.status)) {\n completeExecution();\n cleanup();\n return;\n }\n\n // Continue polling indefinitely until the backend signals completion.\n // Long-running workflows (waits, large ingestion, inference) can exceed\n // arbitrary timeouts — only the terminal status should stop polling.\n pollTimerRef.current = setTimeout(doPoll, POLL_INTERVAL);\n } catch (error) {\n console.error(\"[useNodeExecution] Poll error:\", error);\n if (activeRunIdRef.current !== runId) {\n return;\n }\n // Retry transient errors with back-off\n pollTimerRef.current = setTimeout(doPoll, POLL_INTERVAL * 2);\n }\n };\n\n // Start first poll after a short delay (give backend time to create the run)\n pollTimerRef.current = setTimeout(doPoll, 800);\n },\n [processNodeStates, completeExecution, cleanup],\n );\n\n /**\n * Execute workflow up to the specified node (step-by-step execution)\n */\n const executeNode = useCallback(\n async (stopAtNodeId: string) => {\n const triggerNode = findTriggerNode();\n if (!triggerNode) {\n console.error(\"[useNodeExecution] No trigger node found in workflow\");\n return { success: false, error: \"No trigger node found\" };\n }\n cleanup();\n clearLogs();\n\n const workflowKey = workflow.workflowKey || workflow.id;\n const version = workflow.version || \"1.0.0\";\n\n if (!workflowKey) {\n console.error(\n \"[useNodeExecution] Workflow must be saved before execution. No workflowKey found.\",\n );\n return {\n success: false,\n error: \"Workflow must be saved before execution\",\n };\n }\n\n setNodeStatus(stopAtNodeId, \"running\");\n\n try {\n const client = getFluidGridsClient();\n const result = await client.mutate<TriggerWorkflowResponse>({\n mutation: TRIGGER_WORKFLOW,\n variables: {\n input: {\n workflowKey,\n version,\n triggerNodeId: triggerNode.id,\n triggerData: {},\n context: {},\n stopAtNodeId,\n },\n },\n });\n const triggerResult = result.data?.triggerWorkflow;\n if (triggerResult) {\n const backendRunId = triggerResult.runId;\n startExecution(stopAtNodeId, backendRunId);\n\n // Create initial log entry\n const initialLog: ExecutionLog = {\n id: `${backendRunId}-${stopAtNodeId}`,\n runId: backendRunId,\n nodeId: stopAtNodeId,\n nodeType:\n workflow.nodes.find((n) => n.id === stopAtNodeId)?.type ||\n \"unknown\",\n nodeName: getNodeName(stopAtNodeId),\n status: \"running\",\n inputArgs: null,\n output: null,\n error: null,\n duration: null,\n startTime: new Date().toISOString(),\n endTime: null,\n };\n addLog(initialLog);\n\n // Start polling for real-time updates\n pollRunUpdates(backendRunId);\n return { success: true, runId: backendRunId };\n }\n\n console.error(\"[useNodeExecution] No result from trigger\");\n setNodeStatus(stopAtNodeId, \"error\");\n return { success: false, error: \"No result from trigger\" };\n } catch (error) {\n console.error(\"[useNodeExecution] Error triggering workflow:\", error);\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n\n const errorRunId = nanoid();\n const errorLog: ExecutionLog = {\n id: `${errorRunId}-${stopAtNodeId}`,\n runId: errorRunId,\n nodeId: stopAtNodeId,\n nodeType:\n workflow.nodes.find((n) => n.id === stopAtNodeId)?.type ||\n \"unknown\",\n nodeName: getNodeName(stopAtNodeId),\n status: \"failed\",\n inputArgs: null,\n output: null,\n error: errorMessage,\n duration: null,\n startTime: new Date().toISOString(),\n endTime: new Date().toISOString(),\n };\n addLog(errorLog);\n setNodeStatus(stopAtNodeId, \"error\");\n completeExecution();\n\n return { success: false, error: errorMessage };\n }\n },\n [\n findTriggerNode,\n cleanup,\n clearLogs,\n startExecution,\n workflow,\n getNodeName,\n addLog,\n setNodeStatus,\n pollRunUpdates,\n completeExecution,\n ],\n );\n\n /**\n * Execute the full workflow without stopping at any node\n * This runs the entire workflow from start to end\n */\n const executeFullWorkflow = useCallback(\n async (customTriggerData?: Record<string, unknown>) => {\n const triggerNode = findTriggerNode();\n if (!triggerNode) {\n console.error(\"[useNodeExecution] No trigger node found in workflow\");\n return { success: false, error: \"No trigger node found\" };\n }\n cleanup();\n clearLogs();\n\n const workflowKey = workflow.workflowKey || workflow.id;\n const version = workflow.version || \"1.0.0\";\n\n if (!workflowKey) {\n console.error(\n \"[useNodeExecution] Workflow must be saved before execution. No workflowKey found.\",\n );\n return {\n success: false,\n error: \"Workflow must be saved before execution\",\n };\n }\n\n setNodeStatus(triggerNode.id, \"running\");\n\n try {\n const client = getFluidGridsClient();\n const result = await client.mutate<TriggerWorkflowResponse>({\n mutation: TRIGGER_WORKFLOW,\n variables: {\n input: {\n workflowKey,\n version,\n triggerNodeId: triggerNode.id,\n triggerData: customTriggerData || {},\n context: {},\n },\n },\n });\n const triggerResult = result.data?.triggerWorkflow;\n if (triggerResult) {\n const backendRunId = triggerResult.runId;\n startExecution(triggerNode.id, backendRunId);\n\n // Start polling for real-time updates\n pollRunUpdates(backendRunId);\n return { success: true, runId: backendRunId };\n }\n\n console.error(\"[useNodeExecution] No result from trigger\");\n setNodeStatus(triggerNode.id, \"error\");\n return { success: false, error: \"No result from trigger\" };\n } catch (error) {\n console.error(\"[useNodeExecution] Error triggering workflow:\", error);\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n\n const errorRunId = nanoid();\n const errorLog: ExecutionLog = {\n id: `${errorRunId}-${triggerNode.id}`,\n runId: errorRunId,\n nodeId: triggerNode.id,\n nodeType: triggerNode.type || \"unknown\",\n nodeName: getNodeName(triggerNode.id),\n status: \"failed\",\n inputArgs: null,\n output: null,\n error: errorMessage,\n duration: null,\n startTime: new Date().toISOString(),\n endTime: new Date().toISOString(),\n };\n addLog(errorLog);\n setNodeStatus(triggerNode.id, \"error\");\n completeExecution();\n\n return { success: false, error: errorMessage };\n }\n },\n [\n findTriggerNode,\n cleanup,\n clearLogs,\n startExecution,\n workflow,\n getNodeName,\n addLog,\n setNodeStatus,\n pollRunUpdates,\n completeExecution,\n ],\n );\n\n // Clean up the polling timer and reset execution state when the component unmounts\n useEffect(() => {\n return () => {\n if (pollTimerRef.current) {\n completeExecution();\n }\n cleanup();\n };\n }, [cleanup, completeExecution]);\n\n return {\n executeNode,\n executeFullWorkflow,\n cleanup,\n findTriggerNode,\n };\n}\n","import {\n Handle,\n type Node,\n type NodeProps,\n Position,\n useReactFlow,\n useStore,\n getConnectedEdges,\n} from \"@xyflow/react\";\nimport { memo, useCallback, useEffect, useMemo } from \"react\";\nimport {\n BaseNodeData,\n ExtendedNodeType,\n type NodeAdapter,\n type AdapterFilter,\n type ChannelNodeData,\n} from \"../../types\";\n\nimport { getNodeDetail } from \"../../utils\";\nimport { useFlowStore } from \"../../../../../../stores/flow-store\";\nimport { useDeleteNode } from \"../../../../../../hooks/use-delete-node\";\nimport CustomHandle from \"../../../handles/custom-handler\";\nimport { LogicNodeCard } from \"./logic-node-card\";\nimport {\n InputHandles,\n OutputHandles,\n outputHandlesSpacerHeight,\n resolveInputHandles,\n resolveOutputHandles,\n} from \"./output-handles\";\nimport NodePropertyPanel from \"../../sidebar/panels/node-properties/property-panels/property-panel\";\nimport { useShallow } from \"zustand/shallow\";\nimport { NodeCard, NodeCardBody, NodeCardHeader } from \"../../../ui/node-card\";\nimport { NodeInfoButtonWithModal } from \"../../../ui/NodeInfoButtonWithModal\";\nimport { useNodeExecution } from \"../../../../../../../hooks/useNodeExecution\";\nimport { NODE_CONFIGS } from \"../../index\";\n\ninterface AdaptiveCardDefaultValue {\n [key: string]: unknown;\n}\n\ninterface AdaptiveCard {\n defaultValue?: AdaptiveCardDefaultValue;\n}\n\nexport interface NodeOperation {\n name: string;\n type: string;\n adaptive_card?: AdaptiveCard;\n /** When true, this operation is auto-selected when the node is used as a sub-node adapter */\n isAdapterOperation?: boolean;\n}\n\ninterface NodeDataInfo {\n nodeAdapters?: NodeAdapter[];\n /** When true, this node can be connected to adapter ports on parent nodes */\n supportsAdapterMode?: boolean;\n /** The adapter type this node satisfies when used as a sub-node */\n adapterOutputType?: string;\n /** Kind tags for this node (used for adapter filtering) */\n kind?: string[];\n}\n\ninterface NodeDefaultData {\n version?: string;\n nodeData?: NodeDataInfo;\n args?: {\n state?: Record<string, unknown>;\n context?: Record<string, unknown>;\n };\n}\n\nexport interface NodeMetadataValue {\n type?: string;\n operations?: NodeOperation[];\n defaultData?: NodeDefaultData;\n}\n\nexport interface TextMessageNodeData extends BaseNodeData {\n operation: string;\n operation_name?: string;\n operation_type?: string;\n nodeData?: NodeDataInfo;\n /** Whether this node instance is being used as an adapter sub-node */\n isAdapterInstance?: boolean;\n args?: {\n state?: Record<string, unknown>;\n context?: Record<string, unknown>;\n };\n}\n\n/**\n * Check if a sub-node is compatible with an adapter port's filter.\n * Returns true if the sub-node can connect to the adapter.\n */\nfunction isAdapterCompatible(\n adapterFilter: AdapterFilter | undefined,\n adapterType: string | undefined,\n targetNodeKind: string[] | undefined,\n targetAdapterOutputType: string | undefined,\n targetNodeType: string | undefined,\n): boolean {\n // If adapter has a type, target must declare a matching adapterOutputType\n if (\n adapterType &&\n targetAdapterOutputType &&\n adapterType !== targetAdapterOutputType\n ) {\n return false;\n }\n\n // Check kind filter - target must have ALL required kind values\n if (adapterFilter?.kind && adapterFilter.kind.length > 0) {\n if (\n !targetNodeKind ||\n !adapterFilter.kind.every((k) => targetNodeKind.includes(k))\n ) {\n return false;\n }\n }\n\n // Check exclusion list\n if (adapterFilter?.excludeNodes && targetNodeType) {\n if (adapterFilter.excludeNodes.includes(targetNodeType)) {\n return false;\n }\n }\n\n return true;\n}\n\ntype TextMessageNodeProps = NodeProps<Node<TextMessageNodeData, string>>;\n\n/**\n * AdapterConnectors — renders the diamond-shaped adapter ports below a node.\n * Each adapter port supports typed connections, maxConnections enforcement,\n * and compatibility filtering via the adapter's `filter` config.\n */\nfunction AdapterConnectors({\n nodeId,\n adapters,\n}: {\n nodeId: string;\n adapters?: NodeAdapter[];\n}) {\n const { nodeLookup, edges } = useStore(({ nodeLookup, edges }) => ({\n nodeLookup,\n edges,\n }));\n const { getNode } = useReactFlow();\n\n if (!adapters || adapters.length === 0) return null;\n\n return (\n <div className=\"left-0 w-full flex justify-around mt-[6.5px]\">\n {adapters.map((adapter: NodeAdapter) => {\n // Count existing connections for this adapter handle\n const adapterEdges = edges.filter(\n (e) => e.source === nodeId && e.sourceHandle === adapter.name,\n );\n const connectionCount = adapterEdges.length;\n const isAtMaxConnections =\n adapter.maxConnections != null &&\n adapter.maxConnections !== undefined &&\n connectionCount >= adapter.maxConnections;\n\n // Determine visual state\n const hasConnection = connectionCount > 0;\n const diamondColor = hasConnection ? \"bg-accent\" : \"bg-accent/60\";\n const lineColor = hasConnection\n ? \"before:bg-accent\"\n : \"before:bg-accent/60\";\n\n return (\n <div className=\"relative\" key={adapter.name}>\n <div\n className={`p-0.5 m-0.5 text-center before:content-[''] before:h-[95%] before:-z-10 before:left-1/2 before:-translate-x-1/2 before:w-0.5 ${lineColor} before:absolute before:top-0`}\n >\n {/* Diamond at the top */}\n <div className=\"absolute -top-3 left-1/2 transform -translate-x-1/2\">\n <div\n className={`w-2.5 h-2.5 ${diamondColor} rotate-45 transition-transform hover:scale-110`}\n ></div>\n </div>\n\n {/* Title with asterisk for required + adapter type badge */}\n <div className=\"mt-3 z-10 absolute left-1/2 transform -translate-x-1/2 text-accent font-medium bg-surface h-fit\">\n <span className=\"text-xs max-w-fit relative font-medium text-accent whitespace-nowrap\">\n {adapter?.name}\n {adapter?.required && (\n <span className=\"text-[var(--color-status-error-text)] absolute -right-2 top-[1px]\">\n *\n </span>\n )}\n </span>\n </div>\n\n {/* Plus button and React Flow Handle */}\n <div className=\"mt-16 flex justify-center\">\n {!isAtMaxConnections && (\n <div className=\"w-5 h-5 border-2 border-accent/60 rounded text-accent text-2xl font-bold bg-surface flex items-center justify-center transition-colors hover:bg-accent/10 cursor-pointer\">\n +\n </div>\n )}\n {isAtMaxConnections && (\n <div className=\"w-5 h-5 border-2 border-accent/30 rounded text-accent/30 text-2xl font-bold bg-surface flex items-center justify-center\">\n &bull;\n </div>\n )}\n <Handle\n type=\"source\"\n position={Position.Bottom}\n id={adapter?.name}\n className=\"mb-[15px] text-accent bg-accent\"\n isConnectable={!isAtMaxConnections}\n isValidConnection={(connection) => {\n // Validate that the target node is compatible with this adapter\n if (!adapter.type && !adapter.filter) return true;\n const targetNode = getNode(connection.target);\n if (!targetNode) return true;\n const targetData = targetNode.data as TextMessageNodeData;\n const targetNodeData = targetData?.nodeData;\n return isAdapterCompatible(\n adapter.filter,\n adapter.type,\n targetNodeData?.kind,\n targetNodeData?.adapterOutputType,\n targetNode.type,\n );\n }}\n />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/**\n * SubNodeComponent — renders a compact circular node for sub-nodes\n * when they are used as adapter connections (e.g., \"OpenAI Chat Model\" connected to Agent).\n * Sub-nodes also support their own credential adapter diamonds.\n */\nfunction SubNodeComponent({\n id,\n isConnectable,\n selected,\n data,\n nodeType,\n}: TextMessageNodeProps & { nodeType?: string }) {\n const meta = useMemo(() => getNodeDetail(nodeType), [nodeType]);\n const deleteNode = useDeleteNode();\n const [showNodePropertiesOf] = useFlowStore(\n useShallow((s) => [s.actions.sidebar.showNodePropertiesOf]),\n );\n const [nodeStatuses] = useFlowStore(\n useShallow((s) => [s.execution.nodeStatuses]),\n );\n\n const nodeStatus = nodeStatuses[id] || \"idle\";\n const statusRing =\n nodeStatus === \"success\"\n ? \"ring-2 ring-green-500\"\n : nodeStatus === \"error\"\n ? \"ring-2 ring-red-500\"\n : nodeStatus === \"running\"\n ? \"ring-2 ring-blue-500 animate-pulse\"\n : \"\";\n\n const handleShowNodeProperties = useCallback(() => {\n showNodePropertiesOf({ id, type: nodeType as ExtendedNodeType });\n }, [id, nodeType, showNodePropertiesOf]);\n\n return (\n <div className=\"flex flex-col items-center\">\n {/* Target handle at top - connects up to parent adapter diamond */}\n <Handle\n type=\"target\"\n position={Position.Top}\n id=\"target\"\n isConnectable={isConnectable}\n className=\"size-2.5 bg-accent border-2 border-accent/60\"\n />\n\n {/* Dashed line from handle to circle */}\n <div className=\"w-0.5 h-4 border-l-2 border-dashed border-accent/40\"></div>\n\n {/* Label above the circle */}\n <span className=\"text-[10px] text-accent/70 font-medium mb-1\">\n {meta.title.includes(\"Model\")\n ? \"Model\"\n : meta.title.includes(\"Memory\")\n ? \"Memory\"\n : meta.title.includes(\"Tool\")\n ? \"Tool\"\n : meta.title.includes(\"Parser\")\n ? \"Parser\"\n : \"Adapter\"}\n </span>\n\n {/* Circular node body */}\n <div\n className={`w-14 h-14 rounded-full bg-card border-2 border-accent/40 flex items-center justify-center shadow-lg cursor-pointer transition-all hover:border-accent/80 hover:shadow-xl ${statusRing}`}\n onDoubleClick={handleShowNodeProperties}\n data-selected={selected}\n >\n <img\n src={`https://api.iconify.design/${meta.icon.replace(\":\", \"/\")}.svg`}\n alt={meta.title}\n className=\"w-7 h-7 opacity-80\"\n />\n </div>\n\n {/* Title below */}\n <span className=\"mt-1.5 text-xs text-accent font-medium text-center max-w-24 leading-tight\">\n {meta.title}\n </span>\n\n {/* Delete button */}\n <button\n onClick={() => deleteNode(id)}\n className=\"absolute -top-1 -right-1 w-4 h-4 rounded-full bg-destructive/80 text-destructive-foreground text-[10px] flex items-center justify-center opacity-0 group-hover:opacity-100 hover:bg-destructive transition-opacity\"\n >\n &times;\n </button>\n\n {/* Sub-node's own credential adapter diamonds (if any) */}\n <AdapterConnectors nodeId={id} adapters={data?.nodeData?.nodeAdapters} />\n </div>\n );\n}\n\n// export const metadata: RegisterNodeMetadata<TextMessageNodeData> = {\n// type: NODE_TYPE,\n// node: memo(NodeComponent),\n// detail: {\n// icon: \"mynaui:message-solid\",\n// title: \"Gmail\",\n// description:\n// \"Send a text message to the user using different messaging platforms like WhatsApp, Messenger, etc.\",\n// },\n// connection: {\n// inputs: 1,\n// outputs: 1,\n// },\n// defaultData: {\n// message: \"\",\n// },\n// propertyPanel: TextMessageNodePropertyPanel,\n// };\n\nexport const getNodeMetadata = (value: NodeMetadataValue) => {\n function NodeComponent(props: TextMessageNodeProps) {\n const { id, isConnectable, selected, data } = props;\n\n // Detect if this node is an adapter sub-node by checking incoming edges.\n // A node is an adapter sub-node if:\n // - It has `data.isAdapterInstance` set explicitly, OR\n // - An incoming edge's sourceHandle matches an adapter name on the source node\n const { edges, nodeLookup } = useStore(({ edges, nodeLookup }) => ({\n edges,\n nodeLookup,\n }));\n\n const isAdapterSubNode = useMemo(() => {\n if (data?.isAdapterInstance) return true;\n\n // Check if any incoming edge is an adapter edge\n const incomingEdges = edges.filter((e) => e.target === id);\n for (const edge of incomingEdges) {\n if (!edge.sourceHandle || edge.sourceHandle === \"source\") continue;\n // Look up the source node's adapter names from NODE_CONFIGS\n const sourceNode = nodeLookup.get(edge.source);\n if (!sourceNode) continue;\n const sourceNodeData = sourceNode.data as\n | TextMessageNodeData\n | undefined;\n const sourceAdapters = sourceNodeData?.nodeData?.nodeAdapters;\n if (sourceAdapters && Array.isArray(sourceAdapters)) {\n const adapterNames = sourceAdapters.map((a: NodeAdapter) => a.name);\n if (adapterNames.includes(edge.sourceHandle)) {\n return true;\n }\n }\n }\n return false;\n }, [data?.isAdapterInstance, edges, id, nodeLookup]);\n\n // All hooks must be called before any conditional returns\n const nodeType = value?.type;\n const meta = useMemo(() => getNodeDetail(nodeType), [nodeType]);\n const { setNodes } = useReactFlow();\n const [\n showNodePropertiesOf,\n isExecuting,\n executingNodeId,\n nodeStatuses,\n nodeItemCounts,\n zustandSetNodes,\n ] = useFlowStore(\n useShallow((s) => [\n s.actions.sidebar.showNodePropertiesOf,\n s.execution.isExecuting,\n s.execution.executingNodeId,\n s.execution.nodeStatuses,\n s.execution.nodeItemCounts,\n s.actions.nodes.setNodes,\n ]),\n );\n\n // Auto-persist operation_name for integration/channel nodes even when the property\n // panel has never been opened. Mirrors the same logic in ChannelNodePropertyPanel so\n // validation and execution always see a correct operation_name regardless of whether\n // the user has interacted with the sidebar panel.\n useEffect(() => {\n if (nodeType !== \"integration/channel\") return;\n const nodeData = data as ChannelNodeData | undefined;\n const explicitRole = nodeData?.args?.state?.role;\n const hasIncomingEdge = edges.some((e) => e.target === id);\n const isAction =\n explicitRole === \"action\" || (!explicitRole && hasIncomingEdge);\n const expectedOp = isAction\n ? \"sendChannelMessage\"\n : \"onChannelMessageReceived\";\n if (nodeData?.operation_name === expectedOp) return;\n setNodes((nds) => {\n const updated = nds.map((n) =>\n n.id === id\n ? { ...n, data: { ...n.data, operation_name: expectedOp } }\n : n,\n );\n zustandSetNodes(updated);\n return updated;\n });\n }, [nodeType, id, edges, data, setNodes, zustandSetNodes]);\n\n const { executeNode } = useNodeExecution();\n\n const deleteNode = useDeleteNode();\n\n const handleDeleteNode = () => {\n deleteNode(id);\n };\n\n const openNdv = useFlowStore((s) => s.actions.ndv.open);\n\n const handleShowNodeProperties = useCallback(() => {\n showNodePropertiesOf({ id, type: value?.type as ExtendedNodeType });\n }, [id, showNodePropertiesOf]);\n\n const handleOpenNdv = useCallback(() => {\n openNdv({ nodeId: id, type: value?.type as ExtendedNodeType });\n }, [id, openNdv]);\n\n const handleExecuteStep = useCallback(() => {\n executeNode(id)\n .then((_result) => {})\n .catch((error) => {\n console.error(\"[NodeComponent] Execute error:\", error);\n });\n }, [executeNode, id]);\n\n // If this node is being used as an adapter sub-node, render the compact circular version\n if (isAdapterSubNode) {\n return <SubNodeComponent {...props} nodeType={value?.type} />;\n }\n\n // Determine execution status for this node\n const isThisNodeExecuting = isExecuting && executingNodeId === id;\n const nodeStatus = nodeStatuses[id] || \"idle\";\n const executionStatus =\n nodeStatus === \"success\"\n ? \"success\"\n : nodeStatus === \"error\"\n ? \"error\"\n : nodeStatus === \"running\"\n ? \"running\"\n : \"idle\";\n const itemCount = nodeItemCounts[id];\n\n // ---- Derived display values for the node card ----\n // Trigger vs action drives the badge, the entry lightning badge, and the\n // idle footer status (\"Listening\" vs \"Ready\").\n const nodeKinds = (data?.nodeData as { kind?: string[] } | undefined)?.kind;\n const pinnedOpType = (data?.operation_type || \"\").toLowerCase();\n const isTrigger =\n pinnedOpType === \"trigger\" ||\n (value?.type || \"\").toLowerCase().includes(\"trigger\") ||\n // Kind-based detection only when NO operation is pinned: dual-role\n // nodes (e.g. Gmail: trigger kind + action operations) must follow\n // their pinned operation's role, not the manifest kind.\n (Array.isArray(nodeKinds) &&\n nodeKinds.includes(\"trigger\") &&\n pinnedOpType === \"\");\n\n // Short provider label (e.g. GMAIL, API, SLACK) from the node title.\n const appName = (meta.title || nodeType || \"Node\")\n .split(/\\s+/)[0]\n .toUpperCase();\n\n // Which operation this node is pinned to. Channel / conversation nodes\n // derive it from their role; everything else uses operation_name (chosen in\n // the Node Store — no in-card dropdown).\n const operationDisplay =\n nodeType === \"integration/channel\"\n ? (() => {\n const explicitRole = (data as ChannelNodeData).args?.state?.role;\n const isAction =\n explicitRole === \"action\" ||\n (!explicitRole && edges.some((e) => e.target === id));\n return isAction ? \"sendChannelMessage\" : \"onChannelMessageReceived\";\n })()\n : nodeType === \"store/conversation\"\n ? \"storeAndForward\"\n : data?.operation_name || \"Not configured\";\n\n const nodeDescription =\n (data?.nodeData as { description?: string } | undefined)?.description ||\n meta?.description ||\n \"\";\n\n // Role accent for the top border strip + focus ring: triggers are green,\n // control-flow nodes amber, everything else (actions) blue.\n const isLogicNode =\n /(^|[:/])(if|switch|merge|loop|filter|branch|router|condition|aggregate)/.test(\n (value?.type || \"\").toLowerCase(),\n );\n const roleAccent = isTrigger\n ? \"#10b981\"\n : isLogicNode\n ? \"#f59e0b\"\n : \"#3b82f6\";\n\n // Output handles from the manifest spec (n8n-style labeled ports for\n // routing nodes: IF true/false, Switch cases, Loop loop/done, …).\n const outputHandles = resolveOutputHandles(\n data as Record<string, unknown> | undefined,\n );\n const inputHandles = resolveInputHandles(\n data as Record<string, unknown> | undefined,\n );\n const handleSpacer = outputHandlesSpacerHeight(\n Math.max(outputHandles.length, inputHandles.length),\n );\n\n // Internal control-flow nodes render as the compact n8n-style logic card\n // (icon + name + labeled outputs) instead of the rich app card.\n const manifestKind = (data?.nodeData as { kind?: string[] } | undefined)\n ?.kind;\n const isControlFlowNode =\n (value?.type || \"\").startsWith(\"internal:\") &&\n (Array.isArray(manifestKind)\n ? manifestKind.includes(\"control\")\n : isLogicNode);\n if (isControlFlowNode) {\n // Short config summary shown under the title (e.g. merge mode, rule\n // count) — mirrors how n8n hints at the node's setup on the canvas.\n const argsState = (\n data as { args?: { state?: Record<string, unknown> } } | undefined\n )?.args?.state;\n const rules = argsState?.rules;\n const mode = argsState?.mode;\n const logicSubtitle = Array.isArray(rules)\n ? `${rules.length} rule${rules.length === 1 ? \"\" : \"s\"}`\n : typeof mode === \"string\"\n ? mode\n : undefined;\n\n return (\n <div>\n <LogicNodeCard\n nodeId={id}\n title={(data?.label as string) || meta.title}\n subtitle={logicSubtitle}\n icon={meta.icon}\n accent={roleAccent}\n selected={!!selected}\n executionStatus={executionStatus}\n itemCount={itemCount}\n isTrigger={isTrigger}\n isExecuting={isThisNodeExecuting}\n inputHandles={inputHandles}\n outputHandles={outputHandles}\n isConnectable={\n typeof isConnectable === \"boolean\" ? isConnectable : undefined\n }\n onDoubleClick={handleOpenNdv}\n onSettings={handleShowNodeProperties}\n onExecute={handleExecuteStep}\n onDelete={handleDeleteNode}\n infoButton={\n <NodeInfoButtonWithModal\n metadata={{\n icon: meta.icon,\n title: meta.title,\n description: nodeDescription,\n gradientColor: meta.gradientColor,\n }}\n />\n }\n />\n <AdapterConnectors\n nodeId={id}\n adapters={data?.nodeData?.nodeAdapters}\n />\n </div>\n );\n }\n\n return (\n <div>\n <NodeCard\n data-selected={selected}\n selected={selected}\n onDoubleClick={handleOpenNdv}\n executionStatus={executionStatus}\n itemCount={itemCount}\n isTrigger={isTrigger}\n accent={roleAccent}\n isExecuting={isThisNodeExecuting}\n onSettings={handleShowNodeProperties}\n onExecute={handleExecuteStep}\n onDelete={handleDeleteNode}\n infoButton={\n <NodeInfoButtonWithModal\n metadata={{\n icon: meta.icon,\n title: meta.title,\n description: nodeDescription,\n gradientColor: meta.gradientColor,\n }}\n />\n }\n >\n <NodeCardHeader\n icon={meta.icon}\n appName={appName}\n accentKey={value?.type || meta.title}\n />\n\n {(operationDisplay === \"execute\" &&\n (value?.type || \"\").startsWith(\"internal:\")) ||\n isTrigger ? (\n // Internal single-op nodes ('execute') and triggers: the operation\n // name is an implementation detail, not a user choice — show only\n // the description (n8n-style).\n <div className=\"rounded-b-xl border-t border-border/60 px-3 pb-3 pt-2.5\">\n <p className=\"line-clamp-2 text-xs leading-snug text-muted-foreground\">\n {nodeDescription}\n </p>\n </div>\n ) : (\n <NodeCardBody\n operationName={operationDisplay}\n description={nodeDescription}\n />\n )}\n\n {/* Spacer so cards with many outputs (Switch cases) don't crowd */}\n {handleSpacer > 0 && <div style={{ height: handleSpacer }} />}\n\n {/* n8n: triggers start the flow — they have no input handle. */}\n {!isTrigger && (\n <InputHandles\n nodeId={id}\n handles={inputHandles}\n accent={roleAccent}\n isConnectable={\n typeof isConnectable === \"boolean\" ? isConnectable : undefined\n }\n />\n )}\n\n <OutputHandles\n nodeId={id}\n handles={outputHandles}\n accent={roleAccent}\n isConnectable={\n typeof isConnectable === \"boolean\" ? isConnectable : undefined\n }\n />\n </NodeCard>\n {/* ====== ADAPTER DIAMOND CONNECTORS (below node) ====== */}\n <AdapterConnectors\n nodeId={id}\n adapters={data?.nodeData?.nodeAdapters}\n />\n </div>\n );\n }\n\n return {\n type: value?.type,\n node: memo(NodeComponent),\n detail: {\n icon: \"mynaui:message-solid\",\n title: \"Gmail\",\n description:\n \"Send a text message to the user using different messaging platforms like WhatsApp, Messenger, etc.\",\n },\n connection: {\n inputs: 1,\n outputs: 1,\n },\n defaultData: {\n operation_name: \"\",\n operation_type: \"\",\n version: value.defaultData?.version,\n nodeData: value.defaultData?.nodeData,\n args: value.defaultData?.args,\n },\n propertyPanel: NodePropertyPanel,\n };\n};\n","import { ExtendedNodeType, RegisterNodeMetadata } from \"./types\";\n\nimport {\n getNodeMetadata,\n NodeMetadataValue,\n type NodeOperation,\n} from \"./nodes/node/node\";\nimport {\n getFluidGridsClient,\n waitForFluidGridsClient,\n} from \"../../../../../graphql/client\";\nimport {\n NodeEndpointConfigsDocument,\n NodeManifestDocument,\n} from \"../../../../../generated/operations\";\nimport {\n GetMyNodeInstallationsDocument,\n type GetMyNodeInstallationsQuery,\n type GetMyNodeInstallationsQueryVariables,\n} from \"../../../../../generated/global-operations\";\nimport { getGlobalStoreClient } from \"../../../../../graphql/global-client\";\nimport { getFluidGridsConfig } from \"../../../../../config\";\n\nconst NODE_ENDPOINT_CONFIGS = NodeEndpointConfigsDocument;\nconst NODE_MANIFEST = NodeManifestDocument;\n\ninterface NodeConfig {\n type: string;\n detail: {\n icon: string;\n title: string;\n description?: string;\n gradientColor: string;\n };\n defaultData: {\n operation_name: string;\n operation_type: string;\n nodeData: NodeManifest;\n version: string;\n args: {\n context: {\n node: {\n id: string;\n kind?: string[];\n type: string;\n };\n };\n state: Record<string, unknown>;\n credentials: unknown[];\n };\n };\n operations: unknown[] | undefined;\n publishType?: \"BUILTIN\" | \"STORE\" | \"CUSTOM\"; // Track node source\n}\n\nexport const NODE_CONFIGS: NodeConfig[] = [];\n\ninterface NodeEndpointConfig {\n id: string;\n nodeType: string;\n nodeVersion: string;\n publishType?: \"BUILTIN\" | \"STORE\" | \"CUSTOM\";\n name: string;\n description?: string;\n icon?: string;\n category?: string;\n kind: string[];\n operations: unknown;\n}\n\ninterface NodeManifest {\n nodeType: string; // camelCase from GraphQL\n name: string;\n description?: string;\n kind?: string[];\n version: string;\n operations?: { operations?: unknown[] } | unknown[];\n icon?: string;\n nodeAdapters?: unknown;\n supportsAdapterMode?: boolean;\n adapterOutputType?: string;\n}\n\n/**\n * Fetch node manifest using GraphQL\n */\nexport async function fetchNodeManifest(\n nodeType: string,\n nodeVersion: string,\n): Promise<NodeManifest | null> {\n try {\n const client = getFluidGridsClient(); // Throws if not initialized — callers should be post-mount\n const { data } = await client.query<{\n nodeManifest: NodeManifest | null;\n }>({\n query: NODE_MANIFEST,\n variables: { nodeType, version: nodeVersion },\n });\n return data?.nodeManifest ?? null;\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\n `Error fetching manifest for ${nodeType} v${nodeVersion}:`,\n message,\n );\n return null;\n }\n}\n\n/**\n * Push a store node manifest entry into NODE_CONFIGS if not already present.\n * Used for both BUILTIN-registered store nodes and user-installed store nodes\n * whose manifest comes from the StoreAppInstallation record.\n */\nfunction pushStoreNodeConfig(\n manifest: NodeManifest,\n publishType: \"BUILTIN\" | \"STORE\" | \"CUSTOM\" = \"STORE\",\n): void {\n if (NODE_CONFIGS.some((c) => c.type === manifest.nodeType)) return;\n\n const manifestOps = manifest.operations as\n | { operations?: unknown[] }\n | unknown[]\n | undefined;\n const operations = Array.isArray(manifestOps)\n ? manifestOps\n : ((manifestOps as { operations?: unknown[] } | undefined)?.operations ??\n manifestOps);\n\n NODE_CONFIGS.push({\n type: manifest.nodeType,\n detail: {\n icon: manifest.icon || \"mynaui:keyboard-solid\",\n title: manifest.name,\n description: manifest.description,\n gradientColor: \"yellow\",\n },\n defaultData: {\n operation_name: \"\",\n operation_type: \"\",\n nodeData: manifest,\n version: manifest.version,\n args: {\n context: {\n node: {\n id: manifest.nodeType,\n kind: manifest.kind,\n type: manifest.nodeType,\n },\n },\n state: {},\n credentials: [],\n },\n },\n operations: operations as unknown[] | undefined,\n publishType,\n });\n}\n\n/**\n * Load installed store nodes from the global store client.\n * Uses the manifest stored in each StoreAppInstallation (recorded at install time)\n * so store-svc is the single source of truth — no zip download or workflow-svc\n * NodeEndpointConfig entry needed for store nodes.\n *\n * Silently no-ops if the global store client or workspaceId is not yet configured.\n */\nasync function loadInstalledStoreNodes(): Promise<void> {\n const globalClient = getGlobalStoreClient();\n if (!globalClient) return;\n\n const { workspaceId } = getFluidGridsConfig();\n if (!workspaceId) return;\n\n try {\n const { data } = await globalClient.query<\n GetMyNodeInstallationsQuery,\n GetMyNodeInstallationsQueryVariables\n >({\n query: GetMyNodeInstallationsDocument,\n variables: { workspaceId, limit: 200, offset: 0 },\n fetchPolicy: \"network-only\",\n });\n const installations = data?.myStoreAppInstallations?.items ?? [];\n let loaded = 0;\n\n for (const installation of installations) {\n if (installation.status !== \"ACTIVE\") continue;\n const manifest = installation.manifest as NodeManifest | null | undefined;\n if (!manifest?.nodeType) continue;\n\n pushStoreNodeConfig(manifest, \"STORE\");\n loaded++;\n }\n\n if (loaded > 0) {\n console.log(\n `[Workflows] Loaded ${loaded} installed store node(s) from workspace installations.`,\n );\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.warn(\"[Workflows] Could not load installed store nodes:\", message);\n }\n}\n\n/**\n * Fetch all nodes from GraphQL and populate NODE_CONFIGS.\n * Loads BUILTIN nodes from workflow-svc, then overlays installed store nodes\n * from the global store (using the manifest stored at install time).\n */\nasync function initializeNodeConfigs(): Promise<void> {\n try {\n // Wait for the shell's workspace Apollo client to be injected by WorkflowsProvider.\n // This runs at module-load time which can race with React mount lifecycle.\n const client = await waitForFluidGridsClient(15000, 150);\n if (!client) {\n console.warn(\n \"[Workflows] Apollo client not available after timeout — loading store nodes only.\",\n );\n await loadInstalledStoreNodes();\n return;\n }\n\n // Fetch all available node endpoint configurations\n const { data } = await client.query<{\n nodeEndpointConfigs: { configs: NodeEndpointConfig[] } | null;\n }>({\n query: NODE_ENDPOINT_CONFIGS,\n variables: {\n status: \"AVAILABLE\",\n pagination: { limit: 100 },\n },\n });\n\n const nodes: NodeEndpointConfig[] =\n data?.nodeEndpointConfigs?.configs ?? [];\n if (!Array.isArray(nodes) || nodes.length === 0) {\n console.warn(\"No nodes found or received data is not an array.\");\n // Still load installed store nodes even when BUILTIN nodes are unavailable\n // (the global store client uses a different gateway and may still be reachable).\n await loadInstalledStoreNodes();\n return;\n }\n\n // Fetch manifests for all nodes in parallel\n const manifestPromises = nodes.map(async (node) => {\n if (node?.nodeType && node?.nodeVersion) {\n try {\n return await fetchNodeManifest(node.nodeType, node.nodeVersion);\n } catch {\n console.error(\n `Failed to fetch manifest for node ${node.id} (${node.nodeType} v${node.nodeVersion})`,\n );\n return null;\n }\n } else {\n console.warn(\n `Node ${node?.id ?? \"unknown\"} is missing nodeType or nodeVersion. Skipping manifest fetch.`,\n );\n return null;\n }\n });\n\n const manifests = await Promise.all(manifestPromises);\n const successfulManifests = manifests.filter(\n (m): m is NodeManifest => m !== null,\n );\n // Populate NODE_CONFIGS with fetched manifests\n successfulManifests.forEach((manifest, index) => {\n const node = nodes[index];\n // Extract operations array from nested structure if needed\n const manifestOps = manifest.operations as\n | { operations?: unknown[] }\n | unknown[]\n | undefined;\n const operations = Array.isArray(manifestOps)\n ? manifestOps\n : ((manifestOps as { operations?: unknown[] } | undefined)\n ?.operations ?? manifestOps);\n\n NODE_CONFIGS.push({\n type: manifest.nodeType, // Use camelCase nodeType\n detail: {\n icon: manifest.icon || \"mynaui:keyboard-solid\",\n title: manifest.name,\n description: manifest.description,\n gradientColor: \"yellow\", // Default gradient for dynamic nodes\n },\n defaultData: {\n operation_name: \"\",\n operation_type: \"\",\n nodeData: manifest,\n version: manifest.version,\n args: {\n context: {\n node: {\n id: manifest.nodeType,\n kind: manifest.kind,\n type: manifest.nodeType,\n },\n },\n state: {},\n credentials: [],\n },\n },\n operations: operations as unknown[] | undefined,\n publishType: node.publishType, // Preserve publishType from GraphQL query\n });\n });\n\n // Load installed store nodes from global store (manifest stored at install time).\n // These overlay on top of BUILTIN nodes — any nodeType already in NODE_CONFIGS\n // (e.g. a vendored store node) is skipped; only genuinely missing ones are added.\n await loadInstalledStoreNodes();\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"Failed to fetch nodes or manifests:\", message);\n }\n}\n\n/**\n * Refetch all nodes by re-running initializeNodeConfigs.\n * Called after installing/uninstalling a store node.\n *\n * Resets the initialization guard and all derived arrays so\n * initializeNodeConfigs() runs a fresh fetch instead of returning early.\n */\nexport async function refetchStoreNodes(): Promise<void> {\n try {\n // Reset all state so initializeNodeConfigs() does a fresh fetch\n NODE_CONFIGS.length = 0;\n NODES.length = 0;\n AVAILABLE_NODES.length = 0;\n for (const key of Object.keys(NODE_TYPES)) delete NODE_TYPES[key];\n for (const key of Object.keys(NODES_METADATA))\n delete NODES_METADATA[key as ExtendedNodeType];\n\n // Reset the initialization guard so ensureNodeConfigsLoaded doesn't short-circuit\n isInitialized = false;\n initPromise = null;\n\n // Re-register the fallback dynamic node component\n const fallback = getNodeMetadata({ type: \"__default_dynamic__\" });\n if (fallback?.node) {\n NODE_TYPES[\"default\"] = fallback.node;\n }\n\n await initializeNodeConfigs();\n rebuildNodeArrays();\n } catch (error) {\n console.error(\"[Blocks] Failed to refetch nodes:\", error);\n }\n}\n\n// Type for node metadata entries (defined early for use in lazy init)\ntype NodeMetadataEntry = RegisterNodeMetadata & {\n __details: {\n type: RegisterNodeMetadata[\"type\"];\n } & RegisterNodeMetadata[\"detail\"];\n};\n\n// Forward declaration of mutable exports (will be populated below and by lazy init)\nexport const NODES: RegisterNodeMetadata[] = [];\nexport const NODE_TYPES: Record<string, RegisterNodeMetadata[\"node\"]> = {};\nexport const NODES_METADATA: Record<ExtendedNodeType, NodeMetadataEntry> =\n {} as Record<ExtendedNodeType, NodeMetadataEntry>;\n\ninterface AvailableNodeManifest {\n kind?: string[];\n nodeType?: string;\n name?: string;\n version?: string;\n description?: string;\n}\n\n// Mutable array for available nodes\nexport const AVAILABLE_NODES: {\n type: string;\n icon: string;\n title: string;\n description?: string;\n gradientColor: string;\n manifest: AvailableNodeManifest | undefined;\n publishType?: \"BUILTIN\" | \"STORE\" | \"CUSTOM\"; // Track node source\n}[] = [];\n\n// Lazy initialization - don't block module loading\nlet initPromise: Promise<void> | null = null;\nlet isInitialized = false;\n\n// Subscriber pattern: notify when NODE_TYPES is updated (for React re-render)\ntype NodeTypesListener = () => void;\nconst nodeTypesListeners: Set<NodeTypesListener> = new Set();\n\n/** Subscribe to NODE_TYPES updates. Returns unsubscribe function. */\nexport function onNodeTypesUpdate(listener: NodeTypesListener): () => void {\n nodeTypesListeners.add(listener);\n return () => nodeTypesListeners.delete(listener);\n}\n\nfunction notifyNodeTypesListeners(): void {\n nodeTypesListeners.forEach((listener) => listener());\n}\n\n/**\n * Ensure node configs are loaded. Safe to call multiple times.\n * Returns immediately if already initialized or initializing.\n */\nexport function ensureNodeConfigsLoaded(): Promise<void> {\n if (isInitialized) {\n return Promise.resolve();\n }\n if (!initPromise) {\n initPromise = initializeNodeConfigs().then(() => {\n // Only mark as truly initialized if we actually loaded some dynamic configs\n // If the Apollo client wasn't available, allow re-initialization later\n if (NODE_CONFIGS.length > 0) {\n isInitialized = true;\n } else {\n // Reset so a future call can retry once the Apollo client is available\n initPromise = null;\n }\n // Rebuild derived arrays after configs are loaded\n rebuildNodeArrays();\n });\n }\n return initPromise;\n}\n\n/**\n * Check if node configs have been initialized\n */\nexport function isNodeConfigsInitialized(): boolean {\n return isInitialized;\n}\n\n/**\n * Rebuild NODES and derived arrays after NODE_CONFIGS is populated.\n * This is called after lazy initialization completes.\n */\nfunction rebuildNodeArrays(): void {\n // Add nodes from NODE_CONFIGS\n NODE_CONFIGS.forEach((config: NodeConfig) => {\n const data = getNodeMetadata(config as NodeMetadataValue);\n const nodeMetadata = {\n ...data,\n detail: { ...config.detail },\n } as RegisterNodeMetadata;\n\n // Add only if type doesn't already exist\n if (!NODES.some((n) => n.type === nodeMetadata.type)) {\n NODES.push(nodeMetadata);\n\n // Also add to NODE_TYPES and NODES_METADATA\n NODE_TYPES[nodeMetadata.type] = nodeMetadata.node;\n NODES_METADATA[nodeMetadata.type as ExtendedNodeType] = {\n ...nodeMetadata,\n __details: { type: nodeMetadata.type, ...nodeMetadata.detail },\n };\n }\n });\n\n // Rebuild AVAILABLE_NODES\n const newAvailableNodes = NODES.filter(\n (node) => node.available === undefined || node.available,\n ).map((node) => {\n // Find the corresponding NODE_CONFIG to get publishType\n const nodeConfig = NODE_CONFIGS.find((config) => config.type === node.type);\n\n return {\n type: node.type,\n icon: node.detail.icon,\n title: node.detail.title,\n description: node.detail.description,\n gradientColor: node.detail.gradientColor ?? \"gray\",\n manifest: (\n node.defaultData as { nodeData?: AvailableNodeManifest } | undefined\n )?.nodeData as AvailableNodeManifest | undefined,\n publishType: nodeConfig?.publishType, // Include publishType\n };\n });\n // Update AVAILABLE_NODES in place\n AVAILABLE_NODES.length = 0;\n AVAILABLE_NODES.push(...newAvailableNodes);\n\n // Notify subscribers that NODE_TYPES has been updated\n notifyNodeTypesListeners();\n}\n\n// Start lazy initialization in the background (non-blocking)\n// This allows the module to load immediately while configs fetch asynchronously\nensureNodeConfigsLoaded().catch((err) => {\n console.warn(\n \"[Workflows] Background node config initialization failed:\",\n err,\n );\n});\n\n// Register a generic dynamic node component for any type not yet loaded.\n// This is used as a default fallback: when the workflow contains node types\n// that haven't been fetched yet, they get this component instead of React Flow's\n// empty default. When the real node config loads, it overwrites this entry.\nconst fallbackDynamic = getNodeMetadata({ type: \"__default_dynamic__\" });\nif (fallbackDynamic?.node) {\n NODE_TYPES[\"default\"] = fallbackDynamic.node;\n}\n\n/**\n * Pre-register node types from the workflow definition so React Flow never sees unknown types.\n * Called by FlowBuilderPage before hydrating the store.\n */\nexport function registerWorkflowNodeTypes(\n workflowNodes: { type?: string; data?: unknown }[],\n): void {\n for (const node of workflowNodes) {\n if (node.type && !NODE_TYPES[node.type]) {\n const meta = getNodeMetadata({\n type: node.type,\n defaultData: {\n version: (node.data as Record<string, unknown>)?.version as\n | string\n | undefined,\n nodeData: (node.data as Record<string, unknown>)?.nodeData as\n | Record<string, unknown>\n | undefined,\n },\n operations: (node.data as Record<string, unknown>)?.operations as\n | NodeOperation[]\n | undefined,\n });\n if (meta?.node) {\n NODE_TYPES[node.type] = meta.node;\n }\n }\n }\n}\n\n// All nodes are fetched from nodeEndpointConfigs (workflow-svc) via ensureNodeConfigsLoaded().\n// No hardcoded node imports — the workflow-svc auto-seeds all BUILTIN nodes on startup.\n","import { nanoid } from \"nanoid/non-secure\";\n\nimport type { Node } from \"@xyflow/react\";\nimport { BuilderNode, ExtendedNodeType } from \"./types\";\nimport { NODES } from \".\";\n\nexport function getNodeDetail(nodeType: ExtendedNodeType | undefined) {\n const node = NODES.find((node) => node.type === nodeType);\n if (!node) {\n // Return a default detail for dynamic nodes\n return {\n icon: \"mynaui:keyboard-solid\",\n title: nodeType ?? \"Unknown\",\n description: \"\",\n gradientColor: \"gray\" as const,\n };\n }\n\n return node.detail;\n}\n\nexport function createNodeData(type: ExtendedNodeType, data: unknown) {\n return {\n id: nanoid(),\n type,\n data,\n };\n}\n\nexport function createNodeWithDefaultData(\n type: ExtendedNodeType,\n data?: Partial<Node>,\n) {\n const defaultData =\n NODES.find((node) => node.type === type)?.defaultData ?? {};\n return Object.assign(createNodeData(type, defaultData), data) as Node;\n}\n\nexport function createNodeWithData<T>(\n type: BuilderNode,\n data: T,\n node: Partial<Node> = {},\n) {\n return Object.assign(createNodeData(type, data), node) as Node;\n}\n","import { useMemo } from \"react\";\n\nimport type { Node } from \"@xyflow/react\";\nimport { BuilderNode } from \"../../../../types\";\nimport { getNodeDetail } from \"../../../../utils\";\n\ninterface NodeWithDetail {\n id: string;\n type?: string;\n data: Record<string, unknown>;\n position: { x: number; y: number };\n detail: ReturnType<typeof getNodeDetail>;\n [key: string]: unknown;\n}\n\nexport function useNodeList(nodes: Node[]): NodeWithDetail[] {\n return useMemo(() => {\n return nodes\n .slice()\n .sort((a, b) => {\n if (a.type === BuilderNode.TRIGGER) return -1;\n if (b.type === BuilderNode.TRIGGER) return 1;\n if (a.type === BuilderNode.END) return 1;\n if (b.type === BuilderNode.END) return -1;\n return 0;\n })\n .map((n) => ({\n ...n,\n detail: getNodeDetail(n.type),\n })) as NodeWithDetail[];\n }, [nodes]);\n}\n","import { cn } from \"@burdenoff/fe-libs/utils\";\n\nimport type { ComponentPropsWithoutRef } from \"react\";\n\ntype SidebarPanelWrapperProps = Readonly<ComponentPropsWithoutRef<\"div\">>;\n\nexport default function SidebarPanelWrapper({\n children,\n className,\n ...props\n}: SidebarPanelWrapperProps) {\n return (\n <div\n className={cn(\"flex flex-col w-80 h-full bg-background/60\", className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n","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\"\n | \"INACTIVE\"\n | \"ERROR\"\n | \"ARCHIVED\"\n | \"SUSPENDED\";\n\nexport type ChannelType = \"NOTIFICATION\" | \"COMMUNICATION\";\n\nexport type ConnectionHealth = \"HEALTHY\" | \"DEGRADED\" | \"UNHEALTHY\" | \"UNKNOWN\";\n\nexport interface Channel {\n id: string;\n name: string;\n platform: ChannelPlatform;\n channelType: ChannelType;\n status: ChannelStatus;\n connectionHealth: ConnectionHealth;\n isConnected: boolean;\n description?: string;\n adapterType?: string;\n messageCount24h?: number;\n config?: {\n enableThreading?: boolean;\n enableReactions?: boolean;\n enablePresence?: boolean;\n rateLimitPerMinute?: number;\n };\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface ChannelList {\n items: Channel[];\n total: number;\n hasMore: boolean;\n}\n\n// ============================================================================\n// GraphQL Fragments & Queries\n// ============================================================================\n\nconst CHANNEL_SUMMARY_FIELDS = gql`\n fragment ChannelSummaryFields on Channel {\n id\n name\n platform\n channelType\n status\n connectionHealth\n isConnected\n description\n adapterType\n createdAt\n }\n`;\n\nconst CHANNEL_DETAIL_FIELDS = gql`\n fragment ChannelDetailFields on Channel {\n id\n name\n platform\n channelType\n status\n connectionHealth\n isConnected\n description\n adapterType\n messageCount24h\n config {\n enableThreading\n enableReactions\n enablePresence\n rateLimitPerMinute\n }\n createdAt\n updatedAt\n }\n`;\n\nconst GET_CHANNELS = gql`\n ${CHANNEL_SUMMARY_FIELDS}\n query GetChannels(\n $filter: ChannelFilterInput\n $pagination: ChannelPaginationInput\n ) {\n getChannels(filter: $filter, pagination: $pagination) {\n items {\n ...ChannelSummaryFields\n }\n total\n hasMore\n }\n }\n`;\n\nexport const GET_CHANNEL = gql`\n ${CHANNEL_DETAIL_FIELDS}\n query GetChannel($id: ID!) {\n getChannel(id: $id) {\n ...ChannelDetailFields\n }\n }\n`;\n\n// ============================================================================\n// Platform Helpers\n// ============================================================================\n\n/** Map ChannelPlatform to integration provider key for OAuth */\nexport const PLATFORM_TO_PROVIDER_KEY: Record<string, string> = {\n SLACK: \"slack\",\n TEAMS: \"microsoft-teams\",\n DISCORD: \"discord\",\n EMAIL: \"email\",\n WHATSAPP: \"whatsapp\",\n WEBCHAT: \"webchat\",\n WEBHOOK: \"webhook\",\n SMS: \"sms\",\n PUSH: \"push\",\n};\n\n/** Map ChannelPlatform to display icon (Iconify) */\nexport const PLATFORM_ICONS: Record<string, string> = {\n SLACK: \"mdi:slack\",\n TEAMS: \"mdi:microsoft-teams\",\n DISCORD: \"mdi:discord\",\n EMAIL: \"mdi:email\",\n SMS: \"mdi:message-text\",\n PUSH: \"mdi:bell-ring\",\n WEBCHAT: \"mdi:chat\",\n WEBHOOK: \"mdi:webhook\",\n WHATSAPP: \"mdi:whatsapp\",\n};\n\n/** Map ChannelStatus to display color class */\nexport const STATUS_COLORS: Record<ChannelStatus, string> = {\n ACTIVE: \"text-[var(--color-status-success-text)]\",\n INACTIVE: \"text-muted-foreground\",\n ERROR: \"text-[var(--color-status-error-text)]\",\n ARCHIVED: \"text-muted-foreground\",\n SUSPENDED: \"text-[var(--color-status-warning-text)]\",\n};\n\n/** Map ConnectionHealth to display color class */\nexport const HEALTH_COLORS: Record<ConnectionHealth, string> = {\n HEALTHY: \"text-[var(--color-status-success-text)]\",\n DEGRADED: \"text-[var(--color-status-warning-text)]\",\n UNHEALTHY: \"text-[var(--color-status-error-text)]\",\n UNKNOWN: \"text-muted-foreground\",\n};\n\n/** Map ConnectionHealth to icon */\nexport const HEALTH_ICONS: Record<ConnectionHealth, string> = {\n HEALTHY: \"mdi:check-circle\",\n DEGRADED: \"mdi:alert-circle\",\n UNHEALTHY: \"mdi:close-circle\",\n UNKNOWN: \"mdi:help-circle\",\n};\n\n// ============================================================================\n// Query Hooks\n// ============================================================================\n\ninterface ChannelFilterOptions {\n platform?: ChannelPlatform;\n status?: ChannelStatus;\n channelType?: ChannelType;\n search?: string;\n}\n\ninterface UseChannelsResult {\n channels: Channel[];\n total: number;\n hasMore: boolean;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook to fetch list of channels from global-channel-svc via global gateway.\n */\nexport function useChannels(filter?: ChannelFilterOptions): UseChannelsResult {\n const apolloClient = useGlobalStoreClient();\n const [channels, setChannels] = useState<Channel[]>([]);\n const [total, setTotal] = useState(0);\n const [hasMore, setHasMore] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const filterKey = JSON.stringify(filter);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const parsedFilter = filterKey ? JSON.parse(filterKey) : undefined;\n const PAGE_SIZE = 100;\n let offset = 0;\n let allItems: Channel[] = [];\n let totalCount = 0;\n let more = true;\n\n while (more) {\n const result = await apolloClient.query<{ getChannels: ChannelList }>({\n query: GET_CHANNELS,\n variables: {\n filter: parsedFilter,\n pagination: { limit: PAGE_SIZE, offset },\n },\n fetchPolicy: \"network-only\",\n });\n\n const page = result.data?.getChannels;\n const pageItems = page?.items ?? [];\n totalCount = page?.total ?? totalCount;\n allItems = allItems.concat(pageItems);\n\n more = (page?.hasMore ?? false) && pageItems.length === PAGE_SIZE;\n offset += PAGE_SIZE;\n }\n\n setChannels(allItems);\n setTotal(totalCount);\n setHasMore(false);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [apolloClient, filterKey]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n channels,\n total,\n hasMore,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch a single channel by ID from global-channel-svc.\n */\nexport function useChannel(channelId?: string) {\n const apolloClient = useGlobalStoreClient();\n const [channel, setChannel] = useState<Channel | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Raw query — returns result or Error, does not touch state.\n const fetchData = useCallback(\n async (policy: \"cache-first\" | \"network-only\" = \"cache-first\") => {\n if (!channelId) return undefined;\n try {\n return await apolloClient.query<{ getChannel: Channel | null }>({\n query: GET_CHANNEL,\n variables: { id: channelId },\n fetchPolicy: policy,\n });\n } catch (err) {\n return err as Error;\n }\n },\n [apolloClient, channelId],\n );\n\n // Commits a fetchData result to state.\n const applyResult = useCallback(\n (result: Awaited<ReturnType<typeof fetchData>>) => {\n if (result instanceof Error) {\n setError(result);\n } else if (result) {\n setChannel(result.data?.getChannel ?? null);\n } else {\n setChannel(null);\n }\n setLoading(false);\n },\n [],\n );\n\n // Auto-fetch on channelId change, with stale-response guard.\n useEffect(() => {\n let cancelled = false;\n\n setLoading(true);\n setError(null);\n\n fetchData().then((result) => {\n if (cancelled) return;\n applyResult(result);\n });\n\n return () => {\n cancelled = true;\n };\n }, [fetchData, applyResult]);\n\n // Explicit refetch — caller-triggered, always bypasses cache and commits state.\n const refetch = useCallback(async () => {\n setLoading(true);\n setError(null);\n const result = await fetchData(\"network-only\");\n applyResult(result);\n }, [fetchData, applyResult]);\n\n return {\n channel,\n loading,\n error,\n refetch,\n };\n}\n","/**\n * ChannelSelector — dropdown for choosing a communication channel.\n * Queries global-channel-svc via the global public gateway.\n */\n\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from \"@burdenoff/fe-libs/ui\";\nimport {\n useChannels,\n PLATFORM_ICONS,\n STATUS_COLORS,\n HEALTH_ICONS,\n HEALTH_COLORS,\n type Channel,\n type ChannelPlatform,\n} from \"../../../../../../../../../../modules/channels\";\nimport { useState } from \"react\";\n\ninterface ChannelSelectorProps {\n selectedChannelId?: string;\n onSelect: (channel: Channel) => void;\n platformFilter?: ChannelPlatform;\n}\n\nexport function ChannelSelector({\n selectedChannelId,\n onSelect,\n platformFilter,\n}: ChannelSelectorProps) {\n const [isOpen, setIsOpen] = useState(false);\n const { channels, loading, error } = useChannels(\n platformFilter\n ? { platform: platformFilter, channelType: \"COMMUNICATION\" }\n : { channelType: \"COMMUNICATION\" },\n );\n\n const selectedChannel = channels.find((c) => c.id === selectedChannelId);\n\n return (\n <div className=\"space-y-2\">\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Channel\n </div>\n <DropdownMenu open={isOpen} onOpenChange={setIsOpen}>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full justify-between\"\n >\n {selectedChannel ? (\n <span className=\"flex items-center gap-2 truncate\">\n <Icon\n icon={\n PLATFORM_ICONS[selectedChannel.platform] || \"mdi:antenna\"\n }\n className=\"w-4 h-4 shrink-0\"\n />\n <span className=\"truncate\">{selectedChannel.name}</span>\n <Icon\n icon={HEALTH_ICONS[selectedChannel.connectionHealth]}\n className={`w-3.5 h-3.5 shrink-0 ${HEALTH_COLORS[selectedChannel.connectionHealth]}`}\n />\n </span>\n ) : (\n <span className=\"flex items-center gap-2 text-muted-foreground\">\n <Icon icon=\"mdi:antenna\" className=\"w-4 h-4\" />\n Select channel\n </span>\n )}\n <Icon\n icon=\"mdi:chevron-down\"\n className=\"w-4 h-4 text-muted-foreground shrink-0\"\n />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent\n align=\"start\"\n className=\"w-[260px] max-h-[350px] overflow-y-auto\"\n >\n {loading ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n <Icon\n icon=\"mdi:loading\"\n className=\"w-5 h-5 mx-auto mb-2 animate-spin\"\n />\n <p>Loading channels...</p>\n </div>\n ) : error ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-5 h-5 mx-auto mb-2 text-[var(--color-status-error-text)]\"\n />\n <p>Failed to load channels</p>\n <p className=\"text-xs mt-1\">{error.message}</p>\n </div>\n ) : channels.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n <Icon\n icon=\"mdi:antenna-off\"\n className=\"w-6 h-6 mx-auto mb-2 opacity-50\"\n />\n <p>No channels found</p>\n <p className=\"text-xs mt-1\">\n Create one in the Channels settings\n </p>\n </div>\n ) : (\n <>\n <DropdownMenuLabel className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wide\">\n Available Channels\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {channels.map((channel) => {\n const isSelected = channel.id === selectedChannelId;\n return (\n <DropdownMenuItem\n key={channel.id}\n onClick={() => {\n onSelect(channel);\n setIsOpen(false);\n }}\n className={`flex items-center justify-between cursor-pointer ${\n isSelected ? \"bg-primary/10\" : \"\"\n }`}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <Icon\n icon={PLATFORM_ICONS[channel.platform] || \"mdi:antenna\"}\n className=\"w-4 h-4 shrink-0\"\n />\n <div className=\"flex flex-col min-w-0\">\n <span className=\"font-medium truncate text-sm\">\n {channel.name}\n </span>\n <span className=\"text-xs text-muted-foreground flex items-center gap-1\">\n <span className={STATUS_COLORS[channel.status]}>\n {channel.status.toLowerCase()}\n </span>\n <span>·</span>\n <span>{channel.platform.toLowerCase()}</span>\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Icon\n icon={HEALTH_ICONS[channel.connectionHealth]}\n className={`w-3.5 h-3.5 ${HEALTH_COLORS[channel.connectionHealth]}`}\n />\n {isSelected && (\n <Icon\n icon=\"mdi:check\"\n className=\"w-4 h-4 text-primary\"\n />\n )}\n </div>\n </DropdownMenuItem>\n );\n })}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","/**\n * ChannelDetails — displays selected channel information.\n */\n\nimport { Icon } from \"@iconify/react\";\nimport {\n useChannel,\n PLATFORM_ICONS,\n STATUS_COLORS,\n HEALTH_COLORS,\n HEALTH_ICONS,\n} from \"../../../../../../../../../../modules/channels\";\n\ninterface ChannelDetailsProps {\n channelId: string;\n}\n\nexport function ChannelDetails({ channelId }: ChannelDetailsProps) {\n const { channel, loading, error } = useChannel(channelId);\n\n if (loading) {\n return (\n <div className=\"p-3 rounded-md border border-card-foreground/10 bg-card/30\">\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n Loading channel details...\n </div>\n </div>\n );\n }\n\n if (error || !channel) {\n return (\n <div className=\"p-3 rounded-md border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bg-subtle)]\">\n <div className=\"flex items-center gap-2 text-xs text-[var(--color-status-error-text)]\">\n <Icon icon=\"mdi:alert-circle\" className=\"w-4 h-4\" />\n {error ? error.message : \"Channel not found\"}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"p-3 rounded-md border border-card-foreground/10 bg-card/30 space-y-2.5\">\n {/* Channel Header */}\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center justify-center w-8 h-8 rounded-md bg-primary/10\">\n <Icon\n icon={PLATFORM_ICONS[channel.platform] || \"mdi:antenna\"}\n className=\"w-5 h-5 text-primary\"\n />\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium truncate\">{channel.name}</span>\n <span className=\"text-xs text-muted-foreground\">\n {channel.platform.toLowerCase()} ·{\" \"}\n {channel.channelType.toLowerCase()}\n </span>\n </div>\n </div>\n\n {/* Status & Health */}\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[10px] text-muted-foreground uppercase tracking-wide\">\n Status\n </span>\n <span\n className={`text-xs font-medium ${STATUS_COLORS[channel.status]}`}\n >\n {channel.status.toLowerCase()}\n </span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[10px] text-muted-foreground uppercase tracking-wide\">\n Health\n </span>\n <span className=\"flex items-center gap-1\">\n <Icon\n icon={HEALTH_ICONS[channel.connectionHealth]}\n className={`w-3.5 h-3.5 ${HEALTH_COLORS[channel.connectionHealth]}`}\n />\n <span\n className={`text-xs font-medium ${HEALTH_COLORS[channel.connectionHealth]}`}\n >\n {channel.connectionHealth.toLowerCase()}\n </span>\n </span>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"flex items-center gap-3 pt-1 border-t border-card-foreground/5\">\n {channel.isConnected ? (\n <span className=\"flex items-center gap-1 text-xs text-[var(--color-status-success-text)]\">\n <Icon icon=\"mdi:link\" className=\"w-3.5 h-3.5\" />\n Connected\n </span>\n ) : (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Icon icon=\"mdi:link-off\" className=\"w-3.5 h-3.5\" />\n Not connected\n </span>\n )}\n {channel.messageCount24h !== undefined && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Icon icon=\"mdi:message-text\" className=\"w-3.5 h-3.5\" />\n {channel.messageCount24h} msgs/24h\n </span>\n )}\n </div>\n\n {/* Description */}\n {channel.description && (\n <p className=\"text-xs text-muted-foreground pt-1 border-t border-card-foreground/5\">\n {channel.description}\n </p>\n )}\n </div>\n );\n}\n","/**\n * ChannelAuth — authentication section for channel node configuration.\n *\n * Provides:\n * 1. \"Authenticate with {platform}\" button → redirects to microfe-integrations\n * 2. Integration ID input field (manual paste or auto-filled from redirect)\n */\n\nimport { Icon } from \"@iconify/react\";\nimport { Button, Input } from \"@burdenoff/fe-libs/ui\";\nimport {\n PLATFORM_ICONS,\n PLATFORM_TO_PROVIDER_KEY,\n type ChannelPlatform,\n} from \"../../../../../../../../../../modules/channels\";\nimport { useState, useEffect } from \"react\";\n\ninterface ChannelAuthProps {\n platform: ChannelPlatform;\n integrationId?: string;\n onIntegrationIdChange: (id: string) => void;\n /** Current workflow builder path for returnTo redirect */\n currentPath?: string;\n /** Node ID for tracking the redirect context */\n nodeId: string;\n}\n\nexport function ChannelAuth({\n platform,\n integrationId,\n onIntegrationIdChange,\n currentPath,\n nodeId,\n}: ChannelAuthProps) {\n const [localValue, setLocalValue] = useState(integrationId || \"\");\n\n useEffect(() => {\n setLocalValue(integrationId || \"\");\n }, [integrationId]);\n\n const providerKey =\n PLATFORM_TO_PROVIDER_KEY[platform] || platform.toLowerCase();\n const platformIcon = PLATFORM_ICONS[platform] || \"mdi:key\";\n const platformLabel = platform.charAt(0) + platform.slice(1).toLowerCase();\n\n const handleAuthClick = () => {\n // Build the redirect URL to the integrations page\n const returnTo = currentPath || window.location.pathname;\n const params = new URLSearchParams({\n providerKey,\n returnTo,\n channelNodeId: nodeId,\n });\n const integrationsUrl = `/integrations/connections/add?${params.toString()}`;\n\n // Open integrations page in a new tab so unsaved builder state is preserved\n window.open(integrationsUrl, \"_blank\", \"noopener,noreferrer\");\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setLocalValue(value);\n onIntegrationIdChange(value);\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n // Let the paste happen naturally, then update\n setTimeout(() => {\n const value = (e.target as HTMLInputElement).value;\n setLocalValue(value);\n onIntegrationIdChange(value);\n }, 0);\n };\n\n return (\n <div className=\"space-y-3\">\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Authentication\n </div>\n\n {/* Auth Button */}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full justify-start gap-2\"\n onClick={handleAuthClick}\n >\n <Icon icon={platformIcon} className=\"w-4 h-4\" />\n <span>Authenticate with {platformLabel}</span>\n <Icon\n icon=\"mdi:open-in-new\"\n className=\"w-3.5 h-3.5 ml-auto text-muted-foreground\"\n />\n </Button>\n\n {/* Integration ID Input */}\n <div className=\"space-y-1.5\">\n <label className=\"text-[11px] text-muted-foreground\">\n Integration Connection ID\n </label>\n <div className=\"relative\">\n <Input\n type=\"text\"\n placeholder=\"Paste integration ID here...\"\n value={localValue}\n onChange={handleInputChange}\n onPaste={handlePaste}\n className=\"text-xs pr-8\"\n />\n {localValue && (\n <div className=\"absolute right-2 top-1/2 -translate-y-1/2\">\n <Icon\n icon=\"mdi:check-circle\"\n className=\"w-4 h-4 text-[var(--color-status-success-text)]\"\n />\n </div>\n )}\n </div>\n <p className=\"text-[10px] text-muted-foreground\">\n Complete the OAuth flow above, then paste the connection ID here.\n </p>\n </div>\n </div>\n );\n}\n","/**\n * ChannelNodePropertyPanel — custom property panel for the Channel workflow node.\n *\n * Replaces the generic property panel when a channel_node is selected.\n * Shows channel selection, details, auth configuration, and connection selector.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useFlowStore } from \"../../../../../../../../../stores/flow-store\";\nimport { useShallow } from \"zustand/shallow\";\nimport { ConnectionSelector } from \"../../../../../../../../../../modules/connections/components\";\nimport { NODE_CONFIGS } from \"../../../../../index\";\nimport { ChannelSelector } from \"./ChannelSelector\";\nimport { ChannelDetails } from \"./ChannelDetails\";\nimport { ChannelAuth } from \"./ChannelAuth\";\nimport { GET_CHANNEL } from \"../../../../../../../../../../modules/channels\";\nimport { useGlobalStoreClient } from \"../../../../../../../../../../hooks/store/useGlobalStoreClient\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { Icon } from \"@iconify/react\";\nimport { gql } from \"@apollo/client\";\nimport type {\n Channel,\n ChannelPlatform,\n} from \"../../../../../../../../../../modules/channels\";\nimport type { BuilderNodeType } from \"../../../../../types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface AdaptiveCardOperation {\n name: string;\n adaptive_card: Record<string, unknown>;\n connectionAdapters?: Array<{ name: string; provider: string }>;\n credentialAdapters?: Array<{ name: string; provider: string }>;\n}\n\ninterface NodeDataOperations {\n operations?: AdaptiveCardOperation[];\n connectionAdapters?: Array<{ name: string; provider: string }>;\n credentialAdapters?: Array<{ name: string; provider: string }>;\n}\n\ninterface ConnectionArg {\n connectionId: string;\n adapter: string;\n}\n\ninterface CredentialArg {\n id: string;\n adapter: string;\n}\n\ninterface NodeData {\n nodeData?: NodeDataOperations;\n operation_name?: string;\n args?: {\n state?: Record<string, unknown>;\n connections?: ConnectionArg[];\n credentials?: CredentialArg[];\n };\n version?: string;\n}\n\ninterface ChannelNodePropertyPanelProps {\n id: string;\n type: BuilderNodeType;\n data: NodeData;\n updateData: (data: Partial<NodeData>) => void;\n}\n\n// ============================================================================\n// GraphQL\n// ============================================================================\n\nconst LINK_INTEGRATION_MUTATION = gql`\n mutation LinkIntegrationConnection(\n $integrationConnectionId: ID!\n $channelId: ID!\n ) {\n linkIntegrationConnection(\n integrationConnectionId: $integrationConnectionId\n channelId: $channelId\n ) {\n id\n }\n }\n`;\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function ChannelNodePropertyPanel({\n id,\n type,\n data,\n updateData,\n}: ChannelNodePropertyPanelProps) {\n // Detect position: if no incoming edges → trigger, else → action (auto heuristic)\n const [edges] = useFlowStore(useShallow((s) => [s.workflow.edges]));\n const autoIsTrigger = !edges.some((e) => e.target === id);\n\n // Explicit role override stored in args.state.role (\"trigger\" | \"action\" | undefined = auto)\n const explicitRole = data?.args?.state?.role as\n | \"trigger\"\n | \"action\"\n | undefined;\n const isTrigger =\n explicitRole !== undefined ? explicitRole === \"trigger\" : autoIsTrigger;\n\n // Connect button state\n const [connectLoading, setConnectLoading] = useState(false);\n const [connectStatus, setConnectStatus] = useState<\n \"idle\" | \"success\" | \"error\"\n >(\"idle\");\n const [connectError, setConnectError] = useState<string | null>(null);\n const globalClient = useGlobalStoreClient();\n\n // Auto-set operation_name based on graph position (only when no explicit role override)\n useEffect(() => {\n if (explicitRole !== undefined) return; // user has explicitly chosen; don't override\n const opName = autoIsTrigger\n ? \"onChannelMessageReceived\"\n : \"sendChannelMessage\";\n if (data?.operation_name !== opName) {\n updateData({ operation_name: opName } as Partial<NodeData>);\n }\n }, [autoIsTrigger, id, explicitRole]);\n\n // Current state values\n const channelId = data?.args?.state?.channelId as string | undefined;\n const integrationId = data?.args?.state?.integrationId as string | undefined;\n const selectedPlatform = data?.args?.state?.platform as\n | ChannelPlatform\n | undefined;\n\n // Get operations list from nodeData or NODE_CONFIGS registry\n const operationsArray = useMemo(() => {\n const nodeDataOps = data?.nodeData?.operations as\n | { operations?: AdaptiveCardOperation[] }\n | AdaptiveCardOperation[]\n | undefined;\n\n if (nodeDataOps) {\n const ops = Array.isArray(nodeDataOps)\n ? nodeDataOps\n : nodeDataOps.operations;\n if (ops && ops.length > 0) return ops;\n }\n\n const nodeConfig = NODE_CONFIGS.find((c) => c.type === type);\n if (nodeConfig?.operations) {\n return nodeConfig.operations as AdaptiveCardOperation[];\n }\n\n return [];\n }, [data?.nodeData?.operations, type]);\n\n // Currently selected operation\n const currentOperation = operationsArray.find(\n (op) => op.name === data?.operation_name,\n );\n\n // Connection adapters\n const connectionAdapters =\n currentOperation?.connectionAdapters ||\n currentOperation?.credentialAdapters ||\n data?.nodeData?.connectionAdapters ||\n data?.nodeData?.credentialAdapters ||\n [];\n\n // Selected connections\n const selectedConnections = useMemo(() => {\n if (data?.args?.connections && data.args.connections.length > 0) {\n return data.args.connections.map((conn) => ({\n connectionId: conn.connectionId,\n adapter: conn.adapter,\n }));\n }\n if (data?.args?.credentials && data.args.credentials.length > 0) {\n return data.args.credentials.map((cred) => ({\n connectionId: cred.id,\n adapter: cred.adapter,\n }));\n }\n return [];\n }, [data?.args?.connections, data?.args?.credentials]);\n\n // ============================================================================\n // Handlers\n // ============================================================================\n\n /** Handle explicit role selection (overrides edge-based auto-detection) */\n const handleRoleChange = useCallback(\n (role: \"trigger\" | \"action\") => {\n const opName =\n role === \"trigger\" ? \"onChannelMessageReceived\" : \"sendChannelMessage\";\n const currentState = (data?.args?.state ?? {}) as Record<string, unknown>;\n updateData({\n operation_name: opName,\n args: {\n ...(data?.args ?? {}),\n state: { ...currentState, role },\n },\n } as Partial<NodeData>);\n },\n [data, updateData],\n );\n\n /** Update a field in args.state without touching other data */\n const updateState = useCallback(\n (updates: Record<string, unknown>) => {\n const currentState = (data?.args?.state ?? {}) as Record<string, unknown>;\n updateData({\n args: {\n ...(data?.args ?? {}),\n state: { ...currentState, ...updates },\n },\n } as Partial<NodeData>);\n },\n [data, updateData],\n );\n\n /** Handle channel selection */\n const handleChannelSelect = useCallback(\n (channel: Channel) => {\n updateState({\n channelId: channel.id,\n platform: channel.platform,\n channelName: channel.name,\n });\n },\n [updateState],\n );\n\n /** Handle integration ID change */\n const handleIntegrationIdChange = useCallback(\n (newIntegrationId: string) => {\n updateState({ integrationId: newIntegrationId });\n },\n [updateState],\n );\n\n /** Handle connection changes */\n const handleConnectionsChange = useCallback(\n (connections: { connectionId: string; adapter: string }[]) => {\n const currentArgs = data?.args ?? {};\n const { credentials: _legacy, ...restArgs } = currentArgs;\n void _legacy;\n\n updateData({\n args: {\n ...restArgs,\n connections: connections.map((conn) => ({\n connectionId: conn.connectionId,\n adapter: conn.adapter,\n })),\n },\n } as Partial<NodeData>);\n },\n [data, updateData],\n );\n\n /** Call linkIntegrationConnection on global-channel-svc → triggers welcome DM */\n const handleConnect = useCallback(async () => {\n if (!channelId || !integrationId) return;\n setConnectLoading(true);\n setConnectStatus(\"idle\");\n setConnectError(null);\n try {\n await globalClient.mutate({\n mutation: LINK_INTEGRATION_MUTATION,\n variables: { integrationConnectionId: integrationId, channelId },\n refetchQueries: [{ query: GET_CHANNEL, variables: { id: channelId } }],\n awaitRefetchQueries: true,\n });\n setConnectStatus(\"success\");\n updateState({ integrationId });\n } catch (err) {\n setConnectStatus(\"error\");\n setConnectError(err instanceof Error ? err.message : \"Connection failed\");\n } finally {\n setConnectLoading(false);\n }\n }, [channelId, integrationId, globalClient, updateState]);\n\n // ============================================================================\n // Render\n // ============================================================================\n\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n {/* Node ID */}\n <div className=\"text-xs text-card-foreground/20 self-end\">{id}</div>\n\n {/* Operation selector */}\n <div className=\"space-y-1.5\">\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Operation\n </div>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => handleRoleChange(\"trigger\")}\n className={[\n \"flex-1 flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs transition-colors\",\n isTrigger\n ? \"border-primary/60 bg-primary/10 text-primary font-semibold\"\n : \"border-card-foreground/10 text-card-foreground/40 hover:border-card-foreground/30 hover:text-card-foreground/70\",\n ].join(\" \")}\n >\n <Icon icon=\"mdi:lightning-bolt\" className=\"w-3.5 h-3.5 shrink-0\" />\n Receive Messages\n </button>\n <button\n type=\"button\"\n onClick={() => handleRoleChange(\"action\")}\n className={[\n \"flex-1 flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs transition-colors\",\n !isTrigger\n ? \"border-primary/60 bg-primary/10 text-primary font-semibold\"\n : \"border-card-foreground/10 text-card-foreground/40 hover:border-card-foreground/30 hover:text-card-foreground/70\",\n ].join(\" \")}\n >\n <Icon icon=\"mdi:send\" className=\"w-3.5 h-3.5 shrink-0\" />\n Send Message\n </button>\n </div>\n {explicitRole === undefined && (\n <p className=\"text-[10px] text-card-foreground/30\">\n Auto-detected from graph position. Click to override.\n </p>\n )}\n </div>\n\n {/* Divider */}\n <div className=\"h-px bg-card-foreground/10\" />\n\n {/* Channel Selection */}\n <ChannelSelector\n selectedChannelId={channelId}\n onSelect={handleChannelSelect}\n />\n\n {/* Channel Details (shown when a channel is selected) */}\n {channelId && <ChannelDetails channelId={channelId} />}\n\n {/* Divider */}\n {channelId && <div className=\"h-px bg-card-foreground/10\" />}\n\n {/* Authentication Section (shown when a channel is selected) */}\n {channelId && selectedPlatform && (\n <ChannelAuth\n platform={selectedPlatform}\n integrationId={integrationId}\n onIntegrationIdChange={handleIntegrationIdChange}\n nodeId={id}\n />\n )}\n\n {/* Connect button — shown whenever a channel is selected */}\n {channelId && (\n <>\n <div className=\"h-px bg-card-foreground/10\" />\n <div className=\"space-y-2\">\n <Button\n variant=\"default\"\n size=\"sm\"\n className=\"w-full gap-2\"\n onClick={handleConnect}\n disabled={connectLoading || !integrationId}\n title={\n !integrationId\n ? \"Paste an Integration Connection ID first\"\n : undefined\n }\n >\n {connectLoading ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : connectStatus === \"success\" ? (\n <Icon icon=\"mdi:check-circle\" className=\"w-4 h-4\" />\n ) : (\n <Icon icon=\"mdi:link-variant\" className=\"w-4 h-4\" />\n )}\n <span>\n {connectLoading\n ? \"Connecting…\"\n : connectStatus === \"success\"\n ? \"Connected!\"\n : \"Connect\"}\n </span>\n </Button>\n {connectStatus === \"error\" && connectError && (\n <p className=\"text-[10px] text-destructive\">{connectError}</p>\n )}\n {connectStatus === \"success\" && (\n <p className=\"text-[10px] text-[var(--color-status-success-text)]\">\n Channel linked — welcome message sent.\n </p>\n )}\n </div>\n </>\n )}\n\n {/* Message text input — only shown when node is in action (send) mode */}\n {!isTrigger && (\n <>\n <div className=\"h-px bg-card-foreground/10\" />\n <div className=\"space-y-2\">\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Message Text\n </div>\n <textarea\n className=\"w-full text-xs px-3 py-2 rounded-md border border-card-foreground/10 bg-transparent text-card-foreground/70 placeholder:text-card-foreground/30 resize-none focus:outline-none focus:border-primary/50\"\n rows={3}\n placeholder=\"e.g. ${prev.response}\"\n value={\n (data?.args?.state?.messageText as string | undefined) ?? \"\"\n }\n onChange={(e) => updateState({ messageText: e.target.value })}\n />\n </div>\n </>\n )}\n\n {/* Connections Section */}\n {connectionAdapters.length > 0 && (\n <>\n <div className=\"h-px bg-card-foreground/10\" />\n <div className=\"space-y-2\">\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Connections\n </div>\n <ConnectionSelector\n adapters={connectionAdapters}\n selectedConnections={selectedConnections}\n onChange={handleConnectionsChange}\n compact\n />\n </div>\n </>\n )}\n </div>\n );\n}\n","/**\n * ConversationNodePropertyPanel — custom property panel for the Conversation workflow node.\n *\n * Auto-sets operation_name to 'storeAndForward'. No operation selector is shown\n * because the operation is determined automatically.\n */\n\nimport { useEffect } from \"react\";\nimport type { BuilderNodeType } from \"../../../../../types\";\n\ninterface NodeData {\n operation_name?: string;\n args?: {\n state?: Record<string, unknown>;\n };\n version?: string;\n}\n\ninterface ConversationNodePropertyPanelProps {\n id: string;\n type: BuilderNodeType;\n data: NodeData;\n updateData: (data: Partial<NodeData>) => void;\n}\n\nexport function ConversationNodePropertyPanel({\n id,\n data,\n updateData,\n}: ConversationNodePropertyPanelProps) {\n // Auto-set operation on mount\n useEffect(() => {\n if (data?.operation_name !== \"storeAndForward\") {\n updateData({ operation_name: \"storeAndForward\" } as Partial<NodeData>);\n }\n }, [id]);\n\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n {/* Node ID */}\n <div className=\"text-xs text-card-foreground/20 self-end\">{id}</div>\n\n {/* Role label */}\n <div className=\"text-xs text-card-foreground/60 font-semibold\">\n Store &amp; Forward\n </div>\n\n <div className=\"h-px bg-card-foreground/10\" />\n\n <p className=\"text-xs text-card-foreground/50 leading-relaxed\">\n Stores incoming messages and passes the stored record to the next node.\n All input comes automatically from the previous node — no configuration\n required.\n </p>\n </div>\n );\n}\n","import { useReactFlow } from \"@xyflow/react\";\nimport { produce } from \"immer\";\nimport { useCallback, useState, useEffect, type ComponentProps } from \"react\";\nimport { ExtendedNodeType, BaseNodeData } from \"../../../../types\";\nimport {\n NODES,\n ensureNodeConfigsLoaded,\n isNodeConfigsInitialized,\n} from \"../../../..\";\nimport UnavailableNodePropertyPanel from \"../property-panels/unavailable-property-panel\";\nimport GenericNodePropertyPanel from \"../property-panels/property-panel\";\nimport { ChannelNodePropertyPanel } from \"../property-panels/channel\";\nimport { ConversationNodePropertyPanel } from \"../property-panels/conversation\";\nimport type { BuilderNodeType } from \"../../../../types\";\nimport { useFlowStore } from \"../../../../../../../../stores/flow-store\";\n\n/**\n * Map of dynamic node type patterns → custom property panel components.\n * When a node type matches one of these keys, the custom panel is used\n * instead of the generic one.\n */\ntype CustomPanelComponent = React.ComponentType<{\n id: string;\n type: BuilderNodeType;\n data: unknown;\n updateData: (data: Partial<BaseNodeData>) => void;\n}>;\n\n/**\n * Map of dynamic node type patterns → custom property panel components.\n * Keys can be exact types or partial matches.\n * Node types from manifests use format like \"integration/channel\", \"store/conversation\".\n */\nconst CUSTOM_DYNAMIC_PANELS: Record<string, CustomPanelComponent> = {\n \"integration/channel\": ChannelNodePropertyPanel as CustomPanelComponent,\n channel_node: ChannelNodePropertyPanel as CustomPanelComponent,\n \"store/conversation\": ConversationNodePropertyPanel as CustomPanelComponent,\n};\n\n/** Check if a node type matches any custom panel pattern */\nfunction getCustomPanel(type: string) {\n if (CUSTOM_DYNAMIC_PANELS[type]) return CUSTOM_DYNAMIC_PANELS[type];\n for (const [pattern, panel] of Object.entries(CUSTOM_DYNAMIC_PANELS)) {\n if (type.includes(pattern)) return panel;\n }\n return null;\n}\n\ntype NodePropertyPanelProps = Readonly<{\n id: string;\n type: ExtendedNodeType;\n data?: BaseNodeData;\n}>;\n\n// Type for the generic property panel's data structure\ninterface GenericNodeData {\n nodeData?: Record<string, unknown>;\n operation_name?: string;\n args?: {\n state?: Record<string, unknown>;\n connections?: Array<{ connectionId: string; adapter: string }>;\n credentials?: Array<{ id: string; adapter: string }>;\n };\n version?: string;\n}\n\nexport function NodePropertyPanel({ id, type, data }: NodePropertyPanelProps) {\n // Track when nodes are loaded to trigger re-render\n const [nodesLoaded, setNodesLoaded] = useState(isNodeConfigsInitialized());\n\n useEffect(() => {\n if (!nodesLoaded) {\n ensureNodeConfigsLoaded().then(() => {\n setNodesLoaded(true);\n });\n }\n }, [nodesLoaded]);\n\n // Look up property panel dynamically from NODES array\n // This runs on every render to pick up dynamically loaded nodes\n const nodeConfig = NODES.find((n) => n.type === type);\n const PanelComponent = nodeConfig?.propertyPanel;\n\n const { setNodes } = useReactFlow();\n const zustandSetNodes = useFlowStore((s) => s.actions.nodes.setNodes);\n\n const nodeData = produce(data, () => {});\n\n const updateData = useCallback(\n (newData: Partial<BaseNodeData>) => {\n // Update React Flow internal state (for UI rendering)\n setNodes((nds) => {\n const updatedNodes = produce(nds, (draft) => {\n const node = draft.find((n) => n.id === id);\n if (node) node.data = { ...node.data, ...newData };\n });\n // Sync the updated nodes back to the Zustand store so saveWorkflow() picks up changes\n zustandSetNodes(updatedNodes);\n return updatedNodes;\n });\n },\n [id, setNodes, zustandSetNodes],\n );\n\n // Custom panels take priority over generic node-config panels.\n // This must run before the PanelComponent check so that channel/conversation\n // nodes always get their specialised panel even after node configs are loaded\n // (which would otherwise set PanelComponent to the generic NodePropertyPanel).\n const CustomPanel = getCustomPanel(type);\n if (CustomPanel && nodeData) {\n return (\n <CustomPanel\n id={id}\n type={type as BuilderNodeType}\n data={nodeData}\n updateData={updateData}\n />\n );\n }\n\n if (!PanelComponent) {\n // For dynamic nodes, use the generic property panel directly if data exists\n // This handles nodes that were fetched dynamically but aren't in NODES yet\n if (nodeData && (data as GenericNodeData)?.nodeData) {\n // GenericNodePropertyPanel uses its own local NodeData type for `data` and `updateData`.\n // Our BaseNodeData and GenericNodeData are structurally compatible but not identical,\n // so we cast through ComponentProps to bridge the type boundary.\n type PanelProps = ComponentProps<typeof GenericNodePropertyPanel>;\n return (\n <GenericNodePropertyPanel\n id={id}\n type={type as BuilderNodeType}\n data={nodeData as PanelProps[\"data\"]}\n updateData={updateData as unknown as PanelProps[\"updateData\"]}\n />\n );\n }\n return <UnavailableNodePropertyPanel />;\n }\n\n return nodeData ? (\n <PanelComponent\n id={id}\n type={type}\n data={nodeData}\n updateData={updateData}\n />\n ) : (\n <UnavailableNodePropertyPanel />\n );\n}\n","import { Icon } from \"@iconify/react\";\n\nexport default function IntroductionPropertyPanel() {\n return (\n <div className=\"h-full flex flex-col items-center justify-center p-4 text-center\">\n <div className=\"size-12 flex items-center justify-center rounded-full bg-primary\">\n <Icon icon=\"mynaui:cog-one\" className=\"size-6 text-white\" />\n </div>\n\n <div className=\"mt-4 text-balance font-medium\">Node Properties</div>\n\n <div className=\"mt-1 w-2.5/3 text-xs text-card/40 font-medium leading-normal\">\n Here you can view and edit the properties of the selected node.\n </div>\n\n <div className=\"mt-8 w-full text-xs text-card/40 font-medium italic\">\n Select a node from the list on the top to view its properties.\n </div>\n </div>\n );\n}\n","import { useFlowStore } from \"../../../../../../../stores/flow-store\";\nimport { useNodes, useReactFlow } from \"@xyflow/react\";\nimport { produce } from \"immer\";\nimport { useMemo } from \"react\";\nimport { useNodeList } from \"./hooks/use-node-list\";\nimport SidebarPanelWrapper from \"../../components/sidebar-panel-wrapper\";\nimport { ExtendedNodeType, BaseNodeData } from \"../../../types\";\nimport SidebarPanelHeading from \"../../components/sidebar-panel-heading\";\nimport { NodeListItem } from \"./components/node-list-item\";\nimport { NodePropertyPanel } from \"./components/node-propery-panel\";\nimport IntroductionPropertyPanel from \"./property-panels/introduction-property-panel\";\nimport { HeaderWithIcon } from \"../../../../ui/header-with-icon\";\n\nexport function NodePropertiesPanel() {\n const selectedNode = useFlowStore(\n (s) => s.workflow.sidebar.panels.nodeProperties.selectedNode,\n );\n\n const setSelectedNode = useFlowStore(\n (s) => s.actions.sidebar.panels.nodeProperties.setSelectedNode,\n );\n\n const nodes = useNodes();\n\n const nodeList = useNodeList(nodes);\n\n const { setNodes } = useReactFlow();\n\n const onNodeClick = (id: string) => {\n setNodes((nds) =>\n produce(nds, (draft) => {\n draft.forEach((node) => {\n node.selected = node.id === id;\n });\n }),\n );\n\n setSelectedNode({\n id,\n type: nodeList.find((n) => n.id === id)?.type as ExtendedNodeType,\n });\n };\n\n const selectedNodeData = useMemo(() => {\n const data = nodes.find((n) => n.id === selectedNode?.id)?.data;\n return data as BaseNodeData | undefined;\n }, [nodes, selectedNode?.id]);\n\n return (\n <SidebarPanelWrapper>\n <div className=\"h-80 w-80 flex flex-col\">\n <SidebarPanelHeading className=\"shrink-0\">\n <HeaderWithIcon icon=\"mynaui:layers-three\" title=\"Nodes in Flow\" />\n </SidebarPanelHeading>\n\n <div className=\"flex w-full flex-col gap-1 p-1.5 overflow-y-auto\">\n {nodeList.map((node) => (\n <NodeListItem\n key={node.id}\n id={node.id}\n title={node.detail.title}\n icon={node.detail.icon}\n selected={selectedNode?.id === node.id}\n pseudoSelected={!!node.selected}\n onClick={() => {\n onNodeClick(node.id);\n }}\n />\n ))}\n </div>\n </div>\n\n <div className=\"w-80 max-h-[360px] 2xl:max-h-[594px] flex flex-col\">\n <SidebarPanelHeading className=\"shrink-0\">\n <HeaderWithIcon icon=\"mynaui:cog\" title=\"Node Properties\" />\n </SidebarPanelHeading>\n\n <div className=\"flex w-full flex-col overflow-y-auto\">\n {selectedNode ? (\n <NodePropertyPanel\n id={selectedNode.id}\n type={selectedNode.type}\n data={selectedNodeData}\n />\n ) : (\n <IntroductionPropertyPanel />\n )}\n </div>\n </div>\n </SidebarPanelWrapper>\n );\n}\n","export interface CategoryItem {\n key: string;\n label: string;\n description: string;\n icon: 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:brain\",\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 },\n {\n key: \"data\",\n label: \"Data & Transform\",\n description: \"Manipulate, filter, or convert data\",\n icon: \"mynaui:database\",\n },\n {\n key: \"flow\",\n label: \"Flow & Logic\",\n description: \"Branch, merge, or loop the flow\",\n icon: \"mynaui:git-branch\",\n },\n {\n key: \"core\",\n label: \"Core\",\n description: \"HTTP requests, code, webhooks, and more\",\n icon: \"mynaui:cog\",\n },\n {\n key: \"communication\",\n label: \"Communication\",\n description: \"Email, messaging, and notifications\",\n icon: \"mynaui:message-dots\",\n },\n {\n key: \"trigger\",\n label: \"Triggers\",\n description: \"Start your workflow automatically\",\n icon: \"mynaui:bolt\",\n },\n];\n","import { useQuery } from \"@apollo/client/react\";\nimport { useContext } from \"react\";\nimport {\n BrowseWorkflowNodesDocument,\n type BrowseWorkflowNodesQuery,\n type BrowseWorkflowNodesQueryVariables,\n} from \"../../generated/global-operations\";\nimport type {\n BrowseStoreInput,\n InputMaybe,\n ProductType,\n PricingModel,\n StoreSortBy,\n} from \"../../generated/global-types\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../config\";\n\nexport interface UseStoreNodesOptions {\n filter?: {\n search?: string;\n type?: string;\n category?: string;\n pricingModel?: string;\n compatibleWith?: string;\n };\n sortBy?: string;\n limit?: number;\n}\n\n/**\n * Hook to browse and search workflow nodes from the global store\n */\nexport function useStoreNodes(options: UseStoreNodesOptions = {}) {\n const client = useGlobalStoreClient();\n\n // Get workspace and organization context\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n const organizationId = context?.organizationId;\n\n const input: BrowseStoreInput = {\n filter: {\n search: options.filter?.search,\n type: (options.filter?.type || \"NODE\") as InputMaybe<ProductType>,\n category: options.filter?.category,\n pricingModel: options.filter?.pricingModel as\n | InputMaybe<PricingModel>\n | undefined,\n // Filter to only nodes compatible with FluidGrids\n compatibleWith: options.filter?.compatibleWith || \"fluidgrids\",\n },\n sortBy: (options.sortBy || \"DOWNLOADS\") as InputMaybe<StoreSortBy>,\n pagination: {\n limit: options.limit || 20,\n offset: 0,\n },\n };\n\n // Build context headers for organization and workspace context\n const contextHeaders: Record<string, string> = {};\n if (organizationId) {\n contextHeaders[\"x-organization-id\"] = organizationId;\n }\n if (workspaceId) {\n contextHeaders[\"x-workspace-id\"] = workspaceId;\n }\n\n const { data, loading, error, fetchMore, refetch } = useQuery<\n BrowseWorkflowNodesQuery,\n BrowseWorkflowNodesQueryVariables\n >(BrowseWorkflowNodesDocument, {\n client,\n variables: { input },\n fetchPolicy: \"cache-and-network\",\n // Pass organization and workspace context to Store service\n context:\n Object.keys(contextHeaders).length > 0\n ? {\n headers: contextHeaders,\n }\n : undefined,\n });\n\n // Debug log\n console.log(\"[useStoreNodes] Hook state:\", {\n input,\n data,\n loading,\n error,\n hasData: !!data,\n hasBrowseStore: !!data?.browseStore,\n hasProducts: !!data?.browseStore?.products,\n productsLength: data?.browseStore?.products?.length,\n });\n\n const handleFetchMore = () => {\n if (!data?.browseStore?.hasMore) return;\n\n fetchMore({\n variables: {\n input: {\n ...input,\n pagination: {\n ...input.pagination,\n cursor: data.browseStore.nextCursor,\n },\n },\n },\n // Pass context headers for pagination too\n context:\n Object.keys(contextHeaders).length > 0\n ? {\n headers: contextHeaders,\n }\n : undefined,\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) return prev;\n\n return {\n ...fetchMoreResult,\n browseStore: {\n ...fetchMoreResult.browseStore,\n products: [\n ...(prev.browseStore?.products || []),\n ...(fetchMoreResult.browseStore?.products || []),\n ],\n },\n };\n },\n });\n };\n\n return {\n products: data?.browseStore?.products || [],\n totalCount: data?.browseStore?.totalCount || 0,\n hasMore: data?.browseStore?.hasMore || false,\n loading,\n error,\n fetchMore: handleFetchMore,\n refetch,\n };\n}\n","import { 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 installedAppIds = new Set(\n installations\n .filter((item: InstallationItem) => item.status === \"ACTIVE\")\n .map((item: InstallationItem) => item.productId),\n );\n\n // Create a map of productId -> installation details for easy lookup\n const installationsMap = new Map(\n installations\n .filter((item: InstallationItem) => item.status === \"ACTIVE\")\n .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 return {\n installations,\n installedAppIds,\n installationsMap,\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\nexport interface RemoveNodeResult {\n success: boolean;\n removedFromWorkflows: string[];\n deactivatedWorkflows: string[];\n cleanedUsageEntries: number;\n}\n\n/**\n * Hook for removing a node from workflows before uninstallation\n * Calls the wspace-workflow-svc GraphQL mutation\n */\nexport const useRemoveNodeFromWorkflows = () => {\n const removeNodeFromWorkflows = useCallback(\n async (\n nodeType: string,\n nodeVersion: string,\n workflowIds: string[],\n ): Promise<RemoveNodeResult> => {\n const client = getFluidGridsClient();\n\n try {\n const result = await client.mutate<\n RemoveNodeFromWorkflowsMutation,\n RemoveNodeFromWorkflowsMutationVariables\n >({\n mutation: RemoveNodeFromWorkflowsDocument,\n variables: {\n nodeType,\n nodeVersion,\n workflowIds,\n },\n });\n\n if (result.error) {\n throw new Error(result.error.message);\n }\n\n const data = result.data?.removeNodeFromWorkflows;\n\n if (!data) {\n throw new Error(\"No data returned from removeNodeFromWorkflows\");\n }\n\n return {\n success: data.success,\n removedFromWorkflows: data.removedFromWorkflows,\n deactivatedWorkflows: data.deactivatedWorkflows,\n cleanedUsageEntries: data.cleanedUsageEntries,\n };\n } catch (err) {\n const error =\n err instanceof Error\n ? err\n : new Error(\"Failed to remove node from workflows\");\n console.error(\"[useRemoveNodeFromWorkflows] Error:\", error);\n throw error;\n }\n },\n [],\n );\n\n return {\n removeNodeFromWorkflows,\n };\n};\n","import { useQuery } from \"@apollo/client/react\";\nimport { useContext, useMemo } from \"react\";\nimport {\n BrowseWorkflowTemplatesDocument,\n type BrowseWorkflowTemplatesQuery,\n type BrowseWorkflowTemplatesQueryVariables,\n} from \"../../generated/global-operations\";\nimport {\n ProductType,\n ProductStatus,\n StoreSortBy,\n type StoreProduct,\n} from \"../../generated/global-types\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../config\";\n\n/**\n * Hook to browse workflow templates from the Store\n *\n * Fetches WORKFLOW type products from the global store service\n * with rich preview data (screenshots, videos, etc.)\n *\n * @param searchTerm - Optional search query\n * @param limit - Number of templates per page (default: 20)\n * @param enabled - Whether to enable the query (default: true). Set to false to skip the query.\n */\nexport function useWorkflowTemplates(\n searchTerm?: string,\n limit = 20,\n enabled = true,\n) {\n const client = useGlobalStoreClient();\n\n // Get workspace and organization context for tenant scoping\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n const organizationId = context?.organizationId;\n\n // Build context headers for organization and workspace context\n const contextHeaders = useMemo(() => {\n const headers: Record<string, string> = {};\n if (organizationId) {\n headers[\"x-organization-id\"] = organizationId;\n }\n if (workspaceId) {\n headers[\"x-workspace-id\"] = workspaceId;\n }\n return headers;\n }, [organizationId, workspaceId]);\n\n // Extract variables builder to avoid duplication\n const buildVariables = (\n offset: number,\n ): BrowseWorkflowTemplatesQueryVariables => ({\n input: {\n filter: {\n type: ProductType.Workflow,\n status: ProductStatus.Published,\n search: searchTerm,\n },\n pagination: {\n limit,\n offset,\n },\n sortBy: searchTerm ? StoreSortBy.Relevance : StoreSortBy.Newest,\n },\n });\n\n const { data, loading, error, fetchMore, refetch } = useQuery<\n BrowseWorkflowTemplatesQuery,\n BrowseWorkflowTemplatesQueryVariables\n >(BrowseWorkflowTemplatesDocument, {\n client,\n variables: buildVariables(0),\n fetchPolicy: \"cache-and-network\",\n // Skip query if not enabled (e.g., when modal is closed)\n skip: !enabled,\n // Pass organization and workspace context to Store service\n context:\n Object.keys(contextHeaders).length > 0\n ? {\n headers: contextHeaders,\n }\n : undefined,\n });\n\n const templates = (data?.browseStore?.products || []) as StoreProduct[];\n const totalCount = data?.browseStore?.totalCount || 0;\n const hasMore = data?.browseStore?.hasMore || false;\n\n const loadMore = () => {\n if (!hasMore || loading) return;\n\n return fetchMore({\n variables: buildVariables(templates.length),\n // Pass context headers for pagination too\n context:\n Object.keys(contextHeaders).length > 0\n ? {\n headers: contextHeaders,\n }\n : undefined,\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) return prev;\n\n return {\n browseStore: {\n ...fetchMoreResult.browseStore,\n products: [\n ...(prev.browseStore?.products || []),\n ...(fetchMoreResult.browseStore?.products || []),\n ],\n },\n };\n },\n });\n };\n\n return {\n templates,\n totalCount,\n hasMore,\n loading,\n error,\n loadMore,\n refetch,\n };\n}\n","import { useState, useCallback, useContext } from \"react\";\nimport { useMutation } from \"@apollo/client/react\";\nimport {\n CreateStoreOrderDocument,\n type CreateStoreOrderMutation,\n type CreateStoreOrderMutationVariables,\n} from \"../../generated/global-operations\";\nimport type {\n CreateStoreOrderInput,\n StoreOrder,\n} from \"../../generated/global-types\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../config\";\n\ninterface CreateOrderResult {\n order?: StoreOrder;\n success: boolean;\n error?: string;\n}\n\n/**\n * Hook to create a store order for paid products\n * This creates a PENDING order that will be completed after payment\n */\nexport function useCreateOrder() {\n const globalClient = useGlobalStoreClient();\n const [creating, setCreating] = useState(false);\n\n // Get organization context if available\n const context = useContext(FluidGridsContext);\n const organizationId = context?.organizationId;\n\n const [createOrderMutation] = useMutation<\n CreateStoreOrderMutation,\n CreateStoreOrderMutationVariables\n >(CreateStoreOrderDocument, {\n client: globalClient,\n // Add organization context to the request if available\n context: organizationId\n ? {\n headers: {\n \"x-organization-id\": organizationId,\n },\n }\n : undefined,\n });\n\n const createOrder = useCallback(\n async (input: CreateStoreOrderInput): Promise<CreateOrderResult> => {\n setCreating(true);\n\n try {\n console.log(\"[useCreateOrder] Creating order with input:\", input);\n\n const result = await createOrderMutation({\n variables: { input },\n });\n\n if (!result.data?.createStoreOrder?.id) {\n throw new Error(\"Failed to create order - no order ID returned\");\n }\n\n const order = result.data.createStoreOrder as StoreOrder;\n\n console.log(\"[useCreateOrder] Order created successfully:\", order);\n\n setCreating(false);\n return {\n order,\n success: true,\n };\n } catch (error) {\n console.error(\"[useCreateOrder] Failed to create order:\", error);\n const errorMessage =\n error instanceof Error ? error.message : \"Failed to create order\";\n\n setCreating(false);\n return {\n success: false,\n error: errorMessage,\n };\n }\n },\n [createOrderMutation],\n );\n\n return {\n createOrder,\n creating,\n };\n}\n","import { useState, useCallback, useContext, 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\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 = 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 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 await globalClient.mutate({\n mutation: RECORD_DOWNLOAD,\n variables: {\n productId: template.id,\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 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 } 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\n// ============================================================================\n// GraphQL Document\n// ============================================================================\n\nconst CREATE_STORE_PRODUCT = gql`\n mutation CreateStoreProduct($input: CreateProductInput!) {\n createProduct(input: $input) {\n id\n slug\n name\n type\n status\n createdAt\n }\n }\n`;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PublishToStoreInput {\n /** The workflow definition to publish as a template */\n workflow: WorkflowDefinition;\n /** Template name (defaults to workflow name) */\n name?: string;\n /** Template description */\n description?: string;\n /** Long description (markdown) */\n longDescription?: string;\n /** Category */\n category?: string;\n /** Tags */\n tags?: string[];\n /** Screenshots URLs */\n screenshots?: string[];\n /** Pricing model */\n pricingModel?: \"FREE\" | \"PAID_ONETIME\" | \"SUBSCRIPTION\";\n /** Price (for paid templates) */\n price?: number;\n /** License type */\n license?: string;\n}\n\ninterface PublishResult {\n success: boolean;\n productId: string | null;\n slug: string | null;\n message: string;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to publish a workflow definition as a template in the store.\n *\n * Extracts the definitionJson, analyzes node types used, builds the\n * WorkflowTemplateContent payload, and creates a StoreProduct via\n * the global gateway.\n */\nexport function usePublishToStore() {\n const [publishing, setPublishing] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const globalClient = useGlobalStoreClient();\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n\n /**\n * Extract the node types used in a workflow's definitionJson.\n * Scans the nodes array and returns unique node type entries.\n */\n const extractRequiredNodeTypes = useCallback(\n (\n definitionJson: Record<string, unknown>,\n ): WorkflowTemplateContent[\"requiredNodeTypes\"] => {\n const nodes =\n (\n definitionJson as {\n nodes?: Array<{ type?: string; data?: { nodeType?: string } }>;\n }\n ).nodes || [];\n const seen = new Set<string>();\n const result: WorkflowTemplateContent[\"requiredNodeTypes\"] = [];\n\n for (const node of nodes) {\n const nodeType = node.data?.nodeType || node.type || \"unknown\";\n if (!seen.has(nodeType)) {\n seen.add(nodeType);\n result.push({\n nodeType,\n nodeVersion: \"1.0\",\n publishType:\n nodeType.startsWith(\"internal:\") ||\n nodeType.startsWith(\"trigger:\")\n ? \"BUILTIN\"\n : \"STORE\",\n displayName: nodeType\n .replace(/^(internal:|trigger:)/, \"\")\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase()),\n });\n }\n }\n\n return result;\n },\n [],\n );\n\n /**\n * Publish a workflow definition as a store template.\n */\n const publishToStore = useCallback(\n async (input: PublishToStoreInput): Promise<PublishResult> => {\n setPublishing(true);\n setError(null);\n\n try {\n const { workflow } = input;\n const definitionJson = workflow.definitionJson as Record<\n string,\n unknown\n >;\n\n // Build the WorkflowTemplateContent payload\n const templateContent: WorkflowTemplateContent = {\n definitionJson:\n definitionJson as WorkflowTemplateContent[\"definitionJson\"],\n requiredNodeTypes: extractRequiredNodeTypes(definitionJson),\n defaultWorkflowName: input.name || workflow.name,\n defaultCategory: input.category || workflow.category || undefined,\n defaultTags: input.tags || workflow.tags || [],\n difficultyLevel: \"medium\",\n };\n\n // Create the store product\n const result = await globalClient.mutate({\n mutation: CREATE_STORE_PRODUCT,\n variables: {\n input: {\n name: input.name || workflow.name,\n description: input.description || workflow.description || \"\",\n longDescription: input.longDescription,\n type: \"WORKFLOW\",\n pricingModel: input.pricingModel || \"FREE\",\n price: input.price || 0,\n category: input.category || workflow.category,\n tags: input.tags || workflow.tags || [],\n screenshots: input.screenshots || [],\n content: templateContent,\n compatibleProducts: [\"fluidgrids\"],\n license: input.license || \"MIT\",\n manifestVersion: \"1.0\",\n },\n },\n });\n\n const data = result.data as\n | {\n createProduct?: { id: string; slug: string; name: string };\n }\n | undefined;\n const product = data?.createProduct;\n if (!product) {\n throw new Error(\"Failed to create store product\");\n }\n\n return {\n success: true,\n productId: product.id,\n slug: product.slug,\n message: `Template \"${product.name}\" submitted to the store`,\n };\n } catch (err) {\n const publishError =\n err instanceof Error ? err : new Error(\"Failed to publish to store\");\n setError(publishError);\n return {\n success: false,\n productId: null,\n slug: null,\n message: publishError.message,\n };\n } finally {\n setPublishing(false);\n }\n },\n [globalClient, extractRequiredNodeTypes],\n );\n\n return {\n publishToStore,\n publishing,\n error,\n };\n}\n","import { AVAILABLE_NODES } from \"../blocks\";\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 const isRegistryBacked =\n !!nodeType &&\n AVAILABLE_NODES.some((availableNode) => availableNode.type === nodeType);\n const isPrebuilt = !isInstalled && (isInternalBuiltin || isRegistryBacked);\n\n return {\n nodeType,\n isPrebuilt,\n isDraggable: !!nodeType && (isInstalled || isPrebuilt),\n };\n}\n","export const NODE_TYPE_DRAG_DATA_FORMAT = \"application/flow-builder.node-type\";\n\n/**\n * Optional companion to NODE_TYPE_DRAG_DATA_FORMAT: carries the operation name\n * a node instance should be pinned to when dropped. Set by the Node Store\n * operation rows so a dragged operation lands on the canvas already configured\n * (no on-card operation dropdown). Absent for built-in / control-flow drags.\n */\nexport const NODE_OPERATION_DRAG_DATA_FORMAT =\n \"application/flow-builder.node-operation\";\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 /** 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 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=\"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 {hasUpdate && (\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 && (\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 && (\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 { 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\";\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\nexport function StoreCategoryList({\n searchTerm,\n onSearchChange,\n onSelectCategory,\n onSelectNode,\n}: StoreCategoryListProps) {\n const isSearching = searchTerm.trim().length > 0;\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 } = useInstalledNodes();\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) => onSearchChange(e.target.value)}\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 */\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 No nodes found for &ldquo;{searchTerm}&rdquo;\n </p>\n </div>\n ) : (\n <>\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground font-medium\">\n {products.length} result{products.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 </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 ) : (\n /* 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-md hover:bg-muted/60 transition-colors text-left group\"\n >\n <div className=\"size-9 shrink-0 rounded-lg bg-muted flex items-center justify-center\">\n <Icon icon={cat.icon} className=\"size-5 text-primary\" />\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\"\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 * 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 const operations = (config?.operations ?? []) as StoreOperation[];\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:bolt\"}\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 { StoreProduct } from \"../../../../../../../generated/global-types\";\nimport type {\n WorkflowTemplateContent,\n TemplateNodeCheckResult,\n} from \"../../../../../../../types/workflow-template-content\";\nimport { useInstalledNodes } from \"../../../../../../../hooks/store/useInstalledNodes\";\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 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 (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 = await client.mutate({\n mutation: IMPORT_MUTATION,\n variables: {\n input: {\n definitionJson,\n name:\n overrides?.name || content.defaultWorkflowName || template.name,\n description: template.description,\n sourceTemplateId: template.id,\n sourceTemplateName: template.name,\n tags: content.defaultTags || template.tags || [],\n category:\n content.defaultCategory || template.category || undefined,\n icon: template.icon || undefined,\n context: {\n ...(config.productId ? { productId: config.productId } : {}),\n ...(config.productName\n ? { productName: config.productName }\n : {}),\n },\n },\n },\n });\n\n toast.dismiss(\"template-import\");\n\n const importData = result.data as\n | {\n importWorkflowTemplate?: {\n success: boolean;\n message?: string;\n workflow?: {\n name: string;\n workflowKey: string;\n version: string;\n };\n };\n }\n | undefined;\n const importResult = importData?.importWorkflowTemplate;\n if (importResult?.success && importResult.workflow) {\n // 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 await storeClient.mutate({\n mutation: InstallWorkflowNodeDocument,\n variables: {\n input: {\n productId: template.id,\n workspaceId: config.workspaceId,\n organizationId: config.tenantId,\n version: template.manifestVersion || \"1.0.0\",\n manifest: template.manifest,\n metadata: {\n type: \"WORKFLOW\",\n sourceTemplateId: template.id,\n sourceTemplateName: template.name,\n importedWorkflowKey: importResult.workflow.workflowKey,\n importedWorkflowVersion: importResult.workflow.version,\n },\n },\n },\n });\n }\n } catch {\n // Best-effort: don't fail import if installation recording fails\n console.warn(\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\n const content = fullTemplate.content as WorkflowTemplateContent | null;\n if (!content?.definitionJson) {\n toast.error(\"Template does not contain valid workflow data\");\n return;\n }\n\n // Check 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\">\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 &apos;Is True&apos; / &apos;Is False&apos;\n </span>\n );\n case \"string\":\n default:\n return (\n <Input\n type=\"text\"\n placeholder=\"Value\"\n value={typeof value === \"boolean\" ? String(value) : (value ?? \"\")}\n onChange={(e) => handleUpdate({ value: e.target.value })}\n className=\"w-full flex-grow\"\n />\n );\n }\n };\n\n return (\n <Card className=\"overflow-hidden border-muted-foreground/20 shadow-sm transition-all hover:shadow-md\">\n <CardContent className=\"p-3\">\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2\">\n {/* Field Selector */}\n <div className=\"w-full sm:w-[30%]\">\n <Select\n value={field}\n onValueChange={(val) =>\n handleUpdate({ field: val, operator: \"\", value: \"\" })\n }\n >\n <SelectTrigger className=\"h-9\">\n <SelectValue placeholder=\"Select field\" />\n </SelectTrigger>\n <SelectContent className=\"max-h-[300px] z-[100000]\">\n {parsedFields.map((f) => (\n <SelectItem key={f.path} value={f.path}>\n <div className=\"flex items-center gap-2 w-full\">\n <span className=\"overflow-visible whitespace-normal break-words\">\n {f.path}\n </span>\n <Badge\n variant=\"outline\"\n className=\"ml-auto shrink-0 text-xs\"\n >\n {f.type}\n </Badge>\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Operator Selector */}\n <div className=\"w-full sm:w-[25%]\">\n <Select\n value={operator}\n onValueChange={(val) =>\n handleUpdate({ operator: val, value: \"\" })\n }\n disabled={!field}\n >\n <SelectTrigger className=\"h-9\">\n <SelectValue placeholder=\"Operator\" />\n </SelectTrigger>\n <SelectContent className=\"z-[100000]\">\n {availableOperators.map((op) => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Value Input */}\n <div\n className={`w-full ${needsValue ? \"sm:w-[35%]\" : \"sm:w-[25%]\"} flex items-center`}\n >\n {renderValueInputForRule()}\n {!needsValue && operator && (\n <span className=\"text-sm text-muted-foreground italic p-2\">\n No value needed\n </span>\n )}\n </div>\n\n {/* Action Buttons */}\n <div className=\"w-full sm:w-[10%] flex justify-end sm:justify-center gap-1\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleDuplicate}\n className=\"h-8 w-8\"\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Duplicate rule</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleRemove}\n className=\"h-8 w-8 text-destructive hover:text-destructive/90 hover:bg-destructive/10\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Remove rule</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n }\n\n // Group Rendering Logic\n if (node.type === \"group\") {\n const { combinator, children } = node;\n const isRoot = path.length === 1 && path[0] === \"root\";\n const hasChildren = children.length > 0;\n\n const handleCombinatorChange = (value: \"AND\" | \"OR\") => {\n handleUpdate({ combinator: value });\n };\n\n const handleAddRuleClick = () => onAddRule(node.id);\n const handleAddGroupClick = () => onAddGroup(node.id);\n const toggleExpanded = () => setIsExpanded(!isExpanded);\n\n // Calculate background color based on nesting level for visual hierarchy\n const getBgColor = () => {\n if (isRoot) return \"bg-background\";\n\n // Alternate between subtle background colors based on nesting level\n return level % 2 === 0 ? \"bg-muted/30\" : \"bg-background\";\n };\n\n return (\n <div\n className={`rounded-lg border ${isRoot ? \"border-primary/30\" : \"border-muted-foreground/20\"} ${getBgColor()} transition-all`}\n >\n <div className=\"p-3\">\n {/* Group Header */}\n <div className=\"flex items-center gap-2 mb-2\">\n {/* Expand/Collapse Button */}\n {hasChildren && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={toggleExpanded}\n className=\"h-7 w-7 p-0\"\n >\n {isExpanded ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : (\n <ChevronRight className=\"h-4 w-4\" />\n )}\n </Button>\n )}\n\n {/* Group Title */}\n <div className=\"flex items-center\">\n <Badge\n variant={combinator === \"AND\" ? \"default\" : \"secondary\"}\n className=\"mr-2 px-2 py-0.5 text-xs font-medium\"\n >\n {combinator}\n </Badge>\n\n <Select value={combinator} onValueChange={handleCombinatorChange}>\n <SelectTrigger className=\"w-[80px] h-7 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"AND\">AND</SelectItem>\n <SelectItem value=\"OR\">OR</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Group Actions */}\n <div className=\"flex items-center gap-1 ml-auto\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n onClick={handleAddRuleClick}\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n >\n <Plus className=\"mr-1 h-3 w-3\" /> Rule\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Add a new rule</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n onClick={handleAddGroupClick}\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n >\n <Layers className=\"mr-1 h-3 w-3\" /> Group\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Add a nested group</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n {!isRoot && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleRemove}\n className=\"h-7 w-7 text-destructive hover:text-destructive/90 hover:bg-destructive/10\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Remove group</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </div>\n\n {/* Children Area */}\n {isExpanded && (\n <div\n className={`space-y-3 mt-3 ${!isRoot ? \"pl-4 border-l-2 border-muted/50\" : \"\"}`}\n >\n {children.length === 0 && (\n <div className=\"flex items-center gap-2 p-3 text-sm text-muted-foreground bg-muted/20 rounded-md\">\n <AlertCircle className=\"h-4 w-4\" />\n <p>Group is empty. Add a rule or group to get started.</p>\n </div>\n )}\n\n {children.map((childNode) => (\n <ConditionNodeDisplay\n key={childNode.id}\n node={childNode}\n path={[...path, childNode.id]}\n fieldMap={fieldMap}\n parsedFields={parsedFields}\n onUpdateNode={onUpdateNode}\n onRemoveNode={onRemoveNode}\n onAddRule={onAddRule}\n onAddGroup={onAddGroup}\n onDuplicateNode={onDuplicateNode}\n level={level + 1}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n }\n\n return null;\n};\n\n// Main Condition Builder Component\nconst ConditionBuilder: React.FC<ConditionBuilderProps> = ({\n outputSchema,\n initialCondition,\n onConditionChange,\n predefinedFields,\n}) => {\n // State holds the entire condition tree, starting with a root group\n const [conditionTree, setConditionTree] = useState<GroupNode>(\n () => initialCondition || createEmptyGroup(\"root\"),\n );\n\n const [showDebug, setShowDebug] = useState(false);\n\n // Use predefined fields if provided, otherwise parse from schema\n const parsedFields = useMemo(() => {\n if (predefinedFields && predefinedFields.length > 0) {\n return predefinedFields;\n }\n return parseSchema(outputSchema);\n }, [outputSchema, predefinedFields]);\n\n const fieldMap = useMemo(() => {\n return new Map(parsedFields.map((f) => [f.path, f.type]));\n }, [parsedFields]);\n\n // Effect to notify parent component of changes\n useEffect(() => {\n onConditionChange(conditionTree);\n }, [conditionTree, onConditionChange]);\n\n // Top-Level Callback Handlers\n const handleUpdateNode = useCallback(\n (nodeId: string, updates: Partial<RuleNode> | Partial<GroupNode>) => {\n setConditionTree((prevTree) => {\n const updatedTree = findAndModifyNode(prevTree, nodeId, (node) => {\n // Important: Extract only the updatable fields, excluding 'type' and 'id'\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const validUpdates: Record<string, any> = {};\n if (\"field\" in updates)\n validUpdates.field = (updates as Partial<RuleNode>).field;\n if (\"operator\" in updates)\n validUpdates.operator = (updates as Partial<RuleNode>).operator;\n if (\"value\" in updates)\n validUpdates.value = (updates as Partial<RuleNode>).value;\n if (\"combinator\" in updates)\n validUpdates.combinator = (\n updates as Partial<GroupNode>\n ).combinator;\n if (\"children\" in updates)\n validUpdates.children = (updates as Partial<GroupNode>).children;\n return { ...node, ...validUpdates };\n });\n return updatedTree as GroupNode;\n });\n },\n [],\n );\n\n const handleRemoveNode = useCallback((id: string) => {\n if (id === \"root\") {\n console.warn(\"Cannot remove the root node.\");\n return;\n }\n setConditionTree((prevTree) => {\n const updatedTree = findAndModifyNode(prevTree, id, () => null);\n return updatedTree as GroupNode;\n });\n }, []);\n\n const handleAddRule = useCallback((parentId: string) => {\n const newRule = createEmptyRule();\n setConditionTree(\n (prevTree) => findAndAddNode(prevTree, parentId, newRule) as GroupNode,\n );\n }, []);\n\n const handleAddGroup = useCallback((parentId: string) => {\n const newGroup = createEmptyGroup();\n setConditionTree(\n (prevTree) => findAndAddNode(prevTree, parentId, newGroup) as GroupNode,\n );\n }, []);\n\n const handleDuplicateNode = useCallback((id: string) => {\n setConditionTree((prevTree) => {\n // First find the node to duplicate\n let nodeToDuplicate: ConditionNode | null = null;\n\n findAndModifyNode(prevTree, id, (node) => {\n nodeToDuplicate = JSON.parse(JSON.stringify(node)); // Deep clone\n return node; // Return original, we're just reading\n });\n\n if (!nodeToDuplicate) return prevTree;\n\n // Find the parent to add the duplicate to\n const findParent = (\n node: ConditionNode,\n targetId: string,\n ): string | null => {\n if (node.type === \"group\") {\n for (const child of node.children) {\n if (child.id === targetId) {\n return node.id;\n }\n const result = findParent(child, targetId);\n if (result) return result;\n }\n }\n return null;\n };\n\n const parentId = findParent(prevTree, id) || \"root\";\n\n // Create a new duplicate with new IDs\n const assignNewIds = (node: ConditionNode): ConditionNode => {\n const newId = generateId();\n if (node.type === \"rule\") {\n return { ...node, id: newId };\n } else {\n return {\n ...node,\n id: newId,\n children: node.children.map((child) => assignNewIds(child)),\n };\n }\n };\n\n const duplicateWithNewIds = assignNewIds(nodeToDuplicate);\n\n // Add the duplicate to the parent\n return findAndAddNode(\n prevTree,\n parentId,\n duplicateWithNewIds,\n ) as GroupNode;\n });\n }, []);\n\n const handleCopyToClipboard = useCallback(() => {\n navigator.clipboard\n .writeText(JSON.stringify(conditionTree, null, 2))\n .then(() => {\n toast.info(\"Condition tree copied to clipboard!\");\n })\n .catch((err) => {\n console.error(\"Failed to copy: \", err);\n });\n }, [conditionTree]);\n\n return (\n <div className=\"space-y-4 p-4 bg-background border rounded-lg shadow-sm\">\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-lg font-semibold\">Condition Builder</h2>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\">\n <Info className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-sm\">\n <p>\n Build complex query conditions by adding rules and groups.\n Rules are individual conditions, while groups combine multiple\n conditions with AND/OR logic.\n </p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowDebug(!showDebug)}\n className=\"text-xs\"\n >\n {showDebug ? \"Hide JSON\" : \"Show JSON\"}\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleCopyToClipboard}\n className=\"text-xs\"\n >\n <Copy className=\"h-3 w-3 mr-1\" /> Copy JSON\n </Button>\n </div>\n </div>\n\n {/* Main Builder Area */}\n <div className=\"relative\">\n <ScrollArea className=\"max-h-[600px] pr-4\">\n <ConditionNodeDisplay\n node={conditionTree}\n path={[\"root\"]}\n fieldMap={fieldMap}\n parsedFields={parsedFields}\n onUpdateNode={handleUpdateNode}\n onRemoveNode={handleRemoveNode}\n onAddRule={handleAddRule}\n onAddGroup={handleAddGroup}\n onDuplicateNode={handleDuplicateNode}\n level={0}\n />\n </ScrollArea>\n </div>\n\n {/* Debug Output */}\n {showDebug && (\n <div className=\"mt-6 border-t pt-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <Label className=\"text-sm font-medium\">Condition Tree JSON:</Label>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCopyToClipboard}\n className=\"h-7 text-xs\"\n >\n <Copy className=\"h-3 w-3 mr-1\" /> Copy\n </Button>\n </div>\n <div className=\"relative\">\n <ScrollArea className=\"h-[200px]\">\n <pre className=\"p-4 bg-muted rounded-md text-xs font-mono\">\n <code>{JSON.stringify(conditionTree, null, 2)}</code>\n </pre>\n </ScrollArea>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default ConditionBuilder;\n","import { useMemo, useEffect } from \"react\";\nimport ConditionBuilder, { type GroupNode } from \"./custom-condition-edge\";\nimport { AlertCircle } from \"lucide-react\";\n\n// Inline Alert components (not available in fe-libs)\nconst Alert = ({\n children,\n variant,\n className,\n}: {\n children: React.ReactNode;\n variant?: string;\n className?: string;\n}) => (\n <div\n className={`relative w-full rounded-lg border p-4 ${variant === \"destructive\" ? \"border-destructive/50 text-destructive bg-destructive/10\" : \"border-border\"} ${className || \"\"}`}\n >\n <div className=\"flex gap-3\">{children}</div>\n </div>\n);\nconst AlertTitle = ({ children }: { children: React.ReactNode }) => (\n <h5 className=\"mb-1 font-medium leading-none tracking-tight\">{children}</h5>\n);\nconst AlertDescription = ({ children }: { children: React.ReactNode }) => (\n <div className=\"text-sm opacity-90\">{children}</div>\n);\n\n// GraphQL schema type definitions\ninterface GraphQLField {\n path: string;\n type: string;\n}\n\ninterface GraphQLFieldDefinition {\n type: string;\n description?: string;\n args?: GraphQLArgumentDefinition[];\n isList?: boolean;\n isNonNull?: boolean;\n}\n\ninterface GraphQLArgumentDefinition {\n name: string;\n type: string;\n description?: string;\n}\n\ninterface GraphQLTypeDefinition {\n name: string;\n kind: \"scalar\" | \"type\" | \"enum\" | \"input\" | \"interface\" | \"union\";\n fields?: Record<string, GraphQLFieldDefinition>;\n description?: string;\n}\n\ninterface GraphQLIntrospectionData {\n queryType: string;\n mutationType?: string;\n types: Record<string, GraphQLTypeDefinition>;\n}\n\ninterface SchemaProperty {\n type: string;\n description?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n}\n\ninterface BuiltSchema {\n type: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n}\n\ninterface GraphQLConditionBuilderProps {\n introspectionData: GraphQLIntrospectionData | null;\n operationName: string;\n initialCondition: GroupNode | null;\n onConditionChange: (condition: GroupNode) => void;\n}\n\n// Helper functions moved outside component to avoid \"accessed before declared\" issues\n\n// Find a type in the schema by name\nconst findTypeInSchema = (\n types: Record<string, GraphQLTypeDefinition>,\n typeName: string,\n): GraphQLTypeDefinition | undefined => {\n return types[typeName];\n};\n\n// Map GraphQL scalar types to JSON schema types\nconst mapGraphQLTypeToJSONType = (graphqlType: string): string => {\n const typeMap: Record<string, string> = {\n String: \"string\",\n Int: \"integer\",\n Float: \"number\",\n Boolean: \"boolean\",\n ID: \"string\",\n };\n\n return typeMap[graphqlType] || \"string\";\n};\n\n// Extract all fields from the schema\nconst extractFields = (schemaToExtract: BuiltSchema): GraphQLField[] => {\n const extractedFields: GraphQLField[] = [];\n\n const processObject = (obj: SchemaProperty | BuiltSchema, path = \"\") => {\n if (!obj || typeof obj !== \"object\") return;\n\n // Add the current object if it has a type\n if (obj.type) {\n extractedFields.push({ path, type: obj.type });\n }\n\n // Process properties for objects\n if (obj.type === \"object\" && obj.properties) {\n Object.keys(obj.properties).forEach((key) => {\n const newPath = path ? `${path}.${key}` : key;\n const property = obj.properties![key];\n\n // Add the property\n extractedFields.push({ path: newPath, type: property.type });\n\n // Recursively process nested objects\n if (property.type === \"object\" && property.properties) {\n processObject(property, newPath);\n }\n\n // Process array items\n if (property.type === \"array\" && property.items) {\n // Add array field\n extractedFields.push({ path: newPath, type: \"array\" });\n\n // Process array items if they're objects\n if (property.items.type === \"object\" && property.items.properties) {\n Object.keys(property.items.properties).forEach((itemKey) => {\n const itemPath = `${newPath}.${itemKey}`;\n const itemProperty = property.items!.properties![itemKey];\n\n // Add the item field\n extractedFields.push({ path: itemPath, type: itemProperty.type });\n\n // Recursively process nested objects in array items\n if (itemProperty.type === \"object\" && itemProperty.properties) {\n processObject(itemProperty, itemPath);\n }\n });\n }\n }\n });\n }\n };\n\n processObject(schemaToExtract);\n\n // Sort fields by path for better organization\n extractedFields.sort((a, b) => a.path.localeCompare(b.path));\n\n // Remove duplicates and empty paths\n return extractedFields.filter(\n (field, index, self) =>\n field.path && self.findIndex((f) => f.path === field.path) === index,\n );\n};\n\n// Build schema for operation\nconst buildSchemaForOperation = (\n types: Record<string, GraphQLTypeDefinition>,\n typeObj: GraphQLTypeDefinition,\n): BuiltSchema => {\n // Create a hardcoded schema specifically for the GmailSearchResult\n // This ensures we have all the nested fields properly defined\n if (typeObj.name === \"GmailSearchResult\") {\n return {\n type: \"object\",\n properties: {\n emails: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n metadata: {\n type: \"object\",\n properties: {\n id: { type: \"string\" },\n threadId: { type: \"string\" },\n subject: { type: \"string\" },\n from: { type: \"string\" },\n to: { type: \"string\" },\n date: { type: \"string\" },\n labels: { type: \"array\", items: { type: \"string\" } },\n },\n },\n snippet: { type: \"string\" },\n body: { type: \"string\" },\n error: { type: \"string\" },\n },\n },\n },\n error: { type: \"string\" },\n },\n };\n }\n\n // Add a special case for GmailBatchActionResult in the buildSchemaForOperation function\n if (typeObj.name === \"GmailBatchActionResult\") {\n return {\n type: \"object\",\n properties: {\n succeededIds: {\n type: \"array\",\n items: { type: \"string\" },\n },\n failedItems: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n messageId: { type: \"string\" },\n error: { type: \"string\" },\n },\n },\n },\n },\n };\n }\n\n // For other types, use a generic approach\n const builtSchema: BuiltSchema = {\n type: \"object\",\n properties: {},\n };\n\n // Helper function to recursively build schema for nested types\n const buildNestedSchema = (\n nestedTypeObj: GraphQLTypeDefinition,\n ): SchemaProperty => {\n if (!nestedTypeObj) return { type: \"string\" };\n\n const result: SchemaProperty = {\n type:\n nestedTypeObj.kind === \"scalar\"\n ? mapGraphQLTypeToJSONType(nestedTypeObj.name)\n : \"object\",\n };\n\n // For result types, we need to build a schema for each field\n if (nestedTypeObj.kind === \"type\" && nestedTypeObj.fields) {\n result.properties = {};\n\n Object.keys(nestedTypeObj.fields).forEach((fieldName) => {\n const field = nestedTypeObj.fields![fieldName];\n const fieldType = field.type;\n const fieldTypeObj = findTypeInSchema(types, fieldType);\n\n if (!fieldTypeObj) return;\n\n if (fieldTypeObj.kind === \"scalar\") {\n // Handle scalar types\n result.properties![fieldName] = {\n type: mapGraphQLTypeToJSONType(fieldTypeObj.name),\n description: field.description || \"\",\n };\n } else if (fieldTypeObj.kind === \"type\" && field.isList) {\n // Handle lists of objects\n result.properties![fieldName] = {\n type: \"array\",\n description: field.description || \"\",\n items: buildNestedSchema(fieldTypeObj),\n };\n } else if (fieldTypeObj.kind === \"type\") {\n // Handle nested objects\n result.properties![fieldName] = buildNestedSchema(fieldTypeObj);\n }\n });\n }\n\n return result;\n };\n\n // Process each field in the result type\n if (typeObj.kind === \"type\" && typeObj.fields) {\n Object.keys(typeObj.fields).forEach((fieldName) => {\n const field = typeObj.fields![fieldName];\n const fieldType = field.type;\n const fieldTypeObj = findTypeInSchema(types, fieldType);\n\n if (!fieldTypeObj) return;\n\n if (fieldTypeObj.kind === \"scalar\") {\n // Handle scalar types\n builtSchema.properties![fieldName] = {\n type: mapGraphQLTypeToJSONType(fieldTypeObj.name),\n description: field.description || \"\",\n };\n } else if (field.isList) {\n // Handle lists\n builtSchema.properties![fieldName] = {\n type: \"array\",\n items: buildNestedSchema(fieldTypeObj),\n };\n } else if (fieldTypeObj.kind === \"type\") {\n // Handle regular objects\n builtSchema.properties![fieldName] = buildNestedSchema(fieldTypeObj);\n }\n });\n }\n\n return builtSchema;\n};\n\n// Result type for schema building\ninterface SchemaResult {\n schema: BuiltSchema | null;\n fields: GraphQLField[];\n error: string | null;\n}\n\nconst GraphQLConditionBuilder = ({\n introspectionData,\n operationName,\n initialCondition,\n onConditionChange,\n}: GraphQLConditionBuilderProps) => {\n // Build schema synchronously using useMemo\n const { schema, fields, error } = useMemo<SchemaResult>(() => {\n try {\n if (!introspectionData || !operationName) {\n return { schema: null, fields: [], error: null };\n }\n\n // Check if the operation is a query or mutation\n const queryType = introspectionData.queryType;\n const mutationType = introspectionData.mutationType;\n const queryTypeObj = introspectionData.types[queryType];\n const mutationTypeObj = mutationType\n ? introspectionData.types[mutationType]\n : undefined;\n\n // First check if it's a query operation\n if (\n queryTypeObj &&\n queryTypeObj.fields &&\n queryTypeObj.fields[operationName]\n ) {\n const operation = queryTypeObj.fields[operationName];\n const returnType = operation.type;\n const returnTypeObj = findTypeInSchema(\n introspectionData.types,\n returnType,\n );\n\n if (!returnTypeObj) {\n return {\n schema: null,\n fields: [],\n error: `Return type \"${returnType}\" not found in schema`,\n };\n }\n\n // Build schema for the condition builder\n const builtSchema = buildSchemaForOperation(\n introspectionData.types,\n returnTypeObj,\n );\n\n // Extract all fields from the schema\n const extractedFields = extractFields(builtSchema);\n\n return { schema: builtSchema, fields: extractedFields, error: null };\n }\n\n // If not found in queries, check if it's a mutation operation\n if (\n mutationTypeObj &&\n mutationTypeObj.fields &&\n mutationTypeObj.fields[operationName]\n ) {\n const operation = mutationTypeObj.fields[operationName];\n const returnType = operation.type;\n const returnTypeObj = findTypeInSchema(\n introspectionData.types,\n returnType,\n );\n\n if (!returnTypeObj) {\n return {\n schema: null,\n fields: [],\n error: `Return type \"${returnType}\" not found in schema`,\n };\n }\n\n // Build schema for the condition builder\n const builtSchema = buildSchemaForOperation(\n introspectionData.types,\n returnTypeObj,\n );\n\n // Extract all fields from the schema\n const extractedFields = extractFields(builtSchema);\n\n return { schema: builtSchema, fields: extractedFields, error: null };\n }\n\n // If we get here, the operation wasn't found in either queries or mutations\n return {\n schema: null,\n fields: [],\n error: `Operation \"${operationName}\" not found in schema`,\n };\n } catch (err) {\n console.error(\"Error building schema:\", err);\n return {\n schema: null,\n fields: [],\n error: \"Failed to build schema from introspection data\",\n };\n }\n }, [introspectionData, operationName]);\n\n // Debug logging for schema and fields\n useEffect(() => {\n if (schema) {\n }\n }, [schema, fields]);\n\n if (error) {\n return (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n );\n }\n\n if (!schema) {\n return <div>Loading schema...</div>;\n }\n\n return (\n <ConditionBuilder\n outputSchema={schema}\n initialCondition={initialCondition}\n onConditionChange={onConditionChange}\n predefinedFields={fields}\n />\n );\n};\n\nexport default GraphQLConditionBuilder;\n","// Type for rule values (primitives that can be used in conditions)\ntype RuleValue = string | number | boolean | null;\n\ntype RuleNode = {\n id: string;\n type: \"rule\";\n field: string;\n operator: string;\n value: RuleValue;\n};\n\ntype GroupNode = {\n id: string;\n type: \"group\";\n combinator: \"AND\" | \"OR\";\n children: (RuleNode | GroupNode)[];\n};\n\nexport function buildConditionString(conditionJson: GroupNode): string {\n const getFallback = (operator: string, isLast: boolean): string => {\n if (!isLast) return \"{}\";\n if (operator === \"contains\") return `''`;\n return \"0\";\n };\n\n // Update the parseField function to better handle nested fields\n const parseField = (field: string, operator: string): string => {\n const parts = field.split(\".\");\n\n // Special handling for array fields (like emails.metadata.id)\n if (parts[0] === \"emails\" && parts.length > 1) {\n // For array fields, we need to use array methods\n const arrayPath = parts[0];\n const remainingPath = parts.slice(1).join(\".\");\n\n // For array operations, we'll use .find() or .some() depending on the operator\n if (operator === \"contains\" || operator === \"==\") {\n return `output.${arrayPath}.some(item => item.${remainingPath})`;\n } else if (operator === \"!=\" || operator === \"isNotNull\") {\n return `output.${arrayPath}.some(item => item.${remainingPath})`;\n } else {\n // For other operators, we'll use the first item that matches\n return `output.${arrayPath}[0]?.${remainingPath}`;\n }\n }\n\n // Standard handling for non-array fields\n const chain = parts.map((key, i) => {\n const isLast = i === parts.length - 1;\n const fallback = getFallback(operator, isLast);\n return `.get('${key}', ${fallback})`;\n });\n return `output${chain.join(\"\")}`;\n };\n\n // Update the parseRule function to handle array fields\n const parseRule = (rule: RuleNode): string => {\n const { field, operator, value } = rule;\n const parts = field.split(\".\");\n\n // Special handling for array fields (like emails.metadata.id)\n if (parts[0] === \"emails\" && parts.length > 1) {\n const remainingPath = parts.slice(1).join(\".\");\n const stringValue = typeof value === \"string\" ? `'${value}'` : value;\n\n if (operator === \"contains\") {\n return `output.emails.some(item => item.${remainingPath}?.includes(${stringValue}))`;\n } else if (operator === \"==\") {\n return `output.emails.some(item => item.${remainingPath} === ${stringValue})`;\n } else if (operator === \"!=\") {\n return `output.emails.some(item => item.${remainingPath} !== ${stringValue})`;\n } else if (operator === \">\") {\n return `output.emails.some(item => item.${remainingPath} > ${stringValue})`;\n } else if (operator === \">=\") {\n return `output.emails.some(item => item.${remainingPath} >= ${stringValue})`;\n } else if (operator === \"<\") {\n return `output.emails.some(item => item.${remainingPath} < ${stringValue})`;\n } else if (operator === \"<=\") {\n return `output.emails.some(item => item.${remainingPath} <= ${stringValue})`;\n } else if (operator === \"isNull\") {\n return `output.emails.some(item => item.${remainingPath} === null || item.${remainingPath} === undefined)`;\n } else if (operator === \"isNotNull\") {\n return `output.emails.some(item => item.${remainingPath} !== null && item.${remainingPath} !== undefined)`;\n } else if (operator === \"hasProperty\") {\n return `output.emails.some(item => '${value}' in item.${remainingPath})`;\n }\n }\n\n // Standard handling for non-array fields\n const fieldStr = parseField(field, operator);\n const stringValue = typeof value === \"string\" ? `'${value}'` : value;\n\n const opMap: Record<string, string> = {\n contains: \"includes\",\n \"==\": \"==\",\n \"!=\": \"!=\",\n \">\": \">\",\n \"<\": \"<\",\n \">=\": \">=\",\n \"<=\": \"<=\",\n hasProperty: \"hasProperty\",\n };\n\n if (operator === \"contains\") {\n return `${fieldStr}.includes(${stringValue})`;\n } else if (operator === \"hasProperty\") {\n const fieldParts = field.split(\".\");\n const baseChain = fieldParts\n .map((part) => `.get('${part}', {})`)\n .join(\"\");\n return `'${value}' in output${baseChain}`;\n } else {\n return `${fieldStr} ${opMap[operator] ?? operator} ${stringValue}`;\n }\n };\n\n const parseGroup = (group: GroupNode): string => {\n const combinator = group.combinator.toLowerCase();\n const conditions = group.children.map((child) => {\n if (child.type === \"rule\") {\n return parseRule(child);\n } else {\n return `(${parseGroup(child)})`;\n }\n });\n return conditions.join(` ${combinator} `);\n };\n\n return parseGroup(conditionJson);\n}\n","import { useState, useEffect, useMemo } from \"react\";\nimport GraphQLConditionBuilder from \"./graphql-condition-builder\";\nimport { buildConditionString } from \"./custom-condition-tree-converter\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@burdenoff/fe-libs/ui\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@burdenoff/fe-libs/ui\";\nimport { ScrollArea } from \"@burdenoff/fe-libs/ui\";\nimport { AlertCircle } from \"lucide-react\";\nimport { useReactFlow, type Edge } from \"@xyflow/react\";\nimport type { GraphQLSchema } from \"../../../../lib/types\";\nimport type { GroupNode } from \"./custom-condition-edge\";\n\n// GraphQL introspection data structure expected by GraphQLConditionBuilder\ninterface GraphQLIntrospectionData {\n queryType: string;\n mutationType?: string;\n types: Record<\n string,\n {\n name: string;\n kind: \"scalar\" | \"type\" | \"enum\" | \"input\" | \"interface\" | \"union\";\n fields?: Record<\n string,\n {\n type: string;\n description?: string;\n args?: Array<{ name: string; type: string; description?: string }>;\n isList?: boolean;\n isNonNull?: boolean;\n }\n >;\n description?: string;\n }\n >;\n}\n\n// Source node data structure\ninterface NodeData {\n operation_name?: string;\n schema?: GraphQLSchema;\n nodeData?: {\n schema?: GraphQLSchema;\n };\n}\n\ninterface SourceNode {\n id: string;\n type: string;\n data?: NodeData;\n}\n\ninterface ConditionBuilderProps {\n sourceNode: SourceNode | null;\n sourceOperation: string;\n edgeId: string;\n // Schema is passed dynamically from the node data\n schema?: GraphQLSchema | null;\n}\n\n// Convert GraphQLSchema to GraphQLIntrospectionData format\nfunction convertToIntrospectionData(\n schema: GraphQLSchema,\n): GraphQLIntrospectionData | null {\n if (!schema.queryType) {\n return null;\n }\n\n return {\n queryType: schema.queryType,\n mutationType: schema.mutationType ?? undefined,\n types: Object.fromEntries(\n Object.entries(schema.types).map(([key, value]) => [\n key,\n {\n name: value.name,\n kind: value.kind as\n | \"scalar\"\n | \"type\"\n | \"enum\"\n | \"input\"\n | \"interface\"\n | \"union\",\n fields: value.fields\n ? Object.fromEntries(\n Object.entries(value.fields).map(([fieldKey, fieldValue]) => [\n fieldKey,\n {\n type: fieldValue.type,\n isList: fieldValue.isList,\n isNonNull: fieldValue.isNonNull,\n },\n ]),\n )\n : undefined,\n },\n ]),\n ),\n };\n}\n\nexport default function ConditionBuilder({\n sourceNode,\n sourceOperation,\n edgeId,\n schema,\n}: ConditionBuilderProps) {\n const { setEdges } = useReactFlow();\n const [conditionTree, setConditionTree] = useState<GroupNode | null>(null);\n const [conditionString, setConditionString] = useState<string>(\"\");\n\n // Use the operation name from props or fall back to node data\n const selectedOperation =\n sourceOperation || sourceNode?.data?.operation_name || \"\";\n\n // Use schema passed via props - no more API calls\n const rawSchema =\n schema ||\n sourceNode?.data?.schema ||\n sourceNode?.data?.nodeData?.schema ||\n null;\n\n // Convert to introspection data format\n const introspectionData = useMemo(() => {\n if (!rawSchema) return null;\n return convertToIntrospectionData(rawSchema);\n }, [rawSchema]);\n\n const handleConditionChange = (newTree: GroupNode) => {\n setConditionTree(newTree);\n try {\n const condString = buildConditionString(newTree);\n setConditionString(condString);\n } catch (error) {\n console.error(\"Error building condition string:\", error);\n }\n };\n useEffect(() => {\n setEdges((edges: Edge[]) => {\n return edges.map((edge: Edge) => {\n if (edge.id === edgeId) {\n return { ...edge, condition: conditionString };\n } else {\n return edge;\n }\n });\n });\n }, [conditionString, edgeId, setEdges]);\n\n // Show message if no schema is available\n if (!introspectionData) {\n return (\n <div className=\"flex items-center justify-center min-h-[200px] text-muted-foreground\">\n <AlertCircle className=\"h-6 w-6 mr-2\" />\n <span>\n No schema available for this node. Configure the node schema first.\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"container mx-auto py-8\">\n {/* <Card className=\"mb-6\">\n <CardHeader>\n <CardTitle>GraphQL Condition Builder</CardTitle>\n <CardDescription>Build conditions for GraphQL operations using introspection data</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-4\">\n <h3 className=\"text-lg font-medium mb-2\">Select Operation</h3>\n <div className=\"flex flex-wrap gap-2\">\n {getAvailableOperations().map((op:any) => (\n <Button\n key={op.name}\n variant={selectedOperation === op.name ? \"default\" : \"outline\"}\n onClick={() => handleOperationChange(op.name)}\n >\n <Badge variant={op.type === \"mutation\" ? \"destructive\" : \"default\"} className=\"mr-2\">\n {op.type}\n </Badge>\n {op.name}\n </Button>\n ))}\n </div>\n </div>\n </CardContent>\n </Card> */}\n\n {introspectionData && selectedOperation && (\n <Tabs defaultValue=\"builder\" className=\"w-full\">\n <TabsList className=\"mb-4\">\n <TabsTrigger value=\"builder\">Condition Builder</TabsTrigger>\n <TabsTrigger value=\"output\">Generated Output</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"builder\">\n <GraphQLConditionBuilder\n introspectionData={introspectionData}\n operationName={selectedOperation}\n initialCondition={\n conditionTree || {\n id: \"root\",\n type: \"group\",\n combinator: \"AND\",\n children: [],\n }\n }\n onConditionChange={handleConditionChange}\n />\n </TabsContent>\n\n <TabsContent value=\"output\">\n <Card>\n <CardHeader>\n <CardTitle>Generated Condition</CardTitle>\n <CardDescription>\n The condition string that will be used to filter{\" \"}\n {selectedOperation} results\n </CardDescription>\n </CardHeader>\n <CardContent>\n <ScrollArea className=\"h-[300px] w-full rounded-md border p-4\">\n <pre className=\"font-mono text-sm\">\n {conditionString || \"No condition generated yet\"}\n </pre>\n </ScrollArea>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n )}\n </div>\n );\n}\n","import type { GraphQLSchema, GraphQLField, GraphQLArgument } from \"./types\";\n\n/**\n * GraphQL Introspection Type Reference\n */\ninterface IntrospectionTypeRef {\n kind: string;\n name: string | null;\n ofType: IntrospectionTypeRef | null;\n}\n\n/**\n * GraphQL Introspection Input Value (for args and input fields)\n */\ninterface IntrospectionInputValue {\n name: string;\n description: string | null;\n type: IntrospectionTypeRef;\n defaultValue: string | null;\n}\n\n/**\n * GraphQL Introspection Field\n */\ninterface IntrospectionField {\n name: string;\n description: string | null;\n args: IntrospectionInputValue[];\n type: IntrospectionTypeRef;\n isDeprecated: boolean;\n deprecationReason: string | null;\n}\n\n/**\n * GraphQL Introspection Type\n */\ninterface IntrospectionType {\n kind: string;\n name: string;\n description: string | null;\n fields: IntrospectionField[] | null;\n inputFields: IntrospectionInputValue[] | null;\n interfaces: IntrospectionTypeRef[] | null;\n enumValues: Array<{ name: string; description: string | null }> | null;\n possibleTypes: IntrospectionTypeRef[] | null;\n}\n\n/**\n * GraphQL Introspection Schema\n */\ninterface IntrospectionSchema {\n queryType: { name: string } | null;\n mutationType: { name: string } | null;\n subscriptionType: { name: string } | null;\n types: IntrospectionType[];\n directives: Array<{\n name: string;\n description: string | null;\n locations: string[];\n args: IntrospectionInputValue[];\n }>;\n}\n\n/**\n * GraphQL Introspection Result - the raw response from introspection query\n */\nexport interface IntrospectionResult {\n __schema?: IntrospectionSchema;\n data?: {\n __schema: IntrospectionSchema;\n };\n}\n\n/**\n * Fetch GraphQL introspection data from an endpoint\n */\nexport async function fetchIntrospectionSchema(\n endpoint: string,\n headers: Record<string, string> = {},\n method: \"GET\" | \"POST\" = \"POST\",\n): Promise<IntrospectionResult> {\n const introspectionQuery = `\n query IntrospectionQuery {\n __schema {\n queryType {\n name\n }\n mutationType {\n name\n }\n subscriptionType {\n name\n }\n types {\n ...FullType\n }\n directives {\n name\n description\n locations\n args {\n ...InputValue\n }\n }\n }\n }\n\n fragment FullType on __Type {\n kind\n name\n description\n fields(includeDeprecated: true) {\n name\n description\n args {\n ...InputValue\n }\n type {\n ...TypeRef\n }\n isDeprecated\n deprecationReason\n }\n inputFields {\n ...InputValue\n }\n interfaces {\n ...TypeRef\n }\n enumValues(includeDeprecated: true) {\n name\n description\n isDeprecated\n deprecationReason\n }\n possibleTypes {\n ...TypeRef\n }\n }\n\n fragment InputValue on __InputValue {\n name\n description\n type {\n ...TypeRef\n }\n defaultValue\n }\n\n fragment TypeRef on __Type {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n }\n }\n }\n }\n }\n }\n }\n }\n `;\n\n try {\n let response;\n\n if (method === \"GET\") {\n // For GET requests, assume the endpoint already returns introspection data\n response = await fetch(endpoint, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n ...headers,\n },\n });\n } else {\n // For POST requests, send the introspection query\n response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({ query: introspectionQuery }),\n });\n }\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n console.error(\"Error fetching introspection schema:\", error);\n throw error;\n }\n}\n\n/**\n * Parse GraphQL introspection data into our internal schema format\n */\nexport function parseIntrospectionSchema(\n introspectionData: IntrospectionResult,\n): GraphQLSchema {\n // Initialize our custom schema structure\n const customSchema: GraphQLSchema = {\n types: {},\n queryType: null,\n mutationType: null,\n subscriptionType: null,\n };\n\n try {\n // Extract schema from introspection data\n // Handle both formats:\n // 1. Direct format from nodeSchemaIntrospection: { __schema: {...} }\n // 2. Standard introspection format: { data: { __schema: {...} } }\n const schema =\n introspectionData.__schema || introspectionData.data?.__schema;\n\n if (!schema) {\n console.error(\n \"Invalid introspection data: missing __schema\",\n introspectionData,\n );\n return customSchema;\n }\n\n // Get root types\n if (schema.queryType) {\n customSchema.queryType = schema.queryType.name;\n }\n\n if (schema.mutationType) {\n customSchema.mutationType = schema.mutationType.name;\n }\n\n if (schema.subscriptionType) {\n customSchema.subscriptionType = schema.subscriptionType.name;\n }\n\n // Process all types\n if (Array.isArray(schema.types)) {\n schema.types.forEach((type: IntrospectionType) => {\n // Skip built-in types (those starting with \"__\")\n if (type.name && type.name.startsWith(\"__\")) {\n return;\n }\n\n // Process different kinds of types\n switch (type.kind) {\n case \"OBJECT\":\n processObjectType(type, customSchema);\n // Log Query and Mutation type fields\n if (\n type.name === customSchema.queryType ||\n type.name === customSchema.mutationType\n ) {\n }\n break;\n case \"INPUT_OBJECT\":\n processInputObjectType(type, customSchema);\n break;\n case \"ENUM\":\n processEnumType(type, customSchema);\n break;\n case \"INTERFACE\":\n processInterfaceType(type, customSchema);\n break;\n case \"UNION\":\n processUnionType(type, customSchema);\n break;\n case \"SCALAR\":\n processScalarType(type, customSchema);\n break;\n }\n });\n }\n // Log mutation fields if available\n if (\n customSchema.mutationType &&\n customSchema.types[customSchema.mutationType]\n ) {\n const mutationFields = Object.keys(\n customSchema.types[customSchema.mutationType].fields || {},\n );\n }\n\n return customSchema;\n } catch (error) {\n console.error(\"Error parsing introspection schema:\", error);\n return customSchema;\n }\n}\n\n// Process GraphQL Object Type\nfunction processObjectType(\n type: IntrospectionType,\n customSchema: GraphQLSchema,\n) {\n const fields: Record<string, GraphQLField> = {};\n\n if (Array.isArray(type.fields)) {\n type.fields.forEach((field: IntrospectionField) => {\n fields[field.name] = processField(field);\n });\n }\n\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"type\",\n fields: fields,\n };\n}\n\n// Process GraphQL Input Object Type\nfunction processInputObjectType(\n type: IntrospectionType,\n customSchema: GraphQLSchema,\n) {\n const inputFields: Record<string, GraphQLField> = {};\n\n if (Array.isArray(type.inputFields)) {\n type.inputFields.forEach((field: IntrospectionInputValue) => {\n inputFields[field.name] = processInputFieldValue(field);\n });\n }\n\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"input\",\n fields: {}, // Empty fields for input types\n inputFields: inputFields,\n };\n}\n\n// Process GraphQL Enum Type\nfunction processEnumType(type: IntrospectionType, customSchema: GraphQLSchema) {\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"enum\",\n fields: {},\n };\n}\n\n// Process GraphQL Interface Type\nfunction processInterfaceType(\n type: IntrospectionType,\n customSchema: GraphQLSchema,\n) {\n const fields: Record<string, GraphQLField> = {};\n\n if (Array.isArray(type.fields)) {\n type.fields.forEach((field: IntrospectionField) => {\n fields[field.name] = processField(field);\n });\n }\n\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"interface\",\n fields: fields,\n };\n}\n\n// Process GraphQL Union Type\nfunction processUnionType(\n type: IntrospectionType,\n customSchema: GraphQLSchema,\n) {\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"union\",\n fields: {},\n };\n}\n\n// Process GraphQL Scalar Type\nfunction processScalarType(\n type: IntrospectionType,\n customSchema: GraphQLSchema,\n) {\n customSchema.types[type.name] = {\n name: type.name,\n kind: \"scalar\",\n fields: {},\n };\n}\n\n// Process a GraphQL Field\nfunction processField(field: IntrospectionField): GraphQLField {\n const args: GraphQLArgument[] = [];\n\n if (Array.isArray(field.args)) {\n field.args.forEach((arg: IntrospectionInputValue) => {\n args.push(processInputValue(arg));\n });\n }\n\n const typeInfo = extractTypeInfo(field.type);\n\n return {\n name: field.name,\n type: typeInfo.typeName,\n isNonNull: typeInfo.isNonNull,\n isList: typeInfo.isList,\n args: args,\n };\n}\n\n// Process a GraphQL Input Value (used for arguments)\nfunction processInputValue(\n inputValue: IntrospectionInputValue,\n): GraphQLArgument {\n const typeInfo = extractTypeInfo(inputValue.type);\n\n return {\n name: inputValue.name,\n type: typeInfo.typeName,\n isNonNull: typeInfo.isNonNull,\n isList: typeInfo.isList,\n };\n}\n\n// Process a GraphQL Input Field Value (used for input object fields)\nfunction processInputFieldValue(\n inputValue: IntrospectionInputValue,\n): GraphQLField {\n const typeInfo = extractTypeInfo(inputValue.type);\n\n return {\n name: inputValue.name,\n type: typeInfo.typeName,\n isNonNull: typeInfo.isNonNull,\n isList: typeInfo.isList,\n args: [], // Input fields don't have arguments\n };\n}\n\n// Extract type information from a GraphQL type reference\nfunction extractTypeInfo(typeRef: IntrospectionTypeRef | null): {\n typeName: string;\n isNonNull: boolean;\n isList: boolean;\n} {\n let typeName = \"\";\n let isNonNull = false;\n let isList = false;\n\n // Handle the nested type structure in GraphQL introspection\n function processTypeRef(ref: IntrospectionTypeRef | null): string {\n if (!ref) return \"Unknown\";\n\n if (ref.kind === \"NON_NULL\") {\n isNonNull = true;\n return processTypeRef(ref.ofType);\n }\n\n if (ref.kind === \"LIST\") {\n isList = true;\n return processTypeRef(ref.ofType);\n }\n\n return ref.name || \"Unknown\";\n }\n\n typeName = processTypeRef(typeRef);\n\n return { typeName, isNonNull, isList };\n}\n","import {\n EdgeLabelRenderer,\n type EdgeProps,\n type Edge,\n getBezierPath,\n 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=\">\">&gt;</SelectItem>\n <SelectItem value=\">=\">&gt;=</SelectItem>\n <SelectItem value=\"<\">&lt;</SelectItem>\n <SelectItem value=\"<=\">&lt;=</SelectItem>\n <SelectItem value=\"==\">==</SelectItem>\n </SelectContent>\n </Select>\n <Input\n type=\"number\"\n placeholder=\"Enter value\"\n value={rule.value}\n onChange={(e) => updateRule(index, 'value', e.target.value)}\n />\n </div>\n ))}\n <Button onClick={addRule} className=\"w-full\">Add Rule</Button>\n </div>\n <ConditionBuilder sourceNode={sourceNodeData} sourceOperation={sourceNodeData?.data?.operation_name} />\n </PopoverContent>\n </Popover> */}\n {/* Condition Button */}\n <button\n type=\"button\"\n title=\"Condition\"\n className=\"size-6 flex items-center justify-center rounded-md bg-card border border-card-foreground/20 text-card-foreground shadow-sm transition-colors hover:bg-[var(--color-status-success-bg-subtle)] hover:border-[var(--color-status-success-border)] hover:text-[var(--color-status-success-text)]\"\n onClick={() => setConditionShowModal(true)}\n >\n <GitBranch className=\"size-3.5\" />\n </button>\n </div>\n\n {/* Modals - rendered outside of hover container */}\n {showModal &&\n createPortal(\n <div\n className=\"fixed inset-0 bg-black/50 z-[99999] flex items-center justify-center\"\n onClick={() => setShowModal(false)}\n >\n <div\n className=\"bg-surface z-[100000] flex flex-col w-[95%] h-[95%] rounded-lg overflow-hidden pointer-events-auto\"\n onClick={handleModalClick}\n >\n <div className=\"flex justify-between items-center p-4 border-b bg-muted\">\n <h2 className=\"text-2xl font-bold text-primary\">\n GraphQL Mapper\n </h2>\n <div className=\"flex items-center gap-4\">\n {isLoadingSchemas && (\n <span className=\"flex items-center text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 mr-2 animate-spin\" />\n Loading schemas...\n </span>\n )}\n {schemaError && (\n <span className=\"text-sm text-[var(--color-status-error-text)]\">\n {schemaError}\n </span>\n )}\n <Button\n variant=\"outline\"\n onClick={() => setShowModal(false)}\n >\n Close\n </Button>\n </div>\n </div>\n <div className=\"flex-1 overflow-auto p-4\">\n <div className=\"pointer-events-auto\">\n {isLoadingSchemas ? (\n <div className=\"flex flex-col items-center justify-center h-64\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary mb-4\" />\n <p className=\"text-muted-foreground\">\n Fetching node schemas...\n </p>\n <p className=\"text-sm text-muted-foreground mt-2\">\n Source: {sourceNodeData?.type} | Target:{\" \"}\n {targetNodeData?.type}\n </p>\n </div>\n ) : (\n <Mapper\n dataConfig={defaultDataConfig}\n sourceNode={sourceNodeData?.type}\n targetNode={targetNodeData?.type}\n sourceOperation={\n sourceNodeData?.data?.operation_name || \"execute\"\n }\n targetOperation={\n targetNodeData?.data?.operation_name || \"execute\"\n }\n sourceSchema={sourceSchema || undefined}\n targetSchema={targetSchema || undefined}\n setEdges={setEdges as (edges: unknown) => void}\n edgeId={id}\n />\n )}\n </div>\n </div>\n </div>\n </div>,\n document.body,\n )}\n\n {showConditionModal &&\n createPortal(\n <div\n className=\"fixed inset-0 bg-black/50 z-[99999] flex items-center justify-center\"\n onClick={() => setConditionShowModal(false)}\n >\n <div\n className=\"bg-surface z-[100000] flex flex-col w-[95%] h-[95%] rounded-lg overflow-hidden pointer-events-auto\"\n onClick={handleModalClick}\n >\n <div className=\"flex justify-between items-center p-4 border-b bg-muted\">\n <h2 className=\"text-2xl font-bold text-primary\">Condition</h2>\n <div className=\"flex items-center gap-4\">\n {isLoadingSchemas && (\n <span className=\"flex items-center text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 mr-2 animate-spin\" />\n Loading schema...\n </span>\n )}\n <Button\n variant=\"outline\"\n onClick={() => setConditionShowModal(false)}\n >\n Close\n </Button>\n </div>\n </div>\n <div className=\"flex-1 overflow-auto p-4\">\n <div className=\"pointer-events-auto\">\n {isLoadingSchemas ? (\n <div className=\"flex flex-col items-center justify-center h-64\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary mb-4\" />\n <p className=\"text-muted-foreground\">\n Fetching node schema...\n </p>\n </div>\n ) : (\n <ConditionBuilder\n sourceNode={\n (sourceNodeData as {\n id: string;\n type: string;\n data?: Record<string, unknown>;\n }) ?? null\n }\n sourceOperation={\n sourceNodeData?.data?.operation_name || \"execute\"\n }\n edgeId={id}\n schema={sourceSchema}\n />\n )}\n </div>\n </div>\n </div>\n </div>,\n document.body,\n )}\n {/* Shadcn Dialog for Rule Builder */}\n {/* <Dialog open={isDialogOpen} onOpenChange={setDialogOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Rule Builder</DialogTitle>\n </DialogHeader>\n \n <RuleBuilder/>\n </DialogContent>\n </Dialog> */}\n </EdgeLabelRenderer>\n </>\n );\n}\n","import type { FinalConnectionState } from \"@xyflow/react\";\nimport { create } from \"zustand\";\n\ninterface State {\n anchorPosition: {\n x: number;\n y: number;\n };\n dropPosition: {\n x: number;\n y: number;\n };\n showMenu: boolean;\n incomingNodeMetadetails: FinalConnectionState | null;\n}\n\ninterface Actions {\n actions: {\n setAnchorPosition: (position: { x: number; y: number }) => void;\n setDropPosition: (position: { x: number; y: number }) => void;\n setShowMenu: (show: boolean) => void;\n setIncomingNodeMetadetails: (detail: FinalConnectionState | null) => void;\n };\n}\n\ninterface IAddNodeOnEdgeDropState extends State {\n actions: Actions[\"actions\"];\n}\n\nexport const useAddNodeOnEdgeDropStore = create<IAddNodeOnEdgeDropState>()(\n (set) => ({\n anchorPosition: { x: 0, y: 0 },\n dropPosition: { x: 0, y: 0 },\n showMenu: false,\n incomingNodeMetadetails: null,\n actions: {\n setAnchorPosition: (position) => set({ anchorPosition: position }),\n setDropPosition: (position) => set({ dropPosition: position }),\n setShowMenu: (show) => set({ showMenu: show }),\n setIncomingNodeMetadetails: (detail) =>\n set({ incomingNodeMetadetails: detail }),\n },\n }),\n);\n\nexport type AddNodeOnEdgeDropState = State;\n","import { ExtendedNodeType } from \"../components/flow-builder/components/blocks/types\";\nimport { createNodeWithDefaultData } from \"../components/flow-builder/components/blocks/utils\";\nimport { NODE_CONFIGS } from \"../components/flow-builder/components/blocks\";\nimport type { NodeOperation } from \"../components/flow-builder/components/blocks/nodes/node/node\";\nimport { type XYPosition, useReactFlow } from \"@xyflow/react\";\nimport { useCallback } from \"react\";\n\n/**\n * Build the `data` patch that pins a freshly-inserted node to a single operation.\n *\n * Mirrors what the old on-card operation dropdown wrote (operation_name /\n * operation_type / seeded args.state) and additionally slims `nodeData` down to\n * ONLY the selected operation, so the saved workflow never carries the full\n * manifest (all operations) for every node. The single-op nodeData keeps the\n * node self-contained: the properties panel renders its form from\n * `data.nodeData.operations` without needing the in-memory registry.\n *\n * Returns null when the node/operation can't be resolved so the caller falls\n * back to a generic (unpinned) insert.\n */\nfunction buildOperationSeed(\n type: string,\n operationName: string,\n existingData: Record<string, unknown>,\n): Record<string, unknown> | null {\n const config = NODE_CONFIGS.find((c) => c.type === type);\n if (!config) return null;\n\n const operations = (config.operations ?? []) as NodeOperation[];\n const op = operations.find((o) => o.name === operationName);\n if (!op) return null;\n\n const manifest = config.defaultData?.nodeData as unknown as\n | Record<string, unknown>\n | undefined;\n\n const prevArgs = (existingData.args ?? {}) as Record<string, unknown>;\n\n // The connection handle spec may live top-level on the manifest or inside\n // the operations blob (seeded there by workflow-svc). Slimming `operations`\n // to a bare array below would drop the blob location, so hoist the spec\n // top-level — the card renders its handles from it.\n const manifestOps = manifest?.operations as\n | { outputHandles?: unknown; inputHandles?: unknown }\n | undefined;\n const outputHandles = manifest?.outputHandles ?? manifestOps?.outputHandles;\n const inputHandles = manifest?.inputHandles ?? manifestOps?.inputHandles;\n\n return {\n ...existingData,\n operation_name: op.name,\n operation_type: op.type,\n args: {\n // Preserve default context/credentials; seed state from the op defaults.\n ...prevArgs,\n state: { ...(op.adaptive_card?.defaultValue ?? {}) },\n },\n // Slim manifest: keep node-level metadata but only the pinned operation.\n nodeData: {\n ...(manifest ?? {}),\n ...(outputHandles !== undefined ? { outputHandles } : {}),\n ...(inputHandles !== undefined ? { inputHandles } : {}),\n operations: [op],\n },\n };\n}\n\nexport function useInsertNode() {\n const { addNodes, screenToFlowPosition, getNodes, updateNode } =\n useReactFlow();\n\n return useCallback(\n (type: ExtendedNodeType, pos?: XYPosition, operationName?: string) => {\n const _pos =\n pos ||\n screenToFlowPosition({\n x: window.innerWidth / 2,\n y: window.innerHeight / 2,\n });\n\n getNodes().forEach((node) => {\n if (node.selected) {\n updateNode(node.id, { selected: false });\n }\n });\n\n const newNode = createNodeWithDefaultData(type, {\n position: _pos,\n selected: true,\n });\n\n // Pin the node to the operation chosen in the Node Store (n8n-style), so\n // it lands on the canvas already configured — no on-card dropdown.\n //\n // Single-operation nodes (all internal nodes, single-op store nodes)\n // auto-pin to their only operation: there is nothing to choose, so\n // dragging the node itself must not leave it \"Not configured\".\n let pinTo = operationName;\n if (!pinTo) {\n const config = NODE_CONFIGS.find((c) => c.type === type);\n const ops = (config?.operations ?? []) as NodeOperation[];\n if (ops.length === 1 && ops[0]?.name) {\n pinTo = ops[0].name;\n }\n }\n if (pinTo) {\n const seeded = buildOperationSeed(\n type,\n pinTo,\n (newNode.data ?? {}) as Record<string, unknown>,\n );\n if (seeded) newNode.data = seeded;\n }\n\n addNodes(newNode);\n\n return newNode;\n },\n [screenToFlowPosition, getNodes, addNodes, updateNode],\n );\n}\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","/**\n * CanvasControls — Enhanced bottom-right control panel for the workflow canvas.\n *\n * Features:\n * - MiniMap toggle (show/hide overview map)\n * - Fit view\n * - Zoom in / out with live percentage\n * - Hide / show edges\n * - Tidy up: auto-layout nodes left-to-right via topological sort (no external deps)\n */\nimport { useState, useCallback } from \"react\";\nimport {\n MiniMap,\n type ReactFlowState,\n useReactFlow,\n useStore,\n} from \"@xyflow/react\";\nimport { shallow } from \"zustand/shallow\";\nimport { Icon } from \"@iconify/react\";\nimport { Maximize2, LayoutGrid } from \"lucide-react\";\n\nconst ZOOM_DURATION = 500;\nconst NODE_WIDTH = 220;\nconst NODE_HEIGHT = 80;\nconst H_GAP = 80;\nconst V_GAP = 48;\n\nfunction zoomSelector(s: ReactFlowState) {\n return {\n zoom: s.transform[2],\n minZoomReached: s.transform[2] <= s.minZoom,\n maxZoomReached: s.transform[2] >= s.maxZoom,\n };\n}\n\nfunction ControlBtn({\n onClick,\n title,\n disabled,\n active,\n children,\n}: {\n onClick?: () => void;\n title: string;\n disabled?: boolean;\n active?: boolean;\n children: React.ReactNode;\n}) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={[\n \"flex items-center justify-center size-8 rounded-md transition-colors\",\n \"text-card-foreground/70 hover:text-card-foreground hover:bg-card-foreground/10\",\n active ? \"bg-primary/15 text-primary hover:text-primary\" : \"\",\n disabled ? \"opacity-40 cursor-not-allowed\" : \"cursor-pointer\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </button>\n );\n}\n\nexport function CanvasControls() {\n const searchParams = new URLSearchParams(window.location.search);\n const isReadOnly = searchParams.get(\"readonly\") === \"true\";\n\n const [showMinimap, setShowMinimap] = useState(false);\n const [edgesHidden, setEdgesHidden] = useState(false);\n\n const { zoom, minZoomReached, maxZoomReached } = useStore(\n zoomSelector,\n shallow,\n );\n const { zoomIn, zoomOut, fitView, setEdges, getEdges, getNodes, setNodes } =\n useReactFlow();\n\n // ── Hide / show edges ────────────────────────────────────────────────────\n const toggleEdges = useCallback(() => {\n setEdgesHidden((prev) => {\n const next = !prev;\n setEdges((edges) => edges.map((e) => ({ ...e, hidden: next })));\n return next;\n });\n }, [setEdges]);\n\n // ── Tidy up: topological-sort-based left-to-right auto layout ────────────\n const tidyUp = useCallback(() => {\n const nodes = getNodes();\n const edges = getEdges();\n\n if (nodes.length === 0) return;\n\n // Build adjacency\n const outgoing: Record<string, string[]> = {};\n const inDegree: Record<string, number> = {};\n\n for (const n of nodes) {\n outgoing[n.id] = [];\n inDegree[n.id] = 0;\n }\n for (const e of edges) {\n outgoing[e.source]?.push(e.target);\n if (e.target in inDegree) inDegree[e.target]++;\n }\n\n // Kahn's algorithm → assign column (level) per node\n const level: Record<string, number> = {};\n const queue = nodes.filter((n) => inDegree[n.id] === 0).map((n) => n.id);\n queue.forEach((id) => (level[id] = 0));\n\n const visited = new Set<string>();\n while (queue.length > 0) {\n const id = queue.shift()!;\n if (visited.has(id)) continue;\n visited.add(id);\n for (const target of outgoing[id] ?? []) {\n level[target] = Math.max(level[target] ?? 0, (level[id] ?? 0) + 1);\n inDegree[target]--;\n if (inDegree[target] <= 0) queue.push(target);\n }\n }\n\n // Any node not reached (cycles) gets its own level\n for (const n of nodes) {\n if (!(n.id in level)) level[n.id] = 0;\n }\n\n // Group by level → assign row within each column\n const byLevel: Record<number, string[]> = {};\n for (const n of nodes) {\n const col = level[n.id] ?? 0;\n (byLevel[col] ??= []).push(n.id);\n }\n\n // Compute positions\n const posMap: Record<string, { x: number; y: number }> = {};\n for (const [colStr, ids] of Object.entries(byLevel)) {\n const col = Number(colStr);\n const totalH = ids.length * NODE_HEIGHT + (ids.length - 1) * V_GAP;\n ids.forEach((id, row) => {\n posMap[id] = {\n x: col * (NODE_WIDTH + H_GAP),\n y: row * (NODE_HEIGHT + V_GAP) - totalH / 2,\n };\n });\n }\n\n setNodes((nds) =>\n nds.map((n) => (posMap[n.id] ? { ...n, position: posMap[n.id] } : n)),\n );\n\n setTimeout(() => fitView({ duration: ZOOM_DURATION, padding: 0.15 }), 50);\n }, [getNodes, getEdges, setNodes, fitView]);\n\n return (\n <>\n {/* MiniMap — rendered outside the panel so it floats above it */}\n {showMinimap && (\n <MiniMap\n position=\"bottom-left\"\n style={{\n position: \"fixed\",\n bottom: 52,\n left: \"calc(var(--canvas-left, 64px) + 12px)\" as unknown as number,\n marginBottom: 4,\n backgroundColor: \"var(--color-card)\",\n }}\n className=\"!rounded-lg !border !border-card-foreground/10 !shadow-lg\"\n nodeColor=\"var(--color-primary)\"\n nodeStrokeColor=\"transparent\"\n maskColor=\"rgba(0,0,0,0.45)\"\n zoomable\n pannable\n />\n )}\n\n {/* Control panel */}\n <div\n className=\"fixed bottom-3 z-50 flex items-center gap-1 rounded-xl border border-card-foreground/10 bg-card px-2 py-1.5 shadow-lg\"\n style={{ left: \"calc(var(--canvas-left, 64px) + 12px)\" }}\n >\n {/* Minimap toggle */}\n <ControlBtn\n title={showMinimap ? \"Hide minimap\" : \"Show minimap\"}\n active={showMinimap}\n onClick={() => setShowMinimap((v) => !v)}\n >\n <Icon icon=\"mynaui:map\" className=\"size-4\" />\n </ControlBtn>\n\n <div className=\"w-px h-5 bg-card-foreground/10 mx-0.5\" />\n\n {/* Fit view */}\n <ControlBtn\n title=\"Fit view\"\n onClick={() => fitView({ duration: ZOOM_DURATION, padding: 0.15 })}\n >\n <Maximize2 className=\"size-4\" />\n </ControlBtn>\n\n {/* Zoom out */}\n <ControlBtn\n title=\"Zoom out\"\n disabled={minZoomReached}\n onClick={() => zoomOut({ duration: ZOOM_DURATION })}\n >\n <Icon icon=\"mynaui:minus\" className=\"size-4\" />\n </ControlBtn>\n\n {/* Zoom percentage */}\n <button\n title=\"Reset zoom to 100%\"\n onClick={() => fitView({ duration: ZOOM_DURATION })}\n className=\"min-w-[44px] text-center text-xs font-medium text-card-foreground/60 hover:text-card-foreground transition-colors tabular-nums cursor-pointer\"\n >\n {Math.round(zoom * 100)}%\n </button>\n\n {/* Zoom in */}\n <ControlBtn\n title=\"Zoom in\"\n disabled={maxZoomReached}\n onClick={() => zoomIn({ duration: ZOOM_DURATION })}\n >\n <Icon icon=\"mynaui:plus\" className=\"size-4\" />\n </ControlBtn>\n\n {!isReadOnly && (\n <>\n <div className=\"w-px h-5 bg-card-foreground/10 mx-0.5\" />\n\n {/* Hide / show edges */}\n <ControlBtn\n title={edgesHidden ? \"Show connections\" : \"Hide connections\"}\n active={edgesHidden}\n onClick={toggleEdges}\n >\n <Icon\n icon={edgesHidden ? \"mynaui:link-slash\" : \"mynaui:link\"}\n className=\"size-4\"\n />\n </ControlBtn>\n\n {/* Tidy up */}\n <ControlBtn title=\"Tidy up layout\" onClick={tidyUp}>\n <LayoutGrid className=\"size-4\" />\n </ControlBtn>\n </>\n )}\n </div>\n </>\n );\n}\n","import { ExtendedNodeType } from \"../../blocks/types\";\nimport { AVAILABLE_NODES, NODES_METADATA } from \"../../blocks\";\nimport { Icon } from \"@iconify/react\";\n\ntype NodeListProps = Readonly<{\n nodes: Array<\n (typeof AVAILABLE_NODES)[number] & {\n __meta: (typeof NODES_METADATA)[ExtendedNodeType];\n __enabled: boolean;\n }\n >;\n onNodeAdd: (type: ExtendedNodeType) => void;\n}>;\n\nexport default function NodeList({ nodes, onNodeAdd }: NodeListProps) {\n return (\n <div className=\"flex flex-col gap-y-0.5 p-1\">\n {nodes.map((node) => (\n <button\n onClick={() => {\n onNodeAdd(node.type);\n }}\n type=\"button\"\n disabled={!node.__enabled}\n key={node.type}\n className=\"flex items-center rounded-xl bg-transparent p-1 transition disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-20 active:bg-card-foreground/10 hover:bg-card-foreground/10\"\n >\n <div className=\"size-7 flex shrink-0 items-center justify-center border border-card-foreground/10 rounded-lg bg-card\">\n <Icon icon={node.icon} className={\"size-4 text-card-foreground\"} />\n </div>\n\n <div className=\"ml-2 text-sm text-card-foreground/80\">\n {node.title}\n </div>\n </button>\n ))}\n </div>\n );\n}\n","import { useCallback, useMemo } from \"react\";\nimport { useAddNodeOnEdgeDropStore } from \"../../../../stores/add-node-on-edge-drop-state\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@burdenoff/fe-libs/ui\";\nimport NodeList from \"./components/node-list\";\nimport { useShallow } from \"zustand/shallow\";\nimport { BuilderNode, ExtendedNodeType } from \"../blocks/types\";\nimport { AVAILABLE_NODES, NODES_METADATA } from \"../blocks\";\n\ntype AddNodeFloatingMenuProps = Readonly<{\n onNodeAdd: (type: ExtendedNodeType) => void;\n}>;\n\nexport default function AddNodeFloatingMenu({\n onNodeAdd,\n}: AddNodeFloatingMenuProps) {\n const [showMenu, setShowMenu, anchorPosition, _incomingNodeMetadetails] =\n useAddNodeOnEdgeDropStore(\n useShallow((s) => [\n s.showMenu,\n s.actions.setShowMenu,\n s.anchorPosition,\n s.incomingNodeMetadetails,\n ]),\n );\n const onOutsideClick = useCallback(() => {\n setShowMenu(false);\n }, [setShowMenu]);\n\n const handleOnNodeAdd = useCallback(\n (type: ExtendedNodeType) => {\n setShowMenu(false);\n onNodeAdd(type);\n },\n [onNodeAdd, setShowMenu],\n );\n\n const incomingNodeMetadetails = useMemo(\n () => _incomingNodeMetadetails,\n [_incomingNodeMetadetails],\n );\n\n const nodesWithMetadata = useMemo(() => {\n const mapNodesWithMetadata = (\n types: ExtendedNodeType[],\n ): Array<\n (typeof AVAILABLE_NODES)[number] & {\n __meta: (typeof NODES_METADATA)[ExtendedNodeType];\n __enabled: boolean;\n }\n > =>\n types.map((type) => {\n const meta = NODES_METADATA[type];\n const isFromSource =\n incomingNodeMetadetails?.fromHandle?.type === \"source\";\n const isFromTarget =\n incomingNodeMetadetails?.fromHandle?.type === \"target\";\n\n const enabled =\n (isFromSource && meta?.connection?.inputs > 0) ||\n (isFromTarget && meta?.connection?.outputs > 0) ||\n !incomingNodeMetadetails;\n\n return {\n type,\n title: meta?.detail?.title ?? \"\",\n icon: meta?.detail?.icon ?? \"\",\n description: meta?.detail?.description,\n gradientColor: meta?.detail?.gradientColor ?? \"gray\",\n __meta: meta,\n __enabled: enabled,\n manifest: meta?.manifest,\n };\n });\n\n const fromHandleId = _incomingNodeMetadetails?.fromHandle?.id as\n | string\n | undefined;\n // 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\";\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 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 { useFlowValidator } from \"../../../../hooks/use-flow-validator\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { useSaveWorkflow } from \"../../../../hooks/use-save-workflow\";\n\nexport const SaveFlowButton = () => {\n const { saveToBackend, isSaving } = useSaveWorkflow();\n\n const [isValidating, validateFlow] = useFlowValidator(async (isValid) => {\n if (isValid) {\n await saveToBackend();\n } else {\n toast.error(\"Flow is invalid\", {\n description:\n \"Please check if the flow is complete and has no lone nodes\",\n });\n }\n });\n\n return (\n <div>\n <Button\n onClick={validateFlow}\n disabled={isValidating || isSaving}\n variant={\"outline\"}\n size={\"sm\"}\n className=\"flex gap-4\"\n >\n <Icon icon=\"fluent:save-28-filled\" />\n {isSaving ? \"Saving...\" : \"Save Flow\"}\n </Button>\n </div>\n );\n};\n","import { useState, useCallback, useEffect } from \"react\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n} from \"../../../../../ui/dialog\";\nimport { Icon } from \"@iconify/react\";\n\ninterface TriggerDataDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onExecute: (triggerData: Record<string, unknown>) => void;\n isExecuting: boolean;\n}\n\nconst PLACEHOLDER_JSON = `{\n \"message\": \"Hello, what can you help me with?\",\n \"agentName\": \"faq_agent\"\n}`;\n\nexport function TriggerDataDialog({\n open,\n onOpenChange,\n onExecute,\n isExecuting,\n}: TriggerDataDialogProps) {\n const [jsonValue, setJsonValue] = useState(\"\");\n const [parseError, setParseError] = useState<string | null>(null);\n // Track whether we've submitted; close the dialog once isExecuting becomes true\n const [submitted, setSubmitted] = useState(false);\n\n // Reset state when the dialog closes; clear parseError when it reopens\n useEffect(() => {\n if (!open) {\n setJsonValue(\"\");\n setParseError(null);\n setSubmitted(false);\n } else {\n setParseError(null);\n }\n }, [open]);\n\n // Close the dialog once the parent has started executing (isExecuting flipped true)\n useEffect(() => {\n if (submitted && isExecuting) {\n onOpenChange(false);\n setSubmitted(false);\n }\n }, [submitted, isExecuting, onOpenChange]);\n\n const handleExecute = useCallback(() => {\n const valueToparse = jsonValue.trim() || \"{}\";\n try {\n const parsed = JSON.parse(valueToparse);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n setParseError(\n \"Trigger data must be a JSON object (not an array or primitive)\",\n );\n return;\n }\n setParseError(null);\n setSubmitted(true);\n onExecute(parsed);\n } catch {\n setParseError(\"Invalid JSON. Please check your syntax.\");\n }\n }, [jsonValue, onExecute]);\n\n const handleRunEmpty = useCallback(() => {\n setParseError(null);\n setSubmitted(true);\n onExecute({});\n }, [onExecute]);\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <Icon\n icon=\"mdi:play-circle-outline\"\n className=\"size-5 text-[var(--color-status-success-text)]\"\n />\n Execute Workflow\n </DialogTitle>\n <DialogDescription>\n Provide the trigger data (JSON) that will be passed to the first\n node in the workflow. This is the input your workflow will process.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-2\">\n <label\n htmlFor=\"trigger-data-json\"\n className=\"text-sm font-medium text-foreground\"\n >\n Trigger Data (JSON)\n </label>\n <textarea\n id=\"trigger-data-json\"\n value={jsonValue}\n onChange={(e) => {\n setJsonValue(e.target.value);\n setParseError(null);\n }}\n className=\"w-full h-48 rounded-md border border-input bg-background px-3 py-2 text-sm font-mono ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 resize-y\"\n placeholder={PLACEHOLDER_JSON}\n spellCheck={false}\n />\n {parseError && (\n <p className=\"text-sm text-[var(--color-status-error-text)]\">\n {parseError}\n </p>\n )}\n <p className=\"text-xs text-muted-foreground\">\n This data is available to nodes as trigger input. For example, a\n Botlit node expects{\" \"}\n <code className=\"bg-muted px-1 rounded\">message</code> and{\" \"}\n <code className=\"bg-muted px-1 rounded\">agentName</code>. A Web\n Scraper node expects{\" \"}\n <code className=\"bg-muted px-1 rounded\">url</code>.\n </p>\n </div>\n\n <DialogFooter className=\"gap-2 sm:gap-0\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRunEmpty}\n disabled={isExecuting}\n >\n Run Empty\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleExecute}\n disabled={isExecuting}\n className=\"bg-[var(--color-status-success-bg)] hover:bg-[var(--color-status-success-bg)]/90 text-[var(--color-text-on-status)]\"\n >\n <Icon icon=\"mdi:play\" className=\"size-4 mr-1\" />\n {isExecuting ? \"Running...\" : \"Execute\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { useFlowValidator } from \"../../../../hooks/use-flow-validator\";\nimport { useFlowStore } from \"../../../../stores/flow-store\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { useShallow } from \"zustand/shallow\";\nimport { useNodeExecution } from \"../../../../../hooks/useNodeExecution\";\nimport { TriggerDataDialog } from \"./trigger-data-dialog\";\n\nexport const ExecuteWorkflowButton = () => {\n const { executeFullWorkflow } = useNodeExecution();\n const [dialogOpen, setDialogOpen] = useState(false);\n\n const [isExecuting] = useFlowStore(\n useShallow((s) => [s.execution.isExecuting]),\n );\n\n const executeWorkflow = useCallback(\n async (triggerData: Record<string, unknown>) => {\n try {\n const result = await executeFullWorkflow(triggerData);\n\n if (result.success) {\n toast.success(\"Workflow execution started\", {\n description: `Run ID: ${result.runId}`,\n dismissible: true,\n });\n } else {\n throw new Error(result.error || \"Failed to trigger workflow\");\n }\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"[ExecuteWorkflowButton] Error:\", message);\n toast.error(\"Failed to execute workflow\", {\n description: message,\n });\n }\n },\n [executeFullWorkflow],\n );\n\n const [isValidating, validateFlow] = useFlowValidator(async (isValid) => {\n if (isValid) {\n setDialogOpen(true);\n } else {\n toast.error(\"Flow is invalid\", {\n description:\n \"Please fix the flow before executing. Ensure trigger node is connected.\",\n });\n }\n });\n\n return (\n <>\n <Button\n onClick={validateFlow}\n disabled={isValidating || isExecuting}\n variant=\"default\"\n size=\"sm\"\n className=\"flex gap-2 bg-[var(--color-status-success-bg)] hover:bg-[var(--color-status-success-bg)]/90 text-[var(--color-text-on-status)]\"\n >\n <Icon icon=\"mdi:play\" className=\"size-4\" />\n {isExecuting\n ? \"Running...\"\n : isValidating\n ? \"Validating...\"\n : \"Execute\"}\n </Button>\n\n <TriggerDataDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n onExecute={executeWorkflow}\n isExecuting={isExecuting}\n />\n </>\n );\n};\n","import { useState, useCallback, useRef, useEffect } from \"react\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { Icon } from \"@iconify/react\";\nimport { useFlowStore } from \"../../../../stores/flow-store\";\nimport type { ExecutionLog } from \"../../../../../types/execution\";\nimport { useShallow } from \"zustand/shallow\";\n\n// JSON Viewer Component\nconst JsonView = ({ data }: { data: Record<string, unknown> | null }) => {\n if (!data) return <div className=\"text-tertiary p-4\">No data</div>;\n\n return (\n <pre className=\"text-xs overflow-auto p-4 bg-card/50 rounded h-full\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n};\n\n// Table View Component\nconst TableView = ({ data }: { data: Record<string, unknown> | null }) => {\n if (!data) return <div className=\"text-tertiary p-4\">No data</div>;\n\n const entries = Object.entries(data);\n if (entries.length === 0)\n return <div className=\"text-tertiary p-4\">Empty object</div>;\n\n return (\n <div className=\"overflow-auto h-full\">\n <table className=\"w-full text-xs\">\n <thead className=\"bg-card-foreground/10 sticky top-0\">\n <tr>\n <th className=\"text-left p-2\">Field</th>\n <th className=\"text-left p-2\">Type</th>\n <th className=\"text-left p-2\">Value</th>\n </tr>\n </thead>\n <tbody>\n {entries.map(([key, value]) => (\n <tr key={key} className=\"border-b border-card-foreground/10\">\n <td className=\"p-2 font-medium text-accent\">{key}</td>\n <td className=\"p-2 text-secondary\">{typeof value}</td>\n <td className=\"p-2 truncate max-w-[200px]\">\n {typeof value === \"object\"\n ? JSON.stringify(value)\n : String(value)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n};\n\n// Log List Item\nconst LogListItem = ({\n log,\n isSelected,\n onClick,\n}: {\n log: ExecutionLog;\n isSelected: boolean;\n onClick: () => void;\n}) => {\n const statusIcon = {\n pending: \"mdi:clock-outline\",\n running: \"svg-spinners:ring-resize\",\n completed: \"mdi:check-circle\",\n failed: \"mdi:close-circle\",\n }[log.status];\n\n const statusColor = {\n pending: \"text-tertiary\",\n running: \"text-accent\",\n completed: \"text-[var(--color-status-success-text)]\",\n failed: \"text-[var(--color-status-error-text)]\",\n }[log.status];\n\n return (\n <button\n onClick={onClick}\n className={cn(\n \"w-full text-left p-2 flex items-center gap-2 text-xs transition-colors\",\n isSelected\n ? \"bg-primary/20 border-l-2 border-primary\"\n : \"hover:bg-card-foreground/10\",\n )}\n >\n <Icon icon={statusIcon} className={cn(\"size-4\", statusColor)} />\n <span className=\"truncate flex-1\">{log.nodeName}</span>\n {log.duration && (\n <span className=\"text-tertiary text-[10px]\">\n {log.duration.toFixed(2)}s\n </span>\n )}\n </button>\n );\n};\n\n// Log Detail View\nconst LogDetailView = ({ log }: { log: ExecutionLog | null }) => {\n const [activeTab, setActiveTab] = useState<\"input\" | \"output\">(\"output\");\n const [viewMode, setViewMode] = useState<\"json\" | \"table\">(\"json\");\n\n if (!log) {\n return (\n <div className=\"flex-1 flex items-center justify-center text-tertiary text-sm\">\n Select a step to view details\n </div>\n );\n }\n\n const statusColor = {\n pending: \"text-tertiary\",\n running: \"text-accent\",\n completed: \"text-[var(--color-status-success-text)]\",\n failed: \"text-[var(--color-status-error-text)]\",\n }[log.status];\n\n const data = activeTab === \"input\" ? log.inputArgs : log.output;\n const itemCount = data ? Object.keys(data).length : 0;\n\n return (\n <div className=\"flex-1 flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-2 border-b border-card-foreground/10\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{log.nodeName}</span>\n <span className={cn(\"text-xs capitalize\", statusColor)}>\n {log.status === \"completed\" ? \"Success\" : log.status}\n </span>\n {log.duration && (\n <span className=\"text-xs text-gray-500\">\n in {(log.duration * 1000).toFixed(0)}ms\n </span>\n )}\n </div>\n\n {/* View Toggle */}\n <div className=\"flex items-center gap-1\">\n <Button\n variant={viewMode === \"json\" ? \"secondary\" : \"ghost\"}\n size=\"icon\"\n className=\"size-6\"\n onClick={() => setViewMode(\"json\")}\n title=\"JSON View\"\n >\n <Icon icon=\"mdi:code-json\" className=\"size-3\" />\n </Button>\n <Button\n variant={viewMode === \"table\" ? \"secondary\" : \"ghost\"}\n size=\"icon\"\n className=\"size-6\"\n onClick={() => setViewMode(\"table\")}\n title=\"Table View\"\n >\n <Icon icon=\"mdi:table\" className=\"size-3\" />\n </Button>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"flex border-b border-card-foreground/10\">\n <button\n className={cn(\n \"px-4 py-2 text-xs font-medium transition-colors duration-200\",\n activeTab === \"input\"\n ? \"border-b-2 border-primary text-primary\"\n : \"text-secondary hover:text-primary\",\n )}\n onClick={() => setActiveTab(\"input\")}\n >\n Input\n </button>\n <button\n className={cn(\n \"px-4 py-2 text-xs font-medium transition-colors duration-200\",\n activeTab === \"output\"\n ? \"border-b-2 border-primary text-primary\"\n : \"text-secondary hover:text-primary\",\n )}\n onClick={() => setActiveTab(\"output\")}\n >\n Output\n </button>\n <div className=\"flex-1\" />\n <span className=\"px-4 py-2 text-xs text-tertiary\">\n {itemCount} item{itemCount !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto\">\n {log.error && activeTab === \"output\" ? (\n <div className=\"p-4 bg-[var(--color-status-error-bg-subtle)] text-[var(--color-status-error-text)] text-xs\">\n <div className=\"font-medium mb-1\">Error:</div>\n {log.error}\n </div>\n ) : viewMode === \"json\" ? (\n <JsonView data={data} />\n ) : (\n <TableView data={data} />\n )}\n </div>\n </div>\n );\n};\n\n// Main LogsPanel Component\nexport const LogsPanel = () => {\n const [\n logs,\n selectedLogId,\n panelExpanded,\n selectLog,\n togglePanel,\n clearLogs,\n ] = useFlowStore(\n useShallow((s) => [\n s.execution.logs,\n s.execution.selectedLogId,\n s.execution.panelExpanded,\n s.actions.execution.selectLog,\n s.actions.execution.togglePanel,\n s.actions.execution.clearLogs,\n ]),\n );\n\n const selectedLog = logs.find((l) => l.id === selectedLogId) || null;\n\n // Resizable panel state\n const [panelHeight, setPanelHeight] = useState(350);\n const isResizing = useRef(false);\n const startY = useRef(0);\n const startHeight = useRef(0);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n isResizing.current = true;\n startY.current = e.clientY;\n startHeight.current = panelHeight;\n document.body.style.cursor = \"ns-resize\";\n document.body.style.userSelect = \"none\";\n },\n [panelHeight],\n );\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing.current) return;\n\n const deltaY = startY.current - e.clientY;\n const newHeight = Math.max(\n 150,\n Math.min(600, startHeight.current + deltaY),\n );\n setPanelHeight(newHeight);\n };\n\n const handleMouseUp = () => {\n isResizing.current = false;\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, []);\n\n if (!panelExpanded && logs.length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n \"relative border-t border-card-foreground/10 bg-card/95 backdrop-blur-sm transition-[height] duration-150\",\n !panelExpanded && \"h-10\",\n )}\n style={{ height: panelExpanded ? panelHeight : 40 }}\n >\n {/* Resize Handle */}\n {panelExpanded && (\n <div\n className=\"absolute top-0 left-0 right-0 h-1.5 cursor-ns-resize bg-transparent hover:bg-primary/30 transition-colors z-10 group\"\n onMouseDown={handleMouseDown}\n >\n <div className=\"absolute top-0.5 left-1/2 -translate-x-1/2 w-8 h-0.5 rounded-full bg-card-foreground/20 group-hover:bg-primary/50 transition-colors\" />\n </div>\n )}\n\n {/* Header */}\n <div className=\"h-10 flex items-center justify-between px-3 border-b border-card-foreground/10\">\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6\"\n onClick={togglePanel}\n >\n <Icon\n icon={panelExpanded ? \"mdi:chevron-down\" : \"mdi:chevron-up\"}\n className=\"size-4\"\n />\n </Button>\n <span className=\"text-sm font-medium\">Logs</span>\n {logs.length > 0 && (\n <span className=\"text-xs text-tertiary\">({logs.length} steps)</span>\n )}\n </div>\n\n {logs.length > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 text-xs\"\n onClick={clearLogs}\n >\n <Icon icon=\"mdi:trash-can-outline\" className=\"size-3 mr-1\" />\n Clear execution\n </Button>\n )}\n </div>\n\n {/* Content */}\n {panelExpanded && (\n <div className=\"flex h-[calc(100%-40px)]\">\n {/* Log List (Left) */}\n <div className=\"w-[200px] border-r border-card-foreground/10 overflow-y-auto\">\n {logs.length === 0 ? (\n <div className=\"p-4 text-xs text-tertiary text-center\">\n No execution logs yet\n </div>\n ) : (\n logs.map((log) => (\n <LogListItem\n key={log.id}\n log={log}\n isSelected={log.id === selectedLogId}\n onClick={() => selectLog(log.id)}\n />\n ))\n )}\n </div>\n\n {/* Log Detail (Right) */}\n <LogDetailView log={selectedLog} />\n </div>\n )}\n </div>\n );\n};\n\nexport default LogsPanel;\n","/**\n * ChatPanel — Embedded chat interface for testing AI Agent workflows.\n * Similar to n8n's chat trigger panel. Opens at the bottom of the workflow builder.\n *\n * When a workflow has a Chat Trigger or AI Agent node, users can send messages\n * and see AI responses inline — no external tools needed.\n *\n * Uses the Zustand flow store's execution.logs (populated by real-time WebSocket\n * subscriptions from useNodeExecution) to detect when the AI Agent completes,\n * avoiding the need for separate HTTP polling.\n */\nimport { useState, useRef, useEffect, useCallback } from \"react\";\nimport { useShallow } from \"zustand/shallow\";\nimport { Icon } from \"@iconify/react\";\nimport { useFlowStore } from \"../../../../stores/flow-store\";\nimport { useNodeExecution } from \"../../../../../hooks/useNodeExecution\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\n\ninterface ChatMessage {\n id: string;\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp: Date;\n runId?: string;\n status?: \"sending\" | \"complete\" | \"error\";\n duration?: string;\n}\n\nexport const ChatPanel = () => {\n const [messages, setMessages] = useState<ChatMessage[]>([\n {\n id: \"system-welcome\",\n role: \"system\",\n content: \"Send a message to test your AI workflow\",\n timestamp: new Date(),\n },\n ]);\n const [inputValue, setInputValue] = useState(\"\");\n const [isWaiting, setIsWaiting] = useState(false);\n const [panelHeight, setPanelHeight] = useState(350);\n const [isOpen, setIsOpen] = useState(false);\n const chatEndRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const isResizing = useRef(false);\n const startY = useRef(0);\n const startHeight = useRef(0);\n // Track which runId we're currently waiting for\n const pendingRunRef = useRef<{ runId: string; messageId: string } | null>(\n null,\n );\n\n const { executeFullWorkflow } = useNodeExecution();\n\n const [nodes, executionLogs, isExecutionRunning] = useFlowStore(\n useShallow((s) => [\n s.workflow.nodes,\n s.execution.logs,\n s.execution.isExecuting,\n ]),\n );\n\n // Detect if workflow has chat trigger or AI agent nodes\n const hasChatNodes = nodes?.some(\n (n) => n.type === \"store/chat-trigger\" || n.type === \"store/ai-agent\",\n );\n\n // Auto-scroll to bottom on new messages\n useEffect(() => {\n chatEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n // Watch execution logs for AI Agent completion (instead of HTTP polling).\n // The WebSocket subscription in useNodeExecution populates execution.logs in real time.\n useEffect(() => {\n if (!pendingRunRef.current || !isWaiting) return;\n\n const { runId, messageId } = pendingRunRef.current;\n\n // Find logs for this run\n const runLogs = executionLogs.filter((log) => log.runId === runId);\n if (runLogs.length === 0) return;\n\n // Check if the AI Agent node completed or failed\n const agentLog = runLogs.find(\n (log) =>\n log.nodeType === \"store/ai-agent\" &&\n (log.status === \"completed\" || log.status === \"failed\"),\n );\n\n if (agentLog) {\n if (agentLog.status === \"completed\" && agentLog.output) {\n const output =\n typeof agentLog.output === \"string\"\n ? JSON.parse(agentLog.output)\n : agentLog.output;\n\n const response =\n output?.conversationalAgent?.response ||\n output?.response ||\n JSON.stringify(output);\n\n const duration = agentLog.duration\n ? `${Number(agentLog.duration).toFixed(1)}s`\n : undefined;\n\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? { ...m, content: response, status: \"complete\", duration }\n : m,\n ),\n );\n } else {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? {\n ...m,\n content: `Error: ${agentLog.error || \"AI Agent execution failed\"}`,\n status: \"error\",\n }\n : m,\n ),\n );\n }\n pendingRunRef.current = null;\n setIsWaiting(false);\n return;\n }\n\n // Check if any node failed (may arrive before agent log or without agent)\n const failedLog = runLogs.find((l) => l.status === \"failed\");\n if (failedLog) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? {\n ...m,\n content: `Error: ${failedLog.error || \"Workflow execution failed\"}`,\n status: \"error\",\n }\n : m,\n ),\n );\n pendingRunRef.current = null;\n setIsWaiting(false);\n return;\n }\n\n // Also check if the entire execution is done (no AI agent found — maybe no agent node)\n if (!isExecutionRunning && runLogs.some((l) => l.status === \"completed\")) {\n // All completed but no AI agent — find the last completed node's output\n const lastCompleted = runLogs\n .filter((l) => l.status === \"completed\")\n .pop();\n const output = lastCompleted?.output\n ? typeof lastCompleted.output === \"string\"\n ? lastCompleted.output\n : JSON.stringify(lastCompleted.output, null, 2)\n : \"Workflow completed with no output\";\n\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? { ...m, content: output, status: \"complete\" }\n : m,\n ),\n );\n pendingRunRef.current = null;\n setIsWaiting(false);\n }\n }, [executionLogs, isExecutionRunning, isWaiting]);\n\n // Safety timeout — if 90 seconds pass without a response, mark as timed out\n useEffect(() => {\n if (!isWaiting || !pendingRunRef.current) return;\n\n const timeout = setTimeout(() => {\n if (pendingRunRef.current) {\n const { messageId } = pendingRunRef.current;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? {\n ...m,\n content: \"Timed out waiting for response\",\n status: \"error\",\n }\n : m,\n ),\n );\n pendingRunRef.current = null;\n setIsWaiting(false);\n }\n }, 90_000);\n\n return () => clearTimeout(timeout);\n }, [isWaiting]);\n\n // Resize handlers\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n isResizing.current = true;\n startY.current = e.clientY;\n startHeight.current = panelHeight;\n document.body.style.cursor = \"ns-resize\";\n document.body.style.userSelect = \"none\";\n },\n [panelHeight],\n );\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing.current) return;\n const deltaY = startY.current - e.clientY;\n const newHeight = Math.max(\n 200,\n Math.min(600, startHeight.current + deltaY),\n );\n setPanelHeight(newHeight);\n };\n const handleMouseUp = () => {\n isResizing.current = false;\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, []);\n\n const handleSend = useCallback(async () => {\n const message = inputValue.trim();\n if (!message || isWaiting) return;\n\n setInputValue(\"\");\n setIsWaiting(true);\n\n // Add user message\n const userMsgId = `user-${Date.now()}`;\n setMessages((prev) => [\n ...prev,\n {\n id: userMsgId,\n role: \"user\",\n content: message,\n timestamp: new Date(),\n },\n ]);\n\n // Add placeholder assistant message\n const assistantMsgId = `assistant-${Date.now()}`;\n setMessages((prev) => [\n ...prev,\n {\n id: assistantMsgId,\n role: \"assistant\",\n content: \"\",\n timestamp: new Date(),\n status: \"sending\",\n },\n ]);\n\n try {\n const result = await executeFullWorkflow({ message });\n\n if (result.success && result.runId) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMsgId ? { ...m, runId: result.runId } : m,\n ),\n );\n // Track this run — the useEffect watching executionLogs will pick up the result\n pendingRunRef.current = {\n runId: result.runId!,\n messageId: assistantMsgId,\n };\n } else {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMsgId\n ? {\n ...m,\n content: `Error: ${result.error || \"Failed to trigger workflow\"}`,\n status: \"error\",\n }\n : m,\n ),\n );\n setIsWaiting(false);\n }\n } catch (err) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMsgId\n ? {\n ...m,\n content: `Error: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n status: \"error\",\n }\n : m,\n ),\n );\n setIsWaiting(false);\n }\n }, [inputValue, isWaiting, executeFullWorkflow]);\n\n // Don't render if no chat-compatible nodes\n if (!hasChatNodes) return null;\n\n // Collapsed bar\n if (!isOpen) {\n return (\n <div className=\"border-t border-card-foreground/10 bg-card/95 backdrop-blur-sm h-10 flex items-center px-3 gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs gap-1.5\"\n onClick={() => setIsOpen(true)}\n >\n <Icon icon=\"mdi:chat-processing\" className=\"size-4 text-primary\" />\n Chat\n </Button>\n <span className=\"text-xs text-tertiary\">\n Test your AI workflow with messages\n </span>\n </div>\n );\n }\n\n return (\n <div\n className=\"relative border-t border-card-foreground/10 bg-card/95 backdrop-blur-sm flex flex-col\"\n style={{ height: panelHeight }}\n >\n {/* Resize Handle */}\n <div\n className=\"absolute top-0 left-0 right-0 h-1.5 cursor-ns-resize bg-transparent hover:bg-primary/30 transition-colors z-10 group\"\n onMouseDown={handleMouseDown}\n >\n <div className=\"absolute top-0.5 left-1/2 -translate-x-1/2 w-8 h-0.5 rounded-full bg-card-foreground/20 group-hover:bg-primary/50 transition-colors\" />\n </div>\n\n {/* Header */}\n <div className=\"h-10 flex items-center justify-between px-3 border-b border-card-foreground/10 shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6\"\n onClick={() => setIsOpen(false)}\n >\n <Icon icon=\"mdi:chevron-down\" className=\"size-4\" />\n </Button>\n <Icon icon=\"mdi:chat-processing\" className=\"size-4 text-primary\" />\n <span className=\"text-sm font-medium\">Chat</span>\n {messages.filter((m) => m.role === \"user\").length > 0 && (\n <span className=\"text-xs text-tertiary\">\n ({messages.filter((m) => m.role === \"user\").length} messages)\n </span>\n )}\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 text-xs\"\n onClick={() => {\n setMessages([\n {\n id: \"system-welcome\",\n role: \"system\",\n content: \"Send a message to test your AI workflow\",\n timestamp: new Date(),\n },\n ]);\n }}\n >\n <Icon icon=\"mdi:trash-can-outline\" className=\"size-3 mr-1\" />\n Clear chat\n </Button>\n </div>\n\n {/* Messages */}\n <div className=\"flex-1 overflow-y-auto px-4 py-3 space-y-3\">\n {messages.map((msg) => (\n <div\n key={msg.id}\n className={cn(\n \"flex\",\n msg.role === \"user\" && \"justify-end\",\n msg.role === \"system\" && \"justify-center\",\n msg.role === \"assistant\" && \"justify-start\",\n )}\n >\n {msg.role === \"system\" ? (\n <span className=\"text-xs text-tertiary italic\">\n {msg.content}\n </span>\n ) : (\n <div\n className={cn(\n \"max-w-[75%] rounded-2xl px-4 py-2.5 text-sm leading-relaxed\",\n msg.role === \"user\" &&\n \"bg-primary text-primary-foreground rounded-br-md\",\n msg.role === \"assistant\" &&\n \"bg-card-foreground/5 border border-card-foreground/10 rounded-bl-md\",\n msg.status === \"error\" &&\n \"bg-destructive/10 border-destructive/30 text-destructive\",\n )}\n >\n {msg.status === \"sending\" && !msg.content ? (\n <div className=\"flex items-center gap-1.5 py-1\">\n <div className=\"size-1.5 rounded-full bg-card-foreground/40 animate-bounce [animation-delay:0ms]\" />\n <div className=\"size-1.5 rounded-full bg-card-foreground/40 animate-bounce [animation-delay:150ms]\" />\n <div className=\"size-1.5 rounded-full bg-card-foreground/40 animate-bounce [animation-delay:300ms]\" />\n </div>\n ) : (\n <span className=\"whitespace-pre-wrap\">{msg.content}</span>\n )}\n {msg.runId && (\n <div className=\"text-[10px] mt-1 opacity-50\">\n Run: {msg.runId.slice(0, 8)}...\n </div>\n )}\n </div>\n )}\n </div>\n ))}\n <div ref={chatEndRef} />\n </div>\n\n {/* Input */}\n <div className=\"shrink-0 border-t border-card-foreground/10 px-3 py-2 flex gap-2\">\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n }}\n placeholder=\"Type a message...\"\n disabled={isWaiting}\n className={cn(\n \"flex-1 px-3 py-2 rounded-lg border border-card-foreground/15 bg-card text-sm\",\n \"focus:outline-none focus:ring-1 focus:ring-primary/50 focus:border-primary/50\",\n \"placeholder:text-card-foreground/30\",\n \"disabled:opacity-50\",\n )}\n />\n <Button\n size=\"sm\"\n onClick={handleSend}\n disabled={isWaiting || !inputValue.trim()}\n className=\"px-4\"\n >\n {isWaiting ? (\n <Icon icon=\"mdi:loading\" className=\"size-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:send\" className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n );\n};\n\nexport default ChatPanel;\n","/**\n * 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, 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\";\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 // 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 {/* 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 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 ) : 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 {\n useWorkflowVersions,\n useRestoreWorkflowVersion,\n} from \"../../../../../hooks/useWorkflows\";\n\nconst STATUS_STYLES: Record<\n string,\n {\n label: string;\n variant: \"default\" | \"secondary\" | \"outline\" | \"destructive\";\n }\n> = {\n DRAFT: { label: \"Draft\", variant: \"secondary\" },\n ACTIVE: { label: \"Active\", variant: \"default\" },\n ARCHIVED: { label: \"Archived\", variant: \"outline\" },\n DEPRECATED: { label: \"Deprecated\", variant: \"destructive\" },\n};\n\nexport function VersionHistoryPanel() {\n const params = useParams<{ id?: string; version?: string }>();\n const navigate = useNavigate();\n const workflowKey = params?.id ?? \"\";\n const currentVersion = params?.version ?? \"\";\n\n const { versions, loading, refetch } = useWorkflowVersions(workflowKey);\n const { restoreVersion, loading: restoring } = useRestoreWorkflowVersion();\n const [restoringVersion, setRestoringVersion] = useState<string | null>(null);\n\n const handleRestore = async (version: string) => {\n setRestoringVersion(version);\n try {\n const result = await restoreVersion(workflowKey, version);\n if (result?.success && result.workflow) {\n toast.success(\"Version restored\", {\n description: `Created ${result.workflow.version} from ${version}`,\n dismissible: true,\n });\n // Navigate to the new version\n navigate(\n `../workflow/${result.workflow.workflowKey}/${result.workflow.version}`,\n );\n } else {\n throw new Error(result?.message || \"Failed to restore version\");\n }\n } catch (error) {\n toast.error(\"Failed to restore version\", {\n description: error instanceof Error ? error.message : \"Unknown error\",\n });\n } finally {\n setRestoringVersion(null);\n }\n };\n\n const handleSwitchVersion = (version: string) => {\n navigate(`../workflow/${workflowKey}/${version}`);\n };\n\n return (\n <Sheet>\n <SheetTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex gap-1\"\n onClick={() => refetch()}\n >\n <History className=\"size-4\" />\n Versions\n </Button>\n </SheetTrigger>\n <SheetContent side=\"right\" className=\"w-[380px] sm:w-[420px]\">\n <SheetHeader>\n <SheetTitle className=\"flex items-center gap-2\">\n <History className=\"size-5\" />\n Version History\n </SheetTitle>\n </SheetHeader>\n\n <div className=\"mt-4 space-y-2 overflow-y-auto max-h-[calc(100vh-120px)]\">\n {loading ? (\n <div className=\"flex items-center justify-center py-8\">\n <Loader2 className=\"size-5 animate-spin text-muted-foreground\" />\n <span className=\"ml-2 text-muted-foreground text-sm\">\n Loading versions...\n </span>\n </div>\n ) : versions.length === 0 ? (\n <p className=\"text-muted-foreground text-sm text-center py-8\">\n No versions found.\n </p>\n ) : (\n versions.map((v) => {\n const isCurrent = v.version === currentVersion;\n const statusInfo =\n STATUS_STYLES[v.status ?? \"DRAFT\"] ?? STATUS_STYLES.DRAFT;\n\n return (\n <div\n key={v.id}\n className={`p-3 rounded-lg border transition-colors ${\n isCurrent\n ? \"border-primary/50 bg-primary/5\"\n : \"border-border hover:bg-accent/50\"\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-sm font-medium\">\n {v.version}\n </span>\n <Badge\n variant={statusInfo.variant}\n className=\"text-[10px] px-1.5 py-0 h-5\"\n >\n {statusInfo.label}\n </Badge>\n {isCurrent && (\n <Badge\n variant=\"outline\"\n className=\"text-[10px] px-1.5 py-0 h-5 border-primary text-primary\"\n >\n Current\n </Badge>\n )}\n </div>\n </div>\n\n {v.alias && (\n <p className=\"text-xs text-muted-foreground mt-1\">\n Alias: {v.alias}\n </p>\n )}\n\n <p className=\"text-xs text-muted-foreground mt-1\">\n {v.updatedAt\n ? new Intl.DateTimeFormat(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(new Date(v.updatedAt))\n : \"N/A\"}\n </p>\n\n {!isCurrent && (\n <div className=\"flex gap-2 mt-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => handleSwitchVersion(v.version)}\n >\n View\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n disabled={restoring}\n onClick={() => handleRestore(v.version)}\n >\n {restoringVersion === v.version ? (\n <Loader2 className=\"size-3 animate-spin mr-1\" />\n ) : (\n <RotateCcw className=\"size-3 mr-1\" />\n )}\n Restore\n </Button>\n </div>\n )}\n </div>\n );\n })\n )}\n </div>\n </SheetContent>\n </Sheet>\n );\n}\n","/**\n * ActivateWorkflowButton — Toggles workflow status between DRAFT and ACTIVE.\n *\n * - DRAFT → \"Activate\" (green button) — sets status to ACTIVE\n * - ACTIVE → \"Deactivate\" (outline button) — sets status back to DRAFT\n *\n * After activation, saving the workflow will create a new DRAFT version\n * instead of updating in-place, preserving the active version.\n */\nimport { useState } from \"react\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { useFlowStore } from \"../../../../stores/flow-store\";\nimport { useShallow } from \"zustand/shallow\";\nimport {\n useActivateWorkflow,\n useDeactivateWorkflow,\n} from \"../../../../../hooks/useWorkflows\";\n\nexport const ActivateWorkflowButton = () => {\n const [isProcessing, setIsProcessing] = useState(false);\n const [dbId, status, setWorkflow] = useFlowStore(\n useShallow((s) => [\n s.workflow.dbId,\n s.workflow.status,\n s.actions.setWorkflow,\n ]),\n );\n\n const { activateWorkflow } = useActivateWorkflow();\n const { deactivateWorkflow } = useDeactivateWorkflow();\n\n const isDraft = !status || status === \"DRAFT\";\n\n const handleToggle = async () => {\n if (!dbId) {\n toast.error(\"Please save the workflow first before activating.\");\n return;\n }\n\n setIsProcessing(true);\n try {\n if (isDraft) {\n const result = await activateWorkflow(dbId);\n if (result) {\n setWorkflow({ status: result.status });\n toast.success(\"Workflow activated\", {\n description: `Version ${result.version} is now ACTIVE. Future saves will create a new draft version.`,\n dismissible: true,\n });\n }\n } else {\n const result = await deactivateWorkflow(dbId);\n if (result) {\n setWorkflow({ status: result.status });\n toast.success(\"Workflow deactivated\", {\n description: `Version ${result.version} is now a DRAFT. Saves will update in-place.`,\n dismissible: true,\n });\n }\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n toast.error(isDraft ? \"Failed to activate\" : \"Failed to deactivate\", {\n description: message,\n });\n } finally {\n setIsProcessing(false);\n }\n };\n\n return (\n <Button\n onClick={handleToggle}\n disabled={isProcessing || !dbId}\n variant={isDraft ? \"default\" : \"outline\"}\n size=\"sm\"\n className={`flex gap-1 ${isDraft ? \"bg-green-600 hover:bg-green-700 text-white\" : \"\"}`}\n >\n <Icon\n icon={isDraft ? \"mynaui:check-circle\" : \"mynaui:pause-circle\"}\n className=\"size-4\"\n />\n {isProcessing ? \"Processing...\" : isDraft ? \"Activate\" : \"Deactivate\"}\n </Button>\n );\n};\n","import {\n Background,\n type EdgeTypes,\n MarkerType,\n type NodeChange,\n type NodeTypes,\n ReactFlow,\n useReactFlow,\n} from \"@xyflow/react\";\nimport { useCallback, useEffect, useState, useRef, useMemo } from \"react\";\nimport { useDeleteKeyCode } from \"../../hooks/use-delete-key-code\";\nimport { useOnNodesDelete } from \"../../hooks/use-on-nodes-delete\";\nimport { useNodeAutoAdjust } from \"../../hooks/use-node-auto-adjust\";\nimport CustomDeletableEdge from \"./components/edges/custom-deletable-edge\";\nimport { useAddNodeOnEdgeDrop } from \"../../hooks/use-add-node-on-edge-drop\";\nimport { useDragDropFlowBuilder } from \"../../hooks/use-drag-drop-flow-builder\";\nimport { useIsValidConnection } from \"../../hooks/use-is-valid-connection\";\nimport { CanvasControls } from \"./components/controls/canvas-controls\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport AddNodeFloatingMenu from \"./components/add-node-floating-menu/add-node-floating-menu\";\nimport { useFlowStore } from \"../../stores/flow-store\";\nimport { useShallow } from \"zustand/shallow\";\nimport {\n NODE_TYPES,\n NODE_CONFIGS,\n onNodeTypesUpdate,\n} from \"./components/blocks\";\nimport {\n getNodeMetadata,\n type NodeOperation,\n} from \"./components/blocks/nodes/node/node\";\nimport { Card, Button, Input } from \"@burdenoff/fe-libs/ui\";\nimport { SaveFlowButton } from \"./components/ui/save-flow-button\";\nimport { ExecuteWorkflowButton } from \"./components/ui/execute-workflow-button\";\nimport { Icon } from \"@iconify/react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { useParams } from \"react-router-dom\";\nimport { LogsPanel } from \"./components/logs-panel\";\nimport { ChatPanel } from \"./components/chat-panel\";\nimport { NodeDetailView } from \"../ndv/node-detail-view\";\nimport { VersionHistoryPanel } from \"./components/ui/version-history-panel\";\nimport { ActivateWorkflowButton } from \"./components/ui/activate-workflow-button\";\n\nconst edgeTypes: EdgeTypes = {\n deletable: CustomDeletableEdge,\n};\nconst edgeOptions = {\n type: \"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\n | undefined,\n nodeData: (node.data as Record<string, unknown>)?.nodeData as\n | Record<string, unknown>\n | undefined,\n },\n operations: (node.data as Record<string, unknown>)?.operations as\n | NodeOperation[]\n | undefined,\n });\n if (fallback?.node) {\n merged[node.type] = fallback.node;\n }\n }\n }\n\n return merged;\n }, [nodeTypesVersion, nodes]); // deps intentionally limited\n\n const [workflowName, setWorkflowName] = useState(name);\n const [workflowAlias, setWorkflowAlias] = useState(alias || \"\");\n\n useEffect(() => {\n setWorkflowName(name);\n }, [name]);\n\n useEffect(() => {\n setWorkflowAlias(alias || \"\");\n }, [alias]);\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newName = e.target.value;\n setWorkflowName(newName);\n setWorkflow({ name: newName, id: id, alias: workflowAlias });\n };\n\n const handleAliasChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newAlias = e.target.value;\n setWorkflowAlias(newAlias);\n setWorkflow({ name: workflowName, id: id, alias: newAlias });\n };\n\n const { getNodes } = useReactFlow();\n\n const {\n handleOnEdgeDropConnectEnd,\n floatingMenuWrapperRef,\n handleAddConnectedNode,\n } = useAddNodeOnEdgeDrop();\n\n const deleteKeyCode = useDeleteKeyCode();\n const onNodesDelete = useOnNodesDelete(nodes);\n\n const [onDragOver, onDrop] = useDragDropFlowBuilder();\n const isValidConnection = useIsValidConnection(nodes, edges);\n\n const autoAdjustNode = useNodeAutoAdjust();\n\n // Use a ref to enable recursive callback\n const handleAutoAdjustNodeAfterNodeMeasuredRef = useRef<(id: string) => void>(\n () => {},\n );\n\n const handleAutoAdjustNodeAfterNodeMeasured = useCallback(\n (id: string) => {\n setTimeout(() => {\n const node = getNodes().find((n) => n.id === id);\n if (!node) {\n return;\n }\n\n if (node.measured === undefined) {\n handleAutoAdjustNodeAfterNodeMeasuredRef.current(id);\n return;\n }\n\n autoAdjustNode(node);\n });\n },\n [autoAdjustNode, getNodes],\n );\n\n // Keep ref updated with latest callback - must be in useEffect to avoid accessing refs during render\n useEffect(() => {\n handleAutoAdjustNodeAfterNodeMeasuredRef.current =\n handleAutoAdjustNodeAfterNodeMeasured;\n }, [handleAutoAdjustNodeAfterNodeMeasured]);\n\n const handleNodesChange = useCallback(\n (changes: NodeChange[]) => {\n changes.forEach((change) => {\n if (change.type === \"dimensions\") {\n const node = getNodes().find((n) => n.id === change.id);\n if (node) {\n autoAdjustNode(node);\n }\n }\n\n if (change.type === \"add\") {\n handleAutoAdjustNodeAfterNodeMeasured(change.item.id);\n }\n });\n onNodesChange(changes);\n },\n [\n autoAdjustNode,\n getNodes,\n handleAutoAdjustNodeAfterNodeMeasured,\n onNodesChange,\n ],\n );\n\n return (\n <div className=\"flex flex-col h-full w-full overflow-hidden\">\n {!isReadOnly && (\n <Card className=\"h-14 shrink-0 border-0 from-primary/40 p-2 to-transparent rounded-none bg-gradient-to-r w-full items-center flex justify-between border-b border-card-foreground/10\">\n <div className=\"inline-flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"text-primary-foreground font-bold\"\n onClick={() => {\n navigate(\"../list\");\n }}\n >\n <Icon\n icon=\"ion:arrow-back-outline\"\n className=\"size-6 text-card-foreground\"\n />\n </Button>\n {/* <input className=\"text-card-foreground font-bold\">{name}</input> */}\n <Input\n className=\"text-card-foreground font-bold\"\n type=\"email\"\n placeholder=\"Workflow Name\"\n value={workflowName || name}\n onChange={handleNameChange}\n />\n <Input\n className=\"text-card-foreground font-bold ml-2\"\n type=\"text\"\n placeholder=\"Version Alias (optional)\"\n value={workflowAlias}\n onChange={handleAliasChange}\n />\n </div>\n\n {name !== \"\" && (\n <div className=\"inline-flex items-center gap-2\">\n <VersionHistoryPanel />\n <Button\n onClick={() => {\n // 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 }}\n disabled={!id}\n variant={\"outline\"}\n size={\"sm\"}\n className=\"flex gap-4\"\n >\n View Runs\n </Button>\n <SaveFlowButton />\n <ActivateWorkflowButton />\n <ExecuteWorkflowButton />\n </div>\n )}\n </Card>\n )}\n <div\n ref={(el) => {\n if (!el) return;\n const update = () =>\n el.style.setProperty(\n \"--canvas-left\",\n `${el.getBoundingClientRect().left}px`,\n );\n update();\n const ro = new ResizeObserver(update);\n ro.observe(document.documentElement);\n // Cleanup stored on element to avoid stale closures\n (el as HTMLDivElement & { _ro?: ResizeObserver })._ro?.disconnect();\n (el as HTMLDivElement & { _ro?: ResizeObserver })._ro = ro;\n }}\n className=\"relative w-full flex-1\"\n >\n <CanvasControls />\n <ReactFlow\n proOptions={{ hideAttribution: true }}\n onInit={({ fitView }) => fitView({ 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 { 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 // We use a ref (not state) to avoid a double-render. The ref is set\n // synchronously in useLayoutEffect, which runs BEFORE the browser paints.\n const [isStoreReady, setIsStoreReady] = useState(false);\n const hasHydrated = useRef(false);\n\n // useLayoutEffect runs synchronously AFTER DOM mutations but BEFORE paint.\n // This ensures the Zustand store is hydrated and NODE_TYPES are registered\n // before FlowBuilder mounts and React Flow processes nodes.\n useLayoutEffect(() => {\n if (hasHydrated.current) return;\n hasHydrated.current = true;\n\n // 1. Register fallback node type components for ALL workflow node types.\n if (workflow?.nodes) {\n registerWorkflowNodeTypes(workflow.nodes);\n }\n\n // 2. Reset and hydrate the Zustand store.\n resetWorkflow();\n if (workflow) {\n setWorkflow(workflow);\n }\n\n // 3. Allow FlowBuilder to mount.\n setIsStoreReady(true);\n }, [resetWorkflow, setWorkflow, workflow]);\n\n useEffect(() => {\n // Kick off dynamic node config loading in the background.\n // When it completes, the onNodeTypesUpdate subscriber in FlowBuilder\n // will trigger a re-render with the full node metadata (richer than fallbacks).\n ensureNodeConfigsLoaded().catch(() => {\n // Silently ignore — fallback components are already rendering\n });\n }, []);\n\n if (!isStoreReady) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-muted-foreground text-sm\">Loading workflow...</div>\n </div>\n );\n }\n\n return (\n <ReactFlowProvider>\n <IntegrationReturnHandler />\n <div className=\"flex flex-col h-full\">\n {/* 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 { FlowBuilderPage } from \"../_components/flow-builder\";\nimport { useEffect, useState, useRef, useMemo } from \"react\";\nimport { useFlowStore, type IFlowState } from \"../../../stores/flow-store\";\nimport {\n useLazyWorkflowDefinition,\n useCreateWorkflow,\n} from \"../../../../hooks/useWorkflows\";\n\ninterface WorkflowDefinitionData {\n nodes: IFlowState[\"workflow\"][\"nodes\"];\n edges: IFlowState[\"workflow\"][\"edges\"];\n sidebar: IFlowState[\"workflow\"][\"sidebar\"];\n}\n\nexport default function WorkflowItem({\n readonly = false,\n}: {\n readonly?: boolean;\n}) {\n if (readonly) {\n const queryParams = new URLSearchParams(window.location.search);\n queryParams.set(\"readonly\", \"true\");\n const newUrl = `${window.location.pathname}?${queryParams.toString()}`;\n window.history.replaceState(null, \"\", newUrl);\n }\n const { id, version } = useParams();\n const [workflow, setWorkflow] = useState<IFlowState[\"workflow\"] | null>(null);\n const [isLoading, setIsLoading] = useState(true); // Local loading state\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n const { getWorkflow } = useLazyWorkflowDefinition();\n const { createWorkflow } = useCreateWorkflow();\n const creatingRef = useRef(false); // Prevent duplicate creation\n\n const newWorkflow = useMemo(\n () => ({\n id: id ?? \"\",\n workflowKey: id ?? \"\",\n version: version ?? \"\",\n name: \"Untitled Workflow\",\n edges: [] as IFlowState[\"workflow\"][\"edges\"],\n nodes: [] as IFlowState[\"workflow\"][\"nodes\"],\n sidebar: {\n active: \"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 if (!version) {\n if (mounted) {\n setWorkflow(newWorkflow);\n setIsLoading(false);\n }\n return;\n }\n\n // Use GraphQL to fetch workflow by workflowKey + version\n const result = await getWorkflow(id, undefined, version);\n const definitionJson = result?.definitionJson as {\n data?: WorkflowDefinitionData;\n nodes?: unknown[];\n edges?: unknown[];\n } | null;\n\n // Support both { data: { nodes, edges } } and flat { nodes, edges } structures\n const defData =\n definitionJson?.data ??\n (definitionJson?.nodes\n ? (definitionJson as unknown as WorkflowDefinitionData)\n : undefined);\n\n if (mounted && defData) {\n // Map GraphQL response to workflow format - EXISTING workflow\n setWorkflow({\n ...defData,\n id: result?.workflowKey ?? \"\",\n workflowKey: result?.workflowKey ?? \"\",\n version: result?.version ?? \"\",\n name: result?.name ?? \"\",\n alias: result?.alias ?? \"\",\n dbId: result?.id ?? \"\",\n status: result?.status ?? \"DRAFT\",\n });\n } else if (mounted) {\n // Workflow not found - CREATE it in the database\n if (!creatingRef.current) {\n creatingRef.current = true;\n const initialDefinitionJson = {\n key: id,\n name: newWorkflow.name,\n description: newWorkflow.name,\n workflow_type: \"query-conditional\",\n data: {\n ...newWorkflow,\n },\n meta: {\n creator: \"api_create\",\n version: version,\n },\n tags: [],\n };\n\n try {\n const created = await createWorkflow({\n workflowKey: id!,\n version: version!,\n name: newWorkflow.name,\n description: newWorkflow.name,\n definitionJson: initialDefinitionJson,\n });\n\n if (created && mounted) {\n setWorkflow({\n ...newWorkflow,\n id: created.workflowKey,\n workflowKey: created.workflowKey,\n version: created.version,\n dbId: created.id,\n status: created.status ?? \"DRAFT\",\n });\n } else if (mounted) {\n // Fallback to template if creation fails\n console.warn(\n \"[debug] Workflow creation returned null, using template\",\n );\n setWorkflow(newWorkflow);\n }\n } catch (createError) {\n console.error(\"[debug] Error creating workflow:\", createError);\n if (mounted) {\n setWorkflow(newWorkflow);\n }\n }\n }\n }\n } catch (error) {\n console.error(\n \"[debug][workflowItem.useEffect] Error fetching workflow:\",\n error,\n );\n if (mounted) {\n setWorkflow(newWorkflow);\n }\n } finally {\n if (mounted) {\n setIsLoading(false);\n creatingRef.current = false;\n }\n }\n };\n\n loadWorkflow();\n return () => {\n mounted = false;\n };\n }, [id, version, createWorkflow, getWorkflow, newWorkflow, resetWorkflow]);\n\n if (isLoading) return <div>Loading...</div>;\n\n return workflow && !isLoading && <FlowBuilderPage workflow={workflow} />;\n}\n","import { ThemeProvider } from \"../builder/components/theme-provider\";\nimport WorkflowItem from \"../builder/app/workflow/work/page\";\nimport { ErrorBoundary } from \"@burdenoff/fe-libs/shared/components\";\nimport { useNavigate } from \"react-router-dom\";\nimport \"@xyflow/react/dist/style.css\";\n\n/**\n * WorkflowBuilder page with ErrorBoundary for graceful crash recovery.\n * If the builder throws (React Flow error, node rendering crash, etc.),\n * the user sees a recovery UI instead of a blank screen.\n */\nexport function WorkflowBuilder() {\n const navigate = useNavigate();\n\n return (\n <ErrorBoundary\n fallback={(error) => (\n <div className=\"flex flex-col items-center justify-center min-h-[60vh] gap-4 p-8\">\n <div className=\"rounded-lg border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bg-subtle)] p-6 max-w-lg w-full text-center\">\n <h2 className=\"text-lg font-semibold text-[var(--color-status-error-text)] mb-2\">\n Workflow Builder Error\n </h2>\n <p className=\"text-sm text-[var(--color-text-secondary)] mb-4\">\n Something went wrong while loading the workflow builder. This may\n be caused by invalid workflow data or a rendering issue.\n </p>\n {error && (\n <details className=\"text-left mb-4\">\n <summary className=\"text-xs text-[var(--color-text-tertiary)] cursor-pointer hover:text-[var(--color-text-secondary)]\">\n Error details\n </summary>\n <pre className=\"mt-2 p-2 bg-[var(--color-bg-canvas)] rounded text-xs overflow-auto max-h-32 text-[var(--color-text-tertiary)]\">\n {error.message}\n </pre>\n </details>\n )}\n <div className=\"flex gap-3 justify-center\">\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"px-4 py-2 text-sm font-medium rounded-md bg-[var(--color-bg-accent)] text-[var(--color-text-on-accent)] hover:opacity-90 transition-opacity\"\n >\n Reload Page\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(\"../list\")}\n className=\"px-4 py-2 text-sm font-medium rounded-md border border-default text-[var(--color-text-secondary)] hover:bg-[var(--color-bg-elevated)] transition-colors\"\n >\n Back to Workflows\n </button>\n </div>\n </div>\n </div>\n )}\n >\n <ThemeProvider>\n <WorkflowItem />\n </ThemeProvider>\n </ErrorBoundary>\n );\n}\n"]}