@burdenoff/fluidgrids-fe-sdk 2026.1111.19 → 2026.1111.21

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 (51) hide show
  1. package/dist/{AiStudioPage-htYcXz43.js → AiStudioPage-CJdzRL26.js} +4 -4
  2. package/dist/ConnectionFormDialog-Bg9_OdHX.js +119 -0
  3. package/dist/{DataSinkDashboardPage-1h2QsMzH.js → DataSinkDashboardPage-hrwQSvks.js} +1 -1
  4. package/dist/{ExecutionDetailPage-BdcZmLT4.js → ExecutionDetailPage-DKp421Fj.js} +61 -14
  5. package/dist/{ExecutionsListPage-BCUJoAIE.js → ExecutionsListPage-DwJQfDPt.js} +4 -4
  6. package/dist/{FluidGridsProvider-dvZSNtSW.js → FluidGridsProvider-CbY91ZQq.js} +416 -99
  7. package/dist/{HistoryPage-U0tqupBN.js → HistoryPage-BLXZJDoJ.js} +1 -1
  8. package/dist/{InsightsPage-CALo16eB.js → InsightsPage-ChnoW5U4.js} +1 -1
  9. package/dist/{MissingNodesInstallModal-Dly7T2_7.js → MissingNodesInstallModal-mYFfy9Gg.js} +1 -1
  10. package/dist/{QuotaExhaustedDialog-7IFSaLyi.js → QuotaExhaustedDialog-DWm_YWL7.js} +1 -1
  11. package/dist/{SettingsPage-CJLZvv4J.js → SettingsPage-CXoKX0px.js} +2 -2
  12. package/dist/{TemplateCard-BdB087SP.js → TemplateCard-HIMsb47R.js} +2 -2
  13. package/dist/{TemplateConfigurationModal-CPVcTDSi.js → TemplateConfigurationModal-BNtbJ2fv.js} +1 -1
  14. package/dist/{TemplateDetailPanel-DruadMkg.js → TemplateDetailPanel-C6Zh2WRF.js} +1 -1
  15. package/dist/{TemplatePreview-CNrYJXw2.js → TemplatePreview-_wUMSwh_.js} +3 -3
  16. package/dist/{TemplatesPage-BU4tSqOo.js → TemplatesPage-DBfL-ao9.js} +4 -4
  17. package/dist/{WorkflowBuilder-DMonxuoY.js → WorkflowBuilder-CMZi6wQE.js} +7 -7
  18. package/dist/{WorkflowBuilder-BSPGcOfA.js → WorkflowBuilder-CYmpQtIQ.js} +3 -3
  19. package/dist/{WorkflowSearchRedirect-DwDNZ_q5.js → WorkflowSearchRedirect-iWzvY9Qo.js} +1 -1
  20. package/dist/{WorkflowsList-DiiGyZkT.js → WorkflowsList-C8aoqtRE.js} +5 -5
  21. package/dist/{agentTools-C7pdNJqE.js → agentTools-CrEWQ5st.js} +3 -4
  22. package/dist/askAboutBridge-BV8m95kk.js +65 -0
  23. package/dist/assistant.d.ts +30 -1
  24. package/dist/assistant.js +2 -1
  25. package/dist/{canvasNoteTools-CqiPTBa1.js → canvasNoteTools-6BQYNCee.js} +2 -2
  26. package/dist/{code-editor-field-9-GdVE_8.js → code-editor-field-CoRq10k7.js} +1 -1
  27. package/dist/executions.js +2 -2
  28. package/dist/{flow-builder-CV5Zu_Hq.js → flow-builder-Dwev-C_g.js} +191 -173
  29. package/dist/history.js +1 -1
  30. package/dist/index.js +25 -24
  31. package/dist/{node-detail-view-ttMp6H6K.js → node-detail-view-BFBSKj5w.js} +5 -5
  32. package/dist/{node-editor-tab-body-Bqb--pZy.js → node-editor-tab-body-Cz9kOlxu.js} +2 -2
  33. package/dist/observability.js +2 -2
  34. package/dist/{popover-BbVOHsfO.js → popover-xPh0iIzy.js} +2 -2
  35. package/dist/preloadable-lazy-Pp47mqQ9.js +65 -0
  36. package/dist/{quick-config-panel-Da4uOVSs.js → quick-config-panel-Ym05lyGn.js} +3 -3
  37. package/dist/{schedule-panel-DnFN933b.js → schedule-panel-54D5W5Qk.js} +4 -4
  38. package/dist/settings.js +1 -1
  39. package/dist/{sidebar-node-editor-lcnIZxdR.js → sidebar-node-editor-LL3ofDN7.js} +3 -3
  40. package/dist/templates.js +2 -2
  41. package/dist/{useDurableParity-CzUQMFJ3.js → useDurableParity-BScby67i.js} +1 -1
  42. package/dist/{useExecutions-9aLuOt1c.js → useExecutions-B0VzQcY2.js} +1 -1
  43. package/dist/{useObservability-CfEw3ZFD.js → useObservability-FfQGgW6W.js} +1 -1
  44. package/dist/{useRunHistory-B1xJDwl1.js → useRunHistory-BZJg72kd.js} +1 -1
  45. package/dist/{useWorkflowCodeExport-Bu2QYJzA.js → useWorkflowCodeExport-CUWMlJbi.js} +1 -1
  46. package/dist/{useWorkflows-BlVVu8NM.js → useWorkflows-Czz5DlL0.js} +1 -1
  47. package/dist/workflow-builder.js +4 -4
  48. package/dist/workflow-pages.d.ts +19 -19
  49. package/dist/workflow-pages.js +16 -24
  50. package/dist/workflows-list.js +1 -1
  51. package/package.json +1 -1
@@ -1,9 +1,10 @@
1
1
  "use client";
2
2
  import { B as NODE_TYPE_DRAG_DATA_FORMAT, G as isTriggerOperation, H as useFlowStore, M as isImageIcon, T as resolveInputHandles, U as useIsValidConnection, V as STICKY_NOTE_TYPE, j as NodeTypeIcon, r as CODE_WORKFLOW_NODE_TYPE, z as NODE_OPERATION_DRAG_DATA_FORMAT } from "./node-operation-selection--oy-yEq_.js";
3
- import { $t as inAppLeaveTarget, At as useSaveStatusStore, B as useRunGuard, Bt as shouldReleaseForIdle, Ct as useSaveWorkflow, D as InstallWorkflowNodeDocument, E as InstallPurchasedNodeDocument, F as getNodeMetadata, Fn as useBuilderReadOnly, Ft as leaseCallQueue, Gt as sessionBeforeReload, Ht as EDIT_SESSION_ID, I as buildOperationSeed, It as leaseCallSequence, Jt as AUTOSAVE_DEBOUNCE_MS, Kt as rememberOwnStatusChange, Lt as phaseAfterAcquire, M as UninstallOrganizationPrivateNodeDocument, Mn as getNodeDetail, Mt as useEditLeaseStore, N as UninstallWorkflowNodeDocument, Nn as buildStickyNode, Nt as bannerOf, Ot as refusalOfQuota, Pn as BuilderReadOnlyProvider, Pt as isLocked, R as useInsertNode, Rt as phaseAfterTakeOver, S as CreateStoreOrderDocument, St as useFlowValidator, T as InstallOrganizationPrivateNodeDocument, Ut as forgetSessionForReload, V as workflowParameterIssues, Vt as tickAction, Wt as rememberSessionForReload, Xt as canAutosave, Yt as AUTOSAVE_RETRY_DELAYS_MS, _t as leavingLosesChanges, a as NODES_METADATA, b as BrowseWorkflowNodesDocument, bt as watchLeavingLosesChanges, dt as useGuardedNavigate, en as resettledBaseline, f as isNodeConfigsInitialized, ft as useManualSave, g as registerWorkflowNodeTypes, gn as useNodeRegistryRevision, gt as editingLeaseLocked, hn as useCanvasEdges, ht as editStateFor, i as AVAILABLE_NODES, jt as useEditLeaseLocked, k as OrganizationPrivateNodesDocument, kt as saveIndicatorOf, l as ensureNodeConfigsLoaded, m as refetchStoreNodes, mt as departingSave, nn as workflowFingerprint, o as NODE_CONFIGS, p as onNodeTypesUpdate, pt as autosaveAllowedFor, qt as rememberRevision, rn as useNodeExecution, s as NODE_TYPES, t as FluidGridsContext, tn as saveFailureActionOf, v as scheduleNodePaletteLoad, vn as loadDefinitionJson, vt as savedEverythingBeforeLeaving, w as GetNodeInstallableVersionsDocument, xt as isFlowComplete, yt as touchesSavedFields, z as MissingParametersDialog, zt as releasesOnClose } from "./FluidGridsProvider-dvZSNtSW.js";
3
+ import { $t as canAutosave, Bn as useBuilderReadOnly, Bt as phaseAfterAcquire, Ct as watchLeavingLosesChanges, D as InstallWorkflowNodeDocument, E as InstallPurchasedNodeDocument, Et as useSaveWorkflow, F as getNodeMetadata, Fn as getNodeDetail, Ft as useEditLeaseStore, Gt as EDIT_SESSION_ID, H as MissingParametersDialog, Ht as releasesOnClose, In as buildStickyNode, It as bannerOf, Jt as sessionBeforeReload, Kt as forgetSessionForReload, Ln as loadMarkdown, Lt as isLocked, M as UninstallOrganizationPrivateNodeDocument, Mt as saveIndicatorOf, N as UninstallWorkflowNodeDocument, Nt as useSaveStatusStore, Pt as useEditLeaseLocked, Qt as AUTOSAVE_RETRY_DELAYS_MS, Rn as useMarkdownRenderer, Rt as leaseCallQueue, S as CreateStoreOrderDocument, St as touchesSavedFields, T as InstallOrganizationPrivateNodeDocument, Tt as useFlowValidator, U as useRunGuard, Ut as shouldReleaseForIdle, V as useInsertNode, Vt as phaseAfterTakeOver, W as workflowParameterIssues, Wt as tickAction, Xt as rememberRevision, Yt as rememberOwnStatusChange, Zt as AUTOSAVE_DEBOUNCE_MS, _t as departingSave, a as NODES_METADATA, an as workflowFingerprint, b as BrowseWorkflowNodesDocument, bt as leavingLosesChanges, f as isNodeConfigsInitialized, g as registerWorkflowNodeTypes, gt as autosaveAllowedFor, ht as useManualSave, i as AVAILABLE_NODES, in as saveFailureActionOf, jt as refusalOfQuota, k as OrganizationPrivateNodesDocument, l as ensureNodeConfigsLoaded, m as refetchStoreNodes, mt as useGuardedNavigate, nn as inAppLeaveTarget, o as NODE_CONFIGS, on as useNodeExecution, p as onNodeTypesUpdate, qt as rememberSessionForReload, rn as resettledBaseline, s as NODE_TYPES, t as FluidGridsContext, v as scheduleNodePaletteLoad, vn as useCanvasEdges, vt as editStateFor, w as GetNodeInstallableVersionsDocument, wt as isFlowComplete, xn as loadDefinitionJson, xt as savedEverythingBeforeLeaving, yn as useNodeRegistryRevision, yt as editingLeaseLocked, z as buildOperationSeed, zn as BuilderReadOnlyProvider, zt as leaseCallSequence } from "./FluidGridsProvider-CbY91ZQq.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
+ import { n as preloadableLazy } from "./preloadable-lazy-Pp47mqQ9.js";
5
6
  import { a as DialogFooter$1, d as Input$1, i as DialogDescription$1, l as DialogTitle$1, o as DialogHeader$1, r as DialogContent$1, t as Dialog$1 } from "./dialog-Cjb4lB4D.js";
