@burdenoff/fluidgrids-fe-sdk 2026.1111.13 → 2026.1111.15

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 (43) hide show
  1. package/README.md +41 -0
  2. package/dist/{ExecutionDetailPage-CDkJeeu2.js → ExecutionDetailPage-DO38vZ_F.js} +4 -4
  3. package/dist/{FluidGridsProvider-CDZjKmfD.js → FluidGridsProvider-B9RR_CI_.js} +237 -325
  4. package/dist/{HistoryPage-DnVGN_72.js → HistoryPage-CA42pU85.js} +1 -1
  5. package/dist/{InsightsPage-CGRpZtGu.js → InsightsPage-CBoN_Mj9.js} +2 -2
  6. package/dist/{ManagedAiPolicyAuthority-DbJBledZ.js → ManagedAiPolicyAuthority-CKihmbJE.js} +2 -2
  7. package/dist/{MissingNodesInstallModal-Ca4f--lw.js → MissingNodesInstallModal-Dm0nMBXM.js} +1 -1
  8. package/dist/{TemplateConfigurationModal-ChQsXf0-.js → TemplateConfigurationModal-Bs_V-E4u.js} +1 -1
  9. package/dist/{TemplateDetailPanel-C0YiVdub.js → TemplateDetailPanel-MlT39VLG.js} +1 -1
  10. package/dist/{TemplatesPage-QXtq6mI3.js → TemplatesPage-CHVpWBuw.js} +5 -4
  11. package/dist/{WorkflowSearchRedirect-B4nHALJg.js → WorkflowSearchRedirect-3gyHcYY2.js} +38 -51
  12. package/dist/{WorkflowShareDialog-ByTSWwwR.js → WorkflowShareDialog-0Ai1HED-.js} +2 -1
  13. package/dist/{WorkflowsList-B9F2e8M6.js → WorkflowsList-CJ3KmMHX.js} +5 -4
  14. package/dist/agent-tools.d.ts +3 -0
  15. package/dist/agent-tools.js +5 -0
  16. package/dist/{agentTools-C0g2OWvI.js → agentTools-B1IK1JEO.js} +2 -2
  17. package/dist/{canvasNoteTools-BUWY18XK.js → canvasNoteTools-eewVHVuy.js} +3 -2
  18. package/dist/executions.js +1 -1
  19. package/dist/{flow-builder-BvCQAGDR.js → flow-builder-C_3sY3pZ.js} +54 -209
  20. package/dist/fluidgridsEvents-CNdcrUNN.js +310 -0
  21. package/dist/history.js +1 -1
  22. package/dist/index-CHeY7_A1.d.ts +105 -0
  23. package/dist/{index-CLqh2u28.d.ts → index-DRf25-D3.d.ts} +7 -105
  24. package/dist/index.d.ts +3 -2
  25. package/dist/index.js +21 -946
  26. package/dist/marksStore-DGCXjTmZ.js +151 -0
  27. package/dist/{node-detail-view-CPD_NSZc.js → node-detail-view-CAws5qjg.js} +3 -3
  28. package/dist/observability.d.ts +1 -1
  29. package/dist/observability.js +1 -1
  30. package/dist/{quick-config-panel-DHkYGaCL.js → quick-config-panel-DOzNkSVV.js} +2 -2
  31. package/dist/settings.js +1 -1
  32. package/dist/templates.js +1 -1
  33. package/dist/uiMarkTools-nlmzsHQM.js +937 -0
  34. package/dist/{useExecutions-BqoD7XWi.js → useExecutions-DkS0FTfw.js} +2 -1
  35. package/dist/{useObservability-Cs-5_NHh.js → useObservability-BkxhHZsX.js} +2 -1
  36. package/dist/{useRunHistory-CEL-CIz-.js → useRunHistory-DHehG09Z.js} +1 -1
  37. package/dist/{useWorkflows-Bwpvfdgv.js → useWorkflows-DyhtoVwp.js} +25 -5
  38. package/dist/workflow-builder.js +2 -2
  39. package/dist/workflow-route.d.ts +33 -0
  40. package/dist/workflow-route.js +4 -0
  41. package/dist/workflowRouteData-BkfVOc-O.js +169 -0
  42. package/dist/workflows-list.js +1 -1
  43. package/package.json +9 -1
@@ -1,17 +1,19 @@
1
1
  "use client";
2
2
  import { A as nodeAccent, B as NODE_TYPE_DRAG_DATA_FORMAT, G as isTriggerOperation, H as useFlowStore, M as isImageIcon, T as resolveInputHandles, U as useIsValidConnection, V as STICKY_NOTE_TYPE, g as toCodeMirrorDiagnostics, j as NodeTypeIcon, r as CODE_WORKFLOW_NODE_TYPE, z as NODE_OPERATION_DRAG_DATA_FORMAT } from "./node-operation-selection--oy-yEq_.js";
