@burdenoff/fluidgrids-fe-sdk 2026.924.3 → 2026.925.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -138,6 +138,20 @@ The SDK uses Tailwind CSS for styling. Make sure you have Tailwind configured in
138
138
  import '@burdenoff/fluidgrids-fe-sdk/styles.css';
139
139
  ```
140
140
 
141
+ ## Branding
142
+
143
+ Every workflow canvas the SDK renders — `WorkflowBuilder`, `WorkflowBuilderCore`,
144
+ the `FluidGridsRoot` builder and template-preview routes, and the public
145
+ `WorkflowEmbedPage` viewer — shows a small **Powered by FluidGrids** mark in its
146
+ top-right corner, linking to [fluidgrids.ai](https://www.fluidgrids.ai). The
147
+ chrome props above (`hideHeader`, `hideSidebar`, `hideLogsPanel`, `readonly`)
148
+ hide toolbars and panels only.
149
+
150
+ FluidGrids is not offered as a white-label product: no prop, context, theme
151
+ option or URL parameter hides or replaces the mark. The embed viewer's old
152
+ `badge=false` parameter is ignored. Translations may reword the "Powered by"
153
+ phrase, but the FluidGrids name always stays.
154
+
141
155
  ## Security Notes
142
156
 
143
157
  - Pass runtime URLs through environment variables instead of hardcoded localhost defaults.
@@ -1,5 +1,5 @@
1
- export { WorkflowBuilder } from './chunk-7WFWNP3M.js';
2
- import './chunk-KUPUHY7N.js';
1
+ export { WorkflowBuilder } from './chunk-6DQDX6LD.js';
2
+ import './chunk-6SXISR7B.js';
3
3
  import './chunk-XQP33UJR.js';
4
4
  import './chunk-P5PKRQAO.js';
5
5
  import './chunk-NH5YCY37.js';
@@ -16,5 +16,5 @@ import './chunk-UBKJDGYS.js';
16
16
  import './chunk-LMO5ASOE.js';
17
17
  import './chunk-7YWBH2A5.js';
18
18
  import './chunk-5BDQNSP3.js';
19
- //# sourceMappingURL=WorkflowBuilder-TTF5AUWX.js.map
20
- //# sourceMappingURL=WorkflowBuilder-TTF5AUWX.js.map
19
+ //# sourceMappingURL=WorkflowBuilder-IS2ZZ6JY.js.map
20
+ //# sourceMappingURL=WorkflowBuilder-IS2ZZ6JY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowBuilder-TTF5AUWX.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowBuilder-IS2ZZ6JY.js"}
@@ -1,4 +1,4 @@
1
- import { useInstalledNodes, buildNodeCheck, refetchStoreNodes, FlowBuilderPage, buildRequiredNodeTypes, mergeStickyNotes } from './chunk-KUPUHY7N.js';
1
+ import { useInstalledNodes, buildNodeCheck, refetchStoreNodes, FlowBuilderPage, buildRequiredNodeTypes, mergeStickyNotes } from './chunk-6SXISR7B.js';
2
2
  import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-H5LGKSBM.js';
3
3
  import { useFlowStore } from './chunk-YMD3T6J2.js';
4
4
  import { useNavigate, useParams } from 'react-router';
@@ -401,5 +401,5 @@ function WorkflowBuilder() {
401
401
  }
402
402
 
403
403
  export { WorkflowBuilder };
404
- //# sourceMappingURL=chunk-7WFWNP3M.js.map
405
- //# sourceMappingURL=chunk-7WFWNP3M.js.map
404
+ //# sourceMappingURL=chunk-6DQDX6LD.js.map
405
+ //# sourceMappingURL=chunk-6DQDX6LD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/builder/app/workflow/work/page.tsx","../src/pages/WorkflowBuilder.tsx"],"names":["useNavigate","jsx","jsxs"],"mappings":"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","file":"chunk-7WFWNP3M.js","sourcesContent":["import { useNavigate, useParams } from \"react-router\";\nimport { toast } from \"sonner\";\nimport { Icon } from \"@iconify/react\";\nimport { FlowBuilderPage } from \"../_components/flow-builder\";\nimport {\n useEffect,\n useState,\n useRef,\n useMemo,\n useCallback,\n lazy,\n Suspense,\n} from \"react\";\nimport { useFlowStore, type IFlowState } from \"../../../stores/flow-store\";\nimport {\n useLazyWorkflowDefinition,\n useCreateWorkflow,\n} from \"../../../../hooks/useWorkflows\";\nimport { useInstalledNodes } from \"../../../../hooks/store/useInstalledNodes\";\nimport { mergeStickyNotes } from \"../../../lib/sticky-notes\";\nimport type {\n TemplateNodeCheckResult,\n WorkflowTemplateContent,\n} from \"../../../../types/workflow-template-content\";\nimport {\n buildRequiredNodeTypes,\n buildNodeCheck,\n} from \"../../../../utils/workflow-node-check\";\nimport { refetchStoreNodes } from \"../../../components/flow-builder/components/blocks\";\n\n// Lazy-load the modal to avoid bundle-size impact on routes that never hit it.\nconst LazyMissingNodesInstallModal = lazy(() =>\n import(\"../../../components/flow-builder/components/templates/MissingNodesInstallModal\").then(\n (m) => ({ default: m.MissingNodesInstallModal }),\n ),\n);\n\ninterface WorkflowDefinitionData {\n nodes: IFlowState[\"workflow\"][\"nodes\"];\n edges: IFlowState[\"workflow\"][\"edges\"];\n sidebar: IFlowState[\"workflow\"][\"sidebar\"];\n /** Canvas annotations persisted separately from executable nodes. */\n stickyNotes?: IFlowState[\"workflow\"][\"nodes\"];\n}\n\nexport default function WorkflowItem({\n readonly = false,\n}: {\n readonly?: boolean;\n}) {\n if (readonly) {\n const queryParams = new URLSearchParams(window.location.search);\n queryParams.set(\"readonly\", \"true\");\n const newUrl = `${window.location.pathname}?${queryParams.toString()}`;\n window.history.replaceState(null, \"\", newUrl);\n }\n const { id, version } = useParams();\n const navigate = useNavigate();\n const [workflow, setWorkflow] = useState<IFlowState[\"workflow\"] | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n const { getWorkflow } = useLazyWorkflowDefinition();\n const { createWorkflow } = useCreateWorkflow();\n const creatingRef = useRef(false);\n const fromSharedLoadedRef = useRef(false);\n const fetchedWorkflowRef = useRef<IFlowState[\"workflow\"] | null>(null);\n\n // ── Missing-nodes modal state ────────────────────────────────────────────\n const { installedAppIds } = useInstalledNodes();\n const [pendingWorkflow, setPendingWorkflow] = useState<\n IFlowState[\"workflow\"] | null\n >(null);\n const [nodeCheck, setNodeCheck] = useState<TemplateNodeCheckResult | null>(\n null,\n );\n const [configModalOpen, setConfigModalOpen] = useState(false);\n const [installing, setInstalling] = useState(false);\n const [installProgress, setInstallProgress] = useState<{\n current: number;\n total: number;\n nodeName: string;\n } | null>(null);\n const [installErrors, setInstallErrors] = useState<string[]>([]);\n\n // Classify requiredNodeTypes into installed / missing / missingPaid.\n const doNodeCheck = useCallback(\n (requiredNodeTypes: Parameters<typeof buildNodeCheck>[0]) =>\n buildNodeCheck(requiredNodeTypes, installedAppIds),\n [installedAppIds],\n );\n\n // Keep a ref so the loadWorkflow effect can call doNodeCheck without\n // taking it as a reactive dependency (which would re-trigger the effect\n // on every render and cause infinite CreateWorkflowDefinition mutations).\n const doNodeCheckRef = useRef(doNodeCheck);\n useEffect(() => {\n doNodeCheckRef.current = doNodeCheck;\n });\n\n // Install missing free nodes then open the pending workflow in the builder.\n const handleInstallConfirm = useCallback(async () => {\n if (!pendingWorkflow) return;\n // `missing` now holds only nodes the store can actually install;\n // store-unavailable ones are reported separately (BOFF-7267).\n const nodesToInstall = (nodeCheck?.missing ?? []).filter(\n (n) => !!n.storeProductId,\n );\n const failed: string[] = [];\n\n if (nodesToInstall.length > 0) {\n setInstalling(true);\n setInstallErrors([]);\n try {\n const { getGlobalStoreClient } =\n await import(\"../../../../graphql/global-client\");\n const { InstallWorkflowNodeDocument } =\n await import(\"../../../../generated/global-operations\");\n const { getFluidGridsConfig } = await import(\"../../../../config\");\n\n const storeClient = getGlobalStoreClient();\n const cfg = getFluidGridsConfig();\n\n for (let i = 0; i < nodesToInstall.length; i++) {\n const node = nodesToInstall[i];\n setInstallProgress({\n current: i + 1,\n total: nodesToInstall.length,\n nodeName: node.displayName || node.nodeType,\n });\n try {\n if (storeClient) {\n await storeClient.mutate({\n mutation: InstallWorkflowNodeDocument,\n variables: {\n input: {\n productId: node.storeProductId!,\n workspaceId: cfg.workspaceId,\n organizationId: cfg.tenantId,\n version: node.nodeVersion,\n manifest: null,\n },\n },\n });\n }\n } catch {\n // Keep installing the rest, but remember what failed so the user\n // is told instead of the dialog silently closing (BOFF-7267).\n failed.push(node.displayName || node.nodeType);\n }\n }\n\n // Refresh the in-memory node registry so the builder renders the\n // newly-installed nodes with their real manifests and operations.\n await refetchStoreNodes();\n } finally {\n setInstalling(false);\n setInstallProgress(null);\n }\n }\n\n if (failed.length > 0) {\n // Hold the dialog open so the failure is visible and retryable; the user\n // can still choose \"Open Without Installing\".\n setInstallErrors(failed);\n return;\n }\n\n setInstallErrors([]);\n setConfigModalOpen(false);\n setWorkflow(pendingWorkflow);\n setPendingWorkflow(null);\n setNodeCheck(null);\n }, [pendingWorkflow, nodeCheck]);\n\n const handleSkipInstall = useCallback(() => {\n if (!pendingWorkflow) return;\n setConfigModalOpen(false);\n setWorkflow(pendingWorkflow);\n setPendingWorkflow(null);\n setNodeCheck(null);\n }, [pendingWorkflow]);\n\n const newWorkflow = useMemo(\n () => ({\n id: id ?? \"\",\n workflowKey: id ?? \"\",\n version: version ?? \"\",\n name: \"Untitled Workflow\",\n edges: [] as IFlowState[\"workflow\"][\"edges\"],\n nodes: [] as IFlowState[\"workflow\"][\"nodes\"],\n sidebar: {\n active: \"store-browse\" as const,\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n }),\n [id, version],\n );\n\n useEffect(() => {\n let mounted = true;\n const loadWorkflow = async () => {\n try {\n // Always reset the store first\n resetWorkflow();\n\n // For versioned workflows, set loading so FlowBuilderPage unmounts\n // before Zustand is cleared. This prevents the flash of an empty\n // canvas when the component is reused across route navigations.\n if (version && mounted) {\n setIsLoading(true);\n }\n\n if (!version) {\n // Check for a manifest copied from a public shared workflow\n const fromSharedId =\n typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search).get(\"fromShared\")\n : null;\n const pendingManifestJson =\n fromSharedId && typeof localStorage !== \"undefined\"\n ? localStorage.getItem(\"pendingSharedWorkflow\")\n : null;\n\n if (fromSharedId && pendingManifestJson) {\n try {\n // Do NOT remove from localStorage here — React StrictMode double-fires\n // effects (mount → cleanup → mount). If we remove on the first run,\n // the second run finds null and falls through to an empty workflow.\n // We remove it inside `if (mounted)` so only the \"winning\" run\n // (the one whose mounted flag is still true) clears the entry.\n const manifest = JSON.parse(pendingManifestJson) as {\n nodes?: IFlowState[\"workflow\"][\"nodes\"];\n edges?: IFlowState[\"workflow\"][\"edges\"];\n name?: string;\n };\n\n const sharedWorkflow: IFlowState[\"workflow\"] = {\n ...newWorkflow,\n name: manifest.name ?? \"Copied Workflow\",\n nodes: manifest.nodes ?? [],\n edges: manifest.edges ?? [],\n };\n\n // Detect node types not installed in this workspace and resolve\n // each to its storeProductId so the modal can offer one-click installation.\n let requiredNodeTypes: WorkflowTemplateContent[\"requiredNodeTypes\"] =\n [];\n try {\n requiredNodeTypes = await buildRequiredNodeTypes(\n sharedWorkflow.nodes,\n );\n } catch {\n // Node check failed — skip dependency check and open anyway\n }\n\n if (mounted) {\n // Safe to clear now — this is the winning effect run.\n localStorage.removeItem(\"pendingSharedWorkflow\");\n\n if (requiredNodeTypes.length > 0) {\n // Use the ref so this effect doesn't re-run every time\n // installedAppIds changes (which would cause infinite mutations).\n const check = doNodeCheckRef.current(requiredNodeTypes);\n const needsConfig =\n check.missing.length > 0 || check.missingPaid.length > 0;\n\n if (needsConfig) {\n // Surface the install modal before creating the workflow\n // so the user can install missing nodes first.\n setPendingWorkflow(sharedWorkflow);\n setNodeCheck(check);\n setConfigModalOpen(true);\n setIsLoading(false);\n fromSharedLoadedRef.current = true;\n return;\n }\n }\n\n setWorkflow(sharedWorkflow);\n setIsLoading(false);\n fromSharedLoadedRef.current = true;\n }\n return;\n } catch (e) {\n console.error(\"[WorkflowItem] parse error:\", e);\n // Corrupted localStorage entry — only clear if we're the winning run.\n if (mounted) localStorage.removeItem(\"pendingSharedWorkflow\");\n }\n }\n\n // If a previous effect run already loaded the shared workflow, don't overwrite it\n if (fromSharedId && fromSharedLoadedRef.current) {\n if (mounted) setIsLoading(false);\n return;\n }\n\n if (mounted) {\n setWorkflow(newWorkflow);\n setIsLoading(false);\n }\n return;\n }\n\n // Use GraphQL to fetch workflow by workflowKey + version\n const result = await getWorkflow(id, undefined, version);\n const definitionJson = result?.definitionJson as {\n data?: WorkflowDefinitionData;\n nodes?: unknown[];\n edges?: unknown[];\n } | null;\n\n // Support both { data: { nodes, edges } } and flat { nodes, edges } structures\n const defData =\n definitionJson?.data ??\n (definitionJson?.nodes\n ? (definitionJson as unknown as WorkflowDefinitionData)\n : undefined);\n\n if (defData) {\n // Build the workflow state — store in ref regardless of mounted status so\n // a subsequent effect run can use it if its own getWorkflow call fails.\n const workflowState: IFlowState[\"workflow\"] = {\n ...defData,\n // Sticky notes are stored under a separate definition key — merge\n // them back onto the canvas alongside the executable nodes.\n nodes: mergeStickyNotes(defData) as IFlowState[\"workflow\"][\"nodes\"],\n id: result?.workflowKey ?? \"\",\n workflowKey: result?.workflowKey ?? \"\",\n version: result?.version ?? \"\",\n name: result?.name ?? \"\",\n alias: result?.alias ?? \"\",\n dbId: result?.id ?? \"\",\n status: result?.status ?? \"DRAFT\",\n };\n fetchedWorkflowRef.current = workflowState;\n\n // AI-assistant (and shared) workflows may reference nodes that are not\n // installed in this workspace. Offer one-click install before opening.\n let requiredNodeTypes: WorkflowTemplateContent[\"requiredNodeTypes\"] =\n [];\n try {\n requiredNodeTypes = await buildRequiredNodeTypes(\n workflowState.nodes,\n );\n } catch {\n // Node check failed — skip dependency check and open anyway\n }\n\n if (mounted && requiredNodeTypes.length > 0) {\n const check = doNodeCheckRef.current(requiredNodeTypes);\n if (check.missing.length > 0 || check.missingPaid.length > 0) {\n setPendingWorkflow(workflowState);\n setNodeCheck(check);\n setConfigModalOpen(true);\n setIsLoading(false);\n return;\n }\n }\n\n if (mounted) {\n setWorkflow(workflowState);\n }\n return;\n }\n\n if (mounted) {\n // If a previous effect run already fetched the workflow (but was cancelled),\n // use its result rather than trying to create a new workflow.\n if (fetchedWorkflowRef.current) {\n setWorkflow(fetchedWorkflowRef.current);\n return;\n }\n\n // Version-not-found guard: only mint a brand-new workflow when the\n // KEY has no versions at all (the Create Workflow path). If other\n // versions exist, a mistyped/removed version in the URL must NOT\n // silently create a real row — redirect to the newest version.\n const anyVersion = await getWorkflow(id, undefined, undefined);\n if (anyVersion?.workflowKey) {\n toast.info(`Version ${version} not found`, {\n description: `Opening ${anyVersion.version} instead.`,\n dismissible: true,\n });\n navigate(`../workflow/${id}/${anyVersion.version}`, {\n replace: true,\n });\n return;\n }\n\n // Workflow not found - CREATE it in the database\n if (!creatingRef.current) {\n creatingRef.current = true;\n const initialDefinitionJson = {\n key: id,\n name: newWorkflow.name,\n description: newWorkflow.name,\n workflow_type: \"query-conditional\",\n data: {\n ...newWorkflow,\n },\n meta: {\n creator: \"api_create\",\n version: version,\n },\n tags: [],\n };\n\n try {\n const created = await createWorkflow({\n workflowKey: id!,\n version: version!,\n name: newWorkflow.name,\n description: newWorkflow.name,\n definitionJson: initialDefinitionJson,\n });\n\n if (created && mounted) {\n setWorkflow({\n ...newWorkflow,\n id: created.workflowKey,\n workflowKey: created.workflowKey,\n version: created.version,\n dbId: created.id,\n status: created.status ?? \"DRAFT\",\n });\n } else if (mounted) {\n setWorkflow(newWorkflow);\n }\n } catch (createError) {\n console.error(\n \"[WorkflowItem] Error creating workflow:\",\n createError,\n );\n if (mounted) {\n setWorkflow(fetchedWorkflowRef.current ?? newWorkflow);\n }\n }\n }\n }\n } catch (error) {\n console.error(\"[WorkflowItem] Error loading workflow:\", error);\n if (mounted) {\n setWorkflow(fetchedWorkflowRef.current ?? newWorkflow);\n }\n } finally {\n if (mounted) {\n setIsLoading(false);\n creatingRef.current = false;\n }\n }\n };\n\n loadWorkflow();\n return () => {\n mounted = false;\n };\n }, [\n id,\n version,\n createWorkflow,\n getWorkflow,\n newWorkflow,\n resetWorkflow,\n navigate,\n // doNodeCheckRef is intentionally omitted — it's a ref (stable by definition)\n // and including doNodeCheck here caused infinite re-runs because installedAppIds\n // produces a new Set reference on every render.\n ]);\n\n if (isLoading)\n return (\n // Same loading treatment as the Available Nodes panel, centered on the\n // full canvas area while the workflow definition is fetched.\n <div className=\"flex h-full min-h-[60vh] w-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <Icon\n icon=\"mynaui:spinner\"\n className=\"size-6 animate-spin text-primary\"\n />\n <span className=\"text-sm text-foreground/60\">\n Loading workflow...\n </span>\n </div>\n </div>\n );\n\n return (\n <>\n {/* Missing-nodes modal shown before a workflow with uninstalled nodes is\n opened in the builder. Covers shared workflows and AI-assistant-created\n workflows that reference nodes not yet installed in the workspace. */}\n {configModalOpen && pendingWorkflow && (\n <Suspense fallback={null}>\n <LazyMissingNodesInstallModal\n open={configModalOpen}\n onOpenChange={(open) => {\n if (!open) {\n // Dismissed without confirming — open anyway (user can install later)\n handleSkipInstall();\n }\n }}\n workflowName={pendingWorkflow.name}\n nodeCheckResult={nodeCheck}\n onConfirm={handleInstallConfirm}\n onSkip={handleSkipInstall}\n installing={installing}\n installProgress={installProgress}\n installErrors={installErrors}\n />\n </Suspense>\n )}\n\n {workflow && !isLoading && <FlowBuilderPage workflow={workflow} />}\n </>\n );\n}\n","import WorkflowItem from \"../builder/app/workflow/work/page\";\nimport { ErrorBoundary } from \"@burdenoff/fe-libs/shared/components\";\nimport { useNavigate } from \"react-router\";\nimport \"@xyflow/react/dist/style.css\";\n\n/**\n * WorkflowBuilder page with ErrorBoundary for graceful crash recovery.\n * If the builder throws (React Flow error, node rendering crash, etc.),\n * the user sees a recovery UI instead of a blank screen.\n */\nexport function WorkflowBuilder() {\n const navigate = useNavigate();\n\n return (\n <ErrorBoundary\n fallback={(error) => (\n <div className=\"flex flex-col items-center justify-center min-h-[60vh] gap-4 p-8\">\n <div className=\"rounded-lg border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bg-subtle)] p-6 max-w-lg w-full text-center\">\n <h2 className=\"text-lg font-semibold text-[var(--color-status-error-text)] mb-2\">\n Workflow Builder Error\n </h2>\n <p className=\"text-sm text-[var(--color-text-secondary)] mb-4\">\n Something went wrong while loading the workflow builder. This may\n be caused by invalid workflow data or a rendering issue.\n </p>\n {error && (\n <details className=\"text-left mb-4\">\n <summary className=\"text-xs text-[var(--color-text-tertiary)] cursor-pointer hover:text-[var(--color-text-secondary)]\">\n Error details\n </summary>\n <pre className=\"mt-2 p-2 bg-[var(--color-bg-canvas)] rounded text-xs overflow-auto max-h-32 text-[var(--color-text-tertiary)]\">\n {error.message}\n </pre>\n </details>\n )}\n <div className=\"flex gap-3 justify-center\">\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"px-4 py-2 text-sm font-medium rounded-md bg-[var(--color-bg-accent)] text-[var(--color-text-on-accent)] hover:opacity-90 transition-opacity\"\n >\n Reload Page\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(\"../list\")}\n className=\"px-4 py-2 text-sm font-medium rounded-md border border-default text-[var(--color-text-secondary)] hover:bg-[var(--color-bg-elevated)] transition-colors\"\n >\n Back to Workflows\n </button>\n </div>\n </div>\n </div>\n )}\n >\n <WorkflowItem />\n </ErrorBoundary>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/builder/app/workflow/work/page.tsx","../src/pages/WorkflowBuilder.tsx"],"names":["useNavigate","jsx","jsxs"],"mappings":"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","file":"chunk-6DQDX6LD.js","sourcesContent":["import { useNavigate, useParams } from \"react-router\";\nimport { toast } from \"sonner\";\nimport { Icon } from \"@iconify/react\";\nimport { FlowBuilderPage } from \"../_components/flow-builder\";\nimport {\n useEffect,\n useState,\n useRef,\n useMemo,\n useCallback,\n lazy,\n Suspense,\n} from \"react\";\nimport { useFlowStore, type IFlowState } from \"../../../stores/flow-store\";\nimport {\n useLazyWorkflowDefinition,\n useCreateWorkflow,\n} from \"../../../../hooks/useWorkflows\";\nimport { useInstalledNodes } from \"../../../../hooks/store/useInstalledNodes\";\nimport { mergeStickyNotes } from \"../../../lib/sticky-notes\";\nimport type {\n TemplateNodeCheckResult,\n WorkflowTemplateContent,\n} from \"../../../../types/workflow-template-content\";\nimport {\n buildRequiredNodeTypes,\n buildNodeCheck,\n} from \"../../../../utils/workflow-node-check\";\nimport { refetchStoreNodes } from \"../../../components/flow-builder/components/blocks\";\n\n// Lazy-load the modal to avoid bundle-size impact on routes that never hit it.\nconst LazyMissingNodesInstallModal = lazy(() =>\n import(\"../../../components/flow-builder/components/templates/MissingNodesInstallModal\").then(\n (m) => ({ default: m.MissingNodesInstallModal }),\n ),\n);\n\ninterface WorkflowDefinitionData {\n nodes: IFlowState[\"workflow\"][\"nodes\"];\n edges: IFlowState[\"workflow\"][\"edges\"];\n sidebar: IFlowState[\"workflow\"][\"sidebar\"];\n /** Canvas annotations persisted separately from executable nodes. */\n stickyNotes?: IFlowState[\"workflow\"][\"nodes\"];\n}\n\nexport default function WorkflowItem({\n readonly = false,\n}: {\n readonly?: boolean;\n}) {\n if (readonly) {\n const queryParams = new URLSearchParams(window.location.search);\n queryParams.set(\"readonly\", \"true\");\n const newUrl = `${window.location.pathname}?${queryParams.toString()}`;\n window.history.replaceState(null, \"\", newUrl);\n }\n const { id, version } = useParams();\n const navigate = useNavigate();\n const [workflow, setWorkflow] = useState<IFlowState[\"workflow\"] | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n const { getWorkflow } = useLazyWorkflowDefinition();\n const { createWorkflow } = useCreateWorkflow();\n const creatingRef = useRef(false);\n const fromSharedLoadedRef = useRef(false);\n const fetchedWorkflowRef = useRef<IFlowState[\"workflow\"] | null>(null);\n\n // ── Missing-nodes modal state ────────────────────────────────────────────\n const { installedAppIds } = useInstalledNodes();\n const [pendingWorkflow, setPendingWorkflow] = useState<\n IFlowState[\"workflow\"] | null\n >(null);\n const [nodeCheck, setNodeCheck] = useState<TemplateNodeCheckResult | null>(\n null,\n );\n const [configModalOpen, setConfigModalOpen] = useState(false);\n const [installing, setInstalling] = useState(false);\n const [installProgress, setInstallProgress] = useState<{\n current: number;\n total: number;\n nodeName: string;\n } | null>(null);\n const [installErrors, setInstallErrors] = useState<string[]>([]);\n\n // Classify requiredNodeTypes into installed / missing / missingPaid.\n const doNodeCheck = useCallback(\n (requiredNodeTypes: Parameters<typeof buildNodeCheck>[0]) =>\n buildNodeCheck(requiredNodeTypes, installedAppIds),\n [installedAppIds],\n );\n\n // Keep a ref so the loadWorkflow effect can call doNodeCheck without\n // taking it as a reactive dependency (which would re-trigger the effect\n // on every render and cause infinite CreateWorkflowDefinition mutations).\n const doNodeCheckRef = useRef(doNodeCheck);\n useEffect(() => {\n doNodeCheckRef.current = doNodeCheck;\n });\n\n // Install missing free nodes then open the pending workflow in the builder.\n const handleInstallConfirm = useCallback(async () => {\n if (!pendingWorkflow) return;\n // `missing` now holds only nodes the store can actually install;\n // store-unavailable ones are reported separately (BOFF-7267).\n const nodesToInstall = (nodeCheck?.missing ?? []).filter(\n (n) => !!n.storeProductId,\n );\n const failed: string[] = [];\n\n if (nodesToInstall.length > 0) {\n setInstalling(true);\n setInstallErrors([]);\n try {\n const { getGlobalStoreClient } =\n await import(\"../../../../graphql/global-client\");\n const { InstallWorkflowNodeDocument } =\n await import(\"../../../../generated/global-operations\");\n const { getFluidGridsConfig } = await import(\"../../../../config\");\n\n const storeClient = getGlobalStoreClient();\n const cfg = getFluidGridsConfig();\n\n for (let i = 0; i < nodesToInstall.length; i++) {\n const node = nodesToInstall[i];\n setInstallProgress({\n current: i + 1,\n total: nodesToInstall.length,\n nodeName: node.displayName || node.nodeType,\n });\n try {\n if (storeClient) {\n await storeClient.mutate({\n mutation: InstallWorkflowNodeDocument,\n variables: {\n input: {\n productId: node.storeProductId!,\n workspaceId: cfg.workspaceId,\n organizationId: cfg.tenantId,\n version: node.nodeVersion,\n manifest: null,\n },\n },\n });\n }\n } catch {\n // Keep installing the rest, but remember what failed so the user\n // is told instead of the dialog silently closing (BOFF-7267).\n failed.push(node.displayName || node.nodeType);\n }\n }\n\n // Refresh the in-memory node registry so the builder renders the\n // newly-installed nodes with their real manifests and operations.\n await refetchStoreNodes();\n } finally {\n setInstalling(false);\n setInstallProgress(null);\n }\n }\n\n if (failed.length > 0) {\n // Hold the dialog open so the failure is visible and retryable; the user\n // can still choose \"Open Without Installing\".\n setInstallErrors(failed);\n return;\n }\n\n setInstallErrors([]);\n setConfigModalOpen(false);\n setWorkflow(pendingWorkflow);\n setPendingWorkflow(null);\n setNodeCheck(null);\n }, [pendingWorkflow, nodeCheck]);\n\n const handleSkipInstall = useCallback(() => {\n if (!pendingWorkflow) return;\n setConfigModalOpen(false);\n setWorkflow(pendingWorkflow);\n setPendingWorkflow(null);\n setNodeCheck(null);\n }, [pendingWorkflow]);\n\n const newWorkflow = useMemo(\n () => ({\n id: id ?? \"\",\n workflowKey: id ?? \"\",\n version: version ?? \"\",\n name: \"Untitled Workflow\",\n edges: [] as IFlowState[\"workflow\"][\"edges\"],\n nodes: [] as IFlowState[\"workflow\"][\"nodes\"],\n sidebar: {\n active: \"store-browse\" as const,\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n }),\n [id, version],\n );\n\n useEffect(() => {\n let mounted = true;\n const loadWorkflow = async () => {\n try {\n // Always reset the store first\n resetWorkflow();\n\n // For versioned workflows, set loading so FlowBuilderPage unmounts\n // before Zustand is cleared. This prevents the flash of an empty\n // canvas when the component is reused across route navigations.\n if (version && mounted) {\n setIsLoading(true);\n }\n\n if (!version) {\n // Check for a manifest copied from a public shared workflow\n const fromSharedId =\n typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search).get(\"fromShared\")\n : null;\n const pendingManifestJson =\n fromSharedId && typeof localStorage !== \"undefined\"\n ? localStorage.getItem(\"pendingSharedWorkflow\")\n : null;\n\n if (fromSharedId && pendingManifestJson) {\n try {\n // Do NOT remove from localStorage here — React StrictMode double-fires\n // effects (mount → cleanup → mount). If we remove on the first run,\n // the second run finds null and falls through to an empty workflow.\n // We remove it inside `if (mounted)` so only the \"winning\" run\n // (the one whose mounted flag is still true) clears the entry.\n const manifest = JSON.parse(pendingManifestJson) as {\n nodes?: IFlowState[\"workflow\"][\"nodes\"];\n edges?: IFlowState[\"workflow\"][\"edges\"];\n name?: string;\n };\n\n const sharedWorkflow: IFlowState[\"workflow\"] = {\n ...newWorkflow,\n name: manifest.name ?? \"Copied Workflow\",\n nodes: manifest.nodes ?? [],\n edges: manifest.edges ?? [],\n };\n\n // Detect node types not installed in this workspace and resolve\n // each to its storeProductId so the modal can offer one-click installation.\n let requiredNodeTypes: WorkflowTemplateContent[\"requiredNodeTypes\"] =\n [];\n try {\n requiredNodeTypes = await buildRequiredNodeTypes(\n sharedWorkflow.nodes,\n );\n } catch {\n // Node check failed — skip dependency check and open anyway\n }\n\n if (mounted) {\n // Safe to clear now — this is the winning effect run.\n localStorage.removeItem(\"pendingSharedWorkflow\");\n\n if (requiredNodeTypes.length > 0) {\n // Use the ref so this effect doesn't re-run every time\n // installedAppIds changes (which would cause infinite mutations).\n const check = doNodeCheckRef.current(requiredNodeTypes);\n const needsConfig =\n check.missing.length > 0 || check.missingPaid.length > 0;\n\n if (needsConfig) {\n // Surface the install modal before creating the workflow\n // so the user can install missing nodes first.\n setPendingWorkflow(sharedWorkflow);\n setNodeCheck(check);\n setConfigModalOpen(true);\n setIsLoading(false);\n fromSharedLoadedRef.current = true;\n return;\n }\n }\n\n setWorkflow(sharedWorkflow);\n setIsLoading(false);\n fromSharedLoadedRef.current = true;\n }\n return;\n } catch (e) {\n console.error(\"[WorkflowItem] parse error:\", e);\n // Corrupted localStorage entry — only clear if we're the winning run.\n if (mounted) localStorage.removeItem(\"pendingSharedWorkflow\");\n }\n }\n\n // If a previous effect run already loaded the shared workflow, don't overwrite it\n if (fromSharedId && fromSharedLoadedRef.current) {\n if (mounted) setIsLoading(false);\n return;\n }\n\n if (mounted) {\n setWorkflow(newWorkflow);\n setIsLoading(false);\n }\n return;\n }\n\n // Use GraphQL to fetch workflow by workflowKey + version\n const result = await getWorkflow(id, undefined, version);\n const definitionJson = result?.definitionJson as {\n data?: WorkflowDefinitionData;\n nodes?: unknown[];\n edges?: unknown[];\n } | null;\n\n // Support both { data: { nodes, edges } } and flat { nodes, edges } structures\n const defData =\n definitionJson?.data ??\n (definitionJson?.nodes\n ? (definitionJson as unknown as WorkflowDefinitionData)\n : undefined);\n\n if (defData) {\n // Build the workflow state — store in ref regardless of mounted status so\n // a subsequent effect run can use it if its own getWorkflow call fails.\n const workflowState: IFlowState[\"workflow\"] = {\n ...defData,\n // Sticky notes are stored under a separate definition key — merge\n // them back onto the canvas alongside the executable nodes.\n nodes: mergeStickyNotes(defData) as IFlowState[\"workflow\"][\"nodes\"],\n id: result?.workflowKey ?? \"\",\n workflowKey: result?.workflowKey ?? \"\",\n version: result?.version ?? \"\",\n name: result?.name ?? \"\",\n alias: result?.alias ?? \"\",\n dbId: result?.id ?? \"\",\n status: result?.status ?? \"DRAFT\",\n };\n fetchedWorkflowRef.current = workflowState;\n\n // AI-assistant (and shared) workflows may reference nodes that are not\n // installed in this workspace. Offer one-click install before opening.\n let requiredNodeTypes: WorkflowTemplateContent[\"requiredNodeTypes\"] =\n [];\n try {\n requiredNodeTypes = await buildRequiredNodeTypes(\n workflowState.nodes,\n );\n } catch {\n // Node check failed — skip dependency check and open anyway\n }\n\n if (mounted && requiredNodeTypes.length > 0) {\n const check = doNodeCheckRef.current(requiredNodeTypes);\n if (check.missing.length > 0 || check.missingPaid.length > 0) {\n setPendingWorkflow(workflowState);\n setNodeCheck(check);\n setConfigModalOpen(true);\n setIsLoading(false);\n return;\n }\n }\n\n if (mounted) {\n setWorkflow(workflowState);\n }\n return;\n }\n\n if (mounted) {\n // If a previous effect run already fetched the workflow (but was cancelled),\n // use its result rather than trying to create a new workflow.\n if (fetchedWorkflowRef.current) {\n setWorkflow(fetchedWorkflowRef.current);\n return;\n }\n\n // Version-not-found guard: only mint a brand-new workflow when the\n // KEY has no versions at all (the Create Workflow path). If other\n // versions exist, a mistyped/removed version in the URL must NOT\n // silently create a real row — redirect to the newest version.\n const anyVersion = await getWorkflow(id, undefined, undefined);\n if (anyVersion?.workflowKey) {\n toast.info(`Version ${version} not found`, {\n description: `Opening ${anyVersion.version} instead.`,\n dismissible: true,\n });\n navigate(`../workflow/${id}/${anyVersion.version}`, {\n replace: true,\n });\n return;\n }\n\n // Workflow not found - CREATE it in the database\n if (!creatingRef.current) {\n creatingRef.current = true;\n const initialDefinitionJson = {\n key: id,\n name: newWorkflow.name,\n description: newWorkflow.name,\n workflow_type: \"query-conditional\",\n data: {\n ...newWorkflow,\n },\n meta: {\n creator: \"api_create\",\n version: version,\n },\n tags: [],\n };\n\n try {\n const created = await createWorkflow({\n workflowKey: id!,\n version: version!,\n name: newWorkflow.name,\n description: newWorkflow.name,\n definitionJson: initialDefinitionJson,\n });\n\n if (created && mounted) {\n setWorkflow({\n ...newWorkflow,\n id: created.workflowKey,\n workflowKey: created.workflowKey,\n version: created.version,\n dbId: created.id,\n status: created.status ?? \"DRAFT\",\n });\n } else if (mounted) {\n setWorkflow(newWorkflow);\n }\n } catch (createError) {\n console.error(\n \"[WorkflowItem] Error creating workflow:\",\n createError,\n );\n if (mounted) {\n setWorkflow(fetchedWorkflowRef.current ?? newWorkflow);\n }\n }\n }\n }\n } catch (error) {\n console.error(\"[WorkflowItem] Error loading workflow:\", error);\n if (mounted) {\n setWorkflow(fetchedWorkflowRef.current ?? newWorkflow);\n }\n } finally {\n if (mounted) {\n setIsLoading(false);\n creatingRef.current = false;\n }\n }\n };\n\n loadWorkflow();\n return () => {\n mounted = false;\n };\n }, [\n id,\n version,\n createWorkflow,\n getWorkflow,\n newWorkflow,\n resetWorkflow,\n navigate,\n // doNodeCheckRef is intentionally omitted — it's a ref (stable by definition)\n // and including doNodeCheck here caused infinite re-runs because installedAppIds\n // produces a new Set reference on every render.\n ]);\n\n if (isLoading)\n return (\n // Same loading treatment as the Available Nodes panel, centered on the\n // full canvas area while the workflow definition is fetched.\n <div className=\"flex h-full min-h-[60vh] w-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <Icon\n icon=\"mynaui:spinner\"\n className=\"size-6 animate-spin text-primary\"\n />\n <span className=\"text-sm text-foreground/60\">\n Loading workflow...\n </span>\n </div>\n </div>\n );\n\n return (\n <>\n {/* Missing-nodes modal shown before a workflow with uninstalled nodes is\n opened in the builder. Covers shared workflows and AI-assistant-created\n workflows that reference nodes not yet installed in the workspace. */}\n {configModalOpen && pendingWorkflow && (\n <Suspense fallback={null}>\n <LazyMissingNodesInstallModal\n open={configModalOpen}\n onOpenChange={(open) => {\n if (!open) {\n // Dismissed without confirming — open anyway (user can install later)\n handleSkipInstall();\n }\n }}\n workflowName={pendingWorkflow.name}\n nodeCheckResult={nodeCheck}\n onConfirm={handleInstallConfirm}\n onSkip={handleSkipInstall}\n installing={installing}\n installProgress={installProgress}\n installErrors={installErrors}\n />\n </Suspense>\n )}\n\n {workflow && !isLoading && <FlowBuilderPage workflow={workflow} />}\n </>\n );\n}\n","import WorkflowItem from \"../builder/app/workflow/work/page\";\nimport { ErrorBoundary } from \"@burdenoff/fe-libs/shared/components\";\nimport { useNavigate } from \"react-router\";\nimport \"@xyflow/react/dist/style.css\";\n\n/**\n * WorkflowBuilder page with ErrorBoundary for graceful crash recovery.\n * If the builder throws (React Flow error, node rendering crash, etc.),\n * the user sees a recovery UI instead of a blank screen.\n */\nexport function WorkflowBuilder() {\n const navigate = useNavigate();\n\n return (\n <ErrorBoundary\n fallback={(error) => (\n <div className=\"flex flex-col items-center justify-center min-h-[60vh] gap-4 p-8\">\n <div className=\"rounded-lg border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bg-subtle)] p-6 max-w-lg w-full text-center\">\n <h2 className=\"text-lg font-semibold text-[var(--color-status-error-text)] mb-2\">\n Workflow Builder Error\n </h2>\n <p className=\"text-sm text-[var(--color-text-secondary)] mb-4\">\n Something went wrong while loading the workflow builder. This may\n be caused by invalid workflow data or a rendering issue.\n </p>\n {error && (\n <details className=\"text-left mb-4\">\n <summary className=\"text-xs text-[var(--color-text-tertiary)] cursor-pointer hover:text-[var(--color-text-secondary)]\">\n Error details\n </summary>\n <pre className=\"mt-2 p-2 bg-[var(--color-bg-canvas)] rounded text-xs overflow-auto max-h-32 text-[var(--color-text-tertiary)]\">\n {error.message}\n </pre>\n </details>\n )}\n <div className=\"flex gap-3 justify-center\">\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"px-4 py-2 text-sm font-medium rounded-md bg-[var(--color-bg-accent)] text-[var(--color-text-on-accent)] hover:opacity-90 transition-opacity\"\n >\n Reload Page\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(\"../list\")}\n className=\"px-4 py-2 text-sm font-medium rounded-md border border-default text-[var(--color-text-secondary)] hover:bg-[var(--color-bg-elevated)] transition-colors\"\n >\n Back to Workflows\n </button>\n </div>\n </div>\n </div>\n )}\n >\n <WorkflowItem />\n </ErrorBoundary>\n );\n}\n"]}
@@ -8916,6 +8916,53 @@ function buildNodeCheck(requiredNodeTypes, installedAppIds) {
8916
8916
  canImport: missingPaid.length === 0
8917
8917
  };
8918
8918
  }
8919
+ var FLUIDGRIDS_BRAND = "FluidGrids";
8920
+ var FLUIDGRIDS_SITE_URL = "https://www.fluidgrids.ai";
8921
+ var ENGLISH_LABEL = `Powered by ${FLUIDGRIDS_BRAND}`;
8922
+ function resolveFluidGridsMarkLabel(tr) {
8923
+ const translated = tr(
8924
+ "fluidgrids.components.fluidGridsMark.poweredBy",
8925
+ "Powered by {{brand}}",
8926
+ { brand: FLUIDGRIDS_BRAND }
8927
+ );
8928
+ return typeof translated === "string" && translated.includes(FLUIDGRIDS_BRAND) ? translated : ENGLISH_LABEL;
8929
+ }
8930
+ function FluidGridsMark() {
8931
+ const tr = useTr();
8932
+ const label = resolveFluidGridsMarkLabel(tr);
8933
+ return /* @__PURE__ */ jsxs(
8934
+ "a",
8935
+ {
8936
+ href: FLUIDGRIDS_SITE_URL,
8937
+ target: "_blank",
8938
+ rel: "noopener noreferrer",
8939
+ className: "absolute right-3 top-3 z-10 flex items-center gap-1.5 whitespace-nowrap rounded-full border border-card-foreground/10 bg-card/90 px-2.5 py-1 text-[11px] font-medium text-card-foreground shadow-sm backdrop-blur transition-opacity hover:opacity-90",
8940
+ children: [
8941
+ /* @__PURE__ */ jsx(FluidGridsGlyph, {}),
8942
+ label
8943
+ ]
8944
+ }
8945
+ );
8946
+ }
8947
+ function FluidGridsGlyph() {
8948
+ return /* @__PURE__ */ jsx(
8949
+ "svg",
8950
+ {
8951
+ viewBox: "90 92 332 332",
8952
+ "aria-hidden": "true",
8953
+ focusable: "false",
8954
+ className: "size-3.5 shrink-0 text-primary",
8955
+ children: /* @__PURE__ */ jsx(
8956
+ "path",
8957
+ {
8958
+ fill: "currentColor",
8959
+ fillRule: "evenodd",
8960
+ d: "M256 96C256 96 372 232 372 312C372 376 320 420 256 420C192 420 140 376 140 312C140 232 256 96 256 96ZM256 176C238 210 210 244 210 296C210 332 234 356 268 360C236 348 230 322 244 296C258 270 270 230 256 176ZM278 268h40v40h-40ZM330 268h40v40h-40ZM278 320h40v40h-40ZM330 320h40v40h-40Z"
8961
+ }
8962
+ )
8963
+ }
8964
+ );
8965
+ }
8919
8966
  function useNodeList(nodes) {
8920
8967
  return useMemo(() => {
8921
8968
  return nodes.slice().sort((a, b) => {
@@ -22349,6 +22396,9 @@ var LIST_WORKFLOWS_QUERY = gql`
22349
22396
  }
