@burdenoff/fluidgrids-fe-sdk 2026.1113.2 → 2026.1113.4

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/dist/{AiStudioPage-5KYZ8r8-.js → AiStudioPage-DmgLQG62.js} +4 -4
  2. package/dist/{DataSinkDashboardPage-8ZDn85e2.js → DataSinkDashboardPage-iBalc66y.js} +1 -1
  3. package/dist/{ExecutionDetailPage-BXDF2eoT.js → ExecutionDetailPage-D1E_Rf3U.js} +9 -9
  4. package/dist/{ExecutionsListPage--4BthM8L.js → ExecutionsListPage-LsqVMwck.js} +6 -6
  5. package/dist/{FailureTriagePanel-B5WCSRFo.js → FailureTriagePanel-CM-vmvbA.js} +1 -1
  6. package/dist/{FluidGridsProvider-Dc_Jhtch.js → FluidGridsProvider-BgP5c-hH.js} +33 -4
  7. package/dist/{HistoryPage-BvFk2m1m.js → HistoryPage-BTAkQ7O1.js} +1 -1
  8. package/dist/{InsightsPage-Dwmb02F6.js → InsightsPage-CVSoyuat.js} +5 -5
  9. package/dist/{OpenTemplateAsCodeButton-8MZHih6I.js → OpenTemplateAsCodeButton-BdcTxemq.js} +1 -1
  10. package/dist/{PaidTemplateConfirm-0G-gv29n.js → PaidTemplateConfirm-DfFrr1pk.js} +1 -1
  11. package/dist/{QuotaExhaustedDialog-wvu_-WJ-.js → QuotaExhaustedDialog-BHZm4tQy.js} +1 -1
  12. package/dist/{SettingsPage-CfjXiGpb.js → SettingsPage-DPWog4BR.js} +108 -4
  13. package/dist/{TaskQueuesPage--Mmn36b-.js → TaskQueuesPage-BwnNad_J.js} +1 -1
  14. package/dist/{TemplateCard-BA_9em22.js → TemplateCard-trfaDJLe.js} +4 -4
  15. package/dist/{TemplateConfigurationModal-BT3PaR0O.js → TemplateConfigurationModal-CxUEsjbr.js} +1 -1
  16. package/dist/{TemplatePreview-Bagja6WN.js → TemplatePreview-BuEMVZiI.js} +5 -5
  17. package/dist/{TemplatesPage-CAajpJ5w.js → TemplatesPage-UISz_6vU.js} +7 -7
  18. package/dist/{WorkflowBuilder-v8h8skwG.js → WorkflowBuilder-Cmj59UU-.js} +3 -3
  19. package/dist/{WorkflowBuilder-DMpSPElu.js → WorkflowBuilder-nnSlI7Fd.js} +5 -5
  20. package/dist/{WorkflowSearchRedirect-G78lINAE.js → WorkflowSearchRedirect-pEIU2nvw.js} +1 -1
  21. package/dist/{WorkflowShareDialog-B7VOgr4-.js → WorkflowShareDialog-BcfzZDOj.js} +1 -1
  22. package/dist/{WorkflowVersionsDocument-CfPMloRW.js → WorkflowVersionsDocument-DRVOp8Uj.js} +18 -0
  23. package/dist/{WorkflowsList-CPYzfE4K.js → WorkflowsList-B6ASopzn.js} +129 -16
  24. package/dist/{agentTools-DTXUqtfu.js → agentTools-7CFfwySg.js} +1 -1
  25. package/dist/{ai-usage-bmUn-gJP.js → ai-usage-D7SjIkUZ.js} +1 -1
  26. package/dist/{assert-rules-CPNrO44K.js → assert-rules-C5739QR0.js} +1 -1
  27. package/dist/{canvasNoteTools-DmfZwtnL.js → canvasNoteTools-BikeF-pN.js} +1 -1
  28. package/dist/executions.js +2 -2
  29. package/dist/{flow-builder-Dv5fWJ6F.js → flow-builder-CksAvhgV.js} +45 -22
  30. package/dist/{graphql-types-v6CTGwA0.js → graphql-types-C5Tr6508.js} +35 -1
  31. package/dist/history.js +1 -1
  32. package/dist/{index-DtMUtXNq.d.ts → index-Df6NgmmH.d.ts} +18 -2
  33. package/dist/{index-f_Nl7Ons.d.ts → index-RWAuYE2j.d.ts} +3 -0
  34. package/dist/index.d.ts +3 -3
  35. package/dist/index.js +34 -34
  36. package/dist/{node-detail-view-BKI_2kM6.js → node-detail-view-BgmxkGJe.js} +5 -5
  37. package/dist/{node-editor-tab-body-Cc1MWEFR.js → node-editor-tab-body-2Y-lqY4_.js} +2 -2
  38. package/dist/observability.d.ts +1 -1
  39. package/dist/observability.js +2 -2
  40. package/dist/{popover-DDv7J1Kl.js → popover-DL7fSPgH.js} +2 -2
  41. package/dist/{quick-config-panel-BPCRfqWI.js → quick-config-panel-nmIRDTFB.js} +3 -3
  42. package/dist/{run-list-links-eUhZB1ju.js → run-list-links-DZ8Q5l35.js} +1 -1
  43. package/dist/run-mode-BMxym0mD.js +82 -0
  44. package/dist/{schedule-panel-C1KwfLCE.js → schedule-panel-Bk5MJumG.js} +6 -6
  45. package/dist/settings.js +1 -1
  46. package/dist/{sidebar-node-editor-d9Rlq5pU.js → sidebar-node-editor-BnUjER8A.js} +3 -3
  47. package/dist/{template-code-dqRunGOv.js → template-code-CobAYaeH.js} +1 -1
  48. package/dist/templates.js +2 -2
  49. package/dist/{useAgentDefinitions-ZKX2N9aP.js → useAgentDefinitions-BmyWUoyo.js} +2 -2
  50. package/dist/{useDurableParity-BgLH_SCF.js → useDurableParity-AowXKgBZ.js} +1 -1
  51. package/dist/{useExecutions-Bm7q_UwN.js → useExecutions-BemEN_Zb.js} +2 -2
  52. package/dist/{useGlobalStoreClient-DMTrywdX.js → useGlobalStoreClient-BmjWfAjc.js} +1 -1
  53. package/dist/{useObservability-DPATdbw7.js → useObservability-BGrwZS5X.js} +1 -1
  54. package/dist/{useRunHistory-CGfjCsJ3.js → useRunHistory-GzyLco45.js} +2 -2
  55. package/dist/{useWorkflowCodeExport-D_mCuhKP.js → useWorkflowCodeExport-ej7y3Gi3.js} +3 -3
  56. package/dist/{useWorkflowProposal-Bh2_qjmM.js → useWorkflowProposal-UtJYycLv.js} +2 -2
  57. package/dist/{useWorkflows-aqVD7kGa.js → useWorkflows-DwDzP-AD.js} +2 -2
  58. package/dist/workflow-builder.d.ts +1 -1
  59. package/dist/workflow-builder.js +4 -4
  60. package/dist/{workflow-code-transfer-5C0HUzae.js → workflow-code-transfer-Dbnvw5fc.js} +1 -1
  61. package/dist/workflow-pages.d.ts +2 -2
  62. package/dist/workflow-pages.js +14 -14
  63. package/dist/workflows-list.js +1 -1
  64. package/package.json +1 -1