3
- import { $ as resolveLoadOptionsSpec, $n as useWorkflowTestsEnabled, $t as useNodeExecution, A as UninstallWorkflowNodeDocument, At as bannerOf, B as coerceNumber, Bn as FLUIDGRIDS_FLAGS, Bt as forgetSessionForReload, C as InstallOrganizationPrivateNodeDocument, Cn as RUNS_QUOTA_NAME, D as OrganizationPrivateNodesDocument, Dn as isQuotaExhaustedFailure, Dt as useSaveStatusStore, Et as saveIndicatorOf, F as useInsertNode, Ft as phaseAfterTakeOver, G as paramsFromOperation, Gt as AUTOSAVE_DEBOUNCE_MS, H as nodeSubtitle, Ht as sessionBeforeReload, I as MissingParametersDialog, It as releasesOnClose, Jn as useFluidGridsFlag, Kn as useDurableFunctionNodesEnabled, Kt as AUTOSAVE_RETRY_DELAYS_MS, L as useRunGuard, Lt as shouldReleaseForIdle, M as getNodeMetadata, Mt as leaseCallQueue, N as buildOperationSeed, Nt as leaseCallSequence, On as useCanvasEdges, Ot as useEditLeaseLocked, Pt as phaseAfterAcquire, Q as optionListValues, Qt as workflowFingerprint, R as workflowParameterIssues, Rt as tickAction, S as GetNodeInstallableVersionsDocument, Sn as BILLING_PLANS_PATH, T as InstallWorkflowNodeDocument, Tn as collectExtensions, Tt as refusalOfQuota, U as nodeTitle, Ut as rememberOwnStatusChange, Vt as rememberSessionForReload, W as optionText, Wt as rememberRevision, X as isStringOptionList, Xn as usePaletteGates, Xt as inAppLeaveTarget, Z as optionListText, Zn as usePhaseCFlags, Zt as saveFailureActionOf, _n as emitWorkflowCreated, _t as watchLeavingLosesChanges, a as NODES_METADATA, an as structuredParameterType, ar as getNodeDetail, b as CreateStoreOrderDocument, bt as useSaveWorkflow, c as ensureNodeConfigsLoaded, cn as isParamVisible, cr as useBuilderReadOnly, ct as useGuardedNavigate, d as onNodeTypesUpdate, dn as emitNodeInstalled, dt as departingSave, er as connectionsForAdapter, et as ConditionTreeBuilder, f as refetchStoreNodes, ft as editStateFor, g as scheduleNodePaletteLoad, gn as emitUpgradeClicked, gt as touchesSavedFields, hn as emitTemplateUsed, ht as savedEverythingBeforeLeaving, i as AVAILABLE_NODES, in as parseParameterValue, ir as replaceAdapterConnections, it as parseMappingValue, jn as loadDefinitionJson, jt as isLocked, k as UninstallOrganizationPrivateNodeDocument, kn as useNodeRegistryRevision, kt as useEditLeaseStore, l as ensureNodeTypesLoaded, ln as useFluidGridsAnalytics, lt as useManualSave, m as registerWorkflowNodeTypes, mt as leavingLosesChanges, nr as matchesAdapterProvider, nt as casesFromRules, o as NODE_CONFIGS, or as buildStickyNode, ot as boundFieldsOf, pt as editingLeaseLocked, q as useNodeConfig, qn as useDurableParityEnabled, qt as canAutosave, rn as formatParameterValue, rr as newConnectionProviderKey, rt as FieldTree, s as NODE_TYPES, sr as BuilderReadOnlyProvider, st as missingRequiredParameters, t as FluidGridsContext, tr as isOptionalAdapter, tt as SwitchRulesEditor, u as isNodeConfigsInitialized, un as openRunQuotaUpgradePrompt, ur as getGlobalStoreClient, ut as autosaveAllowedFor, v as BrowseWorkflowNodesDocument, vt as isFlowComplete, w as InstallPurchasedNodeDocument, x as GetMyNodeInstallationsDocument, y as BrowseWorkflowTemplatesDocument, yt as useFlowValidator, z as asRecord, zt as EDIT_SESSION_ID } from "./FluidGridsProvider-CDZjKmfD.js";
3
+ import { $ as isStringOptionList, $t as inAppLeaveTarget, A as StoreNodeProductsByTypeDocument, At as useSaveStatusStore, B as useRunGuard, Bn as connectionsForAdapter, Bt as shouldReleaseForIdle, C as GetMyNodeInstallationsDocument, Ct as useSaveWorkflow, D as InstallWorkflowNodeDocument, E as InstallPurchasedNodeDocument, En as FLUIDGRIDS_FLAGS, F as getNodeMetadata, Ft as leaseCallQueue, G as nodeSubtitle, Gn as getNodeDetail, Gt as sessionBeforeReload, H as asRecord, Hn as matchesAdapterProvider, Ht as EDIT_SESSION_ID, I as buildOperationSeed, In as usePaletteGates, It as leaseCallSequence, J as paramsFromOperation, Jn as useBuilderReadOnly, Jt as AUTOSAVE_DEBOUNCE_MS, K as nodeTitle, Kn as buildStickyNode, Kt as rememberOwnStatusChange, Ln as usePhaseCFlags, Lt as phaseAfterAcquire, M as UninstallOrganizationPrivateNodeDocument, Mn as useDurableFunctionNodesEnabled, Mt as useEditLeaseStore, N as UninstallWorkflowNodeDocument, Nn as useDurableParityEnabled, Nt as bannerOf, Ot as refusalOfQuota, Pn as useFluidGridsFlag, Pt as isLocked, R as useInsertNode, Rt as phaseAfterTakeOver, S as CreateStoreOrderDocument, St as useFlowValidator, T as InstallOrganizationPrivateNodeDocument, U as coerceNumber, Un as newConnectionProviderKey, Ut as forgetSessionForReload, V as workflowParameterIssues, Vn as isOptionalAdapter, Vt as tickAction, Wn as replaceAdapterConnections, Wt as rememberSessionForReload, X as useNodeConfig, Xn as getGlobalStoreClient, Xt as canAutosave, Yt as AUTOSAVE_RETRY_DELAYS_MS, _n as loadDefinitionJson, _t as leavingLosesChanges, a as NODES_METADATA, at as casesFromRules, b as BrowseWorkflowNodesDocument, bt as watchLeavingLosesChanges, c as ensureInstalledNodeTypesLoaded, cn as structuredParameterType, d as ensureRegistryNodeTypesLoaded, dn as isParamVisible, dt as useGuardedNavigate, en as saveFailureActionOf, et as optionListText, f as isNodeConfigsInitialized, fn as useFluidGridsAnalytics, ft as useManualSave, g as registerWorkflowNodeTypes, gt as editingLeaseLocked, hn as useNodeRegistryRevision, ht as editStateFor, i as AVAILABLE_NODES, it as SwitchRulesEditor, jt as useEditLeaseLocked, k as OrganizationPrivateNodesDocument, kt as saveIndicatorOf, l as ensureNodeConfigsLoaded, lt as boundFieldsOf, m as refetchStoreNodes, mn as useCanvasEdges, mt as departingSave, nn as useNodeExecution, nt as resolveLoadOptionsSpec, o as NODE_CONFIGS, on as formatParameterValue, ot as FieldTree, p as onNodeTypesUpdate, pn as openRunQuotaUpgradePrompt, pt as autosaveAllowedFor, q as optionText, qn as BuilderReadOnlyProvider, qt as rememberRevision, rt as ConditionTreeBuilder, s as NODE_TYPES, sn as parseParameterValue, st as parseMappingValue, t as FluidGridsContext, tn as workflowFingerprint, tt as optionListValues, ut as missingRequiredParameters, v as scheduleNodePaletteLoad, vt as savedEverythingBeforeLeaving, w as GetNodeInstallableVersionsDocument, x as BrowseWorkflowTemplatesDocument, xt as isFlowComplete, yt as touchesSavedFields, z as MissingParametersDialog, zn as useWorkflowTestsEnabled, zt as releasesOnClose } from "./FluidGridsProvider-B9RR_CI_.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
5
  import { Bi as describeOperationError, Br as WorkflowGitRepositoryDocument, Ct as LinkWorkflowGitRepositoryDocument, Dr as WorkflowDefinitionDocument, Ei as WorkspaceRunsQuotaDocument, Ht as PreviewScheduleDocument, Ir as WorkflowGenerationTemplatesDocument, J as DeleteWorkflowRolloutDocument, Kt as PushWorkflowToGitDocument, Li as emitFluidGridsEvent, Lr as WorkflowGitCommitsDocument, Mt as NodeSchemaIntrospectionDocument, Ni as waitForFluidGridsClient, Nr as WorkflowEnvironmentsDocument, Oi as getFluidGridsClient, Pt as NodeUsageStatusDocument, Qt as RemoveNodeFromWorkflowsDocument, Rr as WorkflowGitDiffDocument, Si as WorkflowVersioningDocument, Ui as throwIfResultError, Vn as TakeOverWorkflowEditLeaseDocument, Wr as WorkflowPromotionRequestsDocument, Xn as UnlinkWorkflowGitRepositoryDocument, Yt as RejectWorkflowPromotionDocument, Z as DeployWorkflowVersionToDevDocument, Zt as ReleaseWorkflowEditLeaseDocument, cr as UpdateWorkflowEnvironmentPolicyDocument, i as ActivateWorkflowVersionCheckedDocument, jn as SetWorkflowRolloutDocument, jr as WorkflowEditLeaseDocument, ki as getFluidGridsClientSafe, mr as WebhookTestListenerDocument, n as AcquireWorkflowEditLeaseDocument, nn as RequestWorkflowPromotionDocument, oa as __exportAll, on as RestoreWorkflowFromGitDocument, qi as getFluidGridsConfig, u as ApproveWorkflowPromotionDocument, wr as WorkflowCallInputsDocument, wt as ListenForWebhookTestEventDocument, x as CancelWorkflowPromotionDocument, xi as WorkflowVersionDrainageDocument, yr as WorkflowAuthoringDocument, zn as StopWebhookTestListenerDocument, zr as WorkflowGitPushesDocument } from "./node-endpoint-configs-DHFGA5MQ.js";
