@burdenoff/fluidgrids-fe-sdk 2026.1111.19 → 2026.1111.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AiStudioPage-htYcXz43.js → AiStudioPage-CmjZwaoy.js} +4 -4
- package/dist/ConnectionFormDialog-Bg9_OdHX.js +119 -0
- package/dist/{DataSinkDashboardPage-1h2QsMzH.js → DataSinkDashboardPage-auvILMSt.js} +1 -1
- package/dist/{ExecutionDetailPage-BdcZmLT4.js → ExecutionDetailPage-C0q5brcQ.js} +6 -6
- package/dist/{ExecutionsListPage-BCUJoAIE.js → ExecutionsListPage-Dcc6wi-8.js} +4 -4
- package/dist/{FluidGridsProvider-dvZSNtSW.js → FluidGridsProvider-CRGXDZX1.js} +55 -3
- package/dist/{HistoryPage-U0tqupBN.js → HistoryPage-B5Np7Dd_.js} +1 -1
- package/dist/{InsightsPage-CALo16eB.js → InsightsPage-CQ8sB4d6.js} +1 -1
- package/dist/{MissingNodesInstallModal-Dly7T2_7.js → MissingNodesInstallModal-Dm1m3Ysp.js} +1 -1
- package/dist/{QuotaExhaustedDialog-7IFSaLyi.js → QuotaExhaustedDialog-DYCpMOyQ.js} +1 -1
- package/dist/{SettingsPage-CJLZvv4J.js → SettingsPage-BNJV7nwG.js} +2 -2
- package/dist/{TemplateCard-BdB087SP.js → TemplateCard-BuP6_QX8.js} +2 -2
- package/dist/{TemplateConfigurationModal-CPVcTDSi.js → TemplateConfigurationModal--YswnkOD.js} +1 -1
- package/dist/{TemplateDetailPanel-DruadMkg.js → TemplateDetailPanel-CtUjihCQ.js} +1 -1
- package/dist/{TemplatePreview-CNrYJXw2.js → TemplatePreview-TH3zVEtT.js} +3 -3
- package/dist/{TemplatesPage-BU4tSqOo.js → TemplatesPage-BDiIswSv.js} +4 -4
- package/dist/{WorkflowBuilder-DMonxuoY.js → WorkflowBuilder-DnTqzYD5.js} +7 -7
- package/dist/{WorkflowBuilder-BSPGcOfA.js → WorkflowBuilder-KypUzhmK.js} +3 -3
- package/dist/{WorkflowSearchRedirect-DwDNZ_q5.js → WorkflowSearchRedirect-DAA2K0Md.js} +1 -1
- package/dist/{WorkflowsList-DiiGyZkT.js → WorkflowsList-BWdu8wj0.js} +5 -5
- package/dist/{agentTools-C7pdNJqE.js → agentTools-VQXDvw4O.js} +3 -3
- package/dist/{canvasNoteTools-CqiPTBa1.js → canvasNoteTools-CCQtxq7U.js} +2 -2
- package/dist/{code-editor-field-9-GdVE_8.js → code-editor-field-4j1LiULY.js} +1 -1
- package/dist/executions.js +2 -2
- package/dist/{flow-builder-CV5Zu_Hq.js → flow-builder-KbM4vIW8.js} +191 -173
- package/dist/history.js +1 -1
- package/dist/index.js +25 -24
- package/dist/{node-detail-view-ttMp6H6K.js → node-detail-view-CeOkSF2C.js} +5 -5
- package/dist/{node-editor-tab-body-Bqb--pZy.js → node-editor-tab-body-CN89wDV7.js} +2 -2
- package/dist/observability.js +2 -2
- package/dist/{popover-BbVOHsfO.js → popover-CxKbvYSJ.js} +2 -2
- package/dist/preloadable-lazy-Pp47mqQ9.js +65 -0
- package/dist/{quick-config-panel-Da4uOVSs.js → quick-config-panel-wfP0s4QO.js} +3 -3
- package/dist/{schedule-panel-DnFN933b.js → schedule-panel-2HgyHvO8.js} +4 -4
- package/dist/settings.js +1 -1
- package/dist/{sidebar-node-editor-lcnIZxdR.js → sidebar-node-editor-DLOVQATw.js} +3 -3
- package/dist/templates.js +2 -2
- package/dist/{useDurableParity-CzUQMFJ3.js → useDurableParity-CJvnfF3T.js} +1 -1
- package/dist/{useExecutions-9aLuOt1c.js → useExecutions-CyXkJtpk.js} +1 -1
- package/dist/{useObservability-CfEw3ZFD.js → useObservability-QZjFuXnI.js} +1 -1
- package/dist/{useRunHistory-B1xJDwl1.js → useRunHistory-D4gaa81A.js} +1 -1
- package/dist/{useWorkflowCodeExport-Bu2QYJzA.js → useWorkflowCodeExport-BNGq3BJ9.js} +1 -1
- package/dist/{useWorkflows-BlVVu8NM.js → useWorkflows-XsfD7JA-.js} +1 -1
- package/dist/workflow-builder.js +4 -4
- package/dist/workflow-pages.d.ts +20 -20
- package/dist/workflow-pages.js +16 -24
- package/dist/workflows-list.js +1 -1
- 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
|
|
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 useMarkdownRenderer, Ft as leaseCallQueue, Gt as sessionBeforeReload, Ht as EDIT_SESSION_ID, I as buildOperationSeed, In as BuilderReadOnlyProvider, It as leaseCallSequence, Jt as AUTOSAVE_DEBOUNCE_MS, Kt as rememberOwnStatusChange, Ln as useBuilderReadOnly, 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 loadMarkdown, 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-CRGXDZX1.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-
|
|
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-BuP6_QX8.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-
|
|
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-BNGq3BJ9.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-
|
|
19
|
+
import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-XsfD7JA-.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-CeOkSF2C.js").then((m) => m.NodeDetailView), "NodeDetailView");
|
|
262
|
+
const QuickConfigPanelOverlay = preloadableLazy(() => import("./quick-config-panel-wfP0s4QO.js").then((m) => m.QuickConfigPanel), "QuickConfigPanel");
|
|
263
|
+
const SidebarNodeEditorOverlay = preloadableLazy(() => import("./sidebar-node-editor-DLOVQATw.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,
|
|
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 =
|
|
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(
|
|
1999
|
+
}, [text, Markdown]);
|
|
2000
|
+
const markdown = useMemo(() => Markdown ? /* @__PURE__ */ jsx(Markdown, {
|
|
1966
2001
|
components: MD_COMPONENTS,
|
|
1967
2002
|
children: text
|
|
1968
|
-
}),
|
|
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-
|
|
2625
|
+
const LazyTemplateDetailPanel = lazy(() => import("./TemplateDetailPanel-CtUjihCQ.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(
|
|
15264
|
-
|
|
15265
|
-
|
|
15266
|
-
|
|
15267
|
-
|
|
15268
|
-
|
|
15269
|
-
|
|
15270
|
-
|
|
15271
|
-
|
|
15272
|
-
|
|
15273
|
-
|
|
15274
|
-
|
|
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-
|
|
16555
|
+
const LazyCodeEditorField = lazy(() => import("./code-editor-field-4j1LiULY.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 =
|
|
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 =
|
|
17402
|
-
const LazyQuickConfigPanel =
|
|
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
|
-
|
|
17460
|
-
|
|
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-VQXDvw4O.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
|
-
|
|
17515
|
-
|
|
17516
|
-
|
|
17517
|
-
|
|
17518
|
-
|
|
17519
|
-
|
|
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-CCQtxq7U.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 {
|
|
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
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-
|
|
3
|
-
import { n as WorkflowBuilderCore, r as EnsureThemeProvider, t as WorkflowBuilder } from "./WorkflowBuilder-
|
|
4
|
-
import { a as useCreateWorkflowFirst, i as FirstWorkflowChecklistView, r as FirstWorkflowChecklist, t as WorkflowsList } from "./WorkflowsList-
|
|
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-
|
|
6
|
-
import { t as WorkflowSearchRedirect } from "./WorkflowSearchRedirect-
|
|
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-
|
|
8
|
-
import { r as extractTemplateGraph, t as TemplatePreview } from "./TemplatePreview-
|
|
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-CRGXDZX1.js";
|
|
3
|
+
import { n as WorkflowBuilderCore, r as EnsureThemeProvider, t as WorkflowBuilder } from "./WorkflowBuilder-KypUzhmK.js";
|
|
4
|
+
import { a as useCreateWorkflowFirst, i as FirstWorkflowChecklistView, r as FirstWorkflowChecklist, t as WorkflowsList } from "./WorkflowsList-BWdu8wj0.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-DnTqzYD5.js";
|
|
6
|
+
import { t as WorkflowSearchRedirect } from "./WorkflowSearchRedirect-DAA2K0Md.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-BuP6_QX8.js";
|
|
8
|
+
import { r as extractTemplateGraph, t as TemplatePreview } from "./TemplatePreview-TH3zVEtT.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-
|
|
10
|
+
import { t as AiStudioPage } from "./AiStudioPage-CmjZwaoy.js";
|
|
11
11
|
import { t as ThemeProvider } from "./theme-provider-B3mIuz2d.js";
|
|
12
|
-
import {
|
|
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-KbM4vIW8.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-
|
|
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-
|
|
18
|
-
import { r as RunHumanRequests, t as ExecutionDetailPage } from "./ExecutionDetailPage-
|
|
19
|
-
import { a as ConnectionSelector, i as RunOnSection, n as PopoverContent, r as PopoverTrigger, t as Popover } from "./popover-
|
|
16
|
+
import { t as ExecutionsListPage } from "./ExecutionsListPage-Dcc6wi-8.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-XsfD7JA-.js";
|
|
18
|
+
import { r as RunHumanRequests, t as ExecutionDetailPage } from "./ExecutionDetailPage-C0q5brcQ.js";
|
|
19
|
+
import { a as ConnectionSelector, i as RunOnSection, n as PopoverContent, r as PopoverTrigger, t as Popover } from "./popover-CxKbvYSJ.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-
|
|
22
|
-
import { t as TemplatesPage } from "./TemplatesPage-
|
|
22
|
+
import { t as HistoryPage } from "./HistoryPage-B5Np7Dd_.js";
|
|
23
|
+
import { t as TemplatesPage } from "./TemplatesPage-BDiIswSv.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-
|
|
25
|
-
import { t as DataSinkDashboardPage } from "./DataSinkDashboardPage-
|
|
26
|
-
import { n as InsightsPage, t as ErrorAnalyticsPage } from "./InsightsPage-
|
|
27
|
-
import { a as useLogStreamDestinations, i as useLogStreamDestinationActions, n as useDataSinks, o as useRunReplayActions, r as useInsightsData, t as useDataSinkData } from "./useObservability-
|
|
25
|
+
import { t as SettingsPage } from "./SettingsPage-BNJV7nwG.js";
|
|
26
|
+
import { t as DataSinkDashboardPage } from "./DataSinkDashboardPage-auvILMSt.js";
|
|
27
|
+
import { n as InsightsPage, t as ErrorAnalyticsPage } from "./InsightsPage-CQ8sB4d6.js";
|
|
28
|
+
import { a as useLogStreamDestinations, i as useLogStreamDestinationActions, n as useDataSinks, o as useRunReplayActions, r as useInsightsData, t as useDataSinkData } from "./useObservability-QZjFuXnI.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-
|
|
51
|
+
import { T as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-BNGq3BJ9.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-
|
|
79
|
-
const WorkflowBuilder$2 = lazy(() => import("./WorkflowBuilder-
|
|
80
|
-
const ExecutionsListPage$1 = lazy(() => import("./ExecutionsListPage-
|
|
81
|
-
const ExecutionDetailPage$1 = lazy(() => import("./ExecutionDetailPage-
|
|
79
|
+
const WorkflowsList$1 = lazy(() => import("./WorkflowsList-BWdu8wj0.js").then((n) => n.n).then((m) => ({ default: m.WorkflowsList })));
|
|
80
|
+
const WorkflowBuilder$2 = lazy(() => import("./WorkflowBuilder-DnTqzYD5.js").then((n) => n.n).then((m) => ({ default: m.WorkflowBuilder })));
|
|
81
|
+
const ExecutionsListPage$1 = lazy(() => import("./ExecutionsListPage-Dcc6wi-8.js").then((n) => n.n).then((m) => ({ default: m.ExecutionsListPage })));
|
|
82
|
+
const ExecutionDetailPage$1 = lazy(() => import("./ExecutionDetailPage-C0q5brcQ.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" })
|