@burdenoff/fluidgrids-fe-sdk 2026.1111.8 → 2026.1111.10

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 (45) hide show
  1. package/README.md +66 -52
  2. package/dist/{ExecutionDetailPage-bhdyEtzU.js → ExecutionDetailPage-6ddRdNUR.js} +9 -9
  3. package/dist/{FailureTriagePanel-D4knfH8i.js → FailureTriagePanel-CR1BzOrM.js} +1 -1
  4. package/dist/{FluidGridsProvider-CGu1DfIa.js → FluidGridsProvider-BFdGQ1g_.js} +1 -1
  5. package/dist/{HistoryPage-DzNRgeBL.js → HistoryPage-DFiyqbvw.js} +3 -3
  6. package/dist/{InsightsPage-BWly1n0F.js → InsightsPage-CXCNQqmV.js} +4 -4
  7. package/dist/{ManagedAiPolicyAuthority-DHRJTAea.js → ManagedAiPolicyAuthority-G1Efbc49.js} +6 -6
  8. package/dist/{MissingNodesInstallModal-BFv9-cc9.js → MissingNodesInstallModal-C-nsV4W7.js} +2 -2
  9. package/dist/{NodesPage-Cp11Xnmg.js → NodesPage-C4KtAasX.js} +2 -2
  10. package/dist/{PublishCustomNodeAction-Bdgdkxf_.js → PublishCustomNodeAction-C3fEmWnC.js} +1 -1
  11. package/dist/{TemplateConfigurationModal-Ho9dSHbX.js → TemplateConfigurationModal-CDJFVAho.js} +2 -2
  12. package/dist/{TemplateDetailPanel-CzkeesaA.js → TemplateDetailPanel-BU6SzQy0.js} +2 -2
  13. package/dist/{TemplatesPage-BzLhlV88.js → TemplatesPage-CXMJntN7.js} +5 -5
  14. package/dist/{VersionDiffDialog-C6sKSLQJ.js → VersionDiffDialog-ExN-CN6f.js} +1 -1
  15. package/dist/{WorkflowProposalCard-Bu3Y8Blm.js → WorkflowProposalCard-DuXQI7UY.js} +1 -1
  16. package/dist/{WorkflowSearchRedirect-DgQSfDvn.js → WorkflowSearchRedirect-xe0qc4A3.js} +10 -10
  17. package/dist/{WorkflowShareDialog-CPUkd7CL.js → WorkflowShareDialog-FTeBgyb-.js} +2 -2
  18. package/dist/{WorkflowsList-C5NllPOu.js → WorkflowsList-DUFwerL1.js} +5 -5
  19. package/dist/{agent-form-L-gYYgLb.js → agent-form-CzG3vX_q.js} +1 -1
  20. package/dist/{agentTools-DwvW-jXU.js → agentTools-dDrEjdbB.js} +2 -2
  21. package/dist/{codec-client-C_eJuWkT.js → codec-client-DiFkc0yn.js} +1 -1
  22. package/dist/executions.js +1 -1
  23. package/dist/{flow-builder-C5R5Bopw.js → flow-builder-vz253WZe.js} +296 -55
  24. package/dist/history.js +1 -1
  25. package/dist/{index-Bz3vi1LS.d.ts → index-B3BWqafN.d.ts} +4 -1
  26. package/dist/{index-Cy9jNjgY.d.ts → index-BES5GtJJ.d.ts} +9 -4
  27. package/dist/index.d.ts +3 -3
  28. package/dist/index.js +24 -24
  29. package/dist/{node-detail-view-BeCa5NkB.js → node-detail-view-DlbE4ob6.js} +6 -6
  30. package/dist/{node-endpoint-configs-n4xr62e4.js → node-endpoint-configs-DVo9nUOe.js} +3 -2
  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-A8_WcO2r.js → quick-config-panel-DxNYFw66.js} +2 -2
  35. package/dist/settings.js +1 -1
  36. package/dist/templates.js +1 -1
  37. package/dist/{useAgentDefinitions-D8Q-GkM7.js → useAgentDefinitions-BVTONKpB.js} +1 -1
  38. package/dist/{useExecutions-nrxmx5sw.js → useExecutions-BeY3w5oZ.js} +2 -2
  39. package/dist/{useObservability-D7v6zupc.js → useObservability-BniBi0zw.js} +2 -2
  40. package/dist/{useRunHistory-D-RieQFM.js → useRunHistory-C47nRjSE.js} +2 -2
  41. package/dist/{useWorkflows-DTJbPdQM.js → useWorkflows-BtZBdTmp.js} +2 -2
  42. package/dist/workflow-builder.d.ts +1 -1
  43. package/dist/workflow-builder.js +2 -2
  44. package/dist/workflows-list.js +1 -1
  45. package/package.json +1 -1