6
6
  import { D as describeSchedule, H as pauseSchedule, _ as useResource, c as FieldError, d as NativeSelect, et as triggerSchedule, nt as unpauseSchedule, p as StatusPill, r as describeRule, s as isAgentNodeType, v as backfillSchedule } from "./agent-form-BvMWhQ42.js";
7
7
  import { CF as WorkflowExportFormat, Eo as CodeReplaceStatus, PD as ScheduleType, QF as WorkflowTestExpectedStatus, SF as WorkflowEnvironment, VF as WorkflowScheduleOverlapPolicy, hI as FLUIDGRIDS_PERMISSIONS, vI as SdkPermissionButton, xI as useFluidGridsPermission, xu as DrainageStatus, yI as SdkPermissionGate, yP as VersioningBehavior } from "./graphql-types-XcDLtFwU.js";
8
8
  import { a as useConnections, r as useAgentsUsingConnection, t as useAgentDefinitionList, wt as useRunFromNodeEligibilityQuery } from "./useAgentDefinitions-NFtLytDR.js";
9
+ import { a as emitTemplateUsed, f as BILLING_PLANS_PATH, g as collectExtensions, m as RUNS_QUOTA_NAME, o as emitUpgradeClicked, s as emitWorkflowCreated, t as emitNodeInstalled, y as isQuotaExhaustedFailure } from "./fluidgridsEvents-CNdcrUNN.js";
9
10
  import { F as normaliseAssertRules, I as operatorSpec, L as readAssertRulesSetting, M as ASSERT_OPERATORS, N as describeAssertRuleProblem, P as emptyAssertRuleRow, R as rowsFromRules, _ as buildNodeDisplayMap, a as TEST_STATUS_TONE_CLASS, b as EntityTagPicker, c as draftToInput, d as isTestRunOpen, f as nextSortOrder, g as testStatusTone, h as testStatusLabel, i as useWorkflowTests, l as emptyTestCaseDraft, m as testRunSummaryText, n as useWorkflowProposal, p as pinnedOutputsFromCanvas, s as draftFromTestCase, t as WorkflowProposalCard, u as enabledCaseIds, z as ruleFromRow } from "./WorkflowProposalCard-8Vr56kQa.js";
