@burdenoff/fluidgrids-fe-sdk 2026.510.105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +149 -0
  2. package/dist/ExecutionDetailPage-3EVS3WEC.js +6 -0
  3. package/dist/ExecutionDetailPage-3EVS3WEC.js.map +1 -0
  4. package/dist/ExecutionsListPage-NH2JLL2D.js +8 -0
  5. package/dist/ExecutionsListPage-NH2JLL2D.js.map +1 -0
  6. package/dist/TemplateConfigurationModal-UJAGRE7X.js +258 -0
  7. package/dist/TemplateConfigurationModal-UJAGRE7X.js.map +1 -0
  8. package/dist/TemplateDetailPanel-UXH6KPCH.js +172 -0
  9. package/dist/TemplateDetailPanel-UXH6KPCH.js.map +1 -0
  10. package/dist/WorkflowBuilder-BMKFLHVE.js +15 -0
  11. package/dist/WorkflowBuilder-BMKFLHVE.js.map +1 -0
  12. package/dist/WorkflowsList-CLI32VRE.js +8 -0
  13. package/dist/WorkflowsList-CLI32VRE.js.map +1 -0
  14. package/dist/chunk-4FFPGQD3.js +584 -0
  15. package/dist/chunk-4FFPGQD3.js.map +1 -0
  16. package/dist/chunk-5BDQNSP3.js +107 -0
  17. package/dist/chunk-5BDQNSP3.js.map +1 -0
  18. package/dist/chunk-6PHBYAEG.js +11494 -0
  19. package/dist/chunk-6PHBYAEG.js.map +1 -0
  20. package/dist/chunk-BQXHJIER.js +45 -0
  21. package/dist/chunk-BQXHJIER.js.map +1 -0
  22. package/dist/chunk-BXDSTMUA.js +8848 -0
  23. package/dist/chunk-BXDSTMUA.js.map +1 -0
  24. package/dist/chunk-CGKBAJMM.js +292 -0
  25. package/dist/chunk-CGKBAJMM.js.map +1 -0
  26. package/dist/chunk-FGYVIXQ7.js +979 -0
  27. package/dist/chunk-FGYVIXQ7.js.map +1 -0
  28. package/dist/chunk-G7B4SYFM.js +22 -0
  29. package/dist/chunk-G7B4SYFM.js.map +1 -0
  30. package/dist/chunk-GSJOLO3A.js +251 -0
  31. package/dist/chunk-GSJOLO3A.js.map +1 -0
  32. package/dist/chunk-GSS5PHRL.js +386 -0
  33. package/dist/chunk-GSS5PHRL.js.map +1 -0
  34. package/dist/chunk-GY66IQWN.js +524 -0
  35. package/dist/chunk-GY66IQWN.js.map +1 -0
  36. package/dist/chunk-LUGJJ7LL.js +297 -0
  37. package/dist/chunk-LUGJJ7LL.js.map +1 -0
  38. package/dist/chunk-NDJSUC4W.js +155 -0
  39. package/dist/chunk-NDJSUC4W.js.map +1 -0
  40. package/dist/chunk-UOCR65PI.js +262 -0
  41. package/dist/chunk-UOCR65PI.js.map +1 -0
  42. package/dist/chunk-WD52O45G.js +2015 -0
  43. package/dist/chunk-WD52O45G.js.map +1 -0
  44. package/dist/chunk-WWU2O2SR.js +52 -0
  45. package/dist/chunk-WWU2O2SR.js.map +1 -0
  46. package/dist/chunk-XQP33UJR.js +57 -0
  47. package/dist/chunk-XQP33UJR.js.map +1 -0
  48. package/dist/chunk-Z54K22LP.js +82 -0
  49. package/dist/chunk-Z54K22LP.js.map +1 -0
  50. package/dist/client-AMUUS7VE.js +3 -0
  51. package/dist/client-AMUUS7VE.js.map +1 -0
  52. package/dist/config-E4E7M6IN.js +3 -0
  53. package/dist/config-E4E7M6IN.js.map +1 -0
  54. package/dist/global-client-OW43ZRDR.js +3 -0
  55. package/dist/global-client-OW43ZRDR.js.map +1 -0
  56. package/dist/global-operations-WPTEYCJM.js +3 -0
  57. package/dist/global-operations-WPTEYCJM.js.map +1 -0
  58. package/dist/index.d.ts +56706 -0
  59. package/dist/index.js +6564 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/styles.css +139 -0
  62. package/dist/template-input-applicator-657KE4DM.js +3 -0
  63. package/dist/template-input-applicator-657KE4DM.js.map +1 -0
  64. package/dist/useImportWorkflowTemplate-2HS5D2OP.js +11 -0
  65. package/dist/useImportWorkflowTemplate-2HS5D2OP.js.map +1 -0
  66. package/dist/useTemplateDetail-NK63V3PC.js +6 -0
  67. package/dist/useTemplateDetail-NK63V3PC.js.map +1 -0
  68. package/package.json +148 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/store/useInstalledNodes.ts","../src/builder/components/flow-builder/components/blocks/utils.ts","../src/builder/hooks/use-delete-node.ts","../src/builder/components/flow-builder/components/handles/custom-handler.tsx","../src/modules/adaptive-cards/components/index.tsx","../src/modules/connections/hooks/useConnections.ts","../src/modules/connections/utils/provider-helpers.ts","../src/modules/connections/components/provider-forms/base/OAuth2BaseForm.tsx","../src/modules/connections/components/provider-forms/base/ApiKeyBaseForm.tsx","../src/modules/connections/components/provider-forms/base/BasicAuthBaseForm.tsx","../src/modules/connections/components/provider-forms/base/BearerTokenBaseForm.tsx","../src/modules/connections/components/provider-forms/providers/GoogleGmailForm.tsx","../src/modules/connections/components/provider-forms/providers/GoogleDriveForm.tsx","../src/modules/connections/components/provider-forms/providers/GoogleCalendarForm.tsx","../src/modules/connections/components/provider-forms/providers/GoogleSheetsForm.tsx","../src/modules/connections/components/provider-forms/providers/GoogleDocsForm.tsx","../src/modules/connections/components/provider-forms/providers/MicrosoftOutlookForm.tsx","../src/modules/connections/components/provider-forms/providers/MicrosoftOneDriveForm.tsx","../src/modules/connections/components/provider-forms/providers/MicrosoftTeamsForm.tsx","../src/modules/connections/components/provider-forms/providers/MicrosoftExcelForm.tsx","../src/modules/connections/components/provider-forms/providers/GitHubForm.tsx","../src/modules/connections/components/provider-forms/providers/SlackForm.tsx","../src/modules/connections/components/provider-forms/providers/HubSpotForm.tsx","../src/modules/connections/components/provider-forms/providers/SalesforceForm.tsx","../src/modules/connections/components/provider-forms/providers/NotionForm.tsx","../src/modules/connections/components/provider-forms/providers/AirtableForm.tsx","../src/modules/connections/components/provider-forms/providers/OpenAIForm.tsx","../src/modules/connections/components/provider-forms/providers/AnthropicForm.tsx","../src/modules/connections/components/provider-forms/providers/LinearForm.tsx","../src/modules/connections/components/provider-forms/providers/BigConsoleForm.tsx","../src/modules/connections/components/provider-forms/providers/SendGridForm.tsx","../src/modules/connections/components/provider-forms/providers/TwilioForm.tsx","../src/modules/connections/components/provider-forms/providers/GenericOAuth2Form.tsx","../src/modules/connections/components/provider-forms/providers/GenericApiKeyForm.tsx","../src/modules/connections/components/provider-forms/providers/GenericBasicAuthForm.tsx","../src/modules/connections/components/provider-forms/index.ts","../src/modules/connections/components/ProviderPicker.tsx","../src/modules/connections/hooks/useConnectionDialog.ts","../src/modules/connections/components/ConnectionFormDialog.tsx","../src/modules/connections/components/ConnectionSelector.tsx","../src/modules/connections/components/ConfigSchemaForm.tsx","../src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/property-panels/property-panel.tsx","../src/builder/components/flow-builder/components/ui/header-with-icon.tsx","../src/builder/components/flow-builder/components/blocks/types.ts","../src/builder/components/flow-builder/components/ui/NodeInfoButtonWithModal.tsx","../src/builder/components/flow-builder/components/ui/node-card.tsx","../src/hooks/useNodeExecution.ts","../src/builder/components/flow-builder/components/blocks/nodes/node/node.tsx","../src/builder/components/flow-builder/components/blocks/index.ts","../src/hooks/store/useNodePackageLoader.ts","../src/hooks/store/useRefreshAvailableNodes.ts","../src/hooks/store/useInstallNode.ts","../src/hooks/store/useImportWorkflowTemplate.ts"],"names":["node","nodeLookup","edges","getConnectedEdges","jsx","cn","useCallback","useEffect","jsxs","useState","Icon","config","useRef","useMemo","gql","Dialog","Button","nanoid","useStore","useReactFlow","Handle","useShallow","Fragment","useContext","NODE_ENDPOINT_CONFIGS"],"mappings":"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","file":"chunk-BXDSTMUA.js","sourcesContent":["import { useContext } from \"react\";\nimport { useQuery } from \"@apollo/client/react\";\nimport {\n GetMyNodeInstallationsDocument,\n type GetMyNodeInstallationsQuery,\n type GetMyNodeInstallationsQueryVariables,\n} from \"../../generated/global-operations\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { getFluidGridsConfig } from \"../../config\";\n\n/** Shape of a single installation item from the query */\ntype InstallationItem =\n GetMyNodeInstallationsQuery[\"myStoreAppInstallations\"][\"items\"][number];\n\n/**\n * Hook to get installed nodes for the current workspace\n *\n * Fetches installations from the Store service to show \"Already Installed\" status\n * in the Store popup and display installed count.\n */\nexport function useInstalledNodes() {\n const client = useGlobalStoreClient();\n\n // Try to get context, but don't throw if not available\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n\n const { data, loading, error, refetch } = useQuery<\n GetMyNodeInstallationsQuery,\n GetMyNodeInstallationsQueryVariables\n >(GetMyNodeInstallationsDocument, {\n client,\n variables: {\n workspaceId: workspaceId || \"\",\n limit: 100,\n offset: 0,\n },\n skip: !workspaceId,\n fetchPolicy: \"cache-and-network\",\n });\n\n const installations = data?.myStoreAppInstallations?.items || [];\n const installedAppIds = new Set(\n installations\n .filter((item: InstallationItem) => item.status === \"ACTIVE\")\n .map((item: InstallationItem) => item.productId),\n );\n\n // Create a map of productId -> installation details for easy lookup\n const installationsMap = new Map(\n installations\n .filter((item: InstallationItem) => item.status === \"ACTIVE\")\n .map((item: InstallationItem) => [\n item.productId,\n {\n installedVersion: item.version ?? undefined,\n installationId: item.id,\n installedAt: item.installedAt,\n },\n ]),\n );\n\n return {\n installations,\n installedAppIds,\n installationsMap,\n installedNodeTypes: new Set<string>(),\n totalCount: data?.myStoreAppInstallations?.total || 0,\n loading,\n error,\n refetch,\n };\n}\n","import { 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 { 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 }\n>;\n\nexport default function CustomHandle({\n className,\n isConnectable,\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\",\n \"size-3 hover:border-primary/50 border-2 border-card-foreground/40\",\n className,\n )}\n isConnectable={isHandleConnectable}\n {...props}\n />\n </span>\n );\n}\n","import React, { useEffect, useRef } from \"react\";\nimport * as AdaptiveCards from \"adaptivecards\";\nimport type {\n AdaptiveCardRendererProps,\n AdaptiveCardPayload,\n AdaptiveCardElement,\n} from \"./types\";\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 * Coerces submitted data from the card based on input types.\n * Handles Input.Number (converts to number) and Input.Toggle (converts to boolean).\n */\nfunction 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 }\n }\n\n if (Array.isArray(cardData.body)) {\n extractInputTypes(cardData.body);\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\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: React.FC<AdaptiveCardRendererProps> = ({\n cardData,\n sampleData,\n onSubmit,\n onAction,\n className,\n}) => {\n const cardContainerRef = useRef<HTMLDivElement>(null);\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) return;\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 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\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 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 { AdaptiveCardRendererProps } from \"./types\";\n","/**\n * Custom hooks for fetching connections from the integrations service.\n *\n * These hooks query the wspace-integrations-svc via the federated GraphQL gateway.\n * Connections replace the legacy credentials system for third-party authentication.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { gql } from \"@apollo/client\";\nimport { getFluidGridsClient } from \"../../../graphql/client\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ConnectionStatus =\n | \"ACTIVE\"\n | \"INACTIVE\"\n | \"ERROR\"\n | \"EXPIRED\"\n | \"REVOKED\"\n | \"PENDING_AUTH\";\nexport type ProviderCategory =\n | \"CLOUD_STORAGE\"\n | \"COMMUNICATION\"\n | \"PRODUCTIVITY\"\n | \"CRM\"\n | \"EMAIL\"\n | \"CALENDAR\"\n | \"DEVELOPMENT\"\n | \"SOCIAL\"\n | \"PAYMENT\"\n | \"ANALYTICS\"\n | \"CUSTOM\";\nexport type AuthType =\n | \"OAUTH2\"\n | \"OAUTH1\"\n | \"API_KEY\"\n | \"BASIC_AUTH\"\n | \"BEARER_TOKEN\"\n | \"CUSTOM\";\n\nexport interface IntegrationProvider {\n id: string;\n key: string;\n name: string;\n description?: string;\n category: ProviderCategory;\n authType: AuthType;\n icon?: string;\n color?: string;\n website?: string;\n docsUrl?: string;\n isBuiltIn: boolean;\n isEnabled: boolean;\n}\n\nexport interface IntegrationConnection {\n id: string;\n name: string;\n description?: string;\n providerId: string;\n provider: IntegrationProvider;\n status: ConnectionStatus;\n lastHealthCheck?: string;\n lastUsedAt?: string;\n errorMessage?: string;\n externalAccountId?: string;\n externalAccountEmail?: string;\n externalAccountName?: string;\n grantedScopes: string[];\n createdBy: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ConnectionList {\n items: IntegrationConnection[];\n total: number;\n hasMore: boolean;\n}\n\nexport interface OAuthInitiationResult {\n redirectUrl: string;\n state: string;\n}\n\n// ============================================================================\n// GraphQL Fragments\n// ============================================================================\n\nconst PROVIDER_FIELDS = gql`\n fragment ProviderFields on IntegrationProvider {\n id\n key\n name\n description\n category\n authType\n icon\n color\n website\n docsUrl\n isBuiltIn\n isEnabled\n }\n`;\n\nconst CONNECTION_FIELDS = gql`\n ${PROVIDER_FIELDS}\n fragment ConnectionFields on IntegrationConnection {\n id\n name\n description\n providerId\n provider {\n ...ProviderFields\n }\n status\n lastHealthCheck\n lastUsedAt\n errorMessage\n externalAccountId\n externalAccountEmail\n externalAccountName\n grantedScopes\n createdBy\n createdAt\n updatedAt\n }\n`;\n\n// ============================================================================\n// GraphQL Queries\n// ============================================================================\n\nconst GET_CONNECTIONS = gql`\n ${CONNECTION_FIELDS}\n query GetConnections(\n $filter: ConnectionFilterInput\n $pagination: IntegrationsPaginationInput\n ) {\n getConnections(filter: $filter, pagination: $pagination) {\n items {\n ...ConnectionFields\n }\n total\n hasMore\n }\n }\n`;\n\nconst GET_CONNECTION = gql`\n ${CONNECTION_FIELDS}\n query GetConnection($id: ID!) {\n getConnection(id: $id) {\n ...ConnectionFields\n }\n }\n`;\n\nconst GET_CONNECTIONS_BY_PROVIDER = gql`\n ${CONNECTION_FIELDS}\n query GetConnectionsByProvider(\n $providerId: ID!\n $pagination: IntegrationsPaginationInput\n ) {\n getConnectionsByProvider(providerId: $providerId, pagination: $pagination) {\n items {\n ...ConnectionFields\n }\n total\n hasMore\n }\n }\n`;\n\nconst GET_PROVIDERS = gql`\n ${PROVIDER_FIELDS}\n query GetProviders(\n $filter: ProviderFilterInput\n $pagination: IntegrationsPaginationInput\n ) {\n getProviders(filter: $filter, pagination: $pagination) {\n items {\n ...ProviderFields\n }\n total\n hasMore\n }\n }\n`;\n\n// ============================================================================\n// GraphQL Mutations\n// ============================================================================\n\nconst INITIATE_OAUTH = gql`\n mutation InitiateOAuth($input: InitiateOAuthInput!) {\n initiateOAuth(input: $input) {\n redirectUrl\n state\n }\n }\n`;\n\nconst CREATE_CONNECTION = gql`\n ${CONNECTION_FIELDS}\n mutation CreateConnection($input: CreateConnectionInput!) {\n createConnection(input: $input) {\n ...ConnectionFields\n }\n }\n`;\n\n// ============================================================================\n// Query Hooks\n// ============================================================================\n\ninterface ConnectionFilterOptions {\n providerId?: string;\n status?: ConnectionStatus;\n providerCategory?: ProviderCategory;\n search?: string;\n}\n\ninterface UseConnectionsResult {\n connections: IntegrationConnection[];\n total: number;\n hasMore: boolean;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook to fetch list of connections from the integrations service.\n */\nexport function useConnections(\n filter?: ConnectionFilterOptions,\n): UseConnectionsResult {\n const [connections, setConnections] = useState<IntegrationConnection[]>([]);\n const [total, setTotal] = useState(0);\n const [hasMore, setHasMore] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const filterKey = JSON.stringify(filter);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const parsedFilter = filterKey ? JSON.parse(filterKey) : undefined;\n\n const result = await client.query<{ getConnections: ConnectionList }>({\n query: GET_CONNECTIONS,\n variables: {\n filter: parsedFilter,\n pagination: { limit: 100 },\n },\n fetchPolicy: \"network-only\",\n });\n\n setConnections(result.data?.getConnections?.items ?? []);\n setTotal(result.data?.getConnections?.total ?? 0);\n setHasMore(result.data?.getConnections?.hasMore ?? false);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [filterKey]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n connections,\n total,\n hasMore,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch a single connection by ID.\n */\nexport function useConnection(connectionId?: string) {\n const [connection, setConnection] = useState<IntegrationConnection | null>(\n null,\n );\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!connectionId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<{\n getConnection: IntegrationConnection | null;\n }>({\n query: GET_CONNECTION,\n variables: { id: connectionId },\n fetchPolicy: \"cache-first\",\n });\n setConnection(result.data?.getConnection ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [connectionId]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n connection,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch connections for a specific provider.\n */\nexport function useConnectionsByProvider(providerId?: string) {\n const [connections, setConnections] = useState<IntegrationConnection[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!providerId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<{\n getConnectionsByProvider: ConnectionList;\n }>({\n query: GET_CONNECTIONS_BY_PROVIDER,\n variables: { providerId, pagination: { limit: 100 } },\n fetchPolicy: \"network-only\",\n });\n setConnections(result.data?.getConnectionsByProvider?.items ?? []);\n setTotal(result.data?.getConnectionsByProvider?.total ?? 0);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [providerId]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n connections,\n total,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch available integration providers.\n */\nexport function useProviders(filter?: {\n category?: ProviderCategory;\n authType?: AuthType;\n isEnabled?: boolean;\n}) {\n const [providers, setProviders] = useState<IntegrationProvider[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const filterKey = JSON.stringify(filter);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const parsedFilter = filterKey ? JSON.parse(filterKey) : undefined;\n\n const result = await client.query<{\n getProviders: { items: IntegrationProvider[]; total: number };\n }>({\n query: GET_PROVIDERS,\n variables: {\n filter: parsedFilter,\n pagination: { limit: 100 },\n },\n fetchPolicy: \"cache-first\",\n });\n setProviders(result.data?.getProviders?.items ?? []);\n setTotal(result.data?.getProviders?.total ?? 0);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [filterKey]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n providers,\n total,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Mutation Hooks\n// ============================================================================\n\n/**\n * Hook to create a new connection.\n */\nexport function useCreateConnection() {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const createConnection = useCallback(\n async (input: {\n name: string;\n description?: string;\n providerId: string;\n config?: Record<string, unknown>;\n }) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.mutate<{\n createConnection: IntegrationConnection;\n }>({\n mutation: CREATE_CONNECTION,\n variables: { input },\n });\n return result.data?.createConnection ?? null;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [],\n );\n\n return {\n createConnection,\n loading,\n error,\n };\n}\n\n/**\n * Hook to initiate OAuth flow for a connection.\n */\nexport function useInitiateOAuth() {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const initiateOAuth = useCallback(\n async (input: {\n connectionId: string;\n scopes?: string[];\n redirectUri: string;\n }): Promise<OAuthInitiationResult | null> => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.mutate<{\n initiateOAuth: OAuthInitiationResult;\n }>({\n mutation: INITIATE_OAUTH,\n variables: { input },\n });\n return result.data?.initiateOAuth ?? null;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [],\n );\n\n return {\n initiateOAuth,\n loading,\n error,\n };\n}\n","/**\n * Provider display utilities — icons, labels, colors.\n *\n * Centralizes all provider display metadata for use across\n * the ConnectionSelector, ConnectionFormDialog, and provider forms.\n */\n\nimport type { AuthType, ProviderCategory } from \"../hooks/useConnections\";\n\n// ============================================================================\n// Provider Icons (Iconify icon names)\n// ============================================================================\n\nconst PROVIDER_ICONS: Record<string, string> = {\n // Google services\n \"google-gmail\": \"logos:google-gmail\",\n \"google-drive\": \"logos:google-drive\",\n \"google-calendar\": \"logos:google-calendar\",\n \"google-sheets\": \"simple-icons:googlesheets\",\n \"google-docs\": \"simple-icons:googledocs\",\n // Microsoft services\n \"microsoft-outlook\": \"vscode-icons:file-type-outlook\",\n \"microsoft-onedrive\": \"simple-icons:onedrive\",\n \"microsoft-teams\": \"logos:microsoft-teams\",\n \"microsoft-excel\": \"vscode-icons:file-type-excel\",\n // Other OAuth2\n github: \"mdi:github\",\n slack: \"logos:slack-icon\",\n salesforce: \"logos:salesforce\",\n hubspot: \"simple-icons:hubspot\",\n notion: \"simple-icons:notion\",\n airtable: \"simple-icons:airtable\",\n // API Key\n openai: \"simple-icons:openai\",\n anthropic: \"simple-icons:anthropic\",\n linear: \"simple-icons:linear\",\n bigconsole: \"mdi:chart-box-outline\",\n sendgrid: \"simple-icons:sendgrid\",\n twilio: \"logos:twilio-icon\",\n // Infrastructure / misc\n stripe: \"logos:stripe\",\n postgres: \"logos:postgresql\",\n mysql: \"logos:mysql\",\n mongodb: \"logos:mongodb-icon\",\n redis: \"logos:redis\",\n aws: \"logos:aws\",\n gcp: \"logos:google-cloud\",\n azure: \"logos:azure-icon\",\n // Generic\n \"generic-oauth2\": \"mdi:key-chain\",\n \"generic-api-key\": \"mdi:key-variant\",\n \"generic-basic-auth\": \"mdi:lock-outline\",\n generic: \"mdi:link-variant\",\n};\n\n/**\n * Get the Iconify icon name for a provider key.\n */\nexport function getProviderIcon(providerKey: string): string {\n return PROVIDER_ICONS[providerKey.toLowerCase()] || PROVIDER_ICONS.generic;\n}\n\n// ============================================================================\n// Provider Colors\n// ============================================================================\n\nconst PROVIDER_COLORS: Record<string, string> = {\n // Google services\n \"google-gmail\": \"#EA4335\",\n \"google-drive\": \"#4285F4\",\n \"google-calendar\": \"#4285F4\",\n \"google-sheets\": \"#0F9D58\",\n \"google-docs\": \"#4285F4\",\n // Microsoft services\n \"microsoft-outlook\": \"#0078D4\",\n \"microsoft-onedrive\": \"#0078D4\",\n \"microsoft-teams\": \"#6264A7\",\n \"microsoft-excel\": \"#217346\",\n // Other OAuth2\n github: \"#24292F\",\n slack: \"#4A154B\",\n hubspot: \"#FF7A59\",\n salesforce: \"#00A1E0\",\n notion: \"#000000\",\n airtable: \"#18BFFF\",\n // API Key\n openai: \"#412991\",\n anthropic: \"#D4A373\",\n linear: \"#5E6AD2\",\n bigconsole: \"#6366F1\",\n sendgrid: \"#1A82E2\",\n twilio: \"#F22F46\",\n // Generic\n \"generic-oauth2\": \"#6B7280\",\n \"generic-api-key\": \"#6B7280\",\n \"generic-basic-auth\": \"#6B7280\",\n};\n\n/**\n * Get the brand color for a provider key.\n */\nexport function getProviderColor(providerKey: string): string {\n return PROVIDER_COLORS[providerKey.toLowerCase()] || \"#6B7280\";\n}\n\n// ============================================================================\n// Auth Type Labels\n// ============================================================================\n\nconst AUTH_TYPE_LABELS: Record<AuthType, string> = {\n OAUTH2: \"OAuth2 API\",\n OAUTH1: \"OAuth1\",\n API_KEY: \"API Key\",\n BASIC_AUTH: \"Basic Auth\",\n BEARER_TOKEN: \"Bearer Token\",\n CUSTOM: \"Custom\",\n};\n\n/**\n * Get a human-readable label for an auth type.\n */\nexport function getAuthTypeLabel(authType: AuthType): string {\n return AUTH_TYPE_LABELS[authType] || authType;\n}\n\n// ============================================================================\n// Category Labels\n// ============================================================================\n\nconst CATEGORY_LABELS: Record<ProviderCategory, string> = {\n CLOUD_STORAGE: \"Cloud Storage\",\n COMMUNICATION: \"Communication\",\n PRODUCTIVITY: \"Productivity\",\n CRM: \"CRM\",\n EMAIL: \"Email\",\n CALENDAR: \"Calendar\",\n DEVELOPMENT: \"Development\",\n SOCIAL: \"Social\",\n PAYMENT: \"Payment\",\n ANALYTICS: \"Analytics\",\n CUSTOM: \"Custom\",\n};\n\n/**\n * Get a human-readable label for a provider category.\n */\nexport function getCategoryLabel(category: ProviderCategory): string {\n return CATEGORY_LABELS[category] || category;\n}\n\n// ============================================================================\n// OAuth Callback URL\n// ============================================================================\n\n/**\n * Get the OAuth callback URL for the integrations service.\n * In development (localhost) uses the direct service port.\n * In production uses the gateway-relative path.\n */\nexport function getOAuthCallbackUrl(): string {\n if (\n typeof window !== \"undefined\" &&\n window.location.hostname === \"localhost\"\n ) {\n return \"http://localhost:3713/integrations/oauth/callback\";\n }\n return \"/integrations/oauth/callback\";\n}\n","/**\n * Base OAuth2 Connection Form\n *\n * Used as a fallback for any OAuth2 provider that doesn't have\n * a dedicated provider-specific form. Shows a \"Sign in with {Provider}\"\n * button and handles the popup flow.\n */\n\nimport { useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\nimport { getProviderIcon } from \"../../../utils/provider-helpers\";\n\nexport function OAuth2BaseForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n });\n }, [connectionName, connectionDescription, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n {/* Help Banner */}\n {provider.docsUrl && (\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href={provider.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n )}\n\n {/* Connection Name */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder={`My ${provider.name} Connection`}\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* OAuth Info */}\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A new window will\n open for {provider.name} authorization\n </div>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon={getProviderIcon(provider.key)} className=\"w-5 h-5\" />\n )}\n {isSubmitting\n ? \"Waiting for authorization...\"\n : `Sign in with ${provider.name}`}\n </button>\n </div>\n );\n}\n","/**\n * Base API Key Connection Form\n *\n * Used as a fallback for any API_KEY provider that doesn't have\n * a dedicated provider-specific form. Shows a single API key input.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function ApiKeyBaseForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [apiKey, setApiKey] = useState(\"\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey,\n });\n }, [connectionName, connectionDescription, apiKey, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n {/* Help Banner */}\n {provider.docsUrl && (\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href={provider.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n )}\n\n {/* Connection Name */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder={`My ${provider.name} Connection`}\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* API Key */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"Enter your API key\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !apiKey.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Base Basic Auth Connection Form\n *\n * Used as a fallback for any BASIC_AUTH provider that doesn't have\n * a dedicated provider-specific form. Shows username + password fields.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function BasicAuthBaseForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [username, setUsername] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [showPassword, setShowPassword] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n username,\n password,\n });\n }, [connectionName, connectionDescription, username, password, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n {/* Help Banner */}\n {provider.docsUrl && (\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href={provider.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n )}\n\n {/* Connection Name */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder={`My ${provider.name} Connection`}\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Username */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Username <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:account\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type=\"text\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n placeholder=\"Username or email\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n </div>\n\n {/* Password */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Password <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:lock\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showPassword ? \"text\" : \"password\"}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Password\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showPassword ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !connectionName.trim() ||\n !username.trim() ||\n !password.trim()\n }\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Base Bearer Token Connection Form\n *\n * Used as a fallback for any BEARER_TOKEN provider that doesn't have\n * a dedicated provider-specific form. Shows a single token input.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function BearerTokenBaseForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [token, setToken] = useState(\"\");\n const [showToken, setShowToken] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n bearerToken: token,\n });\n }, [connectionName, connectionDescription, token, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n {/* Help Banner */}\n {provider.docsUrl && (\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href={provider.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n )}\n\n {/* Connection Name */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder={`My ${provider.name} Connection`}\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Bearer Token */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Bearer Token <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showToken ? \"text\" : \"password\"}\n value={token}\n onChange={(e) => setToken(e.target.value)}\n placeholder=\"Enter your bearer token\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowToken(!showToken)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showToken ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !token.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Google Gmail Connection Form — OAuth2\n *\n * Dedicated form for Gmail: messages, labels, threads, drafts.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst GMAIL_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/gmail.readonly\",\n label: \"Read messages and labels\",\n },\n {\n scope: \"https://www.googleapis.com/auth/gmail.send\",\n label: \"Send email on your behalf\",\n },\n {\n scope: \"https://www.googleapis.com/auth/gmail.modify\",\n label: \"Read, send, delete, and manage labels\",\n },\n {\n scope: \"https://www.googleapis.com/auth/gmail.compose\",\n label: \"Create and send new emails\",\n },\n {\n scope: \"https://www.googleapis.com/auth/gmail.labels\",\n label: \"Manage mailbox labels\",\n },\n];\n\nexport function GoogleGmailForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"https://www.googleapis.com/auth/gmail.readonly\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.google.com/gmail/api/reference/rest\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Gmail Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Gmail Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {GMAIL_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile) are always included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Google sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-white border border-border text-foreground hover:bg-accent transition-colors disabled:opacity-50 shadow-sm\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:google-gmail\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n}\n","/**\n * Google Drive Connection Form — OAuth2\n *\n * Dedicated form for Google Drive: files, folders, permissions.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst DRIVE_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/drive.readonly\",\n label: \"View files and folders\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive\",\n label: \"Full access to files and folders\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive.file\",\n label: \"Access files created by this app\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n label: \"View file metadata\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive.appdata\",\n label: \"Access app-specific data folder\",\n },\n];\n\nexport function GoogleDriveForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"https://www.googleapis.com/auth/drive.readonly\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.google.com/drive/api/reference/rest/v3\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Google Drive Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Drive Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {DRIVE_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile) are always included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Google sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-white border border-border text-foreground hover:bg-accent transition-colors disabled:opacity-50 shadow-sm\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:google-drive\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n}\n","/**\n * Google Calendar Connection Form — OAuth2\n *\n * Dedicated form for Google Calendar: events, calendars, free/busy.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst CALENDAR_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/calendar.readonly\",\n label: \"View calendar events\",\n },\n {\n scope: \"https://www.googleapis.com/auth/calendar\",\n label: \"Full access to calendars and events\",\n },\n {\n scope: \"https://www.googleapis.com/auth/calendar.events\",\n label: \"View and edit events\",\n },\n {\n scope: \"https://www.googleapis.com/auth/calendar.events.readonly\",\n label: \"View events only\",\n },\n {\n scope: \"https://www.googleapis.com/auth/calendar.settings.readonly\",\n label: \"View calendar settings\",\n },\n];\n\nexport function GoogleCalendarForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"https://www.googleapis.com/auth/calendar.readonly\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.google.com/calendar/api/v3/reference\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Google Calendar Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Calendar Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {CALENDAR_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile) are always included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Google sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-white border border-border text-foreground hover:bg-accent transition-colors disabled:opacity-50 shadow-sm\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:google-calendar\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n}\n","/**\n * Google Sheets Connection Form — OAuth2\n *\n * Dedicated form for Google Sheets: spreadsheets, values, charts.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst SHEETS_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/spreadsheets.readonly\",\n label: \"View spreadsheet data\",\n },\n {\n scope: \"https://www.googleapis.com/auth/spreadsheets\",\n label: \"Full access to spreadsheets\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive.readonly\",\n label: \"View Drive files (for file discovery)\",\n },\n];\n\nexport function GoogleSheetsForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"https://www.googleapis.com/auth/spreadsheets.readonly\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.google.com/sheets/api/reference/rest\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Google Sheets Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Sheets Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {SHEETS_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile) are always included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Google sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-white border border-border text-foreground hover:bg-accent transition-colors disabled:opacity-50 shadow-sm\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"simple-icons:googlesheets\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n}\n","/**\n * Google Docs Connection Form — OAuth2\n *\n * Dedicated form for Google Docs: documents, batch updates.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst DOCS_SCOPES = [\n {\n scope: \"https://www.googleapis.com/auth/documents.readonly\",\n label: \"View documents\",\n },\n {\n scope: \"https://www.googleapis.com/auth/documents\",\n label: \"Full access to documents\",\n },\n {\n scope: \"https://www.googleapis.com/auth/drive.readonly\",\n label: \"View Drive files (for file discovery)\",\n },\n];\n\nexport function GoogleDocsForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"https://www.googleapis.com/auth/documents.readonly\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.google.com/docs/api/reference/rest\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Google Docs Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Docs Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {DOCS_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile) are always included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Google sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-white border border-border text-foreground hover:bg-accent transition-colors disabled:opacity-50 shadow-sm\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"simple-icons:googledocs\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with Google\"}\n </button>\n </div>\n );\n}\n","/**\n * Microsoft Outlook Connection Form — OAuth2\n *\n * Dedicated form for Outlook: messages, contacts, folders.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst OUTLOOK_SCOPES = [\n { scope: \"Mail.Read\", label: \"Read your mail\" },\n { scope: \"Mail.ReadWrite\", label: \"Read and write your mail\" },\n { scope: \"Mail.Send\", label: \"Send mail as you\" },\n { scope: \"Contacts.Read\", label: \"Read your contacts\" },\n { scope: \"Contacts.ReadWrite\", label: \"Read and write your contacts\" },\n { scope: \"MailboxSettings.Read\", label: \"Read mailbox settings\" },\n];\n\nexport function MicrosoftOutlookForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\"Mail.Read\"]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://learn.microsoft.com/en-us/graph/api/resources/mail-api-overview\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Outlook Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Outlook Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {OUTLOOK_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile, offline_access) are always\n included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Microsoft sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#0078D4] text-white hover:bg-[#0078D4]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:microsoft-icon\" className=\"w-5 h-5\" />\n )}\n {isSubmitting\n ? \"Waiting for authorization...\"\n : \"Sign in with Microsoft\"}\n </button>\n </div>\n );\n}\n","/**\n * Microsoft OneDrive Connection Form — OAuth2\n *\n * Dedicated form for OneDrive: files, folders, sharing, permissions.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst ONEDRIVE_SCOPES = [\n { scope: \"Files.Read\", label: \"Read your files\" },\n { scope: \"Files.ReadWrite\", label: \"Read and write your files\" },\n { scope: \"Files.Read.All\", label: \"Read all files you can access\" },\n {\n scope: \"Files.ReadWrite.All\",\n label: \"Read and write all files you can access\",\n },\n { scope: \"Sites.Read.All\", label: \"Read SharePoint sites\" },\n { scope: \"Sites.ReadWrite.All\", label: \"Read and write SharePoint sites\" },\n];\n\nexport function MicrosoftOneDriveForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"Files.Read\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://learn.microsoft.com/en-us/graph/api/resources/onedrive\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My OneDrive Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n OneDrive Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {ONEDRIVE_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile, offline_access) are always\n included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Microsoft sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#0078D4] text-white hover:bg-[#0078D4]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:microsoft-icon\" className=\"w-5 h-5\" />\n )}\n {isSubmitting\n ? \"Waiting for authorization...\"\n : \"Sign in with Microsoft\"}\n </button>\n </div>\n );\n}\n","/**\n * Microsoft Teams Connection Form — OAuth2\n *\n * Dedicated form for Teams: channels, messages, chats, members.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst TEAMS_SCOPES = [\n { scope: \"Team.ReadBasic.All\", label: \"Read teams info\" },\n { scope: \"Channel.ReadBasic.All\", label: \"Read channel info\" },\n { scope: \"ChannelMessage.Read.All\", label: \"Read channel messages\" },\n { scope: \"ChannelMessage.Send\", label: \"Send channel messages\" },\n { scope: \"Chat.Read\", label: \"Read your chat messages\" },\n { scope: \"Chat.ReadWrite\", label: \"Read and send chat messages\" },\n { scope: \"ChatMessage.Send\", label: \"Send chat messages\" },\n];\n\nexport function MicrosoftTeamsForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"Team.ReadBasic.All\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://learn.microsoft.com/en-us/graph/api/resources/teams-api-overview\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Teams Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Teams Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {TEAMS_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile, offline_access) are always\n included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Microsoft sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#6264A7] text-white hover:bg-[#6264A7]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:microsoft-teams\" className=\"w-5 h-5\" />\n )}\n {isSubmitting\n ? \"Waiting for authorization...\"\n : \"Sign in with Microsoft\"}\n </button>\n </div>\n );\n}\n","/**\n * Microsoft Excel Connection Form — OAuth2\n *\n * Dedicated form for Excel Online: workbooks, worksheets, ranges, tables.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst EXCEL_SCOPES = [\n { scope: \"Files.Read\", label: \"Read workbook files\" },\n { scope: \"Files.ReadWrite\", label: \"Read and write workbook files\" },\n { scope: \"Files.Read.All\", label: \"Read all workbook files you can access\" },\n { scope: \"Files.ReadWrite.All\", label: \"Full access to workbook files\" },\n];\n\nexport function MicrosoftExcelForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"Files.ReadWrite\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://learn.microsoft.com/en-us/graph/api/resources/excel\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Excel Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Excel Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {EXCEL_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (openid, email, profile, offline_access) are always\n included\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Microsoft sign-in\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#217346] text-white hover:bg-[#217346]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"vscode-icons:file-type-excel\" className=\"w-5 h-5\" />\n )}\n {isSubmitting\n ? \"Waiting for authorization...\"\n : \"Sign in with Microsoft\"}\n </button>\n </div>\n );\n}\n","/**\n * GitHub Connection Form — OAuth2\n *\n * Supports GitHub repos, issues, PRs, actions, gists.\n * Shows scope selection and \"Sign in with GitHub\" button.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst GITHUB_SCOPES = [\n {\n scope: \"repo\",\n label: \"Full repository access\",\n description: \"Private & public repos\",\n },\n {\n scope: \"public_repo\",\n label: \"Public repositories only\",\n description: \"Read/write public repos\",\n },\n {\n scope: \"repo:status\",\n label: \"Commit status\",\n description: \"Read/write commit status\",\n },\n {\n scope: \"read:org\",\n label: \"Read organizations\",\n description: \"View org membership\",\n },\n {\n scope: \"workflow\",\n label: \"GitHub Actions\",\n description: \"Update workflows\",\n },\n { scope: \"gist\", label: \"Gists\", description: \"Create gists\" },\n {\n scope: \"notifications\",\n label: \"Notifications\",\n description: \"Access notifications\",\n },\n];\n\nexport function GitHubForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\"repo\"]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n {/* Help Banner */}\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://docs.github.com/en/developers/apps/building-oauth-apps\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n {/* Connection Name */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My GitHub Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Scopes */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Permissions\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {GITHUB_SCOPES.map(({ scope, label, description }) => (\n <label\n key={scope}\n className=\"flex items-start gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1.5 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border mt-0.5\"\n />\n <div>\n <span className=\"text-sm font-medium text-foreground\">\n {label}\n </span>\n <p className=\"text-xs text-muted-foreground\">{description}</p>\n </div>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (user:email, read:user) are always included\n </p>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#24292F] text-white hover:bg-[#24292F]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:github\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Sign in with GitHub\"}\n </button>\n </div>\n );\n}\n","/**\n * Slack Connection Form — OAuth2\n *\n * Supports Slack messaging, channels, files, reactions.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst SLACK_SCOPES = [\n { scope: \"chat:write\", label: \"Send messages\" },\n { scope: \"channels:read\", label: \"View channels\" },\n { scope: \"channels:write\", label: \"Manage channels\" },\n { scope: \"files:read\", label: \"View files\" },\n { scope: \"files:write\", label: \"Upload files\" },\n { scope: \"reactions:read\", label: \"View reactions\" },\n { scope: \"reactions:write\", label: \"Add reactions\" },\n];\n\nexport function SlackForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"chat:write\",\n \"channels:read\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://api.slack.com/authentication/oauth-v2\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Slack Workspace\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Bot Scopes\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {SLACK_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Basic scopes (users:read, users:read.email) are always included\n </p>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#4A154B] text-white hover:bg-[#4A154B]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:slack-icon\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Add to Slack\"}\n </button>\n </div>\n );\n}\n","/**\n * HubSpot Connection Form — OAuth2\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst HUBSPOT_SCOPES = [\n { scope: \"crm.objects.contacts.read\", label: \"Read contacts\" },\n { scope: \"crm.objects.contacts.write\", label: \"Write contacts\" },\n { scope: \"crm.objects.deals.read\", label: \"Read deals\" },\n { scope: \"crm.objects.deals.write\", label: \"Write deals\" },\n { scope: \"crm.objects.companies.read\", label: \"Read companies\" },\n { scope: \"crm.objects.companies.write\", label: \"Write companies\" },\n { scope: \"sales-email-read\", label: \"Read sales emails\" },\n { scope: \"forms\", label: \"Access forms\" },\n];\n\nexport function HubSpotForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"crm.objects.contacts.read\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.hubspot.com/docs/api/oauth-quickstart-guide\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My HubSpot Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n CRM Scopes\n </label>\n <div className=\"space-y-1.5 max-h-48 overflow-y-auto border border-border rounded-md p-3\">\n {HUBSPOT_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#FF7A59] text-white hover:bg-[#FF7A59]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"simple-icons:hubspot\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Connect HubSpot\"}\n </button>\n </div>\n );\n}\n","/**\n * Salesforce Connection Form — OAuth2\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst SF_SCOPES = [\n { scope: \"full\", label: \"Full access\" },\n { scope: \"chatter_api\", label: \"Access Chatter\" },\n];\n\nexport function SalesforceForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([]);\n const [environment, setEnvironment] = useState<\"production\" | \"sandbox\">(\n \"production\",\n );\n\n const toggleScope = useCallback((scope: string) => {\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes, environment },\n });\n }, [\n connectionName,\n connectionDescription,\n selectedScopes,\n environment,\n onSubmit,\n ]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://help.salesforce.com/s/articleView?id=sf.remoteaccess_oauth_web_server_flow.htm\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Salesforce Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Environment\n </label>\n <select\n value={environment}\n onChange={(e) =>\n setEnvironment(e.target.value as \"production\" | \"sandbox\")\n }\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n >\n <option value=\"production\">Production</option>\n <option value=\"sandbox\">Sandbox</option>\n </select>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Additional Scopes\n </label>\n <div className=\"space-y-1.5 border border-border rounded-md p-3\">\n {SF_SCOPES.map(({ scope, label }) => (\n <label\n key={scope}\n className=\"flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded\"\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n </label>\n ))}\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Core scopes (openid, api, refresh_token) are always included\n </p>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#00A1E0] text-white hover:bg-[#00A1E0]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"logos:salesforce\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Connect Salesforce\"}\n </button>\n </div>\n );\n}\n","/**\n * Notion Connection Form — OAuth2\n *\n * Simple OAuth2 form — Notion doesn't use granular scopes,\n * permissions are managed within the Notion integration settings.\n */\n\nimport { useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function NotionForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n });\n }, [connectionName, connectionDescription, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.notion.com/docs/authorization\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Notion Workspace\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div className=\"p-3 rounded-md bg-muted/50 border border-border text-sm text-muted-foreground\">\n <p>\n Notion manages permissions through its integration settings.\n You&apos;ll select which pages and databases to share during the\n authorization step.\n </p>\n </div>\n\n <div className=\"p-3 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 text-sm text-blue-700\">\n <Icon icon=\"mdi:open-in-new\" className=\"w-4 h-4\" />A popup window will\n open for Notion authorization\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-foreground text-background hover:bg-foreground/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"simple-icons:notion\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Connect Notion\"}\n </button>\n </div>\n );\n}\n","/**\n * Airtable Connection Form — OAuth2 with PKCE\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nconst AIRTABLE_SCOPES = [\n { scope: \"data.records:read\", label: \"Read records\", required: true },\n { scope: \"schema.bases:read\", label: \"Read base schema\", required: true },\n { scope: \"data.records:write\", label: \"Write records\" },\n { scope: \"data.recordComments:read\", label: \"Read comments\" },\n { scope: \"data.recordComments:write\", label: \"Write comments\" },\n { scope: \"webhook:manage\", label: \"Manage webhooks\" },\n];\n\nexport function AirtableForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [selectedScopes, setSelectedScopes] = useState<string[]>([\n \"data.records:read\",\n \"schema.bases:read\",\n ]);\n\n const toggleScope = useCallback((scope: string) => {\n const scopeConfig = AIRTABLE_SCOPES.find((s) => s.scope === scope);\n if (scopeConfig?.required) return; // Can't uncheck required scopes\n setSelectedScopes((prev) =>\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\n );\n }, []);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: { scopes: selectedScopes },\n });\n }, [connectionName, connectionDescription, selectedScopes, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://airtable.com/developers/web/api/oauth-reference\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Airtable Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Permissions\n </label>\n <div className=\"space-y-1.5 border border-border rounded-md p-3\">\n {AIRTABLE_SCOPES.map(({ scope, label, required }) => (\n <label\n key={scope}\n className={`flex items-center gap-2 cursor-pointer hover:bg-accent/50 px-2 py-1 rounded ${required ? \"opacity-75\" : \"\"}`}\n >\n <input\n type=\"checkbox\"\n checked={selectedScopes.includes(scope)}\n onChange={() => toggleScope(scope)}\n disabled={isSubmitting || required}\n className=\"rounded border-border\"\n />\n <span className=\"text-sm text-foreground\">{label}</span>\n {required && (\n <span className=\"text-xs text-muted-foreground\">\n (required)\n </span>\n )}\n </label>\n ))}\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim()}\n className=\"inline-flex items-center gap-2.5 px-4 py-2.5 text-sm font-medium rounded-md bg-[#18BFFF] text-white hover:bg-[#18BFFF]/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-5 h-5 animate-spin\" />\n ) : (\n <Icon icon=\"simple-icons:airtable\" className=\"w-5 h-5\" />\n )}\n {isSubmitting ? \"Waiting for authorization...\" : \"Connect Airtable\"}\n </button>\n </div>\n );\n}\n","/**\n * OpenAI Connection Form — API Key\n *\n * Fields: API Key (required) + Organization ID (optional)\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function OpenAIForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [apiKey, setApiKey] = useState(\"\");\n const [orgId, setOrgId] = useState(\"\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey,\n config: orgId ? { organization: orgId } : undefined,\n });\n }, [connectionName, connectionDescription, apiKey, orgId, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://platform.openai.com/docs/api-reference\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My OpenAI Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"sk-...\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Find your API key at platform.openai.com/api-keys\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Organization ID\n </label>\n <input\n type=\"text\"\n value={orgId}\n onChange={(e) => setOrgId(e.target.value)}\n placeholder=\"org-... (optional)\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Optional — only needed if you belong to multiple organizations\n </p>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !apiKey.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Anthropic Connection Form — API Key\n *\n * Fields: API Key (required) + Base URL (with default) + Custom Header toggle\n * Matches n8n's Anthropic credential form (Image 4).\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function AnthropicForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [apiKey, setApiKey] = useState(\"\");\n const [baseUrl, setBaseUrl] = useState(\"https://api.anthropic.com\");\n const [addCustomHeader, setAddCustomHeader] = useState(false);\n const [headerName, setHeaderName] = useState(\"\");\n const [headerValue, setHeaderValue] = useState(\"\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n const config: Record<string, unknown> = { baseUrl };\n if (addCustomHeader && headerName) {\n config.customHeader = { name: headerName, value: headerValue };\n }\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey,\n config,\n });\n }, [\n connectionName,\n connectionDescription,\n apiKey,\n baseUrl,\n addCustomHeader,\n headerName,\n headerValue,\n onSubmit,\n ]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://docs.anthropic.com/claude/reference\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Anthropic Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"sk-ant-...\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Base URL\n </label>\n <input\n type=\"text\"\n value={baseUrl}\n onChange={(e) => setBaseUrl(e.target.value)}\n placeholder=\"https://api.anthropic.com\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* Custom Header Toggle */}\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={addCustomHeader}\n onClick={() => setAddCustomHeader(!addCustomHeader)}\n disabled={isSubmitting}\n className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${addCustomHeader ? \"bg-primary\" : \"bg-muted\"} disabled:opacity-50`}\n >\n <span\n className={`inline-block h-3.5 w-3.5 transform rounded-full bg-white transition-transform ${addCustomHeader ? \"translate-x-4.5\" : \"translate-x-0.5\"}`}\n />\n </button>\n <label className=\"text-sm font-medium text-foreground\">\n Add Custom Header\n </label>\n </div>\n\n {addCustomHeader && (\n <div className=\"space-y-3 pl-4 border-l-2 border-primary/20\">\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Header Name\n </label>\n <input\n type=\"text\"\n value={headerName}\n onChange={(e) => setHeaderName(e.target.value)}\n placeholder=\"X-Custom-Header\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Header Value\n </label>\n <input\n type=\"text\"\n value={headerValue}\n onChange={(e) => setHeaderValue(e.target.value)}\n placeholder=\"value\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !apiKey.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Linear Connection Form — API Key\n *\n * Fields: API Key (required)\n * Simple API key form for Linear issue tracking integration.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function LinearForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [apiKey, setApiKey] = useState(\"\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey,\n config: {},\n });\n }, [connectionName, connectionDescription, apiKey, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://developers.linear.app/docs\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Linear Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <p className=\"text-xs text-muted-foreground mb-2\">\n Go to Linear Settings &rarr; API &rarr; Personal API keys to create\n one.\n </p>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"lin_api_...\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !apiKey.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * BigConsole DataSink Connection Form — API Key\n *\n * Fields: BigConsole URL (required), Workspace ID (required), API Key (required)\n * Used by the bigconsole_datasink_node to push workflow data to BigConsole DataSinks.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function BigConsoleForm({\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [bigconsoleUrl, setBigconsoleUrl] = useState(\"\");\n const [workspaceId, setWorkspaceId] = useState(\"\");\n const [apiKey, setApiKey] = useState(\"\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n const config: Record<string, unknown> = {\n bigconsoleUrl,\n workspaceId,\n };\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey: apiKey || undefined,\n config,\n });\n }, [\n connectionName,\n connectionDescription,\n apiKey,\n bigconsoleUrl,\n workspaceId,\n onSubmit,\n ]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-blue-500/10 border border-blue-500/20\">\n <Icon\n icon=\"mdi:information\"\n className=\"w-4 h-4 text-blue-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-blue-700\">\n Configure the BigConsole service URL and workspace to enable DataSink\n data ingestion from workflows.\n </span>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My BigConsole Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n BigConsole URL <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:link-variant\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type=\"text\"\n value={bigconsoleUrl}\n onChange={(e) => setBigconsoleUrl(e.target.value)}\n placeholder=\"http://localhost:3725\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n <p className=\"text-xs text-muted-foreground mt-1\">\n Base URL of the BigConsole service (e.g., http://localhost:3725)\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Workspace ID <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:identifier\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type=\"text\"\n value={workspaceId}\n onChange={(e) => setWorkspaceId(e.target.value)}\n placeholder=\"726333be-2164-436d-83a3-48097f21790f\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-3 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"Enter API key\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !connectionName.trim() ||\n !bigconsoleUrl.trim() ||\n !workspaceId.trim() ||\n !apiKey.trim()\n }\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * SendGrid Connection Form — API Key\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function SendGridForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [apiKey, setApiKey] = useState(\"\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey,\n });\n }, [connectionName, connectionDescription, apiKey, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://docs.sendgrid.com/api-reference\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My SendGrid Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"SG.xxxxx\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Create an API key in your SendGrid account under Settings &gt; API\n Keys\n </p>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !apiKey.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Twilio Connection Form — API Key (Account SID + Auth Token)\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function TwilioForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [accountSid, setAccountSid] = useState(\"\");\n const [authToken, setAuthToken] = useState(\"\");\n const [showToken, setShowToken] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n // Twilio uses Account SID + Auth Token, we store Auth Token as the API key\n // and Account SID in config for the backend to use\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey: authToken,\n config: { accountSid },\n });\n }, [connectionName, connectionDescription, accountSid, authToken, onSubmit]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Need help filling out these fields?\n </span>\n <a\n href=\"https://www.twilio.com/docs/usage/api\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline ml-1\"\n >\n Open docs\n </a>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Twilio Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Account SID <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={accountSid}\n onChange={(e) => setAccountSid(e.target.value)}\n placeholder=\"ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Found on your Twilio Console dashboard\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Auth Token <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:lock\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showToken ? \"text\" : \"password\"}\n value={authToken}\n onChange={(e) => setAuthToken(e.target.value)}\n placeholder=\"Your auth token\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowToken(!showToken)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showToken ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !connectionName.trim() ||\n !accountSid.trim() ||\n !authToken.trim()\n }\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Generic OAuth2 Connection Form\n *\n * Full OAuth2 configuration for custom/arbitrary providers.\n * User provides Auth URL, Token URL, Client ID, Client Secret, etc.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\nimport { getOAuthCallbackUrl } from \"../../../utils/provider-helpers\";\n\nexport function GenericOAuth2Form({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [clientId, setClientId] = useState(\"\");\n const [clientSecret, setClientSecret] = useState(\"\");\n const [authUrl, setAuthUrl] = useState(\"\");\n const [tokenUrl, setTokenUrl] = useState(\"\");\n const [scopes, setScopes] = useState(\"\");\n const [showSecret, setShowSecret] = useState(false);\n\n const callbackUrl = getOAuthCallbackUrl();\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n config: {\n clientId,\n clientSecret,\n authUrl,\n tokenUrl,\n scopes: scopes.split(/[\\s,]+/).filter(Boolean),\n },\n });\n }, [\n connectionName,\n connectionDescription,\n clientId,\n clientSecret,\n authUrl,\n tokenUrl,\n scopes,\n onSubmit,\n ]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Configure your custom OAuth2 provider\n </span>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Custom OAuth2 Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {/* OAuth Redirect URL (read-only) */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n OAuth Redirect URL\n </label>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={callbackUrl}\n readOnly\n className=\"flex-1 px-3 py-2 border border-border rounded-md bg-muted text-sm font-mono text-muted-foreground\"\n />\n <button\n type=\"button\"\n onClick={() => navigator.clipboard.writeText(callbackUrl)}\n className=\"px-3 py-2 border border-border rounded-md hover:bg-accent transition-colors\"\n title=\"Copy\"\n >\n <Icon icon=\"mdi:content-copy\" className=\"w-4 h-4\" />\n </button>\n </div>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Use this URL as the redirect/callback URI in your OAuth provider\n settings\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Authorization URL <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"url\"\n value={authUrl}\n onChange={(e) => setAuthUrl(e.target.value)}\n placeholder=\"https://example.com/oauth/authorize\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Token URL <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"url\"\n value={tokenUrl}\n onChange={(e) => setTokenUrl(e.target.value)}\n placeholder=\"https://example.com/oauth/token\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Client ID <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={clientId}\n onChange={(e) => setClientId(e.target.value)}\n placeholder=\"Your client ID\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Client Secret <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <input\n type={showSecret ? \"text\" : \"password\"}\n value={clientSecret}\n onChange={(e) => setClientSecret(e.target.value)}\n placeholder=\"Your client secret\"\n disabled={isSubmitting}\n className=\"w-full px-3 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowSecret(!showSecret)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showSecret ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Scopes\n </label>\n <input\n type=\"text\"\n value={scopes}\n onChange={(e) => setScopes(e.target.value)}\n placeholder=\"scope1 scope2 scope3 (space-separated)\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !connectionName.trim() ||\n !authUrl.trim() ||\n !tokenUrl.trim() ||\n !clientId.trim() ||\n !clientSecret.trim()\n }\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Authorize\"}\n </button>\n </div>\n );\n}\n","/**\n * Generic API Key Connection Form\n *\n * For connecting to arbitrary services via API key.\n * Fields: API Key + Base URL + Header Name + Header Prefix\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function GenericApiKeyForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [apiKey, setApiKey] = useState(\"\");\n const [baseUrl, setBaseUrl] = useState(\"\");\n const [headerName, setHeaderName] = useState(\"Authorization\");\n const [headerPrefix, setHeaderPrefix] = useState(\"Bearer\");\n const [showKey, setShowKey] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n apiKey,\n config: { baseUrl: baseUrl || undefined, headerName, headerPrefix },\n });\n }, [\n connectionName,\n connectionDescription,\n apiKey,\n baseUrl,\n headerName,\n headerPrefix,\n onSubmit,\n ]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Configure a custom API key connection\n </span>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My API Key Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n API Key <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:key\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showKey ? \"text\" : \"password\"}\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder=\"Your API key\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm font-mono focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showKey ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Base URL\n </label>\n <input\n type=\"url\"\n value={baseUrl}\n onChange={(e) => setBaseUrl(e.target.value)}\n placeholder=\"https://api.example.com\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n API base URL (optional)\n </p>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Header Name\n </label>\n <input\n type=\"text\"\n value={headerName}\n onChange={(e) => setHeaderName(e.target.value)}\n placeholder=\"Authorization\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Header Prefix\n </label>\n <input\n type=\"text\"\n value={headerPrefix}\n onChange={(e) => setHeaderPrefix(e.target.value)}\n placeholder=\"Bearer\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Prefix added before the key (e.g., &quot;Bearer&quot;,\n &quot;Api-Key&quot;)\n </p>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !connectionName.trim() || !apiKey.trim()}\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Generic Basic Auth Connection Form\n *\n * For connecting to arbitrary services via basic auth.\n * Fields: Username + Password + Base URL\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { ProviderFormProps } from \"../types\";\n\nexport function GenericBasicAuthForm({\n provider,\n connectionName,\n connectionDescription,\n onNameChange,\n onDescriptionChange,\n onSubmit,\n isSubmitting,\n error,\n}: ProviderFormProps) {\n const [username, setUsername] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [baseUrl, setBaseUrl] = useState(\"\");\n const [showPassword, setShowPassword] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n await onSubmit({\n name: connectionName,\n description: connectionDescription,\n username,\n password,\n config: { baseUrl: baseUrl || undefined },\n });\n }, [\n connectionName,\n connectionDescription,\n username,\n password,\n baseUrl,\n onSubmit,\n ]);\n\n return (\n <div className=\"space-y-5\">\n <div className=\"flex items-center gap-2 px-3 py-2.5 rounded-md bg-amber-500/10 border border-amber-500/20\">\n <Icon\n icon=\"mdi:help-circle\"\n className=\"w-4 h-4 text-amber-600 flex-shrink-0\"\n />\n <span className=\"text-sm text-amber-700\">\n Configure a custom basic auth connection\n </span>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Connection Name <span className=\"text-red-500\">*</span>\n </label>\n <input\n type=\"text\"\n value={connectionName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"My Basic Auth Connection\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Description\n </label>\n <input\n type=\"text\"\n value={connectionDescription}\n onChange={(e) => onDescriptionChange(e.target.value)}\n placeholder=\"Optional description\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Username <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:account\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type=\"text\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n placeholder=\"Username or email\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Password <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:lock\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n type={showPassword ? \"text\" : \"password\"}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Password\"\n disabled={isSubmitting}\n className=\"w-full pl-10 pr-10 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showPassword ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Base URL\n </label>\n <input\n type=\"url\"\n value={baseUrl}\n onChange={(e) => setBaseUrl(e.target.value)}\n placeholder=\"https://api.example.com\"\n disabled={isSubmitting}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n API base URL (optional)\n </p>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-destructive/10 border border-destructive/20\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"w-4 h-4 text-destructive flex-shrink-0\"\n />\n <span className=\"text-sm text-destructive\">{error}</span>\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={\n isSubmitting ||\n !connectionName.trim() ||\n !username.trim() ||\n !password.trim()\n }\n className=\"inline-flex items-center gap-2 px-4 py-2.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <Icon icon=\"mdi:loading\" className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Icon icon=\"mdi:check\" className=\"w-4 h-4\" />\n )}\n {isSubmitting ? \"Connecting...\" : \"Save\"}\n </button>\n </div>\n );\n}\n","/**\n * Provider Form Registry\n *\n * Maps provider keys to their dedicated form components.\n * Falls back to base auth-type forms for unknown providers.\n */\n\nimport type { AuthType } from \"../../hooks/useConnections\";\nimport type { ProviderFormComponent } from \"./types\";\n\n// Base forms\nimport { OAuth2BaseForm } from \"./base/OAuth2BaseForm\";\nimport { ApiKeyBaseForm } from \"./base/ApiKeyBaseForm\";\nimport { BasicAuthBaseForm } from \"./base/BasicAuthBaseForm\";\nimport { BearerTokenBaseForm } from \"./base/BearerTokenBaseForm\";\n\n// Provider-specific forms — Google services\nimport { GoogleGmailForm } from \"./providers/GoogleGmailForm\";\nimport { GoogleDriveForm } from \"./providers/GoogleDriveForm\";\nimport { GoogleCalendarForm } from \"./providers/GoogleCalendarForm\";\nimport { GoogleSheetsForm } from \"./providers/GoogleSheetsForm\";\nimport { GoogleDocsForm } from \"./providers/GoogleDocsForm\";\n\n// Provider-specific forms — Microsoft services\nimport { MicrosoftOutlookForm } from \"./providers/MicrosoftOutlookForm\";\nimport { MicrosoftOneDriveForm } from \"./providers/MicrosoftOneDriveForm\";\nimport { MicrosoftTeamsForm } from \"./providers/MicrosoftTeamsForm\";\nimport { MicrosoftExcelForm } from \"./providers/MicrosoftExcelForm\";\n\n// Provider-specific forms — Other OAuth2\nimport { GitHubForm } from \"./providers/GitHubForm\";\nimport { SlackForm } from \"./providers/SlackForm\";\nimport { HubSpotForm } from \"./providers/HubSpotForm\";\nimport { SalesforceForm } from \"./providers/SalesforceForm\";\nimport { NotionForm } from \"./providers/NotionForm\";\nimport { AirtableForm } from \"./providers/AirtableForm\";\n\n// Provider-specific forms — API Key\nimport { OpenAIForm } from \"./providers/OpenAIForm\";\nimport { AnthropicForm } from \"./providers/AnthropicForm\";\nimport { LinearForm } from \"./providers/LinearForm\";\nimport { BigConsoleForm } from \"./providers/BigConsoleForm\";\nimport { SendGridForm } from \"./providers/SendGridForm\";\nimport { TwilioForm } from \"./providers/TwilioForm\";\n\n// Provider-specific forms — Generic\nimport { GenericOAuth2Form } from \"./providers/GenericOAuth2Form\";\nimport { GenericApiKeyForm } from \"./providers/GenericApiKeyForm\";\nimport { GenericBasicAuthForm } from \"./providers/GenericBasicAuthForm\";\n\n// ============================================================================\n// Registry\n// ============================================================================\n\n/**\n * Map of provider key → dedicated form component.\n */\nconst PROVIDER_FORM_REGISTRY: Record<string, ProviderFormComponent> = {\n // Google services\n \"google-gmail\": GoogleGmailForm,\n \"google-drive\": GoogleDriveForm,\n \"google-calendar\": GoogleCalendarForm,\n \"google-sheets\": GoogleSheetsForm,\n \"google-docs\": GoogleDocsForm,\n // Microsoft services\n \"microsoft-outlook\": MicrosoftOutlookForm,\n \"microsoft-onedrive\": MicrosoftOneDriveForm,\n \"microsoft-teams\": MicrosoftTeamsForm,\n \"microsoft-excel\": MicrosoftExcelForm,\n // Other OAuth2 providers\n github: GitHubForm,\n slack: SlackForm,\n hubspot: HubSpotForm,\n salesforce: SalesforceForm,\n notion: NotionForm,\n airtable: AirtableForm,\n // API Key providers\n openai: OpenAIForm,\n anthropic: AnthropicForm,\n linear: LinearForm,\n bigconsole: BigConsoleForm,\n sendgrid: SendGridForm,\n twilio: TwilioForm,\n // Generic providers\n \"generic-oauth2\": GenericOAuth2Form,\n \"generic-api-key\": GenericApiKeyForm,\n \"generic-basic-auth\": GenericBasicAuthForm,\n};\n\n/**\n * Get the base form component for a given auth type.\n */\nfunction getBaseFormByAuthType(authType: AuthType): ProviderFormComponent {\n switch (authType) {\n case \"OAUTH2\":\n return OAuth2BaseForm;\n case \"API_KEY\":\n return ApiKeyBaseForm;\n case \"BASIC_AUTH\":\n return BasicAuthBaseForm;\n case \"BEARER_TOKEN\":\n return BearerTokenBaseForm;\n default:\n return ApiKeyBaseForm; // Default fallback\n }\n}\n\n/**\n * Get the form component for a provider.\n *\n * Looks up the provider key in the registry first; if not found,\n * falls back to the base form for the provider's auth type.\n */\nexport function getProviderForm(\n providerKey: string,\n authType: AuthType,\n): ProviderFormComponent {\n return (\n PROVIDER_FORM_REGISTRY[providerKey.toLowerCase()] ??\n getBaseFormByAuthType(authType)\n );\n}\n\n// Re-export types\nexport type {\n ProviderFormProps,\n ProviderFormComponent,\n ConnectionFormData,\n ConnectionFormDialogProps,\n} from \"./types\";\n\n// Re-export base forms for direct use\nexport {\n OAuth2BaseForm,\n ApiKeyBaseForm,\n BasicAuthBaseForm,\n BearerTokenBaseForm,\n};\n\n// Re-export provider forms for direct use\nexport {\n // Google services\n GoogleGmailForm,\n GoogleDriveForm,\n GoogleCalendarForm,\n GoogleSheetsForm,\n GoogleDocsForm,\n // Microsoft services\n MicrosoftOutlookForm,\n MicrosoftOneDriveForm,\n MicrosoftTeamsForm,\n MicrosoftExcelForm,\n // Other OAuth2\n GitHubForm,\n SlackForm,\n HubSpotForm,\n SalesforceForm,\n NotionForm,\n AirtableForm,\n // API Key\n OpenAIForm,\n AnthropicForm,\n LinearForm,\n BigConsoleForm,\n SendGridForm,\n TwilioForm,\n // Generic\n GenericOAuth2Form,\n GenericApiKeyForm,\n GenericBasicAuthForm,\n};\n","/**\n * ProviderPicker — Searchable dropdown for selecting an integration provider.\n *\n * Used in the ConnectionFormDialog when no provider is pre-selected.\n * Shows installed providers with search, grouped by category.\n * Matches n8n's \"Add new credential\" modal (Image 2).\n */\n\nimport { useState, useMemo, useCallback, useRef, useEffect } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type { IntegrationProvider } from \"../hooks/useConnections\";\nimport {\n getProviderIcon,\n getAuthTypeLabel,\n getCategoryLabel,\n} from \"../utils/provider-helpers\";\n\ninterface ProviderPickerProps {\n /** Available providers to choose from */\n providers: IntegrationProvider[];\n /** Whether providers are still loading */\n loading: boolean;\n /** Callback when a provider is selected */\n onSelect: (provider: IntegrationProvider) => void;\n}\n\nexport function ProviderPicker({\n providers,\n loading,\n onSelect,\n}: ProviderPickerProps) {\n const [search, setSearch] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Auto-focus the search input\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n // Filter by search\n const filtered = useMemo(() => {\n if (!search.trim()) return providers;\n const q = search.toLowerCase();\n return providers.filter(\n (p) =>\n p.name.toLowerCase().includes(q) ||\n p.description?.toLowerCase().includes(q) ||\n p.key.toLowerCase().includes(q) ||\n p.category.toLowerCase().includes(q),\n );\n }, [providers, search]);\n\n // Group by category\n const grouped = useMemo(() => {\n const groups: Record<string, IntegrationProvider[]> = {};\n filtered.forEach((p) => {\n const cat = p.category;\n if (!groups[cat]) groups[cat] = [];\n groups[cat].push(p);\n });\n return groups;\n }, [filtered]);\n\n const handleSelect = useCallback(\n (provider: IntegrationProvider) => {\n onSelect(provider);\n },\n [onSelect],\n );\n\n return (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-muted-foreground mb-3\">\n Select an app or service to connect to\n </p>\n <div className=\"relative\">\n <Icon\n icon=\"mdi:magnify\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\"\n />\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search providers...\"\n className=\"w-full pl-10 pr-3 py-2.5 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary\"\n />\n </div>\n </div>\n\n {loading ? (\n <div className=\"flex items-center justify-center py-8\">\n <Icon\n icon=\"mdi:loading\"\n className=\"w-6 h-6 animate-spin text-muted-foreground\"\n />\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"text-center py-8 text-sm text-muted-foreground\">\n No providers found matching &ldquo;{search}&rdquo;\n </div>\n ) : (\n <div className=\"max-h-[400px] overflow-y-auto space-y-1\">\n {Object.entries(grouped).map(([category, categoryProviders]) => (\n <div key={category}>\n <div className=\"px-2 py-1.5 text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n {getCategoryLabel(category as IntegrationProvider[\"category\"])}\n </div>\n {categoryProviders.map((provider) => (\n <button\n key={provider.id}\n type=\"button\"\n onClick={() => handleSelect(provider)}\n className=\"w-full flex items-center gap-3 px-3 py-2.5 rounded-md hover:bg-accent/50 transition-colors text-left\"\n >\n <Icon\n icon={getProviderIcon(provider.key)}\n className=\"w-6 h-6 flex-shrink-0\"\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-foreground\">\n {provider.name}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {getAuthTypeLabel(provider.authType)}\n </div>\n </div>\n </button>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Hook for managing connection form dialog state and mutations.\n *\n * Provides all GraphQL mutations required by the ConnectionFormDialog:\n * - createConnection\n * - initiateOAuth (+ popup + polling)\n * - authenticateWithApiKey\n * - authenticateWithBasicAuth\n * - authenticateWithBearerToken\n * - getProviderByKey / getProviderCatalog\n * - getConnection (for polling OAuth status)\n */\n\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport { gql } from \"@apollo/client\";\nimport { getFluidGridsClient } from \"../../../graphql/client\";\nimport type {\n IntegrationConnection,\n IntegrationProvider,\n OAuthInitiationResult,\n} from \"./useConnections\";\nimport { getOAuthCallbackUrl } from \"../utils/provider-helpers\";\n\n// ============================================================================\n// Additional GraphQL Operations\n// ============================================================================\n\nconst GET_PROVIDER_BY_KEY = gql`\n query GetProviderByKey($key: String!) {\n getProviderByKey(key: $key) {\n id\n key\n name\n description\n category\n authType\n icon\n color\n website\n docsUrl\n isBuiltIn\n isEnabled\n configSchema\n defaultScopes\n availableScopes\n supportedFeatures\n }\n }\n`;\n\nconst GET_PROVIDER_CATALOG = gql`\n query GetProviderCatalog($pagination: IntegrationsPaginationInput) {\n getProviderCatalog(pagination: $pagination) {\n items {\n id\n key\n name\n description\n category\n authType\n icon\n color\n website\n docsUrl\n isBuiltIn\n isEnabled\n configSchema\n supportedFeatures\n }\n total\n hasMore\n }\n }\n`;\n\nconst GET_CONNECTION_STATUS = gql`\n query GetConnectionStatus($id: ID!) {\n getConnection(id: $id) {\n id\n name\n status\n errorMessage\n externalAccountEmail\n externalAccountName\n provider {\n id\n key\n name\n icon\n }\n }\n }\n`;\n\nconst CREATE_CONNECTION_FOR_DIALOG = gql`\n mutation CreateConnectionForDialog($input: CreateConnectionInput!) {\n createConnection(input: $input) {\n id\n name\n status\n provider {\n id\n key\n name\n icon\n }\n }\n }\n`;\n\nconst INITIATE_OAUTH_FOR_DIALOG = gql`\n mutation InitiateOAuthForDialog($input: InitiateOAuthInput!) {\n initiateOAuth(input: $input) {\n redirectUrl\n state\n }\n }\n`;\n\nconst AUTHENTICATE_WITH_API_KEY = gql`\n mutation AuthenticateWithApiKey($input: AuthenticateWithApiKeyInput!) {\n authenticateWithApiKey(input: $input) {\n id\n name\n status\n provider {\n id\n key\n name\n icon\n }\n }\n }\n`;\n\nconst AUTHENTICATE_WITH_BASIC_AUTH = gql`\n mutation AuthenticateWithBasicAuth($input: AuthenticateWithBasicAuthInput!) {\n authenticateWithBasicAuth(input: $input) {\n id\n name\n status\n provider {\n id\n key\n name\n icon\n }\n }\n }\n`;\n\nconst AUTHENTICATE_WITH_BEARER_TOKEN = gql`\n mutation AuthenticateWithBearerToken(\n $input: AuthenticateWithBearerTokenInput!\n ) {\n authenticateWithBearerToken(input: $input) {\n id\n name\n status\n provider {\n id\n key\n name\n icon\n }\n }\n }\n`;\n\nconst TEST_CONNECTION = gql`\n mutation TestConnection($connectionId: ID!) {\n testConnection(connectionId: $connectionId) {\n success\n message\n latencyMs\n }\n }\n`;\n\n// ============================================================================\n// Extended Provider type with configSchema\n// ============================================================================\n\nexport interface IntegrationProviderFull extends IntegrationProvider {\n configSchema?: Record<string, unknown> | null;\n defaultScopes?: string[];\n availableScopes?: Array<{\n scope: string;\n description: string;\n required?: boolean;\n }>;\n supportedFeatures?: string[];\n}\n\n// ============================================================================\n// Hook: useProviderByKey\n// ============================================================================\n\nexport function useProviderByKey(key?: string) {\n const [provider, setProvider] = useState<IntegrationProviderFull | null>(\n null,\n );\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchProvider = useCallback(async (providerKey: string) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<{\n getProviderByKey: IntegrationProviderFull;\n }>({\n query: GET_PROVIDER_BY_KEY,\n variables: { key: providerKey },\n fetchPolicy: \"cache-first\",\n });\n const p = result.data?.getProviderByKey ?? null;\n setProvider(p);\n return p;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n if (key) {\n fetchProvider(key);\n }\n }, [key, fetchProvider]);\n\n return { provider, loading, error, fetchProvider };\n}\n\n// ============================================================================\n// Hook: useProviderCatalog\n// ============================================================================\n\nexport function useProviderCatalog() {\n const [providers, setProviders] = useState<IntegrationProviderFull[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchCatalog = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<{\n getProviderCatalog: { items: IntegrationProviderFull[]; total: number };\n }>({\n query: GET_PROVIDER_CATALOG,\n variables: { pagination: { limit: 100 } },\n fetchPolicy: \"cache-first\",\n });\n setProviders(result.data?.getProviderCatalog?.items ?? []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchCatalog();\n }, [fetchCatalog]);\n\n return { providers, loading, error, refetch: fetchCatalog };\n}\n\n// ============================================================================\n// Hook: useConnectionDialog (main hook)\n// ============================================================================\n\ninterface UseConnectionDialogOptions {\n onConnectionCreated?: (connection: {\n id: string;\n name: string;\n provider: IntegrationProvider;\n status: string;\n }) => void;\n onError?: (error: Error) => void;\n}\n\nexport function useConnectionDialog(options?: UseConnectionDialogOptions) {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | undefined>();\n const [oauthWaiting, setOauthWaiting] = useState(false);\n const oauthPopupRef = useRef<Window | null>(null);\n const pollTimerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Cleanup polling on unmount\n useEffect(() => {\n return () => {\n if (pollTimerRef.current) clearInterval(pollTimerRef.current);\n if (oauthPopupRef.current && !oauthPopupRef.current.closed) {\n oauthPopupRef.current.close();\n }\n };\n }, []);\n\n /**\n * Create a connection and authenticate based on auth type.\n */\n const submitConnection = useCallback(\n async (data: {\n provider: IntegrationProvider;\n name: string;\n description?: string;\n apiKey?: string;\n username?: string;\n password?: string;\n bearerToken?: string;\n config?: Record<string, unknown>;\n scopes?: string[];\n }) => {\n setIsSubmitting(true);\n setError(undefined);\n\n try {\n const client = getFluidGridsClient();\n\n // Step 1: Create the connection\n const createResult = await client.mutate<{\n createConnection: IntegrationConnection;\n }>({\n mutation: CREATE_CONNECTION_FOR_DIALOG,\n variables: {\n input: {\n name: data.name.trim(),\n description: data.description?.trim(),\n providerId: data.provider.id,\n config: data.config,\n },\n },\n });\n\n const connection = createResult.data?.createConnection;\n if (!connection) {\n throw new Error(\"Failed to create connection\");\n }\n\n // Step 2: Authenticate based on auth type\n switch (data.provider.authType) {\n case \"OAUTH2\": {\n const oauthResult = await client.mutate<{\n initiateOAuth: OAuthInitiationResult;\n }>({\n mutation: INITIATE_OAUTH_FOR_DIALOG,\n variables: {\n input: {\n connectionId: connection.id,\n redirectUri: getOAuthCallbackUrl(),\n scopes: data.scopes,\n },\n },\n });\n\n const oauthData = oauthResult.data?.initiateOAuth;\n if (!oauthData?.redirectUrl) {\n throw new Error(\"Failed to initiate OAuth flow\");\n }\n\n // Open OAuth popup\n const width = 600;\n const height = 700;\n const left = window.screenX + (window.innerWidth - width) / 2;\n const top = window.screenY + (window.innerHeight - height) / 2;\n const popup = window.open(\n oauthData.redirectUrl,\n \"oauth_popup\",\n `width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no,scrollbars=yes,resizable=yes`,\n );\n oauthPopupRef.current = popup;\n setOauthWaiting(true);\n\n // Poll for OAuth completion (Google COOP headers break postMessage)\n return new Promise<void>((resolve, reject) => {\n if (pollTimerRef.current) clearInterval(pollTimerRef.current);\n pollTimerRef.current = setInterval(async () => {\n try {\n const pollResult = await client.query<{\n getConnection: {\n id: string;\n name: string;\n status: string;\n errorMessage?: string;\n provider: IntegrationProvider;\n };\n }>({\n query: GET_CONNECTION_STATUS,\n variables: { id: connection.id },\n fetchPolicy: \"network-only\",\n });\n\n const status = pollResult.data?.getConnection?.status;\n if (status && status !== \"PENDING_AUTH\") {\n // Stop polling\n if (pollTimerRef.current)\n clearInterval(pollTimerRef.current);\n pollTimerRef.current = null;\n\n // Close popup\n if (\n oauthPopupRef.current &&\n !oauthPopupRef.current.closed\n ) {\n oauthPopupRef.current.close();\n }\n oauthPopupRef.current = null;\n setOauthWaiting(false);\n setIsSubmitting(false);\n\n if (status === \"ACTIVE\") {\n const conn = pollResult.data!.getConnection;\n options?.onConnectionCreated?.({\n id: conn.id,\n name: conn.name,\n provider: conn.provider,\n status: conn.status,\n });\n resolve();\n } else {\n const errMsg =\n pollResult.data?.getConnection?.errorMessage ||\n \"OAuth authorization failed\";\n setError(errMsg);\n options?.onError?.(new Error(errMsg));\n reject(new Error(errMsg));\n }\n }\n } catch {\n // Ignore polling errors, keep trying\n }\n }, 2000);\n\n // Timeout after 5 minutes\n setTimeout(() => {\n if (pollTimerRef.current) {\n clearInterval(pollTimerRef.current);\n pollTimerRef.current = null;\n setOauthWaiting(false);\n setIsSubmitting(false);\n const errMsg = \"OAuth authorization timed out\";\n setError(errMsg);\n options?.onError?.(new Error(errMsg));\n reject(new Error(errMsg));\n }\n }, 300000);\n });\n }\n\n case \"API_KEY\": {\n if (!data.apiKey?.trim()) throw new Error(\"API key is required\");\n const apiKeyResult = await client.mutate<{\n authenticateWithApiKey: IntegrationConnection;\n }>({\n mutation: AUTHENTICATE_WITH_API_KEY,\n variables: {\n input: {\n connectionId: connection.id,\n apiKey: data.apiKey.trim(),\n },\n },\n });\n const conn = apiKeyResult.data?.authenticateWithApiKey;\n if (conn) {\n options?.onConnectionCreated?.({\n id: conn.id,\n name: conn.name,\n provider: conn.provider,\n status: conn.status,\n });\n }\n break;\n }\n\n case \"BASIC_AUTH\": {\n if (!data.username?.trim() || !data.password?.trim()) {\n throw new Error(\"Username and password are required\");\n }\n const basicResult = await client.mutate<{\n authenticateWithBasicAuth: IntegrationConnection;\n }>({\n mutation: AUTHENTICATE_WITH_BASIC_AUTH,\n variables: {\n input: {\n connectionId: connection.id,\n username: data.username.trim(),\n password: data.password.trim(),\n },\n },\n });\n const conn = basicResult.data?.authenticateWithBasicAuth;\n if (conn) {\n options?.onConnectionCreated?.({\n id: conn.id,\n name: conn.name,\n provider: conn.provider,\n status: conn.status,\n });\n }\n break;\n }\n\n case \"BEARER_TOKEN\": {\n if (!data.bearerToken?.trim())\n throw new Error(\"Bearer token is required\");\n const bearerResult = await client.mutate<{\n authenticateWithBearerToken: IntegrationConnection;\n }>({\n mutation: AUTHENTICATE_WITH_BEARER_TOKEN,\n variables: {\n input: {\n connectionId: connection.id,\n token: data.bearerToken.trim(),\n },\n },\n });\n const conn = bearerResult.data?.authenticateWithBearerToken;\n if (conn) {\n options?.onConnectionCreated?.({\n id: conn.id,\n name: conn.name,\n provider: conn.provider,\n status: conn.status,\n });\n }\n break;\n }\n\n default:\n options?.onConnectionCreated?.({\n id: connection.id,\n name: connection.name,\n provider: connection.provider,\n status: connection.status,\n });\n }\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Connection failed\";\n setError(errorMessage);\n options?.onError?.(\n err instanceof Error ? err : new Error(errorMessage),\n );\n } finally {\n if (!oauthWaiting) {\n setIsSubmitting(false);\n }\n }\n },\n [options, oauthWaiting],\n );\n\n /**\n * Test an existing connection.\n */\n const testConnection = useCallback(async (connectionId: string) => {\n try {\n const client = getFluidGridsClient();\n const result = await client.mutate<{\n testConnection: {\n success: boolean;\n message: string;\n latencyMs: number;\n };\n }>({\n mutation: TEST_CONNECTION,\n variables: { connectionId },\n });\n return result.data?.testConnection ?? null;\n } catch (err) {\n return { success: false, message: (err as Error).message, latencyMs: 0 };\n }\n }, []);\n\n const clearError = useCallback(() => setError(undefined), []);\n\n return {\n submitConnection,\n testConnection,\n isSubmitting,\n oauthWaiting,\n error,\n clearError,\n };\n}\n","/**\n * ConnectionFormDialog — n8n-style credential/connection popup.\n *\n * A modal dialog that renders the correct provider form based on the\n * provider key. Can be opened from any product (FluidGrids, Botlit,\n * BigConsole) by passing a provider key or showing the provider picker.\n *\n * Features:\n * - Left sidebar tabs: Connection, Sharing, Details (like n8n)\n * - Dynamic form based on provider auth type\n * - Provider-specific forms with tailored fields\n * - OAuth2 popup flow with polling\n * - API Key / Basic Auth / Bearer Token forms\n * - Provider search/picker when no provider is pre-selected\n */\n\nimport { useState, useCallback, useEffect, useMemo } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport * as Dialog from \"@radix-ui/react-dialog\";\nimport { getProviderForm } from \"./provider-forms\";\nimport { ProviderPicker } from \"./ProviderPicker\";\nimport type {\n ConnectionFormDialogProps,\n ConnectionFormData,\n} from \"./provider-forms/types\";\nimport type { IntegrationProvider } from \"../hooks/useConnections\";\nimport {\n useProviderByKey,\n useProviderCatalog,\n useConnectionDialog,\n} from \"../hooks/useConnectionDialog\";\nimport { getProviderIcon, getAuthTypeLabel } from \"../utils/provider-helpers\";\n\ntype DialogTab = \"connection\" | \"sharing\" | \"details\";\n\nexport function ConnectionFormDialog({\n open,\n onClose,\n providerKey,\n providerId,\n showProviderPicker: showPickerProp,\n connectionId,\n defaultName,\n onConnectionCreated,\n onError,\n}: ConnectionFormDialogProps) {\n // State\n const [activeTab, setActiveTab] = useState<DialogTab>(\"connection\");\n const [selectedProvider, setSelectedProvider] =\n useState<IntegrationProvider | null>(null);\n const [connectionName, setConnectionName] = useState(defaultName ?? \"\");\n const [connectionDescription, setConnectionDescription] = useState(\"\");\n const [showPicker, setShowPicker] = useState(\n showPickerProp ?? (!providerKey && !providerId),\n );\n const [success, setSuccess] = useState(false);\n\n // Hooks\n const { provider: fetchedProvider, loading: providerLoading } =\n useProviderByKey(\n providerKey && !selectedProvider ? providerKey : undefined,\n );\n const { providers: catalogProviders, loading: catalogLoading } =\n useProviderCatalog();\n\n const { submitConnection, isSubmitting, oauthWaiting, error, clearError } =\n useConnectionDialog({\n onConnectionCreated: (conn) => {\n setSuccess(true);\n onConnectionCreated?.(conn);\n },\n onError,\n });\n\n // Set provider from fetched data\n useEffect(() => {\n if (fetchedProvider && !selectedProvider) {\n setSelectedProvider(fetchedProvider);\n if (!connectionName) {\n setConnectionName(`${fetchedProvider.name} Connection`);\n }\n setShowPicker(false);\n }\n }, [fetchedProvider, selectedProvider, connectionName]);\n\n // Reset state when dialog opens/closes\n useEffect(() => {\n if (open) {\n setActiveTab(\"connection\");\n setSuccess(false);\n clearError();\n if (!providerKey && !providerId) {\n setSelectedProvider(null);\n setConnectionName(defaultName ?? \"\");\n setConnectionDescription(\"\");\n setShowPicker(showPickerProp ?? true);\n }\n }\n }, [open, providerKey, providerId, defaultName, showPickerProp, clearError]);\n\n // Provider selection from picker\n const handleProviderSelect = useCallback((provider: IntegrationProvider) => {\n setSelectedProvider(provider);\n setConnectionName(`${provider.name} Connection`);\n setShowPicker(false);\n }, []);\n\n // Form submission\n const handleFormSubmit = useCallback(\n async (data: ConnectionFormData) => {\n if (!selectedProvider) return;\n await submitConnection({\n provider: selectedProvider,\n name: data.name,\n description: data.description,\n apiKey: data.apiKey,\n username: data.username,\n password: data.password,\n bearerToken: data.bearerToken,\n config: data.config,\n scopes: (data.config?.scopes as string[]) ?? undefined,\n });\n },\n [selectedProvider, submitConnection],\n );\n\n // Get the form component for the selected provider\n const FormComponent = useMemo(() => {\n if (!selectedProvider) return null;\n return getProviderForm(selectedProvider.key, selectedProvider.authType);\n }, [selectedProvider]);\n\n // Tab items\n const tabs: { key: DialogTab; label: string; icon: string }[] = [\n { key: \"connection\", label: \"Connection\", icon: \"mdi:link-variant\" },\n { key: \"sharing\", label: \"Sharing\", icon: \"mdi:share-variant\" },\n { key: \"details\", label: \"Details\", icon: \"mdi:information\" },\n ];\n\n return (\n <Dialog.Root open={open} onOpenChange={(isOpen) => !isOpen && onClose()}>\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 bg-black/50 z-50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\" />\n <Dialog.Content className=\"fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-50 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 {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-border flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n {selectedProvider ? (\n <>\n <Icon\n icon={getProviderIcon(selectedProvider.key)}\n className=\"w-7 h-7\"\n />\n <div>\n <Dialog.Title className=\"text-base font-semibold text-foreground\">\n {selectedProvider.name} account\n </Dialog.Title>\n <Dialog.Description className=\"text-xs text-muted-foreground\">\n {getAuthTypeLabel(selectedProvider.authType)}\n </Dialog.Description>\n </div>\n </>\n ) : (\n <div>\n <Dialog.Title className=\"text-base font-semibold text-foreground\">\n Add new credential\n </Dialog.Title>\n <Dialog.Description className=\"text-xs text-muted-foreground\">\n Select an app or service to connect to\n </Dialog.Description>\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {selectedProvider && !showPicker && !success && (\n <button\n type=\"button\"\n onClick={() =>\n handleFormSubmit({\n name: connectionName,\n description: connectionDescription,\n })\n }\n disabled={isSubmitting || !connectionName.trim()}\n className=\"px-4 py-1.5 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n Save\n </button>\n )}\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className=\"p-1.5 rounded-md hover:bg-accent transition-colors text-muted-foreground hover:text-foreground\"\n aria-label=\"Close\"\n >\n <Icon icon=\"mdi:close\" className=\"w-5 h-5\" />\n </button>\n </Dialog.Close>\n </div>\n </div>\n\n {/* Body */}\n <div className=\"flex flex-1 min-h-0 overflow-hidden\">\n {/* Provider Picker Mode */}\n {showPicker && !selectedProvider && (\n <div className=\"flex-1 p-5 overflow-y-auto\">\n <ProviderPicker\n providers={catalogProviders}\n loading={catalogLoading}\n onSelect={handleProviderSelect}\n />\n </div>\n )}\n\n {/* Loading */}\n {providerLoading && !selectedProvider && !showPicker && (\n <div className=\"flex-1 flex items-center justify-center\">\n <Icon\n icon=\"mdi:loading\"\n className=\"w-8 h-8 animate-spin text-muted-foreground\"\n />\n </div>\n )}\n\n {/* Success State */}\n {success && selectedProvider && (\n <div className=\"flex-1 flex flex-col items-center justify-center p-8 text-center\">\n <div className=\"p-3 rounded-full bg-green-500/10 mb-4\">\n <Icon\n icon=\"mdi:check-circle\"\n className=\"w-12 h-12 text-green-600\"\n />\n </div>\n <h3 className=\"text-lg font-semibold text-foreground mb-1\">\n Connection Created!\n </h3>\n <p className=\"text-sm text-muted-foreground mb-6\">\n Your {selectedProvider.name} connection has been set up\n successfully.\n </p>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"px-4 py-2 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors\"\n >\n Done\n </button>\n </div>\n )}\n\n {/* Form Mode (with sidebar tabs) */}\n {selectedProvider && !showPicker && !success && (\n <>\n {/* Left Sidebar Tabs */}\n <div className=\"w-40 border-r border-border flex-shrink-0 py-3\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={`w-full flex items-center gap-2 px-4 py-2 text-sm font-medium transition-colors ${\n activeTab === tab.key\n ? \"text-foreground bg-accent/50 border-l-2 border-primary\"\n : \"text-muted-foreground hover:text-foreground hover:bg-accent/30 border-l-2 border-transparent\"\n }`}\n >\n <Icon icon={tab.icon} className=\"w-4 h-4\" />\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Main Content Area */}\n <div className=\"flex-1 p-5 overflow-y-auto\">\n {/* Connection Tab */}\n {activeTab === \"connection\" && FormComponent && (\n <FormComponent\n provider={selectedProvider}\n connectionId={connectionId ?? null}\n connectionName={connectionName}\n connectionDescription={connectionDescription}\n onNameChange={setConnectionName}\n onDescriptionChange={setConnectionDescription}\n onSubmit={handleFormSubmit}\n isSubmitting={isSubmitting || oauthWaiting}\n error={error}\n />\n )}\n\n {/* Sharing Tab (placeholder) */}\n {activeTab === \"sharing\" && (\n <div className=\"space-y-4\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Sharing\n </h3>\n <div className=\"p-4 rounded-md bg-muted/50 border border-border text-center\">\n <Icon\n icon=\"mdi:share-variant\"\n className=\"w-8 h-8 mx-auto text-muted-foreground mb-2\"\n />\n <p className=\"text-sm text-muted-foreground\">\n Connection sharing settings will be available in a\n future update.\n </p>\n </div>\n </div>\n )}\n\n {/* Details Tab */}\n {activeTab === \"details\" && (\n <div className=\"space-y-4\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Details\n </h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3 p-3 rounded-md border border-border\">\n <Icon\n icon={getProviderIcon(selectedProvider.key)}\n className=\"w-8 h-8\"\n />\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n {selectedProvider.name}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {getAuthTypeLabel(selectedProvider.authType)}\n </p>\n </div>\n </div>\n {selectedProvider.description && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Description\n </label>\n <p className=\"text-sm text-foreground mt-1\">\n {selectedProvider.description}\n </p>\n </div>\n )}\n {selectedProvider.website && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Website\n </label>\n <a\n href={selectedProvider.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block text-sm text-primary hover:underline mt-1\"\n >\n {selectedProvider.website}\n </a>\n </div>\n )}\n {selectedProvider.docsUrl && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wider\">\n Documentation\n </label>\n <a\n href={selectedProvider.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block text-sm text-primary hover:underline mt-1\"\n >\n {selectedProvider.docsUrl}\n </a>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </>\n )}\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","/**\n * ConnectionSelector Component\n *\n * A dropdown selector for choosing integration connections in workflow nodes.\n * Replaces the legacy CredentialSelector and queries the integrations service.\n *\n * This component:\n * - Fetches connections from wspace-integrations-svc via the federated gateway\n * - Filters connections by provider adapters defined in node manifests\n * - Supports single and multiple selection modes\n * - Opens an inline ConnectionFormDialog popup for creating new connections (n8n-style)\n */\n\nimport { useState, useMemo, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from \"@burdenoff/fe-libs/ui\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport {\n useConnections,\n type IntegrationConnection,\n type ConnectionStatus,\n} from \"../hooks/useConnections\";\nimport { ConnectionFormDialog } from \"./ConnectionFormDialog\";\nimport { getProviderIcon } from \"../utils/provider-helpers\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ConnectionAdapter {\n /** Adapter name (e.g., \"gmail\", \"google-calendar\") */\n name: string;\n /** Provider key (e.g., \"google\", \"github\", \"slack\") */\n provider: string;\n}\n\ninterface SelectedConnection {\n /** Connection ID */\n connectionId: string;\n /** Adapter name for the node */\n adapter: string;\n}\n\ninterface ConnectionSelectorProps {\n /** Available connection adapters from node manifest */\n adapters: ConnectionAdapter[];\n /** Currently selected connections */\n selectedConnections: SelectedConnection[];\n /** Callback when connections change */\n onChange: (connections: SelectedConnection[]) => void;\n /** Whether multiple connections can be selected */\n multiple?: boolean;\n /** Show status indicators */\n showStatus?: boolean;\n /** Compact mode for smaller displays */\n compact?: boolean;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n// getProviderIcon imported from ../utils/provider-helpers\n\nfunction formatAge(dateString: string): string {\n try {\n return formatDistanceToNow(new Date(dateString), { addSuffix: true });\n } catch {\n return \"\";\n }\n}\n\nfunction getStatusColor(status: ConnectionStatus): string {\n switch (status) {\n case \"ACTIVE\":\n return \"text-[var(--color-status-success-text)]\";\n case \"INACTIVE\":\n return \"text-muted-foreground\";\n case \"ERROR\":\n case \"REVOKED\":\n return \"text-[var(--color-status-error-text)]\";\n case \"EXPIRED\":\n case \"PENDING_AUTH\":\n return \"text-[var(--color-status-warning-text)]\";\n default:\n return \"text-muted-foreground\";\n }\n}\n\nfunction getStatusIcon(status: ConnectionStatus): string {\n switch (status) {\n case \"ACTIVE\":\n return \"mdi:check-circle\";\n case \"INACTIVE\":\n return \"mdi:pause-circle\";\n case \"ERROR\":\n case \"REVOKED\":\n return \"mdi:alert-circle\";\n case \"EXPIRED\":\n return \"mdi:clock-alert\";\n case \"PENDING_AUTH\":\n return \"mdi:account-clock\";\n default:\n return \"mdi:help-circle\";\n }\n}\n\n// ============================================================================\n// Connection Chip Component\n// ============================================================================\n\ninterface ConnectionChipProps {\n connection: SelectedConnection;\n connectionData?: IntegrationConnection;\n onRemove: () => void;\n}\n\nfunction ConnectionChip({\n connection,\n connectionData,\n onRemove,\n}: ConnectionChipProps) {\n const providerKey = connectionData?.provider?.key || connection.adapter;\n const icon = connectionData?.provider?.icon || getProviderIcon(providerKey);\n const name = connectionData?.name || connection.connectionId;\n const status = connectionData?.status;\n\n return (\n <div className=\"flex items-center gap-1.5 px-2 py-1 bg-muted rounded-md text-sm group\">\n <Icon icon={icon} className=\"w-4 h-4\" />\n <span className=\"truncate max-w-32\">{name}</span>\n {status && (\n <Icon\n icon={getStatusIcon(status)}\n className={`w-3.5 h-3.5 ${getStatusColor(status)}`}\n />\n )}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"text-muted-foreground hover:text-destructive opacity-0 group-hover:opacity-100 transition-opacity\"\n >\n <Icon icon=\"mdi:close\" className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n );\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\nexport function ConnectionSelector({\n adapters,\n selectedConnections,\n onChange,\n multiple = false,\n showStatus = true,\n compact = false,\n}: ConnectionSelectorProps) {\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [dialogOpen, setDialogOpen] = useState(false);\n const [dialogProviderKey, setDialogProviderKey] = useState<\n string | undefined\n >();\n\n // Fetch all connections\n const {\n connections,\n loading: connectionsLoading,\n refetch,\n } = useConnections();\n\n // Filter connections by available adapters\n const availableConnections = useMemo(() => {\n if (!adapters || adapters.length === 0) return [];\n\n // Build a set of adapter identifiers for matching\n const adapterIdentifiers = new Set<string>();\n adapters.forEach((a) => {\n adapterIdentifiers.add(a.provider.toLowerCase());\n adapterIdentifiers.add(a.name.toLowerCase());\n });\n\n return connections.filter((conn) => {\n const providerKey = conn.provider?.key?.toLowerCase() || \"\";\n const category = conn.provider?.category?.toLowerCase() || \"\";\n\n // Match by provider key\n if (adapterIdentifiers.has(providerKey)) {\n return true;\n }\n\n // Check if any adapter matches the provider\n for (const identifier of adapterIdentifiers) {\n if (\n providerKey.includes(identifier) ||\n identifier.includes(providerKey)\n ) {\n return true;\n }\n // Also check category for broader matches\n if (category.includes(identifier)) {\n return true;\n }\n }\n\n return false;\n });\n }, [connections, adapters]);\n\n // Merge available connections with already-selected connections\n const mergedConnections = useMemo(() => {\n const allConnections = [...availableConnections];\n\n // Add any selected connections that aren't already in the filtered list\n selectedConnections.forEach((selected) => {\n const existsInAvailable = availableConnections.some(\n (c) => c.id === selected.connectionId,\n );\n if (!existsInAvailable) {\n const fullConn = connections.find(\n (c) => c.id === selected.connectionId,\n );\n if (fullConn) {\n allConnections.push(fullConn);\n }\n }\n });\n\n return allConnections;\n }, [availableConnections, selectedConnections, connections]);\n\n // Group connections by provider\n const groupedConnections = useMemo(() => {\n const groups: Record<string, IntegrationConnection[]> = {};\n\n mergedConnections.forEach((conn) => {\n const providerName = conn.provider?.name || \"Other\";\n if (!groups[providerName]) {\n groups[providerName] = [];\n }\n groups[providerName].push(conn);\n });\n\n return groups;\n }, [mergedConnections]);\n\n // Handlers\n const handleSelect = useCallback(\n (connection: IntegrationConnection) => {\n const providerKey = connection.provider?.key || \"\";\n\n // Find matching adapter\n const adapter = adapters.find(\n (a) =>\n a.provider.toLowerCase() === providerKey.toLowerCase() ||\n a.name.toLowerCase() === providerKey.toLowerCase(),\n );\n\n const newSelection: SelectedConnection = {\n connectionId: connection.id,\n adapter: adapter?.name || providerKey,\n };\n\n if (multiple) {\n // Toggle selection\n const isSelected = selectedConnections.some(\n (c) => c.connectionId === connection.id,\n );\n if (isSelected) {\n onChange(\n selectedConnections.filter((c) => c.connectionId !== connection.id),\n );\n } else {\n onChange([...selectedConnections, newSelection]);\n }\n } else {\n onChange([newSelection]);\n setIsDropdownOpen(false);\n }\n },\n [adapters, selectedConnections, onChange, multiple],\n );\n\n const handleRemove = useCallback(\n (connectionId: string) => {\n onChange(\n selectedConnections.filter((c) => c.connectionId !== connectionId),\n );\n },\n [selectedConnections, onChange],\n );\n\n const handleNewConnection = useCallback((providerKey?: string) => {\n setDialogProviderKey(providerKey);\n setDialogOpen(true);\n setIsDropdownOpen(false);\n }, []);\n\n const handleConnectionCreated = useCallback(\n (conn: {\n id: string;\n name: string;\n provider: { key?: string };\n status: string;\n }) => {\n // Auto-select the newly created connection\n const providerKey = conn.provider?.key || \"\";\n const adapter = adapters.find(\n (a) =>\n a.provider.toLowerCase() === providerKey.toLowerCase() ||\n a.name.toLowerCase() === providerKey.toLowerCase(),\n );\n if (adapter) {\n const newSelection = { connectionId: conn.id, adapter: adapter.name };\n if (multiple) {\n onChange([...selectedConnections, newSelection]);\n } else {\n onChange([newSelection]);\n }\n }\n setDialogOpen(false);\n // Refetch to include the new connection in the dropdown\n refetch();\n },\n [adapters, selectedConnections, onChange, multiple, refetch],\n );\n\n // Get connection data for display\n const getConnectionData = useCallback(\n (connectionId: string) => connections.find((c) => c.id === connectionId),\n [connections],\n );\n\n // No adapters = no connection requirements\n if (!adapters || adapters.length === 0) {\n return null;\n }\n\n return (\n <div className={compact ? \"space-y-2\" : \"space-y-3\"}>\n {/* Selected Connections */}\n {selectedConnections.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {selectedConnections.map((conn) => {\n const connData = getConnectionData(conn.connectionId);\n\n return (\n <ConnectionChip\n key={conn.connectionId}\n connection={conn}\n connectionData={connData}\n onRemove={() => handleRemove(conn.connectionId)}\n />\n );\n })}\n </div>\n )}\n\n {/* Dropdown Selector */}\n <div className=\"flex items-center gap-2\">\n <DropdownMenu open={isDropdownOpen} onOpenChange={setIsDropdownOpen}>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size={compact ? \"sm\" : \"default\"}\n className=\"justify-between min-w-[200px]\"\n >\n <span className=\"flex items-center gap-2\">\n <Icon\n icon=\"mdi:link-variant\"\n className=\"w-4 h-4 text-muted-foreground\"\n />\n {selectedConnections.length === 0\n ? \"Select connection\"\n : multiple\n ? `${selectedConnections.length} selected`\n : \"Change connection\"}\n </span>\n <Icon\n icon=\"mdi:chevron-down\"\n className=\"w-4 h-4 text-muted-foreground\"\n />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent\n align=\"start\"\n className=\"w-[280px] max-h-[400px] overflow-y-auto\"\n >\n {connectionsLoading ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n <Icon\n icon=\"mdi:loading\"\n className=\"w-6 h-6 mx-auto mb-2 animate-spin\"\n />\n <p>Loading connections...</p>\n </div>\n ) : Object.keys(groupedConnections).length === 0 ? (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n <Icon\n icon=\"mdi:link-off\"\n className=\"w-8 h-8 mx-auto mb-2 opacity-50\"\n />\n <p>No matching connections</p>\n <p className=\"text-xs mt-1\">Create one in Integrations</p>\n </div>\n ) : (\n Object.entries(groupedConnections).map(\n ([providerName, conns]) => (\n <div key={providerName}>\n <DropdownMenuLabel className=\"flex items-center gap-2 text-xs font-semibold text-muted-foreground uppercase tracking-wide\">\n <Icon\n icon={\n conns[0]?.provider?.icon ||\n getProviderIcon(conns[0]?.provider?.key || \"\")\n }\n className=\"w-4 h-4\"\n />\n {providerName}\n </DropdownMenuLabel>\n {conns.map((conn) => {\n const isSelected = selectedConnections.some(\n (c) => c.connectionId === conn.id,\n );\n const isActive = conn.status === \"ACTIVE\";\n\n return (\n <DropdownMenuItem\n key={conn.id}\n onClick={() => handleSelect(conn)}\n className={`flex items-center justify-between cursor-pointer ${\n isSelected ? \"bg-primary/10\" : \"\"\n } ${!isActive ? \"opacity-60\" : \"\"}`}\n >\n <div className=\"flex flex-col min-w-0\">\n <span className=\"font-medium truncate flex items-center gap-1.5\">\n {conn.name}\n {showStatus && (\n <span title={conn.status}>\n <Icon\n icon={getStatusIcon(conn.status)}\n className={`w-3.5 h-3.5 ${getStatusColor(conn.status)}`}\n />\n </span>\n )}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {conn.externalAccountEmail ||\n (conn.updatedAt &&\n `Updated ${formatAge(conn.updatedAt)}`)}\n </span>\n </div>\n {isSelected && (\n <Icon\n icon=\"mdi:check\"\n className=\"w-4 h-4 text-primary flex-shrink-0\"\n />\n )}\n </DropdownMenuItem>\n );\n })}\n <DropdownMenuSeparator />\n </div>\n ),\n )\n )}\n\n {/* New Connection Button */}\n <DropdownMenuItem\n onClick={() => {\n // If there's only one adapter, pre-select the provider\n const singleProvider =\n adapters.length === 1 ? adapters[0].provider : undefined;\n handleNewConnection(singleProvider);\n }}\n className=\"text-primary cursor-pointer\"\n >\n <Icon icon=\"mdi:plus\" className=\"w-4 h-4 mr-2\" />\n New connection\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Quick New Button */}\n {selectedConnections.length === 0 && !compact && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n const singleProvider =\n adapters.length === 1 ? adapters[0].provider : undefined;\n handleNewConnection(singleProvider);\n }}\n className=\"text-primary hover:text-primary/80\"\n >\n <Icon icon=\"mdi:plus\" className=\"w-4 h-4 mr-1\" />\n New\n </Button>\n )}\n </div>\n\n {/* Status indicator */}\n {showStatus &&\n selectedConnections.length === 0 &&\n adapters.length > 0 && (\n <div className=\"flex items-center gap-1.5 text-xs text-[var(--color-status-warning-text)]\">\n <Icon icon=\"mdi:alert-circle\" className=\"w-3.5 h-3.5\" />\n <span>Connection required for this node</span>\n </div>\n )}\n\n {/* Connection Form Dialog (n8n-style popup) */}\n <ConnectionFormDialog\n open={dialogOpen}\n onClose={() => setDialogOpen(false)}\n providerKey={dialogProviderKey}\n showProviderPicker={!dialogProviderKey}\n onConnectionCreated={handleConnectionCreated}\n />\n </div>\n );\n}\n","/**\n * ConfigSchemaForm — Dynamic form renderer for provider configSchema.\n *\n * Renders form fields based on a JSON Schema definition stored in\n * the provider's configSchema field. Supports string, number, boolean,\n * and array types with secret masking.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport type {\n ConfigSchema,\n ConfigSchemaProperty,\n} from \"./provider-forms/types\";\n\ninterface ConfigSchemaFormProps {\n /** JSON Schema from provider.configSchema */\n schema: ConfigSchema;\n /** Current values */\n values: Record<string, unknown>;\n /** Callback when values change */\n onChange: (values: Record<string, unknown>) => void;\n /** Whether the form is disabled */\n disabled?: boolean;\n}\n\n/**\n * Renders a dynamic form from a JSON Schema object.\n */\nexport function ConfigSchemaForm({\n schema,\n values,\n onChange,\n disabled,\n}: ConfigSchemaFormProps) {\n const handleFieldChange = useCallback(\n (fieldName: string, value: unknown) => {\n onChange({ ...values, [fieldName]: value });\n },\n [values, onChange],\n );\n\n if (!schema?.properties) return null;\n\n const properties = Object.entries(schema.properties);\n const requiredFields = new Set(schema.required ?? []);\n\n return (\n <div className=\"space-y-4\">\n {properties.map(([key, prop]) => (\n <ConfigSchemaField\n key={key}\n name={key}\n property={prop}\n value={values[key]}\n required={requiredFields.has(key)}\n disabled={disabled}\n onChange={(val) => handleFieldChange(key, val)}\n />\n ))}\n </div>\n );\n}\n\n// ============================================================================\n// Individual Field Renderer\n// ============================================================================\n\ninterface ConfigSchemaFieldProps {\n name: string;\n property: ConfigSchemaProperty;\n value: unknown;\n required: boolean;\n disabled?: boolean;\n onChange: (value: unknown) => void;\n}\n\nfunction ConfigSchemaField({\n name,\n property,\n value,\n required,\n disabled,\n onChange,\n}: ConfigSchemaFieldProps) {\n const [showSecret, setShowSecret] = useState(false);\n\n const label = property.title || name;\n const placeholder = property.description || `Enter ${label.toLowerCase()}`;\n\n switch (property.type) {\n case \"string\": {\n if (property.enum) {\n return (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {label}\n {required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </label>\n <select\n value={(value as string) ?? property.default ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n >\n <option value=\"\">Select {label.toLowerCase()}</option>\n {property.enum.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n {property.description && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {property.description}\n </p>\n )}\n </div>\n );\n }\n\n const inputType = property.secret && !showSecret ? \"password\" : \"text\";\n\n return (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {label}\n {required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </label>\n <div className=\"relative\">\n <input\n type={inputType}\n value={(value as string) ?? property.default ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n className={`w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50 ${\n property.secret ? \"font-mono pr-10\" : \"\"\n }`}\n />\n {property.secret && (\n <button\n type=\"button\"\n onClick={() => setShowSecret(!showSecret)}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n <Icon\n icon={showSecret ? \"mdi:eye-off\" : \"mdi:eye\"}\n className=\"w-4 h-4\"\n />\n </button>\n )}\n </div>\n {property.description && !property.secret && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {property.description}\n </p>\n )}\n </div>\n );\n }\n\n case \"number\":\n return (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {label}\n {required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </label>\n <input\n type=\"number\"\n value={(value as number) ?? property.default ?? \"\"}\n onChange={(e) => onChange(Number(e.target.value))}\n placeholder={placeholder}\n disabled={disabled}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n {property.description && (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {property.description}\n </p>\n )}\n </div>\n );\n\n case \"boolean\":\n return (\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={(value as boolean) ?? property.default ?? false}\n onClick={() => onChange(!(value as boolean))}\n disabled={disabled}\n className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${\n value ? \"bg-primary\" : \"bg-muted\"\n } disabled:opacity-50`}\n >\n <span\n className={`inline-block h-3.5 w-3.5 transform rounded-full bg-white transition-transform ${\n value ? \"translate-x-4.5\" : \"translate-x-0.5\"\n }`}\n />\n </button>\n <label className=\"text-sm font-medium text-foreground\">\n {label}\n {property.description && (\n <span className=\"text-muted-foreground font-normal ml-1\">\n — {property.description}\n </span>\n )}\n </label>\n </div>\n );\n\n case \"array\":\n return (\n <ArrayField\n label={label}\n required={required}\n description={property.description}\n value={(value as string[]) ?? []}\n onChange={onChange}\n disabled={disabled}\n />\n );\n\n default:\n return null;\n }\n}\n\n// ============================================================================\n// Array Field (tag-style input)\n// ============================================================================\n\ninterface ArrayFieldProps {\n label: string;\n required: boolean;\n description?: string;\n value: string[];\n onChange: (value: string[]) => void;\n disabled?: boolean;\n}\n\nfunction ArrayField({\n label,\n required,\n description,\n value,\n onChange,\n disabled,\n}: ArrayFieldProps) {\n const [inputValue, setInputValue] = useState(\"\");\n\n const handleAdd = useCallback(() => {\n const trimmed = inputValue.trim();\n if (trimmed && !value.includes(trimmed)) {\n onChange([...value, trimmed]);\n setInputValue(\"\");\n }\n }, [inputValue, value, onChange]);\n\n const handleRemove = useCallback(\n (index: number) => {\n onChange(value.filter((_, i) => i !== index));\n },\n [value, onChange],\n );\n\n return (\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n {label}\n {required && <span className=\"text-red-500 ml-0.5\">*</span>}\n </label>\n <div className=\"flex flex-wrap gap-1.5 mb-2\">\n {value.map((item, i) => (\n <span\n key={i}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-muted rounded text-xs\"\n >\n {item}\n {!disabled && (\n <button\n type=\"button\"\n onClick={() => handleRemove(i)}\n className=\"text-muted-foreground hover:text-destructive\"\n >\n <Icon icon=\"mdi:close\" className=\"w-3 h-3\" />\n </button>\n )}\n </span>\n ))}\n </div>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleAdd();\n }\n }}\n placeholder=\"Type and press Enter\"\n disabled={disabled}\n className=\"flex-1 px-3 py-2 border border-border rounded-md bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary disabled:opacity-50\"\n />\n <button\n type=\"button\"\n onClick={handleAdd}\n disabled={disabled || !inputValue.trim()}\n className=\"px-3 py-2 text-sm font-medium rounded-md bg-muted hover:bg-accent transition-colors disabled:opacity-50\"\n >\n Add\n </button>\n </div>\n {description && (\n <p className=\"mt-1 text-xs text-muted-foreground\">{description}</p>\n )}\n </div>\n );\n}\n","import AdaptiveCardRenderer from \"../../../../../../../../../modules/adaptive-cards/components\";\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 { NODE_CONFIGS } from \"../../../../index\";\n\ninterface AdaptiveCardOperation {\n name: string;\n adaptive_card: Record<string, unknown>;\n}\n\ninterface NodeDataOperations {\n operations?: AdaptiveCardOperation[];\n /** Connection adapters from node manifest (new format) */\n connectionAdapters?: Array<{ name: string; provider: string }>;\n /** @deprecated Use connectionAdapters instead */\n credentialAdapters?: Array<{ name: string; provider: string }>;\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\n // Get workflow_key from the store\n const workflow_key = useFlowStore((s) => s.workflow.id);\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 const currentOperation = operationsArray.find(\n (op: AdaptiveCardOperation) => op.name === data?.operation_name,\n ) as\n | (AdaptiveCardOperation & {\n connectionAdapters?: Array<{ name: string; provider: string }>;\n credentialAdapters?: Array<{ name: string; provider: string }>;\n })\n | undefined;\n\n // Use operation-specific adapters if available, otherwise use node-level\n // Prefer connectionAdapters (new) over credentialAdapters (legacy)\n const connectionAdapters =\n currentOperation?.connectionAdapters ||\n currentOperation?.credentialAdapters ||\n data?.nodeData?.connectionAdapters ||\n data?.nodeData?.credentialAdapters ||\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 // 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\n // Get adaptive card template for the current operation.\n // Stabilize the reference: updateData deep-clones the entire node data, which gives\n // adaptive_card a new object reference even though its content hasn't changed.\n // Without this, AdaptiveCardRenderer's useEffect (which depends on cardData) would\n // re-fire on every submit, rebuilding the card DOM and resetting user inputs.\n const adaptiveTemplateRaw = currentOperation?.adaptive_card as\n | Record<string, unknown>\n | undefined;\n const adaptiveTemplateJsonRef = useRef<string | undefined>(undefined);\n const adaptiveTemplateStableRef = useRef<Record<string, unknown> | undefined>(\n undefined,\n );\n\n const adaptiveTemplate = useMemo(() => {\n const json = adaptiveTemplateRaw\n ? JSON.stringify(adaptiveTemplateRaw)\n : undefined;\n if (json !== adaptiveTemplateJsonRef.current) {\n adaptiveTemplateJsonRef.current = json;\n adaptiveTemplateStableRef.current = adaptiveTemplateRaw;\n }\n return adaptiveTemplateStableRef.current;\n }, [adaptiveTemplateRaw]);\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 {connectionAdapters.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={connectionAdapters}\n selectedConnections={selectedConnections}\n onChange={handleConnectionsChange}\n compact\n />\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 {adaptiveTemplate ? (\n <AdaptiveCardRenderer\n cardData={\n adaptiveTemplate as unknown as import(\"../../../../../../../../../modules/adaptive-cards/components/types\").AdaptiveCardPayload\n }\n sampleData={sampleData}\n onSubmit={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 { Icon } from \"@iconify/react\";\n\ninterface HeaderWithIconProps {\n icon: string;\n title: string;\n}\n\nexport const HeaderWithIcon = ({ icon, title }: HeaderWithIconProps) => {\n return (\n <div className=\"flex items-center\">\n <Icon icon={icon} className={`size-4`} />\n <div className=\"ml-2.5 flex items-center text-xs font-medium leading-none tracking-wide uppercase opacity-80\">\n <span className=\"translate-y-px\">{title}</span>\n </div>\n </div>\n );\n};\n","import type React from \"react\";\n\nexport enum BuilderNode {\n TRIGGER = \"trigger:api\",\n // END node is OPTIONAL - workflows end naturally when nodes have no outgoing edges\n // Users can add END for visual clarity, but it's not required\n END = \"end\",\n // Legacy/external nodes\n TEXT_MESSAGE = \"text-message\",\n CONDITIONAL_PATH = \"conditional-path\",\n TAGS = \"tags\",\n MENU = \"menu\",\n INPUT = \"input\",\n AGENT = \"agent\",\n TOOL = \"tool\",\n RAGAGENT = \"agentic_rag\",\n TEST = \"TEST\",\n SLACK = \"SLACK\",\n // Internal control flow nodes\n MERGE = \"internal:merge\",\n IF = \"internal:if\",\n SWITCH = \"internal:switch\",\n LOOP = \"internal:loop\",\n SET = \"internal:set\",\n FILTER = \"internal:filter\",\n AGGREGATE = \"internal:aggregate\",\n WAIT = \"internal:wait\",\n NOOP = \"internal:noop\",\n SUBWORKFLOW = \"internal:subworkflow\",\n}\n\n/**\n * Adapter connection types for AI Agent nodes.\n * These define the typed ports that appear as diamond connectors below a node.\n * Sub-nodes declare which adapter type they satisfy via `adapterOutputType`.\n */\nexport enum AdapterConnectionType {\n AI_LANGUAGE_MODEL = \"ai_language_model\",\n AI_MEMORY = \"ai_memory\",\n AI_TOOL = \"ai_tool\",\n AI_OUTPUT_PARSER = \"ai_output_parser\",\n AI_EMBEDDINGS = \"ai_embeddings\",\n AI_DOCUMENT_LOADER = \"ai_document_loader\",\n AI_VECTOR_STORE = \"ai_vector_store\",\n AI_RETRIEVER = \"ai_retriever\",\n}\n\n/**\n * Filter configuration for adapter connections.\n * Controls which sub-nodes can connect to a given adapter port.\n */\nexport interface AdapterFilter {\n /** Sub-node must have ALL of these in its `kind[]` array to be compatible */\n kind?: string[];\n /** Explicitly excluded node types (by nodeType identifier) */\n excludeNodes?: string[];\n}\n\n/**\n * Node adapter definition - drives the diamond connector rendering below nodes.\n * Defined in manifest.json `nodeAdapters[]`. Fully dynamic - any number of adapters supported.\n */\nexport interface NodeAdapter {\n /** Display name shown below the diamond connector (e.g., \"Chat Model\", \"Memory\", \"Tool\") */\n name: string;\n /** Whether this adapter connection is required. Shows red asterisk if true. */\n required?: boolean;\n /** Typed connection type. When set, only sub-nodes with matching `adapterOutputType` can connect. */\n type?: AdapterConnectionType | string;\n /** Max number of sub-nodes that can connect. `null` or `undefined` = unlimited. `1` = single connection. */\n maxConnections?: number | null;\n /** Filter to restrict which sub-nodes can connect to this adapter port. */\n filter?: AdapterFilter;\n}\n\nexport const HeaderGradientColors = {\n purple: \"from-purple-700\",\n red: \"from-red-700\",\n blue: \"from-blue-700\",\n green: \"from-green-700\",\n yellow: \"from-yellow-700\",\n pink: \"from-pink-700\",\n orange: \"from-orange-700\",\n teal: \"from-teal-700\",\n lime: \"from-lime-700\",\n indigo: \"from-indigo-700\",\n fuchsia: \"from-fuchsia-700\",\n emerald: \"from-emerald-700\",\n cyan: \"from-cyan-700\",\n rose: \"from-rose-700\",\n sky: \"from-sky-700\",\n gray: \"from-gray-200\",\n slate: \"from-slate-700\",\n};\n\nexport type BuilderNodeType = `${BuilderNode}`;\n\n// Extended type that includes dynamic node types (strings from GraphQL)\nexport type ExtendedNodeType = BuilderNodeType | string;\n\nexport interface NodeManifest {\n name: string;\n version?: string;\n description?: string;\n config?: Record<string, unknown>;\n kind?: string[];\n nodeType?: string;\n /** Node adapter ports - rendered as diamond connectors below the node (e.g., Chat Model, Memory, Tool) */\n nodeAdapters?: NodeAdapter[];\n /**\n * When true, this node can be connected to adapter ports on other nodes (dual-purpose node).\n * The node works both as a standalone workflow node AND as an adapter sub-node.\n */\n supportsAdapterMode?: boolean;\n /**\n * The adapter type this node satisfies when used as a sub-node.\n * Must match the `type` field of the parent node's adapter port.\n * e.g., \"ai_language_model\" for an OpenAI Chat Model node.\n */\n adapterOutputType?: AdapterConnectionType | string;\n}\n\n// Bivariant component type to allow memo-wrapped React Flow nodes\n// Method signature enables bivariance for better type compatibility\ninterface BivariantComponent<T> {\n bivarianceHack(props: { data: T; [key: string]: unknown }): React.ReactNode;\n}\ntype FlowNodeComponent<T> = BivariantComponent<T>[\"bivarianceHack\"];\n\nexport interface RegisterNodeMetadata<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n type: ExtendedNodeType;\n node: FlowNodeComponent<T>;\n detail: {\n icon: string;\n title: string;\n description?: string;\n gradientColor?: keyof typeof HeaderGradientColors;\n };\n connection: {\n inputs: number;\n outputs: number;\n };\n available?: boolean;\n defaultData?: T;\n propertyPanel?: React.ComponentType<PropertyPanelProps<T>>;\n manifest?: NodeManifest;\n}\n\nexport interface PropertyPanelProps<T = Record<string, unknown>> {\n id: string;\n type: ExtendedNodeType;\n data: T;\n updateData: (data: Partial<T>) => void;\n}\n\nexport interface BaseNodeData extends Record<string, unknown> {\n deletable?: boolean;\n}\n\n// Internal Node Data Interfaces\nexport interface MergeNodeData extends BaseNodeData {\n mode?: \"APPEND\" | \"COMBINE\" | \"MULTIPLEX\" | \"KEEP_SEPARATE\" | \"CHOOSE_BRANCH\";\n timeout?: number;\n continueOnTimeout?: boolean;\n}\n\nexport interface IfNodeData extends BaseNodeData {\n condition?: string;\n trueHandle?: string;\n falseHandle?: string;\n}\n\nexport interface SwitchNodeData extends BaseNodeData {\n switchValue?: string;\n cases?: Record<string, string>;\n defaultHandle?: string;\n}\n\nexport interface LoopNodeData extends BaseNodeData {\n sourceArray?: string;\n batchSize?: number;\n maxIterations?: number;\n continueOnError?: boolean;\n loopHandle?: string;\n doneHandle?: string;\n}\n\nexport interface SetNodeData extends BaseNodeData {\n values?: string;\n keepExisting?: boolean;\n}\n\nexport interface FilterNodeData extends BaseNodeData {\n condition?: string;\n}\n\nexport interface AggregateNodeData extends BaseNodeData {\n aggregationType?:\n | \"sum\"\n | \"count\"\n | \"avg\"\n | \"min\"\n | \"max\"\n | \"first\"\n | \"last\"\n | \"concat\";\n field?: string;\n groupBy?: string;\n}\n\nexport interface WaitNodeData extends BaseNodeData {\n duration?: number;\n resumeAt?: string;\n}\n\nexport interface NoOpNodeData extends BaseNodeData {\n label?: string;\n}\n\nexport interface SubworkflowNodeData extends BaseNodeData {\n workflowKey?: string;\n workflowName?: string;\n version?: number;\n inputMapping?: string;\n outputMapping?: string;\n waitForCompletion?: boolean;\n timeout?: number;\n failOnError?: boolean;\n}\n\n/** Typed shape for integration/channel node data */\nexport interface ChannelNodeData extends BaseNodeData {\n operation_name?: string;\n /** Legacy top-level role field */\n role?: \"trigger\" | \"action\";\n args?: {\n state?: {\n role?: \"trigger\" | \"action\";\n channelId?: string;\n platform?: string;\n channelName?: string;\n integrationId?: string;\n messageText?: string;\n [key: string]: unknown;\n };\n connections?: Array<{ connectionId: string; adapter: string }>;\n credentials?: Array<{ id: string; adapter: string }>;\n [key: string]: unknown;\n };\n nodeData?: {\n kind?: string[];\n [key: string]: unknown;\n };\n}\n","import { Button } from \"@burdenoff/fe-libs/ui\";\nimport {\n Dialog,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from \"@burdenoff/fe-libs/ui\";\nimport { InfoCircledIcon } from \"@radix-ui/react-icons\";\n\ninterface NodeMetadataProps {\n name?: string;\n version?: string;\n description?: string;\n className?: string;\n icon?: string;\n title?: string;\n handleDeleteNode?: () => void;\n handleShowNodeProperties?: () => void;\n gradientColor?: string;\n [key: string]: unknown;\n}\n\nconst nodeDetails = {\n node_type: \"gmail_reader\",\n version: \"1.0.0\",\n kind: [\"communication\", \"email\", \"gmail\"],\n name: \"Gmail Operator\",\n description: \"A node that executes Gmail operations to automate email tasks\",\n author: \"FluidGrids Team\",\n author_email: \"support@fluidgrids.ai\",\n website: \"https://fluidgrids.ai/\",\n copyright: \"Copyright 2025 Algoshred Technologies Private Limited\",\n license: \"MIT\",\n repository: {\n type: \"git\",\n url: \"https://github.com/algoshred/fluidgrids\",\n },\n maintainers: [\n {\n name: \"FluidGrids Team\",\n email: \"support@fluidgrids.ai\",\n },\n ],\n support: {\n email: \"support@fluidgrids.ai\",\n url: \"https://fluidgrids.ai/support\",\n docs: \"https://docs.fluidgrids.ai/nodes/gmail_reader\",\n },\n legal: {\n privacy_policy_url: \"https://fluidgrids.ai/privacy-policy\",\n terms_url: \"https://fluidgrids.ai/terms\",\n },\n metadata: {\n favicon: \"/assets/logo-color.png\", // fallback to public asset\n logo: \"/assets/logo-color.png\", // fallback to public asset\n keywords: [\"workflow\", \"node\", \"gmail\", \"email\", \"communication\"],\n category: \"communication\",\n },\n};\n\nexport function NodeInfoButtonWithModal({\n metadata,\n}: {\n metadata: NodeMetadataProps;\n}) {\n return (\n <Dialog>\n <DialogTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Show sponsored info\"\n className=\"w-6 h-6 p-0 flex items-center justify-center border-default bg-surface/60 hover:bg-[var(--color-status-info-bg-subtle)] hover:border-[var(--color-status-info-border)] transition-colors\"\n >\n <InfoCircledIcon className=\"w-4 h-4 text-[var(--color-status-info-text)]\" />\n </Button>\n </DialogTrigger>\n <DialogContent className=\"max-w-xl\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <img\n src={nodeDetails.metadata.logo}\n alt=\"logo\"\n className=\"w-8 h-8 rounded bg-white border border-gray-200\"\n />\n {nodeDetails.name}\n </DialogTitle>\n <DialogDescription>{nodeDetails.description}</DialogDescription>\n </DialogHeader>\n <div className=\"flex items-center gap-2 mb-2\">\n <img\n src={nodeDetails.metadata.favicon}\n alt=\"favicon\"\n className=\"w-4 h-4 rounded\"\n />\n <span className=\"text-xs text-gray-500\">\n {nodeDetails.node_type} v{nodeDetails.version}\n </span>\n </div>\n <div className=\"space-y-1 text-sm\">\n <div>\n <b>Kind:</b> {nodeDetails.kind.join(\", \")}\n </div>\n <div>\n <b>Author:</b> {nodeDetails.author} (\n <a\n href={`mailto:${nodeDetails.author_email}`}\n className=\"text-accent underline\"\n >\n {nodeDetails.author_email}\n </a>\n )\n </div>\n <div>\n <b>Website:</b>{\" \"}\n <a\n href={nodeDetails.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent underline\"\n >\n {nodeDetails.website}\n </a>\n </div>\n <div>\n <b>Repository:</b>{\" \"}\n <a\n href={nodeDetails.repository.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent underline\"\n >\n {nodeDetails.repository.url}\n </a>\n </div>\n <div>\n <b>Support:</b>{\" \"}\n <a\n href={`mailto:${nodeDetails.support.email}`}\n className=\"text-accent underline\"\n >\n {nodeDetails.support.email}\n </a>{\" \"}\n |{\" \"}\n <a\n href={nodeDetails.support.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent underline\"\n >\n Support Page\n </a>{\" \"}\n |{\" \"}\n <a\n href={nodeDetails.support.docs}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent underline\"\n >\n Docs\n </a>\n </div>\n <div>\n <b>Legal:</b>{\" \"}\n <a\n href={nodeDetails.legal.privacy_policy_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent underline\"\n >\n Privacy Policy\n </a>{\" \"}\n |{\" \"}\n <a\n href={nodeDetails.legal.terms_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-accent underline\"\n >\n Terms\n </a>\n </div>\n <div>\n <b>License:</b> {nodeDetails.license}\n </div>\n <div>\n <b>Copyright:</b> {nodeDetails.copyright}\n </div>\n <div>\n <b>Keywords:</b> {nodeDetails.metadata.keywords.join(\", \")}\n </div>\n <div>\n <b>Category:</b> {nodeDetails.metadata.category}\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport { HeaderWithIcon } from \"./header-with-icon\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { HeaderGradientColors } from \"../blocks/types\";\nimport { NodeInfoButtonWithModal } from \"./NodeInfoButtonWithModal\";\n\n// Execution status type\ntype ExecutionStatus = \"idle\" | \"running\" | \"success\" | \"error\";\n\ninterface NodeCardProps extends React.HTMLAttributes<HTMLDivElement> {\n executionStatus?: ExecutionStatus;\n itemCount?: number;\n}\n\nconst NodeCard = React.forwardRef<HTMLDivElement, NodeCardProps>(\n (\n { className, executionStatus = \"idle\", itemCount, children, ...props },\n ref,\n ) => {\n // Determine border and animation classes based on execution status\n const statusClasses = {\n idle: \"\",\n running:\n \"ring-2 ring-[var(--color-status-success-border)] animate-pulse-border\",\n success: \"ring-2 ring-[var(--color-status-success-border)]\",\n error: \"ring-2 ring-[var(--color-status-error-border)]\",\n };\n\n return (\n <div className=\"relative\">\n {/* Item count badge - shown on edges after execution */}\n {itemCount !== undefined && itemCount > 0 && (\n <div className=\"absolute -top-6 left-1/2 -translate-x-1/2 z-10\">\n <div className=\"bg-card border border-card-foreground/20 px-2 py-0.5 rounded text-[10px] text-card-foreground/70 whitespace-nowrap shadow-sm\">\n {itemCount} item{itemCount !== 1 ? \"s\" : \"\"}\n </div>\n </div>\n )}\n\n <div\n ref={ref}\n className={cn(\n \"w-72 border border-card-foreground/10 rounded-sm bg-card/50 shadow-sm backdrop-blur-xl transition-all duration-200 divide-y divide-card-foreground/10 data-[selected=true]:border-border-primary hover:border-border-primary\",\n statusClasses[executionStatus],\n executionStatus === \"success\" && \"animate-success-glow\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n\n {/* Status icon overlay - bottom right corner */}\n {executionStatus === \"success\" && (\n <div className=\"absolute -bottom-1.5 -right-1.5 z-10\">\n <div className=\"bg-[var(--color-status-success-bg)] rounded-full p-0.5 shadow-md animate-in zoom-in duration-200\">\n <Icon\n icon=\"mdi:check\"\n className=\"size-3 text-[var(--color-status-success-text-inverse)]\"\n />\n </div>\n </div>\n )}\n {executionStatus === \"error\" && (\n <div className=\"absolute -bottom-1.5 -right-1.5 z-10\">\n <div className=\"bg-[var(--color-status-error-bg)] rounded-full p-0.5 shadow-md animate-in zoom-in duration-200\">\n <Icon\n icon=\"mdi:close\"\n className=\"size-3 text-[var(--color-status-error-text-inverse)]\"\n />\n </div>\n </div>\n )}\n {executionStatus === \"running\" && (\n <div className=\"absolute -bottom-1.5 -right-1.5 z-10\">\n <div className=\"bg-[var(--color-status-success-bg)] rounded-full p-0.5 shadow-md\">\n <Icon\n icon=\"svg-spinners:ring-resize\"\n className=\"size-3 text-[var(--color-status-success-text-inverse)]\"\n />\n </div>\n </div>\n )}\n </div>\n );\n },\n);\nNodeCard.displayName = \"NodeCard\";\n\ninterface NodeCardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n icon: string;\n title: string;\n handleDeleteNode: () => void;\n handleShowNodeProperties: () => void;\n handleExecuteStep?: () => void;\n isExecuting?: boolean;\n executionStatus?: ExecutionStatus;\n gradientColor?: keyof typeof HeaderGradientColors;\n}\n\nconst NodeCardHeader = React.forwardRef<HTMLDivElement, NodeCardHeaderProps>(\n (\n {\n className,\n icon,\n title,\n handleDeleteNode,\n handleShowNodeProperties,\n handleExecuteStep,\n isExecuting,\n executionStatus,\n gradientColor,\n ...props\n },\n ref,\n ) => {\n const gradientColorClass =\n HeaderGradientColors[gradientColor as keyof typeof HeaderGradientColors];\n return (\n <div\n ref={ref}\n className={`relative overflow-clip rounded-sm bg-card/50 ${className}`}\n {...props}\n >\n <div className=\"absolute inset-0\">\n <div\n className={`absolute h-full w-3/5 ${\n gradientColor ? gradientColorClass : \"from-primary/40\"\n } to-transparent bg-gradient-to-r`}\n />\n </div>\n\n <div className=\"relative h-9 flex items-center justify-between gap-x-4 px-0.5 py-0.5\">\n <div className=\"flex grow items-center pl-1 gap-2\">\n <HeaderWithIcon icon={icon} title={title} />\n </div>\n\n <div className=\"flex shrink-0 items-center gap-x-0.5 pr-0.5\">\n <div className=\"mx-1 h-4 w-px bg-card-foreground/10\" />\n\n <Button\n type=\"button\"\n size={\"icon\"}\n variant={\"ghost\"}\n className=\"size-7\"\n onClick={handleShowNodeProperties}\n >\n <Icon icon={\"mynaui:cog-solid\"} className={\"size-4\"} />\n </Button>\n\n {handleExecuteStep && (\n <Button\n type=\"button\"\n size={\"icon\"}\n variant={\"ghost\"}\n className=\"size-7 transition-transform hover:scale-110\"\n onClick={(e) => {\n e.stopPropagation();\n handleExecuteStep();\n }}\n disabled={isExecuting}\n title=\"Execute step\"\n >\n {isExecuting ? (\n <Icon\n icon={\"svg-spinners:ring-resize\"}\n className={\"size-4 text-accent\"}\n />\n ) : executionStatus === \"success\" ? (\n <Icon\n icon={\"mdi:check-circle\"}\n className={\"size-4 text-[var(--color-status-success-text)]\"}\n />\n ) : executionStatus === \"error\" ? (\n <Icon\n icon={\"mdi:close-circle\"}\n className={\"size-4 text-[var(--color-status-error-text)]\"}\n />\n ) : (\n <Icon\n icon={\"mdi:play\"}\n className={\"size-4 text-[var(--color-status-warning-text)]\"}\n />\n )}\n </Button>\n )}\n\n <Button\n type=\"button\"\n variant={\"ghost\"}\n size={\"icon\"}\n className=\"size-7 transition-transform hover:scale-110\"\n onClick={handleDeleteNode}\n >\n <Icon\n icon={\"basil:trash-solid\"}\n className={\"size-4 text-[var(--color-status-error-text)]\"}\n />\n </Button>\n <NodeInfoButtonWithModal\n metadata={{\n className,\n icon,\n title,\n handleDeleteNode,\n handleShowNodeProperties,\n gradientColor,\n ...props,\n }}\n />\n </div>\n </div>\n </div>\n );\n },\n);\nNodeCardHeader.displayName = \"NodeCardHeader\";\n\ninterface NodeCardDescriptionProps extends React.HTMLAttributes<HTMLDivElement> {\n description: string;\n}\n\nconst NodeCardDescription = React.forwardRef<\n HTMLDivElement,\n NodeCardDescriptionProps\n>(({ className, description, ...props }, ref) => (\n <div ref={ref} className={cn(\"px-4 py-2\", className)} {...props}>\n <div className=\"text-xs text-card-foreground\">{description}</div>\n </div>\n));\nNodeCardDescription.displayName = \"NodeCardDescription\";\n\nconst NodeCardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col divide-y divide-card-foreground/10\",\n className,\n )}\n {...props}\n />\n));\nNodeCardContent.displayName = \"NodeCardContent\";\n\ninterface NodeCardFooterProps extends React.HTMLAttributes<HTMLDivElement> {\n nodeId: string | number;\n}\n\nconst NodeCardFooter = React.forwardRef<HTMLDivElement, NodeCardFooterProps>(\n ({ className, nodeId, ...props }, ref) => (\n <div\n ref={ref}\n className={`bg-card-foreground/10 overflow-clip rounded-sm px-4 py-2 text-[10px] text-card-foreground/50 ${className}`}\n {...props}\n >\n Node: <span className=\"font-semibold\">#{nodeId}</span>\n </div>\n ),\n);\nNodeCardFooter.displayName = \"NodeCardFooter\";\n\nexport {\n NodeCard,\n NodeCardHeader,\n NodeCardFooter,\n NodeCardDescription,\n NodeCardContent,\n};\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { nanoid } from \"nanoid/non-secure\";\nimport { getFluidGridsClient } from \"../graphql/client\";\nimport {\n TriggerWorkflowDocument,\n WorkflowRunDocument,\n} from \"../generated/operations\";\nimport type { WorkflowRunQuery } from \"../generated/operations\";\nimport { useFlowStore } from \"../builder/stores/flow-store\";\nimport type { ExecutionLog } from \"../types/execution\";\nimport type { ChannelNodeData } from \"../builder/components/flow-builder/components/blocks/types\";\n\n// Alias for backward compatibility\nconst TRIGGER_WORKFLOW = TriggerWorkflowDocument;\nconst WORKFLOW_RUN = WorkflowRunDocument;\n\n/** Terminal run statuses that stop polling */\nconst TERMINAL_STATUSES = new Set([\n \"COMPLETED\",\n \"FAILED\",\n \"CANCELLED\",\n \"TERMINATED\",\n]);\n\n/** Polling interval in ms */\nconst POLL_INTERVAL = 1500;\n\n/**\n * How long to wait for the run record to appear in the DB after triggering.\n * Only used in the `if (!run)` path — active runs poll indefinitely until\n * the backend signals a terminal status (COMPLETED/FAILED/CANCELLED).\n */\nconst MAX_RUN_CREATION_WAIT = 60_000;\n\ninterface TriggerWorkflowResponse {\n triggerWorkflow: {\n runId: string;\n workflowKey: string;\n version: string;\n triggerNodeId: string;\n status: string;\n };\n}\n\n/**\n * Calculate item count from node output\n * Returns the number of items in the output (1 for single objects, array length for arrays)\n */\nfunction calculateItemCount(output: Record<string, unknown>): number {\n if (!output || Object.keys(output).length === 0) {\n return 0;\n }\n\n const values = Object.values(output);\n for (const value of values) {\n if (Array.isArray(value)) {\n return value.length;\n }\n if (typeof value === \"object\" && value !== null) {\n const nestedValues = Object.values(value as Record<string, unknown>);\n for (const nestedValue of nestedValues) {\n if (Array.isArray(nestedValue)) {\n return nestedValue.length;\n }\n }\n }\n }\n\n return 1;\n}\n\n/**\n * Hook to execute a workflow up to a specific node (n8n-style execution)\n *\n * When clicking \"Execute step\" on any node, this triggers the workflow\n * from the trigger node up to and including the clicked node.\n *\n * Uses polling instead of WebSocket subscriptions because the subscription\n * fields are not yet in the supergraph schema.\n */\nexport function useNodeExecution() {\n const pollTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pollStartRef = useRef<number>(0);\n /** Tracks the run ID of the active poll cycle; cleared by cleanup() */\n const activeRunIdRef = useRef<string | null>(null);\n\n const workflow = useFlowStore((s) => s.workflow);\n const startExecution = useFlowStore(\n (s) => s.actions.execution.startExecution,\n );\n const addLog = useFlowStore((s) => s.actions.execution.addLog);\n const updateLog = useFlowStore((s) => s.actions.execution.updateLog);\n const setNodeStatus = useFlowStore((s) => s.actions.execution.setNodeStatus);\n const setNodeItemCount = useFlowStore(\n (s) => s.actions.execution.setNodeItemCount,\n );\n const completeExecution = useFlowStore(\n (s) => s.actions.execution.completeExecution,\n );\n const clearLogs = useFlowStore((s) => s.actions.execution.clearLogs);\n\n /**\n * Stop any active polling\n */\n const cleanup = useCallback(() => {\n if (pollTimerRef.current) {\n clearTimeout(pollTimerRef.current);\n pollTimerRef.current = null;\n }\n activeRunIdRef.current = null;\n }, []);\n\n /**\n * Check if a node type represents a trigger node.\n */\n const isTriggerNodeType = useCallback(\n (type: string | undefined, data?: ChannelNodeData): boolean => {\n if (!type) return false;\n if (\n type === \"trigger\" ||\n type === \"trigger:api\" ||\n type.startsWith(\"trigger:\") ||\n type.startsWith(\"internal:schedule\") ||\n type.startsWith(\"internal:webhook\") ||\n type.startsWith(\"internal:api\") ||\n type.startsWith(\"internal:form\") ||\n type.startsWith(\"internal:mcp\") ||\n type.endsWith(\"_trigger\") ||\n type.endsWith(\"Trigger\") ||\n type.endsWith(\"-trigger\")\n ) {\n return true;\n }\n // integration/channel is role-based: only a trigger when configured as receive\n if (type === \"integration/channel\") {\n const channelData = data as ChannelNodeData;\n // args.state.role is set by the property panel (current config) — prefer it.\n // Fall back to legacy top-level data.role for older persisted nodes.\n const role = channelData.args?.state?.role ?? channelData.role;\n const opName = channelData.operation_name;\n // Explicit action role → not a trigger\n if (role === \"action\") return false;\n // Explicit trigger role, or operation name starts with \"on\" (e.g. onChannelMessageReceived)\n if (\n role === \"trigger\" ||\n (typeof opName === \"string\" && opName.startsWith(\"on\"))\n )\n return true;\n // No explicit config yet — fall through to kind-based check\n }\n const kind = (data as ChannelNodeData).nodeData?.kind;\n if (kind && kind.some((k) => k.includes(\"trigger\"))) {\n return true;\n }\n return false;\n },\n [],\n );\n\n /**\n * Find the trigger node in the workflow\n */\n const findTriggerNode = useCallback(() => {\n const { nodes, edges } = workflow;\n\n const explicitTrigger = nodes.find((node) =>\n isTriggerNodeType(node.type, node.data as ChannelNodeData),\n );\n if (explicitTrigger) {\n return explicitTrigger;\n }\n\n const nodesWithIncomingEdges = new Set(edges.map((e) => e.target));\n const firstNode = nodes.find(\n (node) => !nodesWithIncomingEdges.has(node.id),\n );\n\n if (firstNode) {\n return firstNode;\n }\n\n if (nodes.length > 0) {\n return nodes[0];\n }\n\n console.error(\"[useNodeExecution] No nodes found in workflow\");\n return null;\n }, [workflow, isTriggerNodeType]);\n\n /**\n * Get node name from the workflow nodes\n */\n const getNodeName = useCallback(\n (nodeId: string) => {\n const node = workflow.nodes.find((n) => n.id === nodeId);\n if (!node) return `Node ${nodeId}`;\n const data = node.data as { operation_name?: string; name?: string };\n return (\n data?.operation_name || data?.name || node.type || `Node ${nodeId}`\n );\n },\n [workflow.nodes],\n );\n\n /**\n * Process node states from a polled WorkflowRun response.\n * Creates new logs or updates existing ones, and sets visual node status.\n */\n const processNodeStates = useCallback(\n (\n runId: string,\n nodeStates: NonNullable<WorkflowRunQuery[\"workflowRun\"]>[\"nodeStates\"],\n ) => {\n for (const nodeState of nodeStates) {\n const logId = `${runId}-${nodeState.nodeId}`;\n const rawStatus = nodeState.status.toLowerCase();\n // Map backend statuses to our 4-state model.\n // WAITING/DELAYED/WAITING_SUBWORKFLOW are paused-but-active states;\n // map them to \"running\" so the builder shows the node as in-progress.\n const status: \"pending\" | \"running\" | \"completed\" | \"failed\" =\n rawStatus === \"completed\"\n ? \"completed\"\n : rawStatus === \"failed\" || rawStatus === \"timeout\"\n ? \"failed\"\n : rawStatus === \"running\" ||\n rawStatus === \"waiting\" ||\n rawStatus === \"delayed\" ||\n rawStatus === \"waiting_subworkflow\"\n ? \"running\"\n : \"pending\";\n\n // Update visual node status indicators\n if (status === \"completed\") {\n setNodeStatus(nodeState.nodeId, \"success\");\n if (nodeState.output) {\n const itemCount = calculateItemCount(\n nodeState.output as Record<string, unknown>,\n );\n setNodeItemCount(nodeState.nodeId, itemCount);\n }\n } else if (status === \"failed\") {\n setNodeStatus(nodeState.nodeId, \"error\");\n } else if (status === \"running\") {\n setNodeStatus(nodeState.nodeId, \"running\");\n }\n\n // Create or update the log entry\n const existingLog = useFlowStore\n .getState()\n .execution.logs.find((l) => l.id === logId);\n\n if (!existingLog) {\n // Only add logs for nodes that have started (not PENDING)\n if (status === \"pending\") continue;\n const newLog: ExecutionLog = {\n id: logId,\n runId,\n nodeId: nodeState.nodeId,\n nodeType: nodeState.nodeType,\n nodeName: getNodeName(nodeState.nodeId),\n status,\n inputArgs: (nodeState.inputArgs as Record<string, unknown>) ?? null,\n output: (nodeState.output as Record<string, unknown>) ?? null,\n error: nodeState.error ?? null,\n duration: nodeState.duration ?? null,\n startTime: nodeState.startTime ?? new Date().toISOString(),\n endTime: nodeState.endTime ?? null,\n };\n addLog(newLog);\n } else {\n // Only update if something changed\n if (\n existingLog.status !== status ||\n (status === \"completed\" && !existingLog.output)\n ) {\n updateLog(logId, {\n status,\n inputArgs:\n (nodeState.inputArgs as Record<string, unknown>) ??\n existingLog.inputArgs,\n output:\n (nodeState.output as Record<string, unknown>) ??\n existingLog.output,\n error: nodeState.error ?? existingLog.error,\n duration: nodeState.duration ?? existingLog.duration,\n endTime: nodeState.endTime ?? existingLog.endTime,\n });\n }\n }\n }\n },\n [setNodeStatus, setNodeItemCount, addLog, updateLog, getNodeName],\n );\n\n /**\n * Poll the workflow run status and node states.\n * Replaces the broken WebSocket subscriptions with periodic GraphQL queries.\n */\n const pollRunUpdates = useCallback(\n (runId: string) => {\n const client = getFluidGridsClient();\n pollStartRef.current = Date.now();\n activeRunIdRef.current = runId;\n\n const doPoll = async () => {\n // Discard this response if a newer execution has started or we've been cleaned up\n if (activeRunIdRef.current !== runId) {\n return;\n }\n\n try {\n const result = await client.query<WorkflowRunQuery>({\n query: WORKFLOW_RUN,\n variables: { id: runId },\n fetchPolicy: \"network-only\",\n });\n\n // Check again after the async fetch in case cleanup ran while waiting\n if (activeRunIdRef.current !== runId) {\n return;\n }\n\n const run = result.data?.workflowRun;\n if (!run) {\n console.warn(\n \"[useNodeExecution] Poll returned no run data for\",\n runId,\n );\n // Run might not be created yet in DB — keep polling for up to MAX_RUN_CREATION_WAIT\n if (Date.now() - pollStartRef.current < MAX_RUN_CREATION_WAIT) {\n pollTimerRef.current = setTimeout(doPoll, POLL_INTERVAL);\n } else {\n console.warn(\n \"[useNodeExecution] Run data not found after timeout for\",\n runId,\n );\n // Run was never found — reset execution state so UI isn't permanently locked\n completeExecution();\n cleanup();\n }\n return;\n }\n\n // Process node states → create/update logs & visual statuses\n if (run.nodeStates?.length) {\n processNodeStates(runId, run.nodeStates);\n }\n\n // Check if run is in a terminal state\n if (TERMINAL_STATUSES.has(run.status)) {\n completeExecution();\n cleanup();\n return;\n }\n\n // Continue polling indefinitely until the backend signals completion.\n // Long-running workflows (waits, large ingestion, inference) can exceed\n // arbitrary timeouts — only the terminal status should stop polling.\n pollTimerRef.current = setTimeout(doPoll, POLL_INTERVAL);\n } catch (error) {\n console.error(\"[useNodeExecution] Poll error:\", error);\n if (activeRunIdRef.current !== runId) {\n return;\n }\n // Retry transient errors with back-off\n pollTimerRef.current = setTimeout(doPoll, POLL_INTERVAL * 2);\n }\n };\n\n // Start first poll after a short delay (give backend time to create the run)\n pollTimerRef.current = setTimeout(doPoll, 800);\n },\n [processNodeStates, completeExecution, cleanup],\n );\n\n /**\n * Execute workflow up to the specified node (step-by-step execution)\n */\n const executeNode = useCallback(\n async (stopAtNodeId: string) => {\n const triggerNode = findTriggerNode();\n if (!triggerNode) {\n console.error(\"[useNodeExecution] No trigger node found in workflow\");\n return { success: false, error: \"No trigger node found\" };\n }\n cleanup();\n clearLogs();\n\n const workflowKey = workflow.workflowKey || workflow.id;\n const version = workflow.version || \"1.0.0\";\n\n if (!workflowKey) {\n console.error(\n \"[useNodeExecution] Workflow must be saved before execution. No workflowKey found.\",\n );\n return {\n success: false,\n error: \"Workflow must be saved before execution\",\n };\n }\n\n setNodeStatus(stopAtNodeId, \"running\");\n\n try {\n const client = getFluidGridsClient();\n const result = await client.mutate<TriggerWorkflowResponse>({\n mutation: TRIGGER_WORKFLOW,\n variables: {\n input: {\n workflowKey,\n version,\n triggerNodeId: triggerNode.id,\n triggerData: {},\n context: {},\n stopAtNodeId,\n },\n },\n });\n const triggerResult = result.data?.triggerWorkflow;\n if (triggerResult) {\n const backendRunId = triggerResult.runId;\n startExecution(stopAtNodeId, backendRunId);\n\n // Create initial log entry\n const initialLog: ExecutionLog = {\n id: `${backendRunId}-${stopAtNodeId}`,\n runId: backendRunId,\n nodeId: stopAtNodeId,\n nodeType:\n workflow.nodes.find((n) => n.id === stopAtNodeId)?.type ||\n \"unknown\",\n nodeName: getNodeName(stopAtNodeId),\n status: \"running\",\n inputArgs: null,\n output: null,\n error: null,\n duration: null,\n startTime: new Date().toISOString(),\n endTime: null,\n };\n addLog(initialLog);\n\n // Start polling for real-time updates\n pollRunUpdates(backendRunId);\n return { success: true, runId: backendRunId };\n }\n\n console.error(\"[useNodeExecution] No result from trigger\");\n setNodeStatus(stopAtNodeId, \"error\");\n return { success: false, error: \"No result from trigger\" };\n } catch (error) {\n console.error(\"[useNodeExecution] Error triggering workflow:\", error);\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n\n const errorRunId = nanoid();\n const errorLog: ExecutionLog = {\n id: `${errorRunId}-${stopAtNodeId}`,\n runId: errorRunId,\n nodeId: stopAtNodeId,\n nodeType:\n workflow.nodes.find((n) => n.id === stopAtNodeId)?.type ||\n \"unknown\",\n nodeName: getNodeName(stopAtNodeId),\n status: \"failed\",\n inputArgs: null,\n output: null,\n error: errorMessage,\n duration: null,\n startTime: new Date().toISOString(),\n endTime: new Date().toISOString(),\n };\n addLog(errorLog);\n setNodeStatus(stopAtNodeId, \"error\");\n completeExecution();\n\n return { success: false, error: errorMessage };\n }\n },\n [\n findTriggerNode,\n cleanup,\n clearLogs,\n startExecution,\n workflow,\n getNodeName,\n addLog,\n setNodeStatus,\n pollRunUpdates,\n completeExecution,\n ],\n );\n\n /**\n * Execute the full workflow without stopping at any node\n * This runs the entire workflow from start to end\n */\n const executeFullWorkflow = useCallback(\n async (customTriggerData?: Record<string, unknown>) => {\n const triggerNode = findTriggerNode();\n if (!triggerNode) {\n console.error(\"[useNodeExecution] No trigger node found in workflow\");\n return { success: false, error: \"No trigger node found\" };\n }\n cleanup();\n clearLogs();\n\n const workflowKey = workflow.workflowKey || workflow.id;\n const version = workflow.version || \"1.0.0\";\n\n if (!workflowKey) {\n console.error(\n \"[useNodeExecution] Workflow must be saved before execution. No workflowKey found.\",\n );\n return {\n success: false,\n error: \"Workflow must be saved before execution\",\n };\n }\n\n setNodeStatus(triggerNode.id, \"running\");\n\n try {\n const client = getFluidGridsClient();\n const result = await client.mutate<TriggerWorkflowResponse>({\n mutation: TRIGGER_WORKFLOW,\n variables: {\n input: {\n workflowKey,\n version,\n triggerNodeId: triggerNode.id,\n triggerData: customTriggerData || {},\n context: {},\n },\n },\n });\n const triggerResult = result.data?.triggerWorkflow;\n if (triggerResult) {\n const backendRunId = triggerResult.runId;\n startExecution(triggerNode.id, backendRunId);\n\n // Start polling for real-time updates\n pollRunUpdates(backendRunId);\n return { success: true, runId: backendRunId };\n }\n\n console.error(\"[useNodeExecution] No result from trigger\");\n setNodeStatus(triggerNode.id, \"error\");\n return { success: false, error: \"No result from trigger\" };\n } catch (error) {\n console.error(\"[useNodeExecution] Error triggering workflow:\", error);\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n\n const errorRunId = nanoid();\n const errorLog: ExecutionLog = {\n id: `${errorRunId}-${triggerNode.id}`,\n runId: errorRunId,\n nodeId: triggerNode.id,\n nodeType: triggerNode.type || \"unknown\",\n nodeName: getNodeName(triggerNode.id),\n status: \"failed\",\n inputArgs: null,\n output: null,\n error: errorMessage,\n duration: null,\n startTime: new Date().toISOString(),\n endTime: new Date().toISOString(),\n };\n addLog(errorLog);\n setNodeStatus(triggerNode.id, \"error\");\n completeExecution();\n\n return { success: false, error: errorMessage };\n }\n },\n [\n findTriggerNode,\n cleanup,\n clearLogs,\n startExecution,\n workflow,\n getNodeName,\n addLog,\n setNodeStatus,\n pollRunUpdates,\n completeExecution,\n ],\n );\n\n // Clean up the polling timer and reset execution state when the component unmounts\n useEffect(() => {\n return () => {\n if (pollTimerRef.current) {\n completeExecution();\n }\n cleanup();\n };\n }, [cleanup, completeExecution]);\n\n return {\n executeNode,\n executeFullWorkflow,\n cleanup,\n findTriggerNode,\n };\n}\n","import {\n Handle,\n type Node,\n type NodeProps,\n Position,\n useReactFlow,\n useStore,\n getConnectedEdges,\n} from \"@xyflow/react\";\nimport { memo, useCallback, useEffect, useMemo } from \"react\";\nimport {\n BaseNodeData,\n ExtendedNodeType,\n type NodeAdapter,\n type AdapterFilter,\n type ChannelNodeData,\n} from \"../../types\";\n\nimport { getNodeDetail } from \"../../utils\";\nimport { useFlowStore } from \"../../../../../../stores/flow-store\";\nimport { useDeleteNode } from \"../../../../../../hooks/use-delete-node\";\nimport CustomHandle from \"../../../handles/custom-handler\";\nimport NodePropertyPanel from \"../../sidebar/panels/node-properties/property-panels/property-panel\";\nimport { useShallow } from \"zustand/shallow\";\nimport {\n NodeCard,\n NodeCardContent,\n NodeCardDescription,\n NodeCardFooter,\n NodeCardHeader,\n} from \"../../../ui/node-card\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@burdenoff/fe-libs/ui\";\nimport { useNodeExecution } from \"../../../../../../../hooks/useNodeExecution\";\nimport { NODE_CONFIGS } from \"../../index\";\n\ninterface AdaptiveCardDefaultValue {\n [key: string]: unknown;\n}\n\ninterface AdaptiveCard {\n defaultValue?: AdaptiveCardDefaultValue;\n}\n\nexport interface NodeOperation {\n name: string;\n type: string;\n adaptive_card?: AdaptiveCard;\n /** When true, this operation is auto-selected when the node is used as a sub-node adapter */\n isAdapterOperation?: boolean;\n}\n\ninterface NodeDataInfo {\n nodeAdapters?: NodeAdapter[];\n /** When true, this node can be connected to adapter ports on parent nodes */\n supportsAdapterMode?: boolean;\n /** The adapter type this node satisfies when used as a sub-node */\n adapterOutputType?: string;\n /** Kind tags for this node (used for adapter filtering) */\n kind?: string[];\n}\n\ninterface NodeDefaultData {\n version?: string;\n nodeData?: NodeDataInfo;\n args?: {\n state?: Record<string, unknown>;\n context?: Record<string, unknown>;\n };\n}\n\nexport interface NodeMetadataValue {\n type?: string;\n operations?: NodeOperation[];\n defaultData?: NodeDefaultData;\n}\n\nexport interface TextMessageNodeData extends BaseNodeData {\n operation: string;\n operation_name?: string;\n operation_type?: string;\n nodeData?: NodeDataInfo;\n /** Whether this node instance is being used as an adapter sub-node */\n isAdapterInstance?: boolean;\n args?: {\n state?: Record<string, unknown>;\n context?: Record<string, unknown>;\n };\n}\n\n/**\n * Check if a sub-node is compatible with an adapter port's filter.\n * Returns true if the sub-node can connect to the adapter.\n */\nfunction isAdapterCompatible(\n adapterFilter: AdapterFilter | undefined,\n adapterType: string | undefined,\n targetNodeKind: string[] | undefined,\n targetAdapterOutputType: string | undefined,\n targetNodeType: string | undefined,\n): boolean {\n // If adapter has a type, target must declare a matching adapterOutputType\n if (\n adapterType &&\n targetAdapterOutputType &&\n adapterType !== targetAdapterOutputType\n ) {\n return false;\n }\n\n // Check kind filter - target must have ALL required kind values\n if (adapterFilter?.kind && adapterFilter.kind.length > 0) {\n if (\n !targetNodeKind ||\n !adapterFilter.kind.every((k) => targetNodeKind.includes(k))\n ) {\n return false;\n }\n }\n\n // Check exclusion list\n if (adapterFilter?.excludeNodes && targetNodeType) {\n if (adapterFilter.excludeNodes.includes(targetNodeType)) {\n return false;\n }\n }\n\n return true;\n}\n\ntype TextMessageNodeProps = NodeProps<Node<TextMessageNodeData, string>>;\n\n/**\n * AdapterConnectors — renders the diamond-shaped adapter ports below a node.\n * Each adapter port supports typed connections, maxConnections enforcement,\n * and compatibility filtering via the adapter's `filter` config.\n */\nfunction AdapterConnectors({\n nodeId,\n adapters,\n}: {\n nodeId: string;\n adapters?: NodeAdapter[];\n}) {\n const { nodeLookup, edges } = useStore(({ nodeLookup, edges }) => ({\n nodeLookup,\n edges,\n }));\n const { getNode } = useReactFlow();\n\n if (!adapters || adapters.length === 0) return null;\n\n return (\n <div className=\"left-0 w-full flex justify-around mt-[6.5px]\">\n {adapters.map((adapter: NodeAdapter) => {\n // Count existing connections for this adapter handle\n const adapterEdges = edges.filter(\n (e) => e.source === nodeId && e.sourceHandle === adapter.name,\n );\n const connectionCount = adapterEdges.length;\n const isAtMaxConnections =\n adapter.maxConnections != null &&\n adapter.maxConnections !== undefined &&\n connectionCount >= adapter.maxConnections;\n\n // Determine visual state\n const hasConnection = connectionCount > 0;\n const diamondColor = hasConnection ? \"bg-accent\" : \"bg-accent/60\";\n const lineColor = hasConnection\n ? \"before:bg-accent\"\n : \"before:bg-accent/60\";\n\n return (\n <div className=\"relative\" key={adapter.name}>\n <div\n className={`p-0.5 m-0.5 text-center before:content-[''] before:h-[95%] before:-z-10 before:left-1/2 before:-translate-x-1/2 before:w-0.5 ${lineColor} before:absolute before:top-0`}\n >\n {/* Diamond at the top */}\n <div className=\"absolute -top-3 left-1/2 transform -translate-x-1/2\">\n <div\n className={`w-2.5 h-2.5 ${diamondColor} rotate-45 transition-transform hover:scale-110`}\n ></div>\n </div>\n\n {/* Title with asterisk for required + adapter type badge */}\n <div className=\"mt-3 z-10 absolute left-1/2 transform -translate-x-1/2 text-accent font-medium bg-surface h-fit\">\n <span className=\"text-xs max-w-fit relative font-medium text-accent whitespace-nowrap\">\n {adapter?.name}\n {adapter?.required && (\n <span className=\"text-[var(--color-status-error-text)] absolute -right-2 top-[1px]\">\n *\n </span>\n )}\n </span>\n </div>\n\n {/* Plus button and React Flow Handle */}\n <div className=\"mt-16 flex justify-center\">\n {!isAtMaxConnections && (\n <div className=\"w-5 h-5 border-2 border-accent/60 rounded text-accent text-2xl font-bold bg-surface flex items-center justify-center transition-colors hover:bg-accent/10 cursor-pointer\">\n +\n </div>\n )}\n {isAtMaxConnections && (\n <div className=\"w-5 h-5 border-2 border-accent/30 rounded text-accent/30 text-2xl font-bold bg-surface flex items-center justify-center\">\n &bull;\n </div>\n )}\n <Handle\n type=\"source\"\n position={Position.Bottom}\n id={adapter?.name}\n className=\"mb-[15px] text-accent bg-accent\"\n isConnectable={!isAtMaxConnections}\n isValidConnection={(connection) => {\n // Validate that the target node is compatible with this adapter\n if (!adapter.type && !adapter.filter) return true;\n const targetNode = getNode(connection.target);\n if (!targetNode) return true;\n const targetData = targetNode.data as TextMessageNodeData;\n const targetNodeData = targetData?.nodeData;\n return isAdapterCompatible(\n adapter.filter,\n adapter.type,\n targetNodeData?.kind,\n targetNodeData?.adapterOutputType,\n targetNode.type,\n );\n }}\n />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/**\n * SubNodeComponent — renders a compact circular node for sub-nodes\n * when they are used as adapter connections (e.g., \"OpenAI Chat Model\" connected to Agent).\n * Sub-nodes also support their own credential adapter diamonds.\n */\nfunction SubNodeComponent({\n id,\n isConnectable,\n selected,\n data,\n nodeType,\n}: TextMessageNodeProps & { nodeType?: string }) {\n const meta = useMemo(() => getNodeDetail(nodeType), [nodeType]);\n const deleteNode = useDeleteNode();\n const [showNodePropertiesOf] = useFlowStore(\n useShallow((s) => [s.actions.sidebar.showNodePropertiesOf]),\n );\n const [nodeStatuses] = useFlowStore(\n useShallow((s) => [s.execution.nodeStatuses]),\n );\n\n const nodeStatus = nodeStatuses[id] || \"idle\";\n const statusRing =\n nodeStatus === \"success\"\n ? \"ring-2 ring-green-500\"\n : nodeStatus === \"error\"\n ? \"ring-2 ring-red-500\"\n : nodeStatus === \"running\"\n ? \"ring-2 ring-blue-500 animate-pulse\"\n : \"\";\n\n const handleShowNodeProperties = useCallback(() => {\n showNodePropertiesOf({ id, type: nodeType as ExtendedNodeType });\n }, [id, nodeType, showNodePropertiesOf]);\n\n return (\n <div className=\"flex flex-col items-center\">\n {/* Target handle at top - connects up to parent adapter diamond */}\n <Handle\n type=\"target\"\n position={Position.Top}\n id=\"target\"\n isConnectable={isConnectable}\n className=\"size-2.5 bg-accent border-2 border-accent/60\"\n />\n\n {/* Dashed line from handle to circle */}\n <div className=\"w-0.5 h-4 border-l-2 border-dashed border-accent/40\"></div>\n\n {/* Label above the circle */}\n <span className=\"text-[10px] text-accent/70 font-medium mb-1\">\n {meta.title.includes(\"Model\")\n ? \"Model\"\n : meta.title.includes(\"Memory\")\n ? \"Memory\"\n : meta.title.includes(\"Tool\")\n ? \"Tool\"\n : meta.title.includes(\"Parser\")\n ? \"Parser\"\n : \"Adapter\"}\n </span>\n\n {/* Circular node body */}\n <div\n className={`w-14 h-14 rounded-full bg-card border-2 border-accent/40 flex items-center justify-center shadow-lg cursor-pointer transition-all hover:border-accent/80 hover:shadow-xl ${statusRing}`}\n onDoubleClick={handleShowNodeProperties}\n data-selected={selected}\n >\n <img\n src={`https://api.iconify.design/${meta.icon.replace(\":\", \"/\")}.svg`}\n alt={meta.title}\n className=\"w-7 h-7 opacity-80\"\n />\n </div>\n\n {/* Title below */}\n <span className=\"mt-1.5 text-xs text-accent font-medium text-center max-w-24 leading-tight\">\n {meta.title}\n </span>\n\n {/* Delete button */}\n <button\n onClick={() => deleteNode(id)}\n className=\"absolute -top-1 -right-1 w-4 h-4 rounded-full bg-destructive/80 text-destructive-foreground text-[10px] flex items-center justify-center opacity-0 group-hover:opacity-100 hover:bg-destructive transition-opacity\"\n >\n &times;\n </button>\n\n {/* Sub-node's own credential adapter diamonds (if any) */}\n <AdapterConnectors nodeId={id} adapters={data?.nodeData?.nodeAdapters} />\n </div>\n );\n}\n\n// export const metadata: RegisterNodeMetadata<TextMessageNodeData> = {\n// type: NODE_TYPE,\n// node: memo(NodeComponent),\n// detail: {\n// icon: \"mynaui:message-solid\",\n// title: \"Gmail\",\n// description:\n// \"Send a text message to the user using different messaging platforms like WhatsApp, Messenger, etc.\",\n// },\n// connection: {\n// inputs: 1,\n// outputs: 1,\n// },\n// defaultData: {\n// message: \"\",\n// },\n// propertyPanel: TextMessageNodePropertyPanel,\n// };\n\nexport const getNodeMetadata = (value: NodeMetadataValue) => {\n function NodeComponent(props: TextMessageNodeProps) {\n const { id, isConnectable, selected, data } = props;\n\n // Detect if this node is an adapter sub-node by checking incoming edges.\n // A node is an adapter sub-node if:\n // - It has `data.isAdapterInstance` set explicitly, OR\n // - An incoming edge's sourceHandle matches an adapter name on the source node\n const { edges, nodeLookup } = useStore(({ edges, nodeLookup }) => ({\n edges,\n nodeLookup,\n }));\n\n const isAdapterSubNode = useMemo(() => {\n if (data?.isAdapterInstance) return true;\n\n // Check if any incoming edge is an adapter edge\n const incomingEdges = edges.filter((e) => e.target === id);\n for (const edge of incomingEdges) {\n if (!edge.sourceHandle || edge.sourceHandle === \"source\") continue;\n // Look up the source node's adapter names from NODE_CONFIGS\n const sourceNode = nodeLookup.get(edge.source);\n if (!sourceNode) continue;\n const sourceNodeData = sourceNode.data as\n | TextMessageNodeData\n | undefined;\n const sourceAdapters = sourceNodeData?.nodeData?.nodeAdapters;\n if (sourceAdapters && Array.isArray(sourceAdapters)) {\n const adapterNames = sourceAdapters.map((a: NodeAdapter) => a.name);\n if (adapterNames.includes(edge.sourceHandle)) {\n return true;\n }\n }\n }\n return false;\n }, [data?.isAdapterInstance, edges, id, nodeLookup]);\n\n // All hooks must be called before any conditional returns\n const nodeType = value?.type;\n const meta = useMemo(() => getNodeDetail(nodeType), [nodeType]);\n const { updateNode, getNode, setNodes } = useReactFlow();\n const [\n showNodePropertiesOf,\n isExecuting,\n executingNodeId,\n nodeStatuses,\n nodeItemCounts,\n zustandSetNodes,\n ] = useFlowStore(\n useShallow((s) => [\n s.actions.sidebar.showNodePropertiesOf,\n s.execution.isExecuting,\n s.execution.executingNodeId,\n s.execution.nodeStatuses,\n s.execution.nodeItemCounts,\n s.actions.nodes.setNodes,\n ]),\n );\n\n // Auto-persist operation_name for integration/channel nodes even when the property\n // panel has never been opened. Mirrors the same logic in ChannelNodePropertyPanel so\n // validation and execution always see a correct operation_name regardless of whether\n // the user has interacted with the sidebar panel.\n useEffect(() => {\n if (nodeType !== \"integration/channel\") return;\n const nodeData = data as ChannelNodeData | undefined;\n const explicitRole = nodeData?.args?.state?.role;\n const hasIncomingEdge = edges.some((e) => e.target === id);\n const isAction =\n explicitRole === \"action\" || (!explicitRole && hasIncomingEdge);\n const expectedOp = isAction\n ? \"sendChannelMessage\"\n : \"onChannelMessageReceived\";\n if (nodeData?.operation_name === expectedOp) return;\n setNodes((nds) => {\n const updated = nds.map((n) =>\n n.id === id\n ? { ...n, data: { ...n.data, operation_name: expectedOp } }\n : n,\n );\n zustandSetNodes(updated);\n return updated;\n });\n }, [nodeType, id, edges, data, setNodes, zustandSetNodes]);\n\n const { executeNode } = useNodeExecution();\n\n const deleteNode = useDeleteNode();\n\n const handleDeleteNode = () => {\n deleteNode(id);\n };\n\n const handleShowNodeProperties = useCallback(() => {\n showNodePropertiesOf({ id, type: value?.type as ExtendedNodeType });\n }, [id, showNodePropertiesOf]);\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 return (\n <div>\n <NodeCard\n data-selected={selected}\n onDoubleClick={handleShowNodeProperties}\n executionStatus={executionStatus}\n itemCount={itemCount}\n >\n <NodeCardHeader\n icon={meta.icon}\n title={meta.title}\n handleDeleteNode={handleDeleteNode}\n handleShowNodeProperties={handleShowNodeProperties}\n handleExecuteStep={handleExecuteStep}\n isExecuting={isThisNodeExecuting}\n executionStatus={executionStatus}\n gradientColor={meta.gradientColor}\n />\n\n <NodeCardContent>\n {nodeType === \"integration/channel\" ||\n nodeType === \"store/conversation\" ? (\n <div className=\"flex flex-col p-4\">\n <div className=\"text-xs font-medium text-card-foreground\">\n {nodeType === \"integration/channel\"\n ? (() => {\n const explicitRole = (data as ChannelNodeData).args\n ?.state?.role;\n const isAction =\n explicitRole === \"action\" ||\n (!explicitRole && edges.some((e) => e.target === id));\n return isAction ? \"Send Message\" : \"Receive Messages\";\n })()\n : \"Store & Forward\"}\n </div>\n </div>\n ) : (\n <>\n <div className=\"flex flex-col p-4\">\n <div className=\"text-xs font-medium text-card-foreground\">\n Select Operation\n </div>\n </div>\n\n {value?.operations && (\n <div className=\"space-y-4 \">\n <Select\n value={data?.operation_name}\n onValueChange={(val: string) => {\n const op = value?.operations?.find(\n (operation: NodeOperation) => operation.name === val,\n );\n if (op) {\n updateNode(id, {\n data: {\n ...getNode(id)?.data,\n operation_name: op.name,\n operation_type: op.type,\n args: {\n state: { ...op?.adaptive_card?.defaultValue },\n context: (\n getNode(id)?.data as {\n args?: {\n context?: Record<string, unknown>;\n };\n }\n )?.args?.context,\n },\n },\n });\n }\n }}\n >\n <SelectTrigger>\n <SelectValue placeholder=\"Select Operation\" />\n </SelectTrigger>\n <SelectContent>\n {value?.operations?.map((operation: NodeOperation) => (\n <SelectItem\n key={operation.name}\n value={operation.name}\n >\n {operation.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n </>\n )}\n <NodeCardDescription description={meta?.description ?? \"\"} />\n\n <NodeCardFooter nodeId={id} />\n </NodeCardContent>\n <CustomHandle\n type=\"target\"\n id={\"target\"}\n position={Position.Left}\n isConnectable={isConnectable}\n />\n\n <CustomHandle\n type=\"source\"\n id={\"source\"}\n position={Position.Right}\n isConnectable={isConnectable}\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\";\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 * Fetch all nodes from GraphQL and populate NODE_CONFIGS\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 — node configs will use built-in nodes only.\",\n );\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 return;\n }\n\n // Fetch manifests for all nodes in parallel\n const manifestPromises = nodes.map(async (node) => {\n if (node?.nodeType && node?.nodeVersion) {\n try {\n return await fetchNodeManifest(node.nodeType, node.nodeVersion);\n } catch {\n console.error(\n `Failed to fetch manifest for node ${node.id} (${node.nodeType} v${node.nodeVersion})`,\n );\n return null;\n }\n } else {\n console.warn(\n `Node ${node?.id ?? \"unknown\"} is missing nodeType or nodeVersion. Skipping manifest fetch.`,\n );\n return null;\n }\n });\n\n const manifests = await Promise.all(manifestPromises);\n const successfulManifests = manifests.filter(\n (m): m is NodeManifest => m !== null,\n );\n // Populate NODE_CONFIGS with fetched manifests\n successfulManifests.forEach((manifest, index) => {\n const node = nodes[index];\n // Extract operations array from nested structure if needed\n const manifestOps = manifest.operations as\n | { operations?: unknown[] }\n | unknown[]\n | undefined;\n const operations = Array.isArray(manifestOps)\n ? manifestOps\n : ((manifestOps as { operations?: unknown[] } | undefined)\n ?.operations ?? manifestOps);\n\n NODE_CONFIGS.push({\n type: manifest.nodeType, // Use camelCase nodeType\n detail: {\n icon: manifest.icon || \"mynaui:keyboard-solid\",\n title: manifest.name,\n description: manifest.description,\n gradientColor: \"yellow\", // Default gradient for dynamic nodes\n },\n defaultData: {\n operation_name: \"\",\n operation_type: \"\",\n nodeData: manifest,\n version: manifest.version,\n args: {\n context: {\n node: {\n id: manifest.nodeType,\n kind: manifest.kind,\n type: manifest.nodeType,\n },\n },\n state: {},\n credentials: [],\n },\n },\n operations: operations as unknown[] | undefined,\n publishType: node.publishType, // Preserve publishType from GraphQL query\n });\n });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"Failed to fetch nodes or manifests:\", message);\n }\n}\n\n/**\n * Refetch all nodes by re-running initializeNodeConfigs.\n * Called after installing/uninstalling a store node.\n *\n * Resets the initialization guard and all derived arrays so\n * initializeNodeConfigs() runs a fresh fetch instead of returning early.\n */\nexport async function refetchStoreNodes(): Promise<void> {\n try {\n // Reset all state so initializeNodeConfigs() does a fresh fetch\n NODE_CONFIGS.length = 0;\n NODES.length = 0;\n AVAILABLE_NODES.length = 0;\n for (const key of Object.keys(NODE_TYPES)) delete NODE_TYPES[key];\n for (const key of Object.keys(NODES_METADATA))\n delete NODES_METADATA[key as ExtendedNodeType];\n\n // Reset the initialization guard so ensureNodeConfigsLoaded doesn't short-circuit\n isInitialized = false;\n initPromise = null;\n\n // Re-register the fallback dynamic node component\n const fallback = getNodeMetadata({ type: \"__default_dynamic__\" });\n if (fallback?.node) {\n NODE_TYPES[\"default\"] = fallback.node;\n }\n\n await initializeNodeConfigs();\n rebuildNodeArrays();\n } catch (error) {\n console.error(\"[Blocks] Failed to refetch nodes:\", error);\n }\n}\n\n// Type for node metadata entries (defined early for use in lazy init)\ntype NodeMetadataEntry = RegisterNodeMetadata & {\n __details: {\n type: RegisterNodeMetadata[\"type\"];\n } & RegisterNodeMetadata[\"detail\"];\n};\n\n// Forward declaration of mutable exports (will be populated below and by lazy init)\nexport const NODES: RegisterNodeMetadata[] = [];\nexport const NODE_TYPES: Record<string, RegisterNodeMetadata[\"node\"]> = {};\nexport const NODES_METADATA: Record<ExtendedNodeType, NodeMetadataEntry> =\n {} as Record<ExtendedNodeType, NodeMetadataEntry>;\n\ninterface AvailableNodeManifest {\n kind?: string[];\n nodeType?: string;\n name?: string;\n version?: string;\n description?: string;\n}\n\n// Mutable array for available nodes\nexport const AVAILABLE_NODES: {\n type: string;\n icon: string;\n title: string;\n description?: string;\n gradientColor: string;\n manifest: AvailableNodeManifest | undefined;\n publishType?: \"BUILTIN\" | \"STORE\" | \"CUSTOM\"; // Track node source\n}[] = [];\n\n// Lazy initialization - don't block module loading\nlet initPromise: Promise<void> | null = null;\nlet isInitialized = false;\n\n// Subscriber pattern: notify when NODE_TYPES is updated (for React re-render)\ntype NodeTypesListener = () => void;\nconst nodeTypesListeners: Set<NodeTypesListener> = new Set();\n\n/** Subscribe to NODE_TYPES updates. Returns unsubscribe function. */\nexport function onNodeTypesUpdate(listener: NodeTypesListener): () => void {\n nodeTypesListeners.add(listener);\n return () => nodeTypesListeners.delete(listener);\n}\n\nfunction notifyNodeTypesListeners(): void {\n nodeTypesListeners.forEach((listener) => listener());\n}\n\n/**\n * Ensure node configs are loaded. Safe to call multiple times.\n * Returns immediately if already initialized or initializing.\n */\nexport function ensureNodeConfigsLoaded(): Promise<void> {\n if (isInitialized) {\n return Promise.resolve();\n }\n if (!initPromise) {\n initPromise = initializeNodeConfigs().then(() => {\n // Only mark as truly initialized if we actually loaded some dynamic configs\n // If the Apollo client wasn't available, allow re-initialization later\n if (NODE_CONFIGS.length > 0) {\n isInitialized = true;\n } else {\n // Reset so a future call can retry once the Apollo client is available\n initPromise = null;\n }\n // Rebuild derived arrays after configs are loaded\n rebuildNodeArrays();\n });\n }\n return initPromise;\n}\n\n/**\n * Check if node configs have been initialized\n */\nexport function isNodeConfigsInitialized(): boolean {\n return isInitialized;\n}\n\n/**\n * Rebuild NODES and derived arrays after NODE_CONFIGS is populated.\n * This is called after lazy initialization completes.\n */\nfunction rebuildNodeArrays(): void {\n // Add nodes from NODE_CONFIGS\n NODE_CONFIGS.forEach((config: NodeConfig) => {\n const data = getNodeMetadata(config as NodeMetadataValue);\n const nodeMetadata = {\n ...data,\n detail: { ...config.detail },\n } as RegisterNodeMetadata;\n\n // Add only if type doesn't already exist\n if (!NODES.some((n) => n.type === nodeMetadata.type)) {\n NODES.push(nodeMetadata);\n\n // Also add to NODE_TYPES and NODES_METADATA\n NODE_TYPES[nodeMetadata.type] = nodeMetadata.node;\n NODES_METADATA[nodeMetadata.type as ExtendedNodeType] = {\n ...nodeMetadata,\n __details: { type: nodeMetadata.type, ...nodeMetadata.detail },\n };\n }\n });\n\n // Rebuild AVAILABLE_NODES\n const newAvailableNodes = NODES.filter(\n (node) => node.available === undefined || node.available,\n ).map((node) => {\n // Find the corresponding NODE_CONFIG to get publishType\n const nodeConfig = NODE_CONFIGS.find((config) => config.type === node.type);\n\n return {\n type: node.type,\n icon: node.detail.icon,\n title: node.detail.title,\n description: node.detail.description,\n gradientColor: node.detail.gradientColor ?? \"gray\",\n manifest: (\n node.defaultData as { nodeData?: AvailableNodeManifest } | undefined\n )?.nodeData as AvailableNodeManifest | undefined,\n publishType: nodeConfig?.publishType, // Include publishType\n };\n });\n // Update AVAILABLE_NODES in place\n AVAILABLE_NODES.length = 0;\n AVAILABLE_NODES.push(...newAvailableNodes);\n\n // Notify subscribers that NODE_TYPES has been updated\n notifyNodeTypesListeners();\n}\n\n// Start lazy initialization in the background (non-blocking)\n// This allows the module to load immediately while configs fetch asynchronously\nensureNodeConfigsLoaded().catch((err) => {\n console.warn(\n \"[Workflows] Background node config initialization failed:\",\n err,\n );\n});\n\n// Register a generic dynamic node component for any type not yet loaded.\n// This is used as a default fallback: when the workflow contains node types\n// that haven't been fetched yet, they get this component instead of React Flow's\n// empty default. When the real node config loads, it overwrites this entry.\nconst fallbackDynamic = getNodeMetadata({ type: \"__default_dynamic__\" });\nif (fallbackDynamic?.node) {\n NODE_TYPES[\"default\"] = fallbackDynamic.node;\n}\n\n/**\n * Pre-register node types from the workflow definition so React Flow never sees unknown types.\n * Called by FlowBuilderPage before hydrating the store.\n */\nexport function registerWorkflowNodeTypes(\n workflowNodes: { type?: string; data?: unknown }[],\n): void {\n for (const node of workflowNodes) {\n if (node.type && !NODE_TYPES[node.type]) {\n const meta = getNodeMetadata({\n type: node.type,\n defaultData: {\n version: (node.data as Record<string, unknown>)?.version as\n | string\n | undefined,\n nodeData: (node.data as Record<string, unknown>)?.nodeData as\n | Record<string, unknown>\n | undefined,\n },\n operations: (node.data as Record<string, unknown>)?.operations as\n | NodeOperation[]\n | undefined,\n });\n if (meta?.node) {\n NODE_TYPES[node.type] = meta.node;\n }\n }\n }\n}\n\n// All nodes are fetched from nodeEndpointConfigs (workflow-svc) via ensureNodeConfigsLoaded().\n// No hardcoded node imports — the workflow-svc auto-seeds all BUILTIN nodes on startup.\n","import { useCallback } from \"react\";\nimport JSZip from \"jszip\";\nimport { NODE_CONFIGS } from \"../../builder/components/flow-builder/components/blocks\";\n\ninterface NodeManifest {\n nodeType: string;\n name: string;\n version: string;\n description?: string;\n icon?: string;\n kind?: string[];\n operations?: unknown[] | { operations?: unknown[] };\n category?: string;\n}\n\ninterface LoadNodePackageResult {\n success: boolean;\n manifest?: NodeManifest;\n error?: string;\n}\n\n/**\n * Hook to download, extract, and load node packages from ZIP files\n */\nexport function useNodePackageLoader() {\n /**\n * Download ZIP file from URL\n */\n const downloadZip = useCallback(\n async (zipUrl: string): Promise<ArrayBuffer> => {\n try {\n const response = await fetch(zipUrl);\n\n if (!response.ok) {\n throw new Error(`Failed to download ZIP: ${response.statusText}`);\n }\n\n return await response.arrayBuffer();\n } catch (error: any) {\n console.error(\"[useNodePackageLoader] Download failed:\", error);\n throw new Error(`Download failed: ${error.message}`);\n }\n },\n [],\n );\n\n /**\n * Extract and parse manifest.json from ZIP\n */\n const extractManifest = useCallback(\n async (zipData: ArrayBuffer): Promise<NodeManifest> => {\n try {\n const zip = await JSZip.loadAsync(zipData);\n\n // Look for manifest.json in root or common locations\n const manifestPaths = [\n \"manifest.json\",\n \"package/manifest.json\",\n \"node/manifest.json\",\n ];\n\n let manifestFile = null;\n for (const path of manifestPaths) {\n manifestFile = zip.file(path);\n if (manifestFile) break;\n }\n\n if (!manifestFile) {\n throw new Error(\"manifest.json not found in ZIP package\");\n }\n\n const manifestText = await manifestFile.async(\"text\");\n const manifest = JSON.parse(manifestText) as NodeManifest;\n\n // Validate required fields\n if (!manifest.nodeType || !manifest.name || !manifest.version) {\n throw new Error(\n \"Invalid manifest: missing required fields (nodeType, name, version)\",\n );\n }\n\n return manifest;\n } catch (error: any) {\n console.error(\n \"[useNodePackageLoader] Manifest extraction failed:\",\n error,\n );\n throw new Error(`Manifest extraction failed: ${error.message}`);\n }\n },\n [],\n );\n\n /**\n * Register node in the flow builder's NODE_CONFIGS registry\n */\n const registerNode = useCallback((manifest: NodeManifest): void => {\n try {\n // Check if node already exists\n const existingNode = NODE_CONFIGS.find(\n (config) => config.type === manifest.nodeType,\n );\n\n if (existingNode) {\n console.warn(\n `[useNodePackageLoader] Node ${manifest.nodeType} already registered, skipping`,\n );\n return;\n }\n\n // Extract operations array from nested structure if needed\n const manifestOps = manifest.operations as\n | { operations?: unknown[] }\n | unknown[]\n | undefined;\n const operations = Array.isArray(manifestOps)\n ? manifestOps\n : ((manifestOps as { operations?: unknown[] } | undefined)\n ?.operations ?? manifestOps);\n\n // Add node to NODE_CONFIGS\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\", // Default gradient for store 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 });\n\n console.log(\n `[useNodePackageLoader] Successfully registered node: ${manifest.nodeType}`,\n );\n } catch (error: any) {\n console.error(\"[useNodePackageLoader] Node registration failed:\", error);\n throw new Error(`Node registration failed: ${error.message}`);\n }\n }, []);\n\n /**\n * Full workflow: download ZIP, extract manifest, register node\n */\n const loadNodePackage = useCallback(\n async (zipUrl: string): Promise<LoadNodePackageResult> => {\n try {\n console.log(\n `[useNodePackageLoader] Loading node package from: ${zipUrl}`,\n );\n\n // Step 1: Download ZIP\n const zipData = await downloadZip(zipUrl);\n\n // Step 2: Extract manifest\n const manifest = await extractManifest(zipData);\n\n // Step 3: Register node\n registerNode(manifest);\n\n return {\n success: true,\n manifest,\n };\n } catch (error: any) {\n console.error(\"[useNodePackageLoader] Load package failed:\", error);\n return {\n success: false,\n error: error.message || \"Failed to load node package\",\n };\n }\n },\n [downloadZip, extractManifest, registerNode],\n );\n\n return {\n loadNodePackage,\n downloadZip,\n extractManifest,\n registerNode,\n };\n}\n","import { useCallback } from \"react\";\nimport {\n AVAILABLE_NODES,\n refetchStoreNodes,\n} from \"../../builder/components/flow-builder/components/blocks\";\n\n/**\n * Hook to refresh the available nodes list after installing/uninstalling nodes.\n * Re-fetches all nodes from the workflow-svc (single source of truth).\n */\nexport function useRefreshAvailableNodes() {\n const refreshAvailableNodes = useCallback(async () => {\n try {\n console.log(\"[useRefreshAvailableNodes] Refreshing available nodes...\");\n\n // Re-fetch all nodes from workflow-svc and rebuild arrays\n await refetchStoreNodes();\n\n console.log(\n `[useRefreshAvailableNodes] Refresh complete. Total available nodes: ${AVAILABLE_NODES.length}`,\n );\n\n return {\n success: true,\n totalNodes: AVAILABLE_NODES.length,\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"[useRefreshAvailableNodes] Refresh failed:\", message);\n return {\n success: false,\n error: message,\n };\n }\n }, []);\n\n return {\n refreshAvailableNodes,\n };\n}\n","import { useState, useCallback, useContext } from \"react\";\nimport { useMutation } from \"@apollo/client/react\";\nimport {\n InstallWorkflowNodeDocument,\n InstallPurchasedNodeDocument,\n type InstallWorkflowNodeMutation,\n type InstallWorkflowNodeMutationVariables,\n type InstallPurchasedNodeMutation,\n type InstallPurchasedNodeMutationVariables,\n} from \"../../generated/global-operations\";\nimport type { StoreProduct } from \"../../generated/global-types\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { useInstalledNodes } from \"./useInstalledNodes\";\nimport { useNodePackageLoader } from \"./useNodePackageLoader\";\nimport { useRefreshAvailableNodes } from \"./useRefreshAvailableNodes\";\nimport { getFluidGridsConfig } from \"../../config\";\n\n/**\n * Hook to install a workflow node from the store\n */\nexport function useInstallNode() {\n const globalClient = useGlobalStoreClient();\n\n // Try to get context, but don't throw if not available\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n const tenantId = context?.tenantId ?? getFluidGridsConfig().tenantId;\n\n const { refetch: refetchInstalled } = useInstalledNodes();\n const { loadNodePackage } = useNodePackageLoader();\n const { refreshAvailableNodes } = useRefreshAvailableNodes();\n const [installing, setInstalling] = useState<string | null>(null);\n\n const [installMutation] = useMutation<\n InstallWorkflowNodeMutation,\n InstallWorkflowNodeMutationVariables\n >(InstallWorkflowNodeDocument, {\n client: globalClient,\n });\n\n const [installPurchasedMutation] = useMutation<\n InstallPurchasedNodeMutation,\n InstallPurchasedNodeMutationVariables\n >(InstallPurchasedNodeDocument, {\n client: globalClient,\n });\n\n const installNode = useCallback(\n async (node: StoreProduct) => {\n try {\n setInstalling(node.id);\n\n // Determine if this is a purchased node (paid nodes that have been purchased)\n const isPurchasedNode =\n node.isPurchased && node.pricingModel !== \"FREE\";\n\n // Step 1: Install the app/node (create database record)\n let installationResult;\n\n if (isPurchasedNode) {\n // Use installPurchasedApp for purchased nodes (validates purchase via order)\n console.log(`[useInstallNode] Installing purchased node: ${node.id}`);\n const result = await installPurchasedMutation({\n variables: {\n productId: node.id,\n workspaceId,\n // orderId is optional - backend will auto-find most recent PROCESSED order\n },\n });\n\n if (result.error || !result.data?.installPurchasedApp?.success) {\n throw new Error(\n result.data?.installPurchasedApp?.error ||\n result.error?.message ||\n \"Installation failed\",\n );\n }\n\n installationResult = result.data.installPurchasedApp.installation;\n console.log(\n \"[useInstallNode] Purchased node installation successful. Node registration handled by backend.\",\n );\n } else {\n // Use recordAppInstallation for FREE nodes (existing flow)\n console.log(`[useInstallNode] Installing free node: ${node.id}`);\n const result = await installMutation({\n variables: {\n input: {\n productId: node.id,\n workspaceId,\n workspaceName: undefined, // Optional\n workspaceType: undefined, // Optional\n organizationId: tenantId,\n version: node.manifestVersion,\n manifest: node.manifest,\n metadata: undefined, // Optional\n },\n },\n });\n\n if (result.error || !result.data?.recordAppInstallation) {\n throw new Error(result.error?.message || \"Installation failed\");\n }\n\n installationResult = result.data.recordAppInstallation;\n console.log(\n \"[useInstallNode] Free node installation successful. Node registration handled by backend.\",\n );\n }\n\n // Step 2: Load node package (download ZIP, extract manifest, register node)\n if (node.zipFileUrl) {\n console.log(\n `[useInstallNode] Loading node package from: ${node.zipFileUrl}`,\n );\n const packageResult = await loadNodePackage(node.zipFileUrl);\n\n if (!packageResult.success) {\n console.warn(\n `[useInstallNode] Package loading failed: ${packageResult.error}. ` +\n `Node installed in database but not loaded in builder.`,\n );\n // Continue - installation succeeded even if package loading failed\n } else {\n console.log(\n `[useInstallNode] Successfully loaded node package: ${packageResult.manifest?.nodeType}`,\n );\n\n // Step 3: Refresh available nodes in the builder\n const refreshResult = await refreshAvailableNodes();\n if (refreshResult.success) {\n console.log(\n `[useInstallNode] Available nodes refreshed. Total: ${refreshResult.totalNodes}`,\n );\n }\n }\n } else {\n console.warn(\n `[useInstallNode] Node ${node.id} has no zipFileUrl. ` +\n `Installed in database but cannot be loaded in builder.`,\n );\n }\n\n // Step 4: Refresh installations list\n await refetchInstalled();\n\n return {\n success: true,\n installation: installationResult,\n };\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : \"Installation failed\";\n console.error(\"[useInstallNode] Installation failed:\", error);\n return {\n success: false,\n error: errorMessage,\n };\n } finally {\n setInstalling(null);\n }\n },\n [\n installMutation,\n installPurchasedMutation,\n workspaceId,\n tenantId,\n refetchInstalled,\n loadNodePackage,\n refreshAvailableNodes,\n ],\n );\n\n return {\n installNode,\n installing,\n };\n}\n","import { useState, useCallback, useContext } from \"react\";\nimport { gql } from \"@apollo/client/core\";\nimport { getFluidGridsClient } from \"../../graphql/client\";\nimport { getFluidGridsConfig } from \"../../config\";\nimport { FluidGridsContext } from \"../../components/FluidGridsProvider\";\nimport { useGlobalStoreClient } from \"./useGlobalStoreClient\";\nimport { useTemplateDetail } from \"./useTemplateDetail\";\nimport { useInstallNode } from \"./useInstallNode\";\nimport type { StoreProduct } from \"../../generated/global-types\";\nimport type {\n WorkflowTemplateContent,\n TemplateRequiredNode,\n TemplateNodeCheckResult,\n ImportWorkflowTemplateOptions,\n} from \"../../types/workflow-template-content\";\nimport {\n applyTemplateInputs,\n deepClone,\n} from \"../../utils/template-input-applicator\";\n\n// ============================================================================\n// Inline GraphQL Documents\n// These will be replaced by generated document imports once codegen runs.\n// ============================================================================\n\nconst IMPORT_WORKFLOW_TEMPLATE = gql`\n mutation ImportWorkflowTemplate($input: ImportWorkflowTemplateInput!) {\n importWorkflowTemplate(input: $input) {\n success\n message\n workflow {\n id\n workflowKey\n version\n name\n description\n status\n definitionJson\n tags\n category\n icon\n createdAt\n }\n }\n }\n`;\n\nconst RECORD_DOWNLOAD = gql`\n mutation RecordDownload($productId: String!) {\n recordDownload(productId: $productId) {\n id\n downloadedAt\n }\n }\n`;\n\n// Use the shared InstallWorkflowNodeDocument from generated operations\n// to avoid duplicate GQL definitions (also used in desktop-sidebar-fragment)\nimport { InstallWorkflowNodeDocument } from \"../../generated/global-operations\";\n\nconst NODE_ENDPOINT_CONFIGS = gql`\n query NodeEndpointConfigsForTemplateCheck {\n nodeEndpointConfigs(pagination: { limit: 500, offset: 0 }) {\n items {\n nodeType\n nodeVersion\n publishType\n status\n }\n total\n }\n }\n`;\n\nconst WORKFLOW_DEFINITIONS = gql`\n query WorkflowDefinitions($input: ListWorkflowDefinitionsInput!) {\n workflowDefinitions(input: $input) {\n items {\n id\n workflowKey\n name\n version\n status\n }\n total\n hasMore\n }\n }\n`;\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ImportResult {\n success: boolean;\n workflow: {\n id: string;\n workflowKey: string;\n version: string;\n name: string;\n description?: string | null;\n status: string;\n } | null;\n message: string;\n /** Nodes that were installed during import */\n installedNodes: string[];\n /** Credential types that need to be configured */\n requiredCredentials: string[];\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to orchestrate importing a workflow template from the store.\n *\n * Frontend-orchestrated flow:\n * 1. Fetch full template detail from global store (lazy load content)\n * 2. Check which nodes are missing from the workspace\n * 3. Auto-install free/builtin missing nodes (with user confirmation)\n * 4. Apply user-provided template inputs to definitionJson\n * 5. Create workflow via importWorkflowTemplate mutation (workspace gateway)\n * 6. Record download in store (global gateway)\n */\nexport function useImportWorkflowTemplate() {\n const [importing, setImporting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const { fetchTemplateDetail, loading: fetchingDetail } = useTemplateDetail();\n const { installNode } = useInstallNode();\n\n const globalClient = useGlobalStoreClient();\n const context = useContext(FluidGridsContext);\n const workspaceId = context?.workspaceId ?? getFluidGridsConfig().workspaceId;\n\n // ========================================================================\n // Step 1: Fetch full template detail (lazy)\n // ========================================================================\n\n const getTemplateDetail = useCallback(\n async (templateId: string) => {\n return fetchTemplateDetail(templateId);\n },\n [fetchTemplateDetail],\n );\n\n // ========================================================================\n // Step 2: Parse content and check node dependencies\n // ========================================================================\n\n /**\n * Parse the template content from a StoreProduct.\n * Returns null if the product doesn't have valid workflow template content.\n */\n const parseTemplateContent = useCallback(\n (template: StoreProduct): WorkflowTemplateContent | null => {\n try {\n const content = template.content as WorkflowTemplateContent | null;\n if (!content?.definitionJson) {\n console.warn(\n \"[useImportWorkflowTemplate] Template has no definitionJson in content:\",\n template.id,\n );\n return null;\n }\n return content;\n } catch {\n console.error(\n \"[useImportWorkflowTemplate] Failed to parse template content:\",\n template.id,\n );\n return null;\n }\n },\n [],\n );\n\n /**\n * Check which nodes from the template are missing in the workspace.\n * Queries the workspace's installed nodes and compares with required nodes.\n */\n const checkMissingNodes = useCallback(\n async (\n requiredNodeTypes: TemplateRequiredNode[],\n ): Promise<TemplateNodeCheckResult> => {\n if (!requiredNodeTypes || requiredNodeTypes.length === 0) {\n return {\n installed: [],\n missing: [],\n missingPaid: [],\n canImport: true,\n };\n }\n\n try {\n const client = getFluidGridsClient();\n const result = await client.query({\n query: NODE_ENDPOINT_CONFIGS,\n fetchPolicy: \"network-only\",\n });\n\n const data = result.data as\n | {\n nodeEndpointConfigs?: {\n items: Array<{ nodeType: string }>;\n };\n }\n | undefined;\n const installedNodeTypes = new Set(\n (data?.nodeEndpointConfigs?.items || []).map(\n (n: { nodeType: string }) => n.nodeType,\n ),\n );\n\n const installed: TemplateRequiredNode[] = [];\n const missing: TemplateRequiredNode[] = [];\n const missingPaid: TemplateRequiredNode[] = [];\n\n for (const node of requiredNodeTypes) {\n if (\n installedNodeTypes.has(node.nodeType) ||\n node.publishType === \"BUILTIN\"\n ) {\n installed.push(node);\n } else if (node.publishType === \"STORE\" && node.storeProductId) {\n // Store node with a product reference — needs separate purchase check\n missingPaid.push(node);\n } else {\n missing.push(node);\n }\n }\n\n return {\n installed,\n missing,\n missingPaid,\n canImport: missingPaid.length === 0,\n };\n } catch (err) {\n console.error(\n \"[useImportWorkflowTemplate] Failed to check node dependencies:\",\n err,\n );\n // On error, assume all nodes are available (don't block import)\n return {\n installed: requiredNodeTypes,\n missing: [],\n missingPaid: [],\n canImport: true,\n };\n }\n },\n [],\n );\n\n // ========================================================================\n // Step 3: Install missing nodes\n // ========================================================================\n\n /**\n * Install missing free/builtin nodes.\n * Returns list of successfully installed node display names.\n */\n const installMissingNodes = useCallback(\n async (nodes: StoreProduct[]): Promise<string[]> => {\n const installed: string[] = [];\n for (const node of nodes) {\n try {\n const result = await installNode(node);\n if (result.success) {\n installed.push(node.name);\n }\n } catch (err) {\n console.warn(\n `[useImportWorkflowTemplate] Failed to install node: ${node.name}`,\n err,\n );\n }\n }\n return installed;\n },\n [installNode],\n );\n\n // ========================================================================\n // Step 4 + 5 + 6: Full import flow\n // ========================================================================\n\n /**\n * Import a workflow template into the workspace.\n *\n * @param template - The full StoreProduct (with content populated)\n * @param options - Import options (name override, template inputs, etc.)\n * @returns Import result with the created workflow\n */\n const importTemplate = useCallback(\n async (\n template: StoreProduct,\n options?: ImportWorkflowTemplateOptions,\n ): Promise<ImportResult> => {\n setImporting(true);\n setError(null);\n\n try {\n // 1. Parse template content\n const content = parseTemplateContent(template);\n if (!content) {\n throw new Error(\n \"Template does not contain valid workflow definition data\",\n );\n }\n\n // 2. Apply user template inputs to definitionJson\n let definitionJson = deepClone(content.definitionJson);\n if (options?.templateInputs) {\n definitionJson = applyTemplateInputs(\n definitionJson,\n options.templateInputs,\n );\n }\n\n // 3. Build context with product isolation\n const config = getFluidGridsConfig();\n const importContext: Record<string, unknown> = {\n ...(options?.context || {}),\n ...(config.productId ? { productId: config.productId } : {}),\n ...(config.productName ? { productName: config.productName } : {}),\n };\n\n // 4. Create workflow via workspace gateway\n const client = getFluidGridsClient();\n const result = await client.mutate({\n mutation: IMPORT_WORKFLOW_TEMPLATE,\n variables: {\n input: {\n definitionJson,\n name:\n options?.name || content.defaultWorkflowName || template.name,\n description: options?.description || template.description,\n sourceTemplateId: template.id,\n sourceTemplateName: template.name,\n tags: content.defaultTags || template.tags || [],\n category:\n content.defaultCategory || template.category || undefined,\n icon: template.icon || undefined,\n projectId: options?.projectId,\n context: importContext,\n },\n },\n refetchQueries: [WORKFLOW_DEFINITIONS],\n });\n\n const mutationData = result.data as\n | {\n importWorkflowTemplate?: {\n success: boolean;\n message?: string;\n workflow?: {\n id: string;\n workflowKey: string;\n version: string;\n name: string;\n description?: string | null;\n status: string;\n };\n };\n }\n | undefined;\n const importResult = mutationData?.importWorkflowTemplate;\n if (!importResult?.success || !importResult.workflow) {\n throw new Error(\n importResult?.message || \"Failed to create workflow from template\",\n );\n }\n\n // 5. Record download in store (analytics, best-effort)\n try {\n await globalClient.mutate({\n mutation: RECORD_DOWNLOAD,\n variables: {\n productId: template.id,\n },\n });\n } catch {\n // Best-effort: don't fail import if analytics recording fails\n console.warn(\n \"[useImportWorkflowTemplate] Failed to record store download\",\n );\n }\n\n // 6. Record installation in store (so template shows in /store/installed)\n try {\n await globalClient.mutate({\n mutation: InstallWorkflowNodeDocument,\n variables: {\n input: {\n productId: template.id,\n workspaceId,\n organizationId:\n context?.tenantId ?? getFluidGridsConfig().tenantId,\n version: template.manifestVersion || \"1.0.0\",\n manifest: template.manifest,\n metadata: {\n type: \"WORKFLOW\",\n sourceTemplateId: template.id,\n sourceTemplateName: template.name,\n importedWorkflowKey: importResult.workflow.workflowKey,\n importedWorkflowVersion: importResult.workflow.version,\n },\n },\n },\n });\n } catch {\n // Best-effort: don't fail import if installation recording fails\n console.warn(\n \"[useImportWorkflowTemplate] Failed to record app installation\",\n );\n }\n\n return {\n success: true,\n workflow: importResult.workflow,\n message: importResult.message || \"Template imported successfully\",\n installedNodes: [],\n requiredCredentials: content.requiredCredentialTypes || [],\n };\n } catch (err) {\n const importError =\n err instanceof Error ? err : new Error(\"Template import failed\");\n setError(importError);\n console.error(\"[useImportWorkflowTemplate] Import failed:\", err);\n return {\n success: false,\n workflow: null,\n message: importError.message,\n installedNodes: [],\n requiredCredentials: [],\n };\n } finally {\n setImporting(false);\n }\n },\n [parseTemplateContent, globalClient, workspaceId],\n );\n\n return {\n /** Fetch full template content from store (lazy load) */\n getTemplateDetail,\n /** Parse WorkflowTemplateContent from a StoreProduct */\n parseTemplateContent,\n /** Check which template nodes are missing from workspace */\n checkMissingNodes,\n /** Install missing free nodes */\n installMissingNodes,\n /** Full import: apply inputs -> create workflow -> record analytics */\n importTemplate,\n /** Whether we're fetching template detail */\n fetchingDetail,\n /** Whether we're importing */\n importing,\n /** Last error */\n error,\n };\n}\n"]}