@@ -2148,6 +2148,24 @@ const WorkflowDefinitionsDocument = {
2148
2148
  "arguments": [],
2149
2149
  "directives": []
2150
2150
  },
2151
+ {
2152
+ "kind": "Field",
2153
+ "name": {
2154
+ "kind": "Name",
2155
+ "value": "executionMode"
2156
+ },
2157
+ "arguments": [],
2158
+ "directives": []
2159
+ },
2160
+ {
2161
+ "kind": "Field",
2162
+ "name": {
2163
+ "kind": "Name",
2164
+ "value": "autonomyLevel"
2165
+ },
2166
+ "arguments": [],
2167
+ "directives": []
2168
+ },
2151
2169
  {
2152
2170
  "kind": "Field",
2153
2171
  "name": {
@@ -1,22 +1,23 @@
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-aqVD7kGa.js";
4
- import { gt as createThenOpen, t as FluidGridsContext } from "./FluidGridsProvider-Dc_Jhtch.js";
5
- import { a as saveWorkflowDescription, c as CreateWorkflowRefusalDialog, o as visibleWorkflowDescription, r as commitWorkflowDescription, s as workflowDescriptionCharactersLeft, t as useExportWorkflowAs } from "./useWorkflowCodeExport-D_mCuhKP.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-DwDzP-AD.js";
4
+ import { gt as createThenOpen, t as FluidGridsContext } from "./FluidGridsProvider-BgP5c-hH.js";
5
+ import { a as saveWorkflowDescription, c as CreateWorkflowRefusalDialog, o as visibleWorkflowDescription, r as commitWorkflowDescription, s as workflowDescriptionCharactersLeft, t as useExportWorkflowAs } from "./useWorkflowCodeExport-ej7y3Gi3.js";
6
6
  import { c as isQuotaExhaustedFailure, t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
7
7
  import { M as useFlowStore } from "./node-operation-selection-Czeeb2D4.js";
8
8
  import { a as SdkPermissionGate, i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
9
- import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-wvu_-WJ-.js";
9
+ import { t as QuotaExhaustedDialog } from "./QuotaExhaustedDialog-BHZm4tQy.js";
10
10
  import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
11
- import { YF as WorkflowAccessFilter, rI as WorkflowExportFormat } from "./graphql-types-v6CTGwA0.js";
12
- import { a as assertImportByteSize, g as readProjectArchive, h as primaryImportModule, i as MAX_IMPORT_SOURCE_BYTES, l as importAcceptAttribute, n as ImportSourceError, r as MAX_IMPORT_ARCHIVE_BYTES, s as checkTypeScriptImport, t as CODE_EXPORT_FORMATS, u as importFileKind, v as typeScriptImportSource, x as workflowNameFromFile, y as typeScriptModuleFile } from "./workflow-code-transfer-5C0HUzae.js";
13
- import { i as canShareWorkflow, r as canEditWorkflow, t as WorkflowShareDialog } from "./WorkflowShareDialog-B7VOgr4-.js";
11
+ import { a as isExecutionMode, i as isAutonomyLevel, n as EXECUTION_MODES, o as useAutonomyLevelCopy, r as EXECUTION_MODE_ICONS, s as useExecutionModeCopy } from "./run-mode-BMxym0mD.js";
12
+ import { YF as WorkflowAccessFilter, aI as WorkflowExportFormat } from "./graphql-types-C5Tr6508.js";
13
+ import { a as assertImportByteSize, g as readProjectArchive, h as primaryImportModule, i as MAX_IMPORT_SOURCE_BYTES, l as importAcceptAttribute, n as ImportSourceError, r as MAX_IMPORT_ARCHIVE_BYTES, s as checkTypeScriptImport, t as CODE_EXPORT_FORMATS, u as importFileKind, v as typeScriptImportSource, x as workflowNameFromFile, y as typeScriptModuleFile } from "./workflow-code-transfer-Dbnvw5fc.js";
14
+ import { i as canShareWorkflow, r as canEditWorkflow, t as WorkflowShareDialog } from "./WorkflowShareDialog-BcfzZDOj.js";
14
15
  import { i as useOpenRequest, n as ACTION_PARAM_VALUES, r as useActionParam } from "./useActionParam-B0ebTZmg.js";
15
16
  import { d as useFluidGridsFlag, t as FLUIDGRIDS_FLAGS } from "./feature-flags-B_b8PJ6Z.js";
16
17
  import { n as downloadWorkflowExport, r as parseWorkflowImport } from "./workflow-transfer-CQnQC-ke.js";
17
18
  import { a as useWorkflowProjects, i as useWorkflowProjectActions, n as useWorkflowFolderActions, r as useWorkflowFolders, t as useBulkWorkflowActions } from "./useWorkflowOrganization-r5FWNBs6.js";
18
19
  import { t as describeOperationError } from "./errors-xPZ-IbQd.js";
19
- import { a as useExecutions } from "./useExecutions-Bm7q_UwN.js";
20
+ import { a as useExecutions } from "./useExecutions-BemEN_Zb.js";
20
21
  import { a as firstWorkflowProgress, i as builderPathFor, r as GUIDED_TOUR_STATE } from "./firstWorkflow-C_h0KMB2.js";
21
22
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
22
23
  import { i as workflowsListControls } from "./pageControlSpecs-DZJ9K37m.js";
@@ -110,6 +111,69 @@ function WorkflowStatusPill({ status }) {
110
111
  });
111
112
  }
112
113
 
114
+ // src/components/run-mode/WorkflowRunModeBadges.tsx
115
+ const BADGE_CLASS = "inline-flex shrink-0 items-center gap-1 rounded-full border border-border px-2 py-0.5 text-[11px] font-medium text-muted-foreground";
116
+ /**
117
+ * A workflow's run mode and, when the author chose one, its autonomy level (BOFF-9955), as two
118
+ * small badges with their explanation in a tooltip. Renders nothing for values it does not know
119
+ * (an older service that does not send them yet). Needs a TooltipProvider above it.
120
+ */
121
+ function WorkflowRunModeBadges({ executionMode, autonomyLevel, className }) {
122
+ const tr = useTr();
123
+ const modes = useExecutionModeCopy();
124
+ const levels = useAutonomyLevelCopy();
125
+ const mode = isExecutionMode(executionMode) ? executionMode : null;
126
+ const level = isAutonomyLevel(autonomyLevel) ? autonomyLevel : null;
127
+ if (!mode && !level) return null;
128
+ return /* @__PURE__ */ jsxs("div", {
129
+ className: cn("flex flex-wrap items-center gap-1", className),
130
+ children: [mode && /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
131
+ asChild: true,
132
+ children: /* @__PURE__ */ jsxs("span", {
133
+ className: BADGE_CLASS,
134
+ "data-testid": "workflow-run-mode-badge",
135
+ "data-mode": mode,
136
+ "aria-label": tr("fluidgrids.runMode.badgeAriaLabel", "Run mode: {{mode}}", { mode: modes[mode].label }),
137
+ children: [/* @__PURE__ */ jsx(Icon, {
138
+ icon: EXECUTION_MODE_ICONS[mode],
139
+ className: "size-3",
140
+ "aria-hidden": "true"
141
+ }), modes[mode].label]
142
+ })
143
+ }), /* @__PURE__ */ jsx(TooltipContent, {
144
+ side: "top",
145
+ children: /* @__PURE__ */ jsx("p", { children: modes[mode].hint })
146
+ })] }), level && /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
147
+ asChild: true,
148
+ children: /* @__PURE__ */ jsxs("span", {
149
+ className: BADGE_CLASS,
150
+ "data-testid": "workflow-autonomy-badge",
151
+ "data-level": level,
152
+ "aria-label": tr("fluidgrids.autonomy.badgeAriaLabel", "Autonomy level: {{level}}", { level: levels[level].label }),
153
+ children: [/* @__PURE__ */ jsx(Icon, {
154
+ icon: "mdi:shield-account-outline",
155
+ className: "size-3",
156
+ "aria-hidden": "true"
157
+ }), level]
158
+ })
159
+ }), /* @__PURE__ */ jsxs(TooltipContent, {
160
+ side: "top",
161
+ className: "max-w-xs",
162
+ children: [
163
+ /* @__PURE__ */ jsx("p", {
164
+ className: "font-medium",
165
+ children: levels[level].label
166
+ }),
167
+ /* @__PURE__ */ jsx("p", { children: levels[level].hint }),
168
+ /* @__PURE__ */ jsx("p", {
169
+ className: "mt-1 text-[11px] opacity-80",
170
+ children: tr("fluidgrids.autonomy.notEnforcedYet", "Recorded only for now: agent approvals do not follow this level yet.")
171
+ })
172
+ ]
173
+ })] })]
174
+ });
175
+ }
176
+
113
177
  // src/builder/components/ui/workflow-export-menu.tsx