10
11
  import { t as cn$1 } from "./cn-QqidFIgr.js";
11
12
  import { i as Button$2, t as PublishCustomNodeAction } from "./PublishCustomNodeAction-D2F7oN0S.js";
12
- import { O as CreateWorkflowRefusalDialog, b as lineOfNode, h as fileBaseName, i as useWorkflowCodeExport, n as downloadWorkflowCodeExport, t as WorkflowShareDialog, v as isLosslessReport, w as sortFidelityItems, x as orderedExportFiles, y as isLossyFidelityItem } from "./WorkflowShareDialog-ByTSWwwR.js";
13
+ import { n as useAgentMarksStore } from "./marksStore-DGCXjTmZ.js";
14
+ import { O as CreateWorkflowRefusalDialog, b as lineOfNode, h as fileBaseName, i as useWorkflowCodeExport, n as downloadWorkflowCodeExport, t as WorkflowShareDialog, v as isLosslessReport, w as sortFidelityItems, x as orderedExportFiles, y as isLossyFidelityItem } from "./WorkflowShareDialog-0Ai1HED-.js";
13
15
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
14
- import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-Bwpvfdgv.js";
16
+ import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-DyhtoVwp.js";
15
17
  import { n as VersionLifecycleBar, r as countLifecycle, t as VersionDiffDialog } from "./VersionDiffDialog-Dq2xlPFI.js";
16
18
  import { n as useRequestedProposal } from "./useRequestedProposal-B7uPXfZB.js";
