@burdenoff/fluidgrids-fe-sdk 2026.1114.7 → 2026.1115.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 (48) hide show
  1. package/dist/{AiStudioPage-DLl4ld32.js → AiStudioPage-CtHmZ3Lw.js} +4 -4
  2. package/dist/{DataSinkDashboardPage-Dnp1yRYQ.js → DataSinkDashboardPage-DFtWv2nD.js} +1 -1
  3. package/dist/{ExecutionDetailPage-DxeySgR3.js → ExecutionDetailPage-D5iWwMnk.js} +5 -5
  4. package/dist/{ExecutionsListPage-CMrOaFKQ.js → ExecutionsListPage-BYW5WiX7.js} +4 -4
  5. package/dist/{FluidGridsProvider-C-WGQwuT.js → FluidGridsProvider-CDjkq3Zj.js} +281 -59
  6. package/dist/{HistoryPage-D4rkw4zu.js → HistoryPage-fMZlXsIY.js} +1 -1
  7. package/dist/{InsightsPage-CVzNu4F7.js → InsightsPage-DozSYGVD.js} +1 -1
  8. package/dist/{PaidTemplateConfirm-IWOHVR6s.js → PaidTemplateConfirm-Crs0CXXl.js} +1 -1
  9. package/dist/{SettingsPage-DwA2ZjyH.js → SettingsPage-qSvV7r0y.js} +3 -3
  10. package/dist/{TemplateCard-9Beuqm5_.js → TemplateCard-BsrXJ1Su.js} +2 -2
  11. package/dist/{TemplatePreview-Bi6LSeH8.js → TemplatePreview-BOIhJSBD.js} +4 -4
  12. package/dist/{TemplatesPage-D9fOKAn4.js → TemplatesPage-dj7NseMt.js} +6 -6
  13. package/dist/{WorkflowBuilder-CdcGE0Mf.js → WorkflowBuilder-ByG9twmu.js} +5 -5
  14. package/dist/{WorkflowBuilder-Bzx-e5lX.js → WorkflowBuilder-DjpAoBVO.js} +3 -3
  15. package/dist/{WorkflowSearchRedirect-0MLrCjDn.js → WorkflowSearchRedirect-DRidTx1L.js} +1 -1
  16. package/dist/{WorkflowsList-CBqxxI44.js → WorkflowsList-BQ_5hkWi.js} +5 -5
  17. package/dist/{agentTools-DuCukaUX.js → agentTools-Cx5yPBe7.js} +3 -2
  18. package/dist/{canvasNoteTools-DnsO-gHe.js → canvasNoteTools-BxknF5rX.js} +1 -1
  19. package/dist/executions.js +2 -2
  20. package/dist/{flow-builder-CbF9P7cI.js → flow-builder-D8f31DFR.js} +22 -18
  21. package/dist/history.js +1 -1
  22. package/dist/{index-D10JzNP1.d.ts → index-BprVea6e.d.ts} +1 -0
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.js +91 -91
  25. package/dist/{node-detail-view-CP6sq02c.js → node-detail-view-C__INEVF.js} +4 -4
  26. package/dist/{node-editor-tab-body-B6kxLf6Q.js → node-editor-tab-body-BintGoSp.js} +2 -2
  27. package/dist/observability.d.ts +1 -1
  28. package/dist/observability.js +2 -2
  29. package/dist/{popover-9gY3-2dY.js → popover-2-6xmS1q.js} +2 -2
  30. package/dist/{quick-config-panel-TGCW64qe.js → quick-config-panel-Bxi9TwCG.js} +3 -3
  31. package/dist/{schedule-panel-zrFYGtkx.js → schedule-panel-BbRtGDEt.js} +4 -4
  32. package/dist/settings.js +1 -1
  33. package/dist/{sidebar-node-editor-BPg2NKzJ.js → sidebar-node-editor-DG-34YEW.js} +3 -3
  34. package/dist/templates.js +2 -2
  35. package/dist/{useAgentDefinitions-9pmnEpb8.js → useAgentDefinitions-YUDx_OW2.js} +1 -1
  36. package/dist/{useDurableParity-gigqyXDq.js → useDurableParity-X_zfFzQv.js} +1 -1
  37. package/dist/{useExecutions-wka2Z5w3.js → useExecutions-BWbMt16D.js} +1 -1
  38. package/dist/{useGlobalStoreClient-BcwWGtm7.js → useGlobalStoreClient-CwBAeiXV.js} +1 -1
  39. package/dist/{useObservability-CjZTYldC.js → useObservability-mXM7lCop.js} +1 -1
  40. package/dist/{useRunHistory-Be-GggNA.js → useRunHistory-DYDriBz1.js} +1 -1
  41. package/dist/{useWorkflowCodeExport-ChAzmhi6.js → useWorkflowCodeExport-uKBDVvnA.js} +1 -1
  42. package/dist/{useWorkflows-BrqrVT8h.js → useWorkflows-Dg7q_Tzf.js} +1 -1
  43. package/dist/workflow-builder.js +4 -4
  44. package/dist/{workflow-description-ReGwCZXS.js → workflow-description-CeXdyWX8.js} +1 -1
  45. package/dist/workflow-pages.d.ts +1 -1
  46. package/dist/workflow-pages.js +13 -13
  47. package/dist/workflows-list.js +1 -1
  48. package/package.json +1 -1
@@ -15,6 +15,7 @@ import { a as collectExtensions, n as QUOTA_EXHAUSTED_CODE, o as errorCodesOf, r
15
15
  import { c as setFluidGridsConfig, l as validateTrustedOrigin, o as resetFluidGridsConfig, r as getFluidGridsConfig, s as resetFluidGridsExecutionState } from "./config-X97zrIvn.js";
16
16
  import { a as useFgAskableAction } from "./askAboutBridge-ByYsQams.js";
17
17
  import { i as readableNodeType } from "./run-display-UjLAoYqQ.js";
18
+ import { Fw as NodeManifestDetail } from "./graphql-types-dS3Fk9Z5.js";
18
19
  import { t as provideNodeRegistryRefresh } from "./node-registry-refresh-s3okf83X.js";
19
20
  import { createContext, memo, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
20
21
  import { useNavigate, useParams } from "react-router";
@@ -3559,6 +3560,23 @@ const NodeManifestsDocument = {
3559
3560
  }
3560
3561
  },
3561
3562
  "directives": []
3563
+ }, {
3564
+ "kind": "VariableDefinition",
3565
+ "variable": {
3566
+ "kind": "Variable",
3567
+ "name": {
3568
+ "kind": "Name",
3569
+ "value": "detail"
3570
+ }
3571
+ },
3572
+ "type": {
3573
+ "kind": "NamedType",
3574
+ "name": {
3575
+ "kind": "Name",
3576
+ "value": "NodeManifestDetail"
3577
+ }
3578
+ },
3579
+ "directives": []
3562
3580
  }],