6
- import { _ as storeNodeInstallVersion, a as useTemplateImportFlow, d as filterStoreNodesForPalette, f as getStoreNodeAvailability, g as storeNodeDisplayVersion, h as isStoreNodeUpdateAvailable, k as filterPaletteNodes, m as getStoreNodeType, p as getStoreNodeIcon, t as TemplateCard, u as useWorkflowTemplates, v as useInstalledNodes, y as useGlobalStoreClient } from "./TemplateCard-BdB087SP.js";
7
+ import { _ as storeNodeInstallVersion, a as useTemplateImportFlow, d as filterStoreNodesForPalette, f as getStoreNodeAvailability, g as storeNodeDisplayVersion, h as isStoreNodeUpdateAvailable, k as filterPaletteNodes, m as getStoreNodeType, p as getStoreNodeIcon, t as TemplateCard, u as useWorkflowTemplates, v as useInstalledNodes, y as useGlobalStoreClient } from "./TemplateCard-HIMsb47R.js";
7
8
  import { _ as throwIfResultError, d as emitFluidGridsEvent, m as describeOperationError, n as getFluidGridsClient, s as waitForFluidGridsClient, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
8
9
  import { c as useDurableParityEnabled, d as usePaletteGates, l as useFluidGridsFlag, m as useWorkflowTestsEnabled, s as useDurableFunctionNodesEnabled, t as FLUIDGRIDS_FLAGS } from "./feature-flags-DM5myWaD.js";
9
10
  import { t as Button$2 } from "./button-DG7y_FVJ.js";
@@ -11,11 +12,11 @@ import { t as PublishCustomNodeAction } from "./PublishCustomNodeAction-5XXnSA3H
11
12
  import { f as BILLING_PLANS_PATH, m as RUNS_QUOTA_NAME, o as emitUpgradeClicked, t as emitNodeInstalled } from "./fluidgridsEvents-CNdcrUNN.js";
12
13
  import { An as SetWorkflowRolloutDocument, Ar as WorkflowEditLeaseDocument, Bn as TakeOverWorkflowEditLeaseDocument, Er as WorkflowDefinitionDocument, Fr as WorkflowGenerationTemplatesDocument, Gt as PushWorkflowToGitDocument, Ir as WorkflowGitCommitsDocument, Jt as RejectWorkflowPromotionDocument, Lr as WorkflowGitDiffDocument, Mr as WorkflowEnvironmentsDocument, Nt as NodeUsageStatusDocument, Rr as WorkflowGitPushesDocument, St as LinkWorkflowGitRepositoryDocument, Ti as WorkspaceRunsQuotaDocument, Ur as WorkflowPromotionRequestsDocument, X as DeployWorkflowVersionToDevDocument, Xt as ReleaseWorkflowEditLeaseDocument, Yn as UnlinkWorkflowGitRepositoryDocument, Zt as RemoveNodeFromWorkflowsDocument, an as RestoreWorkflowFromGitDocument, b as CancelWorkflowPromotionDocument, bi as WorkflowVersionDrainageDocument, jt as NodeSchemaIntrospectionDocument, l as ApproveWorkflowPromotionDocument, q as DeleteWorkflowRolloutDocument, r as ActivateWorkflowVersionCheckedDocument, sr as UpdateWorkflowEnvironmentPolicyDocument, t as AcquireWorkflowEditLeaseDocument, tn as RequestWorkflowPromotionDocument, vr as WorkflowAuthoringDocument, xi as WorkflowVersioningDocument, zr as WorkflowGitRepositoryDocument } from "./graphql-operation-types-kX-MMjgW.js";
13
14
  import { n as useAgentMarksStore } from "./marksStore-DGCXjTmZ.js";
14
- import { T as CreateWorkflowRefusalDialog, _ as lineOfNode, f as fileBaseName, g as isLossyFidelityItem, h as isLosslessReport, r as useWorkflowCodeExport, t as downloadWorkflowCodeExport, v as orderedExportFiles, x as sortFidelityItems } from "./useWorkflowCodeExport-Bu2QYJzA.js";
15
+ import { T as CreateWorkflowRefusalDialog, _ as lineOfNode, f as fileBaseName, g as isLossyFidelityItem, h as isLosslessReport, r as useWorkflowCodeExport, t as downloadWorkflowCodeExport, v as orderedExportFiles, x as sortFidelityItems } from "./useWorkflowCodeExport-CUWMlJbi.js";
15
16
  import { t as EntityTagPicker } from "./EntityTagPicker-BqRNsLCQ.js";
16
17
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
17
18
  import { a as SdkPermissionGate, i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
18
- import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-BlVVu8NM.js";
19
+ import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-Czz5DlL0.js";
19
20
  import { n as VersionLifecycleBar, r as countLifecycle, t as VersionDiffDialog } from "./VersionDiffDialog-DSN0mU0f.js";
20
21
  import { CF as WorkflowExportFormat, Eo as CodeReplaceStatus, QF as WorkflowTestExpectedStatus, SF as WorkflowEnvironment, xu as DrainageStatus, yP as VersioningBehavior } from "./graphql-types-CDKVWH2R.js";
21
22
  import { n as useConnections } from "./useConnections-Cs7LCWEM.js";
@@ -30,7 +31,6 @@ import { useMutation, useQuery } from "@apollo/client/react";
30
31
  import { create } from "zustand";
31
32
  import { Background, Controls, EdgeLabelRenderer, Handle, MarkerType, MiniMap, NodeToolbar, Panel, Position, ReactFlow, ReactFlowProvider, ViewportPortal, addEdge, getBezierPath, useEdgesState, useInternalNode, useNodes, useNodesState, useOnSelectionChange, useReactFlow, useStore } from "@xyflow/react";
32
33
  import { Icon } from "@iconify/react";
33
- import ReactMarkdown from "react-markdown";
34
34
  import { cn } from "@burdenoff/fe-libs/utils";
35
35
  import { nanoid } from "nanoid/non-secure";
36
36
  import { produce } from "immer";
@@ -44,12 +44,10 @@ import { Button as Button$1 } from "@burdenoff/fe-libs/button";
44
44
  import { ThemeProvider } from "@burdenoff/fe-libs/shared/providers/shell";
45
45
  import "@xyflow/react/dist/style.css";
46
46
  import { AlertCircle, AlertTriangle, ArrowRight, BadgeCheck, Braces, Check, CheckCircle2, ChevronDown, ChevronRight, CircleHelp, Code, Copy, DollarSign, Download, ExternalLink, Eye, FlaskConical, GitBranch, GitCommitHorizontal, GitCompare, GitCompareArrows, Hash, History, Info, Keyboard, Layers, LayoutGrid, Link2, List, Loader2, Maximize2, Package, Pencil, Play, Plus, PlusCircle, Redo2, RefreshCw, Rocket, RotateCcw, Search, Share2, SlidersHorizontal, Sparkles, Star, Trash2, Type, Undo2, Unlink, Upload, Workflow, X } from "lucide-react";
47
- import { ConnectionDialog } from "@burdenoff/fe-libs/connections";
48
47
  import { isEmpty } from "radash";
49
48
  import { animate, easeOut } from "popmotion";
50
49
  import { createPortal } from "react-dom";
51
50
  import { GraphQLEnumType, GraphQLInputObjectType, GraphQLInterfaceType, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLUnionType, buildSchema } from "graphql";
52
- import { useAgentTools } from "@burdenoff/fe-libs/shared/agent-tools";
53
51
  import { useUnsavedChanges } from "@burdenoff/fe-libs/shared/hooks";
54
52
  import { buildActorFallback, useActorProfiles } from "@burdenoff/fe-libs/shared";
55
53
 
@@ -246,12 +244,48 @@ function IntroductionPropertyPanel() {
246
244
  });
247
245
  }