@@ -1,19 +1,19 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  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";
4
- 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, 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-CGu1DfIa.js";
4
+ 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, 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-BFdGQ1g_.js";
5
5
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
6
- import { Ai as getFluidGridsClientSafe, Br as WorkflowGitRepositoryDocument, Ct as LinkWorkflowGitRepositoryDocument, Dr as WorkflowDefinitionDocument, Ei as WorkspaceRunsQuotaDocument, Ht as PreviewScheduleDocument, Ir as WorkflowGenerationTemplatesDocument, J as DeleteWorkflowRolloutDocument, Ji as getFluidGridsConfig, Kt as PushWorkflowToGitDocument, Lr as WorkflowGitCommitsDocument, Mt as NodeSchemaIntrospectionDocument, Nr as WorkflowEnvironmentsDocument, Pi as waitForFluidGridsClient, Pt as NodeUsageStatusDocument, Qt as RemoveNodeFromWorkflowsDocument, Ri as emitFluidGridsEvent, Rr as WorkflowGitDiffDocument, Si as WorkflowVersioningDocument, Vi as describeOperationError, Vn as TakeOverWorkflowEditLeaseDocument, Wi as throwIfResultError, 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 getFluidGridsClient, mr as WebhookTestListenerDocument, n as AcquireWorkflowEditLeaseDocument, nn as RequestWorkflowPromotionDocument, on as RestoreWorkflowFromGitDocument, 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-n4xr62e4.js";
7
- 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-L-gYYgLb.js";
6
+ import { Ai as getFluidGridsClientSafe, Br as WorkflowGitRepositoryDocument, Ct as LinkWorkflowGitRepositoryDocument, Dr as WorkflowDefinitionDocument, Ei as WorkspaceRunsQuotaDocument, Ht as PreviewScheduleDocument, Ir as WorkflowGenerationTemplatesDocument, J as DeleteWorkflowRolloutDocument, Ji as getFluidGridsConfig, Kt as PushWorkflowToGitDocument, Lr as WorkflowGitCommitsDocument, Mt as NodeSchemaIntrospectionDocument, Nr as WorkflowEnvironmentsDocument, Pi as waitForFluidGridsClient, Pt as NodeUsageStatusDocument, Qt as RemoveNodeFromWorkflowsDocument, Ri as emitFluidGridsEvent, Rr as WorkflowGitDiffDocument, Si as WorkflowVersioningDocument, Vi as describeOperationError, Vn as TakeOverWorkflowEditLeaseDocument, Wi as throwIfResultError, 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 getFluidGridsClient, mr as WebhookTestListenerDocument, n as AcquireWorkflowEditLeaseDocument, nn as RequestWorkflowPromotionDocument, on as RestoreWorkflowFromGitDocument, 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-DVo9nUOe.js";
7
+ 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-CzG3vX_q.js";
8
8
  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";
9
- import { a as useConnections, r as useAgentsUsingConnection, t as useAgentDefinitionList, wt as useRunFromNodeEligibilityQuery } from "./useAgentDefinitions-D8Q-GkM7.js";
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-Bu3Y8Blm.js";
9
+ import { a as useConnections, r as useAgentsUsingConnection, t as useAgentDefinitionList, wt as useRunFromNodeEligibilityQuery } from "./useAgentDefinitions-BVTONKpB.js";
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-DuXQI7UY.js";
11
11
  import { t as cn$1 } from "./cn-QqidFIgr.js";
12
- import { i as Button$2, t as PublishCustomNodeAction } from "./PublishCustomNodeAction-Bdgdkxf_.js";
13
- 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-CPUkd7CL.js";
12
+ import { i as Button$2, t as PublishCustomNodeAction } from "./PublishCustomNodeAction-C3fEmWnC.js";
13
+ 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-FTeBgyb-.js";
14
14
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
15
- import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-DTJbPdQM.js";
16
- import { n as VersionLifecycleBar, r as countLifecycle, t as VersionDiffDialog } from "./VersionDiffDialog-C6sKSLQJ.js";
15
+ import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-BtZBdTmp.js";
16
+ import { n as VersionLifecycleBar, r as countLifecycle, t as VersionDiffDialog } from "./VersionDiffDialog-ExN-CN6f.js";
17
17
  import { n as useRequestedProposal } from "./useRequestedProposal-B7uPXfZB.js";
18
18
  import { t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
19
19
  import * as React$1 from "react";
@@ -9224,6 +9224,33 @@ function storeContextHeaders(input) {
9224
9224
  return headers;
9225
9225
  }
9226
9226
 
9227
+ // src/hooks/store/store-pagination.ts
9228
+ /**
9229
+ * Paging rules for the builder's store node lists (BOFF-11753).
9230
+ *
9231
+ * `browseStore` pages by offset. Two "Load more" clicks in quick succession
9232
+ * used to fetch the same page twice and append both copies, and the next
9233
+ * offset was then taken from the row count including the copies, so the
9234
+ * nodes in between were skipped. These helpers keep every page merge
9235
+ * duplicate-free, which also keeps the offset (the number of distinct nodes
9236
+ * already shown) correct.
9237
+ */
9238
+ /** Appends `next` to `prev`, dropping any item whose id is already present. */
9239
+ function appendUniqueById(prev, next) {
9240
+ const seen = new Set(prev.map((item) => item.id));
9241
+ const merged = [...prev];
9242
+ for (const item of next) {
9243
+ if (seen.has(item.id)) continue;
9244
+ seen.add(item.id);
9245
+ merged.push(item);
9246
+ }
9247
+ return merged;
9248
+ }
9249
+ /** The offset of the next page: how many distinct nodes are already listed. */
9250
+ function nextStoreOffset(products) {
9251
+ return new Set(products.map((product) => product.id)).size;
9252
+ }
9253
+
9227
9254
  // src/hooks/store/useStoreNodes.ts
9228
9255
  /**
9229
9256
  * Hook to browse and search workflow nodes from the global store
@@ -9258,24 +9285,18 @@ function useStoreNodes(options = {}) {
9258
9285
  fetchPolicy: "cache-and-network",
9259
9286
  context: Object.keys(contextHeaders).length > 0 ? { headers: contextHeaders } : void 0
9260
9287
  });
9261
- console.log("[useStoreNodes] Hook state:", {
9262
- input,
9263
- data,
9264
- loading,
9265
- error,
9266
- hasData: !!data,
9267
- hasBrowseStore: !!data?.browseStore,
9268
- hasProducts: !!data?.browseStore?.products,
9269
- productsLength: data?.browseStore?.products?.length
9270
- });
9288
+ const loadingMoreRef = useRef(false);
9289
+ const [loadingMore, setLoadingMore] = useState(false);
9271
9290
  const handleFetchMore = () => {
9272
- if (!data?.browseStore?.hasMore) return;
9291
+ if (!data?.browseStore?.hasMore || loadingMoreRef.current) return;
9292
+ loadingMoreRef.current = true;
9293
+ setLoadingMore(true);
9273
9294
  fetchMore({
9274
9295
  variables: { input: {
9275
9296
  ...input,
9276
9297
  pagination: {
9277
9298
  ...input.pagination,
9278
- offset: data.browseStore.products.length
9299
+ offset: nextStoreOffset(data.browseStore.products)
9279
9300
  }
9280
9301
  } },
9281
9302
  context: Object.keys(contextHeaders).length > 0 ? { headers: contextHeaders } : void 0,
@@ -9285,10 +9306,13 @@ function useStoreNodes(options = {}) {
9285
9306
  ...fetchMoreResult,
9286
9307
  browseStore: {
9287
9308
  ...fetchMoreResult.browseStore,
9288
- products: [...prev.browseStore?.products || [], ...fetchMoreResult.browseStore?.products || []]
9309
+ products: appendUniqueById(prev.browseStore?.products || [], fetchMoreResult.browseStore?.products || [])
9289
9310
  }
9290
9311
  };
9291
9312
  }
9313
+ }).finally(() => {
9314
+ loadingMoreRef.current = false;
9315
+ setLoadingMore(false);
9292
9316
  });
9293
9317
  };
9294
9318
  return {
@@ -9296,6 +9320,8 @@ function useStoreNodes(options = {}) {
9296
9320
  totalCount: data?.browseStore?.totalCount || 0,
9297
9321
  hasMore: data?.browseStore?.hasMore || false,
9298
9322
  loading,
9323
+ /** True while a "Load more" page is being fetched. */
9324
+ loadingMore,
9299
9325
  error,
9300
9326
  fetchMore: handleFetchMore,
9301
9327
  refetch
@@ -10274,7 +10300,7 @@ function StoreCategoryList({ searchTerm, onSearchChange, onSelectCategory, onSel
10274
10300
  if (autoFocusSearch) searchRef.current?.focus();
10275
10301
  }, [autoFocusSearch]);
10276
10302
  const paletteGates = usePaletteGates();
10277
- const { products: storeProducts, loading, hasMore, fetchMore } = useStoreNodes({ filter: {
10303
+ const { products: storeProducts, loading, loadingMore, hasMore, fetchMore } = useStoreNodes({ filter: {
10278
10304
  type: "NODE",
10279
10305
  compatibleWith: "fluidgrids",
10280
10306
  search: isSearching ? searchTerm.trim() : void 0
@@ -10369,9 +10395,12 @@ function StoreCategoryList({ searchTerm, onSearchChange, onSelectCategory, onSel
10369
10395
  }, item.productId))]
10370
10396
  }),
10371
10397
  hasMore && /* @__PURE__ */ jsx("button", {
10398
+ type: "button",
10372
10399
  onClick: fetchMore,
10373
- className: "w-full mt-2 py-2 text-xs text-primary hover:text-primary/80 font-medium transition-colors",
10374
- children: tr("fluidgrids.builder.storeCategoryList.loadMoreButton", "Load more")
10400
+ disabled: loadingMore,
10401
+ "aria-busy": loadingMore,
10402
+ className: "w-full mt-2 py-2 text-xs text-primary hover:text-primary/80 font-medium transition-colors disabled:cursor-wait disabled:opacity-60",
10403
+ children: loadingMore ? tr("fluidgrids.builder.storeNodesGrid.loadingMore", "Loading...") : tr("fluidgrids.builder.storeCategoryList.loadMoreButton", "Load more")
10375
10404
  })
10376
10405
  ] })
10377
10406
  }) : showDeprecated ? /* @__PURE__ */ jsxs("div", {
@@ -10487,9 +10516,10 @@ function StoreCategoryList({ searchTerm, onSearchChange, onSelectCategory, onSel
10487
10516
 
10488
10517
  // src/builder/components/flow-builder/components/blocks/sidebar/panels/store-browse/components/store-category-nodes.tsx
10489
10518
  function StoreCategoryNodes({ category, onBack, onSelectNode }) {
10519
+ const tr = useTr();
10490
10520
  const [searchTerm, setSearchTerm] = useState("");
10491
10521
  const paletteGates = usePaletteGates();
10492
- const { products: storeProducts, loading, hasMore, fetchMore } = useStoreNodes({ filter: {
10522
+ const { products: storeProducts, loading, loadingMore, hasMore, fetchMore } = useStoreNodes({ filter: {
10493
10523
  type: "NODE",
10494
10524
  compatibleWith: "fluidgrids",
10495
10525
  category: category.key || void 0,
@@ -10508,7 +10538,7 @@ function StoreCategoryNodes({ category, onBack, onSelectNode }) {
10508
10538
  children: [/* @__PURE__ */ jsx(Icon, {
10509
10539
  icon: "mynaui:chevron-left",
10510
10540
  className: "size-3.5"
10511
- }), "Back"]
10541
+ }), tr("fluidgrids.builder.storeCategoryList.backButton", "Back")]
10512
10542
  }),
10513
10543
  /* @__PURE__ */ jsxs("div", {
10514
10544
  className: "flex items-center gap-2.5 mb-3",
@@ -10597,9 +10627,12 @@ function StoreCategoryNodes({ category, onBack, onSelectNode }) {
10597
10627
  }, node.id);
10598
10628
  }),
10599
10629
  hasMore && /* @__PURE__ */ jsx("button", {
10630
+ type: "button",
10600
10631
  onClick: fetchMore,
10601
- className: "w-full mt-2 py-2 text-xs text-primary hover:text-primary/80 font-medium transition-colors",
10602
- children: "Load more"
10632
+ disabled: loadingMore,
10633
+ "aria-busy": loadingMore,
10634
+ className: "w-full mt-2 py-2 text-xs text-primary hover:text-primary/80 font-medium transition-colors disabled:cursor-wait disabled:opacity-60",
10635
+ children: loadingMore ? tr("fluidgrids.builder.storeNodesGrid.loadingMore", "Loading...") : tr("fluidgrids.builder.storeCategoryList.loadMoreButton", "Load more")
10603
10636
  })
10604
10637
  ]
10605
10638
  })
@@ -11908,7 +11941,7 @@ function TemplatesGrid({ templates, loading, hasMore, onLoadMore, onTemplateClic
11908
11941
  }
11909
11942
 
11910
11943
  // src/builder/components/flow-builder/components/templates/TemplatesModal.tsx
11911
- const LazyTemplateDetailPanel = lazy(() => import("./TemplateDetailPanel-CzkeesaA.js").then((m) => ({ default: m.TemplateDetailPanel })));
11944
+ const LazyTemplateDetailPanel = lazy(() => import("./TemplateDetailPanel-BU6SzQy0.js").then((m) => ({ default: m.TemplateDetailPanel })));
11912
11945
  /**
11913
11946
  * Modal for browsing and selecting workflow templates
11914
11947
  * Features:
@@ -12218,7 +12251,7 @@ function buildNodeCheck(requiredNodeTypes, installedAppIds) {
12218
12251
  }
12219
12252
 
12220
12253
  // src/builder/components/flow-builder/components/blocks/sidebar/fragments/desktop-sidebar-fragment.tsx
12221
- const LazyTemplateConfigurationModal = lazy(() => import("./TemplateConfigurationModal-Ho9dSHbX.js").then((m) => ({ default: m.TemplateConfigurationModal })));
12254
+ const LazyTemplateConfigurationModal = lazy(() => import("./TemplateConfigurationModal-CDJFVAho.js").then((m) => ({ default: m.TemplateConfigurationModal })));
12222
12255
  function DesktopSidebarFragment({ activePanel, setActivePanel }) {
12223
12256
  const tr = useTr();
12224
12257
  const { bus, workspaceId } = useFluidGridsAnalytics();
@@ -12265,9 +12298,9 @@ function DesktopSidebarFragment({ activePanel, setActivePanel }) {
12265
12298
  setImporting(true);
12266
12299
  const nodesToInstall = (nodeCheck?.missing ?? []).filter((n) => !!n.storeProductId);
12267
12300
  if (nodesToInstall.length > 0) {
12268
- const { getGlobalStoreClient: getStore } = await import("./FluidGridsProvider-CGu1DfIa.js").then((n) => n.dr);
12269
- const { InstallWorkflowNodeDocument } = await import("./FluidGridsProvider-CGu1DfIa.js").then((n) => n._);
12270
- const { getFluidGridsConfig } = await import("./node-endpoint-configs-n4xr62e4.js").then((n) => n.qi);
12301
+ const { getGlobalStoreClient: getStore } = await import("./FluidGridsProvider-BFdGQ1g_.js").then((n) => n.dr);
12302
+ const { InstallWorkflowNodeDocument } = await import("./FluidGridsProvider-BFdGQ1g_.js").then((n) => n._);
12303
+ const { getFluidGridsConfig } = await import("./node-endpoint-configs-DVo9nUOe.js").then((n) => n.qi);
12271
12304
  const storeClient = getStore();
12272
12305
  const cfg = getFluidGridsConfig();
12273
12306
  for (let i = 0; i < nodesToInstall.length; i++) {
@@ -12309,8 +12342,8 @@ function DesktopSidebarFragment({ activePanel, setActivePanel }) {
12309
12342
  const { applyTemplateInputs } = await import("./template-input-applicator-C0p6hE4K.js").then((n) => n.r);
12310
12343
  definitionJson = applyTemplateInputs(definitionJson, overrides.templateInputs);
12311
12344
  }
12312
- const { getFluidGridsClient } = await import("./node-endpoint-configs-n4xr62e4.js").then((n) => n.Di);
12313
- const { getFluidGridsConfig } = await import("./node-endpoint-configs-n4xr62e4.js").then((n) => n.qi);
12345
+ const { getFluidGridsClient } = await import("./node-endpoint-configs-DVo9nUOe.js").then((n) => n.Di);
12346
+ const { getFluidGridsConfig } = await import("./node-endpoint-configs-DVo9nUOe.js").then((n) => n.qi);
12314
12347
  const { gql } = await import("@apollo/client/core");
12315
12348
  const IMPORT_MUTATION = gql`
12316
12349
  mutation ImportWorkflowTemplate(
@@ -12362,8 +12395,8 @@ function DesktopSidebarFragment({ activePanel, setActivePanel }) {
12362
12395
  category: content.defaultCategory || template.category
12363
12396
  });
12364
12397
  try {
12365
- const { getGlobalStoreClient: getStoreClient } = await import("./FluidGridsProvider-CGu1DfIa.js").then((n) => n.dr);
12366
- const { InstallWorkflowNodeDocument } = await import("./FluidGridsProvider-CGu1DfIa.js").then((n) => n._);
12398
+ const { getGlobalStoreClient: getStoreClient } = await import("./FluidGridsProvider-BFdGQ1g_.js").then((n) => n.dr);
12399
+ const { InstallWorkflowNodeDocument } = await import("./FluidGridsProvider-BFdGQ1g_.js").then((n) => n._);
12367
12400
  const storeClient = getStoreClient();
12368
12401
  if (storeClient) throwIfResultError(await storeClient.mutate({
12369
12402
  mutation: InstallWorkflowNodeDocument,
@@ -12417,7 +12450,7 @@ function DesktopSidebarFragment({ activePanel, setActivePanel }) {
12417
12450
  const handleUseTemplate = useCallback(async (template) => {
12418
12451
  try {
12419
12452
  toast.loading(tr("fluidgrids.builder.desktopSidebar.loadingTemplateToast", "Loading template..."), { id: "template-load" });
12420
- const { getGlobalStoreClient } = await import("./FluidGridsProvider-CGu1DfIa.js").then((n) => n.dr);
12453
+ const { getGlobalStoreClient } = await import("./FluidGridsProvider-BFdGQ1g_.js").then((n) => n.dr);
12421
12454
  const { gql } = await import("@apollo/client/core");
12422
12455
  const GET_TEMPLATE_DETAIL = gql`
12423
12456
  query GetWorkflowTemplateDetail($id: ID!) {
@@ -18987,6 +19020,12 @@ const SHORTCUT_ROWS = [
18987
19020
  mac: "⇧S",
18988
19021
  other: "Shift+S"
18989
19022
  },
19023
+ {
19024
+ labelKey: "fluidgrids.builder.shortcutsHelp.fullscreen",
19025
+ labelDefault: "Full screen on / off",
19026
+ mac: "F",
19027
+ other: "F"
19028
+ },
18990
19029
  {
18991
19030
  labelKey: "fluidgrids.builder.shortcutsHelp.cancel",
18992
19031
  labelDefault: "Close a panel / cancel an edit",
@@ -19135,7 +19174,7 @@ function useFlowClipboard() {
19135
19174
  /** True when the event target is a text-entry surface — every shortcut here
19136
19175
  * backs off so native browser/input behavior (its own undo, text copy,
19137
19176
  * caret navigation, …) keeps working normally while typing. */
19138
- function isEditableTarget(target) {
19177
+ function isEditableTarget$1(target) {
19139
19178
  const el = target;
19140
19179
  if (!el) return false;
19141
19180
  return el.tagName === "INPUT" || el.tagName === "TEXTAREA" || el.tagName === "SELECT" || el.isContentEditable;
@@ -19166,7 +19205,7 @@ function useEditorShortcuts(options) {
19166
19205
  useEffect(() => {
19167
19206
  if (readOnly) return;
19168
19207
  const onKeyDown = (e) => {
19169
- const editable = isEditableTarget(e.target);
19208
+ const editable = isEditableTarget$1(e.target);
19170
19209
  const mod = e.metaKey || e.ctrlKey;
19171
19210
  if (!mod && !e.altKey && e.shiftKey && e.key.toLowerCase() === "s" && !editable) {
19172
19211
  e.preventDefault();
@@ -21583,6 +21622,201 @@ const SaveFlowButton = ({ className }) => {
21583
21622
  }) });
21584
21623
  };
21585
21624
 
21625
+ // src/builder/lib/builder-fullscreen.ts
21626
+ /**
21627
+ * Builder fullscreen (BOFF-11752): the rules and the browser calls, kept free
21628
+ * of React so they are unit-tested with plain objects.
21629
+ *
21630
+ * Fullscreen means two things at once, like YouTube's F key:
21631
+ * - the browser's own fullscreen for the whole page (`documentElement`), so
21632
+ * the builder's menus, dialogs and toasts, which portal to `<body>`, stay
21633
+ * visible; and
21634
+ * - a signal to the host shell to hide its header, side navigation and
21635
+ * footer, so only the builder is on screen.
21636
+ *
21637
+ * The signal is a `data-fluidgrids-builder-fullscreen` attribute on `<html>`
21638
+ * plus a `fluidgrids:builder-fullscreen` window event. A shell that mounts the
21639
+ * SDK through another package (fluidgrids-app through microfe-workflows) can
21640
+ * read it without any callback plumbing. Hosts using `onEvent` also receive a
21641
+ * `builder:fullscreen` host event.
21642
+ */
21643
+ /** Attribute set on `<html>` while the builder is in fullscreen. */
21644
+ const BUILDER_FULLSCREEN_ATTRIBUTE = "data-fluidgrids-builder-fullscreen";
21645
+ /** Window event fired when the builder enters or leaves fullscreen. */
21646
+ const BUILDER_FULLSCREEN_EVENT = "fluidgrids:builder-fullscreen";
21647
+ /** F with no modifier toggles fullscreen, except while typing in a field. */
21648
+ function isFullscreenToggleKey(event, editable) {
21649
+ return !editable && !event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey && event.key.toLowerCase() === "f";
21650
+ }
21651
+ /** True when the event target is a text-entry surface. */
21652
+ function isEditableTarget(target) {
21653
+ if (!target || typeof target !== "object" || !("tagName" in target)) return false;
21654
+ const el = target;
21655
+ return el.tagName === "INPUT" || el.tagName === "TEXTAREA" || el.tagName === "SELECT" || el.isContentEditable === true;
21656
+ }
21657
+ /** True while the page is in the browser's fullscreen. */
21658
+ function isDocumentFullscreen(doc) {
21659
+ return !!doc.fullscreenElement;
21660
+ }
21661
+ /**
21662
+ * Ask the browser for fullscreen on the whole page. Resolves `false` when the
21663
+ * browser has no Fullscreen API, refuses it (no user gesture, an iframe
21664
+ * without `allowfullscreen`, iPhone Safari) or fails; the caller then keeps
21665
+ * the expanded layout without browser fullscreen.
21666
+ */
21667
+ async function requestDocumentFullscreen(doc) {
21668
+ const request = doc.documentElement.requestFullscreen;
21669
+ if (doc.fullscreenEnabled === false || typeof request !== "function") return false;
21670
+ try {
21671
+ await request.call(doc.documentElement);
21672
+ return true;
21673
+ } catch {
21674
+ return false;
21675
+ }
21676
+ }
21677
+ /** Leave the browser's fullscreen when the page is in it. Never throws. */
21678
+ async function exitDocumentFullscreen(doc) {
21679
+ if (!isDocumentFullscreen(doc) || typeof doc.exitFullscreen !== "function") return;
21680
+ try {
21681
+ await doc.exitFullscreen();
21682
+ } catch {}
21683
+ }
21684
+ /** Tell the host shell the builder entered or left fullscreen. */
21685
+ function publishBuilderFullscreen(active, doc, target, createEvent = (type, detail) => new CustomEvent(type, { detail })) {
21686
+ if (active) doc.documentElement.setAttribute(BUILDER_FULLSCREEN_ATTRIBUTE, "true");
21687
+ else doc.documentElement.removeAttribute(BUILDER_FULLSCREEN_ATTRIBUTE);
21688
+ target.dispatchEvent(createEvent(BUILDER_FULLSCREEN_EVENT, { active }));
21689
+ }
21690
+
21691
+ // src/builder/stores/builder-fullscreen-store.ts
21692
+ /**
21693
+ * Whether the builder is in fullscreen (BOFF-11752), shared by the header
21694
+ * button, the F shortcut and the controller that keeps the browser's
21695
+ * fullscreen and the host shell in step.
21696
+ */
21697
+ const useBuilderFullscreenStore = create((set) => ({
21698
+ active: false,
21699
+ browserFullscreen: false,
21700
+ actions: {
21701
+ set: (active, browserFullscreen = false) => set({
21702
+ active,
21703
+ browserFullscreen: active && browserFullscreen
21704
+ }),
21705
+ reset: () => set({
21706
+ active: false,
21707
+ browserFullscreen: false
21708
+ })
21709
+ }
21710
+ }));
21711
+
21712
+ // src/builder/hooks/use-builder-fullscreen.ts
21713
+ /**
21714
+ * Builder fullscreen (BOFF-11752): toggle it from the header button or the F
21715
+ * key, leave it with Esc, and keep the browser's fullscreen, the host shell
21716
+ * signal and the host `builder:fullscreen` event in step.
21717
+ */
21718
+ function announce(active) {
21719
+ publishBuilderFullscreen(active, document, window);
21720
+ emitFluidGridsEvent("builder:fullscreen", { active });
21721
+ }
21722
+ /**
21723
+ * Enter fullscreen. Call it from a click or key handler: the browser grants
21724
+ * its fullscreen only during a user gesture, and the request below runs
21725
+ * before the first `await`, so it still counts as one.
21726
+ */
21727
+ async function enterBuilderFullscreen() {
21728
+ const { active, actions } = useBuilderFullscreenStore.getState();
21729
+ if (active) return;
21730
+ actions.set(true, false);
21731
+ announce(true);
21732
+ const granted = await requestDocumentFullscreen(document);
21733
+ if (useBuilderFullscreenStore.getState().active) actions.set(true, granted);
21734
+ else if (granted) await exitDocumentFullscreen(document);
21735
+ }
21736
+ /** Leave fullscreen and restore the host shell. */
21737
+ async function exitBuilderFullscreen() {
21738
+ const { active, actions } = useBuilderFullscreenStore.getState();
21739
+ if (!active) return;
21740
+ actions.reset();
21741
+ announce(false);
21742
+ await exitDocumentFullscreen(document);
21743
+ }
21744
+ function toggleBuilderFullscreen() {
21745
+ return useBuilderFullscreenStore.getState().active ? exitBuilderFullscreen() : enterBuilderFullscreen();
21746
+ }
21747
+ /** A dialog (the NDV, a modal) is open: keys belong to it, not the builder. */
21748
+ function dialogOpen() {
21749
+ return document.querySelector("[role=\"dialog\"]") !== null;
21750
+ }
21751
+ /** For the header button and other UI. */
21752
+ function useBuilderFullscreen() {
21753
+ return {
21754
+ active: useBuilderFullscreenStore((s) => s.active),
21755
+ toggle: useCallback(() => {
21756
+ toggleBuilderFullscreen();
21757
+ }, [])
21758
+ };
21759
+ }
21760
+ /**
21761
+ * Mount once per open builder. Handles F and Esc, follows the browser when it
21762
+ * leaves fullscreen on its own (Esc, the browser's own button), and always
21763
+ * restores the host shell when the builder unmounts (navigating away).
21764
+ */
21765
+ function useBuilderFullscreenController() {
21766
+ useEffect(() => {
21767
+ const onKeyDown = (event) => {
21768
+ if (event.defaultPrevented || dialogOpen()) return;
21769
+ const editable = isEditableTarget(event.target);
21770
+ if (isFullscreenToggleKey(event, editable)) {
21771
+ event.preventDefault();
21772
+ toggleBuilderFullscreen();
21773
+ return;
21774
+ }
21775
+ if (event.key !== "Escape" || editable) return;
21776
+ const { active, browserFullscreen } = useBuilderFullscreenStore.getState();
21777
+ if (!active || browserFullscreen) return;
21778
+ if (useFlowStore.getState().workflow.quickConfig) return;
21779
+ exitBuilderFullscreen();
21780
+ };
21781
+ const onFullscreenChange = () => {
21782
+ const { active, browserFullscreen } = useBuilderFullscreenStore.getState();
21783
+ if (active && browserFullscreen && !isDocumentFullscreen(document)) exitBuilderFullscreen();
21784
+ };
21785
+ window.addEventListener("keydown", onKeyDown);
21786
+ document.addEventListener("fullscreenchange", onFullscreenChange);
21787
+ return () => {
21788
+ window.removeEventListener("keydown", onKeyDown);
21789
+ document.removeEventListener("fullscreenchange", onFullscreenChange);
21790
+ exitBuilderFullscreen();
21791
+ };
21792
+ }, []);
21793
+ }
21794
+
21795
+ // src/builder/components/flow-builder/components/ui/fullscreen-button.tsx
21796
+ /**
21797
+ * Header button that puts the builder in fullscreen and back (BOFF-11752),
21798
+ * the same toggle as the F key.
21799
+ */
21800
+ function FullscreenButton() {
21801
+ const tr = useTr();
21802
+ const { active, toggle } = useBuilderFullscreen();
21803
+ const label = active ? tr("fluidgrids.builder.fullscreen.exit", "Exit full screen (F)") : tr("fluidgrids.builder.fullscreen.enter", "Full screen (F)");
21804
+ return /* @__PURE__ */ jsx(Button, {
21805
+ variant: "ghost",
21806
+ size: "icon",
21807
+ className: "shrink-0 text-card-foreground",
21808
+ title: label,
21809
+ "aria-label": label,
21810
+ "aria-pressed": active,
21811
+ onClick: toggle,
21812
+ "data-testid": "builder-fullscreen-toggle",
21813
+ children: /* @__PURE__ */ jsx(Icon, {
21814
+ icon: active ? "mdi:fullscreen-exit" : "mdi:fullscreen",
21815
+ className: "size-5"
21816
+ })
21817
+ });
21818
+ }
21819
+
21586
21820
  // src/builder/components/flow-builder/components/ui/trigger-data-dialog.tsx
21587
21821
  const PLACEHOLDER_JSON = `{
21588
21822
  "message": "Hello, what can you help me with?",
@@ -26287,6 +26521,7 @@ function HeaderActions({ tier }) {
26287
26521
  /* @__PURE__ */ jsx(CodeViewPanel, { compact: true }),
26288
26522
  /* @__PURE__ */ jsx(ShareWorkflowButton, { compact: true }),
26289
26523
  /* @__PURE__ */ jsx(GuideIcon, {}),
26524
+ /* @__PURE__ */ jsx(FullscreenButton, {}),
26290
26525
  /* @__PURE__ */ jsx(Divider, {}),
26291
26526
  /* @__PURE__ */ jsx(SaveFlowButton, {}),
26292
26527
  /* @__PURE__ */ jsx(ActivateWorkflowButton, {}),
@@ -26294,25 +26529,31 @@ function HeaderActions({ tier }) {
26294
26529
  ] });
26295
26530
  if (tier === "mid") return /* @__PURE__ */ jsxs(Fragment, { children: [
26296
26531
  /* @__PURE__ */ jsx(PanelIcons, {}),
26532
+ /* @__PURE__ */ jsx(FullscreenButton, {}),
26297
26533
  /* @__PURE__ */ jsx(Divider, {}),
26298
26534
  /* @__PURE__ */ jsx(SaveFlowButton, {}),
26299
26535
  /* @__PURE__ */ jsx(ActivateWorkflowButton, {}),
26300
26536
  run,
26301
26537
  /* @__PURE__ */ jsx(ActionsMenu, {})
26302
26538
  ] });
26303
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(PanelIcons, {}), /* @__PURE__ */ jsxs(ActionsMenu, { children: [
26304
- /* @__PURE__ */ jsx(SaveFlowButton, { className: "w-full justify-start" }),
26305
- /* @__PURE__ */ jsx(ActivateWorkflowButton, { className: "w-full justify-start" }),
26306
- /* @__PURE__ */ jsx(RunWithViewRuns, {
26307
- onViewRuns: handleViewRuns,
26308
- canViewRuns: !!id,
26309
- className: "w-full",
26310
- runButtonClassName: "flex-1 justify-start rounded-l-lg"
26311
- })
26312
- ] })] });
26539
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
26540
+ /* @__PURE__ */ jsx(PanelIcons, {}),
26541
+ /* @__PURE__ */ jsx(FullscreenButton, {}),
26542
+ /* @__PURE__ */ jsxs(ActionsMenu, { children: [
26543
+ /* @__PURE__ */ jsx(SaveFlowButton, { className: "w-full justify-start" }),
26544
+ /* @__PURE__ */ jsx(ActivateWorkflowButton, { className: "w-full justify-start" }),
26545
+ /* @__PURE__ */ jsx(RunWithViewRuns, {
26546
+ onViewRuns: handleViewRuns,
26547
+ canViewRuns: !!id,
26548
+ className: "w-full",
26549
+ runButtonClassName: "flex-1 justify-start rounded-l-lg"
26550
+ })
26551
+ ] })
26552
+ ] });
26313
26553
  }
26314
26554
  function BuilderHeader() {
26315
26555
  const name = useFlowStore((s) => s.workflow.name);
26556
+ useBuilderFullscreenController();
26316
26557
  return /* @__PURE__ */ jsx(BuilderHeaderLayout, {
26317
26558
  identity: (tier) => /* @__PURE__ */ jsx(HeaderIdentity, { tier }),
26318
26559
  actions: (tier) => name === "" ? null : /* @__PURE__ */ jsx(HeaderActions, { tier })
@@ -26600,8 +26841,8 @@ function EditLeaseBanner() {
26600
26841
  }
26601
26842
 
26602
26843
  // src/builder/components/flow-builder/flow-builder.tsx
26603
- const LazyNodeDetailView = lazy(() => import("./node-detail-view-BeCa5NkB.js").then((m) => ({ default: m.NodeDetailView })));
26604
- const LazyQuickConfigPanel = lazy(() => import("./quick-config-panel-A8_WcO2r.js").then((m) => ({ default: m.QuickConfigPanel })));
26844
+ const LazyNodeDetailView = lazy(() => import("./node-detail-view-DlbE4ob6.js").then((m) => ({ default: m.NodeDetailView })));
26845
+ const LazyQuickConfigPanel = lazy(() => import("./quick-config-panel-DxNYFw66.js").then((m) => ({ default: m.QuickConfigPanel })));
26605
26846
  const edgeTypes = { deletable: CustomDeletableEdge };
26606
26847
  const edgeOptions = {
26607
26848
  type: "deletable",
@@ -26661,7 +26902,7 @@ const FlowBuilder = ({ readOnly = false }) => {
26661
26902
  const [agentTools, setAgentTools] = useState([]);
26662
26903
  useEffect(() => {
26663
26904
  let cancelled = false;
26664
- import("./agentTools-DwvW-jXU.js").then(({ createBuilderAgentTools }) => {
26905
+ import("./agentTools-dDrEjdbB.js").then(({ createBuilderAgentTools }) => {
26665
26906
  if (cancelled) return;
26666
26907
  setAgentTools(createBuilderAgentTools({ durableFunctionsEnabled: () => paletteGatesRef.current }));
26667
26908
  }).catch((error) => {
@@ -27001,4 +27242,4 @@ const FlowBuilderPage = ({ workflow, readOnly = false }) => {
27001
27242
  ] });
27002
27243
  };
27003
27244
 
27004
- export { ConnectionFormDialog as $, DialogTitle$1 as A, RunnerStatusPill as B, DialogClose as C, DialogHeader$1 as D, DialogFooter$1 as E, useInstalledNodes as F, NodeParamsForm as G, runnerInstallCommand as H, NodeExecutionActions as I, Popover$1 as J, useGlobalStoreClient as K, NodeEditorTabBody as L, computeAttachPosition as M, useWorkflowTemplates as N, DialogOverlay as O, useInstallNode as P, ConnectionSelector as Q, NodeSettingsPanel as R, Dialog$1 as S, isRunControlNodeType as St, DialogDescription$1 as T, useRunnerActions as U, RUNNER_INSTALL_SCRIPT_URL as V, useRunners as W, PopoverTrigger$1 as X, PopoverContent$1 as Y, CodeEditorField as Z, buildRequiredNodeTypes as _, RUN_CONTROL_NODE_TYPES as _t, useAiWorkflowTemplates as a, TabButton as at, Badge$1 as b, isDurableFunctionNodeType as bt, useRunsQuota as c, FluidGridsMark as ct, summarizeRunsQuota as d, CardDescription$1 as dt, ReadOnlyFieldset as et, releaseLeaseKeptForReload as f, CardFooter as ft, buildNodeCheck as g, DURABLE_FUNCTION_NODE_TYPES as gt, TableView as h, Input$1 as ht, enrichDraftNodes as i, NodeEditorTabs as it, DialogTrigger$1 as j, DialogPortal as k, readRunsQuota as l, Card$1 as lt, JsonView as m, CardTitle$1 as mt, AI_DRAFT_MAX_PROMPT_LENGTH as n, SCHEDULE_NODE_TYPE as nt, RunsUsageMeter as o, NodeInputFields as ot, useWorkflowReloadStore as p, CardHeader$1 as pt, NDV_Z_INDEX as q, draftToCanvas as r, SchedulePanel as rt, RunsUsageMeterView as s, useNodeSelectedEvent as st, FlowBuilderPage as t, useNodeEditorTab as tt, runsQuotaLevel as u, CardContent$1 as ut, TemplateCard as v, WORKFLOW_TEST_NODE_TYPES as vt, DialogContent$1 as w, badgeVariants as x, isNodeTypeHiddenFromPalette as xt, templatePreview as y, filterPaletteNodes as yt, RunOnSection as z };
27245
+ export { CodeEditorField as $, DialogOverlay as A, NodeSettingsPanel as B, badgeVariants as C, isNodeTypeHiddenFromPalette as Ct, DialogDescription$1 as D, DialogContent$1 as E, useWorkflowTemplates as F, useRunnerActions as G, RunnerStatusPill as H, useInstallNode as I, useGlobalStoreClient as J, useRunners as K, useInstalledNodes as L, DialogTitle$1 as M, DialogTrigger$1 as N, DialogFooter$1 as O, computeAttachPosition as P, PopoverTrigger$1 as Q, NodeExecutionActions as R, Badge$1 as S, isDurableFunctionNodeType as St, DialogClose as T, RUNNER_INSTALL_SCRIPT_URL as U, RunOnSection as V, runnerInstallCommand as W, Popover$1 as X, NDV_Z_INDEX as Y, PopoverContent$1 as Z, TableView as _, Input$1 as _t, useAiWorkflowTemplates as a, SchedulePanel as at, TemplateCard as b, WORKFLOW_TEST_NODE_TYPES as bt, RunsUsageMeter as c, NodeInputFields as ct, readRunsQuota as d, Card$1 as dt, ConnectionSelector as et, runsQuotaLevel as f, CardContent$1 as ft, JsonView as g, CardTitle$1 as gt, useWorkflowReloadStore as h, CardHeader$1 as ht, enrichDraftNodes as i, SCHEDULE_NODE_TYPE as it, DialogPortal as j, DialogHeader$1 as k, RunsUsageMeterView as l, useNodeSelectedEvent as lt, releaseLeaseKeptForReload as m, CardFooter as mt, AI_DRAFT_MAX_PROMPT_LENGTH as n, ReadOnlyFieldset as nt, BUILDER_FULLSCREEN_ATTRIBUTE as o, NodeEditorTabs as ot, summarizeRunsQuota as p, CardDescription$1 as pt, NodeParamsForm as q, draftToCanvas as r, useNodeEditorTab as rt, BUILDER_FULLSCREEN_EVENT as s, TabButton as st, FlowBuilderPage as t, ConnectionFormDialog as tt, useRunsQuota as u, FluidGridsMark as ut, buildNodeCheck as v, DURABLE_FUNCTION_NODE_TYPES as vt, Dialog$1 as w, isRunControlNodeType as wt, templatePreview as x, filterPaletteNodes as xt, buildRequiredNodeTypes as y, RUN_CONTROL_NODE_TYPES as yt, NodeEditorTabBody as z };
package/dist/history.js CHANGED
@@ -1,4 +1,4 @@
1
1
  "use client";
2
- import { t as HistoryPage } from "./HistoryPage-DzNRgeBL.js";
2
+ import { t as HistoryPage } from "./HistoryPage-DFiyqbvw.js";
3
3
 
4
4
  export { HistoryPage };
@@ -2,7 +2,7 @@
2
2
  import { ReactNode } from "react";
3
3
  import { ApolloClient } from "@apollo/client/core";
4
4
  import { Connection, Edge, EdgeChange, Node, NodeChange } from "@xyflow/react";
5
- declare const FLUIDGRIDS_EVENTS_VERSION = "1.0.0";
5
+ declare const FLUIDGRIDS_EVENTS_VERSION = "1.1.0";
6
6
  type FluidGridsErrorSource = "workflow:save" | "workflow:activate" | "run:start";
7
7
  interface FluidGridsEventMap {
8
8
  "workflow:saved": {
@@ -36,6 +36,9 @@ interface FluidGridsEventMap {
36
36
  "auth:failed": {
37
37
  message: string;
38
38
  };
39
+ "builder:fullscreen": {
40
+ active: boolean;
41
+ };
39
42
  }
40
43
  type FluidGridsEventName = keyof FluidGridsEventMap;
41
44
  type FluidGridsEventPayload<K extends FluidGridsEventName> = FluidGridsEventMap[K];