@burdenoff/fluidgrids-fe-sdk 2026.1029.5 → 2026.1029.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/ExecutionDetailPage-L7LZYFOT.js +22 -0
  2. package/dist/{WorkflowsList-2OYIXGWQ.js → ExecutionsListPage-7NMW6S5A.js} +9 -9
  3. package/dist/{WorkflowBuilder-EVZGOXZZ.js → WorkflowBuilder-RXVUBDZJ.js} +12 -12
  4. package/dist/{ExecutionsListPage-KC3KRBNS.js → WorkflowsList-5U74DYQ3.js} +9 -8
  5. package/dist/{chunk-5ITN7CKS.js → chunk-4MHWFZJV.js} +1 -1
  6. package/dist/{chunk-CY6KX4RG.js → chunk-6AMNEX2Y.js} +6 -1
  7. package/dist/{chunk-XRHZ3IEL.js → chunk-6SZXW2BF.js} +255 -8
  8. package/dist/{chunk-U6KI4AKI.js → chunk-6TMLIQHB.js} +199 -1
  9. package/dist/{chunk-EAJB5BNF.js → chunk-7CTIVBBA.js} +183 -26
  10. package/dist/{chunk-UZMLMPFJ.js → chunk-AXMEATLG.js} +117 -8
  11. package/dist/{chunk-NM5L7MBJ.js → chunk-BZTVAUOQ.js} +3 -3
  12. package/dist/{chunk-X3LQJLV7.js → chunk-DEGCZCHP.js} +2 -2
  13. package/dist/{chunk-WDTO6ATM.js → chunk-E7UAY3JJ.js} +2 -2
  14. package/dist/{chunk-O24MDGZY.js → chunk-EGIEFGOV.js} +677 -43
  15. package/dist/{chunk-LGGHQ7UE.js → chunk-FFOZ5VUJ.js} +1 -1
  16. package/dist/{chunk-6Y6I2ODM.js → chunk-HAFUSBYP.js} +937 -26
  17. package/dist/{chunk-ZDFDC5YW.js → chunk-IDGDMJMJ.js} +118 -96
  18. package/dist/{chunk-2U56452G.js → chunk-K4BF7PAW.js} +125 -89
  19. package/dist/{chunk-MNPZMFLF.js → chunk-KANARCPR.js} +3 -3
  20. package/dist/{chunk-5GD6OXYW.js → chunk-LAVHDFHI.js} +1 -1
  21. package/dist/{chunk-35SQULD5.js → chunk-NL4JQFFA.js} +1 -1
  22. package/dist/{chunk-SRE2JVSJ.js → chunk-OJPJ2QXD.js} +3 -3
  23. package/dist/{chunk-JUA57OVN.js → chunk-RZR3BDDZ.js} +7 -7
  24. package/dist/{chunk-DASEJQ4G.js → chunk-SZTKLZZR.js} +145 -8
  25. package/dist/{chunk-LB62TAF7.js → chunk-TYYSYSAL.js} +1 -1
  26. package/dist/{chunk-VYH65RLH.js → chunk-US4LPOB3.js} +1 -1
  27. package/dist/{chunk-XTXT4NHE.js → chunk-VIZ7W5WJ.js} +5 -5
  28. package/dist/{chunk-7PP6CRXS.js → chunk-YTUIGIVP.js} +15 -1
  29. package/dist/{chunk-TNPK2LZT.js → chunk-Z4YQTXCD.js} +4 -4
  30. package/dist/{chunk-R4SBXQ2K.js → chunk-ZE5KS2YL.js} +2 -2
  31. package/dist/{config-T7BQ7AO2.js → config-VM7FTHMZ.js} +1 -1
  32. package/dist/executions.js +13 -13
  33. package/dist/history.js +5 -5
  34. package/dist/index.d.ts +2529 -24
  35. package/dist/index.js +118 -51
  36. package/dist/nodes.js +2 -2
  37. package/dist/observability.js +7 -7
  38. package/dist/settings.js +7 -7
  39. package/dist/templates.js +11 -11
  40. package/dist/workflow-builder.js +13 -13
  41. package/dist/workflows-list.js +9 -9
  42. package/package.json +1 -1
  43. package/dist/ExecutionDetailPage-Y4K35GJ7.js +0 -21
