@burdenoff/fluidgrids-fe-sdk 2026.1111.20 → 2026.1111.22

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 (65) hide show
  1. package/README.md +13 -0
  2. package/dist/{AiStudioPage-CmjZwaoy.js → AiStudioPage-DIfF4LhQ.js} +5 -5
  3. package/dist/{DataSinkDashboardPage-auvILMSt.js → DataSinkDashboardPage-DDvNPS8Z.js} +1 -1
  4. package/dist/{DataTablesPage-BZy2z0LB.js → DataTablesPage-BpnF13UT.js} +9 -1
  5. package/dist/{ExecutionDetailPage-C0q5brcQ.js → ExecutionDetailPage-DYLWtHRG.js} +60 -13
  6. package/dist/{ExecutionsListPage-Dcc6wi-8.js → ExecutionsListPage-D63aCXJH.js} +4 -4
  7. package/dist/{FluidGridsProvider-CRGXDZX1.js → FluidGridsProvider-CWyQ8ziM.js} +364 -98
  8. package/dist/{HistoryPage-B5Np7Dd_.js → HistoryPage-CNXgUMb0.js} +1 -1
  9. package/dist/{InsightsPage-CQ8sB4d6.js → InsightsPage-Duo83yAM.js} +1 -1
  10. package/dist/{MissingNodesInstallModal-Dm1m3Ysp.js → MissingNodesInstallModal-Q3RYBvS8.js} +1 -1
  11. package/dist/{QuotaExhaustedDialog-DYCpMOyQ.js → QuotaExhaustedDialog-ChBoJnRo.js} +3 -2
  12. package/dist/{SettingsPage-BNJV7nwG.js → SettingsPage-DI_vIG7t.js} +2 -2
  13. package/dist/{TemplateCard-BuP6_QX8.js → TemplateCard-6W2q2wiK.js} +4 -3
  14. package/dist/{TemplateConfigurationModal--YswnkOD.js → TemplateConfigurationModal-qNQGP7cm.js} +1 -1
  15. package/dist/{TemplateDetailPanel-CtUjihCQ.js → TemplateDetailPanel-CQvYqhVO.js} +1 -1
  16. package/dist/{TemplatePreview-TH3zVEtT.js → TemplatePreview-t3251W_n.js} +4 -4
  17. package/dist/{TemplatesPage-BDiIswSv.js → TemplatesPage-Bvg6R2P9.js} +6 -5
  18. package/dist/{WorkflowBuilder-KypUzhmK.js → WorkflowBuilder-C-hgvww2.js} +3 -3
  19. package/dist/{WorkflowBuilder-DnTqzYD5.js → WorkflowBuilder-DdvSGsxr.js} +8 -8
  20. package/dist/{WorkflowSearchRedirect-DAA2K0Md.js → WorkflowSearchRedirect-33Vs4FKc.js} +1 -1
  21. package/dist/{WorkflowsList-BWdu8wj0.js → WorkflowsList-C3bHLpSv.js} +147 -22
  22. package/dist/agent-tools.js +1 -1
  23. package/dist/{agentTools-VQXDvw4O.js → agentTools-BjhxAdlt.js} +3 -4
  24. package/dist/askAboutBridge-BV8m95kk.js +65 -0
  25. package/dist/assistant.d.ts +30 -1
  26. package/dist/assistant.js +2 -1
  27. package/dist/{canvasNoteTools-CCQtxq7U.js → canvasNoteTools-CZEFFhRp.js} +2 -2
  28. package/dist/{code-editor-field-4j1LiULY.js → code-editor-field-CfP0QYUD.js} +1 -1
  29. package/dist/executions.js +2 -2
  30. package/dist/{flow-builder-KbM4vIW8.js → flow-builder-CE8cNXNi.js} +16 -73
  31. package/dist/fluidgridsEvents-Dm5CaHtr.js +162 -0
  32. package/dist/history.js +1 -1
  33. package/dist/{index-6JR2vD9J.d.ts → index-7eJQwsNS.d.ts} +3 -19
  34. package/dist/index.d.ts +2 -1
  35. package/dist/index.js +29 -27
  36. package/dist/{node-detail-view-CeOkSF2C.js → node-detail-view-BoR0vYZ3.js} +5 -5
  37. package/dist/{node-editor-tab-body-CN89wDV7.js → node-editor-tab-body-DxMbKspp.js} +2 -2
  38. package/dist/observability.d.ts +1 -1
  39. package/dist/observability.js +2 -2
  40. package/dist/{popover-CxKbvYSJ.js → popover-B1aKz7DC.js} +1 -1
  41. package/dist/{quick-config-panel-wfP0s4QO.js → quick-config-panel-DXvLJdeW.js} +3 -3
  42. package/dist/quota-Cdt8yz7N.js +152 -0
  43. package/dist/quota.d.ts +3 -0
  44. package/dist/quota.js +4 -0
  45. package/dist/runsQuota-DsniKiSg.d.ts +20 -0
  46. package/dist/runsQuota-DvXR6mRN.js +100 -0
  47. package/dist/{schedule-panel-2HgyHvO8.js → schedule-panel-CY6S4JMd.js} +5 -5
  48. package/dist/settings.js +1 -1
  49. package/dist/{sidebar-node-editor-DLOVQATw.js → sidebar-node-editor-FU3fvOjh.js} +3 -3
  50. package/dist/templates.js +2 -2
  51. package/dist/{uiMarkTools-nlmzsHQM.js → uiMarkTools-DZ6akjQK.js} +1 -1
  52. package/dist/useActionParam-B0ebTZmg.js +83 -0
  53. package/dist/{useDurableParity-CJvnfF3T.js → useDurableParity-BApRraSO.js} +1 -1
  54. package/dist/{useExecutions-CyXkJtpk.js → useExecutions-C2a4EcvC.js} +2 -2
  55. package/dist/{useObservability-QZjFuXnI.js → useObservability-BmbeK5bG.js} +2 -2
  56. package/dist/{useRunHistory-D4gaa81A.js → useRunHistory-CqfDFRzr.js} +1 -1
  57. package/dist/{useWorkflowCodeExport-BNGq3BJ9.js → useWorkflowCodeExport-DebpM48M.js} +1 -1
  58. package/dist/{useWorkflows-XsfD7JA-.js → useWorkflows-D1-rYzGK.js} +2 -2
  59. package/dist/workflow-builder.js +4 -4
  60. package/dist/workflow-pages.d.ts +1 -1
  61. package/dist/workflow-pages.js +14 -14
  62. package/dist/workflows-list.d.ts +6 -0
  63. package/dist/workflows-list.js +3 -2
  64. package/package.json +5 -1
  65. package/dist/fluidgridsEvents-CNdcrUNN.js +0 -310