17
19
  import { t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
@@ -10395,6 +10397,19 @@ function useImportWorkflowTemplate() {
10395
10397
 
10396
10398
  // src/utils/workflow-node-check.ts
10397
10399
  /**
10400
+ * Workflow node dependency checking.
10401
+ *
10402
+ * Shared logic for detecting node types used by a workflow that are not
10403
+ * installed in the current workspace, resolving them to store products, and
10404
+ * classifying them as installed / missing (free installable) / missingPaid /
10405
+ * unavailable (not offered by the store, so nothing can install them).
10406
+ *
10407
+ * Used by:
10408
+ * - Template import flow (desktop-sidebar-fragment)
10409
+ * - Shared-workflow copy flow (WorkflowItem)
10410
+ * - AI-assistant-created workflow open flow (WorkflowItem)
10411
+ */
10412
+ /**
10398
10413
  * Canvas-only node types: they live on the React Flow canvas but are never
10399
10414
  * executed, never registered in NODE_CONFIGS and never published to the store.
10400
10415
  *
@@ -10418,50 +10433,22 @@ function getWorkflowNodeTypes(nodes) {
10418
10433
  return [...new Set(nodes.map((n) => n.type).filter((t) => Boolean(t)).filter((t) => !CANVAS_ONLY_NODE_TYPES.has(t)))];
10419
10434
  }
10420
10435
  /**
10421
- * Page size for walking the node catalog. global-store-svc clamps
10422
- * `browseStore` pages to 100 rows (MAX_PAGINATION_LIMIT), so asking for more
10423
- * returns 100 anyway. The old single request for 200 rows silently dropped
10424
- * every node past the first 100 (BOFF-11402).
10436
+ * Node types per store lookup: global-store-svc answers for at most 100 at a
10437
+ * time. A workflow misses far fewer; more are asked in parallel requests.
10425
10438
  */
10426
- const STORE_NODE_PAGE_SIZE = 100;
10439
+ const STORE_NODE_LOOKUP_BATCH_SIZE = 100;
10440
+ /** The store context of FluidGrids node products, as the Node Store browses them. */
10441
+ const STORE_NODE_PRODUCT_CONTEXT = "fluidgrids";
10427
10442
  /**
10428
- * Safety net for the paging loop: 50 pages of 100 is far beyond the catalog
10429
- * (about 175 node products in 2026-11). The loop normally ends on `hasMore`.
10443
+ * The store products that offer any of `nodeTypes`, at most
10444
+ * `STORE_NODE_LOOKUP_BATCH_SIZE` types per request, the requests in parallel.
10445
+ * Blank and repeated types are asked once.
10430
10446
  */
10431
- const STORE_NODE_MAX_PAGES = 50;
10432
- /** The browseStore variables for one page of FluidGrids node products. */
10433
- function storeNodePageVariables(offset) {
10434
- return { input: {
10435
- filter: {
10436
- type: "NODE",
10437
- compatibleWith: "fluidgrids"
10438
- },
10439
- sortBy: "DOWNLOADS",
10440
- pagination: {
10441
- limit: 100,
10442
- offset
10443
- }
10444
- } };
10445
- }
10446
- /**
10447
- * Fetch every FluidGrids-compatible node product from the store.
10448
- *
10449
- * `browseStore` pages by `offset`; its `cursor` input is ignored by the
10450
- * server. The offset advances by the number of rows actually returned so a
10451
- * lower server cap still walks the whole catalog. Rows are de-duplicated by
10452
- * product id in case a page boundary moves while the catalog changes.
10453
- */
10454
- async function fetchAllStoreNodes(fetchPage) {
10455
- const byId = /* @__PURE__ */ new Map();
10456
- let offset = 0;
10457
- for (let page = 0; page < 50; page++) {
10458
- const browse = await fetchPage(storeNodePageVariables(offset));
10459
- const products = browse?.products ?? [];
10460
- for (const product of products) if (!byId.has(product.id)) byId.set(product.id, product);
10461
- if (!browse?.hasMore || products.length === 0) break;
10462
- offset += products.length;
10463
- }
10464
- return [...byId.values()];
10447
+ async function fetchStoreNodeProducts(nodeTypes, fetchProducts) {
10448
+ const wanted = [...new Set(nodeTypes.filter(Boolean))];
10449
+ const batches = [];
10450
+ for (let i = 0; i < wanted.length; i += 100) batches.push(wanted.slice(i, i + 100));
10451
+ return (await Promise.all(batches.map(fetchProducts))).flatMap((products) => [...products ?? []]);
10465
10452
  }
10466
10453
  function publishedAtMs(product) {
10467
10454
  const ms = product.publishedAt ? Date.parse(product.publishedAt) : NaN;
@@ -10503,18 +10490,22 @@ function buildStoreNodeTypeMap(products) {
10503
10490
  return nodeTypeToProduct;
10504
10491
  }
10505
10492
  /**
10506
- * Query the global store for every FluidGrids-compatible node product and map
10507
- * nodeType string -> StoreProduct using manifest.nodeType.
10493
+ * Ask the global store which products offer `nodeTypes` and map each type to the
10494
+ * best one (see compareStoreNodeCandidates). Only the asked types travel: the
10495
+ * check used to page through the whole node catalog for them (BOFF-11754).
10508
10496
  */
10509
- async function fetchStoreNodeTypeMap() {
10497
+ async function fetchStoreNodeTypeMap(nodeTypes) {
10510
10498
  const storeClient = getGlobalStoreClient();
10511
- if (!storeClient) return /* @__PURE__ */ new Map();
10512
- return buildStoreNodeTypeMap(await fetchAllStoreNodes(async (variables) => {
10499
+ if (!storeClient || nodeTypes.length === 0) return /* @__PURE__ */ new Map();
10500
+ return buildStoreNodeTypeMap(await fetchStoreNodeProducts(nodeTypes, async (batch) => {
10513
10501
  return (await storeClient.query({
10514
- query: BrowseWorkflowNodesDocument,
10515
- variables,
10502
+ query: StoreNodeProductsByTypeDocument,
10503
+ variables: {
10504
+ nodeTypes: batch,
10505
+ compatibleWith: STORE_NODE_PRODUCT_CONTEXT
10506
+ },
10516
10507
  fetchPolicy: "cache-first"
10517
- })).data?.browseStore;
10508
+ })).data?.storeNodeProductsByType;
10518
10509
  }));
10519
10510
  }
10520
10511
  /**
@@ -10551,10 +10542,11 @@ function requiredNodeEntry(type, registered, product) {
10551
10542
  async function buildRequiredNodeTypes(nodes) {
10552
10543
  const workflowNodeTypes = getWorkflowNodeTypes(nodes);
10553
10544
  if (workflowNodeTypes.length === 0) return [];
10554
- await ensureNodeTypesLoaded(workflowNodeTypes);
10555
- const missingTypes = workflowNodeTypes.filter((type) => !NODE_CONFIGS.some((c) => c.type === type));
10545
+ const isRegistered = (type) => NODE_CONFIGS.some((c) => c.type === type);
10546
+ await ensureRegistryNodeTypesLoaded(workflowNodeTypes);
10547
+ const missingTypes = workflowNodeTypes.filter((type) => !isRegistered(type));
10556
10548
  let nodeTypeToProduct = /* @__PURE__ */ new Map();
10557
- if (missingTypes.length > 0) nodeTypeToProduct = await fetchStoreNodeTypeMap();
10549
+ if (missingTypes.length > 0) [, nodeTypeToProduct] = await Promise.all([ensureInstalledNodeTypesLoaded(missingTypes), fetchStoreNodeTypeMap(missingTypes)]);
10558
10550
  return workflowNodeTypes.map((type) => {
10559
10551
  const registered = NODE_CONFIGS.find((c) => c.type === type);
10560
10552
  return requiredNodeEntry(type, registered ? { version: registered.defaultData.version } : void 0, nodeTypeToProduct.get(type));
@@ -10582,7 +10574,7 @@ function buildNodeCheck(requiredNodeTypes, installedAppIds) {
10582
10574
  }
10583
10575
 
10584
10576
  // src/hooks/store/useTemplateImportFlow.tsx
10585
- const LazyTemplateConfigurationModal = lazy(() => import("./TemplateConfigurationModal-ChQsXf0-.js").then((m) => ({ default: m.TemplateConfigurationModal })));
10577
+ const LazyTemplateConfigurationModal = lazy(() => import("./TemplateConfigurationModal-Bs_V-E4u.js").then((m) => ({ default: m.TemplateConfigurationModal })));
10586
10578
  /**
10587
10579
  * "Use this template", the same everywhere it is offered: the builder's
10588
10580
  * template panel, the Templates page and the template preview page
@@ -12759,7 +12751,7 @@ function TemplatesGrid({ templates, loading, hasMore, onLoadMore, onTemplateClic
12759
12751
  }
12760
12752
 
12761
12753
  // src/builder/components/flow-builder/components/templates/TemplatesModal.tsx
12762
- const LazyTemplateDetailPanel = lazy(() => import("./TemplateDetailPanel-C0YiVdub.js").then((m) => ({ default: m.TemplateDetailPanel })));
12754
+ const LazyTemplateDetailPanel = lazy(() => import("./TemplateDetailPanel-MlT39VLG.js").then((m) => ({ default: m.TemplateDetailPanel })));
12763
12755
  /**
12764
12756
  * Modal for browsing and selecting workflow templates
12765
12757
  * Features:
@@ -20702,153 +20694,6 @@ function WebhookRunFollower() {
20702
20694
  return null;
20703
20695
  }
20704
20696
 
20705
- // src/agentMarks/plainText.ts
20706
- /**
20707
- * ★ BOFF-11584: the text of a callout or note is model output, and the model
20708
- * has read workflow content people wrote. It is shown as plain text only:
20709
- * React renders it as a text node (never `dangerouslySetInnerHTML`, never a
20710
- * markdown renderer), so markup, links and images in it stay inert characters.
20711
- *
20712
- * This keeps it short and printable as well: control characters (other than
20713
- * line breaks) and bidirectional controls, which can disguise what a line
20714
- * says, are removed; runs of blank lines collapse; the result is clamped.
20715
- */
20716
- const BIDI_CONTROLS = /* @__PURE__ */ new Set([
20717
- 1564,
20718
- 8206,
20719
- 8207,
20720
- 8234,
20721
- 8235,
20722
- 8236,
20723
- 8237,
20724
- 8238,
20725
- 8294,
20726
- 8295,
20727
- 8296,
20728
- 8297
20729
- ]);
20730
- function isDroppedCharacter(code) {
20731
- if (code === 10) return false;
20732
- if (code <= 31) return true;
20733
- if (code >= 127 && code <= 159) return true;
20734
- return BIDI_CONTROLS.has(code);
20735
- }
20736
- function toPlainText(text, max) {
20737
- let kept = "";
20738
- for (const character of text.replace(/\r\n?/g, "\n").replace(/\t/g, " ")) if (!isDroppedCharacter(character.codePointAt(0) ?? 0)) kept += character;
20739
- const cleaned = kept.replace(/ {2,}/g, " ").replace(/ *\n */g, "\n").replace(/\n{3,}/g, "\n\n").trim();
20740
- if (cleaned.length <= max) return cleaned;
20741
- return `${cleaned.slice(0, max - 1).trimEnd()}…`;
20742
- }
20743
-
20744
- // src/agentMarks/marksStore.ts
20745
- /** The text of a mark is model output: kept as plain text, never markup. */
20746
- const CALLOUT_LABEL_MAX = 200;
20747
- const NOTE_MESSAGE_MAX = 280;
20748
- /** A workflow holds at most this many notes, resolved ones included. */
20749
- const MAX_NOTES_PER_WORKFLOW = 20;
20750
- let sequence = 0;
20751
- const nextId = (prefix) => {
20752
- sequence += 1;
20753
- return `${prefix}${sequence}`;
20754
- };
20755
- const useAgentMarksStore = create()((set, get) => ({
20756
- callouts: [],
20757
- notes: [],
20758
- nextNumber: {},
20759
- openNoteId: null,
20760
- flash: null,
20761
- actions: {
20762
- addCallout: ({ label, target, element, route }) => {
20763
- const callout = {
20764
- id: nextId("c"),
20765
- label: toPlainText(label, 200),
20766
- target,
20767
- route,
20768
- element: element ? new WeakRef(element) : null
20769
- };
20770
- set((state) => ({ callouts: [...state.callouts, callout].slice(-3) }));
20771
- return callout;
20772
- },
20773
- rebindCallout: (id, element) => set((state) => ({ callouts: state.callouts.map((callout) => callout.id === id ? {
20774
- ...callout,
20775
- element: new WeakRef(element)
20776
- } : callout) })),
20777
- removeCallout: (id) => set((state) => ({ callouts: state.callouts.filter((callout) => callout.id !== id) })),
20778
- clearCallouts: () => {
20779
- const count = get().callouts.length;
20780
- if (count > 0) set({ callouts: [] });
20781
- return count;
20782
- },
20783
- dropCalloutsOffRoute: (route) => {
20784
- const { callouts } = get();
20785
- const kept = callouts.filter((callout) => callout.route === route);
20786
- if (kept.length !== callouts.length) set({ callouts: kept });
20787
- return callouts.length - kept.length;
20788
- },
20789
- addNote: (input) => {
20790
- const { notes, nextNumber } = get();
20791
- if (notes.filter((note) => note.workflowKey === input.workflowKey).length >= 20) return null;
20792
- const number = nextNumber[input.workflowKey] ?? 1;
20793
- const note = {
20794
- id: nextId("n"),
20795
- number,
20796
- workflowKey: input.workflowKey,
20797
- nodeId: input.nodeId,
20798
- nodeLabel: toPlainText(input.nodeLabel, 80),
20799
- paramKey: input.paramKey ?? null,
20800
- kind: input.kind,
20801
- message: toPlainText(input.message, 280),
20802
- resolved: false
20803
- };
20804
- set({
20805
- notes: [...notes, note],
20806
- nextNumber: {
20807
- ...nextNumber,
20808
- [input.workflowKey]: number + 1
20809
- }
20810
- });
20811
- return note;
20812
- },
20813
- setResolved: (id, resolved) => set((state) => ({ notes: state.notes.map((note) => note.id === id ? {
20814
- ...note,
20815
- resolved
20816
- } : note) })),
20817
- removeNote: (id) => set((state) => ({
20818
- notes: state.notes.filter((note) => note.id !== id),
20819
- openNoteId: state.openNoteId === id ? null : state.openNoteId
20820
- })),
20821
- clearNotes: (workflowKey) => {
20822
- const { notes, openNoteId } = get();
20823
- const kept = workflowKey === void 0 ? [] : notes.filter((note) => note.workflowKey !== workflowKey);
20824
- const removed = notes.length - kept.length;
20825
- if (removed > 0) set({
20826
- notes: kept,
20827
- openNoteId: kept.some((note) => note.id === openNoteId) ? openNoteId : null
20828
- });
20829
- return removed;
20830
- },
20831
- openNote: (id) => set({ openNoteId: id }),
20832
- flashNode: (nodeId) => {
20833
- sequence += 1;
20834
- set({ flash: {
20835
- nodeId,
20836
- token: sequence
20837
- } });
20838
- }
20839
- }
20840
- }));
20841
- /** Reset everything (tests, and sign-out if a host wants it). */
20842
- function resetAgentMarks() {
20843
- useAgentMarksStore.setState({
20844
- callouts: [],
20845
- notes: [],
20846
- nextNumber: {},
20847
- openNoteId: null,
20848
- flash: null
20849
- });
20850
- }
20851
-
20852
20697
  // src/builder/agentNotes/notesKey.ts
20853
20698
  /**
20854
20699
  * ★ BOFF-11584: which workflow a canvas note belongs to. A saved workflow is
@@ -27585,8 +27430,8 @@ function EditLeaseBanner() {
27585
27430
  }
27586
27431
 
27587
27432
  // src/builder/components/flow-builder/flow-builder.tsx
27588
- const LazyNodeDetailView = lazy(() => import("./node-detail-view-CPD_NSZc.js").then((m) => ({ default: m.NodeDetailView })));
27589
- const LazyQuickConfigPanel = lazy(() => import("./quick-config-panel-DHkYGaCL.js").then((m) => ({ default: m.QuickConfigPanel })));
27433
+ const LazyNodeDetailView = lazy(() => import("./node-detail-view-CAws5qjg.js").then((m) => ({ default: m.NodeDetailView })));
27434
+ const LazyQuickConfigPanel = lazy(() => import("./quick-config-panel-DOzNkSVV.js").then((m) => ({ default: m.QuickConfigPanel })));
27590
27435
  const edgeTypes = { deletable: CustomDeletableEdge };
27591
27436
  const edgeOptions = {
27592
27437
  type: "deletable",
@@ -27646,7 +27491,7 @@ const FlowBuilder = ({ readOnly = false }) => {
27646
27491
  const [agentTools, setAgentTools] = useState([]);
27647
27492
  useEffect(() => {
27648
27493
  let cancelled = false;
27649
- import("./agentTools-C0g2OWvI.js").then(({ createBuilderAgentTools }) => {
27494
+ import("./agentTools-B1IK1JEO.js").then(({ createBuilderAgentTools }) => {
27650
27495
  if (cancelled) return;
27651
27496
  setAgentTools(createBuilderAgentTools({ durableFunctionsEnabled: () => paletteGatesRef.current }));
27652
27497
  }).catch((error) => {
@@ -27701,7 +27546,7 @@ const FlowBuilder = ({ readOnly = false }) => {
27701
27546
  const [noteTools, setNoteTools] = useState([]);
27702
27547
  useEffect(() => {
27703
27548
  let cancelled = false;
27704
- import("./canvasNoteTools-BUWY18XK.js").then(({ createCanvasNoteTools }) => {
27549
+ import("./canvasNoteTools-eewVHVuy.js").then(({ createCanvasNoteTools }) => {
27705
27550
  if (cancelled) return;
27706
27551
  setNoteTools(createCanvasNoteTools({ focusNode: (nodeId) => fitViewRef.current({
27707
27552
  nodes: [{ id: nodeId }],
@@ -28009,4 +27854,4 @@ const FlowBuilderPage = ({ workflow, readOnly = false }) => {
28009
27854
  ] });
28010
27855
  };
28011
27856
 
28012
- export { useGlobalStoreClient as $, DialogFooter$1 as A, useImportWorkflowTemplate as B, templatePreview as C, DURABLE_FUNCTION_NODE_TYPES as Ct, DialogClose as D, isDurableFunctionNodeType as Dt, Dialog$1 as E, filterPaletteNodes as Et, DialogTrigger$1 as F, NodeSettingsPanel as G, useInstalledNodes as H, computeAttachPosition as I, RUNNER_INSTALL_SCRIPT_URL as J, RunOnSection as K, useTemplateImportFlow as L, DialogOverlay as M, DialogPortal as N, DialogContent$1 as O, isNodeTypeHiddenFromPalette as Ot, DialogTitle$1 as P, NodeParamsForm as Q, buildNodeCheck as R, TemplateCard as S, Input$1 as St, badgeVariants as T, WORKFLOW_TEST_NODE_TYPES as Tt, NodeExecutionActions as U, useWorkflowTemplates as V, NodeEditorTabBody as W, useRunnerActions as X, runnerInstallCommand as Y, useRunners as Z, resetAgentMarks as _, CardContent$1 as _t, useAiWorkflowTemplates as a, ConnectionSelector as at, JsonView as b, CardHeader$1 as bt, RunsUsageMeter as c, useNodeEditorTab as ct, readRunsQuota as d, NodeEditorTabs as dt, NDV_Z_INDEX as et, runsQuotaLevel as f, TabButton as ft, notesKeyOf as g, Card$1 as gt, useWorkflowReloadStore as h, FluidGridsMark as ht, enrichDraftNodes as i, CodeEditorField as it, DialogHeader$1 as j, DialogDescription$1 as k, isRunControlNodeType as kt, RunsUsageMeterView as l, SCHEDULE_NODE_TYPE as lt, releaseLeaseKeptForReload as m, useNodeSelectedEvent as mt, AI_DRAFT_MAX_PROMPT_LENGTH as n, PopoverContent$1 as nt, BUILDER_FULLSCREEN_ATTRIBUTE as o, ConnectionFormDialog as ot, summarizeRunsQuota as p, NodeInputFields as pt, RunnerStatusPill as q, draftToCanvas as r, PopoverTrigger$1 as rt, BUILDER_FULLSCREEN_EVENT as s, ReadOnlyFieldset as st, FlowBuilderPage as t, Popover$1 as tt, useRunsQuota as u, SchedulePanel as ut, useAgentMarksStore as v, CardDescription$1 as vt, Badge$1 as w, RUN_CONTROL_NODE_TYPES as wt, TableView as x, CardTitle$1 as xt, toPlainText as y, CardFooter as yt, buildRequiredNodeTypes as z };
27857
+ export { Popover$1 as $, DialogPortal as A, useInstalledNodes as B, Dialog$1 as C, WORKFLOW_TEST_NODE_TYPES as Ct, DialogFooter$1 as D, isRunControlNodeType as Dt, DialogDescription$1 as E, isNodeTypeHiddenFromPalette as Et, buildNodeCheck as F, RunnerStatusPill as G, NodeEditorTabBody as H, buildRequiredNodeTypes as I, useRunnerActions as J, RUNNER_INSTALL_SCRIPT_URL as K, getWorkflowNodeTypes as L, DialogTrigger$1 as M, computeAttachPosition as N, DialogHeader$1 as O, useTemplateImportFlow as P, NDV_Z_INDEX as Q, useImportWorkflowTemplate as R, badgeVariants as S, RUN_CONTROL_NODE_TYPES as St, DialogContent$1 as T, isDurableFunctionNodeType as Tt, NodeSettingsPanel as U, NodeExecutionActions as V, RunOnSection as W, NodeParamsForm as X, useRunners as Y, useGlobalStoreClient as Z, JsonView as _, CardFooter as _t, useAiWorkflowTemplates as a, ReadOnlyFieldset as at, templatePreview as b, Input$1 as bt, RunsUsageMeter as c, SchedulePanel as ct, readRunsQuota as d, NodeInputFields as dt, PopoverContent$1 as et, runsQuotaLevel as f, useNodeSelectedEvent as ft, notesKeyOf as g, CardDescription$1 as gt, useWorkflowReloadStore as h, CardContent$1 as ht, enrichDraftNodes as i, ConnectionFormDialog as it, DialogTitle$1 as j, DialogOverlay as k, RunsUsageMeterView as l, NodeEditorTabs as lt, releaseLeaseKeptForReload as m, Card$1 as mt, AI_DRAFT_MAX_PROMPT_LENGTH as n, CodeEditorField as nt, BUILDER_FULLSCREEN_ATTRIBUTE as o, useNodeEditorTab as ot, summarizeRunsQuota as p, FluidGridsMark as pt, runnerInstallCommand as q, draftToCanvas as r, ConnectionSelector as rt, BUILDER_FULLSCREEN_EVENT as s, SCHEDULE_NODE_TYPE as st, FlowBuilderPage as t, PopoverTrigger$1 as tt, useRunsQuota as u, TabButton as ut, TableView as v, CardHeader$1 as vt, DialogClose as w, filterPaletteNodes as wt, Badge$1 as x, DURABLE_FUNCTION_NODE_TYPES as xt, TemplateCard as y, CardTitle$1 as yt, useWorkflowTemplates as z };