@@ -0,0 +1,22 @@
1
+ export { ExecutionDetailPage } from './chunk-HAFUSBYP.js';
2
+ import './chunk-7CTIVBBA.js';
3
+ import './chunk-AXMEATLG.js';
4
+ import './chunk-ZE5KS2YL.js';
5
+ import './chunk-NL4JQFFA.js';
6
+ import './chunk-5ERAJC2I.js';
7
+ import './chunk-IDGDMJMJ.js';
8
+ import './chunk-LAVHDFHI.js';
9
+ import './chunk-Y53CVZVV.js';
10
+ import './chunk-D3UWK7GY.js';
11
+ import './chunk-OJPJ2QXD.js';
12
+ import './chunk-PJAWNFJV.js';
13
+ import './chunk-6TMLIQHB.js';
14
+ import './chunk-K4BF7PAW.js';
15
+ import './chunk-JL7CASN5.js';
16
+ import './chunk-PXIFUMLA.js';
17
+ import './chunk-6AMNEX2Y.js';
18
+ import './chunk-JUUYPCFY.js';
19
+ import './chunk-YTUIGIVP.js';
20
+ import './chunk-UULVIT25.js';
21
+ import './chunk-NTWG3CJX.js';
22
+ import './chunk-62GWEYJ5.js';
@@ -1,19 +1,19 @@
1
- export { WorkflowsList } from './chunk-XTXT4NHE.js';
2
- import './chunk-LGGHQ7UE.js';
3
- import './chunk-UZMLMPFJ.js';
1
+ export { ExecutionsListPage } from './chunk-SZTKLZZR.js';
2
+ import './chunk-7CTIVBBA.js';
3
+ import './chunk-AXMEATLG.js';
4
4
  import './chunk-5ERAJC2I.js';
5
- import './chunk-X3LQJLV7.js';
6
- import './chunk-SRE2JVSJ.js';
5
+ import './chunk-LAVHDFHI.js';
7
6
  import './chunk-D3UWK7GY.js';
7
+ import './chunk-OJPJ2QXD.js';
8
8
  import './chunk-PJAWNFJV.js';
9
- import './chunk-U6KI4AKI.js';
9
+ import './chunk-6TMLIQHB.js';
10
10
  import './chunk-4VJ3MDOV.js';
11
- import './chunk-2U56452G.js';
11
+ import './chunk-K4BF7PAW.js';
12
12
  import './chunk-JL7CASN5.js';
13
13
  import './chunk-PXIFUMLA.js';
14
- import './chunk-CY6KX4RG.js';
14
+ import './chunk-6AMNEX2Y.js';
15
15
  import './chunk-JUUYPCFY.js';
16
- import './chunk-7PP6CRXS.js';
16
+ import './chunk-YTUIGIVP.js';
17
17
  import './chunk-UULVIT25.js';
18
18
  import './chunk-NTWG3CJX.js';
19
19
  import './chunk-62GWEYJ5.js';
@@ -1,25 +1,25 @@
1
- export { WorkflowBuilder } from './chunk-JUA57OVN.js';
2
- import './chunk-LGGHQ7UE.js';
1
+ export { WorkflowBuilder } from './chunk-RZR3BDDZ.js';
2
+ import './chunk-FFOZ5VUJ.js';
3
3
  import './chunk-PIKYQE7P.js';
4
- import './chunk-O24MDGZY.js';
4
+ import './chunk-EGIEFGOV.js';
5
5
  import './chunk-GEMNVFPK.js';
6
6
  import './chunk-IEVSFCFS.js';
7
7
  import './chunk-YXMFRQYV.js';
8
8
  import './chunk-BQXVT32O.js';
9
- import './chunk-X3LQJLV7.js';
10
- import './chunk-ZDFDC5YW.js';
11
- import './chunk-5GD6OXYW.js';
9
+ import './chunk-DEGCZCHP.js';
10
+ import './chunk-IDGDMJMJ.js';
11
+ import './chunk-LAVHDFHI.js';
12
12
  import './chunk-Y53CVZVV.js';
13
- import './chunk-SRE2JVSJ.js';
14
- import './chunk-U6KI4AKI.js';
15
- import './chunk-5ITN7CKS.js';
13
+ import './chunk-OJPJ2QXD.js';
14
+ import './chunk-6TMLIQHB.js';
15
+ import './chunk-4MHWFZJV.js';
16
16
  import './chunk-4VJ3MDOV.js';
17
- import './chunk-2U56452G.js';
17
+ import './chunk-K4BF7PAW.js';
18
18
  import './chunk-JL7CASN5.js';
19
19
  import './chunk-PXIFUMLA.js';
