@burdenoff/fluidgrids-fe-sdk 2026.1111.5 → 2026.1111.7

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 (44) hide show
  1. package/dist/{ExecutionDetailPage-CKmm-MTf.js → ExecutionDetailPage-DoxxG0b1.js} +26 -17
  2. package/dist/{FailureTriagePanel-LodnXzJr.js → FailureTriagePanel-BqRG9qxu.js} +2 -2
  3. package/dist/{FluidGridsProvider-BNzMznqt.js → FluidGridsProvider-_Nc4kFsk.js} +295 -136
  4. package/dist/{HistoryPage-DIioKCod.js → HistoryPage-joRHOTwx.js} +3 -3
  5. package/dist/{InsightsPage-Bm2oCTqf.js → InsightsPage-BRkCoTkd.js} +6 -6
  6. package/dist/{ManagedAiPolicyAuthority-D624rJtj.js → ManagedAiPolicyAuthority-Dm1Yi75K.js} +7 -7
  7. package/dist/{MissingNodesInstallModal-5iwp-P3H.js → MissingNodesInstallModal-CdvMiEN_.js} +2 -2
  8. package/dist/{NodesPage-CYijlEFV.js → NodesPage-bYLDn1Jp.js} +2 -2
  9. package/dist/{PublishCustomNodeAction-CGrwIjy-.js → PublishCustomNodeAction-DS71F2-x.js} +1 -1
  10. package/dist/{TemplateConfigurationModal-BRjVScYa.js → TemplateConfigurationModal-C2CNNLte.js} +2 -2
  11. package/dist/{TemplateDetailPanel-BP43BIne.js → TemplateDetailPanel-DLe16zdY.js} +3 -3
  12. package/dist/{TemplatesPage-Bw--Ybm9.js → TemplatesPage-8J86X9lY.js} +6 -6
  13. package/dist/{VersionDiffDialog-87FMkJQb.js → VersionDiffDialog--pbvNYM3.js} +1 -1
  14. package/dist/{WorkflowProposalCard-1Av72TtA.js → WorkflowProposalCard-ADSfSaKK.js} +2 -2
  15. package/dist/{WorkflowSearchRedirect-IDjgBWKT.js → WorkflowSearchRedirect-CpmX2vSG.js} +13 -12
  16. package/dist/{WorkflowShareDialog-EsWpP8h1.js → WorkflowShareDialog-CNg_qWNL.js} +3 -3
  17. package/dist/{WorkflowsList-C-beGZ58.js → WorkflowsList-DOhUHH4j.js} +6 -6
  18. package/dist/{agent-form-IKft_4iz.js → agent-form-D25lAEWg.js} +1 -1
  19. package/dist/{agentTools-BQY87HJw.js → agentTools-CBqnXeop.js} +2 -2
  20. package/dist/{ai-usage-CMWDlKmM.js → ai-usage-D5p7ZeRR.js} +1 -1
  21. package/dist/{codec-client-DEBa-Wl0.js → codec-client-Cz_myeH8.js} +1 -1
  22. package/dist/executions.js +1 -1
  23. package/dist/{flow-builder-DOw2DgVO.js → flow-builder-BkD07RI7.js} +32 -27
  24. package/dist/{graphql-types-Bi7XFTD2.js → graphql-types-XcDLtFwU.js} +72 -1
  25. package/dist/history.js +1 -1
  26. package/dist/{index-CavhNsSY.d.ts → index-BQ5tXKOZ.d.ts} +423 -2
  27. package/dist/index.d.ts +2 -2
  28. package/dist/index.js +26 -26
  29. package/dist/{node-detail-view-D56v1bff.js → node-detail-view-COi4XrCg.js} +8 -8
  30. package/dist/{node-endpoint-configs-Dol5ckHv.js → node-endpoint-configs-DW1ZSZZI.js} +773 -180
  31. package/dist/nodes.js +1 -1
  32. package/dist/observability.d.ts +1 -1
  33. package/dist/observability.js +1 -1
  34. package/dist/{quick-config-panel-BhkLeEy4.js → quick-config-panel-DQ04YDLl.js} +2 -2
  35. package/dist/settings.js +1 -1
  36. package/dist/templates.js +1 -1
  37. package/dist/{useAgentDefinitions-CUXSBw0L.js → useAgentDefinitions-DQqibfr4.js} +1 -1
  38. package/dist/{useExecutions-CvGl7yhb.js → useExecutions-RFROujCH.js} +3 -3
  39. package/dist/{useObservability--lPyvKqs.js → useObservability-QPQRRmAZ.js} +2 -2
  40. package/dist/{useRunHistory-Cu_oiZBw.js → useRunHistory-BDOic15z.js} +3 -3
  41. package/dist/{useWorkflows-CGF0B59E.js → useWorkflows-DNIgOcAG.js} +6 -8
  42. package/dist/workflow-builder.js +2 -2
  43. package/dist/workflows-list.js +1 -1
  44. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { Ai as waitForFluidGridsClient, Bi as throwIfResultError, Ei as getFluidGridsClientSafe, Fi as emitOperationErrorEvent, Gn as TriggerWorkflowDocument, Ii as emitRunCompletedOnce, Ji as setFluidGridsConfig, Ki as resetFluidGridsConfig, Li as describeOperationError, Oi as resetFluidGridsClient, Pi as emitFluidGridsEvent, R as CreateWorkflowVersionDocument, Ti as getFluidGridsClient, Vi as createLiveTokenReader, Wi as getFluidGridsConfig, Wr as WorkflowRunDocument, Yi as validateTrustedOrigin, at as EventRegistrationsDocument, gn as RunFromNodeDocument, ir as UpdateWorkflowDefinitionDocument, j as CreateWorkflowDefinitionDocument, ji as createFluidGridsTokenRefreshLink, ki as setFluidGridsClient, kt as NodeManifestDocument, ot as ExecuteStepDocument, qi as resetFluidGridsExecutionState, st as ExecutionDetailDocument, t as fetchAllNodeEndpointConfigs, wi as createFluidGridsClient, wr as WorkflowDefinitionDocument } from "./node-endpoint-configs-Dol5ckHv.js";
