@burdenoff/fluidgrids-fe-sdk 2026.1111.21 → 2026.1111.23

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 (64) hide show
  1. package/README.md +13 -0
  2. package/dist/{AiStudioPage-CJdzRL26.js → AiStudioPage-CLrMe8v8.js} +5 -5
  3. package/dist/{ApprovalInboxPage-dbBDSJ-f.js → ApprovalInboxPage-D8vhnloO.js} +1 -1
  4. package/dist/{DataSinkDashboardPage-hrwQSvks.js → DataSinkDashboardPage-DDvNPS8Z.js} +1 -1
  5. package/dist/{DataTablesPage-BZy2z0LB.js → DataTablesPage-BpnF13UT.js} +9 -1
  6. package/dist/{ExecutionDetailPage-DKp421Fj.js → ExecutionDetailPage-DmICvIpH.js} +12 -7
  7. package/dist/{ExecutionsListPage-DwJQfDPt.js → ExecutionsListPage-D63aCXJH.js} +4 -4
  8. package/dist/{FluidGridsProvider-CbY91ZQq.js → FluidGridsProvider-CWyQ8ziM.js} +2 -1
  9. package/dist/{HistoryPage-BLXZJDoJ.js → HistoryPage-CNXgUMb0.js} +1 -1
  10. package/dist/{HumanRequestCard-D-ooVPDn.js → HumanRequestCard-mOhr-Ic9.js} +239 -31
  11. package/dist/{InsightsPage-ChnoW5U4.js → InsightsPage-Duo83yAM.js} +1 -1
  12. package/dist/{MissingNodesInstallModal-mYFfy9Gg.js → MissingNodesInstallModal-Q3RYBvS8.js} +1 -1
  13. package/dist/{QuotaExhaustedDialog-DWm_YWL7.js → QuotaExhaustedDialog-ChBoJnRo.js} +3 -2
  14. package/dist/{SettingsPage-CXoKX0px.js → SettingsPage-DI_vIG7t.js} +2 -2
  15. package/dist/{TemplateCard-HIMsb47R.js → TemplateCard-6W2q2wiK.js} +4 -3
  16. package/dist/{TemplateConfigurationModal-BNtbJ2fv.js → TemplateConfigurationModal-qNQGP7cm.js} +1 -1
  17. package/dist/{TemplateDetailPanel-C6Zh2WRF.js → TemplateDetailPanel-CQvYqhVO.js} +1 -1
  18. package/dist/{TemplatePreview-_wUMSwh_.js → TemplatePreview-Bb2f4enx.js} +4 -4
  19. package/dist/{TemplatesPage-DBfL-ao9.js → TemplatesPage-Bvg6R2P9.js} +6 -5
  20. package/dist/{WorkflowBuilder-CMZi6wQE.js → WorkflowBuilder-CabLzwS5.js} +8 -8
  21. package/dist/{WorkflowBuilder-CYmpQtIQ.js → WorkflowBuilder-TgKSGNlu.js} +3 -3
  22. package/dist/{WorkflowSearchRedirect-iWzvY9Qo.js → WorkflowSearchRedirect-33Vs4FKc.js} +1 -1
  23. package/dist/{WorkflowsList-C8aoqtRE.js → WorkflowsList-C3bHLpSv.js} +147 -22
  24. package/dist/agent-tools.js +1 -1
  25. package/dist/{agentTools-CrEWQ5st.js → agentTools-BU5crBtm.js} +3 -3
  26. package/dist/{canvasNoteTools-6BQYNCee.js → canvasNoteTools-DeSl4BAF.js} +2 -2
  27. package/dist/{code-editor-field-CoRq10k7.js → code-editor-field-CfP0QYUD.js} +1 -1
  28. package/dist/executions.js +2 -2
  29. package/dist/{flow-builder-Dwev-C_g.js → flow-builder-xokwiaT1.js} +16 -73
  30. package/dist/fluidgridsEvents-Dm5CaHtr.js +162 -0
  31. package/dist/history.js +1 -1
  32. package/dist/{index-6JR2vD9J.d.ts → index-D507rsk2.d.ts} +19 -19
  33. package/dist/index.d.ts +3 -2
  34. package/dist/index.js +31 -29
  35. package/dist/{node-detail-view-BFBSKj5w.js → node-detail-view-DGrDIjS-.js} +5 -5
  36. package/dist/{node-editor-tab-body-Cz9kOlxu.js → node-editor-tab-body-eOsmnUvx.js} +2 -2
  37. package/dist/observability.d.ts +1 -1
  38. package/dist/observability.js +2 -2
  39. package/dist/{popover-xPh0iIzy.js → popover-B1aKz7DC.js} +1 -1
  40. package/dist/{quick-config-panel-Ym05lyGn.js → quick-config-panel-Bc7isfv0.js} +3 -3
  41. package/dist/quota-Cdt8yz7N.js +152 -0
  42. package/dist/quota.d.ts +3 -0
  43. package/dist/quota.js +4 -0
  44. package/dist/runsQuota-DsniKiSg.d.ts +20 -0
  45. package/dist/runsQuota-DvXR6mRN.js +100 -0
  46. package/dist/{schedule-panel-54D5W5Qk.js → schedule-panel-BnqaUnnz.js} +153 -7
  47. package/dist/settings.js +1 -1
  48. package/dist/{sidebar-node-editor-LL3ofDN7.js → sidebar-node-editor-CdlEDGKh.js} +3 -3
  49. package/dist/templates.js +2 -2
  50. package/dist/{uiMarkTools-nlmzsHQM.js → uiMarkTools-DZ6akjQK.js} +1 -1
  51. package/dist/useActionParam-B0ebTZmg.js +83 -0
  52. package/dist/{useDurableParity-BScby67i.js → useDurableParity-BApRraSO.js} +1 -1
  53. package/dist/{useExecutions-B0VzQcY2.js → useExecutions-C2a4EcvC.js} +2 -2
  54. package/dist/{useObservability-FfQGgW6W.js → useObservability-BmbeK5bG.js} +2 -2
  55. package/dist/{useRunHistory-BZJg72kd.js → useRunHistory-CqfDFRzr.js} +1 -1
  56. package/dist/{useWorkflowCodeExport-CUWMlJbi.js → useWorkflowCodeExport-DebpM48M.js} +1 -1
  57. package/dist/{useWorkflows-Czz5DlL0.js → useWorkflows-D1-rYzGK.js} +2 -2
  58. package/dist/workflow-builder.js +4 -4
  59. package/dist/workflow-pages.d.ts +1 -1
  60. package/dist/workflow-pages.js +15 -15
  61. package/dist/workflows-list.d.ts +6 -0
  62. package/dist/workflows-list.js +3 -2
  63. package/package.json +5 -1
  64. package/dist/fluidgridsEvents-CNdcrUNN.js +0 -310
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { t as ThemeProvider } from "./theme-provider-B3mIuz2d.js";
4
- import { t as FlowBuilderPage } from "./flow-builder-Dwev-C_g.js";
5
- import { a as useTemplateImportFlow, l as useImportWorkflowTemplate } from "./TemplateCard-HIMsb47R.js";
6
- import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-DWm_YWL7.js";
4
+ import { t as FlowBuilderPage } from "./flow-builder-xokwiaT1.js";
5
+ import { a as useTemplateImportFlow, l as useImportWorkflowTemplate } from "./TemplateCard-6W2q2wiK.js";
6
+ import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-ChBoJnRo.js";
7
7
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
8
8
  import { i as SdkPermissionButton, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
9
- import { f as BILLING_PLANS_PATH } from "./fluidgridsEvents-CNdcrUNN.js";
9
+ import { t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
10
10
  import { useEffect, useState } from "react";
11
11
  import { useNavigate, useParams } from "react-router";
12
12
  import { Icon } from "@iconify/react";
@@ -1,15 +1,16 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, s as useDuplicateWorkflow } from "./useWorkflows-Czz5DlL0.js";
4
- import { a as useTemplateImportFlow, t as TemplateCard, u as useWorkflowTemplates, y as useGlobalStoreClient } from "./TemplateCard-HIMsb47R.js";
3
+ import { h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, s as useDuplicateWorkflow } from "./useWorkflows-D1-rYzGK.js";
4
+ import { a as useTemplateImportFlow, t as TemplateCard, u as useWorkflowTemplates, y as useGlobalStoreClient } from "./TemplateCard-6W2q2wiK.js";
5
5
  import { YF as WorkflowStatus } from "./graphql-types-CDKVWH2R.js";
6
6
  import { i as SdkPermissionButton, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
7
- import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-DWm_YWL7.js";
7
+ import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-ChBoJnRo.js";
8
8
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
9
- import { O as MyWorkflowTemplateSubmissionsDocument, P as WithdrawWorkflowTemplateSubmissionDocument, gn as useFluidGridsAnalytics, j as SubmitWorkflowTemplateDocument } from "./FluidGridsProvider-CbY91ZQq.js";
10
- import { a as emitTemplateUsed, f as BILLING_PLANS_PATH, y as isQuotaExhaustedFailure } from "./fluidgridsEvents-CNdcrUNN.js";
9
+ import { O as MyWorkflowTemplateSubmissionsDocument, P as WithdrawWorkflowTemplateSubmissionDocument, gn as useFluidGridsAnalytics, j as SubmitWorkflowTemplateDocument } from "./FluidGridsProvider-CWyQ8ziM.js";
10
+ import { a as emitTemplateUsed } from "./fluidgridsEvents-Dm5CaHtr.js";
11
11
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
12
12
  import { r as templatesControls } from "./pageControlSpecs-DZJ9K37m.js";
13
+ import { c as isQuotaExhaustedFailure, t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
13
14
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
14
15
  import { _ as throwIfResultError, m as describeOperationError } from "./client-C9XSzSXr.js";
15
16
  import { useCallback, useEffect, useMemo, useState } from "react";
@@ -1,18 +1,18 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { h as useWorkflowReloadStore, m as releaseLeaseKeptForReload, t as FlowBuilderPage } from "./flow-builder-Dwev-C_g.js";
3
+ import { d as releaseLeaseKeptForReload, f as useWorkflowReloadStore, t as FlowBuilderPage } from "./flow-builder-xokwiaT1.js";
4
4
  import { n as registerLiveCanvasHandler } from "./liveCanvas-D5ytXDp8.js";
5
5
  import { _ as throwIfResultError, n as getFluidGridsClient, x as getFluidGridsConfig } from "./client-C9XSzSXr.js";
6
6
  import { Er as WorkflowDefinitionDocument } from "./graphql-operation-types-kX-MMjgW.js";
7
7
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
8
- import { B as createConfiguredNode, Dt as blankWorkflowCreateInput, Nt as useSaveStatusStore, Xt as rememberRevision, Z as paramsFromOperation, an as workflowFingerprint, en as codeBuildIdOf, g as registerWorkflowNodeTypes, h as registerNodeManifests, kt as classifyCreateRefusal, m as refetchStoreNodes, mn as resolveNodeOperation, o as NODE_CONFIGS, u as ensureNodeTypesLoaded } from "./FluidGridsProvider-CbY91ZQq.js";
8
+ import { B as createConfiguredNode, Dt as blankWorkflowCreateInput, Nt as useSaveStatusStore, Xt as rememberRevision, Z as paramsFromOperation, an as workflowFingerprint, en as codeBuildIdOf, g as registerWorkflowNodeTypes, h as registerNodeManifests, kt as classifyCreateRefusal, m as refetchStoreNodes, mn as resolveNodeOperation, o as NODE_CONFIGS, u as ensureNodeTypesLoaded } from "./FluidGridsProvider-CWyQ8ziM.js";
9
9
  import { F as mergeStickyNotes, H as useFlowStore } from "./node-operation-selection--oy-yEq_.js";
10
10
  import { t as canvasFromDefinition } from "./definition-canvas--3MPHoP-.js";
11
- import { l as useLazyWorkflowDefinition, n as useCreateWorkflow } from "./useWorkflows-Czz5DlL0.js";
12
- import { c as getWorkflowNodeTypes, o as buildNodeCheck, s as buildRequiredNodeTypes, v as useInstalledNodes } from "./TemplateCard-HIMsb47R.js";
11
+ import { l as useLazyWorkflowDefinition, n as useCreateWorkflow } from "./useWorkflows-D1-rYzGK.js";
12
+ import { c as getWorkflowNodeTypes, o as buildNodeCheck, s as buildRequiredNodeTypes, v as useInstalledNodes } from "./TemplateCard-6W2q2wiK.js";
13
13
  import { c as withoutGuidedTourIntent, l as decideMissingWorkflow, o as isGuidedTourIntent, s as pickGuidedTour, u as isCreateIntent } from "./firstWorkflow-C_h0KMB2.js";
14
- import { f as BILLING_PLANS_PATH } from "./fluidgridsEvents-CNdcrUNN.js";
15
- import { T as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-CUWMlJbi.js";
14
+ import { t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
15
+ import { T as CreateWorkflowRefusalDialog } from "./useWorkflowCodeExport-DebpM48M.js";
16
16
  import { Suspense, lazy, useCallback, useEffect, useMemo, useRef, useState } from "react";
17
17
  import { useLocation, useNavigate, useParams } from "react-router";
18
18
  import { Icon } from "@iconify/react";
@@ -1088,7 +1088,7 @@ function GuidedTourStarter({ ready }) {
1088
1088
  }
1089
1089
 
1090
1090
  // src/builder/app/workflow/work/page.tsx
1091
- const LazyMissingNodesInstallModal = lazy(() => import("./MissingNodesInstallModal-mYFfy9Gg.js").then((m) => ({ default: m.MissingNodesInstallModal })));
1091
+ const LazyMissingNodesInstallModal = lazy(() => import("./MissingNodesInstallModal-Q3RYBvS8.js").then((m) => ({ default: m.MissingNodesInstallModal })));
1092
1092
  function WorkflowItem({ readonly = false }) {
1093
1093
  if (readonly) {
1094
1094
  const queryParams = new URLSearchParams(window.location.search);
@@ -1160,7 +1160,7 @@ function WorkflowItem({ readonly = false }) {
1160
1160
  setInstallErrors([]);
1161
1161
  try {
1162
1162
  const { getGlobalStoreClient } = await import("./node-registry-refresh-Dy0uRg9f.js").then((n) => n.a);
1163
- const { InstallWorkflowNodeDocument } = await import("./FluidGridsProvider-CbY91ZQq.js").then((n) => n.y);
1163
+ const { InstallWorkflowNodeDocument } = await import("./FluidGridsProvider-CWyQ8ziM.js").then((n) => n.y);
1164
1164
  const { getFluidGridsConfig } = await import("./client-C9XSzSXr.js").then((n) => n.b);
1165
1165
  const storeClient = getGlobalStoreClient();
1166
1166
  const cfg = getFluidGridsConfig();
@@ -1,12 +1,12 @@
1
1
  "use client";
2
- import { n as FluidGridsProvider, vn as useCanvasEdges } from "./FluidGridsProvider-CbY91ZQq.js";
2
+ import { n as FluidGridsProvider, vn as useCanvasEdges } from "./FluidGridsProvider-CWyQ8ziM.js";
3
3
  import { H as useFlowStore } from "./node-operation-selection--oy-yEq_.js";
4
4
  import { t as Button } from "./button-DG7y_FVJ.js";
5
5
  import { d as Input } from "./dialog-Cjb4lB4D.js";
6
- import { b as Card } from "./TemplateCard-HIMsb47R.js";
6
+ import { b as Card } from "./TemplateCard-6W2q2wiK.js";
7
7
  import { t as cn } from "./cn-QqidFIgr.js";
8
8
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
9
- import { b as useNodeSelectedEvent, x as FluidGridsMark } from "./flow-builder-Dwev-C_g.js";
9
+ import { _ as useNodeSelectedEvent, v as FluidGridsMark } from "./flow-builder-xokwiaT1.js";
10
10
  import { useCallback, useEffect, useRef, useState } from "react";
11
11
  import { Background, Controls, Handle, MarkerType, MiniMap, Position, ReactFlow, ReactFlowProvider, useReactFlow } from "@xyflow/react";
12
12
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { m as useWorkflowDefinition } from "./useWorkflows-Czz5DlL0.js";
3
+ import { m as useWorkflowDefinition } from "./useWorkflows-D1-rYzGK.js";
4
4
  import { Navigate, useParams } from "react-router";
5
5
  import { Icon } from "@iconify/react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,25 +1,26 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { c as useImportWorkflow, h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, n as useCreateWorkflow, o as useDeleteWorkflow, s as useDuplicateWorkflow, u as usePreviewN8nImport } from "./useWorkflows-Czz5DlL0.js";
4
- import { At as createThenOpen, t as FluidGridsContext } from "./FluidGridsProvider-CbY91ZQq.js";
5
- import { C as typeScriptModuleFile, S as typeScriptImportSource, T as CreateWorkflowRefusalDialog, a as parseWorkflowImport, b as readProjectArchive, c as MAX_IMPORT_ARCHIVE_BYTES, d as checkTypeScriptImport, i as downloadWorkflowExport, l as MAX_IMPORT_SOURCE_BYTES, m as importFileKind, n as useExportWorkflowAs, o as CODE_EXPORT_FORMATS, p as importAcceptAttribute, s as ImportSourceError, u as assertImportByteSize, w as workflowNameFromFile, y as primaryImportModule } from "./useWorkflowCodeExport-CUWMlJbi.js";
6
- import { f as BILLING_PLANS_PATH, y as isQuotaExhaustedFailure } from "./fluidgridsEvents-CNdcrUNN.js";
3
+ import { c as useImportWorkflow, h as useWorkflowDefinitions, l as useLazyWorkflowDefinition, n as useCreateWorkflow, o as useDeleteWorkflow, s as useDuplicateWorkflow, u as usePreviewN8nImport } from "./useWorkflows-D1-rYzGK.js";
4
+ import { At as createThenOpen, t as FluidGridsContext } from "./FluidGridsProvider-CWyQ8ziM.js";
5
+ import { C as typeScriptModuleFile, S as typeScriptImportSource, T as CreateWorkflowRefusalDialog, a as parseWorkflowImport, b as readProjectArchive, c as MAX_IMPORT_ARCHIVE_BYTES, d as checkTypeScriptImport, i as downloadWorkflowExport, l as MAX_IMPORT_SOURCE_BYTES, m as importFileKind, n as useExportWorkflowAs, o as CODE_EXPORT_FORMATS, p as importAcceptAttribute, s as ImportSourceError, u as assertImportByteSize, w as workflowNameFromFile, y as primaryImportModule } from "./useWorkflowCodeExport-DebpM48M.js";
6
+ import { c as isQuotaExhaustedFailure, t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
7
7
  import { H as useFlowStore } from "./node-operation-selection--oy-yEq_.js";
8
8
  import { a as SdkPermissionGate, i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-B2lhWNoN.js";
9
- import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-DWm_YWL7.js";
9
+ import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-ChBoJnRo.js";
10
10
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
11
11
  import { CF as WorkflowExportFormat, gF as WorkflowAccessFilter } from "./graphql-types-CDKVWH2R.js";
12
12
  import { i as canShareWorkflow, r as canEditWorkflow, t as WorkflowShareDialog } from "./WorkflowShareDialog-mbIwRQUY.js";
13
+ import { i as useOpenRequest, n as ACTION_PARAM_VALUES, r as useActionParam } from "./useActionParam-B0ebTZmg.js";
13
14
  import { l as useFluidGridsFlag, t as FLUIDGRIDS_FLAGS } from "./feature-flags-DM5myWaD.js";
14
15
  import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
15
16
  import { $t as RenameWorkflowProjectDocument, G as DeleteWorkflowFolderDocument, Hr as WorkflowProjectsDocument, K as DeleteWorkflowProjectDocument, M as CreateWorkflowProjectDocument, Nr as WorkflowFoldersDocument, Qt as RenameWorkflowFolderDocument, Tt as MoveWorkflowFolderDocument, g as BulkMoveWorkflowsToFolderDocument, h as BulkDeleteWorkflowsDocument, j as CreateWorkflowFolderDocument, m as BulkAssignWorkflowsToProjectDocument } from "./graphql-operation-types-kX-MMjgW.js";
16
- import { a as useExecutions } from "./useExecutions-B0VzQcY2.js";
17
+ import { a as useExecutions } from "./useExecutions-C2a4EcvC.js";
17
18
  import { a as firstWorkflowProgress, i as builderPathFor, r as GUIDED_TOUR_STATE } from "./firstWorkflow-C_h0KMB2.js";
18
19
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
19
20
  import { i as workflowsListControls } from "./pageControlSpecs-DZJ9K37m.js";
20
21
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
21
22
  import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
22
- import { useNavigate } from "react-router";
23
+ import { useNavigate, useSearchParams } from "react-router";
23
24
  import { Icon } from "@iconify/react";
24
25
  import { cn } from "@burdenoff/fe-libs/utils";
25
26
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -712,11 +713,13 @@ function declaredLength(response) {
712
713
  const value = Number(response.headers.get("content-length"));
713
714
  return Number.isFinite(value) && value > 0 ? value : null;
714
715
  }
715
- function WorkflowImportDialog({ onImported }) {
716
+ function WorkflowImportDialog({ onImported, openRequested, onOpenRequestHandled }) {
716
717
  const tr = useTr();
717
718
  const codeFirst = useFluidGridsFlag(FLUIDGRIDS_FLAGS.codeFirst);
718
719
  const { importWorkflow, loading, error: importError } = useImportWorkflow();
719
720
  const [open, setOpen] = useState(false);
721
+ const openFromRequest = useCallback(() => setOpen(true), []);
722
+ useOpenRequest(openRequested, openFromRequest, onOpenRequestHandled);
720
723
  const [typeScript, setTypeScript] = useState(null);
721
724
  const [issues, setIssues] = useState(null);
722
725
  const [submitted, setSubmitted] = useState(false);
@@ -1447,20 +1450,22 @@ function FolderRow({ folder, depth, selectedFolderId, onSelect, onCreateChild, o
1447
1450
  * itself owns that filtering (see WorkflowsList's `folderFilter` state) so
1448
1451
  * this component stays a pure navigation/management surface.
1449
1452
  */
1450
- function WorkflowFolderSidebar({ selectedFolderId, onSelectFolder }) {
1453
+ function WorkflowFolderSidebar({ selectedFolderId, onSelectFolder, createRequested, onCreateRequestHandled }) {
1451
1454
  const tr = useTr();
1452
1455
  const { folders, loading, refetch } = useWorkflowFolders();
1453
1456
  const { createFolder, renameFolder, deleteFolder } = useWorkflowFolderActions();
1454
1457
  const [dialog, setDialog] = useState(null);
1455
1458
  const [name, setName] = useState("");
1456
1459
  const [deleteTarget, setDeleteTarget] = useState(null);
1457
- const openCreate = (parentId) => {
1460
+ const openCreate = useCallback((parentId) => {
1458
1461
  setName("");
1459
1462
  setDialog({
1460
1463
  mode: "create",
1461
1464
  parentId
1462
1465
  });
1463
- };
1466
+ }, []);
1467
+ const openCreateTopLevel = useCallback(() => openCreate(null), [openCreate]);
1468
+ useOpenRequest(createRequested, openCreateTopLevel, onCreateRequestHandled);
1464
1469
  const openRename = (folder) => {
1465
1470
  setName(folder.name);
1466
1471
  setDialog({
@@ -1975,6 +1980,110 @@ function WorkflowMoveToProjectDialog({ workflow, onClose, onMoved }) {
1975
1980
  });
1976
1981
  }
1977
1982
 
1983
+ // src/pages/workflowsListUrlState.ts
1984
+ /**
1985
+ * URL-driven filter state for the workflows list (BOFF-10854).
1986
+ *
1987
+ * The access, status and folder filters live in the query string so the
1988
+ * shell's navigation ("Shared with me", "Archived", a folder) can link
1989
+ * straight to a filtered list, and a filtered list survives reload and
1990
+ * back/forward. Supported values:
1991
+ *
1992
+ * ?access=mine | shared (absent or "all" = every visible workflow)
1993
+ * ?status=active | draft | archived | deprecated (absent = any status)
1994
+ * ?folder=<folder id> (absent = all folders)
1995
+ *
1996
+ * Unknown values fall back to the default rather than erroring. Writes use
1997
+ * history replace, so toggling chips does not flood the back stack, and a
1998
+ * default value removes its parameter so plain `/workflows/list` stays clean.
1999
+ */
2000
+ const WORKFLOWS_LIST_PARAMS = {
2001
+ access: "access",
2002
+ status: "status",
2003
+ folder: "folder"
2004
+ };
2005
+ /** The workflow statuses the list's status chips offer. */
2006
+ const WORKFLOW_LIST_STATUSES = [
2007
+ "ACTIVE",
2008
+ "DRAFT",
2009
+ "ARCHIVED",
2010
+ "DEPRECATED"
2011
+ ];
2012
+ const ACCESS_BY_PARAM = {
2013
+ all: "ALL",
2014
+ mine: "OWNED_BY_ME",
2015
+ shared: "SHARED_WITH_ME"
2016
+ };
2017
+ const PARAM_BY_ACCESS = {
2018
+ ["ALL"]: null,
2019
+ ["OWNED_BY_ME"]: "mine",
2020
+ ["SHARED_WITH_ME"]: "shared"
2021
+ };
2022
+ function accessFromParam(value) {
2023
+ if (!value) return "ALL";
2024
+ return ACCESS_BY_PARAM[value.trim().toLowerCase()] ?? "ALL";
2025
+ }
2026
+ function accessToParam(access) {
2027
+ return PARAM_BY_ACCESS[access];
2028
+ }
2029
+ function isWorkflowListStatus(value) {
2030
+ return WORKFLOW_LIST_STATUSES.includes(value);
2031
+ }
2032
+ /** `archived` / `ARCHIVED` → `ARCHIVED`; anything unknown → no filter. */
2033
+ function statusFromParam(value) {
2034
+ if (!value) return null;
2035
+ const upper = value.trim().toUpperCase();
2036
+ return isWorkflowListStatus(upper) ? upper : null;
2037
+ }
2038
+ function statusToParam(status) {
2039
+ if (!status) return null;
2040
+ const upper = status.toUpperCase();
2041
+ return isWorkflowListStatus(upper) ? upper.toLowerCase() : null;
2042
+ }
2043
+ function folderFromParam(value) {
2044
+ const trimmed = value?.trim();
2045
+ return trimmed ? trimmed : null;
2046
+ }
2047
+ /**
2048
+ * Applies a filter patch to a copy of `params`. Keys missing from the patch
2049
+ * are left untouched; default values delete their parameter. Unrelated
2050
+ * parameters (e.g. `?action=`) are preserved.
2051
+ */
2052
+ function applyFilterPatch(params, patch) {
2053
+ const next = new URLSearchParams(params);
2054
+ const write = (key, value) => {
2055
+ if (value === null) next.delete(key);
2056
+ else next.set(key, value);
2057
+ };
2058
+ if (patch.access !== void 0) write(WORKFLOWS_LIST_PARAMS.access, accessToParam(patch.access));
2059
+ if (patch.status !== void 0) write(WORKFLOWS_LIST_PARAMS.status, statusToParam(patch.status));
2060
+ if (patch.folder !== void 0) write(WORKFLOWS_LIST_PARAMS.folder, folderFromParam(patch.folder));
2061
+ return next;
2062
+ }
2063
+ function useWorkflowsListUrlState() {
2064
+ const [searchParams, setSearchParams] = useSearchParams();
2065
+ const access = accessFromParam(searchParams.get(WORKFLOWS_LIST_PARAMS.access));
2066
+ const status = statusFromParam(searchParams.get(WORKFLOWS_LIST_PARAMS.status));
2067
+ const folder = folderFromParam(searchParams.get(WORKFLOWS_LIST_PARAMS.folder));
2068
+ const update = useCallback((patch) => {
2069
+ setSearchParams((prev) => applyFilterPatch(prev, patch), { replace: true });
2070
+ }, [setSearchParams]);
2071
+ return useMemo(() => ({
2072
+ access,
2073
+ status,
2074
+ folder,
2075
+ update,
2076
+ setAccess: (next) => update({ access: next }),
2077
+ setStatus: (next) => update({ status: next }),
2078
+ setFolder: (next) => update({ folder: next })
2079
+ }), [
2080
+ access,
2081
+ status,
2082
+ folder,
2083
+ update
2084
+ ]);
2085
+ }
2086
+
1978
2087
  // src/pages/WorkflowsList.tsx
1979
2088
  var WorkflowsList_exports = /* @__PURE__ */ __exportAll({ WorkflowsList: () => WorkflowsList });
1980
2089
  function useStatusFilters() {
@@ -2037,7 +2146,8 @@ function WorkflowsList() {
2037
2146
  const STATUS_FILTERS = useStatusFilters();
2038
2147
  const ACCESS_FILTERS = useAccessFilters();
2039
2148
  const workspaceId = useContext(FluidGridsContext)?.workspaceId ?? "";
2040
- const [accessFilter, setAccessFilter] = useState("ALL");
2149
+ const urlFilters = useWorkflowsListUrlState();
2150
+ const { access: accessFilter, status: statusFilter, folder: folderFilter, setAccess: setAccessFilter, setStatus: setStatusFilter, setFolder: setFolderFilter } = urlFilters;
2041
2151
  const { workflows, loading, error, tagsByKey, refetch } = useWorkflowDefinitions({
2042
2152
  limit: 100,
2043
2153
  latestOnly: true,
@@ -2047,18 +2157,24 @@ function WorkflowsList() {
2047
2157
  const [moving, setMoving] = useState(null);
2048
2158
  const filteredByAccess = accessFilter !== "ALL";
2049
2159
  const { getWorkflow } = useLazyWorkflowDefinition();
2050
- const { allowed: canCreate } = useFluidGridsPermission(FLUIDGRIDS_PERMISSIONS.WORKFLOW_CREATE);
2160
+ const createPermission = useFluidGridsPermission(FLUIDGRIDS_PERMISSIONS.WORKFLOW_CREATE);
2161
+ const canCreate = createPermission.allowed;
2162
+ const importRequest = useActionParam(ACTION_PARAM_VALUES.import, createPermission);
2163
+ const newFolderRequest = useActionParam(ACTION_PARAM_VALUES.newFolder);
2051
2164
  const [search, setSearch] = useState("");
2052
- const [statusFilter, setStatusFilter] = useState(null);
2053
2165
  const [tagFilter, setTagFilter] = useState(null);
2054
- const [folderFilter, setFolderFilter] = useState(null);
2055
2166
  const [projectFilter, setProjectFilter] = useState(null);
2056
2167
  const [selectMode, setSelectMode] = useState(false);
2057
2168
  const [selectedIds, setSelectedIds] = useState(/* @__PURE__ */ new Set());
2058
2169
  const presentStatuses = useMemo(() => {
2059
2170
  const seen = new Set(workflows.map((w) => w.status ?? "DRAFT"));
2171
+ if (statusFilter) seen.add(statusFilter);
2060
2172
  return STATUS_FILTERS.filter((s) => seen.has(s.value));
2061
- }, [workflows, STATUS_FILTERS]);
2173
+ }, [
2174
+ workflows,
2175
+ STATUS_FILTERS,
2176
+ statusFilter
2177
+ ]);
2062
2178
  const presentTags = useMemo(() => {
2063
2179
  const byId = /* @__PURE__ */ new Map();
2064
2180
  for (const w of workflows) for (const a of tagsByKey[w.workflowKey] ?? []) if (!byId.has(a.tagId)) byId.set(a.tagId, {
@@ -2188,7 +2304,9 @@ function WorkflowsList() {
2188
2304
  children: [
2189
2305
  /* @__PURE__ */ jsx(WorkflowFolderSidebar, {
2190
2306
  selectedFolderId: folderFilter,
2191
- onSelectFolder: setFolderFilter
2307
+ onSelectFolder: setFolderFilter,
2308
+ createRequested: newFolderRequest.requested,
2309
+ onCreateRequestHandled: newFolderRequest.handled
2192
2310
  }),
2193
2311
  /* @__PURE__ */ jsxs("div", {
2194
2312
  className: "flex flex-1 flex-col gap-5 p-4 sm:p-6",
@@ -2223,7 +2341,11 @@ function WorkflowsList() {
2223
2341
  ]
2224
2342
  }),
2225
2343
  createButton,
2226
- /* @__PURE__ */ jsx(WorkflowImportDialog, { onImported: () => void refetch() })
2344
+ /* @__PURE__ */ jsx(WorkflowImportDialog, {
2345
+ onImported: () => void refetch(),
2346
+ openRequested: importRequest.requested,
2347
+ onOpenRequestHandled: importRequest.handled
2348
+ })
2227
2349
  ]
2228
2350
  }),
2229
2351
  !loading && !error && /* @__PURE__ */ jsx(FirstWorkflowChecklist, {
@@ -2276,7 +2398,7 @@ function WorkflowsList() {
2276
2398
  className: "size-4"
2277
2399
  }), tr("fluidgrids.workflowsList.bulk.selectToggle", "Select")]
2278
2400
  }),
2279
- presentStatuses.length > 1 && /* @__PURE__ */ jsxs("div", {
2401
+ (presentStatuses.length > 1 || statusFilter !== null) && /* @__PURE__ */ jsxs("div", {
2280
2402
  className: "flex flex-wrap items-center gap-1.5",
2281
2403
  children: [/* @__PURE__ */ jsx("button", {
2282
2404
  type: "button",
@@ -2285,7 +2407,7 @@ function WorkflowsList() {
2285
2407
  children: tr("fluidgrids.workflowsList.statusFilterAll", "All")
2286
2408
  }), presentStatuses.map((s) => /* @__PURE__ */ jsx("button", {
2287
2409
  type: "button",
2288
- onClick: () => setStatusFilter((cur) => cur === s.value ? null : s.value),
2410
+ onClick: () => setStatusFilter(statusFilter === s.value ? null : s.value),
2289
2411
  className: cn("rounded-full border px-3 py-1 text-xs font-medium transition-colors", statusFilter === s.value ? "border-transparent bg-primary text-primary-foreground" : "border-border bg-card text-muted-foreground hover:text-foreground"),
2290
2412
  children: s.label
2291
2413
  }, s.value))]
@@ -2365,9 +2487,12 @@ function WorkflowsList() {
2365
2487
  size: "sm",
2366
2488
  onClick: () => {
2367
2489
  setSearch("");
2368
- setStatusFilter(null);
2369
2490
  setTagFilter(null);
2370
- setAccessFilter("ALL");
2491
+ urlFilters.update({
2492
+ status: null,
2493
+ folder: null,
2494
+ access: "ALL"
2495
+ });
2371
2496
  },
2372
2497
  children: tr("fluidgrids.workflowsList.clearFiltersButton", "Clear filters")
2373
2498
  })
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { a as triggerNodesOf, i as pickTriggerNode, n as AgentCalloutOverlay, r as createFluidGridsAgentTools, t as createUiMarkTools } from "./uiMarkTools-nlmzsHQM.js";
2
+ import { a as triggerNodesOf, i as pickTriggerNode, n as AgentCalloutOverlay, r as createFluidGridsAgentTools, t as createUiMarkTools } from "./uiMarkTools-DZ6akjQK.js";
3
3
  import { n as useAgentMarksStore, t as resetAgentMarks } from "./marksStore-DGCXjTmZ.js";
4
4
 
5
5
  export { AgentCalloutOverlay, createFluidGridsAgentTools, createUiMarkTools, pickTriggerNode, resetAgentMarks, triggerNodesOf, useAgentMarksStore };
@@ -1,8 +1,8 @@
1
1
  "use client";
2
- import { B as createConfiguredNode, Nt as useSaveStatusStore, Q as selectedOperationOf, R as SENSITIVE_PARAM, Y as nodeTitle, Z as paramsFromOperation, _ as registryNodeData, f as isNodeConfigsInitialized, gt as autosaveAllowedFor, o as NODE_CONFIGS, q as fixedParameterState, wt as isFlowComplete } from "./FluidGridsProvider-CbY91ZQq.js";
2
+ import { B as createConfiguredNode, Nt as useSaveStatusStore, Q as selectedOperationOf, R as SENSITIVE_PARAM, Y as nodeTitle, Z as paramsFromOperation, _ as registryNodeData, f as isNodeConfigsInitialized, gt as autosaveAllowedFor, o as NODE_CONFIGS, q as fixedParameterState, wt as isFlowComplete } from "./FluidGridsProvider-CWyQ8ziM.js";
3
3
  import { E as resolveOutputHandles, H as useFlowStore, T as resolveInputHandles } from "./node-operation-selection--oy-yEq_.js";
4
- import { j as isNodeTypeHiddenFromPalette } from "./TemplateCard-HIMsb47R.js";
5
- import { y as computeAttachPosition } from "./flow-builder-Dwev-C_g.js";
4
+ import { j as isNodeTypeHiddenFromPalette } from "./TemplateCard-6W2q2wiK.js";
5
+ import { g as computeAttachPosition } from "./flow-builder-xokwiaT1.js";
6
6
  import { AgentToolError, defineAgentTool } from "@burdenoff/fe-libs/shared/agent-tools";
7
7
  import { z } from "zod";
8
8
 
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { n as useAgentMarksStore, r as toPlainText } from "./marksStore-DGCXjTmZ.js";
3
- import { Q as selectedOperationOf, Y as nodeTitle, Z as paramsFromOperation } from "./FluidGridsProvider-CbY91ZQq.js";
3
+ import { Q as selectedOperationOf, Y as nodeTitle, Z as paramsFromOperation } from "./FluidGridsProvider-CWyQ8ziM.js";
4
4
  import { H as useFlowStore } from "./node-operation-selection--oy-yEq_.js";
5
- import { g as notesKeyOf } from "./flow-builder-Dwev-C_g.js";
5
+ import { p as notesKeyOf } from "./flow-builder-xokwiaT1.js";
6
6
  import { AgentToolError, defineAgentTool } from "@burdenoff/fe-libs/shared/agent-tools";
7
7
  import { z } from "zod";
8
8
 
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
3
  import { g as toCodeMirrorDiagnostics } from "./node-operation-selection--oy-yEq_.js";
4
- import { Bn as useBuilderReadOnly } from "./FluidGridsProvider-CbY91ZQq.js";
4
+ import { Bn as useBuilderReadOnly } from "./FluidGridsProvider-CWyQ8ziM.js";
5
5
  import { useEffect, useMemo, useRef, useState } from "react";
6
6
  import { cn } from "@burdenoff/fe-libs/utils";
7
7
  import { jsx } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as ExecutionsListPage } from "./ExecutionsListPage-DwJQfDPt.js";
3
- import { t as ExecutionDetailPage } from "./ExecutionDetailPage-DKp421Fj.js";
2
+ import { t as ExecutionsListPage } from "./ExecutionsListPage-D63aCXJH.js";
3
+ import { t as ExecutionDetailPage } from "./ExecutionDetailPage-DmICvIpH.js";
4
4
 
5
5
  export { ExecutionDetailPage, ExecutionsListPage };
@@ -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 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-CbY91ZQq.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-HIMsb47R.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-CUWMlJbi.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-Czz5DlL0.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-BFBSKj5w.js").then((m) => m.NodeDetailView), "NodeDetailView");
262
- const QuickConfigPanelOverlay = preloadableLazy(() => import("./quick-config-panel-Ym05lyGn.js").then((m) => m.QuickConfigPanel), "QuickConfigPanel");
263
- const SidebarNodeEditorOverlay = preloadableLazy(() => import("./sidebar-node-editor-LL3ofDN7.js").then((m) => m.SidebarNodeEditor), "SidebarNodeEditor");
263
+ const NodeDetailViewOverlay = preloadableLazy(() => import("./node-detail-view-DGrDIjS-.js").then((m) => m.NodeDetailView), "NodeDetailView");
264
+ const QuickConfigPanelOverlay = preloadableLazy(() => import("./quick-config-panel-Bc7isfv0.js").then((m) => m.QuickConfigPanel), "QuickConfigPanel");
265
+ const SidebarNodeEditorOverlay = preloadableLazy(() => import("./sidebar-node-editor-CdlEDGKh.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-C6Zh2WRF.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-CoRq10k7.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-CrEWQ5st.js").then(({ createBuilderAgentTools }) => createBuilderAgentTools({ durableFunctionsEnabled: () => paletteGatesRef.current })), !editingBlocked, "Agent tools");
17446
+ useLazyAgentTools(() => import("./agentTools-BU5crBtm.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-6BQYNCee.js").then(({ createCanvasNoteTools }) => createCanvasNoteTools({ focusNode: (nodeId) => fitViewRef.current({
17488
+ useLazyAgentTools(() => import("./canvasNoteTools-DeSl4BAF.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 };