20
- import './chunk-CY6KX4RG.js';
20
+ import './chunk-6AMNEX2Y.js';
21
21
  import './chunk-JUUYPCFY.js';
22
- import './chunk-7PP6CRXS.js';
22
+ import './chunk-YTUIGIVP.js';
23
23
  import './chunk-UULVIT25.js';
24
24
  import './chunk-NTWG3CJX.js';
25
25
  import './chunk-62GWEYJ5.js';
@@ -1,18 +1,19 @@
1
- export { ExecutionsListPage } from './chunk-DASEJQ4G.js';
2
- import './chunk-EAJB5BNF.js';
3
- import './chunk-UZMLMPFJ.js';
1
+ export { WorkflowsList } from './chunk-VIZ7W5WJ.js';
2
+ import './chunk-FFOZ5VUJ.js';
3
+ import './chunk-AXMEATLG.js';
4
4
  import './chunk-5ERAJC2I.js';
5
- import './chunk-5GD6OXYW.js';
6
- import './chunk-SRE2JVSJ.js';
5
+ import './chunk-DEGCZCHP.js';
7
6
  import './chunk-D3UWK7GY.js';
7
+ import './chunk-OJPJ2QXD.js';
8
8
  import './chunk-PJAWNFJV.js';
9
+ import './chunk-6TMLIQHB.js';
9
10
  import './chunk-4VJ3MDOV.js';
10
- import './chunk-2U56452G.js';
11
+ import './chunk-K4BF7PAW.js';
11
12
  import './chunk-JL7CASN5.js';
12
13
  import './chunk-PXIFUMLA.js';
13
- import './chunk-CY6KX4RG.js';
14
+ import './chunk-6AMNEX2Y.js';
14
15
  import './chunk-JUUYPCFY.js';
15
- import './chunk-7PP6CRXS.js';
16
+ import './chunk-YTUIGIVP.js';
16
17
  import './chunk-UULVIT25.js';
17
18
  import './chunk-NTWG3CJX.js';
18
19
  import './chunk-62GWEYJ5.js';
@@ -1,4 +1,4 @@
1
- import { useAgentDefinitions, useAgentDefinitionList, useConnections, describeOperationError } from './chunk-2U56452G.js';
1
+ import { useAgentDefinitions, useAgentDefinitionList, useConnections, describeOperationError } from './chunk-K4BF7PAW.js';
2
2
  import { useTr } from './chunk-UULVIT25.js';
3
3
  import { useState, useCallback, useEffect } from 'react';
4
4
  import { Icon } from '@iconify/react';
@@ -14,7 +14,8 @@ var defaultFilter = {
14
14
  durationMaxSeconds: null,
15
15
  errorType: "all",
16
16
  nodeId: "",
17
- tagId: ""
17
+ tagId: "",
18
+ workflowId: ""
18
19
  };
