@burdenoff/fluidgrids-fe-sdk 2026.730.1 → 2026.730.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.
- package/dist/ExecutionDetailPage-H2KAEHLX.js +8 -0
- package/dist/{ExecutionDetailPage-G4FTQ5AF.js.map → ExecutionDetailPage-H2KAEHLX.js.map} +1 -1
- package/dist/ExecutionsListPage-ONF5IUB4.js +8 -0
- package/dist/{ExecutionsListPage-AAMQIVJS.js.map → ExecutionsListPage-ONF5IUB4.js.map} +1 -1
- package/dist/{WorkflowBuilder-2QYBWEWO.js → WorkflowBuilder-CLIMJZPI.js} +6 -6
- package/dist/{WorkflowBuilder-2QYBWEWO.js.map → WorkflowBuilder-CLIMJZPI.js.map} +1 -1
- package/dist/WorkflowsList-ZNSFZMAQ.js +10 -0
- package/dist/{WorkflowsList-ZTH4NVPS.js.map → WorkflowsList-ZNSFZMAQ.js.map} +1 -1
- package/dist/{blocks-7Q5XRFI7.js → blocks-M44L2H7I.js} +4 -4
- package/dist/{blocks-7Q5XRFI7.js.map → blocks-M44L2H7I.js.map} +1 -1
- package/dist/{chunk-47457KC3.js → chunk-42PCKNPK.js} +3 -3
- package/dist/{chunk-47457KC3.js.map → chunk-42PCKNPK.js.map} +1 -1
- package/dist/{chunk-U2OJNTKM.js → chunk-DZTLVUGS.js} +7 -7
- package/dist/{chunk-U2OJNTKM.js.map → chunk-DZTLVUGS.js.map} +1 -1
- package/dist/{chunk-3ZCTYLHL.js → chunk-ECX7WKZ3.js} +421 -40
- package/dist/chunk-ECX7WKZ3.js.map +1 -0
- package/dist/{chunk-3M2I2ITB.js → chunk-EPFS7HOM.js} +169 -57
- package/dist/chunk-EPFS7HOM.js.map +1 -0
- package/dist/{chunk-Y6U32527.js → chunk-GWO5RZQX.js} +4 -4
- package/dist/{chunk-Y6U32527.js.map → chunk-GWO5RZQX.js.map} +1 -1
- package/dist/{chunk-H7WSQN2I.js → chunk-IU65EQOS.js} +62 -3
- package/dist/chunk-IU65EQOS.js.map +1 -0
- package/dist/{chunk-LNY6ATSV.js → chunk-JTET2M65.js} +3 -3
- package/dist/{chunk-LNY6ATSV.js.map → chunk-JTET2M65.js.map} +1 -1
- package/dist/{chunk-D4XMKH2F.js → chunk-XPUAUQ3I.js} +3 -3
- package/dist/{chunk-D4XMKH2F.js.map → chunk-XPUAUQ3I.js.map} +1 -1
- package/dist/index.d.ts +207 -1
- package/dist/index.js +29 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/ExecutionDetailPage-G4FTQ5AF.js +0 -8
- package/dist/ExecutionsListPage-AAMQIVJS.js +0 -8
- package/dist/WorkflowsList-ZTH4NVPS.js +0 -10
- package/dist/chunk-3M2I2ITB.js.map +0 -1
- package/dist/chunk-3ZCTYLHL.js.map +0 -1
- package/dist/chunk-H7WSQN2I.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/builder/components/flow-builder/components/blocks/utils.ts","../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/GoogleChatForm.tsx","../src/modules/connections/components/provider-forms/providers/GoogleFormsForm.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/providers/CustomConfigForm.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/hooks/use-insert-node.ts","../src/builder/components/flow-builder/components/blocks/nodes/node/node.tsx","../src/builder/components/flow-builder/components/blocks/index.ts"],"names":["node","nodeLookup","edges","getConnectedEdges","jsx","cn","useMemo","jsxs","Icon","useState","useCallback","forwardRef","ExpressionEditorBlock","JsonBlock","useImperativeHandle","KeyValueBlock","AdaptiveCardRenderer","useRef","useEffect","AdaptiveCardBlock","UnknownBlock","Button","DEFAULT_SELECTED","config","gql","Fragment","useShallow","toast","Dialog","nanoid","useReactFlow","useStore","Handle","Position"],"mappings":"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","file":"chunk-LNY6ATSV.js","sourcesContent":["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 { 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> | 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 } | 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\nimport { throwIfResultError } from \"../../../graphql/errors\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ConnectionStatus =\n \"ACTIVE\" | \"INACTIVE\" | \"ERROR\" | \"EXPIRED\" | \"REVOKED\" | \"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\" | \"OAUTH1\" | \"API_KEY\" | \"BASIC_AUTH\" | \"BEARER_TOKEN\" | \"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 /** JSON-schema-ish form definition for CUSTOM providers (drives CustomConfigForm) */\n configSchema?: Record<string, unknown> | null;\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 = throwIfResultError(\n await client.mutate<{\n createConnection: IntegrationConnection;\n }>({\n mutation: CREATE_CONNECTION,\n variables: { input },\n }),\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 = throwIfResultError(\n await client.mutate<{\n initiateOAuth: OAuthInitiationResult;\n }>({\n mutation: INITIATE_OAUTH,\n variables: { input },\n }),\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 \"google-chat\": \"simple-icons:googlechat\",\n \"google-forms\": \"simple-icons:googleforms\",\n \"google-workspace-admin-domain-wide-delegation\": \"logos:google-workspace\",\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 * Resolve the best icon for a provider, preferring the curated map.\n *\n * The provider's DB `icon` field is a short slug (e.g. \"google-docs\"), NOT an\n * Iconify name — passing it straight to <Icon> renders nothing. Use the\n * curated map when the key is known; only fall back to the DB icon when it\n * already looks like an Iconify name (\"prefix:name\"), then to the generic icon.\n */\nexport function resolveProviderIcon(\n providerKey: string,\n dbIcon?: string | null,\n): string {\n const key = providerKey.toLowerCase();\n if (PROVIDER_ICONS[key]) return PROVIDER_ICONS[key];\n if (dbIcon && dbIcon.includes(\":\")) return dbIcon;\n return PROVIDER_ICONS.generic;\n}\n\n/**\n * Monochrome icon sets (simple-icons, mdi) inherit currentColor, so they must\n * be tinted with the provider's brand color to look right next to the\n * full-color `logos:*` icons. Returns the brand color when the resolved icon\n * is monochrome, undefined for full-color icons (tinting those is a no-op\n * anyway, but skipping it keeps the DOM clean).\n */\nexport function getProviderIconTint(providerKey: string): string | undefined {\n const icon = PROVIDER_ICONS[providerKey.toLowerCase()];\n if (!icon) return undefined;\n if (icon.startsWith(\"simple-icons:\") || icon.startsWith(\"mdi:\")) {\n return PROVIDER_COLORS[providerKey.toLowerCase()];\n }\n return undefined;\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 \"google-chat\": \"#00AC47\",\n \"google-forms\": \"#7248B9\",\n \"google-workspace-admin-domain-wide-delegation\": \"#1A73E8\",\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 * Google Chat Connection Form — OAuth2\n *\n * Dedicated form for Google Chat: messages, spaces, members.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst CHAT_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/chat.messages.readonly\",\n label: \"View chat messages\",\n },\n {\n scope: \"https://www.googleapis.com/auth/chat.messages\",\n label: \"View and manage chat messages\",\n },\n {\n scope: \"https://www.googleapis.com/auth/chat.messages.create\",\n label: \"Create chat messages\",\n },\n {\n scope: \"https://www.googleapis.com/auth/chat.spaces.readonly\",\n label: \"View chat spaces\",\n },\n {\n scope: \"https://www.googleapis.com/auth/chat.spaces\",\n label: \"View and manage chat spaces\",\n },\n {\n scope: \"https://www.googleapis.com/auth/chat.memberships.readonly\",\n label: \"View space members\",\n },\n {\n scope: \"https://www.googleapis.com/auth/chat.memberships\",\n label: \"View and manage space members\",\n },\n];\n\nconst DEFAULT_SELECTED = [\n \"https://www.googleapis.com/auth/chat.messages.readonly\",\n \"https://www.googleapis.com/auth/chat.spaces.readonly\",\n \"https://www.googleapis.com/auth/chat.memberships.readonly\",\n];\n\nexport function GoogleChatForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] =\n useState<string[]>(DEFAULT_SELECTED);\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/chat/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 Chat 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 Chat Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {CHAT_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\n icon=\"simple-icons:googlechat\"\n className=\"w-5 h-5\"\n style={{ color: \"#00AC47\" }}\n />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n}\n","/**\n * Google Forms Connection Form — OAuth2\n *\n * Dedicated form for Google Forms: forms, responses, watches.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst FORMS_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/forms.body.readonly\",\n label: \"View form structure\",\n },\n {\n scope: \"https://www.googleapis.com/auth/forms.body\",\n label: \"Create and edit forms\",\n },\n {\n scope: \"https://www.googleapis.com/auth/forms.responses.readonly\",\n label: \"View form responses\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive.readonly\",\n label: \"View Drive files (for form discovery)\",\n },\n];\n\nconst DEFAULT_SELECTED = [\n \"https://www.googleapis.com/auth/forms.body.readonly\",\n \"https://www.googleapis.com/auth/forms.responses.readonly\",\n];\n\nexport function GoogleFormsForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] =\n useState<string[]>(DEFAULT_SELECTED);\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/forms/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 Forms 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 Forms Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {FORMS_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\n icon=\"simple-icons:googleforms\"\n className=\"w-5 h-5\"\n style={{ color: \"#7248B9\" }}\n />\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'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 → API → 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 > 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., "Bearer",\n "Api-Key")\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 * Custom Config Connection Form — CUSTOM auth type\n *\n * ConfigSchema-driven form for CUSTOM providers (e.g. Google Workspace Admin\n * via domain-wide delegation). Renders one field per configSchema property,\n * validates required fields client-side, and submits the whole config object\n * to `authenticateWithCustomConfig` — secrets are stored only in the\n * encrypted credential payload, never in plain connection config.\n */\n\nimport { useState, useCallback, useMemo } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ConfigSchema, ProviderFormProps } from \"../types\";\n\n/**\n * Narrow the provider's configSchema (a plain JSON column) to the shape this\n * form renders. Returns null when it isn't a usable object schema.\n */\nfunction asConfigSchema(raw: unknown): ConfigSchema | null {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return null;\n }\n const candidate = raw as Partial<ConfigSchema>;\n if (\n typeof candidate.properties !== \"object\" ||\n candidate.properties === null\n ) {\n return null;\n }\n return {\n type: \"object\",\n properties: candidate.properties,\n required: Array.isArray(candidate.required) ? candidate.required : [],\n };\n}\n\nexport function CustomConfigForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const schema = useMemo(\n () => asConfigSchema(provider.configSchema),\n [provider.configSchema],\n );\n\n const [values, setValues] = useState<Record<string, string>>({});\n const [validationError, setValidationError] = useState<string>();\n\n const setValue = useCallback((field: string, value: string) => {\n setValues((prev) => ({ ...prev, [field]: value }));\n setValidationError(undefined);\n }, []);\n\n const requiredFields = useMemo(\n () => new Set(schema?.required ?? []),\n [schema],\n );\n\n const handleSubmit = useCallback(async () => {\n if (!schema) return;\n\n for (const field of schema.required ?? []) {\n if (!values[field]?.trim()) {\n setValidationError(\n `${schema.properties[field]?.title ?? field} is required`,\n );\n return;\n }\n }\n\n // Only submit fields declared by the schema, trimmed; empty optional\n // fields are omitted so backend defaults (e.g. customerId=my_customer)\n // apply.\n const config: Record<string, unknown> = {};\n for (const field of Object.keys(schema.properties)) {\n const value = values[field]?.trim();\n if (value) config[field] = value;\n }\n\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config,\n });\n }, [schema, values, connectionName, connectionDescription, onSubmit]);\n\n if (!schema) {\n return (\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\">\n This provider does not declare a configuration form.\n </span>\n </div>\n );\n }\n\n const displayError = validationError ?? error;\n\n return (\n <div className=\"space-y-5\">\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 <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 <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 {Object.entries(schema.properties).map(([field, def]) => (\n <div key={field}>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {def.title ?? field}{\" \"}\n {requiredFields.has(field) && (\n <span className=\"text-red-500\">*</span>\n )}\n </label>\n {def.secret ? (\n <textarea\n value={values[field] ?? \"\"}\n onChange={(e) => setValue(field, e.target.value)}\n placeholder={def.description}\n disabled={isSubmitting}\n rows={4}\n autoComplete=\"off\"\n spellCheck={false}\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 ) : (\n <input\n type=\"text\"\n value={values[field] ?? \"\"}\n onChange={(e) => setValue(field, e.target.value)}\n placeholder={def.description}\n disabled={isSubmitting}\n autoComplete=\"off\"\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 )}\n {def.description && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {def.description}\n </p>\n )}\n </div>\n ))}\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:shield-lock\" className=\"w-4 h-4\" />\n Secret fields are stored encrypted and never shown again.\n </div>\n </div>\n\n {displayError && (\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\">{displayError}</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-primary text-primary-foreground hover:bg-primary/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:content-save\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Saving...\" : \"Save connection\"}\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\";\nimport { GoogleChatForm } from \"./providers/GoogleChatForm\";\nimport { GoogleFormsForm } from \"./providers/GoogleFormsForm\";\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// Provider-specific forms — CUSTOM (configSchema-driven)\nimport { CustomConfigForm } from \"./providers/CustomConfigForm\";\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 \"google-chat\": GoogleChatForm,\n \"google-forms\": GoogleFormsForm,\n \"google-workspace-admin-domain-wide-delegation\": CustomConfigForm,\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 case \"CUSTOM\":\n return CustomConfigForm;\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 GoogleChatForm,\n GoogleFormsForm,\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 // CUSTOM\n CustomConfigForm,\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 getProviderIconTint,\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 “{search}”\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 // Tint monochrome (simple-icons/mdi) glyphs with the brand\n // color; full-color logos:* icons ignore this.\n style={{ color: getProviderIconTint(provider.key) }}\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\nimport { throwIfResultError } from \"../../../graphql/errors\";\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: ApiKeyAuthInput!) {\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: BasicAuthInput!) {\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($input: BearerTokenAuthInput!) {\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 AUTHENTICATE_WITH_CUSTOM_CONFIG = gql`\n mutation AuthenticateWithCustomConfig($input: CustomConfigAuthInput!) {\n authenticateWithCustomConfig(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 = throwIfResultError(\n 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 // CUSTOM providers: config carries secrets (e.g. service-account\n // JSON), so it must NOT land in the plain connection.config\n // column — it is only sent to authenticateWithCustomConfig,\n // which stores it in the encrypted credential payload.\n config:\n data.provider.authType === \"CUSTOM\" ? undefined : data.config,\n },\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 = throwIfResultError(\n 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\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 = throwIfResultError(\n 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 );\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 = throwIfResultError(\n 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 );\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 = throwIfResultError(\n 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 );\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 case \"CUSTOM\": {\n if (!data.config || Object.keys(data.config).length === 0) {\n throw new Error(\"Connection config is required\");\n }\n const customResult = throwIfResultError(\n await client.mutate<{\n authenticateWithCustomConfig: IntegrationConnection;\n }>({\n mutation: AUTHENTICATE_WITH_CUSTOM_CONFIG,\n variables: {\n input: {\n connectionId: connection.id,\n config: data.config,\n },\n },\n }),\n );\n const conn = customResult.data?.authenticateWithCustomConfig;\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 = throwIfResultError(\n 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 );\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 {\n resolveProviderIcon,\n getProviderIconTint,\n getAuthTypeLabel,\n} 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={resolveProviderIcon(\n selectedProvider.key,\n selectedProvider.icon,\n )}\n className=\"w-7 h-7\"\n style={{\n color: getProviderIconTint(selectedProvider.key),\n }}\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={resolveProviderIcon(\n selectedProvider.key,\n selectedProvider.icon,\n )}\n className=\"w-8 h-8\"\n style={{\n color: getProviderIconTint(selectedProvider.key),\n }}\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 {\n getProviderIconTint,\n resolveProviderIcon,\n} from \"../utils/provider-helpers\";\nimport { SdkPermissionGate } from \"../../../permissions/PermissionsBridge\";\nimport { FLUIDGRIDS_PERMISSIONS } from \"../../../permissions/constants\";\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// resolveProviderIcon / getProviderIconTint 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 = resolveProviderIcon(providerKey, connectionData?.provider?.icon);\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\n icon={icon}\n className=\"w-4 h-4\"\n style={{ color: getProviderIconTint(providerKey) }}\n />\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={resolveProviderIcon(\n conns[0]?.provider?.key || \"\",\n conns[0]?.provider?.icon,\n )}\n className=\"w-4 h-4\"\n style={{\n color: getProviderIconTint(\n conns[0]?.provider?.key || \"\",\n ),\n }}\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 <SdkPermissionGate\n permission={FLUIDGRIDS_PERMISSIONS.INTEGRATION_CONNECTION_CREATE}\n >\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 </SdkPermissionGate>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Quick New Button */}\n {selectedConnections.length === 0 && !compact && (\n <SdkPermissionGate\n permission={FLUIDGRIDS_PERMISSIONS.INTEGRATION_CONNECTION_CREATE}\n >\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 </SdkPermissionGate>\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\nimport { throwIfResultError } from \"../../graphql/errors\";\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 } = throwIfResultError(\n 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\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 } = throwIfResultError(\n 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\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 } = throwIfResultError(\n 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\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\";\nimport { Icon } from \"@iconify/react\";\nimport { nodeAccent } from \"./node-card\";\n\nexport interface NodeInfoMetadata {\n /** Iconify icon name for the node (e.g. \"logos:google-gmail\"). */\n icon?: string;\n /** Display title of the node (e.g. \"Gmail\", \"HTTP Request\"). */\n title?: string;\n description?: string;\n /** Manifest node type identifier (e.g. \"store/gmail_reader\"). */\n nodeType?: string;\n version?: string;\n /** Kind tags from the node manifest (e.g. [\"communication\", \"email\"]). */\n kind?: string[];\n /** The operation this node instance is pinned to, when configured. */\n operation?: string;\n}\n\n/** Label/value row; renders nothing when the value is empty. */\nfunction InfoRow({ label, value }: { label: string; value?: string }) {\n if (!value) return null;\n return (\n <div className=\"flex gap-2 text-sm\">\n <span className=\"w-24 shrink-0 font-medium text-muted-foreground\">\n {label}\n </span>\n <span className=\"min-w-0 break-words text-card-foreground\">{value}</span>\n </div>\n );\n}\n\n/**\n * The \"i\" toolbar button on a node card. Opens a dialog showing the node's\n * own manifest details (title, type, version, kind, pinned operation).\n */\nexport function NodeInfoButtonWithModal({\n metadata,\n}: {\n metadata: NodeInfoMetadata;\n}) {\n const title = metadata.title || metadata.nodeType || \"Node\";\n const accent = nodeAccent(metadata.nodeType || title);\n return (\n <Dialog>\n <DialogTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`Show ${title} node 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 {metadata.icon ? (\n <span\n className=\"flex size-8 shrink-0 items-center justify-center rounded-lg\"\n style={{ color: accent }}\n >\n <Icon icon={metadata.icon} className=\"size-6\" />\n </span>\n ) : null}\n {title}\n </DialogTitle>\n {metadata.description ? (\n <DialogDescription>{metadata.description}</DialogDescription>\n ) : null}\n </DialogHeader>\n <div className=\"space-y-1.5\">\n <InfoRow label=\"Type\" value={metadata.nodeType} />\n <InfoRow\n label=\"Version\"\n value={metadata.version ? `v${metadata.version}` : undefined}\n />\n <InfoRow label=\"Operation\" value={metadata.operation} />\n <InfoRow\n label=\"Kind\"\n value={\n metadata.kind && metadata.kind.length > 0\n ? metadata.kind.join(\", \")\n : undefined\n }\n />\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 { describeOperationError, throwIfResultError } from \"../graphql/errors\";\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 = throwIfResultError(\n 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 );\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 = describeOperationError(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 = throwIfResultError(\n 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 );\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 = describeOperationError(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 { 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> | 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 } | 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 allOps = (config?.operations ?? []) as NodeOperation[];\n // Ignore executor plumbing when deciding whether there is exactly one\n // operation to auto-pin: adapter ops (supplyModel/supplyTool/…) are\n // invoked automatically when the node is attached to an adapter port,\n // and `internal` ops (planStep) are driven by the executor loop.\n // Counting them left single-purpose nodes (chat model: chatCompletion +\n // supplyModel + supplyTool) looking multi-op, so they dropped as\n // \"Not configured\".\n const ops = allOps.filter(\n (op) =>\n !op.isAdapterOperation && !(op as { internal?: boolean }).internal,\n );\n if (ops.length === 1 && ops[0]?.name) {\n pinTo = ops[0].name;\n } else if (ops.length === 0 && allOps.length > 0) {\n // Pure sub-node (only adapter ops): pin its adapter operation so it\n // lands configured for its role rather than \"Not configured\".\n pinTo = allOps.find((op) => op.isAdapterOperation)?.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 {\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, useState } 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 { Icon } from \"@iconify/react\";\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\";\nimport { useInsertNode } from \"../../../../../../hooks/use-insert-node\";\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 */\n/** A sub-node candidate offered by the adapter port's \"+\" picker. */\ninterface SubNodeCandidate {\n type: string;\n title: string;\n icon: string;\n description?: string;\n /** The node's isAdapterOperation, so the new node lands already configured. */\n adapterOperation?: string;\n}\n\n/**\n * Compatible sub-nodes for an adapter port, taken from the loaded node registry\n * (NODE_CONFIGS) and filtered with the SAME rules the canvas uses to accept a\n * connection — so the picker can only ever offer something that will attach.\n */\nfunction useCompatibleSubNodes(adapter: NodeAdapter): SubNodeCandidate[] {\n return useMemo(() => {\n const out: SubNodeCandidate[] = [];\n for (const cfg of NODE_CONFIGS) {\n const nodeData = (\n cfg.defaultData as unknown as\n | {\n nodeData?: {\n kind?: string[];\n adapterOutputType?: string;\n supportsAdapterMode?: boolean;\n name?: string;\n description?: string;\n icon?: string;\n };\n }\n | undefined\n )?.nodeData;\n\n // Only nodes that actually declare themselves usable as a sub-node.\n if (!nodeData?.adapterOutputType && !nodeData?.supportsAdapterMode) {\n continue;\n }\n if (\n !isAdapterCompatible(\n adapter.filter,\n adapter.type,\n nodeData?.kind,\n nodeData?.adapterOutputType,\n cfg.type,\n )\n ) {\n continue;\n }\n\n const ops = (cfg.operations ?? []) as Array<{\n name?: string;\n isAdapterOperation?: boolean;\n }>;\n out.push({\n type: cfg.type,\n title: cfg.detail?.title || nodeData?.name || cfg.type,\n icon: cfg.detail?.icon || nodeData?.icon || \"mynaui:puzzle\",\n description: cfg.detail?.description || nodeData?.description,\n adapterOperation: ops.find((o) => o.isAdapterOperation)?.name,\n });\n }\n return out.sort((a, b) => a.title.localeCompare(b.title));\n }, [adapter.filter, adapter.type]);\n}\n\n/**\n * A single adapter port: connector line, diamond, label, and the \"+\" button\n * which opens an n8n-style picker of compatible sub-nodes. Choosing one creates\n * the sub-node beneath the parent and wires it to this port in one step.\n */\nfunction AdapterPort({\n nodeId,\n adapter,\n index,\n total,\n}: {\n nodeId: string;\n adapter: NodeAdapter;\n index: number;\n total: number;\n}) {\n const edges = useStore((s) => s.edges);\n const { getNode } = useReactFlow();\n const insertNode = useInsertNode();\n const onConnect = useFlowStore((s) => s.actions.edges.onConnect);\n const [pickerOpen, setPickerOpen] = useState(false);\n const candidates = useCompatibleSubNodes(adapter);\n\n const connectionCount = edges.filter(\n (e) => e.source === nodeId && e.sourceHandle === adapter.name,\n ).length;\n const isAtMaxConnections =\n adapter.maxConnections != null &&\n adapter.maxConnections !== undefined &&\n connectionCount >= adapter.maxConnections;\n\n // NOTE: do NOT use the legacy `accent`/`card` tokens for backgrounds. They are\n // bare HSL triplets (\"217.2 32.6% 17.5%\"), which are not valid CSS colors\n // under Tailwind v4 — `bg-accent` resolves to transparent, which is why the\n // connector line, diamond and handles were invisible. `text-*`/`border-*`\n // merely fell back to currentColor and so happened to look fine.\n const hasConnection = connectionCount > 0;\n const diamondColor = hasConnection\n ? \"bg-[var(--color-accent-primary)]\"\n : \"bg-[var(--color-text-muted)]\";\n const lineColor = hasConnection\n ? \"before:bg-[var(--color-accent-primary)]\"\n : \"before:bg-[var(--color-border-strong)]\";\n\n /** Create the chosen sub-node below the parent and attach it to this port. */\n const addSubNode = useCallback(\n (candidate: SubNodeCandidate) => {\n setPickerOpen(false);\n const parent = getNode(nodeId);\n const origin = parent?.position ?? { x: 0, y: 0 };\n const parentHeight = parent?.measured?.height ?? 180;\n const SPACING = 180;\n const position = {\n x: origin.x + (index - (total - 1) / 2) * SPACING,\n y: origin.y + parentHeight + 190,\n };\n\n const created = insertNode(\n candidate.type as ExtendedNodeType,\n position,\n candidate.adapterOperation,\n );\n if (!created?.id) return;\n\n // Mark it as an adapter instance so it renders as the compact circular\n // sub-node straight away, rather than briefly appearing as a full node\n // card until the edge below is registered.\n created.data = {\n ...(created.data as Record<string, unknown>),\n isAdapterInstance: true,\n };\n\n onConnect({\n source: nodeId,\n sourceHandle: adapter.name,\n target: created.id,\n targetHandle: \"target\",\n });\n },\n [getNode, nodeId, index, total, insertNode, onConnect, adapter.name],\n );\n\n return (\n <div className=\"relative\">\n {/* The connector line is the ::before below. It must NOT use a negative\n z-index — that paints it behind the node's own background. It renders\n first, so the diamond / label / + button paint on top of it. */}\n <div\n className={`p-0.5 m-0.5 text-center before:content-[''] before:h-[95%] before:left-1/2 before:-translate-x-1/2 before:w-0.5 ${lineColor} before:absolute before:top-0 before:pointer-events-none`}\n >\n {/* Diamond at the top (decorative — must not swallow clicks on \"+\") */}\n <div className=\"absolute -top-3 left-1/2 transform -translate-x-1/2 pointer-events-none\">\n <div\n className={`w-3 h-3 ${diamondColor} rotate-45 transition-transform hover:scale-110`}\n ></div>\n </div>\n\n {/* Title with asterisk for required */}\n <div className=\"mt-3 z-10 absolute left-1/2 transform -translate-x-1/2 font-medium bg-surface h-fit pointer-events-none\">\n <span className=\"text-xs max-w-fit relative font-medium text-[var(--color-text-secondary)] 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 (opens the sub-node picker) and the React Flow Handle.\n These are stacked vertically, NOT overlaid: React Flow positions a\n Handle absolutely, which sat on top of the \"+\" and swallowed every\n click (the button was unclickable). Forcing the handle back into\n normal flow below the button keeps both usable — click \"+\" to pick a\n sub-node, or drag from the dot to wire one up by hand. */}\n <div className=\"mt-16 flex flex-col items-center gap-1.5\">\n {!isAtMaxConnections && (\n <button\n type=\"button\"\n title={`Add ${adapter.name}`}\n aria-label={`Add ${adapter.name}`}\n onClick={(e) => {\n e.stopPropagation();\n setPickerOpen((v) => !v);\n }}\n className=\"w-5 h-5 border-2 border-[var(--color-border-strong)] rounded text-[var(--color-text-secondary)] text-lg leading-none font-bold bg-surface flex items-center justify-center transition-colors hover:border-[var(--color-accent-primary)] hover:text-[var(--color-accent-primary)] cursor-pointer\"\n >\n +\n </button>\n )}\n {isAtMaxConnections && (\n <div\n title={`${adapter.name} is full`}\n className=\"w-5 h-5 border-2 border-[var(--color-border-subtle)] rounded text-[var(--color-text-disabled)] text-lg leading-none font-bold bg-surface flex items-center justify-center\"\n >\n •\n </div>\n )}\n <Handle\n type=\"source\"\n position={Position.Bottom}\n id={adapter?.name}\n className=\"!relative !top-auto !left-auto !right-auto !bottom-auto !transform-none !w-2.5 !h-2.5 !min-w-0 !min-h-0 !rounded-full !border-0 bg-[var(--color-accent-primary)]\"\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\n {/* Sub-node picker — only ever lists nodes that will actually attach */}\n {pickerOpen && (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setPickerOpen(false)}\n />\n <div className=\"absolute z-50 top-[86px] left-1/2 -translate-x-1/2 w-60 rounded-lg border border-[var(--color-border-default)] bg-[var(--color-surface-elevated)] shadow-xl overflow-hidden text-left nodrag nowheel\">\n <div className=\"px-3 py-2 border-b border-[var(--color-border-subtle)]\">\n <p className=\"text-xs font-semibold text-[var(--color-text-primary)]\">\n Add {adapter.name}\n </p>\n <p className=\"text-[10px] text-[var(--color-text-muted)]\">\n {candidates.length} compatible node\n {candidates.length === 1 ? \"\" : \"s\"}\n </p>\n </div>\n <div className=\"max-h-56 overflow-y-auto\">\n {candidates.length === 0 && (\n <p className=\"px-3 py-3 text-[11px] text-[var(--color-text-muted)]\">\n No compatible node installed. Publish and install one from\n the Node Store first.\n </p>\n )}\n {candidates.map((c) => (\n <button\n type=\"button\"\n key={c.type}\n onClick={(e) => {\n e.stopPropagation();\n addSubNode(c);\n }}\n className=\"w-full flex items-start gap-2 px-3 py-2 hover:bg-[var(--color-bg-elevated)] transition-colors text-left\"\n >\n <Icon\n icon={c.icon}\n className=\"size-4 mt-0.5 shrink-0 text-[var(--color-accent-primary)]\"\n />\n <span className=\"min-w-0\">\n <span className=\"block text-xs text-[var(--color-text-primary)] truncate\">\n {c.title}\n </span>\n {c.description && (\n <span className=\"block text-[10px] text-[var(--color-text-muted)] line-clamp-2\">\n {c.description}\n </span>\n )}\n </span>\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\nfunction AdapterConnectors({\n nodeId,\n adapters,\n}: {\n nodeId: string;\n adapters?: NodeAdapter[];\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, i: number) => (\n <AdapterPort\n key={adapter.name}\n nodeId={nodeId}\n adapter={adapter}\n index={i}\n total={adapters.length}\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 openNdv = useFlowStore((s) => s.actions.ndv.open);\n const [nodeStatuses] = useFlowStore(\n useShallow((s) => [s.execution.nodeStatuses]),\n );\n\n const nodeStatus = nodeStatuses[id] || \"idle\";\n // Semantic status tokens (theme-aware) rather than raw Tailwind palette colors.\n const statusRing =\n nodeStatus === \"success\"\n ? \"ring-2 ring-[var(--color-status-success-border)]\"\n : nodeStatus === \"error\"\n ? \"ring-2 ring-[var(--color-status-error-border)]\"\n : nodeStatus === \"running\"\n ? \"ring-2 ring-[var(--color-status-info-border)] animate-pulse\"\n : \"\";\n\n // Sub-nodes open the NDV on double-click, exactly like a normal node — that\n // is where the manifest-driven config (model, temperature, credentials) is\n // rendered. Previously they opened only the sidebar property panel, so a\n // sub-node had no way to reach the full detail view.\n const handleShowNodeProperties = useCallback(() => {\n openNdv({ nodeId: id, type: nodeType as ExtendedNodeType });\n showNodePropertiesOf({ id, type: nodeType as ExtendedNodeType });\n }, [id, nodeType, openNdv, showNodePropertiesOf]);\n\n return (\n // `relative` anchors the absolute delete button; `group` enables its hover reveal.\n <div className=\"relative group 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-[var(--color-accent-primary)] border-2 border-[var(--color-border-strong)]\"\n />\n\n {/* Dashed line from handle to circle */}\n <div className=\"w-0.5 h-4 border-l-2 border-dashed border-[var(--color-border-strong)]\"></div>\n\n {/* Label above the circle */}\n <span className=\"text-[10px] text-[var(--color-text-muted)] 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-[var(--color-surface-elevated)] border-2 border-[var(--color-border-strong)] flex items-center justify-center shadow-lg cursor-pointer transition-all hover:border-[var(--color-accent-primary)] hover:shadow-xl ${statusRing}`}\n onDoubleClick={handleShowNodeProperties}\n data-selected={selected}\n >\n {/* Local (bundled) icon — matches the rest of the builder and avoids a\n remote fetch to api.iconify.design that renders broken when offline. */}\n <Icon icon={meta.icon} className=\"w-7 h-7 text-accent opacity-80\" />\n </div>\n\n {/* Title below — prefer the operation-specific label so multiple tool\n sub-nodes of the same node type (e.g. several Gmail operations) are\n distinguishable instead of all showing the node name. */}\n <span className=\"mt-1.5 text-xs text-[var(--color-text-secondary)] font-medium text-center max-w-24 leading-tight\">\n {(data?.label as string) ||\n (data?.args as { state?: { operation?: string } })?.state\n ?.operation ||\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-[var(--color-status-error)] text-white text-[10px] flex items-center justify-center opacity-0 group-hover:opacity-100 hover:bg-[var(--color-status-error)] transition-opacity\"\n >\n ×\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 | 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 isExecuting,\n executingNodeId,\n nodeStatuses,\n nodeItemCounts,\n zustandSetNodes,\n ] = useFlowStore(\n useShallow((s) => [\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 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 // This node instance's own manifest details for the \"i\" info dialog.\n const nodeInfoMetadata = {\n icon: meta.icon,\n title: meta.title,\n description: nodeDescription,\n nodeType: value?.type,\n version:\n (data?.nodeData as { version?: string } | undefined)?.version ||\n (data?.version as string | undefined),\n kind: nodeKinds,\n operation: data?.operation_name as string | undefined,\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={handleOpenNdv}\n onExecute={handleExecuteStep}\n onDelete={handleDeleteNode}\n infoButton={<NodeInfoButtonWithModal metadata={nodeInfoMetadata} />}\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={handleOpenNdv}\n onExecute={handleExecuteStep}\n onDelete={handleDeleteNode}\n infoButton={<NodeInfoButtonWithModal metadata={nodeInfoMetadata} />}\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[] } | unknown[] | 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[] } | unknown[] | 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 | undefined,\n nodeData: (node.data as Record<string, unknown>)?.nodeData as\n Record<string, unknown> | undefined,\n },\n operations: (node.data as Record<string, unknown>)?.operations as\n NodeOperation[] | undefined,\n });\n if (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"]}
|
|
1
|
+
{"version":3,"sources":["../src/builder/components/flow-builder/components/blocks/utils.ts","../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/GoogleChatForm.tsx","../src/modules/connections/components/provider-forms/providers/GoogleFormsForm.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/providers/CustomConfigForm.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/hooks/use-insert-node.ts","../src/builder/components/flow-builder/components/blocks/nodes/node/node.tsx","../src/builder/components/flow-builder/components/blocks/index.ts"],"names":["node","nodeLookup","edges","getConnectedEdges","jsx","cn","useMemo","jsxs","Icon","useState","useCallback","forwardRef","ExpressionEditorBlock","JsonBlock","useImperativeHandle","KeyValueBlock","AdaptiveCardRenderer","useRef","useEffect","AdaptiveCardBlock","UnknownBlock","Button","DEFAULT_SELECTED","config","gql","Fragment","useShallow","toast","Dialog","nanoid","useReactFlow","useStore","Handle","Position"],"mappings":"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","file":"chunk-JTET2M65.js","sourcesContent":["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 { 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> | 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 } | 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\nimport { throwIfResultError } from \"../../../graphql/errors\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ConnectionStatus =\n \"ACTIVE\" | \"INACTIVE\" | \"ERROR\" | \"EXPIRED\" | \"REVOKED\" | \"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\" | \"OAUTH1\" | \"API_KEY\" | \"BASIC_AUTH\" | \"BEARER_TOKEN\" | \"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 /** JSON-schema-ish form definition for CUSTOM providers (drives CustomConfigForm) */\n configSchema?: Record<string, unknown> | null;\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 = throwIfResultError(\n await client.mutate<{\n createConnection: IntegrationConnection;\n }>({\n mutation: CREATE_CONNECTION,\n variables: { input },\n }),\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 = throwIfResultError(\n await client.mutate<{\n initiateOAuth: OAuthInitiationResult;\n }>({\n mutation: INITIATE_OAUTH,\n variables: { input },\n }),\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 \"google-chat\": \"simple-icons:googlechat\",\n \"google-forms\": \"simple-icons:googleforms\",\n \"google-workspace-admin-domain-wide-delegation\": \"logos:google-workspace\",\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 * Resolve the best icon for a provider, preferring the curated map.\n *\n * The provider's DB `icon` field is a short slug (e.g. \"google-docs\"), NOT an\n * Iconify name — passing it straight to <Icon> renders nothing. Use the\n * curated map when the key is known; only fall back to the DB icon when it\n * already looks like an Iconify name (\"prefix:name\"), then to the generic icon.\n */\nexport function resolveProviderIcon(\n providerKey: string,\n dbIcon?: string | null,\n): string {\n const key = providerKey.toLowerCase();\n if (PROVIDER_ICONS[key]) return PROVIDER_ICONS[key];\n if (dbIcon && dbIcon.includes(\":\")) return dbIcon;\n return PROVIDER_ICONS.generic;\n}\n\n/**\n * Monochrome icon sets (simple-icons, mdi) inherit currentColor, so they must\n * be tinted with the provider's brand color to look right next to the\n * full-color `logos:*` icons. Returns the brand color when the resolved icon\n * is monochrome, undefined for full-color icons (tinting those is a no-op\n * anyway, but skipping it keeps the DOM clean).\n */\nexport function getProviderIconTint(providerKey: string): string | undefined {\n const icon = PROVIDER_ICONS[providerKey.toLowerCase()];\n if (!icon) return undefined;\n if (icon.startsWith(\"simple-icons:\") || icon.startsWith(\"mdi:\")) {\n return PROVIDER_COLORS[providerKey.toLowerCase()];\n }\n return undefined;\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 \"google-chat\": \"#00AC47\",\n \"google-forms\": \"#7248B9\",\n \"google-workspace-admin-domain-wide-delegation\": \"#1A73E8\",\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 * Google Chat Connection Form — OAuth2\n *\n * Dedicated form for Google Chat: messages, spaces, members.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst CHAT_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/chat.messages.readonly\",\n label: \"View chat messages\",\n },\n {\n scope: \"https://www.googleapis.com/auth/chat.messages\",\n label: \"View and manage chat messages\",\n },\n {\n scope: \"https://www.googleapis.com/auth/chat.messages.create\",\n label: \"Create chat messages\",\n },\n {\n scope: \"https://www.googleapis.com/auth/chat.spaces.readonly\",\n label: \"View chat spaces\",\n },\n {\n scope: \"https://www.googleapis.com/auth/chat.spaces\",\n label: \"View and manage chat spaces\",\n },\n {\n scope: \"https://www.googleapis.com/auth/chat.memberships.readonly\",\n label: \"View space members\",\n },\n {\n scope: \"https://www.googleapis.com/auth/chat.memberships\",\n label: \"View and manage space members\",\n },\n];\n\nconst DEFAULT_SELECTED = [\n \"https://www.googleapis.com/auth/chat.messages.readonly\",\n \"https://www.googleapis.com/auth/chat.spaces.readonly\",\n \"https://www.googleapis.com/auth/chat.memberships.readonly\",\n];\n\nexport function GoogleChatForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] =\n useState<string[]>(DEFAULT_SELECTED);\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/chat/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 Chat 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 Chat Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {CHAT_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\n icon=\"simple-icons:googlechat\"\n className=\"w-5 h-5\"\n style={{ color: \"#00AC47\" }}\n />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n}\n","/**\n * Google Forms Connection Form — OAuth2\n *\n * Dedicated form for Google Forms: forms, responses, watches.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst FORMS_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/forms.body.readonly\",\n label: \"View form structure\",\n },\n {\n scope: \"https://www.googleapis.com/auth/forms.body\",\n label: \"Create and edit forms\",\n },\n {\n scope: \"https://www.googleapis.com/auth/forms.responses.readonly\",\n label: \"View form responses\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive.readonly\",\n label: \"View Drive files (for form discovery)\",\n },\n];\n\nconst DEFAULT_SELECTED = [\n \"https://www.googleapis.com/auth/forms.body.readonly\",\n \"https://www.googleapis.com/auth/forms.responses.readonly\",\n];\n\nexport function GoogleFormsForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] =\n useState<string[]>(DEFAULT_SELECTED);\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/forms/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 Forms 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 Forms Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {FORMS_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\n icon=\"simple-icons:googleforms\"\n className=\"w-5 h-5\"\n style={{ color: \"#7248B9\" }}\n />\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'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 → API → 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 > 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., "Bearer",\n "Api-Key")\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 * Custom Config Connection Form — CUSTOM auth type\n *\n * ConfigSchema-driven form for CUSTOM providers (e.g. Google Workspace Admin\n * via domain-wide delegation). Renders one field per configSchema property,\n * validates required fields client-side, and submits the whole config object\n * to `authenticateWithCustomConfig` — secrets are stored only in the\n * encrypted credential payload, never in plain connection config.\n */\n\nimport { useState, useCallback, useMemo } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ConfigSchema, ProviderFormProps } from \"../types\";\n\n/**\n * Narrow the provider's configSchema (a plain JSON column) to the shape this\n * form renders. Returns null when it isn't a usable object schema.\n */\nfunction asConfigSchema(raw: unknown): ConfigSchema | null {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return null;\n }\n const candidate = raw as Partial<ConfigSchema>;\n if (\n typeof candidate.properties !== \"object\" ||\n candidate.properties === null\n ) {\n return null;\n }\n return {\n type: \"object\",\n properties: candidate.properties,\n required: Array.isArray(candidate.required) ? candidate.required : [],\n };\n}\n\nexport function CustomConfigForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const schema = useMemo(\n () => asConfigSchema(provider.configSchema),\n [provider.configSchema],\n );\n\n const [values, setValues] = useState<Record<string, string>>({});\n const [validationError, setValidationError] = useState<string>();\n\n const setValue = useCallback((field: string, value: string) => {\n setValues((prev) => ({ ...prev, [field]: value }));\n setValidationError(undefined);\n }, []);\n\n const requiredFields = useMemo(\n () => new Set(schema?.required ?? []),\n [schema],\n );\n\n const handleSubmit = useCallback(async () => {\n if (!schema) return;\n\n for (const field of schema.required ?? []) {\n if (!values[field]?.trim()) {\n setValidationError(\n `${schema.properties[field]?.title ?? field} is required`,\n );\n return;\n }\n }\n\n // Only submit fields declared by the schema, trimmed; empty optional\n // fields are omitted so backend defaults (e.g. customerId=my_customer)\n // apply.\n const config: Record<string, unknown> = {};\n for (const field of Object.keys(schema.properties)) {\n const value = values[field]?.trim();\n if (value) config[field] = value;\n }\n\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config,\n });\n }, [schema, values, connectionName, connectionDescription, onSubmit]);\n\n if (!schema) {\n return (\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\">\n This provider does not declare a configuration form.\n </span>\n </div>\n );\n }\n\n const displayError = validationError ?? error;\n\n return (\n <div className=\"space-y-5\">\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 <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 <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 {Object.entries(schema.properties).map(([field, def]) => (\n <div key={field}>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {def.title ?? field}{\" \"}\n {requiredFields.has(field) && (\n <span className=\"text-red-500\">*</span>\n )}\n </label>\n {def.secret ? (\n <textarea\n value={values[field] ?? \"\"}\n onChange={(e) => setValue(field, e.target.value)}\n placeholder={def.description}\n disabled={isSubmitting}\n rows={4}\n autoComplete=\"off\"\n spellCheck={false}\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 ) : (\n <input\n type=\"text\"\n value={values[field] ?? \"\"}\n onChange={(e) => setValue(field, e.target.value)}\n placeholder={def.description}\n disabled={isSubmitting}\n autoComplete=\"off\"\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 )}\n {def.description && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {def.description}\n </p>\n )}\n </div>\n ))}\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:shield-lock\" className=\"w-4 h-4\" />\n Secret fields are stored encrypted and never shown again.\n </div>\n </div>\n\n {displayError && (\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\">{displayError}</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-primary text-primary-foreground hover:bg-primary/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:content-save\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Saving...\" : \"Save connection\"}\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\";\nimport { GoogleChatForm } from \"./providers/GoogleChatForm\";\nimport { GoogleFormsForm } from \"./providers/GoogleFormsForm\";\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// Provider-specific forms — CUSTOM (configSchema-driven)\nimport { CustomConfigForm } from \"./providers/CustomConfigForm\";\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 \"google-chat\": GoogleChatForm,\n \"google-forms\": GoogleFormsForm,\n \"google-workspace-admin-domain-wide-delegation\": CustomConfigForm,\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 case \"CUSTOM\":\n return CustomConfigForm;\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 GoogleChatForm,\n GoogleFormsForm,\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 // CUSTOM\n CustomConfigForm,\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 getProviderIconTint,\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 “{search}”\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 // Tint monochrome (simple-icons/mdi) glyphs with the brand\n // color; full-color logos:* icons ignore this.\n style={{ color: getProviderIconTint(provider.key) }}\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\nimport { throwIfResultError } from \"../../../graphql/errors\";\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: ApiKeyAuthInput!) {\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: BasicAuthInput!) {\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($input: BearerTokenAuthInput!) {\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 AUTHENTICATE_WITH_CUSTOM_CONFIG = gql`\n mutation AuthenticateWithCustomConfig($input: CustomConfigAuthInput!) {\n authenticateWithCustomConfig(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 = throwIfResultError(\n 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 // CUSTOM providers: config carries secrets (e.g. service-account\n // JSON), so it must NOT land in the plain connection.config\n // column — it is only sent to authenticateWithCustomConfig,\n // which stores it in the encrypted credential payload.\n config:\n data.provider.authType === \"CUSTOM\" ? undefined : data.config,\n },\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 = throwIfResultError(\n 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\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 = throwIfResultError(\n 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 );\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 = throwIfResultError(\n 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 );\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 = throwIfResultError(\n 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 );\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 case \"CUSTOM\": {\n if (!data.config || Object.keys(data.config).length === 0) {\n throw new Error(\"Connection config is required\");\n }\n const customResult = throwIfResultError(\n await client.mutate<{\n authenticateWithCustomConfig: IntegrationConnection;\n }>({\n mutation: AUTHENTICATE_WITH_CUSTOM_CONFIG,\n variables: {\n input: {\n connectionId: connection.id,\n config: data.config,\n },\n },\n }),\n );\n const conn = customResult.data?.authenticateWithCustomConfig;\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 = throwIfResultError(\n 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 );\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 {\n resolveProviderIcon,\n getProviderIconTint,\n getAuthTypeLabel,\n} 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={resolveProviderIcon(\n selectedProvider.key,\n selectedProvider.icon,\n )}\n className=\"w-7 h-7\"\n style={{\n color: getProviderIconTint(selectedProvider.key),\n }}\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={resolveProviderIcon(\n selectedProvider.key,\n selectedProvider.icon,\n )}\n className=\"w-8 h-8\"\n style={{\n color: getProviderIconTint(selectedProvider.key),\n }}\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 {\n getProviderIconTint,\n resolveProviderIcon,\n} from \"../utils/provider-helpers\";\nimport { SdkPermissionGate } from \"../../../permissions/PermissionsBridge\";\nimport { FLUIDGRIDS_PERMISSIONS } from \"../../../permissions/constants\";\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// resolveProviderIcon / getProviderIconTint 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 = resolveProviderIcon(providerKey, connectionData?.provider?.icon);\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\n icon={icon}\n className=\"w-4 h-4\"\n style={{ color: getProviderIconTint(providerKey) }}\n />\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={resolveProviderIcon(\n conns[0]?.provider?.key || \"\",\n conns[0]?.provider?.icon,\n )}\n className=\"w-4 h-4\"\n style={{\n color: getProviderIconTint(\n conns[0]?.provider?.key || \"\",\n ),\n }}\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 <SdkPermissionGate\n permission={FLUIDGRIDS_PERMISSIONS.INTEGRATION_CONNECTION_CREATE}\n >\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 </SdkPermissionGate>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Quick New Button */}\n {selectedConnections.length === 0 && !compact && (\n <SdkPermissionGate\n permission={FLUIDGRIDS_PERMISSIONS.INTEGRATION_CONNECTION_CREATE}\n >\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 </SdkPermissionGate>\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\nimport { throwIfResultError } from \"../../graphql/errors\";\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 } = throwIfResultError(\n 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\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 } = throwIfResultError(\n 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\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 } = throwIfResultError(\n 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\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\";\nimport { Icon } from \"@iconify/react\";\nimport { nodeAccent } from \"./node-card\";\n\nexport interface NodeInfoMetadata {\n /** Iconify icon name for the node (e.g. \"logos:google-gmail\"). */\n icon?: string;\n /** Display title of the node (e.g. \"Gmail\", \"HTTP Request\"). */\n title?: string;\n description?: string;\n /** Manifest node type identifier (e.g. \"store/gmail_reader\"). */\n nodeType?: string;\n version?: string;\n /** Kind tags from the node manifest (e.g. [\"communication\", \"email\"]). */\n kind?: string[];\n /** The operation this node instance is pinned to, when configured. */\n operation?: string;\n}\n\n/** Label/value row; renders nothing when the value is empty. */\nfunction InfoRow({ label, value }: { label: string; value?: string }) {\n if (!value) return null;\n return (\n <div className=\"flex gap-2 text-sm\">\n <span className=\"w-24 shrink-0 font-medium text-muted-foreground\">\n {label}\n </span>\n <span className=\"min-w-0 break-words text-card-foreground\">{value}</span>\n </div>\n );\n}\n\n/**\n * The \"i\" toolbar button on a node card. Opens a dialog showing the node's\n * own manifest details (title, type, version, kind, pinned operation).\n */\nexport function NodeInfoButtonWithModal({\n metadata,\n}: {\n metadata: NodeInfoMetadata;\n}) {\n const title = metadata.title || metadata.nodeType || \"Node\";\n const accent = nodeAccent(metadata.nodeType || title);\n return (\n <Dialog>\n <DialogTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`Show ${title} node 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 {metadata.icon ? (\n <span\n className=\"flex size-8 shrink-0 items-center justify-center rounded-lg\"\n style={{ color: accent }}\n >\n <Icon icon={metadata.icon} className=\"size-6\" />\n </span>\n ) : null}\n {title}\n </DialogTitle>\n {metadata.description ? (\n <DialogDescription>{metadata.description}</DialogDescription>\n ) : null}\n </DialogHeader>\n <div className=\"space-y-1.5\">\n <InfoRow label=\"Type\" value={metadata.nodeType} />\n <InfoRow\n label=\"Version\"\n value={metadata.version ? `v${metadata.version}` : undefined}\n />\n <InfoRow label=\"Operation\" value={metadata.operation} />\n <InfoRow\n label=\"Kind\"\n value={\n metadata.kind && metadata.kind.length > 0\n ? metadata.kind.join(\", \")\n : undefined\n }\n />\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 { describeOperationError, throwIfResultError } from \"../graphql/errors\";\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 = throwIfResultError(\n 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 );\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 = describeOperationError(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 = throwIfResultError(\n 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 );\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 = describeOperationError(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 { 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> | 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 } | 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 allOps = (config?.operations ?? []) as NodeOperation[];\n // Ignore executor plumbing when deciding whether there is exactly one\n // operation to auto-pin: adapter ops (supplyModel/supplyTool/…) are\n // invoked automatically when the node is attached to an adapter port,\n // and `internal` ops (planStep) are driven by the executor loop.\n // Counting them left single-purpose nodes (chat model: chatCompletion +\n // supplyModel + supplyTool) looking multi-op, so they dropped as\n // \"Not configured\".\n const ops = allOps.filter(\n (op) =>\n !op.isAdapterOperation && !(op as { internal?: boolean }).internal,\n );\n if (ops.length === 1 && ops[0]?.name) {\n pinTo = ops[0].name;\n } else if (ops.length === 0 && allOps.length > 0) {\n // Pure sub-node (only adapter ops): pin its adapter operation so it\n // lands configured for its role rather than \"Not configured\".\n pinTo = allOps.find((op) => op.isAdapterOperation)?.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 {\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, useState } 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 { Icon } from \"@iconify/react\";\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\";\nimport { useInsertNode } from \"../../../../../../hooks/use-insert-node\";\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 */\n/** A sub-node candidate offered by the adapter port's \"+\" picker. */\ninterface SubNodeCandidate {\n type: string;\n title: string;\n icon: string;\n description?: string;\n /** The node's isAdapterOperation, so the new node lands already configured. */\n adapterOperation?: string;\n}\n\n/**\n * Compatible sub-nodes for an adapter port, taken from the loaded node registry\n * (NODE_CONFIGS) and filtered with the SAME rules the canvas uses to accept a\n * connection — so the picker can only ever offer something that will attach.\n */\nfunction useCompatibleSubNodes(adapter: NodeAdapter): SubNodeCandidate[] {\n return useMemo(() => {\n const out: SubNodeCandidate[] = [];\n for (const cfg of NODE_CONFIGS) {\n const nodeData = (\n cfg.defaultData as unknown as\n | {\n nodeData?: {\n kind?: string[];\n adapterOutputType?: string;\n supportsAdapterMode?: boolean;\n name?: string;\n description?: string;\n icon?: string;\n };\n }\n | undefined\n )?.nodeData;\n\n // Only nodes that actually declare themselves usable as a sub-node.\n if (!nodeData?.adapterOutputType && !nodeData?.supportsAdapterMode) {\n continue;\n }\n if (\n !isAdapterCompatible(\n adapter.filter,\n adapter.type,\n nodeData?.kind,\n nodeData?.adapterOutputType,\n cfg.type,\n )\n ) {\n continue;\n }\n\n const ops = (cfg.operations ?? []) as Array<{\n name?: string;\n isAdapterOperation?: boolean;\n }>;\n out.push({\n type: cfg.type,\n title: cfg.detail?.title || nodeData?.name || cfg.type,\n icon: cfg.detail?.icon || nodeData?.icon || \"mynaui:puzzle\",\n description: cfg.detail?.description || nodeData?.description,\n adapterOperation: ops.find((o) => o.isAdapterOperation)?.name,\n });\n }\n return out.sort((a, b) => a.title.localeCompare(b.title));\n }, [adapter.filter, adapter.type]);\n}\n\n/**\n * A single adapter port: connector line, diamond, label, and the \"+\" button\n * which opens an n8n-style picker of compatible sub-nodes. Choosing one creates\n * the sub-node beneath the parent and wires it to this port in one step.\n */\nfunction AdapterPort({\n nodeId,\n adapter,\n index,\n total,\n}: {\n nodeId: string;\n adapter: NodeAdapter;\n index: number;\n total: number;\n}) {\n const edges = useStore((s) => s.edges);\n const { getNode } = useReactFlow();\n const insertNode = useInsertNode();\n const onConnect = useFlowStore((s) => s.actions.edges.onConnect);\n const [pickerOpen, setPickerOpen] = useState(false);\n const candidates = useCompatibleSubNodes(adapter);\n\n const connectionCount = edges.filter(\n (e) => e.source === nodeId && e.sourceHandle === adapter.name,\n ).length;\n const isAtMaxConnections =\n adapter.maxConnections != null &&\n adapter.maxConnections !== undefined &&\n connectionCount >= adapter.maxConnections;\n\n // NOTE: do NOT use the legacy `accent`/`card` tokens for backgrounds. They are\n // bare HSL triplets (\"217.2 32.6% 17.5%\"), which are not valid CSS colors\n // under Tailwind v4 — `bg-accent` resolves to transparent, which is why the\n // connector line, diamond and handles were invisible. `text-*`/`border-*`\n // merely fell back to currentColor and so happened to look fine.\n const hasConnection = connectionCount > 0;\n const diamondColor = hasConnection\n ? \"bg-[var(--color-accent-primary)]\"\n : \"bg-[var(--color-text-muted)]\";\n const lineColor = hasConnection\n ? \"before:bg-[var(--color-accent-primary)]\"\n : \"before:bg-[var(--color-border-strong)]\";\n\n /** Create the chosen sub-node below the parent and attach it to this port. */\n const addSubNode = useCallback(\n (candidate: SubNodeCandidate) => {\n setPickerOpen(false);\n const parent = getNode(nodeId);\n const origin = parent?.position ?? { x: 0, y: 0 };\n const parentHeight = parent?.measured?.height ?? 180;\n const SPACING = 180;\n const position = {\n x: origin.x + (index - (total - 1) / 2) * SPACING,\n y: origin.y + parentHeight + 190,\n };\n\n const created = insertNode(\n candidate.type as ExtendedNodeType,\n position,\n candidate.adapterOperation,\n );\n if (!created?.id) return;\n\n // Mark it as an adapter instance so it renders as the compact circular\n // sub-node straight away, rather than briefly appearing as a full node\n // card until the edge below is registered.\n created.data = {\n ...(created.data as Record<string, unknown>),\n isAdapterInstance: true,\n };\n\n onConnect({\n source: nodeId,\n sourceHandle: adapter.name,\n target: created.id,\n targetHandle: \"target\",\n });\n },\n [getNode, nodeId, index, total, insertNode, onConnect, adapter.name],\n );\n\n return (\n <div className=\"relative\">\n {/* The connector line is the ::before below. It must NOT use a negative\n z-index — that paints it behind the node's own background. It renders\n first, so the diamond / label / + button paint on top of it. */}\n <div\n className={`p-0.5 m-0.5 text-center before:content-[''] before:h-[95%] before:left-1/2 before:-translate-x-1/2 before:w-0.5 ${lineColor} before:absolute before:top-0 before:pointer-events-none`}\n >\n {/* Diamond at the top (decorative — must not swallow clicks on \"+\") */}\n <div className=\"absolute -top-3 left-1/2 transform -translate-x-1/2 pointer-events-none\">\n <div\n className={`w-3 h-3 ${diamondColor} rotate-45 transition-transform hover:scale-110`}\n ></div>\n </div>\n\n {/* Title with asterisk for required */}\n <div className=\"mt-3 z-10 absolute left-1/2 transform -translate-x-1/2 font-medium bg-surface h-fit pointer-events-none\">\n <span className=\"text-xs max-w-fit relative font-medium text-[var(--color-text-secondary)] 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 (opens the sub-node picker) and the React Flow Handle.\n These are stacked vertically, NOT overlaid: React Flow positions a\n Handle absolutely, which sat on top of the \"+\" and swallowed every\n click (the button was unclickable). Forcing the handle back into\n normal flow below the button keeps both usable — click \"+\" to pick a\n sub-node, or drag from the dot to wire one up by hand. */}\n <div className=\"mt-16 flex flex-col items-center gap-1.5\">\n {!isAtMaxConnections && (\n <button\n type=\"button\"\n title={`Add ${adapter.name}`}\n aria-label={`Add ${adapter.name}`}\n onClick={(e) => {\n e.stopPropagation();\n setPickerOpen((v) => !v);\n }}\n className=\"w-5 h-5 border-2 border-[var(--color-border-strong)] rounded text-[var(--color-text-secondary)] text-lg leading-none font-bold bg-surface flex items-center justify-center transition-colors hover:border-[var(--color-accent-primary)] hover:text-[var(--color-accent-primary)] cursor-pointer\"\n >\n +\n </button>\n )}\n {isAtMaxConnections && (\n <div\n title={`${adapter.name} is full`}\n className=\"w-5 h-5 border-2 border-[var(--color-border-subtle)] rounded text-[var(--color-text-disabled)] text-lg leading-none font-bold bg-surface flex items-center justify-center\"\n >\n •\n </div>\n )}\n <Handle\n type=\"source\"\n position={Position.Bottom}\n id={adapter?.name}\n className=\"!relative !top-auto !left-auto !right-auto !bottom-auto !transform-none !w-2.5 !h-2.5 !min-w-0 !min-h-0 !rounded-full !border-0 bg-[var(--color-accent-primary)]\"\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\n {/* Sub-node picker — only ever lists nodes that will actually attach */}\n {pickerOpen && (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setPickerOpen(false)}\n />\n <div className=\"absolute z-50 top-[86px] left-1/2 -translate-x-1/2 w-60 rounded-lg border border-[var(--color-border-default)] bg-[var(--color-surface-elevated)] shadow-xl overflow-hidden text-left nodrag nowheel\">\n <div className=\"px-3 py-2 border-b border-[var(--color-border-subtle)]\">\n <p className=\"text-xs font-semibold text-[var(--color-text-primary)]\">\n Add {adapter.name}\n </p>\n <p className=\"text-[10px] text-[var(--color-text-muted)]\">\n {candidates.length} compatible node\n {candidates.length === 1 ? \"\" : \"s\"}\n </p>\n </div>\n <div className=\"max-h-56 overflow-y-auto\">\n {candidates.length === 0 && (\n <p className=\"px-3 py-3 text-[11px] text-[var(--color-text-muted)]\">\n No compatible node installed. Publish and install one from\n the Node Store first.\n </p>\n )}\n {candidates.map((c) => (\n <button\n type=\"button\"\n key={c.type}\n onClick={(e) => {\n e.stopPropagation();\n addSubNode(c);\n }}\n className=\"w-full flex items-start gap-2 px-3 py-2 hover:bg-[var(--color-bg-elevated)] transition-colors text-left\"\n >\n <Icon\n icon={c.icon}\n className=\"size-4 mt-0.5 shrink-0 text-[var(--color-accent-primary)]\"\n />\n <span className=\"min-w-0\">\n <span className=\"block text-xs text-[var(--color-text-primary)] truncate\">\n {c.title}\n </span>\n {c.description && (\n <span className=\"block text-[10px] text-[var(--color-text-muted)] line-clamp-2\">\n {c.description}\n </span>\n )}\n </span>\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n\nfunction AdapterConnectors({\n nodeId,\n adapters,\n}: {\n nodeId: string;\n adapters?: NodeAdapter[];\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, i: number) => (\n <AdapterPort\n key={adapter.name}\n nodeId={nodeId}\n adapter={adapter}\n index={i}\n total={adapters.length}\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 openNdv = useFlowStore((s) => s.actions.ndv.open);\n const [nodeStatuses] = useFlowStore(\n useShallow((s) => [s.execution.nodeStatuses]),\n );\n\n const nodeStatus = nodeStatuses[id] || \"idle\";\n // Semantic status tokens (theme-aware) rather than raw Tailwind palette colors.\n const statusRing =\n nodeStatus === \"success\"\n ? \"ring-2 ring-[var(--color-status-success-border)]\"\n : nodeStatus === \"error\"\n ? \"ring-2 ring-[var(--color-status-error-border)]\"\n : nodeStatus === \"running\"\n ? \"ring-2 ring-[var(--color-status-info-border)] animate-pulse\"\n : \"\";\n\n // Sub-nodes open the NDV on double-click, exactly like a normal node — that\n // is where the manifest-driven config (model, temperature, credentials) is\n // rendered. Previously they opened only the sidebar property panel, so a\n // sub-node had no way to reach the full detail view.\n const handleShowNodeProperties = useCallback(() => {\n openNdv({ nodeId: id, type: nodeType as ExtendedNodeType });\n showNodePropertiesOf({ id, type: nodeType as ExtendedNodeType });\n }, [id, nodeType, openNdv, showNodePropertiesOf]);\n\n return (\n // `relative` anchors the absolute delete button; `group` enables its hover reveal.\n <div className=\"relative group 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-[var(--color-accent-primary)] border-2 border-[var(--color-border-strong)]\"\n />\n\n {/* Dashed line from handle to circle */}\n <div className=\"w-0.5 h-4 border-l-2 border-dashed border-[var(--color-border-strong)]\"></div>\n\n {/* Label above the circle */}\n <span className=\"text-[10px] text-[var(--color-text-muted)] 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-[var(--color-surface-elevated)] border-2 border-[var(--color-border-strong)] flex items-center justify-center shadow-lg cursor-pointer transition-all hover:border-[var(--color-accent-primary)] hover:shadow-xl ${statusRing}`}\n onDoubleClick={handleShowNodeProperties}\n data-selected={selected}\n >\n {/* Local (bundled) icon — matches the rest of the builder and avoids a\n remote fetch to api.iconify.design that renders broken when offline. */}\n <Icon icon={meta.icon} className=\"w-7 h-7 text-accent opacity-80\" />\n </div>\n\n {/* Title below — prefer the operation-specific label so multiple tool\n sub-nodes of the same node type (e.g. several Gmail operations) are\n distinguishable instead of all showing the node name. */}\n <span className=\"mt-1.5 text-xs text-[var(--color-text-secondary)] font-medium text-center max-w-24 leading-tight\">\n {(data?.label as string) ||\n (data?.args as { state?: { operation?: string } })?.state\n ?.operation ||\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-[var(--color-status-error)] text-white text-[10px] flex items-center justify-center opacity-0 group-hover:opacity-100 hover:bg-[var(--color-status-error)] transition-opacity\"\n >\n ×\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 | 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 isExecuting,\n executingNodeId,\n nodeStatuses,\n nodeItemCounts,\n zustandSetNodes,\n ] = useFlowStore(\n useShallow((s) => [\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 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 // This node instance's own manifest details for the \"i\" info dialog.\n const nodeInfoMetadata = {\n icon: meta.icon,\n title: meta.title,\n description: nodeDescription,\n nodeType: value?.type,\n version:\n (data?.nodeData as { version?: string } | undefined)?.version ||\n (data?.version as string | undefined),\n kind: nodeKinds,\n operation: data?.operation_name as string | undefined,\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={handleOpenNdv}\n onExecute={handleExecuteStep}\n onDelete={handleDeleteNode}\n infoButton={<NodeInfoButtonWithModal metadata={nodeInfoMetadata} />}\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={handleOpenNdv}\n onExecute={handleExecuteStep}\n onDelete={handleDeleteNode}\n infoButton={<NodeInfoButtonWithModal metadata={nodeInfoMetadata} />}\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[] } | unknown[] | 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[] } | unknown[] | 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 | undefined,\n nodeData: (node.data as Record<string, unknown>)?.nodeData as\n Record<string, unknown> | undefined,\n },\n operations: (node.data as Record<string, unknown>)?.operations as\n NodeOperation[] | undefined,\n });\n if (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"]}
|