@burdenoff/fluidgrids-fe-sdk 2026.1113.11 → 2026.1114.1

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 (64) hide show
  1. package/dist/{AiStudioPage-BP2cLXEK.js → AiStudioPage-C040XZyS.js} +4 -4
  2. package/dist/{DataSinkDashboardPage-CiFi9YXQ.js → DataSinkDashboardPage-BoyLrZnt.js} +1 -1
  3. package/dist/{ExecutionDetailPage-BfFrWnBj.js → ExecutionDetailPage-C0lNp122.js} +5 -5
  4. package/dist/{ExecutionsListPage-BRvj71Nd.js → ExecutionsListPage-BpHBy1JU.js} +4 -4
  5. package/dist/{FluidGridsProvider-Dxehlm-2.js → FluidGridsProvider-CPLfIarV.js} +2 -2
  6. package/dist/{HistoryPage-CjtgUOZr.js → HistoryPage-CCZS-hPw.js} +1 -1
  7. package/dist/{InsightsPage-BsGqBpUO.js → InsightsPage-C-Nm9YNI.js} +1 -1
  8. package/dist/{NodesPage-B8fqXtey.js → NodesPage-C3sh0aL9.js} +1 -1
  9. package/dist/{PaidTemplateConfirm-BUBCnbP0.js → PaidTemplateConfirm-D20JFNCb.js} +1 -1
  10. package/dist/{QuotaExhaustedDialog-BEsj0A-I.js → QuotaExhaustedDialog-DTpI0jfj.js} +1 -1
  11. package/dist/{SettingsPage-DpBhx95x.js → SettingsPage-CmIa107C.js} +828 -8
  12. package/dist/{TaskQueuesPage-DLzuumGp.js → TaskQueuesPage-BNoe05qF.js} +16 -2
  13. package/dist/{TemplateCard-DD3vJ3a5.js → TemplateCard-C_YMW80k.js} +44 -34
  14. package/dist/{TemplateConfigurationModal-BtzI-4fr.js → TemplateConfigurationModal-DmM7s1zk.js} +1 -1
  15. package/dist/{TemplateDetailPanel-BxFNnlXm.js → TemplateDetailPanel-k0esV8pr.js} +12 -15
  16. package/dist/{TemplatePreview-Ca7df91b.js → TemplatePreview-aKYt0Kad.js} +4 -4
  17. package/dist/{TemplatesPage-BSMLtMnf.js → TemplatesPage-DIVghCB6.js} +12 -10
  18. package/dist/{WorkflowBuilder-Bok_WtPQ.js → WorkflowBuilder-BsDvbIpS.js} +6 -6
  19. package/dist/{WorkflowBuilder-Dh8MYfZJ.js → WorkflowBuilder-knGFBAAk.js} +4 -4
  20. package/dist/{WorkflowSearchRedirect-bcWo68LY.js → WorkflowSearchRedirect-DFsQzQw9.js} +1 -1
  21. package/dist/{WorkflowsList-DURQu2ZD.js → WorkflowsList-DEN-0uQe.js} +6 -6
  22. package/dist/{agentTools-B4BDCe57.js → agentTools-BTld9unj.js} +3 -3
  23. package/dist/{app-BIsCEL65.js → app-4Qdv2_5b.js} +4 -4
  24. package/dist/{attach-node-helpers-CCWFS75V.js → attach-node-helpers-4d-YMaBH.js} +1 -1
  25. package/dist/{canvasNoteTools-CLMZ6u5m.js → canvasNoteTools-C9vJMuXY.js} +2 -2
  26. package/dist/executions.js +2 -2
  27. package/dist/{flow-builder-CIvz3sOr.js → flow-builder-ConlP_db.js} +60 -48
  28. package/dist/history.js +1 -1
  29. package/dist/{index-BDN8AK1D.d.ts → index-BVCOwqsN.d.ts} +90 -59
  30. package/dist/index.d.ts +2 -2
  31. package/dist/index.js +45 -45
  32. package/dist/{label-CDy86rIZ.js → label-BMVzJ2yW.js} +2 -2
  33. package/dist/{logs-panel-_Dl5Nrdn.js → logs-panel-BgGt_dFm.js} +1 -1
  34. package/dist/{node-detail-view-Dz1ZCIzV.js → node-detail-view-C4jNBsfW.js} +9 -9
  35. package/dist/{node-editor-tab-body-D5ybpm-b.js → node-editor-tab-body-CYeFTQr6.js} +3 -3
  36. package/dist/{node-operation-selection-bFx9s45-.js → node-operation-selection-DHbtGNrG.js} +9 -9
  37. package/dist/node-type-icon-DEAztACh.js +28 -0
  38. package/dist/nodes.js +1 -1
  39. package/dist/observability.d.ts +1 -1
  40. package/dist/observability.js +2 -2
  41. package/dist/{popover-ClSWhtja.js → popover-DhwmsszC.js} +4 -4
  42. package/dist/{quick-config-panel-iDMk4TT5.js → quick-config-panel-c8JQlXuc.js} +5 -5
  43. package/dist/{schedule-panel-DzkTZm2q.js → schedule-panel-CBab8kSL.js} +5 -5
  44. package/dist/settings.js +1 -1
  45. package/dist/{sidebar-node-editor-C16VnTzr.js → sidebar-node-editor-Bo_XRHJs.js} +5 -5
  46. package/dist/store-icon-BOiBSHY6.js +100 -0
  47. package/dist/template-preview-BpP8QMAe.js +32 -0
  48. package/dist/templates.js +2 -2
  49. package/dist/{useAgentDefinitions-akQ6WwzD.js → useAgentDefinitions-Bs_ci53W.js} +1 -1
  50. package/dist/{useDurableParity-fZcATZHI.js → useDurableParity-DrahdkaR.js} +1 -1
  51. package/dist/{useExecutions-lRqeXDYS.js → useExecutions-6P7ohzlh.js} +1 -1
  52. package/dist/{useGlobalStoreClient-BOI2kYRv.js → useGlobalStoreClient-B42oOe9Q.js} +1 -1
  53. package/dist/{useObservability-CBFLQBQO.js → useObservability-BSLLLev9.js} +1 -1
  54. package/dist/{useRunHistory-DSDD_ha3.js → useRunHistory-DuKiGSuF.js} +1 -1
  55. package/dist/{useWorkflowCodeExport-qGat2KNz.js → useWorkflowCodeExport-D80HIo-F.js} +1 -1
  56. package/dist/{useWorkflows-CXwXQg74.js → useWorkflows-B5kFIfrZ.js} +1 -1
  57. package/dist/workflow-builder.js +5 -5
  58. package/dist/workflow-pages.d.ts +1 -1
  59. package/dist/workflow-pages.js +15 -15
  60. package/dist/workflow-preview.js +1 -1
  61. package/dist/workflows-list.js +1 -1
  62. package/package.json +1 -1
  63. package/dist/node-type-icon-D28t8I64.js +0 -35
  64. package/dist/template-preview-C01KV277.js +0 -29