3
+ import { At as NodeManifestsDocument, Bi as describeOperationError, Di as createFluidGridsClient, Er as WorkflowDefinitionDocument, Li as emitFluidGridsEvent, Mi as setFluidGridsClient, Ni as waitForFluidGridsClient, Oi as getFluidGridsClient, Pi as createFluidGridsTokenRefreshLink, Qi as validateTrustedOrigin, R as CreateWorkflowVersionDocument, Ri as emitOperationErrorEvent, Ui as throwIfResultError, Wi as createLiveTokenReader, Xi as resetFluidGridsExecutionState, Yi as resetFluidGridsConfig, Zi as setFluidGridsConfig, at as EventRegistrationsDocument, j as CreateWorkflowDefinitionDocument, ji as resetFluidGridsClient, jt as NodePaletteEntriesDocument, ki as getFluidGridsClientSafe, or as UpdateWorkflowDefinitionDocument, ot as ExecuteStepDocument, qi as getFluidGridsConfig, qn as TriggerWorkflowDocument, qr as WorkflowRunDocument, st as ExecutionDetailDocument, t as fetchAllNodeEndpointConfigs, vn as RunFromNodeDocument, zi as emitRunCompletedOnce } from "./node-endpoint-configs-DW1ZSZZI.js";
4
4
  import { A as nodeAccent, C as nodeAdaptersOf, D as NodeCard, E as resolveOutputHandles, H as useFlowStore, I as partitionStickyNotes, L as resolveStickyColor, N as DEFAULT_STICKY_COLOR, O as NodeCardBody, P as STICKY_COLORS, R as stickySurfaceStyle, T as resolveInputHandles, V as STICKY_NOTE_TYPE, W as isNodeTrigger, _ as LogicNodeCard, b as alignPlainOutputEdges, i as WAIT_FOR_SIGNAL_NODE_TYPE, j as NodeTypeIcon, k as NodeCardHeader, l as interfaceFields, m as readSignalName, n as synchronizeOperationUpdate, p as readCodeWorkflowState, r as CODE_WORKFLOW_NODE_TYPE, t as resolveOperationName, u as interfaceHandlers, v as InputHandles, w as outputHandlesSpacerHeight, x as hasNodeManifest, y as OutputHandles } from "./node-operation-selection--oy-yEq_.js";
5
5
  import { n as FluidGridsTranslationProvider, r as useTr, t as ENGLISH_FALLBACK_TRANSLATOR } from "./TranslationBridge-Da-TPgQm.js";