248
246
 
247
+ // src/builder/overlays.ts
248
+ /**
249
+ * The builder's overlays: heavy panels and dialogs that load when first opened,
250
+ * not with the canvas (BOFF-6695, BOFF-11826), and are warmed once the canvas
251
+ * has settled (BOFF-11944).
252
+ *
253
+ * Each overlay is its own module behind a dynamic import, so its code (the
254
+ * parameter forms and CodeMirror, the sharing and connection dialogs) stays
255
+ * out of the builder's startup chunk. Once the canvas is on screen and the
256
+ * page is idle, {@link warmBuilderOverlays} loads them in the background; an
257
+ * overlay opened after that renders at once (`preloadableLazy`), instead of
258
+ * waiting for its chunk and React's Suspense throttle (about 0.5 s on first
259
+ * open even with the chunk cached).
260
+ */
261
+ const NodeDetailViewOverlay = preloadableLazy(() => import("./node-detail-view-BFBSKj5w.js").then((m) => m.NodeDetailView), "NodeDetailView");
262
+ const QuickConfigPanelOverlay = preloadableLazy(() => import("./quick-config-panel-Ym05lyGn.js").then((m) => m.QuickConfigPanel), "QuickConfigPanel");
263
+ const SidebarNodeEditorOverlay = preloadableLazy(() => import("./sidebar-node-editor-LL3ofDN7.js").then((m) => m.SidebarNodeEditor), "SidebarNodeEditor");
264
+ const WorkflowShareDialogOverlay = preloadableLazy(() => import("./WorkflowShareDialog-mbIwRQUY.js").then((n) => n.n).then((m) => m.WorkflowShareDialog), "WorkflowShareDialog");
265
+ const ConnectionFormDialogOverlay = preloadableLazy(() => import("./ConnectionFormDialog-Bg9_OdHX.js").then((n) => n.n).then((m) => m.ConnectionFormDialog), "ConnectionFormDialog");
266
+ /**
267
+ * Loads every overlay's code (and the markdown renderer the sticky notes and
268
+ * the Node Store use) without rendering anything. Best effort: it never
269
+ * rejects, and an overlay whose load failed loads again when it is opened.
270
+ */
271
+ function warmBuilderOverlays() {
272
+ return Promise.all([
273
+ NodeDetailViewOverlay.preload(),
274
+ QuickConfigPanelOverlay.preload(),
275
+ SidebarNodeEditorOverlay.preload(),
276
+ WorkflowShareDialogOverlay.preload(),
277
+ ConnectionFormDialogOverlay.preload(),
278
+ loadMarkdown().then(() => void 0, () => void 0)
279
+ ]).then(() => void 0);
280
+ }
281
+
249
282
  // src/builder/components/flow-builder/components/blocks/sidebar/panels/node-properties/node-properties-panel.tsx
250
283
  /**
251
284
  * The node editor (the parameter form, its code editor and connection picker)
252
- * loads when a node is first opened, not with the canvas (BOFF-11826).
285
+ * loads when a node is first opened, or once the canvas has settled, not with
286
+ * the canvas (BOFF-11826, BOFF-11944).
253
287
  */