@@ -87,9 +87,18 @@ function formatAge(iso, now = Date.now()) {
87
87
  if (seconds < 86400) return `${Math.round(seconds / 3600)}h ago`;
88
88
  return new Date(iso).toLocaleDateString();
89
89
  }
90
+ /**
91
+ * The queue a worker token names for one queue row (spec 06 §6, G10): the
92
+ * plain name for an unscoped row (workers may serve every environment), and
93
+ * `name@<env>` for a row scoped to one environment, which binds the token so
94
+ * its workers only take that environment's tasks.
95
+ */
96
+ function workerQueueOf(queue) {
97
+ return queue.environment ? `${queue.name}@${queue.environment.toLowerCase()}` : queue.name;
98
+ }
90
99
  /** The one-line worker start command shown with a new token (no token in it). */
91
100
  function workerRunCommand(taskQueues, bridgeUrl) {
92
- return `FLUIDGRIDS_WORKER_TOKEN=<token> fluidgrids worker run --task-queue ${taskQueues[0] ?? "my-queue"}${bridgeUrl ? ` --bridge-url ${bridgeUrl}` : ""}`;
101
+ return `FLUIDGRIDS_WORKER_TOKEN=<token> fluidgrids worker run --queue ${taskQueues.length > 0 ? taskQueues.join(",") : "my-queue"}${bridgeUrl ? ` --bridge-url ${bridgeUrl}` : ""}`;
93
102
  }
94
103
 
95
104
  // src/modules/task-queues/components/TaskQueueDialogs.tsx
@@ -356,6 +365,11 @@ function WorkerTokenDialog({ queues, canSetAllowlist, onClose, onCreated }) {
356
365
  className: "text-sm text-text-secondary",
357
366
  children: tr("fluidgrids.taskQueues.noQueues", "Create a self-hosted queue first.")
358
367
  }),