114
178
  /**
115
179
  * The workflow card's Export menu with code-first on (BOFF-9904, spec 07 §8):
@@ -301,6 +365,11 @@ const CardWorkflow = ({ workflow, onUpdateSuccess, onExport, onExportAs, exporti
301
365
  title: description || void 0,
302
366
  children: description || tr("fluidgrids.builder.cardWorkflow.noDescription", "No description")
303
367
  }),
368
+ /* @__PURE__ */ jsx(WorkflowRunModeBadges, {
369
+ executionMode: workflow.execution_mode,
370
+ autonomyLevel: workflow.autonomy_level,
371
+ className: "mt-2"
372
+ }),
304
373
  workflow.tags && workflow.tags.length > 0 && /* @__PURE__ */ jsxs("div", {
305
374
  className: "mt-2 flex flex-wrap items-center gap-1",
306
375
  children: [workflow.tags.slice(0, 3).map((tag) => /* @__PURE__ */ jsx(TagBadge, {
@@ -1836,6 +1905,7 @@ function DescriptionForm({ workflow, onClose, onSaved }) {
1836
1905
  * ?access=mine | shared (absent or "all" = every visible workflow)
1837
1906
  * ?status=active | draft | archived | deprecated (absent = any status)
1838
1907
  * ?folder=<folder id> (absent = all folders)
1908
+ * ?mode=deterministic | agentic | hybrid (absent = any run mode, BOFF-9955)
1839
1909
  *
1840
1910
  * Unknown values fall back to the default rather than erroring. Writes use
1841
1911
  * history replace, so toggling chips does not flood the back stack, and a
@@ -1844,7 +1914,8 @@ function DescriptionForm({ workflow, onClose, onSaved }) {
1844
1914
  const WORKFLOWS_LIST_PARAMS = {
1845
1915
  access: "access",
1846
1916
  status: "status",
1847
- folder: "folder"
1917
+ folder: "folder",
1918
+ mode: "mode"
1848
1919
  };
1849
1920
  /** The workflow statuses the list's status chips offer. */
1850
1921
  const WORKFLOW_LIST_STATUSES = [
@@ -1888,6 +1959,15 @@ function folderFromParam(value) {
1888
1959
  const trimmed = value?.trim();
1889
1960
  return trimmed ? trimmed : null;
1890
1961
  }
1962
+ /** `agentic` / `AGENTIC` → AGENTIC (BOFF-9955); anything unknown → no filter. */
1963
+ function modeFromParam(value) {
1964
+ if (!value) return null;
1965
+ const upper = value.trim().toUpperCase();
1966
+ return isExecutionMode(upper) ? upper : null;
1967
+ }
1968
+ function modeToParam(mode) {
1969
+ return mode ? mode.toLowerCase() : null;
1970
+ }
1891
1971
  /**
1892
1972
  * Applies a filter patch to a copy of `params`. Keys missing from the patch
1893
1973
  * are left untouched; default values delete their parameter. Unrelated
@@ -1902,6 +1982,7 @@ function applyFilterPatch(params, patch) {
1902
1982
  if (patch.access !== void 0) write(WORKFLOWS_LIST_PARAMS.access, accessToParam(patch.access));
1903
1983
  if (patch.status !== void 0) write(WORKFLOWS_LIST_PARAMS.status, statusToParam(patch.status));
1904
1984
  if (patch.folder !== void 0) write(WORKFLOWS_LIST_PARAMS.folder, folderFromParam(patch.folder));
1985
+ if (patch.mode !== void 0) write(WORKFLOWS_LIST_PARAMS.mode, modeToParam(patch.mode));
1905
1986
  return next;
1906
1987
  }
1907
1988
  function useWorkflowsListUrlState() {
@@ -1909,6 +1990,7 @@ function useWorkflowsListUrlState() {
1909
1990
  const access = accessFromParam(searchParams.get(WORKFLOWS_LIST_PARAMS.access));
1910
1991
  const status = statusFromParam(searchParams.get(WORKFLOWS_LIST_PARAMS.status));
1911
1992
  const folder = folderFromParam(searchParams.get(WORKFLOWS_LIST_PARAMS.folder));
1993
+ const mode = modeFromParam(searchParams.get(WORKFLOWS_LIST_PARAMS.mode));
1912
1994
  const update = useCallback((patch) => {
1913
1995
  setSearchParams((prev) => applyFilterPatch(prev, patch), { replace: true });
1914
1996
  }, [setSearchParams]);
@@ -1916,14 +1998,17 @@ function useWorkflowsListUrlState() {
1916
1998
  access,
1917
1999
  status,
1918
2000
  folder,
2001
+ mode,
1919
2002
  update,
1920
2003
  setAccess: (next) => update({ access: next }),
1921
2004
  setStatus: (next) => update({ status: next }),
1922
- setFolder: (next) => update({ folder: next })
2005
+ setFolder: (next) => update({ folder: next }),
2006
+ setMode: (next) => update({ mode: next })
1923
2007
  }), [
1924
2008
  access,
1925
2009
  status,
1926
2010
  folder,
2011
+ mode,
1927
2012
  update
1928
2013
  ]);
1929
2014
  }
@@ -1991,16 +2076,18 @@ function WorkflowsList() {
1991
2076
  const ACCESS_FILTERS = useAccessFilters();
1992
2077
  const workspaceId = useContext(FluidGridsContext)?.workspaceId ?? "";
1993
2078
  const urlFilters = useWorkflowsListUrlState();
1994
- const { access: accessFilter, status: statusFilter, folder: folderFilter, setAccess: setAccessFilter, setStatus: setStatusFilter, setFolder: setFolderFilter } = urlFilters;
2079
+ const { access: accessFilter, status: statusFilter, folder: folderFilter, mode: modeFilter, setAccess: setAccessFilter, setStatus: setStatusFilter, setFolder: setFolderFilter, setMode: setModeFilter } = urlFilters;
2080
+ const modeCopy = useExecutionModeCopy();
1995
2081
  const { workflows, loading, error, tagsByKey, refetch } = useWorkflowDefinitions({
1996
2082
  limit: 100,
1997
2083
  latestOnly: true,
1998
- ...accessFilter === "ALL" ? {} : { access: accessFilter }
2084
+ ...accessFilter === "ALL" ? {} : { access: accessFilter },
2085
+ ...modeFilter ? { executionMode: modeFilter } : {}
1999
2086
  });
2000
2087
  const [sharing, setSharing] = useState(null);
2001
2088
  const [moving, setMoving] = useState(null);
2002
2089
  const [describing, setDescribing] = useState(null);
2003
- const filteredByAccess = accessFilter !== "ALL";
2090
+ const filteredOnServer = accessFilter !== "ALL" || modeFilter !== null;
2004
2091
  const { getWorkflow } = useLazyWorkflowDefinition();
2005
2092
  const createPermission = useFluidGridsPermission(FLUIDGRIDS_PERMISSIONS.WORKFLOW_CREATE);
2006
2093
  const canCreate = createPermission.allowed;
@@ -2197,7 +2284,7 @@ function WorkflowsList() {
2197
2284
  workflows,
2198
2285
  canCreate
2199
2286
  }),
2200
- !loading && !error && (workflows.length > 0 || filteredByAccess) && /* @__PURE__ */ jsxs("div", {
2287
+ !loading && !error && (workflows.length > 0 || filteredOnServer) && /* @__PURE__ */ jsxs("div", {
2201
2288
  className: "flex flex-wrap items-center gap-3",
2202
2289
  "data-tour": "fluidgrids-list-toolbar",
2203
2290
  children: [
@@ -2231,6 +2318,30 @@ function WorkflowsList() {
2231
2318
  children: option.label
2232
2319
  }, option.value))
2233
2320
  }),
2321
+ /* @__PURE__ */ jsxs("div", {
2322
+ className: "flex flex-wrap items-center gap-1.5",
2323
+ role: "group",
2324
+ "aria-label": tr("fluidgrids.workflowsList.mode.label", "Run mode"),
2325
+ "data-testid": "workflow-mode-filter",
2326
+ children: [/* @__PURE__ */ jsx("button", {
2327
+ type: "button",
2328
+ "aria-pressed": modeFilter === null,
2329
+ onClick: () => setModeFilter(null),
2330
+ className: cn("rounded-full border px-3 py-1 text-xs font-medium transition-colors", modeFilter === null ? "border-transparent bg-primary text-primary-foreground" : "border-border bg-card text-muted-foreground hover:text-foreground"),
2331
+ children: tr("fluidgrids.workflowsList.mode.all", "Any mode")
2332
+ }), EXECUTION_MODES.map((mode) => /* @__PURE__ */ jsxs("button", {
2333
+ type: "button",
2334
+ "aria-pressed": modeFilter === mode,
2335
+ title: modeCopy[mode].hint,
2336
+ onClick: () => setModeFilter(modeFilter === mode ? null : mode),
2337
+ className: cn("inline-flex items-center gap-1 rounded-full border px-3 py-1 text-xs font-medium transition-colors", modeFilter === mode ? "border-transparent bg-primary text-primary-foreground" : "border-border bg-card text-muted-foreground hover:text-foreground"),
2338
+ children: [/* @__PURE__ */ jsx(Icon, {
2339
+ icon: EXECUTION_MODE_ICONS[mode],
2340
+ className: "size-3.5",
2341
+ "aria-hidden": "true"
2342
+ }), modeCopy[mode].label]
2343
+ }, mode))]
2344
+ }),
2234
2345
  /* @__PURE__ */ jsxs(Button, {
2235
2346
  variant: selectMode ? "secondary" : "outline",
2236
2347
  size: "sm",
@@ -2306,7 +2417,7 @@ function WorkflowsList() {
2306
2417
  })
2307
2418
  ]
2308
2419
  })
2309
- }) : workflows.length === 0 && !filteredByAccess ? /* @__PURE__ */ jsx("div", {
2420
+ }) : workflows.length === 0 && !filteredOnServer ? /* @__PURE__ */ jsx("div", {
2310
2421
  className: "grid flex-1 place-items-center",
2311
2422
  children: /* @__PURE__ */ jsx(IllustratedEmptyState, {
2312
2423
  illustration: "onboarding",
@@ -2370,7 +2481,9 @@ function WorkflowsList() {
2370
2481
  color: a.tagInfo?.color ?? void 0
2371
2482
  })),
2372
2483
  visibility: workflow.visibility ?? void 0,
2373
- my_access: workflow.myAccess ?? null
2484
+ my_access: workflow.myAccess ?? null,
2485
+ execution_mode: workflow.executionMode ?? null,
2486
+ autonomy_level: workflow.autonomyLevel ?? null
2374
2487
  },
2375
2488
  onUpdateSuccess: () => refetch(),
2376
2489
  onShare: () => setSharing({
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { E as createConfiguredNode, F as nodeTitle, L as paramsFromOperation, N as fixedParameterState, R as selectedOperationOf, _ as registryNodeData, f as isNodeConfigsInitialized, nt as autosaveAllowedFor, o as NODE_CONFIGS, ut as isFlowComplete, w as SENSITIVE_PARAM, yt as useSaveStatusStore } from "./FluidGridsProvider-Dc_Jhtch.js";
2
+ import { E as createConfiguredNode, F as nodeTitle, L as paramsFromOperation, N as fixedParameterState, R as selectedOperationOf, _ as registryNodeData, f as isNodeConfigsInitialized, nt as autosaveAllowedFor, o as NODE_CONFIGS, ut as isFlowComplete, w as SENSITIVE_PARAM, yt as useSaveStatusStore } from "./FluidGridsProvider-BgP5c-hH.js";
3
3
  import { M as useFlowStore, T as resolveOutputHandles, w as resolveInputHandles } from "./node-operation-selection-Czeeb2D4.js";
4
4
  import { o as isNodeTypeHiddenFromPalette } from "./durable-nodes-DXCCQYWD.js";
5
5
  import { t as computeAttachPosition } from "./attach-node-helpers-CNsYtLOR.js";
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { Sw as OptimisationKind, xw as OptimisationDismissReason } from "./graphql-types-v6CTGwA0.js";
2
+ import { Sw as OptimisationKind, xw as OptimisationDismissReason } from "./graphql-types-C5Tr6508.js";
3
3
 
4
4
  // src/modules/observability/optimisation.ts
5
5
  /** The look-back window the detectors use when the evidence does not say. */
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { jI as WorkflowTestAssertionOperator } from "./graphql-types-v6CTGwA0.js";
2
+ import { NI as WorkflowTestAssertionOperator } from "./graphql-types-C5Tr6508.js";
3
3
 
4
4
  // src/builder/lib/assert-rules.ts
5
5
  /** Every operator, in the order the editors offer them. */
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { n as useAgentMarksStore, r as toPlainText } from "./marksStore-DGCXjTmZ.js";
3
- import { F as nodeTitle, L as paramsFromOperation, R as selectedOperationOf } from "./FluidGridsProvider-Dc_Jhtch.js";
3
+ import { F as nodeTitle, L as paramsFromOperation, R as selectedOperationOf } from "./FluidGridsProvider-BgP5c-hH.js";
4
4
  import { M as useFlowStore } from "./node-operation-selection-Czeeb2D4.js";
5
5
  import { t as notesKeyOf } from "./notesKey-5EaREBGA.js";
6
6
  import { AgentToolError, defineAgentTool } from "@burdenoff/fe-libs/shared/agent-tools";
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as ExecutionsListPage } from "./ExecutionsListPage--4BthM8L.js";
3
- import { t as ExecutionDetailPage } from "./ExecutionDetailPage-BXDF2eoT.js";
2
+ import { t as ExecutionsListPage } from "./ExecutionsListPage-LsqVMwck.js";
3
+ import { t as ExecutionDetailPage } from "./ExecutionDetailPage-D1E_Rf3U.js";
4
4
 
5
5
  export { ExecutionDetailPage, ExecutionsListPage };
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { A as NodeTypeIcon, F as isTriggerOperation, M as useFlowStore, N as useIsValidConnection, j as isImageIcon, r as CODE_WORKFLOW_NODE_TYPE } from "./node-operation-selection-Czeeb2D4.js";
3
- import { A as workflowParameterIssues, At as shouldReleaseForIdle, Bt as AUTOSAVE_RETRY_DELAYS_MS, Ct as bannerOf, D as useInsertNode, Dt as phaseAfterAcquire, Et as leaseCallSequence, Ft as sessionBeforeReload, Gt as resettledBaseline, In as getNodeDetail, It as rememberOwnStatusChange, Jt as useNodeExecution, Kt as saveFailureActionOf, Ln as buildStickyNode, Lt as rememberRevision, Mt as EDIT_SESSION_ID, Nt as forgetSessionForReload, O as MissingParametersDialog, Ot as phaseAfterTakeOver, Pt as rememberSessionForReload, Rn as loadMarkdown, Rt as revisionOf, St as useEditLeaseStore, T as buildOperationSeed, Tt as leaseCallQueue, Vt as canAutosave, Wt as inAppLeaveTarget, _t as refusalOfQuota, a as NODES_METADATA, at as editingLeaseLocked, bt as workflowSaveQueue, ct as touchesSavedFields, dt as useFlowValidator, et as useGuardedNavigate, f as isNodeConfigsInitialized, ft as useSaveWorkflow, g as registerWorkflowNodeTypes, i as AVAILABLE_NODES, it as editStateFor, jt as tickAction, k as useRunGuard, kt as releasesOnClose, l as ensureNodeConfigsLoaded, ln as loadDefinitionJson, lt as watchLeavingLosesChanges, m as refetchStoreNodes, nt as autosaveAllowedFor, o as NODE_CONFIGS, on as useCanvasEdges, ot as leavingLosesChanges, p as onNodeTypesUpdate, qt as workflowFingerprint, rt as departingSave, s as NODE_TYPES, sn as useNodeRegistryRevision, st as savedEverythingBeforeLeaving, t as FluidGridsContext, tt as useManualSave, ut as isFlowComplete, v as scheduleNodePaletteLoad, vt as saveIndicatorOf, wt as isLocked, x as getNodeMetadata, xt as useEditLeaseLocked, yt as useSaveStatusStore, zn as useMarkdownRenderer, zt as AUTOSAVE_DEBOUNCE_MS } from "./FluidGridsProvider-Dc_Jhtch.js";
3
+ import { A as workflowParameterIssues, At as shouldReleaseForIdle, Bt as AUTOSAVE_RETRY_DELAYS_MS, Ct as bannerOf, D as useInsertNode, Dt as phaseAfterAcquire, Et as leaseCallSequence, Ft as sessionBeforeReload, Gt as resettledBaseline, In as getNodeDetail, It as rememberOwnStatusChange, Jt as useNodeExecution, Kt as saveFailureActionOf, Ln as buildStickyNode, Lt as rememberRevision, Mt as EDIT_SESSION_ID, Nt as forgetSessionForReload, O as MissingParametersDialog, Ot as phaseAfterTakeOver, Pt as rememberSessionForReload, Rn as loadMarkdown, Rt as revisionOf, St as useEditLeaseStore, T as buildOperationSeed, Tt as leaseCallQueue, Vt as canAutosave, Wt as inAppLeaveTarget, _t as refusalOfQuota, a as NODES_METADATA, at as editingLeaseLocked, bt as workflowSaveQueue, ct as touchesSavedFields, dt as useFlowValidator, et as useGuardedNavigate, f as isNodeConfigsInitialized, ft as useSaveWorkflow, g as registerWorkflowNodeTypes, i as AVAILABLE_NODES, it as editStateFor, jt as tickAction, k as useRunGuard, kt as releasesOnClose, l as ensureNodeConfigsLoaded, ln as loadDefinitionJson, lt as watchLeavingLosesChanges, m as refetchStoreNodes, nt as autosaveAllowedFor, o as NODE_CONFIGS, on as useCanvasEdges, ot as leavingLosesChanges, p as onNodeTypesUpdate, qt as workflowFingerprint, rt as departingSave, s as NODE_TYPES, sn as useNodeRegistryRevision, st as savedEverythingBeforeLeaving, t as FluidGridsContext, tt as useManualSave, ut as isFlowComplete, v as scheduleNodePaletteLoad, vt as saveIndicatorOf, wt as isLocked, x as getNodeMetadata, xt as useEditLeaseLocked, yt as useSaveStatusStore, zn as useMarkdownRenderer, zt as AUTOSAVE_DEBOUNCE_MS } from "./FluidGridsProvider-BgP5c-hH.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 { t as Input$1 } from "./input-ChT6Q-Pr.js";
7
- import { t as useGlobalStoreClient } from "./useGlobalStoreClient-DMTrywdX.js";
7
+ import { t as useGlobalStoreClient } from "./useGlobalStoreClient-BmjWfAjc.js";
8
8
  import { r as getFluidGridsConfig } from "./config-X97zrIvn.js";
9
- import { _ as useInstalledNodes, d as getStoreNodeAvailability, f as getStoreNodeIcon, g as storeNodeInstallVersion, h as storeNodeDisplayVersion, i as useTemplateImportFlow, l as useWorkflowTemplates, m as isStoreNodeUpdateAvailable, p as getStoreNodeType, t as TemplateCard, u as filterStoreNodesForPalette } from "./TemplateCard-BA_9em22.js";
9
+ import { _ as useInstalledNodes, d as getStoreNodeAvailability, f as getStoreNodeIcon, g as storeNodeInstallVersion, h as storeNodeDisplayVersion, i as useTemplateImportFlow, l as useWorkflowTemplates, m as isStoreNodeUpdateAvailable, p as getStoreNodeType, t as TemplateCard, u as filterStoreNodesForPalette } from "./TemplateCard-trfaDJLe.js";
10
10
  import { _ as useWorkflowTestsEnabled, d as useFluidGridsFlag, h as usePhaseDFlags, l as useDurableFunctionNodesEnabled, p as usePaletteGates, t as FLUIDGRIDS_FLAGS, u as useDurableParityEnabled } from "./feature-flags-B_b8PJ6Z.js";
11
11
  import { i as filterPaletteNodes } from "./durable-nodes-DXCCQYWD.js";
12
12
  import { c as NODE_TYPE_DRAG_DATA_FORMAT, l as STICKY_NOTE_TYPE, s as NODE_OPERATION_DRAG_DATA_FORMAT } from "./sticky-notes-23j-wL6Q.js";
@@ -24,25 +24,25 @@ import { i as emitFluidGridsEvent } from "./token-refresh-link-BjN7H4qA.js";
24
24
  import { n as useBuilderReadOnly, t as BuilderReadOnlyProvider } from "./read-only-context-Dt9N9SIG.js";
25
25
  import { r as MAPPING_TYPE_COLORS, t as MAPPING_COMPATIBILITY_COLORS } from "./mapping-colors-BIX_YeCQ.js";
26
26
  import { n as LogsPanel } from "./logs-panel-DtG93ocy.js";
27
- import { c as emptyTestCaseDraft, d as nextSortOrder, f as pinnedOutputsFromCanvas, g as useAgentTokenStream, h as testStatusTone, i as TEST_STATUS_TONE_CLASS, l as enabledCaseIds, m as testStatusLabel, o as draftFromTestCase, p as testRunSummaryText, r as useWorkflowTests, s as draftToInput, t as useWorkflowProposal, u as isTestRunOpen, y as latestAgentTokenStream } from "./useWorkflowProposal-Bh2_qjmM.js";
28
- import { r as useExecutionActions } from "./useExecutions-Bm7q_UwN.js";
27
+ import { c as emptyTestCaseDraft, d as nextSortOrder, f as pinnedOutputsFromCanvas, g as useAgentTokenStream, h as testStatusTone, i as TEST_STATUS_TONE_CLASS, l as enabledCaseIds, m as testStatusLabel, o as draftFromTestCase, p as testRunSummaryText, r as useWorkflowTests, s as draftToInput, t as useWorkflowProposal, u as isTestRunOpen, y as latestAgentTokenStream } from "./useWorkflowProposal-UtJYycLv.js";
28
+ import { r as useExecutionActions } from "./useExecutions-BemEN_Zb.js";
29
29
  import { n as useAgentMarksStore } from "./marksStore-DGCXjTmZ.js";
30
30
  import { t as notesKeyOf } from "./notesKey-5EaREBGA.js";
31
- import { a as saveWorkflowDescription, c as CreateWorkflowRefusalDialog, i as normalizeWorkflowDescription, n as useWorkflowCodeExport, o as visibleWorkflowDescription, r as commitWorkflowDescription, s as workflowDescriptionCharactersLeft } from "./useWorkflowCodeExport-D_mCuhKP.js";
31
+ import { a as saveWorkflowDescription, c as CreateWorkflowRefusalDialog, i as normalizeWorkflowDescription, n as useWorkflowCodeExport, o as visibleWorkflowDescription, r as commitWorkflowDescription, s as workflowDescriptionCharactersLeft } from "./useWorkflowCodeExport-ej7y3Gi3.js";
32
32
  import { r as RUNS_QUOTA_NAME, t as BILLING_PLANS_PATH } from "./quota-Cdt8yz7N.js";
33
33
  import { t as EntityTagPicker } from "./EntityTagPicker-BppBSEJk.js";
34
34
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-JxkBpOeb.js";
35
35
  import { n as runsQuotaLevel, t as readRunsQuota } from "./runsQuota-DvXR6mRN.js";
36
36
  import { a as SdkPermissionGate, i as SdkPermissionButton, s as useFluidGridsPermission, t as FLUIDGRIDS_PERMISSIONS } from "./constants-dcxg6zG6.js";
37
- import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-aqVD7kGa.js";
37
+ import { a as useDeactivateWorkflow, d as useRestoreWorkflowVersion, o as useDeleteWorkflow, t as useActivateWorkflow, v as useWorkflowVersions } from "./useWorkflows-DwDzP-AD.js";
38
38
  import { t as WorkflowDefinitionDocument } from "./WorkflowDefinitionDocument-DZLbTPUZ.js";
39
39
  import { o as countLifecycle, t as VersionLifecycleBar } from "./VersionLifecycleBar-DuphLOT0.js";
40
- import { $P as VersioningBehavior, Eu as DrainageStatus, MI as WorkflowTestExpectedStatus, jo as CodeReplaceStatus, nI as WorkflowEnvironment, rI as WorkflowExportFormat } from "./graphql-types-v6CTGwA0.js";
40
+ import { $P as VersioningBehavior, Eu as DrainageStatus, PI as WorkflowTestExpectedStatus, aI as WorkflowExportFormat, jo as CodeReplaceStatus, rI as WorkflowEnvironment } from "./graphql-types-C5Tr6508.js";
41
41
  import { t as buildNodeDisplayMap } from "./run-display-BycKYSU0.js";
42
42
  import { n as useRequestedProposal } from "./useRequestedProposal-B7uPXfZB.js";
43
43
  import { t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
44
44
  import { t as downloadBlob } from "./workflow-transfer-CQnQC-ke.js";
45
- import { _ as sortFidelityItems, c as fileBaseName, d as isLosslessReport, f as isLossyFidelityItem, m as orderedExportFiles, o as buildExportDownload, p as lineOfNode } from "./workflow-code-transfer-5C0HUzae.js";
45
+ import { _ as sortFidelityItems, c as fileBaseName, d as isLosslessReport, f as isLossyFidelityItem, m as orderedExportFiles, o as buildExportDownload, p as lineOfNode } from "./workflow-code-transfer-Dbnvw5fc.js";
46
46
  import { Suspense, lazy, useCallback, useContext, useDeferredValue, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
47
47
  import { Link, useNavigate, useParams } from "react-router";
48
48
  import { useMutation, useQuery } from "@apollo/client/react";
@@ -6683,10 +6683,10 @@ function IntroductionPropertyPanel() {
6683
6683
  * waiting for its chunk and React's Suspense throttle (about 0.5 s on first
6684
6684
  * open even with the chunk cached).
6685
6685
  */
6686
- const NodeDetailViewOverlay = preloadableLazy(() => import("./node-detail-view-BKI_2kM6.js").then((m) => m.NodeDetailView), "NodeDetailView");
6687
- const QuickConfigPanelOverlay = preloadableLazy(() => import("./quick-config-panel-BPCRfqWI.js").then((m) => m.QuickConfigPanel), "QuickConfigPanel");
6688
- const SidebarNodeEditorOverlay = preloadableLazy(() => import("./sidebar-node-editor-d9Rlq5pU.js").then((m) => m.SidebarNodeEditor), "SidebarNodeEditor");
6689
- const WorkflowShareDialogOverlay = preloadableLazy(() => import("./WorkflowShareDialog-B7VOgr4-.js").then((n) => n.n).then((m) => m.WorkflowShareDialog), "WorkflowShareDialog");
6686
+ const NodeDetailViewOverlay = preloadableLazy(() => import("./node-detail-view-BgmxkGJe.js").then((m) => m.NodeDetailView), "NodeDetailView");
6687
+ const QuickConfigPanelOverlay = preloadableLazy(() => import("./quick-config-panel-nmIRDTFB.js").then((m) => m.QuickConfigPanel), "QuickConfigPanel");
6688
+ const SidebarNodeEditorOverlay = preloadableLazy(() => import("./sidebar-node-editor-BnUjER8A.js").then((m) => m.SidebarNodeEditor), "SidebarNodeEditor");
6689
+ const WorkflowShareDialogOverlay = preloadableLazy(() => import("./WorkflowShareDialog-BcfzZDOj.js").then((n) => n.n).then((m) => m.WorkflowShareDialog), "WorkflowShareDialog");
6690
6690
  const ConnectionFormDialogOverlay = preloadableLazy(() => import("./ConnectionFormDialog-Dr1-CTan.js").then((n) => n.n).then((m) => m.ConnectionFormDialog), "ConnectionFormDialog");
6691
6691
  const EdgeMapperOverlay = preloadableLazy(() => import("./app-BJUvugPM.js").then((m) => m.default), "EdgeMapper");
6692
6692
  const EdgeConditionBuilderOverlay = preloadableLazy(() => import("./conditionBuilder-D8aLGL1w.js").then((m) => m.default), "EdgeConditionBuilder");
@@ -11783,6 +11783,10 @@ function usePanelResize(initialHeight) {
11783
11783
 
11784
11784
  // src/builder/components/flow-builder/components/chat-panel/chat-reply.ts
11785
11785
  const AI_AGENT_NODE_TYPE = "store/ai-agent";
11786
+ /** The node's output is still being read (absent state: loaded). */
11787
+ function outputLoading(log) {
11788
+ return !log.output && log.outputState === "loading";
11789
+ }
11786
11790
  /** The streamed text to show, marking a reply whose start never arrived. */
11787
11791
  function streamedText(stream) {
11788
11792
  if (!stream?.text) return "";
@@ -11828,11 +11832,29 @@ function resolveChatReply({ runLogs, isExecutionRunning, liveText, texts }) {
11828
11832
  if (runLogs.length === 0) return null;
11829
11833
  const agentLog = runLogs.find((log) => log.nodeType === "store/ai-agent" && (log.status === "completed" || log.status === "failed"));
11830
11834
  if (agentLog) {
11831
- if (agentLog.status === "completed" && agentLog.output) return {
11832
- kind: "complete",
11833
- content: agentResponse(agentLog.output) ?? (liveText || outputText(agentLog.output)),
11834
- duration: agentLog.duration ? `${Number(agentLog.duration).toFixed(1)}s` : void 0
11835
- };
11835
+ if (agentLog.status === "completed") {
11836
+ if (outputLoading(agentLog)) return null;
11837
+ const duration = agentLog.duration ? `${Number(agentLog.duration).toFixed(1)}s` : void 0;
11838
+ if (agentLog.output) return {
11839
+ kind: "complete",
11840
+ content: agentResponse(agentLog.output) ?? (liveText || outputText(agentLog.output)),
11841
+ duration
11842
+ };
11843
+ if (liveText) return {
11844
+ kind: "complete",
11845
+ content: liveText,
11846
+ duration
11847
+ };
11848
+ return agentLog.outputState === "unavailable" ? {
11849
+ kind: "error",
11850
+ content: "",
11851
+ error: texts.outputUnavailable
11852
+ } : {
11853
+ kind: "complete",
11854
+ content: texts.noOutput,
11855
+ duration
11856
+ };
11857
+ }
11836
11858
  return {
11837
11859
  kind: "error",
11838
11860
  content: liveText,
@@ -11851,7 +11873,7 @@ function resolveChatReply({ runLogs, isExecutionRunning, liveText, texts }) {
11851
11873
  content: liveText
11852
11874
  };
11853
11875
  const lastCompleted = runLogs.filter((log) => log.status === "completed").at(-1);
11854
- if (!lastCompleted) return null;
11876
+ if (!lastCompleted || outputLoading(lastCompleted)) return null;
11855
11877
  return {
11856
11878
  kind: "complete",
11857
11879
  content: lastCompleted.output ? outputText(lastCompleted.output) : texts.noOutput
@@ -11933,7 +11955,8 @@ function chatReplyTexts(tr) {
11933
11955
  return {
11934
11956
  agentFailed: tr("fluidgrids.builder.chatPanel.agentFailed", "The AI Agent failed"),
11935
11957
  workflowFailed: tr("fluidgrids.builder.chatPanel.workflowFailed", "The workflow failed"),
11936
- noOutput: tr("fluidgrids.builder.chatPanel.noOutputMessage", "Workflow completed with no output")
11958
+ noOutput: tr("fluidgrids.builder.chatPanel.noOutputMessage", "Workflow completed with no output"),
11959
+ outputUnavailable: tr("fluidgrids.builder.chatPanel.outputUnavailable", "The AI Agent finished, but its reply could not be loaded. Open the run to see it.")
11937
11960
  };
11938
11961
  }
11939
11962
  /**
@@ -19319,7 +19342,7 @@ const FlowBuilder = ({ readOnly = false, fitToScreen = false }) => {
19319
19342
  paletteGatesRef.current = paletteGates;
19320
19343
  }, [paletteGates]);
19321
19344
  useWarmBuilderOverlays();
19322
- useLazyAgentTools(() => import("./agentTools-DTXUqtfu.js").then(({ createBuilderAgentTools }) => createBuilderAgentTools({ durableFunctionsEnabled: () => paletteGatesRef.current })), !editingBlocked, "Agent tools");
19345
+ useLazyAgentTools(() => import("./agentTools-7CFfwySg.js").then(({ createBuilderAgentTools }) => createBuilderAgentTools({ durableFunctionsEnabled: () => paletteGatesRef.current })), !editingBlocked, "Agent tools");
19323
19346
  const [nodes, edges, onNodesChange, onEdgesChange, onConnect] = useFlowStore(useShallow((s) => {
19324
19347
  return [
19325
19348
  s.workflow.nodes,
@@ -19361,7 +19384,7 @@ const FlowBuilder = ({ readOnly = false, fitToScreen = false }) => {
19361
19384
  useEffect(() => {
19362
19385
  fitViewRef.current = fitView;
19363
19386
  }, [fitView]);
19364
- useLazyAgentTools(() => import("./canvasNoteTools-DmfZwtnL.js").then(({ createCanvasNoteTools }) => createCanvasNoteTools({ focusNode: (nodeId) => fitViewRef.current({
19387
+ useLazyAgentTools(() => import("./canvasNoteTools-BikeF-pN.js").then(({ createCanvasNoteTools }) => createCanvasNoteTools({ focusNode: (nodeId) => fitViewRef.current({
19365
19388
  nodes: [{ id: nodeId }],
19366
19389
  duration: 400,
19367
19390
  padding: .6,