254
- const SidebarNodeEditor = lazy(() => import("./sidebar-node-editor-lcnIZxdR.js").then((m) => ({ default: m.SidebarNodeEditor })));
288
+ const SidebarNodeEditor = SidebarNodeEditorOverlay.Component;
255
289
  /**
256
290
  * Width of the node panel. Wider than the other sidebar panels because it
257
291
  * hosts the full parameter form (the quick panel uses 380px for the same
@@ -1957,15 +1991,19 @@ function StoreNodeDescription({ text }) {
1957
1991
  const [expanded, setExpanded] = useState(false);
1958
1992
  const [overflows, setOverflows] = useState(false);
1959
1993
  const contentRef = useRef(null);
1994
+ const Markdown = useMarkdownRenderer();
1960
1995
  useLayoutEffect(() => {
1961
1996
  const el = contentRef.current;
1962
1997
  if (!el) return;
1963
1998
  setOverflows(el.scrollHeight > 134);
1964
- }, [text]);
1965
- const markdown = useMemo(() => /* @__PURE__ */ jsx(ReactMarkdown, {
1999
+ }, [text, Markdown]);
2000
+ const markdown = useMemo(() => Markdown ? /* @__PURE__ */ jsx(Markdown, {
1966
2001
  components: MD_COMPONENTS,
1967
2002
  children: text
1968
- }), [text]);
2003
+ }) : /* @__PURE__ */ jsx("p", {
2004
+ className: "whitespace-pre-wrap",
2005
+ children: text
2006
+ }), [text, Markdown]);
1969
2007
  return /* @__PURE__ */ jsxs("div", {
1970
2008
  className: "mb-4",
1971
2009
  children: [/* @__PURE__ */ jsxs("div", {
@@ -2584,7 +2622,7 @@ function TemplatesGrid({ templates, loading, hasMore, onLoadMore, onTemplateClic
2584
2622
  }
2585
2623
 
2586
2624
  // src/builder/components/flow-builder/components/templates/TemplatesModal.tsx
2587
- const LazyTemplateDetailPanel = lazy(() => import("./TemplateDetailPanel-DruadMkg.js").then((m) => ({ default: m.TemplateDetailPanel })));
2625
+ const LazyTemplateDetailPanel = lazy(() => import("./TemplateDetailPanel-C6Zh2WRF.js").then((m) => ({ default: m.TemplateDetailPanel })));
2588
2626
  /**
2589
2627
  * Modal for browsing and selecting workflow templates
2590
2628
  * Features:
@@ -9841,6 +9879,116 @@ function AddNodeFloatingMenu({ onNodeAdd }) {
9841
9879
  });
9842
9880
  }
9843
9881
 
9882
+ // src/builder/hooks/use-lazy-agent-tools.ts
9883
+ /**
9884
+ * Registers agent tools the builder loads on demand (BOFF-6695, BOFF-11944).
9885
+ *
9886
+ * The canvas tools and the note tools were already their own chunks, but the
9887
+ * builder registered them with fe-libs' `useAgentTools`, a static import of
9888
+ * the `@burdenoff/fe-libs/shared/agent-tools` entry. That entry also carries
9889
+ * the shell's provider, the shell and UI tool sets and the assistant's local
9890
+ * commands, and their zod schemas, so every cold builder load downloaded and
9891
+ * ran about 420 KB of it (the localised command tables, zod and
9892
+ * react-hook-form, which shares zod's chunk) before it could draw. Here the
9893
+ * registry comes with the tools, after the canvas is on screen.
9894
+ *
9895
+ * `loadTools` runs once, when the component mounts. The tools are registered
9896
+ * while `enabled` is true and removed when it turns false or the component
9897
+ * unmounts, exactly as `useAgentTools` does (registration by token, so Strict
9898
+ * Mode's double mount ends with one registration). A failed load leaves the
9899
+ * canvas fully usable for people; only assistant sessions lose these tools,
9900
+ * and the failure is logged under `label`.
9901
+ */
9902
+ function useLazyAgentTools(loadTools, enabled, label) {
9903
+ const firstLoad = useRef(loadTools);
9904
+ const [loaded, setLoaded] = useState(null);
9905
+ useEffect(() => {
9906
+ let cancelled = false;
9907
+ Promise.all([firstLoad.current(), import("@burdenoff/fe-libs/shared/agent-tools").then((m) => m.registerAgentTool)]).then(([tools, register]) => {
9908
+ if (!cancelled) setLoaded({
9909
+ tools,
9910
+ register
9911
+ });
9912
+ }).catch((error) => {
9913
+ console.error(`[FlowBuilder] ${label} failed to load:`, error);
9914
+ });
9915
+ return () => {
9916
+ cancelled = true;
9917
+ };
9918
+ }, [label]);
9919
+ useEffect(() => {
9920
+ if (!loaded || !enabled) return void 0;
9921
+ const cleanups = loaded.tools.map((tool) => loaded.register(tool));
9922
+ return () => {
9923
+ for (const cleanup of cleanups) cleanup();
9924
+ };
9925
+ }, [loaded, enabled]);
9926
+ }
9927
+
9928
+ // src/builder/hooks/use-warm-builder-overlays.ts
9929
+ /** How long after the window's `load` event the overlays start warming. */
9930
+ const OVERLAY_WARM_SETTLE_MS = 1e3;
9931
+ /** The longest the warm-up waits for an idle period once settled. */
9932
+ const OVERLAY_WARM_IDLE_TIMEOUT_MS = 5e3;
9933
+ /**
9934
+ * Runs `task` once the page has settled: the first idle period at least
9935
+ * `settleMs` after the window's `load` event (the same rule fe-libs uses for
9936
+ * the assistant panel, BOFF-11585), so it never competes with the builder's
9937
+ * own first load. Returns a cancel function.
9938
+ */
9939
+ function scheduleWhenSettled(task, settleMs = OVERLAY_WARM_SETTLE_MS, idleTimeoutMs = OVERLAY_WARM_IDLE_TIMEOUT_MS) {
9940
+ if (typeof window === "undefined") return () => {};
9941
+ let cancelled = false;
9942
+ let cancelStep = () => {};
9943
+ const run = () => {
9944
+ if (!cancelled) task();
9945
+ };
9946
+ const whenIdle = () => {
9947
+ if (cancelled) return;
9948
+ if (typeof window.requestIdleCallback === "function" && typeof window.cancelIdleCallback === "function") {
9949
+ const handle = window.requestIdleCallback(run, { timeout: idleTimeoutMs });
9950
+ cancelStep = () => window.cancelIdleCallback(handle);
9951
+ return;
9952
+ }
9953
+ const handle = setTimeout(run, 0);
9954
+ cancelStep = () => clearTimeout(handle);
9955
+ };
9956
+ const afterSettling = () => {
9957
+ if (cancelled) return;
9958
+ const handle = setTimeout(whenIdle, settleMs);
9959
+ cancelStep = () => clearTimeout(handle);
9960
+ };
9961
+ if (document.readyState === "complete") afterSettling();
9962
+ else {
9963
+ window.addEventListener("load", afterSettling, { once: true });
9964
+ cancelStep = () => window.removeEventListener("load", afterSettling);
9965
+ }
9966
+ return () => {
9967
+ cancelled = true;
9968
+ cancelStep();
9969
+ };
9970
+ }
9971
+ /** True when the person asked the browser to save data. */
9972
+ function saveDataRequested() {
9973
+ if (typeof navigator === "undefined") return false;
9974
+ return navigator.connection?.saveData === true;
9975
+ }
9976
+ /**
9977
+ * Warms the builder's overlays (node editor, node detail view, quick config,
9978
+ * share and connection dialogs, the markdown renderer) once the canvas has
9979
+ * mounted and the page has settled, so their first open renders at once
9980
+ * (BOFF-11944). Skipped when the browser asks to save data: the overlays then
9981
+ * load when opened, as before.
9982
+ */
9983
+ function useWarmBuilderOverlays(warm = warmBuilderOverlays) {
9984
+ useEffect(() => {
9985
+ if (saveDataRequested()) return void 0;
9986
+ return scheduleWhenSettled(() => {
9987
+ warm();
9988
+ });
9989
+ }, [warm]);
9990
+ }
9991
+
9844
9992
  // src/builder/components/flow-builder/components/logs-panel/logs-panel.tsx
9845
9993
  const JsonView = ({ data }) => {
9846
9994
  const tr = useTr();
@@ -14475,115 +14623,6 @@ function commitTitle(message) {
14475
14623
  return (message.split("\n", 1)[0] ?? "").trim() || "(no message)";
14476
14624
  }
14477
14625
 
14478
- // src/modules/connections/utils/provider-helpers.ts
14479
- /**
14480
- * The OAuth callback URL the builder's connections use.
14481
- *
14482
- * Provider identity (icons, name tiles) and labels moved to
14483
- * `@burdenoff/fe-libs/connections` with the shared connection dialog
14484
- * (BOFF-8174); only what depends on the SDK's own configuration stays here.
14485
- */
14486
- /**
14487
- * Get the OAuth callback URL for the integrations service.
14488
- *
14489
- * Returns an ABSOLUTE URL, since OAuth providers require an absolute
14490
- * redirect_uri. The host is derived from the configured wspace gateway base
14491
- * (`apiGatewayUrl`) — which serves the `/integrations/oauth/callback` path —
14492
- * not the app origin. Falls back to the current window origin only when no
14493
- * gateway base is configured.
14494
- */
14495
- function getOAuthCallbackUrl() {
14496
- const path = "/integrations/oauth/callback";
14497
- const gatewayBase = getFluidGridsConfig().apiGatewayUrl;
14498
- if (gatewayBase) try {
14499
- return new URL(path, gatewayBase).toString();
14500
- } catch {}
14501
- if (typeof window !== "undefined" && window.location.hostname === "localhost") return `http://localhost:3713${path}`;
14502
- if (typeof window !== "undefined") return `${window.location.origin}${path}`;
14503
- return path;
14504
- }
14505
-
14506
- // src/modules/connections/components/ConnectionFormDialog.tsx
14507
- /**
14508
- * ConnectionFormDialog — a workflow node's "New connection" popup.
14509
- *
14510
- * The dialog itself is `@burdenoff/fe-libs/connections`' ConnectionDialog, the
14511
- * same one the integrations screens use; this component only supplies what the
14512
- * builder has that the shared dialog cannot know: the SDK's GraphQL client, the
14513
- * gateway callback URL and the host's translator. It used to be a separate
14514
- * implementation, and the two drifted (BOFF-8135, BOFF-8170) — see BOFF-8174.
14515
- *
14516
- * Builder-specific choices:
14517
- * - opens on the node's provider by key, or on the whole catalog;
14518
- * - a vault is optional: a node connection should not need a trip to the
14519
- * security module, so the integrations service holds the secret unless the
14520
- * user picks a vault;
14521
- * - shows the Sharing tab.
14522
- */
14523
- /** The shared dialog's categories, back in the service's enum. */
14524
- const SDK_CATEGORIES = {
14525
- cloud_storage: "CLOUD_STORAGE",
14526
- communication: "COMMUNICATION",
14527
- productivity: "PRODUCTIVITY",
14528
- crm: "CRM",
14529
- email: "EMAIL",
14530
- calendar: "CALENDAR",
14531
- developer_tools: "DEVELOPMENT",
14532
- social: "SOCIAL",
14533
- finance: "PAYMENT",
14534
- analytics: "ANALYTICS"
14535
- };
14536
- /** Auth types the SDK's enum can express; anything else is CUSTOM. */
14537
- const SDK_AUTH_TYPES = {
14538
- oauth2: "OAUTH2",
14539
- api_key: "API_KEY",
14540
- basic_auth: "BASIC_AUTH",
14541
- bearer_token: "BEARER_TOKEN"
14542
- };
14543
- /** The shared dialog's provider, in the SDK's GraphQL-enum shape. */
14544
- function toSdkProvider(provider) {
14545
- return {
14546
- id: provider.id,
14547
- key: provider.key,
14548
- name: provider.name,
14549
- description: provider.description,
14550
- category: SDK_CATEGORIES[provider.category] ?? "CUSTOM",
14551
- authType: SDK_AUTH_TYPES[provider.authType] ?? "CUSTOM",
14552
- icon: provider.icon,
14553
- website: provider.website,
14554
- docsUrl: provider.docsUrl,
14555
- isBuiltIn: true,
14556
- isEnabled: provider.isEnabled
14557
- };
14558
- }
14559
- function ConnectionFormDialog({ open, onClose, providerKey, providerId, defaultName, onConnectionCreated, onError }) {
14560
- const tr = useTr();
14561
- const handleCreated = useCallback((connection) => {
14562
- onConnectionCreated?.({
14563
- id: connection.id,
14564
- name: connection.name,
14565
- status: connection.status,
14566
- provider: toSdkProvider(connection.provider)
14567
- });
14568
- }, [onConnectionCreated]);
14569
- return /* @__PURE__ */ jsx(ConnectionDialog, {
14570
- open,
14571
- onClose,
14572
- client: getFluidGridsClient(),
14573
- callbackUrl: getOAuthCallbackUrl(),
14574
- translate: tr,
14575
- providerKey: providerKey ?? null,
14576
- providerId: providerId ?? null,
14577
- providerSource: "catalog",
14578
- requireVault: false,
14579
- defaultName,
14580
- showSharingTab: true,
14581
- defaultVisibility: "RESTRICTED",
14582
- onConnectionCreated: handleCreated,
14583
- onError
14584
- });
14585
- }
14586
-
14587
14626
  // src/builder/components/flow-builder/components/ui/git-sync-panel.tsx
14588
14627
  /**
14589
14628
  * GitSyncPanel — Git provider sync for the open workflow (BOFF-9673; GitLab
@@ -14597,6 +14636,7 @@ function ConnectionFormDialog({ open, onClose, providerKey, providerId, defaultN
14597
14636
  * publish and on promotion happen on the server; this panel shows their
14598
14637
  * outcome (including failures) in the push log.
14599
14638
  */
14639
+ const ConnectionFormDialog = ConnectionFormDialogOverlay.Component;
14600
14640
  const EMPTY_FORM = {
14601
14641
  provider: DEFAULT_GIT_PROVIDER,
14602
14642
  baseUrl: "",
@@ -15260,19 +15300,22 @@ function GitSyncPanel({ className, compact = false }) {
15260
15300
  ]
15261
15301
  })]
15262
15302
  }),
15263
- /* @__PURE__ */ jsx(ConnectionFormDialog, {
15264
- open: newConnectionOpen,
15265
- onClose: () => setNewConnectionOpen(false),
15266
- providerKey: providerOption.providerKey,
15267
- defaultName: providerOption.label,
15268
- onConnectionCreated: (created) => {
15269
- setNewConnectionOpen(false);
15270
- setForm((prev) => ({
15271
- ...prev,
15272
- connectionId: created.id
15273
- }));
15274
- refetchConnections();
15275
- }
15303
+ newConnectionOpen && /* @__PURE__ */ jsx(Suspense, {
15304
+ fallback: null,
15305
+ children: /* @__PURE__ */ jsx(ConnectionFormDialog, {
15306
+ open: newConnectionOpen,
15307
+ onClose: () => setNewConnectionOpen(false),
15308
+ providerKey: providerOption.providerKey,
15309
+ defaultName: providerOption.label,
15310
+ onConnectionCreated: (created) => {
15311
+ setNewConnectionOpen(false);
15312
+ setForm((prev) => ({
15313
+ ...prev,
15314
+ connectionId: created.id
15315
+ }));
15316
+ refetchConnections();
15317
+ }
15318
+ })
15276
15319
  }),
15277
15320
  /* @__PURE__ */ jsx(AlertDialog, {
15278
15321
  open: confirm !== null,
@@ -16509,7 +16552,7 @@ function FidelityReportList({ fidelity, source, hasNode, onShowNode }) {
16509
16552
  * Behind the `fluidgrids.code-first` flag (default off); with the flag off
16510
16553
  * the panel renders nothing and the header is exactly as before.
16511
16554
  */
16512
- const LazyCodeEditorField = lazy(() => import("./code-editor-field-9-GdVE_8.js").then((n) => n.n).then((m) => ({ default: m.CodeEditorField })));
16555
+ const LazyCodeEditorField = lazy(() => import("./code-editor-field-CoRq10k7.js").then((n) => n.n).then((m) => ({ default: m.CodeEditorField })));
16513
16556
  /** Read-only lifted-code editor with a sized placeholder while its chunk loads. */
16514
16557
  function CodeViewEditor({ content, path, label }) {
16515
16558
  return /* @__PURE__ */ jsx(Suspense, {
@@ -16779,7 +16822,7 @@ function CodeViewSheet({ className, compact }) {
16779
16822
  * dialog. Someone who may not change the sharing sees it read-only; the
16780
16823
  * service checks every change again.
16781
16824
  */
16782
- const WorkflowShareDialog = lazy(() => import("./WorkflowShareDialog-mbIwRQUY.js").then((n) => n.n).then((m) => ({ default: m.WorkflowShareDialog })));
16825
+ const WorkflowShareDialog = WorkflowShareDialogOverlay.Component;
16783
16826
  function ShareWorkflowButton({ compact = false, className }) {
16784
16827
  const tr = useTr();
16785
16828
  const workflowKey = useParams()?.id ?? "";
@@ -17398,8 +17441,8 @@ function EditLeaseBanner() {
17398
17441
  }
17399
17442
 
17400
17443
  // src/builder/components/flow-builder/flow-builder.tsx
17401
- const LazyNodeDetailView = lazy(() => import("./node-detail-view-ttMp6H6K.js").then((m) => ({ default: m.NodeDetailView })));
17402
- const LazyQuickConfigPanel = lazy(() => import("./quick-config-panel-Da4uOVSs.js").then((m) => ({ default: m.QuickConfigPanel })));
17444
+ const LazyNodeDetailView = NodeDetailViewOverlay.Component;
17445
+ const LazyQuickConfigPanel = QuickConfigPanelOverlay.Component;
17403
17446
  const edgeTypes = { deletable: CustomDeletableEdge };
17404
17447
  const edgeOptions = {
17405
17448
  type: "deletable",
@@ -17456,20 +17499,8 @@ const FlowBuilder = ({ readOnly = false }) => {
17456
17499
  useEffect(() => {
17457
17500
  paletteGatesRef.current = paletteGates;
17458
17501
  }, [paletteGates]);
17459
- const [agentTools, setAgentTools] = useState([]);
17460
- useEffect(() => {
17461
- let cancelled = false;
17462
- import("./agentTools-C7pdNJqE.js").then(({ createBuilderAgentTools }) => {
17463
- if (cancelled) return;
17464
- setAgentTools(createBuilderAgentTools({ durableFunctionsEnabled: () => paletteGatesRef.current }));
17465
- }).catch((error) => {
17466
- console.error("[FlowBuilder] Agent tools failed to load:", error);
17467
- });
17468
- return () => {
17469
- cancelled = true;
17470
- };
17471
- }, []);
17472
- useAgentTools(agentTools, !editingBlocked);
17502
+ useWarmBuilderOverlays();
17503
+ useLazyAgentTools(() => import("./agentTools-CrEWQ5st.js").then(({ createBuilderAgentTools }) => createBuilderAgentTools({ durableFunctionsEnabled: () => paletteGatesRef.current })), !editingBlocked, "Agent tools");
17473
17504
  const [nodes, edges, onNodesChange, onEdgesChange, onConnect] = useFlowStore(useShallow((s) => {
17474
17505
  return [
17475
17506
  s.workflow.nodes,
@@ -17511,25 +17542,12 @@ const FlowBuilder = ({ readOnly = false }) => {
17511
17542
  useEffect(() => {
17512
17543
  fitViewRef.current = fitView;
17513
17544
  }, [fitView]);
17514
- const [noteTools, setNoteTools] = useState([]);
17515
- useEffect(() => {
17516
- let cancelled = false;
17517
- import("./canvasNoteTools-CqiPTBa1.js").then(({ createCanvasNoteTools }) => {
17518
- if (cancelled) return;
17519
- setNoteTools(createCanvasNoteTools({ focusNode: (nodeId) => fitViewRef.current({
17520
- nodes: [{ id: nodeId }],
17521
- duration: 400,
17522
- padding: .6,
17523
- maxZoom: 1.25
17524
- }) }));
17525
- }).catch((error) => {
17526
- console.error("[FlowBuilder] Assistant note tools failed to load:", error);
17527
- });
17528
- return () => {
17529
- cancelled = true;
17530
- };
17531
- }, []);
17532
- useAgentTools(noteTools);
17545
+ useLazyAgentTools(() => import("./canvasNoteTools-6BQYNCee.js").then(({ createCanvasNoteTools }) => createCanvasNoteTools({ focusNode: (nodeId) => fitViewRef.current({
17546
+ nodes: [{ id: nodeId }],
17547
+ duration: 400,
17548
+ padding: .6,
17549
+ maxZoom: 1.25
17550
+ }) })), true, "Assistant note tools");
17533
17551
  const { handleOnEdgeDropConnectEnd, floatingMenuWrapperRef, handleAddConnectedNode } = useAddNodeOnEdgeDrop();
17534
17552
  const deleteKeyCode = useDeleteKeyCode();
17535
17553
  useNodeSelectedEvent();
@@ -17822,4 +17840,4 @@ const FlowBuilderPage = ({ workflow, readOnly = false }) => {
17822
17840
  ] });
17823
17841
  };
17824
17842
 
17825
- export { FluidGridsMark as S, notesKeyOf as _, useAiWorkflowTemplates as a, computeAttachPosition as b, BUILDER_FULLSCREEN_EVENT as c, useRunsQuota as d, readRunsQuota as f, useWorkflowReloadStore as g, releaseLeaseKeptForReload as h, enrichDraftNodes as i, RunsUsageMeter as l, summarizeRunsQuota as m, AI_DRAFT_MAX_PROMPT_LENGTH as n, ConnectionFormDialog as o, runsQuotaLevel as p, draftToCanvas as r, BUILDER_FULLSCREEN_ATTRIBUTE as s, FlowBuilderPage as t, RunsUsageMeterView as u, JsonView as v, useNodeSelectedEvent as x, TableView as y };
17843
+ export { JsonView as _, useAiWorkflowTemplates as a, useNodeSelectedEvent as b, RunsUsageMeter as c, readRunsQuota as d, runsQuotaLevel as f, notesKeyOf as g, useWorkflowReloadStore as h, enrichDraftNodes as i, RunsUsageMeterView as l, releaseLeaseKeptForReload as m, AI_DRAFT_MAX_PROMPT_LENGTH as n, BUILDER_FULLSCREEN_ATTRIBUTE as o, summarizeRunsQuota as p, draftToCanvas as r, BUILDER_FULLSCREEN_EVENT as s, FlowBuilderPage as t, useRunsQuota as u, TableView as v, FluidGridsMark as x, computeAttachPosition as y };
package/dist/history.js CHANGED
@@ -1,4 +1,4 @@
1
1
  "use client";
2
- import { t as HistoryPage } from "./HistoryPage-U0tqupBN.js";
2
+ import { t as HistoryPage } from "./HistoryPage-BLXZJDoJ.js";
3
3
 
4
4
  export { HistoryPage };
package/dist/index.js CHANGED
@@ -1,30 +1,31 @@
1
1
  "use client";
2
- import { Dt as createThenOpen, Et as classifyCreateRefusal, Q as stripSubmitActions, Z as resolveUiSpec, m as refetchStoreNodes, mn as openRunQuotaUpgradePrompt, n as FluidGridsProvider, pn as useFluidGridsAnalytics, r as useFluidGridsContext, rn as useNodeExecution, wt as blankWorkflowCreateInput } from "./FluidGridsProvider-dvZSNtSW.js";
3
- import { n as WorkflowBuilderCore, r as EnsureThemeProvider, t as WorkflowBuilder } from "./WorkflowBuilder-BSPGcOfA.js";
4
- import { a as useCreateWorkflowFirst, i as FirstWorkflowChecklistView, r as FirstWorkflowChecklist, t as WorkflowsList } from "./WorkflowsList-DiiGyZkT.js";
5
- import { a as START_NAME_PARAM, c as readStartNodeRequest, i as START_FIELD_PREFIX, l as startNodeLink, o as START_NODE_PARAM, r as GuidedTourStarter, s as START_OPERATION_PARAM, t as WorkflowBuilder$1 } from "./WorkflowBuilder-DMonxuoY.js";
6
- import { t as WorkflowSearchRedirect } from "./WorkflowSearchRedirect-DwDNZ_q5.js";
7
- import { A as isDurableFunctionNodeType, C as CardFooter, D as RUN_CONTROL_NODE_TYPES, E as DURABLE_FUNCTION_NODE_TYPES, M as isRunControlNodeType, O as WORKFLOW_TEST_NODE_TYPES, S as CardDescription, T as CardTitle, b as Card, i as badgeVariants, j as isNodeTypeHiddenFromPalette, k as filterPaletteNodes, r as Badge, w as CardHeader, x as CardContent } from "./TemplateCard-BdB087SP.js";
8
- import { r as extractTemplateGraph, t as TemplatePreview } from "./TemplatePreview-CNrYJXw2.js";
2
+ import { At as createThenOpen, Dt as blankWorkflowCreateInput, _n as openRunQuotaUpgradePrompt, et as resolveUiSpec, gn as useFluidGridsAnalytics, kt as classifyCreateRefusal, m as refetchStoreNodes, n as FluidGridsProvider, on as useNodeExecution, r as useFluidGridsContext, tt as stripSubmitActions } from "./FluidGridsProvider-CbY91ZQq.js";
3
+ import { n as WorkflowBuilderCore, r as EnsureThemeProvider, t as WorkflowBuilder } from "./WorkflowBuilder-CYmpQtIQ.js";
4
+ import { a as useCreateWorkflowFirst, i as FirstWorkflowChecklistView, r as FirstWorkflowChecklist, t as WorkflowsList } from "./WorkflowsList-C8aoqtRE.js";
5
+ import { a as START_NAME_PARAM, c as readStartNodeRequest, i as START_FIELD_PREFIX, l as startNodeLink, o as START_NODE_PARAM, r as GuidedTourStarter, s as START_OPERATION_PARAM, t as WorkflowBuilder$1 } from "./WorkflowBuilder-CMZi6wQE.js";
6
+ import { t as WorkflowSearchRedirect } from "./WorkflowSearchRedirect-iWzvY9Qo.js";
7
+ import { A as isDurableFunctionNodeType, C as CardFooter, D as RUN_CONTROL_NODE_TYPES, E as DURABLE_FUNCTION_NODE_TYPES, M as isRunControlNodeType, O as WORKFLOW_TEST_NODE_TYPES, S as CardDescription, T as CardTitle, b as Card, i as badgeVariants, j as isNodeTypeHiddenFromPalette, k as filterPaletteNodes, r as Badge, w as CardHeader, x as CardContent } from "./TemplateCard-HIMsb47R.js";
8
+ import { r as extractTemplateGraph, t as TemplatePreview } from "./TemplatePreview-_wUMSwh_.js";
9
9
  import { $ as DuplicateWorkflowDocument, $n as UntagFluidgridsEntityDocument, $r as WorkflowRunPendingDocument, $t as RenameWorkflowProjectDocument, A as CreateWorkflowDefinitionDocument, An as SetWorkflowRolloutDocument, Ar as WorkflowEditLeaseDocument, At as NodePaletteEntriesDocument, B as DeactivateWorkflowDefinitionDocument, Bn as TakeOverWorkflowEditLeaseDocument, Br as WorkflowNotificationSettingsDocument, Bt as PreviewN8nImportDocument, C as CompleteActivityByIdDocument, Ci as WorkflowWorkersDocument, Cn as SandboxWorkerTokenFieldsFragmentDoc, Cr as WorkflowCallInputsDocument, Ct as ListenForWebhookTestEventDocument, D as CreateFluidgridsTagDocument, Dn as SetContinuousOptimisationEnabledDocument, Dr as WorkflowDefinitionForBuilderDocument, Dt as NodeEndpointConfigsDocument, E as CreateActivityPauseRuleDocument, En as SearchFluidgridsTagsDocument, Er as WorkflowDefinitionDocument, Et as NodeEndpointConfigDocument, F as CreateWorkflowTestCaseDocument, Fn as StartBatchExportDocument, Fr as WorkflowGenerationTemplatesDocument, Ft as OptimisationSuggestionsDocument, G as DeleteWorkflowFolderDocument, Gn as TerminateExecutionDocument, Gr as WorkflowRolloutFieldsFragmentDoc, Gt as PushWorkflowToGitDocument, H as DeleteTaskQueueDocument, Hn as TaskQueueKindStatsFieldsFragmentDoc, Hr as WorkflowProjectsDocument, Ht as ProposeOptimisationDocument, I as CreateWorkflowTestCaseFromRunDocument, In as StartBatchOperationDocument, Ir as WorkflowGitCommitsDocument, It as PauseActivityDocument, J as DeleteWorkflowSearchAttributeDocument, Jn as TriggerWorkflowScheduleDocument, Jr as WorkflowRunEventFieldsFragmentDoc, Jt as RejectWorkflowPromotionDocument, K as DeleteWorkflowProjectDocument, Kn as TerminateWorkflowRunDocument, Kr as WorkflowRunDeterminismStatusDocument, Kt as QueryWorkflowRunDocument, L as CreateWorkflowVersionDocument, Ln as StartBatchTerminateDocument, Lr as WorkflowGitDiffDocument, Lt as PauseExecutionDocument, M as CreateWorkflowProjectDocument, Mn as ShareWorkflowDocument, Mr as WorkflowEnvironmentsDocument, Mt as NodeStatesDocument, N as CreateWorkflowSearchAttributeDocument, Nn as SignalWorkflowRunDocument, Nr as WorkflowFoldersDocument, Nt as NodeUsageStatusDocument, O as CreateTaskQueueDocument, On as SetRunFailureTriageEnabledDocument, Or as WorkflowDefinitionsDocument, Ot as NodeManifestDocument, P as CreateWorkflowSignalTokenDocument, Pn as SnoozeOptimisationSuggestionDocument, Pr as WorkflowGenerationDocument, Pt as OptimisationSuggestionFieldsFragmentDoc, Q as DismissRunFailureClusterDocument, Qn as UnpinNodeDataDocument, Qr as WorkflowRunMetadataDocument, Qt as RenameWorkflowFolderDocument, R as DashboardSummaryDocument, Rn as StopWebhookTestListenerDocument, Rr as WorkflowGitPushesDocument, Rt as PauseWorkflowScheduleDocument, S as CodecServerSettingsDocument, Si as WorkflowVersionsDocument, Sn as RunWorkflowTestsDocument, Sr as WorkflowBatchOperationsDocument, St as LinkWorkflowGitRepositoryDocument, T as ContinuousOptimisationSettingsFieldsFragmentDoc, Ti as WorkspaceRunsQuotaDocument, Tn as SaveWorkflowDraftDocument, Tr as WorkflowCodeSourceDocument, Tt as MoveWorkflowFolderDocument, U as DeleteWorkerTokenDocument, Un as TaskQueueStatsDocument, Ur as WorkflowPromotionRequestsDocument, Ut as ProposeRunFixDocument, V as DeleteActivityPauseRuleDocument, Vn as TaskQueueFieldsFragmentDoc, Vr as WorkflowPinnedDataDocument, Vt as PreviewScheduleDocument, W as DeleteWorkflowDefinitionDocument, Wn as TaskQueuesDocument, Wr as WorkflowProposalDocument, Wt as ProposeWorkflowChangeDocument, X as DeployWorkflowVersionToDevDocument, Xn as UnpauseActivityDocument, Xr as WorkflowRunHistoryArchiveDocument, Xt as ReleaseWorkflowEditLeaseDocument, Y as DeleteWorkflowTestCaseDocument, Yn as UnlinkWorkflowGitRepositoryDocument, Yr as WorkflowRunHierarchyDocument, Yt as RejectWorkflowProposalDocument, Z as DismissOptimisationSuggestionDocument, Zn as UnpauseWorkflowScheduleDocument, Zr as WorkflowRunHistoryDocument, Zt as RemoveNodeFromWorkflowsDocument, _ as CancelBatchOperationDocument, _i as WorkflowTestRunsDocument, _n as RunFromNodeDocument, _r as WorkflowArchiveSettingsFieldsFragmentDoc, _t as FluidgridsEntityTagsDocument, a as AgentStepFieldsFragmentDoc, ai as WorkflowScheduleDescriptionFieldsFragmentDoc, an as RestoreWorkflowFromGitDocument, ar as UpdateTaskQueueDocument, at as ExecuteStepDocument, b as CancelWorkflowPromotionDocument, bi as WorkflowVersionDrainageDocument, bn as RunLogLineFieldsFragmentDoc, br as WorkflowBatchOperationDocument, bt as ImportWorkflowDocument, c as ApplyWorkflowProposalDocument, ci as WorkflowSearchAttributesDocument, cn as RetryNodeDocument, cr as UpdateWorkflowNotificationSettingsDocument, ct as ExecutionStatsDocument, d as AvailableFluidgridsTagsDocument, di as WorkflowSignalTokensDocument, dn as RunAiUsageDocument, dr as UpsertWorkflowRunSearchAttributesDocument, dt as ExportWorkflowCodeDocument, ei as WorkflowRunStackTraceDocument, en as ReplaceFluidgridsEntityTagsDocument, er as UpdateActivityOptionsDocument, et as DurableHistoryCapsDocument, f as BackfillWorkflowScheduleDocument, fi as WorkflowTestCaseFieldsFragmentDoc, fn as RunCodeReplaceFieldsFragmentDoc, fr as UsageTimeSeriesDocument, ft as FailActivityByIdDocument, g as BulkMoveWorkflowsToFolderDocument, gi as WorkflowTestRunFieldsFragmentDoc, gn as RunFailureTriageSettingsDocument, gr as WorkflowActivityPauseRulesDocument, gt as FluidgridsAvailableTagFieldsFragmentDoc, h as BulkDeleteWorkflowsDocument, hi as WorkflowTestRunDocument, hn as RunFailureClustersDocument, hr as WorkflowActivityPauseRuleFieldsFragmentDoc, ht as FileDownloadUrlDocument, i as ActiveExecutionsDocument, ii as WorkflowScheduleDescribeDocument, in as ResetWorkflowRunToLastCleanTaskDocument, ir as UpdateManagedAiWorkspacePolicyDocument, it as EventRegistrationsDocument, j as CreateWorkflowFolderDocument, jn as SetWorkflowRunVersioningOverrideDocument, jr as WorkflowEditLeaseStatusDocument, jt as NodeSchemaIntrospectionDocument, k as CreateWorkerTokenDocument, kn as SetWorkerTokenConnectionAllowlistDocument, kr as WorkflowDefinitionsTagsDocument, kt as NodeManifestsDocument, l as ApproveWorkflowPromotionDocument, li as WorkflowSharingDocument, ln as RevokeWorkflowSignalTokenDocument, lr as UpdateWorkflowRunDocument, lt as ExecutionsListDocument, m as BulkAssignWorkflowsToProjectDocument, mi as WorkflowTestCasesDocument, mn as RunEventAppendedDocument, mr as WorkerTokensDocument, mt as FgTriageFailedRunsDocument, n as ActivateWorkflowDefinitionDocument, ni as WorkflowRunsCountDocument, nn as ResetActivityDocument, nr as UpdateCodecServerSettingsDocument, nt as DurableRunFieldsDocument, o as AgentStepUpdatedDocument, oi as WorkflowScheduleTickFieldsFragmentDoc, on as RestoreWorkflowVersionDocument, or as UpdateWorkflowDefinitionDocument, ot as ExecutionDetailDocument, p as BuildWorkflowCodeDocument, pi as WorkflowTestCaseResultFieldsFragmentDoc, pn as RunControlFieldsDocument, pr as WebhookTestListenerDocument, pt as FgRunOptimisationScanDocument, q as DeleteWorkflowRolloutDocument, qn as TriggerWorkflowDocument, qr as WorkflowRunDocument, qt as RegisterNodeDocument, r as ActivateWorkflowVersionCheckedDocument, ri as WorkflowRunsDocument, rn as ResetWorkflowRunDocument, rr as UpdateDurableHistoryCapsDocument, rt as ErrorAnalyticsDocument, s as AgentTraceDocument, si as WorkflowSearchAttributeFieldsFragmentDoc, sn as ResumeExecutionDocument, sr as UpdateWorkflowEnvironmentPolicyDocument, st as ExecutionLogsDocument, t as AcquireWorkflowEditLeaseDocument, ti as WorkflowRunUpdateDocument, tn as RequestWorkflowPromotionDocument, tr as UpdateArchiveSettingsDocument, tt as DurableParityRunFieldsDocument, u as ArchiveSettingsDocument, ui as WorkflowSignalTokenFieldsFragmentDoc, un as RotateWorkerTokenDocument, ur as UpdateWorkflowTestCaseDocument, ut as ExplainRunDocument, v as CancelExecutionDocument, vi as WorkflowUpdateResultFieldsFragmentDoc, vn as RunFromNodeEligibilityDocument, vr as WorkflowAuthoringDocument, vt as FluidgridsTagAssignmentFieldsFragmentDoc, w as ContinuousOptimisationSettingsDocument, wi as WorkspaceAiUsageDocument, wn as SandboxWorkflowWorkerFieldsFragmentDoc, wr as WorkflowCodeBundleSdkDocument, wt as ManagedAiWorkspacePolicyDocument, x as CancelWorkflowProposalDocument, xi as WorkflowVersioningDocument, xn as RunLogsDocument, xr as WorkflowBatchOperationUpdatedDocument, xt as ImportWorkflowTemplateDocument, y as CancelWorkflowGenerationDocument, yi as WorkflowVersionDiffDocument, yn as RunLogAppendedDocument, yr as WorkflowBatchJobFieldsFragmentDoc, yt as GenerateWorkflowFromPromptDocument, z as DataTablesTagsDocument, zn as TagFluidgridsEntityDocument, zr as WorkflowGitRepositoryDocument, zt as PinNodeDataDocument } from "./graphql-operation-types-kX-MMjgW.js";
10
- import { t as AiStudioPage } from "./AiStudioPage-htYcXz43.js";
10
+ import { t as AiStudioPage } from "./AiStudioPage-CJdzRL26.js";
11
11
  import { t as ThemeProvider } from "./theme-provider-B3mIuz2d.js";
12
- import { S as FluidGridsMark, c as BUILDER_FULLSCREEN_EVENT, d as useRunsQuota, f as readRunsQuota, l as RunsUsageMeter, m as summarizeRunsQuota, o as ConnectionFormDialog, p as runsQuotaLevel, s as BUILDER_FULLSCREEN_ATTRIBUTE, t as FlowBuilderPage, u as RunsUsageMeterView } from "./flow-builder-CV5Zu_Hq.js";
12
+ import { c as RunsUsageMeter, d as readRunsQuota, f as runsQuotaLevel, l as RunsUsageMeterView, o as BUILDER_FULLSCREEN_ATTRIBUTE, p as summarizeRunsQuota, s as BUILDER_FULLSCREEN_EVENT, t as FlowBuilderPage, u as useRunsQuota, x as FluidGridsMark } from "./flow-builder-Dwev-C_g.js";
13
13
  import { A as themeKey, C as resetFluidGridsConfig, D as FLUIDGRIDS_THEME_TOKEN_MAP, O as applyFluidGridsTheme, S as getGraphQLEndpoint, T as setFluidGridsConfig, _ as throwIfResultError, a as resetFluidGridsClient, c as createFluidGridsTokenRefreshLink, g as isUnauthenticatedError, h as isForbiddenError, i as isFluidGridsClientReady, j as themeToCssVariables, k as sanitizeThemeValue, l as FLUIDGRIDS_EVENTS_VERSION, m as describeOperationError, n as getFluidGridsClient, o as setFluidGridsClient, r as getFluidGridsClientSafe, s as waitForFluidGridsClient, t as createFluidGridsClient, u as FLUIDGRIDS_EVENT_NAMES, w as resetFluidGridsExecutionState, x as getFluidGridsConfig, y as config } from "./client-C9XSzSXr.js";
14
14
  import { n as buttonVariants, t as Button } from "./button-DG7y_FVJ.js";
15
15
  import { a as DialogFooter, c as DialogPortal, d as Input, i as DialogDescription, l as DialogTitle, n as DialogClose, o as DialogHeader, r as DialogContent, s as DialogOverlay, t as Dialog, u as DialogTrigger } from "./dialog-Cjb4lB4D.js";
16
- import { t as ExecutionsListPage } from "./ExecutionsListPage-BCUJoAIE.js";
17
- import { _ as useWorkflowRuns, a as useDeactivateWorkflow, c as useImportWorkflow, d as useRestoreWorkflowVersion, f as useTriggerWorkflow, g as useWorkflowRun, h as useWorkflowDefinitions, i as useDashboardSummary, l as useLazyWorkflowDefinition, m as useWorkflowDefinition, n as useCreateWorkflow, o as useDeleteWorkflow, p as useUpdateWorkflow, r as useCreateWorkflowVersion, s as useDuplicateWorkflow, t as useActivateWorkflow, u as usePreviewN8nImport, v as useWorkflowVersions } from "./useWorkflows-BlVVu8NM.js";
18
- import { r as RunHumanRequests, t as ExecutionDetailPage } from "./ExecutionDetailPage-BdcZmLT4.js";
19
- import { a as ConnectionSelector, i as RunOnSection, n as PopoverContent, r as PopoverTrigger, t as Popover } from "./popover-BbVOHsfO.js";
16
+ import { t as ExecutionsListPage } from "./ExecutionsListPage-DwJQfDPt.js";
17
+ import { _ as useWorkflowRuns, a as useDeactivateWorkflow, c as useImportWorkflow, d as useRestoreWorkflowVersion, f as useTriggerWorkflow, g as useWorkflowRun, h as useWorkflowDefinitions, i as useDashboardSummary, l as useLazyWorkflowDefinition, m as useWorkflowDefinition, n as useCreateWorkflow, o as useDeleteWorkflow, p as useUpdateWorkflow, r as useCreateWorkflowVersion, s as useDuplicateWorkflow, t as useActivateWorkflow, u as usePreviewN8nImport, v as useWorkflowVersions } from "./useWorkflows-Czz5DlL0.js";
18
+ import { r as RunHumanRequests, t as ExecutionDetailPage } from "./ExecutionDetailPage-DKp421Fj.js";
19
+ import { a as ConnectionSelector, i as RunOnSection, n as PopoverContent, r as PopoverTrigger, t as Popover } from "./popover-xPh0iIzy.js";
20
+ import { t as ConnectionFormDialog } from "./ConnectionFormDialog-Bg9_OdHX.js";
20
21
  import { a as useInitiateOAuth, i as useCreateConnection, n as useConnections, o as useProviders, r as useConnectionsByProvider, t as useConnection } from "./useConnections-Cs7LCWEM.js";
21
- import { t as HistoryPage } from "./HistoryPage-U0tqupBN.js";
22
- import { t as TemplatesPage } from "./TemplatesPage-BU4tSqOo.js";
22
+ import { t as HistoryPage } from "./HistoryPage-BLXZJDoJ.js";
23
+ import { t as TemplatesPage } from "./TemplatesPage-DBfL-ao9.js";
23
24
  import { a as useNodeEndpoint, i as useLazyNodeManifest, o as useNodeEndpoints, r as fetchAllNodesWithManifests, s as useNodeManifest, t as NodesPage } from "./NodesPage-Bf5PhfBK.js";
24
- import { t as SettingsPage } from "./SettingsPage-CJLZvv4J.js";
25
- import { t as DataSinkDashboardPage } from "./DataSinkDashboardPage-1h2QsMzH.js";
26
- import { n as InsightsPage, t as ErrorAnalyticsPage } from "./InsightsPage-CALo16eB.js";
27
- import { a as useLogStreamDestinations, i as useLogStreamDestinationActions, n as useDataSinks, o as useRunReplayActions, r as useInsightsData, t as useDataSinkData } from "./useObservability-CfEw3ZFD.js";
25
+ import { t as SettingsPage } from "./SettingsPage-CXoKX0px.js";
26
+ import { t as DataSinkDashboardPage } from "./DataSinkDashboardPage-hrwQSvks.js";
27
+ import { n as InsightsPage, t as ErrorAnalyticsPage } from "./InsightsPage-ChnoW5U4.js";
28
+ import { a as useLogStreamDestinations, i as useLogStreamDestinationActions, n as useDataSinks, o as useRunReplayActions, r as useInsightsData, t as useDataSinkData } from "./useObservability-FfQGgW6W.js";
28
29
  import { a as useRevealVariableValue, c as useTestSecretsProviderConnection, i as useDeleteVariable, l as useUpdateVariable, o as useSaveSecretsProviderConfig, r as useCreateVariable, s as useSecretsProviderConfigs, t as VariablesPage, u as useVariables } from "./VariablesPage-67WR_lVE.js";
29
30
  import { t as RunnersPage } from "./RunnersPage-CLCOCclc.js";
30
31
  import { a as useRunners, i as useRunnerActions, n as RUNNER_INSTALL_SCRIPT_URL, r as runnerInstallCommand, t as RunnerStatusPill } from "./RunnerStatusPill-Ctg4TJcP.js";
@@ -47,7 +48,7 @@ import { a as triggerNodesOf, i as pickTriggerNode, n as AgentCalloutOverlay, r
47
48
  import { n as useAgentMarksStore, t as resetAgentMarks } from "./marksStore-DGCXjTmZ.js";
48
49
  import { a as resolvePhaseCFlags, c as useDurableParityEnabled, d as usePaletteGates, f as usePhaseCFlags, i as resolveFluidGridsFlagsSettled, l as useFluidGridsFlag, m as useWorkflowTestsEnabled, n as FLUIDGRIDS_FLAG_DEFAULTS, o as useContinuousOptimisationEnabled, p as useSelfHostedWorkersEnabled, r as PHASE_C_FLAGS_OFF, s as useDurableFunctionNodesEnabled, t as FLUIDGRIDS_FLAGS, u as useFluidGridsFlagsSettled } from "./feature-flags-DM5myWaD.js";
49
50
  import { a as emitTemplateUsed, c as emitWorkflowLimitHit, f as BILLING_PLANS_PATH, h as WORKFLOWS_QUOTA_NAME, i as emitRunStarted, l as emitWorkflowPublished, m as RUNS_QUOTA_NAME, n as emitRunFailed, o as emitUpgradeClicked, r as emitRunLimitHit, s as emitWorkflowCreated, t as emitNodeInstalled, v as findQuotaRefusal, y as isQuotaExhaustedFailure } from "./fluidgridsEvents-CNdcrUNN.js";
50
- import { T as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-Bu2QYJzA.js";
51
+ import { T as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-CUWMlJbi.js";
51
52
  import { a as firstWorkflowProgress, n as GUIDED_FIRST_WORKFLOW_STATE, o as isGuidedTourIntent, r as GUIDED_TOUR_STATE, s as pickGuidedTour, t as GUIDED_FIRST_WORKFLOW_NAV } from "./firstWorkflow-C_h0KMB2.js";
52
53
  import { t as Label } from "./label-CDy86rIZ.js";
53
54
  import { n as DEVPORTAL_NODE_APPS_PATH, r as resolveDevportalLink, t as PublishCustomNodeAction } from "./PublishCustomNodeAction-5XXnSA3H.js";
@@ -75,10 +76,10 @@ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
75
76
  import * as SwitchPrimitives from "@radix-ui/react-switch";
76
77
 
77
78
  // src/components/FluidGridsRoot.tsx
78
- const WorkflowsList$1 = lazy(() => import("./WorkflowsList-DiiGyZkT.js").then((n) => n.n).then((m) => ({ default: m.WorkflowsList })));
79
- const WorkflowBuilder$2 = lazy(() => import("./WorkflowBuilder-DMonxuoY.js").then((n) => n.n).then((m) => ({ default: m.WorkflowBuilder })));
80
- const ExecutionsListPage$1 = lazy(() => import("./ExecutionsListPage-BCUJoAIE.js").then((n) => n.n).then((m) => ({ default: m.ExecutionsListPage })));
81
- const ExecutionDetailPage$1 = lazy(() => import("./ExecutionDetailPage-BdcZmLT4.js").then((n) => n.n).then((m) => ({ default: m.ExecutionDetailPage })));
79
+ const WorkflowsList$1 = lazy(() => import("./WorkflowsList-C8aoqtRE.js").then((n) => n.n).then((m) => ({ default: m.WorkflowsList })));
80
+ const WorkflowBuilder$2 = lazy(() => import("./WorkflowBuilder-CMZi6wQE.js").then((n) => n.n).then((m) => ({ default: m.WorkflowBuilder })));
81
+ const ExecutionsListPage$1 = lazy(() => import("./ExecutionsListPage-DwJQfDPt.js").then((n) => n.n).then((m) => ({ default: m.ExecutionsListPage })));
82
+ const ExecutionDetailPage$1 = lazy(() => import("./ExecutionDetailPage-DKp421Fj.js").then((n) => n.n).then((m) => ({ default: m.ExecutionDetailPage })));
82
83
  const PageLoader = () => /* @__PURE__ */ jsx("div", {
83
84
  className: "flex items-center justify-center h-64",
84
85
  children: /* @__PURE__ */ jsx("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-primary" })