6
6
  import { createContext, memo, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
@@ -10109,38 +10109,88 @@ const OrganizationPrivateNodesDocument = {
10109
10109
  // src/graphql/global-operations.ts
10110
10110
  var global_operations_exports = /* @__PURE__ */ __exportAll({ InstallWorkflowNodeDocument: () => InstallWorkflowNodeDocument });
10111
10111
 
10112
- // src/builder/components/flow-builder/components/blocks/index.ts
10113
- const NODE_MANIFEST = NodeManifestDocument;
10114
- const NODE_CONFIGS = [];
10115
- /**
10116
- * Fetch node manifest using GraphQL
10117
- */
10118
- async function fetchNodeManifest(nodeType, nodeVersion) {
10119
- try {
10120
- const { data } = await getFluidGridsClient().query({
10121
- query: NODE_MANIFEST,
10122
- variables: {
10123
- nodeType,
10124
- version: nodeVersion
10125
- }
10126
- });
10127
- return data?.nodeManifest ?? null;
10128
- } catch (error) {
10129
- const message = error instanceof Error ? error.message : "Unknown error";
10130
- console.error(`Error fetching manifest for ${nodeType} v${nodeVersion}:`, message);
10131
- return null;
10112
+ // src/builder/components/flow-builder/components/blocks/node-manifests.ts
10113
+ /**
10114
+ * Refs per request. The server takes up to 500; smaller requests keep each
10115
+ * response to a few megabytes (store manifests reach 370 KB each) and let the
10116
+ * gateway resolve them side by side.
10117
+ */
10118
+ const NODE_MANIFEST_BATCH_SIZE = 100;
10119
+ const manifestCache = /* @__PURE__ */ new Map();
10120
+ function manifestKey(nodeType, version) {
10121
+ return `${nodeType}@${version}`;
10122
+ }
10123
+ /** The value as a node manifest, or null when it lacks the identifying fields. */
10124
+ function asNodeManifest(value) {
10125
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
10126
+ const record = value;
10127
+ if (typeof record.nodeType !== "string" || !record.nodeType || typeof record.version !== "string" || !record.version) return null;
10128
+ return {
10129
+ ...record,
10130
+ name: typeof record.name === "string" ? record.name : record.nodeType
10131
+ };
10132
+ }
10133
+ /** Keep manifests that arrived some other way (with a workflow) for the session. */
10134
+ function rememberNodeManifests(values) {
10135
+ const manifests = [];
10136
+ for (const value of values) {
10137
+ const manifest = asNodeManifest(value);
10138
+ if (!manifest) continue;
10139
+ manifestCache.set(manifestKey(manifest.nodeType, manifest.version), manifest);
10140
+ manifests.push(manifest);
10132
10141
  }
10142
+ return manifests;
10143
+ }
10144
+ /** The cached manifest of an exact node version, if this session loaded it. */
10145
+ function cachedNodeManifest(nodeType, version) {
10146
+ return manifestCache.get(manifestKey(nodeType, version));
10133
10147
  }
10134
10148
  /**
10135
- * Push a store node manifest entry into NODE_CONFIGS if not already present.
10136
- * Used for both BUILTIN-registered store nodes and user-installed store nodes
10137
- * whose manifest comes from the StoreAppInstallation record.
10149
+ * Manifests for `refs`: exact versions already in the session cache are served
10150
+ * from it; the rest are fetched with `nodeManifests`, at most
10151
+ * `NODE_MANIFEST_BATCH_SIZE` refs per request, all requests in parallel. Refs the
10152
+ * registry does not know are absent from the result. A failed request is logged
10153
+ * and its refs are treated as unknown, so one bad batch never empties the palette.
10138
10154
  */
10139
- function pushStoreNodeConfig(manifest, publishType = "STORE") {
10140
- if (NODE_CONFIGS.some((c) => c.type === manifest.nodeType)) return;
10155
+ async function loadNodeManifests(client, refs) {
10156
+ const result = [];
10157
+ const missing = [];
10158
+ const seen = /* @__PURE__ */ new Set();
10159
+ for (const ref of refs) {
10160
+ const key = manifestKey(ref.nodeType, ref.version ?? "");
10161
+ if (!ref.nodeType || seen.has(key)) continue;
10162
+ seen.add(key);
10163
+ const cached = ref.version ? cachedNodeManifest(ref.nodeType, ref.version) : void 0;
10164
+ if (cached) result.push(cached);
10165
+ else missing.push(ref.version ? ref : { nodeType: ref.nodeType });
10166
+ }
10167
+ const batches = [];
10168
+ for (let i = 0; i < missing.length; i += 100) batches.push(missing.slice(i, i + 100));
10169
+ const fetched = await Promise.all(batches.map(async (batch) => {
10170
+ try {
10171
+ const { data } = await client.query({
10172
+ query: NodeManifestsDocument,
10173
+ variables: { refs: batch },
10174
+ fetchPolicy: "no-cache"
10175
+ });
10176
+ return rememberNodeManifests(data?.nodeManifests ?? []);
10177
+ } catch (error) {
10178
+ const message = error instanceof Error ? error.message : String(error);
10179
+ console.error(`[Workflows] Could not load ${batch.length} node manifest(s):`, message);
10180
+ return [];
10181
+ }
10182
+ }));
10183
+ for (const manifests of fetched) result.push(...manifests);
10184
+ return result;
10185
+ }
10186
+
10187
+ // src/builder/components/flow-builder/components/blocks/index.ts
10188
+ const NODE_CONFIGS = [];
10189
+ /** The registry entry for one manifest. */
10190
+ function toNodeConfig(manifest, publishType) {
10141
10191
  const manifestOps = manifest.operations;
10142
10192
  const operations = Array.isArray(manifestOps) ? manifestOps : manifestOps?.operations ?? manifestOps;
10143
- NODE_CONFIGS.push({
10193
+ return {
10144
10194
  type: manifest.nodeType,
10145
10195
  detail: {
10146
10196
  icon: manifest.icon || "mynaui:keyboard-solid",
@@ -10165,21 +10215,36 @@ function pushStoreNodeConfig(manifest, publishType = "STORE") {
10165
10215
  },
10166
10216
  operations,
10167
10217
  publishType
10168
- });
10218
+ };
10219
+ }
10220
+ function hasNodeConfig(type) {
10221
+ return NODE_CONFIGS.some((config) => config.type === type);
10222
+ }
10223
+ /** Add a config unless its node type is already registered. */
10224
+ function addNodeConfig(config) {
10225
+ if (hasNodeConfig(config.type)) return false;
10226
+ NODE_CONFIGS.push(config);
10227
+ return true;
10169
10228
  }
10229
+ /** Only one installations request at a time: the canvas and the palette may both ask. */
10230
+ let installationsRequest = null;
10170
10231
  /**
10171
- * Load installed store nodes from the global store client.
10172
- * Uses the manifest stored in each StoreAppInstallation (recorded at install time)
10173
- * so store-svc is the single source of truth — no zip download or workflow-svc
10174
- * NodeEndpointConfig entry needed for store nodes.
10175
- *
10176
- * Silently no-ops if the global store client or workspaceId is not yet configured.
10232
+ * The manifests of the workspace's ACTIVE store installations, recorded at install
10233
+ * time. Store-svc is the single source of truth for them: no zip download or
10234
+ * workflow-svc registry entry is needed. Empty when the global store client or the
10235
+ * workspace is not configured yet.
10177
10236
  */
10178
- async function loadInstalledStoreNodes() {
10237
+ function fetchInstalledStoreNodeManifests() {
10238
+ if (!installationsRequest) installationsRequest = queryInstalledStoreNodeManifests().finally(() => {
10239
+ installationsRequest = null;
10240
+ });
10241
+ return installationsRequest;
10242
+ }
10243
+ async function queryInstalledStoreNodeManifests() {
10179
10244
  const globalClient = getGlobalStoreClient();
10180
- if (!globalClient) return;
10245
+ if (!globalClient) return [];
10181
10246
  const { workspaceId } = getFluidGridsConfig();
10182
- if (!workspaceId) return;
10247
+ if (!workspaceId) return [];
10183
10248
  try {
10184
10249
  const { data } = await globalClient.query({
10185
10250
  query: GetMyNodeInstallationsDocument,
@@ -10190,25 +10255,36 @@ async function loadInstalledStoreNodes() {
10190
10255
  },
10191
10256
  fetchPolicy: "network-only"
10192
10257
  });
10193
- const installations = data?.myStoreAppInstallations?.items ?? [];
10194
- let loaded = 0;
10195
- for (const installation of installations) {
10258
+ const manifests = [];
10259
+ for (const installation of data?.myStoreAppInstallations?.items ?? []) {
10196
10260
  if (installation.status !== "ACTIVE") continue;
10197
10261
  const manifest = installation.manifest;
10198
- if (!manifest?.nodeType) continue;
10199
- pushStoreNodeConfig(manifest, "STORE");
10200
- loaded++;
10262
+ if (manifest?.nodeType) manifests.push(manifest);
10201
10263
  }
10202
- if (loaded > 0) console.log(`[Workflows] Loaded ${loaded} installed store node(s) from workspace installations.`);
10264
+ return manifests;
10203
10265
  } catch (error) {
10204
10266
  const message = error instanceof Error ? error.message : "Unknown error";
10205
10267
  console.warn("[Workflows] Could not load installed store nodes:", message);
10268
+ return [];
10206
10269
  }
10207
10270
  }
10208
10271
  /**
10209
- * Fetch all nodes from GraphQL and populate NODE_CONFIGS.
10210
- * Loads BUILTIN nodes from workflow-svc, then overlays installed store nodes
10211
- * from the global store (using the manifest stored at install time).
10272
+ * Register installed store nodes. Any node type already registered (a built-in, or
10273
+ * a store node the registry vendors) is skipped; only genuinely missing ones are
10274
+ * added. `onlyTypes` limits it to those node types.
10275
+ */
10276
+ async function loadInstalledStoreNodes(onlyTypes) {
10277
+ const manifests = await fetchInstalledStoreNodeManifests();
10278
+ let loaded = 0;
10279
+ for (const manifest of manifests) {
10280
+ if (onlyTypes && !onlyTypes.has(manifest.nodeType)) continue;
10281
+ if (addNodeConfig(toNodeConfig(manifest, "STORE"))) loaded++;
10282
+ }
10283
+ if (loaded > 0) console.log(`[Workflows] Loaded ${loaded} installed store node(s) from workspace installations.`);
10284
+ }
10285
+ /**
10286
+ * Load the full palette into NODE_CONFIGS: every available registry node in the
10287
+ * registry's order (newest first), then the installed store nodes.
10212
10288
  */
10213
10289
  async function initializeNodeConfigs() {
10214
10290
  try {
@@ -10218,81 +10294,123 @@ async function initializeNodeConfigs() {
10218
10294
  await loadInstalledStoreNodes();
10219
10295
  return;
10220
10296
  }
10221
- const nodes = await fetchAllNodeEndpointConfigs(client, { status: "AVAILABLE" }, "cache-first");
10222
- if (nodes.length === 0) {
10297
+ const entries = await fetchAllNodeEndpointConfigs(client, { status: "AVAILABLE" }, "cache-first", NodePaletteEntriesDocument);
10298
+ if (entries.length === 0) {
10223
10299
  console.warn("No node endpoint configs found.");
10224
10300
  await loadInstalledStoreNodes();
10225
10301
  return;
10226
10302
  }
10227
- const manifestPromises = nodes.map(async (node) => {
10228
- if (node?.nodeType && node?.nodeVersion) try {
10229
- return await fetchNodeManifest(node.nodeType, node.nodeVersion);
10230
- } catch {
10231
- console.error(`Failed to fetch manifest for node ${node.id} (${node.nodeType} v${node.nodeVersion})`);
10232
- return null;
10233
- }
10234
- else {
10235
- console.warn(`Node ${node?.id ?? "unknown"} is missing nodeType or nodeVersion. Skipping manifest fetch.`);
10236
- return null;
10237
- }
10238
- });
10239
- (await Promise.all(manifestPromises)).forEach((manifest, index) => {
10240
- if (manifest === null) return;
10241
- const node = nodes[index];
10242
- const manifestOps = manifest.operations;
10243
- const operations = Array.isArray(manifestOps) ? manifestOps : manifestOps?.operations ?? manifestOps;
10244
- NODE_CONFIGS.push({
10245
- type: manifest.nodeType,
10246
- detail: {
10247
- icon: manifest.icon || "mynaui:keyboard-solid",
10248
- title: manifest.name,
10249
- description: manifest.description,
10250
- gradientColor: "yellow"
10251
- },
10252
- defaultData: {
10253
- operation_name: "",
10254
- operation_type: "",
10255
- nodeData: manifest,
10256
- version: manifest.version,
10257
- args: {
10258
- context: { node: {
10259
- id: manifest.nodeType,
10260
- kind: manifest.kind,
10261
- type: manifest.nodeType
10262
- } },
10263
- state: {},
10264
- credentials: []
10265
- }
10266
- },
10267
- operations,
10268
- publishType: node.publishType
10269
- });
10270
- });
10303
+ const manifests = await loadNodeManifests(client, entries.map((entry) => ({
10304
+ nodeType: entry.nodeType,
10305
+ version: entry.nodeVersion
10306
+ })));
10307
+ const byVersion = new Map(manifests.map((manifest) => [`${manifest.nodeType}@${manifest.version}`, manifest]));
10308
+ const palette = [];
10309
+ for (const entry of entries) {
10310
+ const manifest = byVersion.get(`${entry.nodeType}@${entry.nodeVersion}`);
10311
+ if (manifest) palette.push(toNodeConfig(manifest, entry.publishType ?? void 0));
10312
+ }
10313
+ const listed = new Set(palette.map((config) => config.type));
10314
+ const earlier = NODE_CONFIGS.filter((config) => !listed.has(config.type));
10315
+ NODE_CONFIGS.length = 0;
10316
+ NODE_CONFIGS.push(...palette, ...earlier);
10271
10317
  await loadInstalledStoreNodes();
10272
10318
  } catch (error) {
10273
10319
  const message = error instanceof Error ? error.message : "Unknown error";
10274
10320
  console.error("Failed to fetch nodes or manifests:", message);
10275
10321
  }
10276
10322
  }
10323
+ /** Node types the registry never has: canvas-only annotations. */
10324
+ function isRegistryNodeType(type) {
10325
+ return Boolean(type) && type !== "sticky-note" && type !== "default";
10326
+ }
10327
+ /** Node types being loaded for a canvas, so concurrent callers share one request. */
10328
+ const nodeTypeLoads = /* @__PURE__ */ new Map();
10329
+ async function loadNodeTypes(types) {
10330
+ try {
10331
+ const client = await waitForFluidGridsClient(15e3, 150);
10332
+ if (client) {
10333
+ const manifests = await loadNodeManifests(client, types.map((nodeType) => ({ nodeType })));
10334
+ for (const manifest of manifests) addNodeConfig(toNodeConfig(manifest, manifest.publishType));
10335
+ }
10336
+ const missing = new Set(types.filter((type) => !hasNodeConfig(type)));
10337
+ if (missing.size > 0) await loadInstalledStoreNodes(missing);
10338
+ } catch (error) {
10339
+ const message = error instanceof Error ? error.message : "Unknown error";
10340
+ console.error("[Workflows] Could not load node types:", message);
10341
+ }
10342
+ rebuildNodeArrays();
10343
+ }
10344
+ /**
10345
+ * Make sure the given node types are registered, without loading the rest of the
10346
+ * palette: what a canvas needs before it is drawn. Types already registered cost
10347
+ * nothing; the rest are fetched with one batched request, and a type the registry
10348
+ * does not carry is looked up among the workspace's installed store nodes. Types
10349
+ * that resolve nowhere stay unregistered (the canvas draws them with the fallback
10350
+ * card). Never rejects.
10351
+ */
10352
+ function ensureNodeTypesLoaded(types) {
10353
+ if (isInitialized) return Promise.resolve();
10354
+ const wanted = [...new Set(types)].filter((type) => isRegistryNodeType(type) && !hasNodeConfig(type));
10355
+ if (wanted.length === 0) return Promise.resolve();
10356
+ const pending = /* @__PURE__ */ new Set();
10357
+ const fresh = [];
10358
+ for (const type of wanted) {
10359
+ const inFlight = nodeTypeLoads.get(type);
10360
+ if (inFlight) pending.add(inFlight);
10361
+ else fresh.push(type);
10362
+ }
10363
+ if (fresh.length > 0) {
10364
+ const load = loadNodeTypes(fresh).finally(() => {
10365
+ for (const type of fresh) if (nodeTypeLoads.get(type) === load) nodeTypeLoads.delete(type);
10366
+ });
10367
+ for (const type of fresh) nodeTypeLoads.set(type, load);
10368
+ pending.add(load);
10369
+ }
10370
+ return Promise.all(pending).then(() => void 0);
10371
+ }
10277
10372
  /**
10278
- * Refetch all nodes by re-running initializeNodeConfigs.
10279
- * Called after installing/uninstalling a store node.
10373
+ * Register manifests that arrived with a workflow (`WorkflowDefinition.nodeManifests`)
10374
+ * and keep them in the session cache, so the canvas needs no further request.
10375
+ */
10376
+ function registerNodeManifests(values) {
10377
+ let added = false;
10378
+ for (const manifest of rememberNodeManifests(values)) if (addNodeConfig(toNodeConfig(manifest, manifest.publishType))) added = true;
10379
+ if (added) rebuildNodeArrays();
10380
+ }
10381
+ /** Register the client-side node components every canvas needs. */
10382
+ function registerBaseNodeTypes() {
10383
+ const fallback = getNodeMetadata({ type: "__default_dynamic__" });
10384
+ if (fallback?.node) NODE_TYPES["default"] = fallback.node;
10385
+ NODE_TYPES[STICKY_NOTE_TYPE] = StickyNoteNode;
10386
+ }
10387
+ /** Empty the registry, keeping only the client-side node components. */
10388
+ function resetNodeRegistry() {
10389
+ NODE_CONFIGS.length = 0;
10390
+ NODES.length = 0;
10391
+ AVAILABLE_NODES.length = 0;
10392
+ for (const key of Object.keys(NODE_TYPES)) delete NODE_TYPES[key];
10393
+ for (const key of Object.keys(NODES_METADATA)) delete NODES_METADATA[key];
10394
+ isInitialized = false;
10395
+ initPromise = null;
10396
+ nodeTypeLoads.clear();
10397
+ registerBaseNodeTypes();
10398
+ }
10399
+ /**
10400
+ * Reload the registry from scratch, as the full palette. Called after installing or
10401
+ * uninstalling a store node, and when the hosts set the workspace's clients.
10402
+ * Manifests stay in the session cache (they are fixed per version), so only new
10403
+ * ones are fetched.
10280
10404
  *
10281
- * Resets the initialization guard and all derived arrays so
10282
- * initializeNodeConfigs() runs a fresh fetch instead of returning early.
10405
+ * While nothing is loaded or loading there is nothing stale to refresh, and it does
10406
+ * nothing: the registry loads on demand (BOFF-10387). Hosts call this when they
10407
+ * mount, which used to load the whole palette before the builder had asked for
10408
+ * anything.
10283
10409
  */
10284
10410
  async function refetchStoreNodes() {
10411
+ if (NODE_CONFIGS.length === 0 && !initPromise && nodeTypeLoads.size === 0) return;
10285
10412
  try {
10286
- NODE_CONFIGS.length = 0;
10287
- NODES.length = 0;
10288
- AVAILABLE_NODES.length = 0;
10289
- for (const key of Object.keys(NODE_TYPES)) delete NODE_TYPES[key];
10290
- for (const key of Object.keys(NODES_METADATA)) delete NODES_METADATA[key];
10291
- isInitialized = false;
10292
- initPromise = null;
10293
- const fallback = getNodeMetadata({ type: "__default_dynamic__" });
10294
- if (fallback?.node) NODE_TYPES["default"] = fallback.node;
10295
- NODE_TYPES[STICKY_NOTE_TYPE] = StickyNoteNode;
10413
+ resetNodeRegistry();
10296
10414
  await initializeNodeConfigs();
10297
10415
  isInitialized = NODE_CONFIGS.length > 0;
10298
10416
  rebuildNodeArrays();
@@ -10350,7 +10468,7 @@ function registryNodeData(type) {
10350
10468
  return manifest ? manifest : void 0;
10351
10469
  }
10352
10470
  /**
10353
- * Ensure node configs are loaded. Safe to call multiple times.
10471
+ * Ensure the full palette is loaded. Safe to call multiple times.
10354
10472
  * Returns immediately if already initialized or initializing.
10355
10473
  */
10356
10474
  function ensureNodeConfigsLoaded() {
@@ -10363,33 +10481,74 @@ function ensureNodeConfigsLoaded() {
10363
10481
  return initPromise;
10364
10482
  }
10365
10483
  /**
10366
- * Check if node configs have been initialized
10484
+ * Check if the full palette has been loaded
10367
10485
  */
10368
10486
  function isNodeConfigsInitialized() {
10369
10487
  return isInitialized;
10370
10488
  }
10371
10489
  /**
10372
- * Rebuild NODES and derived arrays after NODE_CONFIGS is populated.
10373
- * This is called after lazy initialization completes.
10490
+ * How long an idle palette load may wait for the browser to go idle. A canvas
10491
+ * opens the palette's panels on demand anyway; this only bounds the wait when
10492
+ * the page never idles.
10374
10493
  */
10375
- function rebuildNodeArrays() {
10376
- NODE_CONFIGS.forEach((config) => {
10377
- const nodeMetadata = {
10378
- ...getNodeMetadata(config),
10379
- detail: { ...config.detail }
10380
- };
10381
- if (!NODES.some((n) => n.type === nodeMetadata.type)) {
10382
- NODES.push(nodeMetadata);
10383
- NODE_TYPES[nodeMetadata.type] = nodeMetadata.node;
10384
- NODES_METADATA[nodeMetadata.type] = {
10385
- ...nodeMetadata,
10386
- __details: {
10387
- type: nodeMetadata.type,
10388
- ...nodeMetadata.detail
10389
- }
10390
- };
10494
+ const NODE_PALETTE_IDLE_TIMEOUT_MS = 5e3;
10495
+ let paletteLoadScheduled = false;
10496
+ /**
10497
+ * Load the full palette once the page is idle (BOFF-10387): after a canvas is
10498
+ * drawn, so the palette is ready when the person opens it without delaying the
10499
+ * canvas. Does nothing when it is loaded, loading or already scheduled.
10500
+ */
10501
+ function scheduleNodePaletteLoad() {
10502
+ if (isInitialized || initPromise || paletteLoadScheduled) return;
10503
+ paletteLoadScheduled = true;
10504
+ const load = () => {
10505
+ paletteLoadScheduled = false;
10506
+ ensureNodeConfigsLoaded().catch((error) => {
10507
+ console.warn("[Workflows] Idle node palette load failed:", error);
10508
+ });
10509
+ };
10510
+ if (typeof window !== "undefined" && "requestIdleCallback" in window) window.requestIdleCallback(load, { timeout: NODE_PALETTE_IDLE_TIMEOUT_MS });
10511
+ else setTimeout(load, 1e3);
10512
+ }
10513
+ /** The registry entry of each config's node type, created on first sight. */
10514
+ function nodeMetadataFor(config) {
10515
+ const nodeMetadata = {
10516
+ ...getNodeMetadata(config),
10517
+ detail: { ...config.detail }
10518
+ };
10519
+ NODE_TYPES[nodeMetadata.type] = nodeMetadata.node;
10520
+ NODES_METADATA[nodeMetadata.type] = {
10521
+ ...nodeMetadata,
10522
+ __details: {
10523
+ type: nodeMetadata.type,
10524
+ ...nodeMetadata.detail
10391
10525
  }
10392
- });
10526
+ };
10527
+ return nodeMetadata;
10528
+ }
10529
+ /**
10530
+ * Rebuild NODES and derived arrays from NODE_CONFIGS, in its order.
10531
+ *
10532
+ * A node type keeps the entry (and the React component) it was first registered
10533
+ * with: replacing the component would remount every node of that type already on
10534
+ * the canvas. Called whenever the registry grows: the canvas's node types first,
10535
+ * the full palette later.
10536
+ */
10537
+ function rebuildNodeArrays() {
10538
+ const existing = new Map(NODES.map((node) => [node.type, node]));
10539
+ const ordered = [];
10540
+ const seen = /* @__PURE__ */ new Set();
10541
+ for (const config of NODE_CONFIGS) {
10542
+ if (seen.has(config.type)) continue;
10543
+ seen.add(config.type);
10544
+ ordered.push(existing.get(config.type) ?? nodeMetadataFor(config));
10545
+ }
10546
+ for (const node of NODES) if (!seen.has(node.type)) {
10547
+ seen.add(node.type);
10548
+ ordered.push(node);
10549
+ }
10550
+ NODES.length = 0;
10551
+ NODES.push(...ordered);
10393
10552
  const newAvailableNodes = NODES.filter((node) => node.available === void 0 || node.available).map((node) => {
10394
10553
  const nodeConfig = NODE_CONFIGS.find((config) => config.type === node.type);
10395
10554
  return {
@@ -10406,18 +10565,17 @@ function rebuildNodeArrays() {
10406
10565
  AVAILABLE_NODES.push(...newAvailableNodes);
10407
10566
  notifyNodeTypesListeners();
10408
10567
  }
10409
- ensureNodeConfigsLoaded().catch((err) => {
10410
- console.warn("[Workflows] Background node config initialization failed:", err);
10411
- });
10412
- const fallbackDynamic = getNodeMetadata({ type: "__default_dynamic__" });
10413
- if (fallbackDynamic?.node) NODE_TYPES["default"] = fallbackDynamic.node;
10414
- NODE_TYPES[STICKY_NOTE_TYPE] = StickyNoteNode;
10568
+ registerBaseNodeTypes();
10415
10569
  /**
10416
10570
  * Pre-register node types from the workflow definition so React Flow never sees unknown types.
10417
- * Called by FlowBuilderPage before hydrating the store.
10571
+ * Called by FlowBuilderPage before hydrating the store, and for nodes an assistant
10572
+ * adds to an open canvas. Unknown types get a fallback card at once; their real
10573
+ * registry entries load in the background and replace it (BOFF-10387).
10418
10574
  */
10419
10575
  function registerWorkflowNodeTypes(workflowNodes) {
10576
+ const unknownTypes = [];
10420
10577
  for (const node of workflowNodes) if (node.type && !NODE_TYPES[node.type]) {
10578
+ unknownTypes.push(node.type);
10421
10579
  const meta = getNodeMetadata({
10422
10580
  type: node.type,
10423
10581
  defaultData: {
@@ -10428,6 +10586,7 @@ function registerWorkflowNodeTypes(workflowNodes) {
10428
10586
  });
10429
10587
  if (meta?.node) NODE_TYPES[node.type] = meta.node;
10430
10588
  }
10589
+ ensureNodeTypesLoaded(unknownTypes);
10431
10590
  }
10432
10591
 
10433
10592
  // src/components/FluidGridsProvider.tsx
@@ -10628,4 +10787,4 @@ function useFluidGridsContext() {
10628
10787
  return context;
10629
10788
  }
10630
10789
 
10631
- export { casesFromRules as $, newConnectionProviderKey as $n, runDurationMs as $t, buildOperationSeed as A, declaredSignals as An, leaseCallSequence as At, nodeTitle as B, resolvePhaseCFlags as Bn, rememberOwnStatusChange as Bt, MyWorkflowTemplateSubmissionsDocument as C, findQuotaRefusal as Cn, saveIndicatorOf as Ct, UninstallWorkflowNodeDocument as D, loadDefinitionJson as Dn, bannerOf as Dt, UninstallOrganizationPrivateNodeDocument as E, clearCodeWorkflowDefinitionCache as En, useEditLeaseStore as Et, workflowParameterIssues as F, signalPayloadCard as Fn, tickAction as Ft, resolveUiSpec as G, useFluidGridsFlagsSettled as Gn, codeBuildIdOf as Gt, paramsFromOperation as H, useDurableFunctionNodesEnabled as Hn, AUTOSAVE_DEBOUNCE_MS as Ht, asRecord as I, FLUIDGRIDS_FLAGS as In, EDIT_SESSION_ID as It, optionListText as J, useSelfHostedWorkersEnabled as Jn, saveFailureActionOf as Jt, stripSubmitActions as K, usePaletteGates as Kn, findSaveConflict as Kt, coerceNumber as L, FLUIDGRIDS_FLAG_DEFAULTS as Ln, forgetSessionForReload as Lt, useInsertNode as M, parseRawSignalPayload as Mn, phaseAfterTakeOver as Mt, MissingParametersDialog as N, payloadFromCardValues as Nn, releasesOnClose as Nt, WithdrawWorkflowTemplateSubmissionDocument as O, useCodeWorkflowInterface as On, isLocked as Ot, useRunGuard as P, runSignalTargets as Pn, shouldReleaseForIdle as Pt, SwitchRulesEditor as Q, matchesAdapterProvider as Qn, nodeStateDurationMs as Qt, fixedParameterState as R, PHASE_C_FLAGS_OFF as Rn, rememberSessionForReload as Rt, InstallWorkflowNodeDocument as S, collectExtensions as Sn, refusalOfQuota as St, SubmitWorkflowTemplateDocument as T, useCanvasEdges as Tn, useEditLeaseLocked as Tt, selectedOperationOf as U, useDurableParityEnabled as Un, AUTOSAVE_RETRY_DELAYS_MS as Ut, optionText as V, useContinuousOptimisationEnabled as Vn, rememberRevision as Vt, useNodeConfig as W, useFluidGridsFlag as Wn, canAutosave as Wt, resolveLoadOptionsSpec as X, connectionsForAdapter as Xn, useNodeExecution as Xt, optionListValues as Y, useWorkflowTestsEnabled as Yn, workflowFingerprint as Yt, ConditionTreeBuilder as Z, isOptionalAdapter as Zn, formatElapsedMs as Zt, CreateStoreOrderDocument as _, nodesOf as _n, useSaveWorkflow as _t, NODES_METADATA as a, isParamVisible as an, createGlobalStoreClient as ar, useGuardedNavigate as at, InstallOrganizationPrivateNodeDocument as b, RUNS_QUOTA_NAME as bn, classifyCreateRefusal as bt, ensureNodeConfigsLoaded as c, emitNodeInstalled as cn, resetGlobalStoreClient as cr, departingSave as ct, refetchStoreNodes as d, emitRunStarted as dn, leavingLosesChanges as dt, formatParameterValue as en, replaceAdapterConnections as er, FieldTree as et, registerWorkflowNodeTypes as f, emitTemplateUsed as fn, savedEverythingBeforeLeaving as ft, BrowseWorkflowTemplatesDocument as g, emitWorkflowPublished as gn, useFlowValidator as gt, BrowseWorkflowNodesDocument as h, emitWorkflowLimitHit as hn, isFlowComplete as ht, AVAILABLE_NODES as i, resolveNodeOperation as in, useBuilderReadOnly as ir, missingRequiredParameters as it, createConfiguredNode as j, durableInterfaceOf as jn, phaseAfterAcquire as jt, getNodeMetadata as k, canSignalRun as kn, leaseCallQueue as kt, isNodeConfigsInitialized as l, emitRunFailed as ln, setGlobalStoreClient as lr, editStateFor as lt, global_operations_exports as m, emitWorkflowCreated as mn, watchLeavingLosesChanges as mt, FluidGridsProvider as n, structuredParameterType as nn, buildStickyNode as nr, latestNodeLog as nt, NODE_CONFIGS as o, useFluidGridsAnalytics as on, getGlobalStoreClient as or, useManualSave as ot, registryNodeData as p, emitUpgradeClicked as pn, touchesSavedFields as pt, isStringOptionList as q, usePhaseCFlags as qn, inAppLeaveTarget as qt, useFluidGridsContext as r, fieldsFromValue as rn, BuilderReadOnlyProvider as rr, boundFieldsOf as rt, NODE_TYPES as s, openRunQuotaUpgradePrompt as sn, global_client_exports as sr, autosaveAllowedFor as st, FluidGridsContext as t, parseParameterValue as tn, getNodeDetail as tr, parseMappingValue as tt, onNodeTypesUpdate as u, emitRunLimitHit as un, editingLeaseLocked as ut, GetMyNodeInstallationsDocument as v, runTriggerFromMode as vn, blankWorkflowCreateInput as vt, OrganizationPrivateNodesDocument as w, isQuotaExhaustedFailure as wn, useSaveStatusStore as wt, InstallPurchasedNodeDocument as x, WORKFLOWS_QUOTA_NAME as xn, createThenOpen as xt, GetNodeInstallableVersionsDocument as y, BILLING_PLANS_PATH as yn, builderPathOf as yt, nodeSubtitle as z, resolveFluidGridsFlagsSettled as zn, sessionBeforeReload as zt };
10790
+ export { resolveLoadOptionsSpec as $, useWorkflowTestsEnabled as $n, useNodeExecution as $t, UninstallWorkflowNodeDocument as A, clearCodeWorkflowDefinitionCache as An, bannerOf as At, coerceNumber as B, FLUIDGRIDS_FLAGS as Bn, forgetSessionForReload as Bt, InstallOrganizationPrivateNodeDocument as C, RUNS_QUOTA_NAME as Cn, classifyCreateRefusal as Ct, OrganizationPrivateNodesDocument as D, isQuotaExhaustedFailure as Dn, useSaveStatusStore as Dt, MyWorkflowTemplateSubmissionsDocument as E, findQuotaRefusal as En, saveIndicatorOf as Et, useInsertNode as F, durableInterfaceOf as Fn, phaseAfterTakeOver as Ft, paramsFromOperation as G, useContinuousOptimisationEnabled as Gn, AUTOSAVE_DEBOUNCE_MS as Gt, nodeSubtitle as H, PHASE_C_FLAGS_OFF as Hn, sessionBeforeReload as Ht, MissingParametersDialog as I, parseRawSignalPayload as In, releasesOnClose as It, resolveUiSpec as J, useFluidGridsFlag as Jn, codeBuildIdOf as Jt, selectedOperationOf as K, useDurableFunctionNodesEnabled as Kn, AUTOSAVE_RETRY_DELAYS_MS as Kt, useRunGuard as L, payloadFromCardValues as Ln, shouldReleaseForIdle as Lt, getNodeMetadata as M, useCodeWorkflowInterface as Mn, leaseCallQueue as Mt, buildOperationSeed as N, canSignalRun as Nn, leaseCallSequence as Nt, SubmitWorkflowTemplateDocument as O, useCanvasEdges as On, useEditLeaseLocked as Ot, createConfiguredNode as P, declaredSignals as Pn, phaseAfterAcquire as Pt, optionListValues as Q, useSelfHostedWorkersEnabled as Qn, workflowFingerprint as Qt, workflowParameterIssues as R, runSignalTargets as Rn, tickAction as Rt, GetNodeInstallableVersionsDocument as S, BILLING_PLANS_PATH as Sn, builderPathOf as St, InstallWorkflowNodeDocument as T, collectExtensions as Tn, refusalOfQuota as Tt, nodeTitle as U, resolveFluidGridsFlagsSettled as Un, rememberOwnStatusChange as Ut, fixedParameterState as V, FLUIDGRIDS_FLAG_DEFAULTS as Vn, rememberSessionForReload as Vt, optionText as W, resolvePhaseCFlags as Wn, rememberRevision as Wt, isStringOptionList as X, usePaletteGates as Xn, inAppLeaveTarget as Xt, stripSubmitActions as Y, useFluidGridsFlagsSettled as Yn, findSaveConflict as Yt, optionListText as Z, usePhaseCFlags as Zn, saveFailureActionOf as Zt, global_operations_exports as _, emitWorkflowCreated as _n, watchLeavingLosesChanges as _t, NODES_METADATA as a, structuredParameterType as an, getNodeDetail as ar, latestNodeLog as at, CreateStoreOrderDocument as b, nodesOf as bn, useSaveWorkflow as bt, ensureNodeConfigsLoaded as c, isParamVisible as cn, useBuilderReadOnly as cr, useGuardedNavigate as ct, onNodeTypesUpdate as d, emitNodeInstalled as dn, global_client_exports as dr, departingSave as dt, formatElapsedMs as en, connectionsForAdapter as er, ConditionTreeBuilder as et, refetchStoreNodes as f, emitRunFailed as fn, resetGlobalStoreClient as fr, editStateFor as ft, scheduleNodePaletteLoad as g, emitUpgradeClicked as gn, touchesSavedFields as gt, registryNodeData as h, emitTemplateUsed as hn, savedEverythingBeforeLeaving as ht, AVAILABLE_NODES as i, parseParameterValue as in, replaceAdapterConnections as ir, parseMappingValue as it, WithdrawWorkflowTemplateSubmissionDocument as j, loadDefinitionJson as jn, isLocked as jt, UninstallOrganizationPrivateNodeDocument as k, useNodeRegistryRevision as kn, useEditLeaseStore as kt, ensureNodeTypesLoaded as l, useFluidGridsAnalytics as ln, createGlobalStoreClient as lr, useManualSave as lt, registerWorkflowNodeTypes as m, emitRunStarted as mn, leavingLosesChanges as mt, FluidGridsProvider as n, runDurationMs as nn, matchesAdapterProvider as nr, casesFromRules as nt, NODE_CONFIGS as o, fieldsFromValue as on, buildStickyNode as or, boundFieldsOf as ot, registerNodeManifests as p, emitRunLimitHit as pn, setGlobalStoreClient as pr, editingLeaseLocked as pt, useNodeConfig as q, useDurableParityEnabled as qn, canAutosave as qt, useFluidGridsContext as r, formatParameterValue as rn, newConnectionProviderKey as rr, FieldTree as rt, NODE_TYPES as s, resolveNodeOperation as sn, BuilderReadOnlyProvider as sr, missingRequiredParameters as st, FluidGridsContext as t, nodeStateDurationMs as tn, isOptionalAdapter as tr, SwitchRulesEditor as tt, isNodeConfigsInitialized as u, openRunQuotaUpgradePrompt as un, getGlobalStoreClient as ur, autosaveAllowedFor as ut, BrowseWorkflowNodesDocument as v, emitWorkflowLimitHit as vn, isFlowComplete as vt, InstallPurchasedNodeDocument as w, WORKFLOWS_QUOTA_NAME as wn, createThenOpen as wt, GetMyNodeInstallationsDocument as x, runTriggerFromMode as xn, blankWorkflowCreateInput as xt, BrowseWorkflowTemplatesDocument as y, emitWorkflowPublished as yn, useFlowValidator as yt, asRecord as z, signalPayloadCard as zn, EDIT_SESSION_ID as zt };
@@ -1,8 +1,8 @@
1
1
  "use client";
2
- import { d as useRestoreWorkflowVersion, h as useWorkflowDefinitions } from "./useWorkflows-CGF0B59E.js";
3
- import { i as versionsOfWorkflow, t as VersionDiffDialog } from "./VersionDiffDialog-87FMkJQb.js";
2
+ import { d as useRestoreWorkflowVersion, h as useWorkflowDefinitions } from "./useWorkflows-DNIgOcAG.js";
3
+ import { i as versionsOfWorkflow, t as VersionDiffDialog } from "./VersionDiffDialog--pbvNYM3.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
- import { Wi as getFluidGridsConfig } from "./node-endpoint-configs-Dol5ckHv.js";
5
+ import { qi as getFluidGridsConfig } from "./node-endpoint-configs-DW1ZSZZI.js";
6
6
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
7
7
  import { n as historyControls } from "./pageControlSpecs-DZJ9K37m.js";
8
8
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
@@ -1,12 +1,12 @@
1
1
  "use client";
2
- import { Bi as throwIfResultError, Mn as SnoozeOptimisationSuggestionDocument, Pt as OptimisationSuggestionsDocument, Q as DismissOptimisationSuggestionDocument, T as ContinuousOptimisationSettingsDocument, Ti as getFluidGridsClient, Tn as SetContinuousOptimisationEnabledDocument, Vr as WorkflowProposalDocument, Vt as ProposeOptimisationDocument, it as ErrorAnalyticsDocument, mt as FgRunOptimisationScanDocument, xi as WorkspaceAiUsageDocument } from "./node-endpoint-configs-Dol5ckHv.js";
3
- import { Vn as useContinuousOptimisationEnabled } from "./FluidGridsProvider-BNzMznqt.js";
2
+ import { Dn as SetContinuousOptimisationEnabledDocument, It as OptimisationSuggestionsDocument, Oi as getFluidGridsClient, Pn as SnoozeOptimisationSuggestionDocument, Q as DismissOptimisationSuggestionDocument, T as ContinuousOptimisationSettingsDocument, Ui as throwIfResultError, Ut as ProposeOptimisationDocument, Wr as WorkflowProposalDocument, it as ErrorAnalyticsDocument, mt as FgRunOptimisationScanDocument, wi as WorkspaceAiUsageDocument } from "./node-endpoint-configs-DW1ZSZZI.js";
3
+ import { Gn as useContinuousOptimisationEnabled } from "./FluidGridsProvider-_Nc4kFsk.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
- import { BC as OptimisationKind, VC as OptimisationSuggestionStatus, pI as useFluidGridsPermission, sI as FLUIDGRIDS_PERMISSIONS, uI as SdkPermissionButton, zC as OptimisationDismissReason } from "./graphql-types-Bi7XFTD2.js";
5
+ import { HC as OptimisationDismissReason, UC as OptimisationKind, WC as OptimisationSuggestionStatus, hI as FLUIDGRIDS_PERMISSIONS, vI as SdkPermissionButton, xI as useFluidGridsPermission } from "./graphql-types-XcDLtFwU.js";
6
6
  import { t as proposalCanvasPath } from "./useRequestedProposal-B7uPXfZB.js";
7
- import { c as runListPath, l as utcDay, n as FailureTriagePanel } from "./FailureTriagePanel-LodnXzJr.js";
8
- import { a as formatTokens, c as DISMISS_REASONS, f as monthlySavingLabel, i as aiSpendPeriod, l as evidenceFacts, p as shortRunId, r as aiCost, s as runsOfWorkflowPath, t as AI_SPEND_RANGE_DAYS, u as evidenceWindowDays } from "./ai-usage-CMWDlKmM.js";
9
- import { n as useDataSinks, o as useRunReplayActions, r as useInsightsData, t as useDataSinkData } from "./useObservability--lPyvKqs.js";
7
+ import { c as runListPath, l as utcDay, n as FailureTriagePanel } from "./FailureTriagePanel-BqRG9qxu.js";
8
+ import { a as formatTokens, c as DISMISS_REASONS, f as monthlySavingLabel, i as aiSpendPeriod, l as evidenceFacts, p as shortRunId, r as aiCost, s as runsOfWorkflowPath, t as AI_SPEND_RANGE_DAYS, u as evidenceWindowDays } from "./ai-usage-D5p7ZeRR.js";
9
+ import { n as useDataSinks, o as useRunReplayActions, r as useInsightsData, t as useDataSinkData } from "./useObservability-QPQRRmAZ.js";
10
10
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
11
11
  import { Link, useNavigate } from "react-router";
12
12
  import { Icon } from "@iconify/react";
@@ -1,14 +1,14 @@
1
1
  "use client";
2
- import { Bi as throwIfResultError, Li as describeOperationError, Lr as WorkflowNotificationSettingsDocument, Ti as getFluidGridsClient, Tt as ManagedAiWorkspacePolicyDocument, Wi as getFluidGridsConfig, nr as UpdateManagedAiWorkspacePolicyDocument, or as UpdateWorkflowNotificationSettingsDocument, tr as UpdateDurableHistoryCapsDocument, tt as DurableHistoryCapsDocument } from "./node-endpoint-configs-Dol5ckHv.js";
3
- import { In as FLUIDGRIDS_FLAGS, Kt as findSaveConflict, Un as useDurableParityEnabled, Wn as useFluidGridsFlag, or as getGlobalStoreClient, qn as usePhaseCFlags, wt as useSaveStatusStore } from "./FluidGridsProvider-BNzMznqt.js";
2
+ import { Bi as describeOperationError, Br as WorkflowNotificationSettingsDocument, Oi as getFluidGridsClient, Tt as ManagedAiWorkspacePolicyDocument, Ui as throwIfResultError, cr as UpdateWorkflowNotificationSettingsDocument, ir as UpdateManagedAiWorkspacePolicyDocument, qi as getFluidGridsConfig, rr as UpdateDurableHistoryCapsDocument, tt as DurableHistoryCapsDocument } from "./node-endpoint-configs-DW1ZSZZI.js";
3
+ import { Bn as FLUIDGRIDS_FLAGS, Dt as useSaveStatusStore, Jn as useFluidGridsFlag, Yt as findSaveConflict, Zn as usePhaseCFlags, qn as useDurableParityEnabled, ur as getGlobalStoreClient } from "./FluidGridsProvider-_Nc4kFsk.js";
4
4
  import { H as useFlowStore } from "./node-operation-selection--oy-yEq_.js";
5
5
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
6
- import { Wt as useWorkflowDefinitionQuery, a as useConnections, n as useAgentDefinitions, qt as useWorkflowDefinitionsQuery, zt as useUpdateWorkflowDefinitionMutation } from "./useAgentDefinitions-CUXSBw0L.js";
7
- import { RF as WorkflowSearchAttributeType, pI as useFluidGridsPermission, sI as FLUIDGRIDS_PERMISSIONS } from "./graphql-types-Bi7XFTD2.js";
6
+ import { Wt as useWorkflowDefinitionQuery, a as useConnections, n as useAgentDefinitions, qt as useWorkflowDefinitionsQuery, zt as useUpdateWorkflowDefinitionMutation } from "./useAgentDefinitions-DQqibfr4.js";
7
+ import { KF as WorkflowSearchAttributeType, hI as FLUIDGRIDS_PERMISSIONS, xI as useFluidGridsPermission } from "./graphql-types-XcDLtFwU.js";
8
8
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
9
- import { C as createSearchAttribute, E as deleteSearchAttribute, J as saveArchiveSettings, N as fetchCodecServerSettings, P as fetchPauseRules, R as fetchSearchAttributes, S as createPauseRule, T as deletePauseRule, Y as saveCodecServerSettings, _ as useResource, a as formToInput$2, b as clearArchiveSettings, c as FieldError, d as NativeSelect, i as emptyAgentForm, k as fetchArchiveSettings, n as agentToForm, o as grantDays, p as StatusPill, r as describeRule, t as AgentFormError } from "./agent-form-IKft_4iz.js";
10
- import { c as budgetInputValue, d as withBudgetMode, f as EffectBadge, m as useActionPolicies, n as checkCodecServerUrl, p as effectLabel, s as BUDGET_DIMENSIONS, u as withBudgetLimit } from "./codec-client-DEBa-Wl0.js";
11
- import { a as useLogStreamDestinations, i as useLogStreamDestinationActions } from "./useObservability--lPyvKqs.js";
9
+ import { C as createSearchAttribute, E as deleteSearchAttribute, J as saveArchiveSettings, N as fetchCodecServerSettings, P as fetchPauseRules, R as fetchSearchAttributes, S as createPauseRule, T as deletePauseRule, Y as saveCodecServerSettings, _ as useResource, a as formToInput$2, b as clearArchiveSettings, c as FieldError, d as NativeSelect, i as emptyAgentForm, k as fetchArchiveSettings, n as agentToForm, o as grantDays, p as StatusPill, r as describeRule, t as AgentFormError } from "./agent-form-D25lAEWg.js";
10
+ import { c as budgetInputValue, d as withBudgetMode, f as EffectBadge, m as useActionPolicies, n as checkCodecServerUrl, p as effectLabel, s as BUDGET_DIMENSIONS, u as withBudgetLimit } from "./codec-client-Cz_myeH8.js";
11
+ import { a as useLogStreamDestinations, i as useLogStreamDestinationActions } from "./useObservability-QPQRRmAZ.js";
12
12
  import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
13
13
  import { useNavigate, useParams } from "react-router";
14
14
  import { Icon } from "@iconify/react";