19
20
  var defaultPagination = {
20
21
  page: 1,
@@ -117,6 +118,10 @@ var useExecutionsStore = create((set) => ({
117
118
  filter: { ...state.filter, tagId },
118
119
  pagination: { ...state.pagination, page: 1 }
119
120
  })),
121
+ setWorkflowIdFilter: (workflowId) => set((state) => ({
122
+ filter: { ...state.filter, workflowId },
123
+ pagination: { ...state.pagination, page: 1 }
124
+ })),
120
125
  resetFilters: () => set({
121
126
  filter: defaultFilter,
122
127
  pagination: { ...defaultPagination }
@@ -1,11 +1,11 @@
1
- import { ActionPoliciesTab } from './chunk-35SQULD5.js';
2
- import { LogStreamingTab } from './chunk-VYH65RLH.js';
3
- import { AgentsTab } from './chunk-5ITN7CKS.js';
1
+ import { ActionPoliciesTab } from './chunk-NL4JQFFA.js';
2
+ import { LogStreamingTab } from './chunk-US4LPOB3.js';
3
+ import { AgentsTab } from './chunk-4MHWFZJV.js';
4
4
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
5
- import { useFlowStore, useFluidGridsFlag, FLUIDGRIDS_FLAGS, useSaveStatusStore, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, throwIfResultError, describeOperationError, useConnections } from './chunk-2U56452G.js';
5
+ import { useFlowStore, useFluidGridsFlag, FLUIDGRIDS_FLAGS, useSaveStatusStore, useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS, useDurableParityEnabled, throwIfResultError, describeOperationError, useConnections } from './chunk-K4BF7PAW.js';
6
6
  import { getGlobalStoreClient } from './chunk-PXIFUMLA.js';
7
- import { getFluidGridsConfig } from './chunk-CY6KX4RG.js';
8
- import { useWorkflowDefinitionQuery, useUpdateWorkflowDefinitionMutation, useWorkflowDefinitionsQuery } from './chunk-7PP6CRXS.js';
7
+ import { getFluidGridsConfig } from './chunk-6AMNEX2Y.js';
8
+ import { useWorkflowDefinitionQuery, useUpdateWorkflowDefinitionMutation, useWorkflowDefinitionsQuery, DurableHistoryCapsDocument, UpdateDurableHistoryCapsDocument } from './chunk-YTUIGIVP.js';
9
9
  import { useTr } from './chunk-UULVIT25.js';
10
10
  import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
11
11
  import { useState, useMemo, useEffect, useCallback } from 'react';
@@ -14,7 +14,7 @@ import { Icon } from '@iconify/react';
14
14
  import { Button } from '@burdenoff/fe-libs/button';
15
15
  import { Tabs, TabsList, TabsTrigger, TabsContent, Input, Switch, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Label, Card, CardHeader, Badge, Checkbox, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from '@burdenoff/fe-libs/ui';
16
16
  import { toast } from 'sonner';
17
- import { jsxs, jsx } from 'react/jsx-runtime';
17
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
18
18
  import { gql } from '@apollo/client';
19
19
  import { resolveExternalGatewayUrls } from '@burdenoff/fe-libs/shared/config';
20
20
  import { cn } from '@burdenoff/fe-libs/utils';
@@ -135,9 +135,255 @@ function parseBoundedInt(value, range) {
135
135
  if (!Number.isFinite(parsed)) return void 0;
136
136
  return Math.min(range.max, Math.max(range.min, Math.trunc(parsed)));
137
137
  }
138
+ async function fetchDurableHistoryCaps() {
139
+ const result = await getFluidGridsClient().query({ query: DurableHistoryCapsDocument, fetchPolicy: "network-only" });
140
+ throwIfResultError(result);
141
+ const settings = result.data?.workflowExecutionSettings;
142
+ return {
143
+ maxHistoryEvents: settings?.maxHistoryEvents ?? null,
144
+ maxHistoryBytes: settings?.maxHistoryBytes ?? null
145
+ };
146
+ }
147
+ async function saveDurableHistoryCaps(caps) {
148
+ const variables = {};
149
+ if (caps.maxHistoryEvents !== void 0)
150
+ variables.maxHistoryEvents = caps.maxHistoryEvents;
151
+ if (caps.maxHistoryBytes !== void 0)
152
+ variables.maxHistoryBytes = caps.maxHistoryBytes;
153
+ const result = await getFluidGridsClient().mutate({ mutation: UpdateDurableHistoryCapsDocument, variables });
154
+ throwIfResultError(result);
155
+ const saved = result.data?.updateWorkflowExecutionSettings;
156
+ if (!saved) throw new Error("No settings returned");
157
+ return {
158
+ maxHistoryEvents: saved.maxHistoryEvents ?? null,
159
+ maxHistoryBytes: saved.maxHistoryBytes ?? null
160
+ };
161
+ }
162
+ function useDurableHistoryCaps(enabled) {
163
+ const [caps, setCaps] = useState(null);
164
+ const [error, setError] = useState(null);
165
+ useEffect(() => {
166
+ let cancelled = false;
167
+ fetchDurableHistoryCaps().then((next) => {
168
+ if (cancelled) return;
169
+ setCaps(next);
170
+ setError(null);
171
+ }).catch((err) => {
172
+ if (!cancelled) setError(describeOperationError(err));
173
+ });
174
+ return () => {
175
+ cancelled = true;
176
+ };
177
+ }, [enabled]);
178
+ const save = useCallback(async (next) => {
179
+ const saved = await saveDurableHistoryCaps(next);
180
+ setCaps(saved);
181
+ return saved;
182
+ }, []);
183
+ return { caps: caps , error: error , save };
184
+ }
185
+
186
+ // src/modules/settings/utils/history-caps.ts
187
+ var HISTORY_EVENTS_RANGE = { min: 1e3, max: 5e4 };
188
+ var HISTORY_MIB_RANGE = { min: 1, max: 50 };
189
+ var MIB = 1024 * 1024;
190
+ function parseCap(raw, range) {
191
+ const value = raw.trim();
192
+ if (!value) return { ok: true, value: null };
193
+ if (!/^\d+$/.test(value)) return { ok: false, ...range };
194
+ const parsed = Number(value);
195
+ if (parsed < range.min || parsed > range.max) return { ok: false, ...range };
196
+ return { ok: true, value: parsed };
197
+ }
198
+ function bytesToMibText(bytes) {
199
+ if (bytes === null || bytes === void 0 || !Number.isFinite(bytes))
200
+ return "";
201
+ return String(Number((bytes / MIB).toFixed(2)));
202
+ }
203
+ function historyCapChanges(loaded, eventsText, mibText) {
204
+ const changes = {};
205
+ const loadedEvents = loaded.maxHistoryEvents === null ? "" : String(loaded.maxHistoryEvents);
206
+ if (eventsText.trim() !== loadedEvents) {
207
+ const parsed = parseCap(eventsText, HISTORY_EVENTS_RANGE);
208
+ if (!parsed.ok) return { ok: false };
209
+ changes.maxHistoryEvents = parsed.value;
210
+ }
211
+ if (mibText.trim() !== bytesToMibText(loaded.maxHistoryBytes)) {
212
+ const parsed = parseCap(mibText, HISTORY_MIB_RANGE);
213
+ if (!parsed.ok) return { ok: false };
214
+ changes.maxHistoryBytes = parsed.value === null ? null : parsed.value * MIB;
215
+ }
216
+ return { ok: true, changes };
217
+ }
218
+ function DurableHistoryCapsCard({ canEdit }) {
219
+ const tr = useTr();
220
+ const { caps, error, save } = useDurableHistoryCaps(true);
221
+ const [events, setEvents] = useState("");
222
+ const [mib, setMib] = useState("");
223
+ const [saving, setSaving] = useState(false);
224
+ const locked = !caps || saving || !canEdit;
225
+ useEffect(() => {
226
+ if (!caps) return;
227
+ setEvents(
228
+ caps.maxHistoryEvents === null ? "" : String(caps.maxHistoryEvents)
229
+ );
230
+ setMib(bytesToMibText(caps.maxHistoryBytes));
231
+ }, [caps]);
232
+ const handleSave = async () => {
233
+ if (!caps) return;
234
+ const parsed = historyCapChanges(caps, events, mib);
235
+ if (!parsed.ok) {
236
+ toast.error(
237
+ tr(
238
+ "fluidgrids.settings.historyCaps.invalid",
239
+ "Enter {{eventsMin}} to {{eventsMax}} events and {{mibMin}} to {{mibMax}} MiB, or leave a field empty for the plan ceiling.",
240
+ {
241
+ eventsMin: HISTORY_EVENTS_RANGE.min,
242
+ eventsMax: HISTORY_EVENTS_RANGE.max,
243
+ mibMin: HISTORY_MIB_RANGE.min,
244
+ mibMax: HISTORY_MIB_RANGE.max
245
+ }
246
+ )
247
+ );
248
+ return;
249
+ }
250
+ setSaving(true);
251
+ try {
252
+ await save(parsed.changes);
253
+ toast.success(
254
+ tr("fluidgrids.settings.historyCaps.saved", "History caps saved")
255
+ );
256
+ } catch (err) {
257
+ toast.error(
258
+ tr(
259
+ "fluidgrids.settings.runData.saveFailedToast",
260
+ "Failed to save settings"
261
+ ),
262
+ { description: describeOperationError(err) }
263
+ );
264
+ } finally {
265
+ setSaving(false);
266
+ }
267
+ };
268
+ return /* @__PURE__ */ jsxs(
269
+ "section",
270
+ {
271
+ "data-testid": "durable-history-caps",
272
+ className: "mt-8 border-t border-border-secondary pt-6",
273
+ children: [
274
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-text-primary", children: tr(
275
+ "fluidgrids.settings.historyCaps.title",
276
+ "Durable-function history caps"
277
+ ) }),
278
+ /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-text-secondary", children: tr(
279
+ "fluidgrids.settings.historyCaps.intro",
280
+ "The most events and inline bytes a new durable-function run may record. Leave a field empty to use your plan's ceiling. Runs keep the caps they started with."
281
+ ) }),
282
+ error ? /* @__PURE__ */ jsxs("p", { className: "mt-3 text-sm text-status-error-text", role: "alert", children: [
283
+ tr(
284
+ "fluidgrids.settings.historyCaps.loadFailed",
285
+ "Could not load the history caps:"
286
+ ),
287
+ " ",
288
+ error
289
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
290
+ /* @__PURE__ */ jsxs("div", { className: "divide-y divide-border-secondary", children: [
291
+ /* @__PURE__ */ jsx(
292
+ SettingRow,
293
+ {
294
+ label: tr(
295
+ "fluidgrids.settings.historyCaps.eventsLabel",
296
+ "Events per run"
297
+ ),
298
+ description: tr(
299
+ "fluidgrids.settings.historyCaps.eventsDescription",
300
+ "{{min}} to {{max}}; the run is told to continue as new at 80%.",
301
+ {
302
+ min: HISTORY_EVENTS_RANGE.min,
303
+ max: HISTORY_EVENTS_RANGE.max
304
+ }
305
+ ),
306
+ children: /* @__PURE__ */ jsx(
307
+ Input,
308
+ {
309
+ type: "number",
310
+ min: HISTORY_EVENTS_RANGE.min,
311
+ max: HISTORY_EVENTS_RANGE.max,
312
+ value: events,
313
+ placeholder: tr(
314
+ "fluidgrids.settings.historyCaps.planCeiling",
315
+ "Plan ceiling"
316
+ ),
317
+ "aria-label": tr(
318
+ "fluidgrids.settings.historyCaps.eventsLabel",
319
+ "Events per run"
320
+ ),
321
+ onChange: (e) => setEvents(e.target.value),
322
+ disabled: locked,
323
+ className: "w-[140px] text-right",
324
+ "data-testid": "history-caps-events"
325
+ }
326
+ )
327
+ }
328
+ ),
329
+ /* @__PURE__ */ jsx(
330
+ SettingRow,
331
+ {
332
+ label: tr(
333
+ "fluidgrids.settings.historyCaps.bytesLabel",
334
+ "Inline history size"
335
+ ),
336
+ description: tr(
337
+ "fluidgrids.settings.historyCaps.bytesDescription",
338
+ "{{min}} to {{max}} MiB of event payloads kept inline.",
339
+ { min: HISTORY_MIB_RANGE.min, max: HISTORY_MIB_RANGE.max }
340
+ ),
341
+ children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
342
+ /* @__PURE__ */ jsx(
343
+ Input,
344
+ {
345
+ type: "number",
346
+ min: HISTORY_MIB_RANGE.min,
347
+ max: HISTORY_MIB_RANGE.max,
348
+ value: mib,
349
+ placeholder: tr(
350
+ "fluidgrids.settings.historyCaps.planCeiling",
351
+ "Plan ceiling"
352
+ ),
353
+ "aria-label": tr(
354
+ "fluidgrids.settings.historyCaps.bytesLabel",
355
+ "Inline history size"
356
+ ),
357
+ onChange: (e) => setMib(e.target.value),
358
+ disabled: locked,
359
+ className: "w-[100px] text-right",
360
+ "data-testid": "history-caps-mib"
361
+ }
362
+ ),
363
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-text-secondary", children: "MiB" })
364
+ ] })
365
+ }
366
+ )
367
+ ] }),
368
+ /* @__PURE__ */ jsx("div", { className: "mt-4 flex justify-end", children: /* @__PURE__ */ jsx(
369
+ Button,
370
+ {
371
+ "data-agent": "confirm",
372
+ onClick: () => void handleSave(),
373
+ disabled: locked,
374
+ "data-testid": "history-caps-save",
375
+ children: saving ? tr("fluidgrids.settings.runData.saving", "Saving\u2026") : tr("fluidgrids.settings.historyCaps.save", "Save caps")
376
+ }
377
+ ) })
378
+ ] })
379
+ ]
380
+ }
381
+ );
382
+ }
138
383
  function RunDataTab() {
139
384
  const tr = useTr();
140
385
  const { settings, loading, error, save } = useRunDataSettings();
386
+ const parityEnabled = useDurableParityEnabled();
141
387
  const [form, setForm] = useState(null);
142
388
  const [saving, setSaving] = useState(false);
143
389
  const { allowed: canEdit } = useFluidGridsPermission(
@@ -375,7 +621,8 @@ function RunDataTab() {
375
621
  disabled: locked,
376
622
  children: saving ? tr("fluidgrids.settings.runData.saving", "Saving\u2026") : tr("fluidgrids.settings.runData.save", "Save")
377
623
  }
378
- ) })
624
+ ) }),
625
+ parityEnabled && /* @__PURE__ */ jsx(DurableHistoryCapsCard, { canEdit })
379
626
  ] });
380
627
  }
381
628