3563
3581
  "directives": [],
3564
3582
  "selectionSet": {
@@ -3582,6 +3600,19 @@ const NodeManifestsDocument = {
3582
3600
  "value": "refs"
3583
3601
  }
3584
3602
  }
3603
+ }, {
3604
+ "kind": "Argument",
3605
+ "name": {
3606
+ "kind": "Name",
3607
+ "value": "detail"
3608
+ },
3609
+ "value": {
3610
+ "kind": "Variable",
3611
+ "name": {
3612
+ "kind": "Name",
3613
+ "value": "detail"
3614
+ }
3615
+ }
3585
3616
  }],
3586
3617
  "directives": []
3587
3618
  }]
@@ -5383,7 +5414,9 @@ function useNodeExecution() {
5383
5414
  }
5384
5415
  setNodeStatus(nodeId, "running");
5385
5416
  try {
5386
- normalizeWorkflowParameters(workflow.nodes.filter((node) => node.id === nodeId), workflow.edges, (type) => NODE_CONFIGS.find((config) => config.type === type)?.operations);
5417
+ const stepNodes = workflow.nodes.filter((node) => node.id === nodeId);
5418
+ await loadFullManifestsOfSummaries(stepNodes.map((node) => node.type));
5419
+ normalizeWorkflowParameters(stepNodes, workflow.edges, (type) => NODE_CONFIGS.find((config) => config.type === type)?.operations);
5387
5420
  const client = getFluidGridsClient();
5388
5421
  const stepResult = throwIfResultError(await client.mutate({
5389
5422
  mutation: EXECUTE_STEP,
@@ -5498,7 +5531,9 @@ function useNodeExecution() {
5498
5531
  }
5499
5532
  setNodeStatus(triggerNode.id, "running");
5500
5533
  try {
5501
- normalizeWorkflowParameters(workflow.nodes.filter((node) => node.data.disabled !== true), workflow.edges, (type) => NODE_CONFIGS.find((config) => config.type === type)?.operations);
5534
+ const runNodes = workflow.nodes.filter((node) => node.data.disabled !== true);
5535
+ await loadFullManifestsOfSummaries(runNodes.map((node) => node.type));
5536
+ normalizeWorkflowParameters(runNodes, workflow.edges, (type) => NODE_CONFIGS.find((config) => config.type === type)?.operations);
5502
5537
  const client = getFluidGridsClient();
5503
5538
  const triggerResult = throwIfResultError(await client.mutate({
5504
5539
  mutation: TRIGGER_WORKFLOW,
@@ -6827,6 +6862,7 @@ function useSaveWorkflow() {
6827
6862
  const inPlace = !forkRequested && savesInPlace(workflow);
6828
6863
  const expectedRevision = revisionOf(workflow.dbId);
6829
6864
  const client = getFluidGridsClient();
6865
+ await loadFullManifestsOfSummaries((workflow.nodes ?? []).map((node) => node.type));
6830
6866
  const { preparedWorkflow, owned } = builderDefinition(snapshot, workflowKey, !!mintedKey);
6831
6867
  const definitionJson = workflow.dbId && !inPlace ? mergeDefinitionJson(await readStoredDefinition(client, workflow.dbId), owned) : owned;
6832
6868
  let savedVersion = workflow.version;
@@ -8670,7 +8706,8 @@ function asRecord(value) {
8670
8706
  }
8671
8707
  function fallbackOperations(type) {
8672
8708
  if (!type) return void 0;
8673
- return NODE_CONFIGS.find((c) => c.type === type)?.operations;
8709
+ const config = NODE_CONFIGS.find((c) => c.type === type);
8710
+ return config?.manifestDetail === "SUMMARY" ? void 0 : config?.operations;
8674
8711
  }
8675
8712
  function selectedOperationOf(data, type) {
8676
8713
  const live = liveInternalOperations(type);
@@ -8813,6 +8850,11 @@ function useNodeConfig(target, options) {
8813
8850
  }, [nodeId, selectedSource]);
8814
8851
  const sourceNode = useMemo(() => nodes.find((n) => n.id === selectedSource), [nodes, selectedSource]);
8815
8852
  const currentEdge = useMemo(() => incoming.find((e) => e.source === selectedSource), [incoming, selectedSource]);
8853
+ const nodeType = node?.type;
8854
+ const sourceType = sourceNode?.type;
8855
+ useEffect(() => {
8856
+ loadFullManifestsOfSummaries([nodeType, sourceType]);
8857
+ }, [nodeType, sourceType]);
8816
8858
  const registryRevision = useNodeRegistryRevision();
8817
8859
  const currentOp = useMemo(() => {
8818
8860
  return selectedOperationOf(asRecord(node?.data), node?.type);
@@ -9349,7 +9391,9 @@ function pickOperationToPin(type, operationName) {
9349
9391
  /**
9350
9392
  * A new canvas node of `type` at `position`, pinned to its operation the way
9351
9393
  * the Node Store pins it. Pure: no React Flow instance needed, so the builder's
9352
- * agent tools create nodes exactly as a person's click does.
9394
+ * agent tools create nodes exactly as a person's click does. The node type's
9395
+ * full manifest must be registered (`ensureNodeTypeReady`): a palette summary
9396
+ * lacks the operation's form and defaults.
9353
9397
  */
9354
9398
  function createConfiguredNode(type, position, operationName) {
9355
9399
  const newNode = createNodeWithDefaultData(type, {
@@ -9363,13 +9407,25 @@ function createConfiguredNode(type, position, operationName) {
9363
9407
  }
9364
9408
  return newNode;
9365
9409
  }
9410
+ /**
9411
+ * Place a node of `type` on the canvas, selected, at `pos` (the viewport centre
9412
+ * when left out). The palette lists summaries, so the node type's full manifest
9413
+ * is loaded first (BOFF-13066); a type already used in this session is placed at
9414
+ * once. Resolves to the new node, or null when its manifest could not be loaded
9415
+ * (the person is told, and nothing is placed).
9416
+ */
9366
9417
  function useInsertNode() {
9367
9418
  const { addNodes, screenToFlowPosition, getNodes, updateNode } = useReactFlow();
9368
- return useCallback((type, pos, operationName) => {
9419
+ const tr = useTr();
9420
+ return useCallback(async (type, pos, operationName) => {
9369
9421
  const _pos = pos || screenToFlowPosition({
9370
9422
  x: window.innerWidth / 2,
9371
9423
  y: window.innerHeight / 2
9372
9424
  });
9425
+ if (!await ensureNodeTypeReady(type)) {
9426
+ toast.error(tr("fluidgrids.builder.insertNode.loadFailed", "Could not load this node. Check your connection and try again."));
9427
+ return null;
9428
+ }
9373
9429
  getNodes().forEach((node) => {
9374
9430
  if (node.selected) updateNode(node.id, { selected: false });
9375
9431
  });
@@ -9380,7 +9436,8 @@ function useInsertNode() {
9380
9436
  screenToFlowPosition,
9381
9437
  getNodes,
9382
9438
  addNodes,
9383
- updateNode
9439
+ updateNode,
9440
+ tr
9384
9441
  ]);
9385
9442
  }
9386
9443
 
@@ -9831,7 +9888,7 @@ function AdapterPort({ nodeId, adapter, index, total }) {
9831
9888
  const diamondColor = hasConnection ? "bg-[var(--color-accent-primary)]" : "bg-[var(--color-text-muted)]";
9832
9889
  const lineColor = hasConnection ? "before:bg-[var(--color-accent-primary)]" : "before:bg-[var(--color-border-strong)]";
9833
9890
  /** Create the chosen sub-node below the parent and attach it to this port. */
9834
- const addSubNode = useCallback((candidate) => {
9891
+ const addSubNode = useCallback(async (candidate) => {
9835
9892
  setPickerOpen(false);
9836
9893
  const parent = getNode(nodeId);
9837
9894
  const origin = parent?.position ?? {
@@ -9843,7 +9900,7 @@ function AdapterPort({ nodeId, adapter, index, total }) {
9843
9900
  x: origin.x + (index - (total - 1) / 2) * 180,
9844
9901
  y: origin.y + parentHeight + 190
9845
9902
  };
9846
- const created = insertNode(candidate.type, position, candidate.adapterOperation);
9903
+ const created = await insertNode(candidate.type, position, candidate.adapterOperation);
9847
9904
  if (!created?.id) return;
9848
9905
  created.data = {
9849
9906
  ...created.data,
@@ -10201,7 +10258,7 @@ const getNodeMetadata = (value) => {
10201
10258
  }, [executeStep, id]);
10202
10259
  const stepGuard = useRunGuard(handleExecuteStep, { nodeId: id });
10203
10260
  const missingCredentials = useMemo(() => {
10204
- const visibleAdapters = getVisibleConnectionAdapters(String(value?.type ?? ""), data?.operation_name, value?.operations ?? (data?.nodeData)?.operations, data?.nodeData);
10261
+ const visibleAdapters = getVisibleConnectionAdapters(String(value?.type ?? ""), data?.operation_name, (value?.manifestDetail === "SUMMARY" ? void 0 : value?.operations) ?? (data?.nodeData)?.operations, data?.nodeData);
10205
10262
  if (visibleAdapters.length === 0) return false;
10206
10263
  const selected = (data?.args)?.connections ?? (data?.args)?.credentials ?? [];
10207
10264
  return missingRequiredAdapters(visibleAdapters, selected).length > 0;
@@ -10761,12 +10818,19 @@ const GetMyNodeInstallationsDocument = {
10761
10818
 
10762
10819
  // src/builder/components/flow-builder/components/blocks/node-manifests.ts
10763
10820
  /**
10764
- * Refs per request. The server takes up to 500; smaller requests keep each
10765
- * response to a few megabytes (store manifests reach 370 KB each) and let the
10766
- * gateway resolve them side by side.
10821
+ * Full manifests per request. The server takes up to 500; smaller requests keep
10822
+ * each response smaller (a store manifest reaches 620 KB) and let the gateway
10823
+ * resolve them side by side. The builder asks for full manifests only for the
10824
+ * node types it uses, rarely more than a few dozen.
10767
10825
  */
10768
10826
  const NODE_MANIFEST_BATCH_SIZE = 100;
10827
+ /**
10828
+ * Summaries per request: the server's limit. The whole prod palette (about 370
10829
+ * nodes) is one request of well under a megabyte.
10830
+ */
10831
+ const NODE_MANIFEST_SUMMARY_BATCH_SIZE = 500;
10769
10832
  const manifestCache = /* @__PURE__ */ new Map();
10833
+ const summaryCache = /* @__PURE__ */ new Map();
10770
10834
  function manifestKey(nodeType, version) {
10771
10835
  return `${nodeType}@${version}`;
10772
10836
  }
@@ -10791,18 +10855,42 @@ function rememberNodeManifests(values) {
10791
10855
  }
10792
10856
  return manifests;
10793
10857
  }
10794
- /** The cached manifest of an exact node version, if this session loaded it. */
10795
- function cachedNodeManifest(nodeType, version) {
10796
- return manifestCache.get(manifestKey(nodeType, version));
10858
+ /**
10859
+ * Whether `manifest` is a full manifest this session loaded: the one the session
10860
+ * cache holds for its version. A summary never is.
10861
+ */
10862
+ function isFullNodeManifest(manifest) {
10863
+ return manifestCache.get(manifestKey(manifest.nodeType, manifest.version)) === manifest;
10864
+ }
10865
+ /** Keep summaries for the session, apart from the full manifests. */
10866
+ function rememberNodeManifestSummaries(values) {
10867
+ const summaries = [];
10868
+ for (const value of values) {
10869
+ const summary = asNodeManifest(value);
10870
+ if (!summary) continue;
10871
+ const key = manifestKey(summary.nodeType, summary.version);
10872
+ const known = manifestCache.get(key);
10873
+ if (known) {
10874
+ summaries.push(known);
10875
+ continue;
10876
+ }
10877
+ summaryCache.set(key, summary);
10878
+ summaries.push(summary);
10879
+ }
10880
+ return summaries;
10797
10881
  }
10798
10882
  /**
10799
- * Manifests for `refs`: exact versions already in the session cache are served
10800
- * from it; the rest are fetched with `nodeManifests`, at most
10801
- * `NODE_MANIFEST_BATCH_SIZE` refs per request, all requests in parallel. Refs the
10802
- * registry does not know are absent from the result. A failed request is logged
10803
- * and its refs are treated as unknown, so one bad batch never empties the palette.
10883
+ * Manifests for `refs` at the given detail (full by default): exact versions
10884
+ * already in the session cache are served from it; the rest are fetched with
10885
+ * `nodeManifests`, all requests in parallel, at most `NODE_MANIFEST_BATCH_SIZE`
10886
+ * refs per request for full manifests and `NODE_MANIFEST_SUMMARY_BATCH_SIZE` for
10887
+ * summaries. A full manifest in the cache also answers a request for a summary.
10888
+ * Refs the registry does not know are absent from the result. A failed request
10889
+ * is logged and its refs are treated as unknown, so one bad batch never empties
10890
+ * the palette.
10804
10891
  */
10805
- async function loadNodeManifests(client, refs) {
10892
+ async function loadNodeManifests(client, refs, detail = "FULL") {
10893
+ const summary = detail === "SUMMARY";
10806
10894
  const result = [];
10807
10895
  const missing = [];
10808
10896
  const seen = /* @__PURE__ */ new Set();
@@ -10810,20 +10898,25 @@ async function loadNodeManifests(client, refs) {
10810
10898
  const key = manifestKey(ref.nodeType, ref.version ?? "");
10811
10899
  if (!ref.nodeType || seen.has(key)) continue;
10812
10900
  seen.add(key);
10813
- const cached = ref.version ? cachedNodeManifest(ref.nodeType, ref.version) : void 0;
10901
+ const cached = ref.version ? manifestCache.get(key) ?? (summary ? summaryCache.get(key) : void 0) : void 0;
10814
10902
  if (cached) result.push(cached);
10815
10903
  else missing.push(ref.version ? ref : { nodeType: ref.nodeType });
10816
10904
  }
10905
+ const batchSize = summary ? 500 : 100;
10817
10906
  const batches = [];
10818
- for (let i = 0; i < missing.length; i += 100) batches.push(missing.slice(i, i + 100));
10907
+ for (let i = 0; i < missing.length; i += batchSize) batches.push(missing.slice(i, i + batchSize));
10819
10908
  const fetched = await Promise.all(batches.map(async (batch) => {
10820
10909
  try {
10821
10910
  const { data } = await client.query({
10822
10911
  query: NodeManifestsDocument,
10823
- variables: { refs: batch },
10912
+ variables: summary ? {
10913
+ refs: batch,
10914
+ detail: "SUMMARY"
10915
+ } : { refs: batch },
10824
10916
  fetchPolicy: "no-cache"
10825
10917
  });
10826
- return rememberNodeManifests(data?.nodeManifests ?? []);
10918
+ const manifests = data?.nodeManifests ?? [];
10919
+ return summary ? rememberNodeManifestSummaries(manifests) : rememberNodeManifests(manifests);
10827
10920
  } catch (error) {
10828
10921
  const message = error instanceof Error ? error.message : String(error);
10829
10922
  console.error(`[Workflows] Could not load ${batch.length} node manifest(s):`, message);
@@ -10837,7 +10930,7 @@ async function loadNodeManifests(client, refs) {
10837
10930
  // src/builder/components/flow-builder/components/blocks/index.ts
10838
10931
  const NODE_CONFIGS = [];
10839
10932
  /** The registry entry for one manifest. */
10840
- function toNodeConfig(manifest, publishType) {
10933
+ function toNodeConfig(manifest, publishType, manifestDetail = "FULL") {
10841
10934
  const manifestOps = manifest.operations;
10842
10935
  const operations = Array.isArray(manifestOps) ? manifestOps : manifestOps?.operations ?? manifestOps;
10843
10936
  return {
@@ -10864,12 +10957,68 @@ function toNodeConfig(manifest, publishType) {
10864
10957
  }
10865
10958
  },
10866
10959
  operations,
10867
- publishType
10960
+ publishType,
10961
+ manifestDetail
10868
10962
  };
10869
10963
  }
10964
+ /** The registry entry of a node type: the first one, as every reader takes it. */
10965
+ function nodeConfigOf(type) {
10966
+ return type ? NODE_CONFIGS.find((config) => config.type === type) : void 0;
10967
+ }
10870
10968
  function hasNodeConfig(type) {
10871
10969
  return NODE_CONFIGS.some((config) => config.type === type);
10872
10970
  }
10971
+ /**
10972
+ * Whether the node type's registry entry carries its full manifest. False for a
10973
+ * palette summary and for a type the registry does not hold.
10974
+ */
10975
+ function hasFullNodeConfig(type) {
10976
+ const config = nodeConfigOf(type);
10977
+ return config !== void 0 && config.manifestDetail !== "SUMMARY";
10978
+ }
10979
+ /** The node types whose registry entry carries its full manifest. */
10980
+ function fullNodeConfigTypes() {
10981
+ const types = /* @__PURE__ */ new Set();
10982
+ for (const config of NODE_CONFIGS) if (config.manifestDetail !== "SUMMARY") types.add(config.type);
10983
+ return types;
10984
+ }
10985
+ /**
10986
+ * Turn a summary entry into the full one, in place: node components already
10987
+ * created for it read the same object. The node type's registry metadata
10988
+ * (`NODES`, `NODES_METADATA`), which new canvas nodes copy their data from,
10989
+ * takes the full manifest too.
10990
+ */
10991
+ function upgradeNodeConfig(config, manifest) {
10992
+ Object.assign(config, toNodeConfig(manifest, config.publishType ?? manifest.publishType));
10993
+ const entry = NODES.find((node) => node.type === config.type);
10994
+ if (entry) {
10995
+ entry.defaultData = {
10996
+ ...entry.defaultData,
10997
+ version: config.defaultData.version,
10998
+ nodeData: config.defaultData.nodeData
10999
+ };
11000
+ const metadata = NODES_METADATA[config.type];
11001
+ if (metadata) metadata.defaultData = entry.defaultData;
11002
+ }
11003
+ }
11004
+ /**
11005
+ * Register a full manifest: a new entry when its node type has none, or the full
11006
+ * form of the type's summary entry of the same version. An entry that is already
11007
+ * full, or a summary of another version, is left as it is. True when the
11008
+ * registry changed.
11009
+ */
11010
+ function registerFullManifest(manifest) {
11011
+ const config = nodeConfigOf(manifest.nodeType);
11012
+ if (!config) {
11013
+ NODE_CONFIGS.push(toNodeConfig(manifest, manifest.publishType));
11014
+ return true;
11015
+ }
11016
+ if (config.manifestDetail === "SUMMARY" && config.defaultData.version === manifest.version) {
11017
+ upgradeNodeConfig(config, manifest);
11018
+ return true;
11019
+ }
11020
+ return false;
11021
+ }
10873
11022
  /** Add a config unless its node type is already registered. */
10874
11023
  function addNodeConfig(config) {
10875
11024
  if (hasNodeConfig(config.type)) return false;
@@ -10935,8 +11084,13 @@ async function loadInstalledStoreNodes(onlyTypes) {
10935
11084
  /**
10936
11085
  * Load the full palette into NODE_CONFIGS: every available registry node in the
10937
11086
  * registry's order (newest first), then the installed store nodes.
11087
+ *
11088
+ * Palette entries are summaries, except where this session holds the full
11089
+ * manifest of the entry's version. Node types whose entry was full before the
11090
+ * load (the canvas's), and those in `keepFull`, keep a full entry: their full
11091
+ * manifests are loaded before the palette replaces the registry.
10938
11092
  */
10939
- async function initializeNodeConfigs() {
11093
+ async function initializeNodeConfigs(keepFull = /* @__PURE__ */ new Set()) {
10940
11094
  try {
10941
11095
  const client = await waitForFluidGridsClient(15e3, 150);
10942
11096
  if (!client) {
@@ -10953,12 +11107,22 @@ async function initializeNodeConfigs() {
10953
11107
  const manifests = await loadNodeManifests(client, entries.map((entry) => ({
10954
11108
  nodeType: entry.nodeType,
10955
11109
  version: entry.nodeVersion
10956
- })));
11110
+ })), "SUMMARY");
10957
11111
  const byVersion = new Map(manifests.map((manifest) => [`${manifest.nodeType}@${manifest.version}`, manifest]));
11112
+ const full = /* @__PURE__ */ new Set([...keepFull, ...fullNodeConfigTypes()]);
11113
+ const fullRefs = [];
11114
+ for (const entry of entries) {
11115
+ const manifest = byVersion.get(`${entry.nodeType}@${entry.nodeVersion}`);
11116
+ if (manifest && full.has(entry.nodeType) && !isFullNodeManifest(manifest)) fullRefs.push({
11117
+ nodeType: entry.nodeType,
11118
+ version: entry.nodeVersion
11119
+ });
11120
+ }
11121
+ if (fullRefs.length > 0) for (const manifest of await loadNodeManifests(client, fullRefs)) byVersion.set(`${manifest.nodeType}@${manifest.version}`, manifest);
10958
11122
  const palette = [];
10959
11123
  for (const entry of entries) {
10960
11124
  const manifest = byVersion.get(`${entry.nodeType}@${entry.nodeVersion}`);
10961
- if (manifest) palette.push(toNodeConfig(manifest, entry.publishType ?? void 0));
11125
+ if (manifest) palette.push(toNodeConfig(manifest, entry.publishType ?? void 0, isFullNodeManifest(manifest) ? "FULL" : "SUMMARY"));
10962
11126
  }
10963
11127
  const listed = new Set(palette.map((config) => config.type));
10964
11128
  const earlier = NODE_CONFIGS.filter((config) => !listed.has(config.type));
@@ -10988,12 +11152,30 @@ function unregisteredTypes(types) {
10988
11152
  if (isInitialized) return [];
10989
11153
  return [...new Set(types)].filter((type) => isRegistryNodeType(type) && !hasNodeConfig(type));
10990
11154
  }
11155
+ /**
11156
+ * The distinct registry node types of `types` whose full manifest the registry
11157
+ * should load: those without an entry (until the full palette is in, after which
11158
+ * a type it lacks is not available anywhere) and those with a palette summary.
11159
+ */
11160
+ function typesNeedingFullManifest(types) {
11161
+ return [...new Set(types)].filter((type) => {
11162
+ if (!isRegistryNodeType(type)) return false;
11163
+ const config = nodeConfigOf(type);
11164
+ return config ? config.manifestDetail === "SUMMARY" : !isInitialized;
11165
+ });
11166
+ }
10991
11167
  async function loadRegistryNodeTypes(types) {
10992
11168
  try {
10993
11169
  const client = await waitForFluidGridsClient(15e3, 150);
10994
11170
  if (client) {
10995
- const manifests = await loadNodeManifests(client, types.map((nodeType) => ({ nodeType })));
10996
- for (const manifest of manifests) addNodeConfig(toNodeConfig(manifest, manifest.publishType));
11171
+ const manifests = await loadNodeManifests(client, types.map((nodeType) => {
11172
+ const version = nodeConfigOf(nodeType)?.defaultData.version;
11173
+ return version ? {
11174
+ nodeType,
11175
+ version
11176
+ } : { nodeType };
11177
+ }));
11178
+ for (const manifest of manifests) registerFullManifest(manifest);
10997
11179
  }
10998
11180
  } catch (error) {
10999
11181
  const message = error instanceof Error ? error.message : "Unknown error";
@@ -11002,12 +11184,13 @@ async function loadRegistryNodeTypes(types) {
11002
11184
  rebuildNodeArrays();
11003
11185
  }
11004
11186
  /**
11005
- * Register the given node types from the node registry: one batched
11006
- * `nodeManifests` request for the ones not registered yet. Types the registry is
11007
- * known to lack (see `registerNodeManifests`) are not asked about. Never rejects.
11187
+ * Register the given node types from the node registry, with their full
11188
+ * manifests: one batched `nodeManifests` request for the ones not registered
11189
+ * yet or registered as a palette summary. Types the registry is known to lack
11190
+ * (see `registerNodeManifests`) are not asked about. Never rejects.
11008
11191
  */
11009
11192
  function ensureRegistryNodeTypesLoaded(types) {
11010
- const wanted = unregisteredTypes(types).filter((type) => !registryLacks.has(type));
11193
+ const wanted = typesNeedingFullManifest(types).filter((type) => !registryLacks.has(type));
11011
11194
  if (wanted.length === 0) return Promise.resolve();
11012
11195
  const pending = /* @__PURE__ */ new Set();
11013
11196
  const fresh = [];
@@ -11042,12 +11225,13 @@ async function ensureInstalledNodeTypesLoaded(types) {
11042
11225
  rebuildNodeArrays();
11043
11226
  }
11044
11227
  /**
11045
- * Make sure the given node types are registered, without loading the rest of the
11046
- * palette: what a canvas needs before it is drawn. Types already registered cost
11047
- * nothing; the rest are fetched with one batched request, and a type the registry
11048
- * does not carry is looked up among the workspace's installed store nodes. Types
11049
- * that resolve nowhere stay unregistered (the canvas draws them with the fallback
11050
- * card). Never rejects.
11228
+ * Make sure the given node types are registered with their full manifests,
11229
+ * without loading the rest of the palette: what a canvas needs before it is
11230
+ * drawn, saved or run. Types already registered in full cost nothing; the rest
11231
+ * (unregistered, or a palette summary) are fetched with one batched request, and
11232
+ * a type the registry does not carry is looked up among the workspace's
11233
+ * installed store nodes. Types that resolve nowhere stay unregistered (the
11234
+ * canvas draws them with the fallback card). Never rejects.
11051
11235
  */
11052
11236
  async function ensureNodeTypesLoaded(types) {
11053
11237
  const wanted = [...types];
@@ -11055,6 +11239,37 @@ async function ensureNodeTypesLoaded(types) {
11055
11239
  await ensureInstalledNodeTypesLoaded(wanted);
11056
11240
  }
11057
11241
  /**
11242
+ * Load a node type's full manifest before a node of it is placed (BOFF-13066):
11243
+ * the palette holds only summaries. Resolves true when the node can be placed:
11244
+ * its registry entry is full, or the registry holds no entry for it (a
11245
+ * client-side node type, placed from its own defaults as before). False when
11246
+ * only the summary is available, because the full manifest could not be loaded.
11247
+ */
11248
+ async function ensureNodeTypeReady(type) {
11249
+ await ensureNodeTypesLoaded([type]);
11250
+ return nodeConfigOf(type)?.manifestDetail !== "SUMMARY";
11251
+ }
11252
+ /**
11253
+ * Load the full manifests of the given node types that the registry holds only
11254
+ * as palette summaries (BOFF-13066); every other type is left as it is, so this
11255
+ * costs nothing where a canvas's node types are loaded. What the builder's save
11256
+ * and run paths and the node panel call before they read a node's operation
11257
+ * fields. Never rejects.
11258
+ */
11259
+ function loadFullManifestsOfSummaries(types) {
11260
+ const summaries = [...types].filter((type) => nodeConfigOf(type ?? void 0)?.manifestDetail === "SUMMARY");
11261
+ return summaries.length > 0 ? ensureRegistryNodeTypesLoaded(summaries) : Promise.resolve();
11262
+ }
11263
+ /**
11264
+ * Start loading a node type's full manifest ahead of use (a drag that has just
11265
+ * started, a Node Store detail that has just opened), so placing it does not
11266
+ * wait. Never rejects.
11267
+ */
11268
+ function prefetchNodeType(type) {
11269
+ if (!type || hasFullNodeConfig(type)) return;
11270
+ ensureNodeTypesLoaded([type]);
11271
+ }
11272
+ /**
11058
11273
  * Register manifests that arrived with a workflow (`WorkflowDefinition.nodeManifests`)
11059
11274
  * and keep them in the session cache, so the canvas needs no further request.
11060
11275
  *
@@ -11064,7 +11279,7 @@ async function ensureNodeTypesLoaded(types) {
11064
11279
  */
11065
11280
  function registerNodeManifests(values, lookedUp = []) {
11066
11281
  let added = false;
11067
- for (const manifest of rememberNodeManifests(values)) if (addNodeConfig(toNodeConfig(manifest, manifest.publishType))) added = true;
11282
+ for (const manifest of rememberNodeManifests(values)) if (registerFullManifest(manifest)) added = true;
11068
11283
  for (const type of lookedUp) if (isRegistryNodeType(type) && !hasNodeConfig(type)) registryLacks.add(type);
11069
11284
  if (added) rebuildNodeArrays();
11070
11285
  }
@@ -11104,8 +11319,9 @@ async function refetchStoreNodes() {
11104
11319
  return;
11105
11320
  }
11106
11321
  try {
11322
+ const keepFull = fullNodeConfigTypes();
11107
11323
  resetNodeRegistry();
11108
- await initializeNodeConfigs();
11324
+ await initializeNodeConfigs(keepFull);
11109
11325
  isInitialized = NODE_CONFIGS.length > 0;
11110
11326
  rebuildNodeArrays();
11111
11327
  } catch (error) {
@@ -11147,7 +11363,9 @@ function notifyNodeTypesListeners() {
11147
11363
  */
11148
11364
  function liveInternalOperations(type) {
11149
11365
  if (!type?.startsWith("internal:")) return void 0;
11150
- const operations = NODE_CONFIGS.find((c) => c.type === type)?.operations;
11366
+ const config = nodeConfigOf(type);
11367
+ if (!config || config.manifestDetail === "SUMMARY") return void 0;
11368
+ const operations = config.operations;
11151
11369
  return Array.isArray(operations) && operations.length > 0 ? operations : void 0;
11152
11370
  }
11153
11371
  /**
@@ -11268,20 +11486,24 @@ registerBaseNodeTypes();
11268
11486
  * registry entries load in the background and replace it (BOFF-10387).
11269
11487
  */
11270
11488
  function registerWorkflowNodeTypes(workflowNodes) {
11271
- const unknownTypes = [];
11272
- for (const node of workflowNodes) if (node.type && !NODE_TYPES[node.type]) {
11273
- unknownTypes.push(node.type);
11274
- const meta = getNodeMetadata({
11275
- type: node.type,
11276
- defaultData: {
11277
- version: node.data?.version,
11278
- nodeData: node.data?.nodeData
11279
- },
11280
- operations: node.data?.operations
11281
- });
11282
- if (meta?.node) NODE_TYPES[node.type] = meta.node;
11489
+ const wanted = [];
11490
+ for (const node of workflowNodes) {
11491
+ if (!node.type) continue;
11492
+ if (nodeConfigOf(node.type)?.manifestDetail === "SUMMARY") wanted.push(node.type);
11493
+ if (!NODE_TYPES[node.type]) {
11494
+ wanted.push(node.type);
11495
+ const meta = getNodeMetadata({
11496
+ type: node.type,
11497
+ defaultData: {
11498
+ version: node.data?.version,
11499
+ nodeData: node.data?.nodeData
11500
+ },
11501
+ operations: node.data?.operations
11502
+ });
11503
+ if (meta?.node) NODE_TYPES[node.type] = meta.node;
11504
+ }
11283
11505
  }
11284
- ensureNodeTypesLoaded(unknownTypes);
11506
+ ensureNodeTypesLoaded(wanted);
11285
11507
  }
11286
11508
 
11287
11509
  // src/components/FluidGridsProvider.tsx
@@ -11482,4 +11704,4 @@ function useFluidGridsContext() {
11482
11704
  return context;
11483
11705
  }
11484
11706
 
11485
- export { SwitchRulesEditor as $, workflowFingerprint as $t, SENSITIVE_PARAM as A, TriggerWorkflowDocument as An, isLocked as At, nodeSubtitle as B, matchesAdapterProvider as Bn, rememberSessionForReload as Bt, failureQuestions as C, signalPayloadCard as Cn, refusalOfQuota as Ct, describeRun as D, EventRegistrationsDocument as Dn, useEditLeaseLocked as Dt, runStepQuestions as E, NodeEndpointConfigsDocument as En, workflowSaveQueue as Et, useRunGuard as F, ExecutionDetailDocument as Fn, releasesOnClose as Ft, useNodeConfig as G, loadMarkdown as Gn, AUTOSAVE_DEBOUNCE_MS as Gt, optionText as H, replaceAdapterConnections as Hn, rememberOwnStatusChange as Ht, workflowParameterIssues as I, RunFromNodeDocument as In, shouldReleaseForIdle as It, isStringOptionList as J, codeBuildIdOf as Jt, resolveUiSpec as K, useMarkdownRenderer as Kn, AUTOSAVE_RETRY_DELAYS_MS as Kt, asRecord as L, ExecuteStepDocument as Ln, tickAction as Lt, createConfiguredNode as M, CreateWorkflowVersionDocument as Mn, leaseCallSequence as Mt, useInsertNode as N, CreateWorkflowDefinitionDocument as Nn, phaseAfterAcquire as Nt, describeRunError as O, BuilderRunStatusDocument as On, useEditLeaseStore as Ot, MissingParametersDialog as P, ExecutionsListDocument as Pn, phaseAfterTakeOver as Pt, ConditionTreeBuilder as Q, saveFailureActionOf as Qt, coerceNumber as R, connectionsForAdapter as Rn, EDIT_SESSION_ID as Rt, useLatestFailedRun as S, runSignalTargets as Sn, createThenOpen as St, runQuestions as T, NodeManifestsDocument as Tn, useSaveStatusStore as Tt, paramsFromOperation as U, getNodeDetail as Un, rememberRevision as Ut, nodeTitle as V, newConnectionProviderKey as Vn, sessionBeforeReload as Vt, selectedOperationOf as W, buildStickyNode as Wn, revisionOf as Wt, optionListValues as X, inAppLeaveTarget as Xt, optionListText as Y, findSaveConflict as Yt, resolveLoadOptionsSpec as Z, resettledBaseline as Zt, registryNodeData as _, canSignalRun as _n, useFlowValidator as _t, NODES_METADATA as a, parseParameterValue as an, missingRequiredParameters as at, fetchAllNodeEndpointConfigs as b, parseRawSignalPayload as bn, builderPathOf as bt, ensureInstalledNodeTypesLoaded as c, resolveNodeOperation as cn, autosaveAllowedFor as ct, ensureRegistryNodeTypesLoaded as d, openRunQuotaUpgradePrompt as dn, editingLeaseLocked as dt, useNodeExecution as en, casesFromRules as et, isNodeConfigsInitialized as f, useCanvasEdges as fn, leavingLosesChanges as ft, registerWorkflowNodeTypes as g, useCodeWorkflowInterface as gn, isFlowComplete as gt, registerNodeManifests as h, loadDefinitionJson as hn, watchLeavingLosesChanges as ht, AVAILABLE_NODES as i, formatParameterValue as in, boundFieldsOf as it, buildOperationSeed as j, SaveWorkflowDraftDocument as jn, leaseCallQueue as jt, describeRunStep as k, BuilderRunNodeDetailsDocument as kn, bannerOf as kt, ensureNodeConfigsLoaded as l, isParamVisible as ln, departingSave as lt, refetchStoreNodes as m, clearCodeWorkflowDefinitionCache as mn, touchesSavedFields as mt, FluidGridsProvider as n, nodeStateDurationMs as nn, parseMappingValue as nt, NODE_CONFIGS as o, structuredParameterType as on, useGuardedNavigate as ot, onNodeTypesUpdate as p, useNodeRegistryRevision as pn, savedEverythingBeforeLeaving as pt, stripSubmitActions as q, canAutosave as qt, useFluidGridsContext as r, runDurationMs as rn, latestNodeLog as rt, NODE_TYPES as s, fieldsFromValue as sn, useManualSave as st, FluidGridsContext as t, formatElapsedMs as tn, FieldTree as tt, ensureNodeTypesLoaded as u, useFluidGridsAnalytics as un, editStateFor as ut, scheduleNodePaletteLoad as v, declaredSignals as vn, useSaveWorkflow as vt, isFailedStatus as w, NodePaletteEntriesDocument as wn, saveIndicatorOf as wt, getNodeMetadata as x, payloadFromCardValues as xn, classifyCreateRefusal as xt, GetMyNodeInstallationsDocument as y, durableInterfaceOf as yn, blankWorkflowCreateInput as yt, fixedParameterState as z, isOptionalAdapter as zn, forgetSessionForReload as zt };
11707
+ export { resolveLoadOptionsSpec as $, resettledBaseline as $t, describeRunError as A, BuilderRunStatusDocument as An, useEditLeaseStore as At, coerceNumber as B, connectionsForAdapter as Bn, EDIT_SESSION_ID as Bt, getNodeMetadata as C, payloadFromCardValues as Cn, classifyCreateRefusal as Ct, runQuestions as D, NodeManifestsDocument as Dn, useSaveStatusStore as Dt, isFailedStatus as E, NodePaletteEntriesDocument as En, saveIndicatorOf as Et, useInsertNode as F, CreateWorkflowDefinitionDocument as Fn, phaseAfterAcquire as Ft, paramsFromOperation as G, getNodeDetail as Gn, rememberRevision as Gt, nodeSubtitle as H, matchesAdapterProvider as Hn, rememberSessionForReload as Ht, MissingParametersDialog as I, ExecutionsListDocument as In, phaseAfterTakeOver as It, resolveUiSpec as J, useMarkdownRenderer as Jn, AUTOSAVE_RETRY_DELAYS_MS as Jt, selectedOperationOf as K, buildStickyNode as Kn, revisionOf as Kt, useRunGuard as L, ExecutionDetailDocument as Ln, releasesOnClose as Lt, SENSITIVE_PARAM as M, TriggerWorkflowDocument as Mn, isLocked as Mt, buildOperationSeed as N, SaveWorkflowDraftDocument as Nn, leaseCallQueue as Nt, runStepQuestions as O, NodeEndpointConfigsDocument as On, workflowSaveQueue as Ot, createConfiguredNode as P, CreateWorkflowVersionDocument as Pn, leaseCallSequence as Pt, optionListValues as Q, inAppLeaveTarget as Qt, workflowParameterIssues as R, RunFromNodeDocument as Rn, shouldReleaseForIdle as Rt, fetchAllNodeEndpointConfigs as S, parseRawSignalPayload as Sn, builderPathOf as St, failureQuestions as T, signalPayloadCard as Tn, refusalOfQuota as Tt, nodeTitle as U, newConnectionProviderKey as Un, sessionBeforeReload as Ut, fixedParameterState as V, isOptionalAdapter as Vn, forgetSessionForReload as Vt, optionText as W, replaceAdapterConnections as Wn, rememberOwnStatusChange as Wt, isStringOptionList as X, codeBuildIdOf as Xt, stripSubmitActions as Y, canAutosave as Yt, optionListText as Z, findSaveConflict as Zt, registerNodeManifests as _, loadDefinitionJson as _n, watchLeavingLosesChanges as _t, NODES_METADATA as a, runDurationMs as an, latestNodeLog as at, scheduleNodePaletteLoad as b, declaredSignals as bn, useSaveWorkflow as bt, ensureInstalledNodeTypesLoaded as c, structuredParameterType as cn, useGuardedNavigate as ct, ensureNodeTypesLoaded as d, isParamVisible as dn, departingSave as dt, saveFailureActionOf as en, ConditionTreeBuilder as et, ensureRegistryNodeTypesLoaded as f, useFluidGridsAnalytics as fn, editStateFor as ft, refetchStoreNodes as g, clearCodeWorkflowDefinitionCache as gn, touchesSavedFields as gt, prefetchNodeType as h, useNodeRegistryRevision as hn, savedEverythingBeforeLeaving as ht, AVAILABLE_NODES as i, nodeStateDurationMs as in, parseMappingValue as it, describeRunStep as j, BuilderRunNodeDetailsDocument as jn, bannerOf as jt, describeRun as k, EventRegistrationsDocument as kn, useEditLeaseLocked as kt, ensureNodeConfigsLoaded as l, fieldsFromValue as ln, useManualSave as lt, onNodeTypesUpdate as m, useCanvasEdges as mn, leavingLosesChanges as mt, FluidGridsProvider as n, useNodeExecution as nn, casesFromRules as nt, NODE_CONFIGS as o, formatParameterValue as on, boundFieldsOf as ot, isNodeConfigsInitialized as p, openRunQuotaUpgradePrompt as pn, editingLeaseLocked as pt, useNodeConfig as q, loadMarkdown as qn, AUTOSAVE_DEBOUNCE_MS as qt, useFluidGridsContext as r, formatElapsedMs as rn, FieldTree as rt, NODE_TYPES as s, parseParameterValue as sn, missingRequiredParameters as st, FluidGridsContext as t, workflowFingerprint as tn, SwitchRulesEditor as tt, ensureNodeTypeReady as u, resolveNodeOperation as un, autosaveAllowedFor as ut, registerWorkflowNodeTypes as v, useCodeWorkflowInterface as vn, isFlowComplete as vt, useLatestFailedRun as w, runSignalTargets as wn, createThenOpen as wt, GetMyNodeInstallationsDocument as x, durableInterfaceOf as xn, blankWorkflowCreateInput as xt, registryNodeData as y, canSignalRun as yn, useFlowValidator as yt, asRecord as z, ExecuteStepDocument as zn, tickAction as zt };
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { d as useRestoreWorkflowVersion, h as useWorkflowDefinitions } from "./useWorkflows-BrqrVT8h.js";
3
+ import { d as useRestoreWorkflowVersion, h as useWorkflowDefinitions } from "./useWorkflows-Dg7q_Tzf.js";
4
4
  import { t as VersionDiffDialog } from "./VersionDiffDialog-D9W5Fm56.js";
5
5
  import { c as versionsOfWorkflow } from "./VersionLifecycleBar-DuphLOT0.js";
6
6
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
@@ -3,7 +3,7 @@ import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
4
4
  import { n as useNavigationV2 } from "./useNavigationV2-C2WeqN7d.js";
5
5
  import { t as TechnicalDetails } from "./TechnicalDetails-r5JXr1jZ.js";
6
- import { o as useRunReplayActions, r as useInsightsData } from "./useObservability-CjZTYldC.js";
6
+ import { o as useRunReplayActions, r as useInsightsData } from "./useObservability-mXM7lCop.js";
7
7
  import { a as getTopFailingNodes, i as getFailureBreakdown, l as rankedFailingWorkflows, n as formatDuration, o as getTopFailingWorkflows, s as percentage, u as summarySuccessRate } from "./utils-C0dtnN4R.js";
8
8
  import { n as FailureTriagePanel } from "./FailureTriagePanel-Ddua9uxn.js";
9
9
  import { c as useContinuousOptimisationEnabled } from "./feature-flags-B_b8PJ6Z.js";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
3
- import { n as formatTemplatePrice } from "./TemplateCard-9Beuqm5_.js";
3
+ import { n as formatTemplatePrice } from "./TemplateCard-BsrXJ1Su.js";
4
4
  import { t as ConfirmActionDialog } from "./ConfirmActionDialog-D9Pir3bc.js";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
 
@@ -12,10 +12,10 @@ import { $I as WorkflowSecuritySeverity, QI as WorkflowSecurityCheck, ZI as Work
12
12
  import { M as saveCodecServerSettings, _ as fetchPauseRules, a as createPauseRule, c as deletePauseRule, f as fetchArchiveSettings, g as fetchCodecServerSettings, j as saveArchiveSettings, l as deleteSearchAttribute, o as createSearchAttribute, r as clearArchiveSettings, x as fetchSearchAttributes } from "./api-o5UUDbr8.js";
13
13
  import { i as NativeSelect, o as StatusPill, t as FieldError, u as useResource } from "./shared-mbyvDPde.js";
14
14
  import { A as useFlowStore } from "./node-operation-selection-DHbtGNrG.js";
15
- import { Tt as useSaveStatusStore, Yt as findSaveConflict } from "./FluidGridsProvider-C-WGQwuT.js";
16
- import { a as useLogStreamDestinations, i as useLogStreamDestinationActions } from "./useObservability-CjZTYldC.js";
15
+ import { Dt as useSaveStatusStore, Zt as findSaveConflict } from "./FluidGridsProvider-CDjkq3Zj.js";
16
+ import { a as useLogStreamDestinations, i as useLogStreamDestinationActions } from "./useObservability-mXM7lCop.js";
17
17
  import { r as useConnections } from "./useConnections-CmnwGk09.js";
18
- import { Nt as useUpdateWorkflowDefinitionMutation, Rt as useWorkflowDefinitionQuery, Vt as useWorkflowDefinitionsQuery, n as useAgentDefinitions } from "./useAgentDefinitions-9pmnEpb8.js";
18
+ import { Nt as useUpdateWorkflowDefinitionMutation, Rt as useWorkflowDefinitionQuery, Vt as useWorkflowDefinitionsQuery, n as useAgentDefinitions } from "./useAgentDefinitions-YUDx_OW2.js";
19
19
  import { a as formToInput$2, i as emptyAgentForm, n as agentToForm, o as grantDays, r as describeRule, t as AgentFormError } from "./agent-form-D0uLvzx4.js";
20
20
  import { r as getFluidGridsConfig } from "./config-X97zrIvn.js";
21
21
  import { n as getGlobalStoreClient } from "./global-client-DP_Wxe5t.js";