22350
22397
  }
22351
22398
  `;
22399
+ function formatVersion(version) {
22400
+ return /^v/i.test(version) ? version : `v${version}`;
22401
+ }
22352
22402
  function WorkflowPickerField({
22353
22403
  value,
22354
22404
  onChange,
@@ -22466,8 +22516,8 @@ function WorkflowPickerField({
22466
22516
  /* @__PURE__ */ jsx("span", { className: "text-sm text-foreground", children: workflow.name }),
22467
22517
  /* @__PURE__ */ jsxs("span", { className: "font-mono text-[10px] text-muted-foreground", children: [
22468
22518
  workflow.workflowKey,
22469
- " \xB7 v",
22470
- workflow.version,
22519
+ " \xB7 ",
22520
+ formatVersion(workflow.version),
22471
22521
  " \xB7",
22472
22522
  " ",
22473
22523
  workflow.status
@@ -25873,6 +25923,7 @@ var FlowBuilder = ({ readOnly = false }) => {
25873
25923
  children: /* @__PURE__ */ jsx(Background, { gap: 24 })
25874
25924
  }
25875
25925
  ),
25926
+ /* @__PURE__ */ jsx(FluidGridsMark, {}),
25876
25927
  nodes.length === 0 && !isReadOnly && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-3 text-center", children: [
25877
25928
  /* @__PURE__ */ jsx("div", { className: "size-16 flex items-center justify-center rounded-full bg-primary/10 border-2 border-dashed border-primary/30", children: /* @__PURE__ */ jsx(
25878
25929
  Icon,
@@ -25988,6 +26039,6 @@ var FlowBuilderPage = ({
25988
26039
  ] });
25989
26040
  };
25990
26041
 
25991
- export { Card2 as Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ConnectionFormDialog, ConnectionSelector, EntityTagPicker, FLUIDGRIDS_ENTITY_TYPES, FlowBuilderPage, FluidGridsProvider, ProviderPicker, SchemaConnectionForm, ScopePicker, TemplateCard, buildNodeCheck, buildRequiredNodeTypes, listCustomBlocks, mergeStickyNotes, refetchStoreNodes, registerCustomBlock, resolveUiSpec, stripSubmitActions, tagLabel, useAvailableTags, useConnection, useConnectionDialog, useConnections, useConnectionsByProvider, useCreateConnection, useCreateTag, useDraftEntityTags, useEntityTags, useFluidGridsContext, useImportWorkflowTemplate, useInitiateOAuth, useInstalledNodes, useNodeExecution, useProviderByKey, useProviderCatalog, useProviders, useReplaceEntityTags, useSearchTags, useTagEntity, useUntagEntity, useWorkflowTemplates };
25992
- //# sourceMappingURL=chunk-KUPUHY7N.js.map
25993
- //# sourceMappingURL=chunk-KUPUHY7N.js.map
26042
+ export { Card2 as Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ConnectionFormDialog, ConnectionSelector, EntityTagPicker, FLUIDGRIDS_ENTITY_TYPES, FlowBuilderPage, FluidGridsMark, FluidGridsProvider, ProviderPicker, SchemaConnectionForm, ScopePicker, TemplateCard, buildNodeCheck, buildRequiredNodeTypes, listCustomBlocks, mergeStickyNotes, refetchStoreNodes, registerCustomBlock, resolveUiSpec, stripSubmitActions, tagLabel, useAvailableTags, useConnection, useConnectionDialog, useConnections, useConnectionsByProvider, useCreateConnection, useCreateTag, useDraftEntityTags, useEntityTags, useFluidGridsContext, useImportWorkflowTemplate, useInitiateOAuth, useInstalledNodes, useNodeExecution, useProviderByKey, useProviderCatalog, useProviders, useReplaceEntityTags, useSearchTags, useTagEntity, useUntagEntity, useWorkflowTemplates };
26043
+ //# sourceMappingURL=chunk-6SXISR7B.js.map
26044
+ //# sourceMappingURL=chunk-6SXISR7B.js.map