368
+ queues.some((queue) => queue.includes("@")) && /* @__PURE__ */ jsx("p", {
369
+ className: "text-xs text-text-secondary",
370
+ "data-testid": "worker-token-environment-hint",
371
+ children: tr("fluidgrids.taskQueues.tokenEnvironmentHint", "A queue shown as name@environment binds the token: its workers only take tasks of runs in that environment. A plain name serves every environment.")
372
+ }),
359
373
  queues.map((queue) => /* @__PURE__ */ jsxs("label", {
360
374
  className: "flex items-center gap-2 text-sm text-text-primary",
361
375
  children: [/* @__PURE__ */ jsx("input", {
@@ -555,7 +569,7 @@ function TaskQueuesContent() {
555
569
  const [issuing, setIssuing] = useState(false);
556
570
  const [secret, setSecret] = useState(null);
557
571
  const [allowlist, setAllowlist] = useState(null);
558
- const selfHosted = (queues.data ?? []).filter((queue) => queue.kind === "SELF_HOSTED").map((queue) => queue.name);
572
+ const selfHosted = [...new Set((queues.data ?? []).filter((queue) => queue.kind === "SELF_HOSTED").map(workerQueueOf))];
559
573
  const removeQueue = async () => {
560
574
  if (!deleting?.id) return;
561
575
  try {
@@ -3,8 +3,9 @@ import { r as getFluidGridsConfig } from "./config-X97zrIvn.js";
3
3
  import { o as throwIfResultError } from "./errors-xPZ-IbQd.js";
4
4
  import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
5
5
  import { n as getGlobalStoreClient } from "./global-client-DP_Wxe5t.js";
6
- import { c as ensureInstalledNodeTypesLoaded, d as ensureRegistryNodeTypesLoaded, i as AVAILABLE_NODES, o as NODE_CONFIGS, t as FluidGridsContext, un as useFluidGridsAnalytics, y as GetMyNodeInstallationsDocument } from "./FluidGridsProvider-Dxehlm-2.js";
6
+ import { c as ensureInstalledNodeTypesLoaded, d as ensureRegistryNodeTypesLoaded, i as AVAILABLE_NODES, o as NODE_CONFIGS, t as FluidGridsContext, un as useFluidGridsAnalytics, y as GetMyNodeInstallationsDocument } from "./FluidGridsProvider-CPLfIarV.js";
7
7
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
8
+ import { n as storeIconCandidates, t as StoreIcon } from "./store-icon-BOiBSHY6.js";
8
9
  import { o as isNodeTypeHiddenFromPalette } from "./durable-nodes-DXCCQYWD.js";
9
10
  import { h as usePhaseDFlags } from "./feature-flags-B_b8PJ6Z.js";
10
11
  import { c as isQuotaExhaustedFailure } from "./quota-Cdt8yz7N.js";
@@ -13,15 +14,14 @@ import { n as InstallWorkflowNodeDocument } from "./global-operations-7pvXw_j9.j
13
14
  import { t as cn } from "./cn-QqidFIgr.js";
14
15
  import { t as Button } from "./button-DG7y_FVJ.js";
15
16
  import { i as SdkPermissionButton, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
16
- import { t as useGlobalStoreClient } from "./useGlobalStoreClient-BOI2kYRv.js";
17
+ import { t as useGlobalStoreClient } from "./useGlobalStoreClient-B42oOe9Q.js";
17
18
  import { r as templateInstallSource } from "./template-code-CEjudJEY.js";
18
19
  import { t as Badge } from "./badge-CXfPhoMH.js";
19
- import { t as templatePreview } from "./template-preview-C01KV277.js";
20
+ import { t as templatePreviewCandidates } from "./template-preview-BpP8QMAe.js";
20
21
  import { n as useNavigationV2 } from "./useNavigationV2-C2WeqN7d.js";
21
- import React, { Suspense, forwardRef, lazy, useCallback, useContext, useMemo, useState } from "react";
22
+ import { Suspense, forwardRef, lazy, useCallback, useContext, useMemo, useState } from "react";
22
23
  import { useQuery } from "@apollo/client/react";
23
24
  import { gql } from "@apollo/client/core";
24
- import { Icon } from "@iconify/react";
25
25
  import { jsx, jsxs } from "react/jsx-runtime";
26
26
  import { toast } from "sonner";
27
27
  import { useEventBus } from "@burdenoff/fe-libs/shared/events";
@@ -168,6 +168,15 @@ const BrowseWorkflowTemplatesDocument = {
168
168
  "arguments": [],
169
169
  "directives": []
170
170
  },
171
+ {
172
+ "kind": "Field",
173
+ "name": {
174
+ "kind": "Name",
175
+ "value": "iconUrl"
176
+ },
177
+ "arguments": [],
178
+ "directives": []
179
+ },
171
180
  {
172
181
  "kind": "Field",
173
182
  "name": {
@@ -773,21 +782,32 @@ function getStoreNodeAvailability(node, isInstalled, options = {}) {
773
782
  };
774
783
  }
775
784
  /**
776
- * The icon a store listing shows.
785
+ * The icon the registry carries for a node type, from the node's manifest.
777
786
  *
778
787
  * Listings for the built-in nodes are seeded without an icon, so every one of
779
788
  * them rendered as a letter tile in the Node Store while the canvas showed the
780
- * node's real icon (BOFF-7651). The registry already carries that icon from
781
- * the node's manifest, so a listing without its own falls back to it. A
782
- * listing's own icon always wins; `null` means "no icon anywhere", and the
783
- * caller draws its letter tile.
789
+ * node's real icon (BOFF-7651). A listing without its own icon falls back to
790
+ * this one.
784
791
  */
785
- function getStoreNodeIcon(listingIcon, nodeType) {
786
- if (listingIcon) return listingIcon;
792
+ function registeredNodeIcon(nodeType) {
787
793
  if (!nodeType) return null;
788
794
  return AVAILABLE_NODES.find((availableNode) => availableNode.type === nodeType)?.icon || null;
789
795
  }
790
796
  /**
797
+ * Every icon a store listing can show, best first: the store's
798
+ * browser-ready `iconUrl`, then the raw listing `icon`, then the icon the
799
+ * node registers in its manifest. The icon component walks this list when an
800
+ * image fails to load, ending at the caller's letter tile, so an expired
801
+ * presigned link or a dead third-party URL never shows a broken image.
802
+ */
803
+ function storeNodeIconCandidates(listing, nodeType) {
804
+ return storeIconCandidates([
805
+ listing.iconUrl,
806
+ listing.icon,
807
+ registeredNodeIcon(nodeType)
808
+ ]);
809
+ }
810
+ /**
791
811
  * The version to show for a store node: the node's own version from its
792
812
  * manifest (`nodeVersion`, then `identity.version`), falling back to the
793
813
  * product's `manifestVersion`. The product field is usually the manifest
@@ -1621,7 +1641,7 @@ async function dismissToastWhenShown(id) {
1621
1641
  }
1622
1642
 
1623
1643
  // src/hooks/store/useTemplateImportFlow.tsx
1624
- const LazyTemplateConfigurationModal = lazy(() => import("./TemplateConfigurationModal-BtzI-4fr.js").then((m) => ({ default: m.TemplateConfigurationModal })));
1644
+ const LazyTemplateConfigurationModal = lazy(() => import("./TemplateConfigurationModal-DmM7s1zk.js").then((m) => ({ default: m.TemplateConfigurationModal })));
1625
1645
  /**
1626
1646
  * "Use this template", the same everywhere it is offered: the builder's
1627
1647
  * template panel, the Templates page and the template preview page
@@ -1869,37 +1889,27 @@ function UsageCounts({ template }) {
1869
1889
  function TemplateCard({ template, onClick, onUseTemplate }) {
1870
1890
  const tr = useTr();
1871
1891
  const v2 = useNavigationV2();
1872
- const [imageError, setImageError] = React.useState(false);
1873
- const preview = templatePreview(template);
1874
- const previewImage = preview.kind === "image" ? preview.src : void 0;
1875
- const hasPreview = Boolean(previewImage) && !imageError;
1892
+ const previewCandidates = templatePreviewCandidates(template);
1876
1893
  const handleUseTemplate = (e) => {
1877
1894
  e.stopPropagation();
1878
1895
  onUseTemplate?.(template);
1879
1896
  };
1880
- const handleImageError = () => {
1881
- setImageError(true);
1882
- };
1883
1897
  return /* @__PURE__ */ jsxs(Card, {
1884
1898
  className: cn("group overflow-hidden transition-all duration-300 cursor-pointer", "hover:shadow-xl hover:scale-[1.02] border-2 hover:border-primary/50"),
1885
1899
  onClick,
1886
1900
  children: [/* @__PURE__ */ jsxs("div", {
1887
1901
  className: "relative aspect-video w-full overflow-hidden bg-gradient-to-br from-primary/5 to-primary/10",
1888
1902
  children: [
1889
- hasPreview ? /* @__PURE__ */ jsx("img", {
1890
- src: previewImage,
1891
- alt: template.name,
1892
- onError: handleImageError,
1893
- className: "w-full h-full object-cover group-hover:scale-110 transition-transform duration-300"
1894
- }) : /* @__PURE__ */ jsx("div", {
1903
+ /* @__PURE__ */ jsx("div", {
1895
1904
  className: "w-full h-full flex items-center justify-center",
1896
- children: preview.kind === "icon" ? /* @__PURE__ */ jsx(Icon, {
1897
- icon: preview.name,
1898
- width: 64,
1899
- height: 64,
1900
- className: "text-primary/60",
1901
- "aria-hidden": "true"
1902
- }) : /* @__PURE__ */ jsx(Sparkles, { className: "size-16 text-primary/30" })
1905
+ children: /* @__PURE__ */ jsx(StoreIcon, {
1906
+ candidates: previewCandidates,
1907
+ alt: template.name,
1908
+ imageClassName: "w-full h-full group-hover:scale-110 transition-transform duration-300",
1909
+ iconClassName: "text-primary/60",
1910
+ iconSize: 64,
1911
+ fallback: /* @__PURE__ */ jsx(Sparkles, { className: "size-16 text-primary/30" })
1912
+ })
1903
1913
  }),
1904
1914
  template.featured && /* @__PURE__ */ jsx("div", {
1905
1915
  className: "absolute top-2 right-2",
@@ -1999,4 +2009,4 @@ function TemplateCard({ template, onClick, onUseTemplate }) {
1999
2009
  });
2000
2010
  }
2001
2011
 
2002
- export { CardTitle as C, CardHeader as S, useInstalledNodes as _, buildNodeCheck as a, CardDescription as b, useImportWorkflowTemplate as c, getStoreNodeAvailability as d, getStoreNodeIcon as f, storeNodeInstallVersion as g, storeNodeDisplayVersion as h, useTemplateImportFlow as i, useWorkflowTemplates as l, isStoreNodeUpdateAvailable as m, formatTemplatePrice as n, buildRequiredNodeTypes as o, getStoreNodeType as p, isPaidTemplate as r, getWorkflowNodeTypes as s, TemplateCard as t, filterStoreNodesForPalette as u, Card as v, CardFooter as x, CardContent as y };
2012
+ export { CardTitle as C, CardHeader as S, useInstalledNodes as _, buildNodeCheck as a, CardDescription as b, useImportWorkflowTemplate as c, getStoreNodeAvailability as d, getStoreNodeType as f, storeNodeInstallVersion as g, storeNodeIconCandidates as h, useTemplateImportFlow as i, useWorkflowTemplates as l, storeNodeDisplayVersion as m, formatTemplatePrice as n, buildRequiredNodeTypes as o, isStoreNodeUpdateAvailable as p, isPaidTemplate as r, getWorkflowNodeTypes as s, TemplateCard as t, filterStoreNodesForPalette as u, Card as v, CardFooter as x, CardContent as y };
@@ -3,7 +3,7 @@ import { a as DialogFooter, i as DialogDescription, l as DialogTitle, o as Dialo
3
3
  import { t as Input } from "./input-ChT6Q-Pr.js";
4
4
  import { t as Button } from "./button-DG7y_FVJ.js";
5
5
  import { t as Badge } from "./badge-CXfPhoMH.js";
6
- import { t as Label } from "./label-CDy86rIZ.js";
6
+ import { t as Label } from "./label-BMVzJ2yW.js";
7
7
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
8
8
  import { t as OpenTemplateAsCodeButton } from "./OpenTemplateAsCodeButton-C-6JVZoS.js";
9
9
  import { useEffect, useMemo, useState } from "react";
@@ -2,9 +2,9 @@
2
2
  import { t as Button } from "./button-DG7y_FVJ.js";
3
3
  import { t as Badge } from "./badge-CXfPhoMH.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
- import { t as templatePreview } from "./template-preview-C01KV277.js";
5
+ import { t as templatePreviewCandidates } from "./template-preview-BpP8QMAe.js";
6
+ import { t as StoreIcon } from "./store-icon-BOiBSHY6.js";
6
7
  import { i as SdkPermissionButton, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
7
- import { Icon } from "@iconify/react";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import { Calendar, Download, ExternalLink, Eye, Sparkles, Star, Tag, User, X } from "lucide-react";
10
10
 
@@ -32,7 +32,7 @@ function formatDate(dateStr) {
32
32
  */
33
33
  function TemplateDetailPanel({ template, onClose, onUseTemplate }) {
34
34
  const tr = useTr();
35
- const preview = templatePreview(template);
35
+ const previewCandidates = templatePreviewCandidates(template);
36
36
  return /* @__PURE__ */ jsxs("div", {
37
37
  className: "w-full md:w-1/2 lg:w-2/5 border-l bg-background overflow-y-auto",
38
38
  children: [/* @__PURE__ */ jsxs("div", {
@@ -53,19 +53,16 @@ function TemplateDetailPanel({ template, onClose, onUseTemplate }) {
53
53
  /* @__PURE__ */ jsxs("div", {
54
54
  className: "relative aspect-video w-full rounded-lg overflow-hidden bg-gradient-to-br from-primary/5 to-primary/10",
55
55
  children: [
56
- preview.kind === "image" ? /* @__PURE__ */ jsx("img", {
57
- src: preview.src,
58
- alt: template.name,
59
- className: "w-full h-full object-cover"
60
- }) : /* @__PURE__ */ jsx("div", {
56
+ /* @__PURE__ */ jsx("div", {
61
57
  className: "w-full h-full flex items-center justify-center",
62
- children: preview.kind === "icon" ? /* @__PURE__ */ jsx(Icon, {
63
- icon: preview.name,
64
- width: 64,
65
- height: 64,
66
- className: "text-primary/60",
67
- "aria-hidden": "true"
68
- }) : /* @__PURE__ */ jsx(Sparkles, { className: "size-16 text-primary/30" })
58
+ children: /* @__PURE__ */ jsx(StoreIcon, {
59
+ candidates: previewCandidates,
60
+ alt: template.name,
61
+ imageClassName: "w-full h-full",
62
+ iconClassName: "text-primary/60",
63
+ iconSize: 64,
64
+ fallback: /* @__PURE__ */ jsx(Sparkles, { className: "size-16 text-primary/30" })
65
+ })
69
66
  }),
70
67
  /* @__PURE__ */ jsx("div", {
71
68
  className: "absolute top-2 left-2",
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { t as ThemeProvider } from "./theme-provider-B3mIuz2d.js";
4
- import { t as FlowBuilderPage } from "./flow-builder-CIvz3sOr.js";
5
- import { _ as useInstalledNodes, a as buildNodeCheck, c as useImportWorkflowTemplate, i as useTemplateImportFlow, n as formatTemplatePrice, o as buildRequiredNodeTypes, r as isPaidTemplate } from "./TemplateCard-DD3vJ3a5.js";
6
- import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-BEsj0A-I.js";
4
+ import { t as FlowBuilderPage } from "./flow-builder-ConlP_db.js";
5
+ import { _ as useInstalledNodes, a as buildNodeCheck, c as useImportWorkflowTemplate, i as useTemplateImportFlow, n as formatTemplatePrice, o as buildRequiredNodeTypes, r as isPaidTemplate } from "./TemplateCard-C_YMW80k.js";
6
+ import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-DTpI0jfj.js";
7
7
  import { n as WithOpenTemplateAsCode } from "./OpenTemplateAsCodeButton-C-6JVZoS.js";
8
8
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
9
9
  import { i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
@@ -12,7 +12,7 @@ import { n as useNavigationV2 } from "./useNavigationV2-C2WeqN7d.js";
12
12
  import { t as describeOperationError } from "./errors-xPZ-IbQd.js";
13
13
  import { t as Disclosure } from "./Disclosure-CsxDspR7.js";
14
14
  import { c as useVariables, t as useCreateVariable } from "./useVariables-DFdZofLQ.js";
15
- import { t as PaidTemplateConfirm } from "./PaidTemplateConfirm-BUBCnbP0.js";
15
+ import { t as PaidTemplateConfirm } from "./PaidTemplateConfirm-D20JFNCb.js";
16
16
  import { useEffect, useMemo, useState } from "react";
17
17
  import { useLocation, useNavigate, useParams } from "react-router";
18
18
  import { Icon } from "@iconify/react";
@@ -1,23 +1,24 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, s as useDuplicateWorkflow } from "./useWorkflows-CXwXQg74.js";
4
- import { i as useTemplateImportFlow, l as useWorkflowTemplates, r as isPaidTemplate, t as TemplateCard } from "./TemplateCard-DD3vJ3a5.js";
3
+ import { h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, s as useDuplicateWorkflow } from "./useWorkflows-B5kFIfrZ.js";
4
+ import { i as useTemplateImportFlow, l as useWorkflowTemplates, r as isPaidTemplate, t as TemplateCard } from "./TemplateCard-C_YMW80k.js";
5
5
  import { tL as WorkflowStatus } from "./graphql-types-D82O-0XY.js";
6
6
  import { i as SdkPermissionButton, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
7
- import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-BEsj0A-I.js";
7
+ import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-DTpI0jfj.js";
8
8
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
9
- import { t as FluidGridsContext, un as useFluidGridsAnalytics } from "./FluidGridsProvider-Dxehlm-2.js";
9
+ import { t as FluidGridsContext, un as useFluidGridsAnalytics } from "./FluidGridsProvider-CPLfIarV.js";
10
10
  import { a as emitTemplateUsed } from "./fluidgridsEvents-Dm5CaHtr.js";
11
11
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
12
12
  import { r as templatesControls } from "./pageControlSpecs-DZJ9K37m.js";
13
13
  import { c as isQuotaExhaustedFailure, t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
14
14
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
15
- import { t as useGlobalStoreClient } from "./useGlobalStoreClient-BOI2kYRv.js";
15
+ import { t as useGlobalStoreClient } from "./useGlobalStoreClient-B42oOe9Q.js";
16
16
  import { o as throwIfResultError, t as describeOperationError } from "./errors-xPZ-IbQd.js";
17
+ import { t as NodeTypeIcon } from "./node-type-icon-DEAztACh.js";
17
18
  import { n as formatRunVersion } from "./run-display-UjLAoYqQ.js";
18
19
  import { n as useNavigationV2 } from "./useNavigationV2-C2WeqN7d.js";
19
20
  import { t as TechnicalDetails } from "./TechnicalDetails-r5JXr1jZ.js";
20
- import { t as PaidTemplateConfirm } from "./PaidTemplateConfirm-BUBCnbP0.js";
21
+ import { t as PaidTemplateConfirm } from "./PaidTemplateConfirm-D20JFNCb.js";
21
22
  import { r as getFluidGridsConfig } from "./config-X97zrIvn.js";
22
23
  import { t as cn } from "./cn-QqidFIgr.js";
23
24
  import { useCallback, useContext, useEffect, useMemo, useState } from "react";
@@ -1262,10 +1263,11 @@ function MySubmissionsPanel({ onResubmit }) {
1262
1263
  className: "flex items-start gap-3 min-w-0",
1263
1264
  children: [/* @__PURE__ */ jsx("div", {
1264
1265
  className: "rounded-lg bg-surface-sunken p-2.5 shrink-0",
1265
- children: /* @__PURE__ */ jsx(Icon, {
1266
- icon: submission.icon ?? "mdi:workflow",
1267
- width: 22,
1268
- className: "text-text-primary"
1266
+ children: /* @__PURE__ */ jsx(NodeTypeIcon, {
1267
+ icon: submission.icon,
1268
+ alt: submission.name,
1269
+ fallbackIcon: "mdi:workflow",
1270
+ className: "size-[22px] text-text-primary"
1269
1271
  })
1270
1272
  }), /* @__PURE__ */ jsxs("div", {
1271
1273
  className: "min-w-0",
@@ -1,21 +1,21 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { d as releaseLeaseKeptForReload, f as useWorkflowReloadStore, t as FlowBuilderPage } from "./flow-builder-CIvz3sOr.js";
3
+ import { d as releaseLeaseKeptForReload, f as useWorkflowReloadStore, t as FlowBuilderPage } from "./flow-builder-ConlP_db.js";
4
4
  import { n as registerLiveCanvasHandler } from "./liveCanvas-D5ytXDp8.js";
5
5
  import { r as getFluidGridsConfig } from "./config-X97zrIvn.js";
6
6
  import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
7
7
  import { o as throwIfResultError } from "./errors-xPZ-IbQd.js";
8
8
  import { t as WorkflowDefinitionDocument } from "./WorkflowDefinitionDocument-DZLbTPUZ.js";
9
9
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
10
- import { $t as workflowFingerprint, Jt as codeBuildIdOf, M as createConfiguredNode, Tt as useSaveStatusStore, U as paramsFromOperation, Ut as rememberRevision, cn as resolveNodeOperation, g as registerWorkflowNodeTypes, h as registerNodeManifests, m as refetchStoreNodes, o as NODE_CONFIGS, u as ensureNodeTypesLoaded, xt as classifyCreateRefusal, yt as blankWorkflowCreateInput } from "./FluidGridsProvider-Dxehlm-2.js";
11
- import { A as useFlowStore } from "./node-operation-selection-bFx9s45-.js";
10
+ import { $t as workflowFingerprint, Jt as codeBuildIdOf, M as createConfiguredNode, Tt as useSaveStatusStore, U as paramsFromOperation, Ut as rememberRevision, cn as resolveNodeOperation, g as registerWorkflowNodeTypes, h as registerNodeManifests, m as refetchStoreNodes, o as NODE_CONFIGS, u as ensureNodeTypesLoaded, xt as classifyCreateRefusal, yt as blankWorkflowCreateInput } from "./FluidGridsProvider-CPLfIarV.js";
11
+ import { A as useFlowStore } from "./node-operation-selection-DHbtGNrG.js";
12
12
  import { t as canvasFromDefinition } from "./definition-canvas-DL25_6NH.js";
13
- import { l as useLazyWorkflowDefinition, n as useCreateWorkflow } from "./useWorkflows-CXwXQg74.js";
14
- import { _ as useInstalledNodes, a as buildNodeCheck, o as buildRequiredNodeTypes, s as getWorkflowNodeTypes } from "./TemplateCard-DD3vJ3a5.js";
13
+ import { l as useLazyWorkflowDefinition, n as useCreateWorkflow } from "./useWorkflows-B5kFIfrZ.js";
14
+ import { _ as useInstalledNodes, a as buildNodeCheck, o as buildRequiredNodeTypes, s as getWorkflowNodeTypes } from "./TemplateCard-C_YMW80k.js";
15
15
  import { r as mergeStickyNotes } from "./sticky-notes-23j-wL6Q.js";
16
16
  import { c as withoutGuidedTourIntent, l as decideMissingWorkflow, o as isGuidedTourIntent, s as pickGuidedTour, u as isCreateIntent } from "./firstWorkflow-C_h0KMB2.js";
17
17
  import { t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
18
- import { c as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-qGat2KNz.js";
18
+ import { c as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-D80HIo-F.js";
19
19
  import { Suspense, lazy, useCallback, useEffect, useMemo, useRef, useState } from "react";
20
20
  import { useLocation, useNavigate, useParams } from "react-router";
21
21
  import { Icon } from "@iconify/react";
@@ -1,12 +1,12 @@
1
1
  "use client";
2
- import { fn as useCanvasEdges, n as FluidGridsProvider } from "./FluidGridsProvider-Dxehlm-2.js";
3
- import { A as useFlowStore } from "./node-operation-selection-bFx9s45-.js";
2
+ import { fn as useCanvasEdges, n as FluidGridsProvider } from "./FluidGridsProvider-CPLfIarV.js";
3
+ import { A as useFlowStore } from "./node-operation-selection-DHbtGNrG.js";
4
4
  import { t as Button } from "./button-DG7y_FVJ.js";
5
5
  import { t as Input } from "./input-ChT6Q-Pr.js";
6
- import { v as Card } from "./TemplateCard-DD3vJ3a5.js";
6
+ import { v as Card } from "./TemplateCard-C_YMW80k.js";
7
7
  import { t as cn } from "./cn-QqidFIgr.js";
8
8
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
9
- import { m as FluidGridsMark, p as useNodeSelectedEvent } from "./flow-builder-CIvz3sOr.js";
9
+ import { m as FluidGridsMark, p as useNodeSelectedEvent } from "./flow-builder-ConlP_db.js";
10
10
  import { useCallback, useEffect, useRef, useState } from "react";
11
11
  import { Background, Controls, Handle, MarkerType, MiniMap, Position, ReactFlow, ReactFlowProvider, useReactFlow } from "@xyflow/react";
12
12
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { m as useWorkflowDefinition } from "./useWorkflows-CXwXQg74.js";
3
+ import { m as useWorkflowDefinition } from "./useWorkflows-B5kFIfrZ.js";
4
4
  import { Navigate, useParams } from "react-router";
5
5
  import { Icon } from "@iconify/react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { c as useImportWorkflow, h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, n as useCreateWorkflow, o as useDeleteWorkflow, s as useDuplicateWorkflow, u as usePreviewN8nImport } from "./useWorkflows-CXwXQg74.js";
4
- import { St as createThenOpen, t as FluidGridsContext } from "./FluidGridsProvider-Dxehlm-2.js";
5
- import { a as saveWorkflowDescription, c as CreateWorkflowRefusalDialog, o as visibleWorkflowDescription, r as commitWorkflowDescription, s as workflowDescriptionCharactersLeft, t as useExportWorkflowAs } from "./useWorkflowCodeExport-qGat2KNz.js";
3
+ import { c as useImportWorkflow, h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, n as useCreateWorkflow, o as useDeleteWorkflow, s as useDuplicateWorkflow, u as usePreviewN8nImport } from "./useWorkflows-B5kFIfrZ.js";
4
+ import { St as createThenOpen, t as FluidGridsContext } from "./FluidGridsProvider-CPLfIarV.js";
5
+ import { a as saveWorkflowDescription, c as CreateWorkflowRefusalDialog, o as visibleWorkflowDescription, r as commitWorkflowDescription, s as workflowDescriptionCharactersLeft, t as useExportWorkflowAs } from "./useWorkflowCodeExport-D80HIo-F.js";
6
6
  import { c as isQuotaExhaustedFailure, t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
7
- import { A as useFlowStore } from "./node-operation-selection-bFx9s45-.js";
7
+ import { A as useFlowStore } from "./node-operation-selection-DHbtGNrG.js";
8
8
  import { a as SdkPermissionGate, i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
9
- import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-BEsj0A-I.js";
9
+ import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-DTpI0jfj.js";
10
10
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
11
11
  import { a as isExecutionMode, i as isAutonomyLevel, n as EXECUTION_MODES, o as useAutonomyLevelCopy, r as EXECUTION_MODE_ICONS, s as useExecutionModeCopy } from "./run-mode-Du-fvjtE.js";
12
12
  import { DI as WorkflowExportFormat, _I as WorkflowAccessFilter } from "./graphql-types-D82O-0XY.js";
@@ -17,7 +17,7 @@ import { d as useFluidGridsFlag, t as FLUIDGRIDS_FLAGS } from "./feature-flags-B
17
17
  import { n as downloadWorkflowExport, r as parseWorkflowImport } from "./workflow-transfer-CQnQC-ke.js";
18
18
  import { a as useWorkflowProjects, i as useWorkflowProjectActions, n as useWorkflowFolderActions, r as useWorkflowFolders, t as useBulkWorkflowActions } from "./useWorkflowOrganization-r5FWNBs6.js";
19
19
  import { t as describeOperationError } from "./errors-xPZ-IbQd.js";
20
- import { a as useExecutions } from "./useExecutions-lRqeXDYS.js";
20
+ import { a as useExecutions } from "./useExecutions-6P7ohzlh.js";
21
21
  import { a as firstWorkflowProgress, i as builderPathFor, r as GUIDED_TOUR_STATE } from "./firstWorkflow-C_h0KMB2.js";
22
22
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
23
23
  import { i as workflowsListControls } from "./pageControlSpecs-DZJ9K37m.js";
@@ -1,8 +1,8 @@
1
1
  "use client";
2
- import { A as SENSITIVE_PARAM, M as createConfiguredNode, Tt as useSaveStatusStore, U as paramsFromOperation, V as nodeTitle, W as selectedOperationOf, _ as registryNodeData, ct as autosaveAllowedFor, f as isNodeConfigsInitialized, gt as isFlowComplete, o as NODE_CONFIGS, z as fixedParameterState } from "./FluidGridsProvider-Dxehlm-2.js";
3
- import { A as useFlowStore, T as resolveOutputHandles, w as resolveInputHandles } from "./node-operation-selection-bFx9s45-.js";
2
+ import { A as SENSITIVE_PARAM, M as createConfiguredNode, Tt as useSaveStatusStore, U as paramsFromOperation, V as nodeTitle, W as selectedOperationOf, _ as registryNodeData, ct as autosaveAllowedFor, f as isNodeConfigsInitialized, gt as isFlowComplete, o as NODE_CONFIGS, z as fixedParameterState } from "./FluidGridsProvider-CPLfIarV.js";
3
+ import { A as useFlowStore, T as resolveOutputHandles, w as resolveInputHandles } from "./node-operation-selection-DHbtGNrG.js";
4
4
  import { o as isNodeTypeHiddenFromPalette } from "./durable-nodes-DXCCQYWD.js";
5
- import { t as computeAttachPosition } from "./attach-node-helpers-CCWFS75V.js";
5
+ import { t as computeAttachPosition } from "./attach-node-helpers-4d-YMaBH.js";
6
6
  import { AgentToolError, defineAgentTool } from "@burdenoff/fe-libs/shared/agent-tools";
7
7
  import { z } from "zod";
8
8
 
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { a as mappingTypeColor, i as compatibilityColor, n as MAPPING_FALLBACK_COLOR, r as MAPPING_TYPE_COLORS, t as MAPPING_COMPATIBILITY_COLORS } from "./mapping-colors-BIX_YeCQ.js";
3
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
4
- import * as React$1 from "react";
4
+ import * as React from "react";
5
5
  import { createContext, memo, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
6
6
  import { Background, Controls, Handle, MiniMap, Panel, Position, ReactFlow, ReactFlowProvider, addEdge, getBezierPath, useEdgesState, useNodesState } from "@xyflow/react";
7
7
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -14,7 +14,7 @@ import { GraphQLEnumType, GraphQLInputObjectType, GraphQLInterfaceType, GraphQLL
14
14
 
15
15
  // src/builder/components/mapper/theme-provider.tsx
16
16
  function ThemeProvider$1({ children, defaultTheme = "system", storageKey = "vite-ui-theme" }) {
17
- React$1.useEffect(() => {
17
+ React.useEffect(() => {
18
18
  if (typeof window !== "undefined") try {
19
19
  localStorage.removeItem(storageKey);
20
20
  } catch (err) {
@@ -814,8 +814,8 @@ function toast({ ...props }) {
814
814
  };
815
815
  }
816
816
  function useToast() {
817
- const [state, setState] = React$1.useState(memoryState);
818
- React$1.useEffect(() => {
817
+ const [state, setState] = React.useState(memoryState);
818
+ React.useEffect(() => {
819
819
  listeners.push(setState);
820
820
  return () => {
821
821
  const index = listeners.indexOf(setState);
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { w as resolveInputHandles } from "./node-operation-selection-bFx9s45-.js";
2
+ import { w as resolveInputHandles } from "./node-operation-selection-DHbtGNrG.js";
3
3
 
4
4
  // src/builder/hooks/attach-node-helpers.ts
5
5
  /** Horizontal gap between a source node and a node attached via the "+" flow. */
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { n as useAgentMarksStore, r as toPlainText } from "./marksStore-a9oIMMot.js";
3
- import { U as paramsFromOperation, V as nodeTitle, W as selectedOperationOf } from "./FluidGridsProvider-Dxehlm-2.js";
4
- import { A as useFlowStore } from "./node-operation-selection-bFx9s45-.js";
3
+ import { U as paramsFromOperation, V as nodeTitle, W as selectedOperationOf } from "./FluidGridsProvider-CPLfIarV.js";
4
+ import { A as useFlowStore } from "./node-operation-selection-DHbtGNrG.js";
5
5
  import { t as notesKeyOf } from "./notesKey-5EaREBGA.js";
6
6
  import { AgentToolError, defineAgentTool } from "@burdenoff/fe-libs/shared/agent-tools";
7
7
  import { z } from "zod";
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as ExecutionsListPage } from "./ExecutionsListPage-BRvj71Nd.js";
3
- import { t as ExecutionDetailPage } from "./ExecutionDetailPage-BfFrWnBj.js";
2
+ import { t as ExecutionsListPage } from "./ExecutionsListPage-BpHBy1JU.js";
3
+ import { t as ExecutionDetailPage } from "./ExecutionDetailPage-C0lNp122.js";
4
4
 
5
5
  export { ExecutionDetailPage, ExecutionsListPage };