@@ -1,22 +1,24 @@
1
1
  "use client";
2
2
  import { 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, 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 { $t as inAppLeaveTarget, At as useSaveStatusStore, B as useRunGuard, Bt as shouldReleaseForIdle, Ct as useSaveWorkflow, D as InstallWorkflowNodeDocument, E as InstallPurchasedNodeDocument, F as getNodeMetadata, Fn as useMarkdownRenderer, Ft as leaseCallQueue, Gt as sessionBeforeReload, Ht as EDIT_SESSION_ID, I as buildOperationSeed, In as BuilderReadOnlyProvider, It as leaseCallSequence, Jt as AUTOSAVE_DEBOUNCE_MS, Kt as rememberOwnStatusChange, Ln as useBuilderReadOnly, Lt as phaseAfterAcquire, M as UninstallOrganizationPrivateNodeDocument, Mn as getNodeDetail, Mt as useEditLeaseStore, N as UninstallWorkflowNodeDocument, Nn as buildStickyNode, Nt as bannerOf, Ot as refusalOfQuota, Pn as loadMarkdown, Pt as isLocked, R as useInsertNode, Rt as phaseAfterTakeOver, S as CreateStoreOrderDocument, St as useFlowValidator, T as InstallOrganizationPrivateNodeDocument, Ut as forgetSessionForReload, V as workflowParameterIssues, Vt as tickAction, Wt as rememberSessionForReload, Xt as canAutosave, Yt as AUTOSAVE_RETRY_DELAYS_MS, _t as leavingLosesChanges, a as NODES_METADATA, b as BrowseWorkflowNodesDocument, bt as watchLeavingLosesChanges, dt as useGuardedNavigate, en as resettledBaseline, f as isNodeConfigsInitialized, ft as useManualSave, g as registerWorkflowNodeTypes, gn as useNodeRegistryRevision, gt as editingLeaseLocked, hn as useCanvasEdges, ht as editStateFor, i as AVAILABLE_NODES, jt as useEditLeaseLocked, k as OrganizationPrivateNodesDocument, kt as saveIndicatorOf, l as ensureNodeConfigsLoaded, m as refetchStoreNodes, mt as departingSave, nn as workflowFingerprint, o as NODE_CONFIGS, p as onNodeTypesUpdate, pt as autosaveAllowedFor, qt as rememberRevision, rn as useNodeExecution, s as NODE_TYPES, t as FluidGridsContext, tn as saveFailureActionOf, v as scheduleNodePaletteLoad, vn as loadDefinitionJson, vt as savedEverythingBeforeLeaving, w as GetNodeInstallableVersionsDocument, xt as isFlowComplete, yt as touchesSavedFields, z as MissingParametersDialog, zt as releasesOnClose } from "./FluidGridsProvider-CRGXDZX1.js";
3
+ import { $t as canAutosave, Bn as useBuilderReadOnly, Bt as phaseAfterAcquire, Ct as watchLeavingLosesChanges, D as InstallWorkflowNodeDocument, E as InstallPurchasedNodeDocument, Et as useSaveWorkflow, F as getNodeMetadata, Fn as getNodeDetail, Ft as useEditLeaseStore, Gt as EDIT_SESSION_ID, H as MissingParametersDialog, Ht as releasesOnClose, In as buildStickyNode, It as bannerOf, Jt as sessionBeforeReload, Kt as forgetSessionForReload, Ln as loadMarkdown, Lt as isLocked, M as UninstallOrganizationPrivateNodeDocument, Mt as saveIndicatorOf, N as UninstallWorkflowNodeDocument, Nt as useSaveStatusStore, Pt as useEditLeaseLocked, Qt as AUTOSAVE_RETRY_DELAYS_MS, Rn as useMarkdownRenderer, Rt as leaseCallQueue, S as CreateStoreOrderDocument, St as touchesSavedFields, T as InstallOrganizationPrivateNodeDocument, Tt as useFlowValidator, U as useRunGuard, Ut as shouldReleaseForIdle, V as useInsertNode, Vt as phaseAfterTakeOver, W as workflowParameterIssues, Wt as tickAction, Xt as rememberRevision, Yt as rememberOwnStatusChange, Zt as AUTOSAVE_DEBOUNCE_MS, _t as departingSave, a as NODES_METADATA, an as workflowFingerprint, b as BrowseWorkflowNodesDocument, bt as leavingLosesChanges, f as isNodeConfigsInitialized, g as registerWorkflowNodeTypes, gt as autosaveAllowedFor, ht as useManualSave, i as AVAILABLE_NODES, in as saveFailureActionOf, jt as refusalOfQuota, k as OrganizationPrivateNodesDocument, l as ensureNodeConfigsLoaded, m as refetchStoreNodes, mt as useGuardedNavigate, nn as inAppLeaveTarget, o as NODE_CONFIGS, on as useNodeExecution, p as onNodeTypesUpdate, qt as rememberSessionForReload, rn as resettledBaseline, s as NODE_TYPES, t as FluidGridsContext, v as scheduleNodePaletteLoad, vn as useCanvasEdges, vt as editStateFor, w as GetNodeInstallableVersionsDocument, wt as isFlowComplete, xn as loadDefinitionJson, xt as savedEverythingBeforeLeaving, yn as useNodeRegistryRevision, yt as editingLeaseLocked, z as buildOperationSeed, zn as BuilderReadOnlyProvider, zt as leaseCallSequence } from "./FluidGridsProvider-CWyQ8ziM.js";
4
4
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
5
5
  import { n as preloadableLazy } from "./preloadable-lazy-Pp47mqQ9.js";
6
6
  import { a as DialogFooter$1, d as Input$1, i as DialogDescription$1, l as DialogTitle$1, o as DialogHeader$1, r as DialogContent$1, t as Dialog$1 } from "./dialog-Cjb4lB4D.js";
7
- import { _ as storeNodeInstallVersion, a as useTemplateImportFlow, d as filterStoreNodesForPalette, f as getStoreNodeAvailability, g as storeNodeDisplayVersion, h as isStoreNodeUpdateAvailable, k as filterPaletteNodes, m as getStoreNodeType, p as getStoreNodeIcon, t as TemplateCard, u as useWorkflowTemplates, v as useInstalledNodes, y as useGlobalStoreClient } from "./TemplateCard-BuP6_QX8.js";
7
+ import { _ as storeNodeInstallVersion, a as useTemplateImportFlow, d as filterStoreNodesForPalette, f as getStoreNodeAvailability, g as storeNodeDisplayVersion, h as isStoreNodeUpdateAvailable, k as filterPaletteNodes, m as getStoreNodeType, p as getStoreNodeIcon, t as TemplateCard, u as useWorkflowTemplates, v as useInstalledNodes, y as useGlobalStoreClient } from "./TemplateCard-6W2q2wiK.js";
8
8
  import { _ as throwIfResultError, d as emitFluidGridsEvent, m as describeOperationError, n as getFluidGridsClient, s as waitForFluidGridsClient, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
9
9
  import { c as useDurableParityEnabled, d as usePaletteGates, l as useFluidGridsFlag, m as useWorkflowTestsEnabled, s as useDurableFunctionNodesEnabled, t as FLUIDGRIDS_FLAGS } from "./feature-flags-DM5myWaD.js";
10
10
  import { t as Button$2 } from "./button-DG7y_FVJ.js";
11
11
  import { t as PublishCustomNodeAction } from "./PublishCustomNodeAction-5XXnSA3H.js";
12
- import { f as BILLING_PLANS_PATH, m as RUNS_QUOTA_NAME, o as emitUpgradeClicked, t as emitNodeInstalled } from "./fluidgridsEvents-CNdcrUNN.js";
13
- import { An as SetWorkflowRolloutDocument, Ar as WorkflowEditLeaseDocument, Bn as TakeOverWorkflowEditLeaseDocument, Er as WorkflowDefinitionDocument, Fr as WorkflowGenerationTemplatesDocument, Gt as PushWorkflowToGitDocument, Ir as WorkflowGitCommitsDocument, Jt as RejectWorkflowPromotionDocument, Lr as WorkflowGitDiffDocument, Mr as WorkflowEnvironmentsDocument, Nt as NodeUsageStatusDocument, Rr as WorkflowGitPushesDocument, St as LinkWorkflowGitRepositoryDocument, Ti as WorkspaceRunsQuotaDocument, Ur as WorkflowPromotionRequestsDocument, X as DeployWorkflowVersionToDevDocument, Xt as ReleaseWorkflowEditLeaseDocument, Yn as UnlinkWorkflowGitRepositoryDocument, Zt as RemoveNodeFromWorkflowsDocument, an as RestoreWorkflowFromGitDocument, b as CancelWorkflowPromotionDocument, bi as WorkflowVersionDrainageDocument, jt as NodeSchemaIntrospectionDocument, l as ApproveWorkflowPromotionDocument, q as DeleteWorkflowRolloutDocument, r as ActivateWorkflowVersionCheckedDocument, sr as UpdateWorkflowEnvironmentPolicyDocument, t as AcquireWorkflowEditLeaseDocument, tn as RequestWorkflowPromotionDocument, vr as WorkflowAuthoringDocument, xi as WorkflowVersioningDocument, zr as WorkflowGitRepositoryDocument } from "./graphql-operation-types-kX-MMjgW.js";
12
+ import { o as emitUpgradeClicked, t as emitNodeInstalled } from "./fluidgridsEvents-Dm5CaHtr.js";
13
+ import { An as SetWorkflowRolloutDocument, Ar as WorkflowEditLeaseDocument, Bn as TakeOverWorkflowEditLeaseDocument, Er as WorkflowDefinitionDocument, Fr as WorkflowGenerationTemplatesDocument, Gt as PushWorkflowToGitDocument, Ir as WorkflowGitCommitsDocument, Jt as RejectWorkflowPromotionDocument, Lr as WorkflowGitDiffDocument, Mr as WorkflowEnvironmentsDocument, Nt as NodeUsageStatusDocument, Rr as WorkflowGitPushesDocument, St as LinkWorkflowGitRepositoryDocument, Ur as WorkflowPromotionRequestsDocument, X as DeployWorkflowVersionToDevDocument, Xt as ReleaseWorkflowEditLeaseDocument, Yn as UnlinkWorkflowGitRepositoryDocument, Zt as RemoveNodeFromWorkflowsDocument, an as RestoreWorkflowFromGitDocument, b as CancelWorkflowPromotionDocument, bi as WorkflowVersionDrainageDocument, jt as NodeSchemaIntrospectionDocument, l as ApproveWorkflowPromotionDocument, q as DeleteWorkflowRolloutDocument, r as ActivateWorkflowVersionCheckedDocument, sr as UpdateWorkflowEnvironmentPolicyDocument, t as AcquireWorkflowEditLeaseDocument, tn as RequestWorkflowPromotionDocument, vr as WorkflowAuthoringDocument, xi as WorkflowVersioningDocument, zr as WorkflowGitRepositoryDocument } from "./graphql-operation-types-kX-MMjgW.js";
14
14
  import { n as useAgentMarksStore } from "./marksStore-DGCXjTmZ.js";
15
- import { T as CreateWorkflowRefusalDialog, _ as lineOfNode, f as fileBaseName, g as isLossyFidelityItem, h as isLosslessReport, r as useWorkflowCodeExport, t as downloadWorkflowCodeExport, v as orderedExportFiles, x as sortFidelityItems } from "./useWorkflowCodeExport-BNGq3BJ9.js";
15
+ import { T as CreateWorkflowRefusalDialog, _ as lineOfNode, f as fileBaseName, g as isLossyFidelityItem, h as isLosslessReport, r as useWorkflowCodeExport, t as downloadWorkflowCodeExport, v as orderedExportFiles, x as sortFidelityItems } from "./useWorkflowCodeExport-DebpM48M.js";
16
+ import { r as RUNS_QUOTA_NAME, t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
16
17
  import { t as EntityTagPicker } from "./EntityTagPicker-BqRNsLCQ.js";
17
18
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
19
+ import { n as runsQuotaLevel, t as readRunsQuota } from "./runsQuota-DvXR6mRN.js";
18
20
  import { a as SdkPermissionGate, i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
19
- import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-XsfD7JA-.js";
21
+ import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-D1-rYzGK.js";
20
22
  import { n as VersionLifecycleBar, r as countLifecycle, t as VersionDiffDialog } from "./VersionDiffDialog-DSN0mU0f.js";
21
23
  import { CF as WorkflowExportFormat, Eo as CodeReplaceStatus, QF as WorkflowTestExpectedStatus, SF as WorkflowEnvironment, xu as DrainageStatus, yP as VersioningBehavior } from "./graphql-types-CDKVWH2R.js";
22
24
  import { n as useConnections } from "./useConnections-Cs7LCWEM.js";
@@ -258,9 +260,9 @@ function IntroductionPropertyPanel() {
258
260
  * waiting for its chunk and React's Suspense throttle (about 0.5 s on first
259
261
  * open even with the chunk cached).
260
262
  */
261
- const NodeDetailViewOverlay = preloadableLazy(() => import("./node-detail-view-CeOkSF2C.js").then((m) => m.NodeDetailView), "NodeDetailView");
262
- const QuickConfigPanelOverlay = preloadableLazy(() => import("./quick-config-panel-wfP0s4QO.js").then((m) => m.QuickConfigPanel), "QuickConfigPanel");
263
- const SidebarNodeEditorOverlay = preloadableLazy(() => import("./sidebar-node-editor-DLOVQATw.js").then((m) => m.SidebarNodeEditor), "SidebarNodeEditor");
263
+ const NodeDetailViewOverlay = preloadableLazy(() => import("./node-detail-view-BoR0vYZ3.js").then((m) => m.NodeDetailView), "NodeDetailView");
264
+ const QuickConfigPanelOverlay = preloadableLazy(() => import("./quick-config-panel-DXvLJdeW.js").then((m) => m.QuickConfigPanel), "QuickConfigPanel");
265
+ const SidebarNodeEditorOverlay = preloadableLazy(() => import("./sidebar-node-editor-FU3fvOjh.js").then((m) => m.SidebarNodeEditor), "SidebarNodeEditor");
264
266
  const WorkflowShareDialogOverlay = preloadableLazy(() => import("./WorkflowShareDialog-mbIwRQUY.js").then((n) => n.n).then((m) => m.WorkflowShareDialog), "WorkflowShareDialog");
265
267
  const ConnectionFormDialogOverlay = preloadableLazy(() => import("./ConnectionFormDialog-Bg9_OdHX.js").then((n) => n.n).then((m) => m.ConnectionFormDialog), "ConnectionFormDialog");
266
268
  /**
@@ -2622,7 +2624,7 @@ function TemplatesGrid({ templates, loading, hasMore, onLoadMore, onTemplateClic
2622
2624
  }
2623
2625
 
2624
2626
  // src/builder/components/flow-builder/components/templates/TemplatesModal.tsx
2625
- const LazyTemplateDetailPanel = lazy(() => import("./TemplateDetailPanel-CtUjihCQ.js").then((m) => ({ default: m.TemplateDetailPanel })));
2627
+ const LazyTemplateDetailPanel = lazy(() => import("./TemplateDetailPanel-CQvYqhVO.js").then((m) => ({ default: m.TemplateDetailPanel })));
2626
2628
  /**
2627
2629
  * Modal for browsing and selecting workflow templates
2628
2630
  * Features:
@@ -11798,65 +11800,6 @@ function BuilderSaveController({ readOnly, locked = false }) {
11798
11800
  ] });
11799
11801
  }
11800
11802
 
11801
- // src/billing/runsQuota.ts
11802
- /** Mirrors wspace-activity-svc `MAX_ASSIGNMENTS_PER_QUOTA`. */
11803
- const MAX_ASSIGNMENTS_PER_QUOTA = 100;
11804
- /** Share of the allowance at which the meter warns and offers an upgrade. */
11805
- const RUNS_QUOTA_WARNING_RATIO = .8;
11806
- const createdAtMs = (row) => {
11807
- const ms = Date.parse(row.createdAt);
11808
- return Number.isNaN(ms) ? Number.POSITIVE_INFINITY : ms;
11809
- };
11810
- /**
11811
- * Aggregates the workspace's active `fluidgrids.runs.monthly` assignments.
11812
- * Null when there is none: the quota is not provisioned, nothing to meter.
11813
- */
11814
- function summarizeRunsQuota(rows, quotaName = RUNS_QUOTA_NAME) {
11815
- const assignments = rows.filter((row) => row.isActive && row.quotaName === quotaName).sort((a, b) => createdAtMs(a) - createdAtMs(b)).slice(0, 100);
11816
- if (assignments.length === 0) return null;
11817
- const used = assignments.reduce((sum, row) => sum + row.used, 0);
11818
- if (assignments.some((row) => row.noLimit || row.limit == null)) return {
11819
- used,
11820
- limit: null,
11821
- noLimit: true
11822
- };
11823
- return {
11824
- used,
11825
- limit: assignments.reduce((sum, row) => sum + (row.limit ?? 0), 0),
11826
- noLimit: false
11827
- };
11828
- }
11829
- /** Where the workspace stands against its allowance. */
11830
- function runsQuotaLevel(quota) {
11831
- if (quota.noLimit || quota.limit === null) return "ok";
11832
- if (quota.limit <= 0 || quota.used >= quota.limit) return "exhausted";
11833
- return quota.used / quota.limit >= .8 ? "warning" : "ok";
11834
- }
11835
- /**
11836
- * One read of the workspace's run allowance.
11837
- *
11838
- * Null — the meter hides — when there is no workspace, when the read errors
11839
- * (FORBIDDEN, a gateway 500, a network failure) or when the quota is not
11840
- * provisioned. A failed read must never render a number: "0 used" would read
11841
- * as "nothing spent" when the truth is "unknown".
11842
- */
11843
- async function readRunsQuota(client, workspaceId) {
11844
- if (!workspaceId) return null;
11845
- try {
11846
- const result = await client.query({
11847
- query: WorkspaceRunsQuotaDocument,
11848
- variables: { workspaceId },
11849
- fetchPolicy: "network-only",
11850
- errorPolicy: "all"
11851
- });
11852
- if (result.error) return null;
11853
- const rows = result.data?.workspaceQuotaAssignments;
11854
- return rows ? summarizeRunsQuota(rows) : null;
11855
- } catch {
11856
- return null;
11857
- }
11858
- }
11859
-
11860
11803
  // src/billing/RunsUsageMeter.tsx
11861
11804
  /**
11862
11805
  * Compact run-allowance meter for the builder header: "Runs 812 / 1,000" with
@@ -16552,7 +16495,7 @@ function FidelityReportList({ fidelity, source, hasNode, onShowNode }) {
16552
16495
  * Behind the `fluidgrids.code-first` flag (default off); with the flag off
16553
16496
  * the panel renders nothing and the header is exactly as before.
16554
16497
  */
16555
- const LazyCodeEditorField = lazy(() => import("./code-editor-field-4j1LiULY.js").then((n) => n.n).then((m) => ({ default: m.CodeEditorField })));
16498
+ const LazyCodeEditorField = lazy(() => import("./code-editor-field-CfP0QYUD.js").then((n) => n.n).then((m) => ({ default: m.CodeEditorField })));
16556
16499
  /** Read-only lifted-code editor with a sized placeholder while its chunk loads. */
16557
16500
  function CodeViewEditor({ content, path, label }) {
16558
16501
  return /* @__PURE__ */ jsx(Suspense, {
@@ -17500,7 +17443,7 @@ const FlowBuilder = ({ readOnly = false }) => {
17500
17443
  paletteGatesRef.current = paletteGates;
17501
17444
  }, [paletteGates]);
17502
17445
  useWarmBuilderOverlays();
17503
- useLazyAgentTools(() => import("./agentTools-VQXDvw4O.js").then(({ createBuilderAgentTools }) => createBuilderAgentTools({ durableFunctionsEnabled: () => paletteGatesRef.current })), !editingBlocked, "Agent tools");
17446
+ useLazyAgentTools(() => import("./agentTools-BjhxAdlt.js").then(({ createBuilderAgentTools }) => createBuilderAgentTools({ durableFunctionsEnabled: () => paletteGatesRef.current })), !editingBlocked, "Agent tools");
17504
17447
  const [nodes, edges, onNodesChange, onEdgesChange, onConnect] = useFlowStore(useShallow((s) => {
17505
17448
  return [
17506
17449
  s.workflow.nodes,
@@ -17542,7 +17485,7 @@ const FlowBuilder = ({ readOnly = false }) => {
17542
17485
  useEffect(() => {
17543
17486
  fitViewRef.current = fitView;
17544
17487
  }, [fitView]);
17545
- useLazyAgentTools(() => import("./canvasNoteTools-CCQtxq7U.js").then(({ createCanvasNoteTools }) => createCanvasNoteTools({ focusNode: (nodeId) => fitViewRef.current({
17488
+ useLazyAgentTools(() => import("./canvasNoteTools-CZEFFhRp.js").then(({ createCanvasNoteTools }) => createCanvasNoteTools({ focusNode: (nodeId) => fitViewRef.current({
17546
17489
  nodes: [{ id: nodeId }],
17547
17490
  duration: 400,
17548
17491
  padding: .6,
@@ -17840,4 +17783,4 @@ const FlowBuilderPage = ({ workflow, readOnly = false }) => {
17840
17783
  ] });
17841
17784
  };
17842
17785
 
17843
- export { JsonView as _, useAiWorkflowTemplates as a, useNodeSelectedEvent as b, RunsUsageMeter as c, readRunsQuota as d, runsQuotaLevel as f, notesKeyOf as g, useWorkflowReloadStore as h, enrichDraftNodes as i, RunsUsageMeterView as l, releaseLeaseKeptForReload as m, AI_DRAFT_MAX_PROMPT_LENGTH as n, BUILDER_FULLSCREEN_ATTRIBUTE as o, summarizeRunsQuota as p, draftToCanvas as r, BUILDER_FULLSCREEN_EVENT as s, FlowBuilderPage as t, useRunsQuota as u, TableView as v, FluidGridsMark as x, computeAttachPosition as y };
17786
+ export { useNodeSelectedEvent as _, useAiWorkflowTemplates as a, RunsUsageMeter as c, releaseLeaseKeptForReload as d, useWorkflowReloadStore as f, computeAttachPosition as g, TableView as h, enrichDraftNodes as i, RunsUsageMeterView as l, JsonView as m, AI_DRAFT_MAX_PROMPT_LENGTH as n, BUILDER_FULLSCREEN_ATTRIBUTE as o, notesKeyOf as p, draftToCanvas as r, BUILDER_FULLSCREEN_EVENT as s, FlowBuilderPage as t, useRunsQuota as u, FluidGridsMark as v };
@@ -0,0 +1,162 @@
1
+ "use client";
2
+ import { i as WORKFLOWS_QUOTA_NAME, r as RUNS_QUOTA_NAME } from "./quota-Cdt8yz7N.js";
3
+
4
+ // src/analytics/fluidgridsEvents.ts
5
+ /** `component` stamped on every event so devtools/OTel can tell the emitter. */
6
+ const FLUIDGRIDS_ANALYTICS_COMPONENT = "fluidgrids-fe-sdk";
7
+ /** Upper bound for a slug-like dimension; anything longer is not a slug. */
8
+ const MAX_DIMENSION_LENGTH = 64;
9
+ const SLUG_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_./:-]*$/;
10
+ /**
11
+ * Keep a dimension only when it is a short slug (`integration/slack`,
12
+ * `trigger_webhook`, `marketing`). Anything else — spaces, free text, a very
13
+ * long value — is dropped rather than risk sending user data.
14
+ */
15
+ function toDimension(value) {
16
+ if (typeof value !== "string") return void 0;
17
+ const trimmed = value.trim();
18
+ if (!trimmed || trimmed.length > MAX_DIMENSION_LENGTH) return void 0;
19
+ return SLUG_PATTERN.test(trimmed) ? trimmed : void 0;
20
+ }
21
+ /** Non-empty string id, or undefined. */
22
+ function idOrUndefined(value) {
23
+ return typeof value === "string" && value.length > 0 ? value : void 0;
24
+ }
25
+ /** A finite, non-negative integer count, or undefined. */
26
+ function countOrUndefined(value) {
27
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.round(value) : void 0;
28
+ }
29
+ function emit(bus, name, payload) {
30
+ if (!bus) return;
31
+ const clean = Object.fromEntries(Object.entries(payload).filter(([, value]) => value !== void 0));
32
+ try {
33
+ bus.emit(name, clean, { component: FLUIDGRIDS_ANALYTICS_COMPONENT });
34
+ } catch (error) {
35
+ console.warn(`[fluidgrids analytics] failed to emit ${name}`, error);
36
+ }
37
+ }
38
+ function asRecord(value) {
39
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : null;
40
+ }
41
+ /**
42
+ * The executable node list of a workflow definition, wherever it sits: the
43
+ * flow store's `{ nodes }`, a saved `definitionJson` (`{ data: { nodes } }`) or
44
+ * a raw list.
45
+ */
46
+ function nodesOf(definition) {
47
+ if (Array.isArray(definition)) return definition;
48
+ const record = asRecord(definition);
49
+ if (!record) return [];
50
+ if (Array.isArray(record.nodes)) return record.nodes;
51
+ const data = asRecord(record.data);
52
+ if (data && Array.isArray(data.nodes)) return data.nodes;
53
+ return [];
54
+ }
55
+ function isTriggerNode(node) {
56
+ if ((typeof node.type === "string" ? node.type.toLowerCase() : "").includes("trigger")) return true;
57
+ const data = asRecord(node.data);
58
+ return data?.isTrigger === true || data?.category === "trigger";
59
+ }
60
+ /** Node-type slug of the workflow's trigger node, when it has one. */
61
+ function triggerTypeOf(definition) {
62
+ const trigger = nodesOf(definition).find(isTriggerNode);
63
+ return trigger ? toDimension(trigger.type) : void 0;
64
+ }
65
+ /** Number of executable nodes on the canvas. */
66
+ function nodeCountOf(definition) {
67
+ const nodes = nodesOf(definition);
68
+ return nodes.length > 0 ? nodes.length : void 0;
69
+ }
70
+ /** `fluidgrids.workflow.created` — a new workflow exists in the workspace. */
71
+ function emitWorkflowCreated(bus, fact) {
72
+ emit(bus, "fluidgrids.workflow.created", {
73
+ workspaceId: idOrUndefined(fact.workspaceId),
74
+ workflowId: idOrUndefined(fact.workflowId),
75
+ source: fact.source,
76
+ triggerType: triggerTypeOf(fact.definition),
77
+ nodeCount: nodeCountOf(fact.definition)
78
+ });
79
+ }
80
+ /** `fluidgrids.workflow.published` — a version was activated. */
81
+ function emitWorkflowPublished(bus, fact) {
82
+ emit(bus, "fluidgrids.workflow.published", {
83
+ workspaceId: idOrUndefined(fact.workspaceId),
84
+ workflowId: idOrUndefined(fact.workflowId),
85
+ triggerType: triggerTypeOf(fact.definition),
86
+ nodeCount: nodeCountOf(fact.definition)
87
+ });
88
+ }
89
+ /** `fluidgrids.workflow.run_started` — the backend accepted a run. */
90
+ function emitRunStarted(bus, fact) {
91
+ emit(bus, "fluidgrids.workflow.run_started", {
92
+ workspaceId: idOrUndefined(fact.workspaceId),
93
+ workflowId: idOrUndefined(fact.workflowId),
94
+ executionId: idOrUndefined(fact.executionId),
95
+ trigger: fact.trigger
96
+ });
97
+ }
98
+ /**
99
+ * `fluidgrids.workflow.run_failed` — a run this user started ended FAILED.
100
+ * `errorCode` is the run's machine error classification (`TIMEOUT`,
101
+ * `VALIDATION`, …), never its message.
102
+ */
103
+ function emitRunFailed(bus, fact) {
104
+ emit(bus, "fluidgrids.workflow.run_failed", {
105
+ workspaceId: idOrUndefined(fact.workspaceId),
106
+ workflowId: idOrUndefined(fact.workflowId),
107
+ executionId: idOrUndefined(fact.executionId),
108
+ trigger: fact.trigger,
109
+ errorCode: toDimension(fact.errorCode),
110
+ durationMs: countOrUndefined(fact.durationMs)
111
+ });
112
+ }
113
+ /** `fluidgrids.template.used` — a store template became a workflow. */
114
+ function emitTemplateUsed(bus, fact) {
115
+ emit(bus, "fluidgrids.template.used", {
116
+ workspaceId: idOrUndefined(fact.workspaceId),
117
+ templateId: idOrUndefined(fact.templateId),
118
+ category: toDimension(fact.category)
119
+ });
120
+ }
121
+ /** `fluidgrids.node.installed` — a store node was installed. */
122
+ function emitNodeInstalled(bus, fact) {
123
+ emit(bus, "fluidgrids.node.installed", {
124
+ workspaceId: idOrUndefined(fact.workspaceId),
125
+ nodeType: toDimension(fact.nodeType),
126
+ source: fact.source
127
+ });
128
+ }
129
+ /** `fluidgrids.quota.workflow_limit_hit` — a create was refused at the limit. */
130
+ function emitWorkflowLimitHit(bus, fact) {
131
+ emit(bus, "fluidgrids.quota.workflow_limit_hit", {
132
+ workspaceId: idOrUndefined(fact.workspaceId),
133
+ quotaKey: WORKFLOWS_QUOTA_NAME,
134
+ surface: fact.surface
135
+ });
136
+ }
137
+ /** `fluidgrids.quota.run_limit_hit` — a run was refused at the monthly limit. */
138
+ function emitRunLimitHit(bus, fact) {
139
+ emit(bus, "fluidgrids.quota.run_limit_hit", {
140
+ workspaceId: idOrUndefined(fact.workspaceId),
141
+ quotaKey: toDimension(fact.quotaKey) ?? "fluidgrids.runs.monthly",
142
+ surface: fact.surface
143
+ });
144
+ }
145
+ /** `fluidgrids.billing.upgrade_clicked` — a FluidGrids upgrade CTA was clicked. */
146
+ function emitUpgradeClicked(bus, fact) {
147
+ emit(bus, "fluidgrids.billing.upgrade_clicked", {
148
+ workspaceId: idOrUndefined(fact.workspaceId),
149
+ surface: fact.surface,
150
+ quotaKey: toDimension(fact.quotaKey)
151
+ });
152
+ }
153
+ /**
154
+ * Map a run's backend mode/trigger to the analytics trigger dimension. The
155
+ * builder's debug paths are always `TEST`; anything else a person started by
156
+ * hand is `manual`.
157
+ */
158
+ function runTriggerFromMode(mode) {
159
+ return typeof mode === "string" && mode.toUpperCase() === "TEST" ? "test" : "manual";
160
+ }
161
+
162
+ export { emitTemplateUsed as a, emitWorkflowLimitHit as c, runTriggerFromMode as d, emitRunStarted as i, emitWorkflowPublished as l, emitRunFailed as n, emitUpgradeClicked as o, emitRunLimitHit as r, emitWorkflowCreated as s, emitNodeInstalled as t, nodesOf as u };
package/dist/history.js CHANGED
@@ -1,4 +1,4 @@
1
1
  "use client";
2
- import { t as HistoryPage } from "./HistoryPage-B5Np7Dd_.js";
2
+ import { t as HistoryPage } from "./HistoryPage-CNXgUMb0.js";
3
3
 
4
4
  export { HistoryPage };