@burdenoff/fluidgrids-fe-sdk 2026.1110.2 → 2026.1110.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 (54) hide show
  1. package/dist/{ExecutionDetailPage-UXQFBLF3.js → ExecutionDetailPage-2OY2NC3Z.js} +12 -13
  2. package/dist/{ExecutionsListPage-A4GCUNFR.js → ExecutionsListPage-GTR4XPQN.js} +8 -9
  3. package/dist/{WorkflowBuilder-ZLVMV2UA.js → WorkflowBuilder-7LPCDDJJ.js} +15 -16
  4. package/dist/{WorkflowsList-XPNGNR4A.js → WorkflowsList-JJ7UOHTC.js} +6 -6
  5. package/dist/{agentTools-V26FOMTS.js → agentTools-WHQ7UDDS.js} +3 -3
  6. package/dist/{chunk-OJHBCOBA.js → chunk-5NZANNKX.js} +40 -1
  7. package/dist/{chunk-5ZAOXCIQ.js → chunk-5WM655EY.js} +151 -7
  8. package/dist/{chunk-K22NDWSD.js → chunk-6HXJEIDT.js} +2 -2
  9. package/dist/{chunk-DIIGFBYT.js → chunk-6NSPCR5C.js} +1 -1
  10. package/dist/{chunk-ZQTANHKA.js → chunk-7MHCCYDJ.js} +2 -2
  11. package/dist/{chunk-DDINUPO3.js → chunk-CXBF63PL.js} +1 -1
  12. package/dist/{chunk-3F4DIVKT.js → chunk-DCMHDOZO.js} +1 -1
  13. package/dist/chunk-DELQGUVF.js +172 -0
  14. package/dist/{chunk-XLU63IUB.js → chunk-F7C57RJE.js} +6 -6
  15. package/dist/{chunk-L5MZ74DA.js → chunk-GA3DS2ZJ.js} +1 -1
  16. package/dist/{chunk-G7BT24PD.js → chunk-KLR4BZ75.js} +2 -2
  17. package/dist/{chunk-QGRVYPQC.js → chunk-KQMZ226I.js} +2 -2
  18. package/dist/{chunk-2DBAQR6F.js → chunk-LOU6RJIB.js} +2 -2
  19. package/dist/{chunk-Z6D6YL7C.js → chunk-MQ24K2L4.js} +1 -1
  20. package/dist/{chunk-OVZA4IM7.js → chunk-OIMQHAGU.js} +3 -3
  21. package/dist/{chunk-2H4XAES7.js → chunk-POCNK7FY.js} +2 -2
  22. package/dist/{chunk-OZNFRJKC.js → chunk-PXN3S2YU.js} +5 -5
  23. package/dist/{chunk-WGUHISC2.js → chunk-QOFEQEQL.js} +174 -23
  24. package/dist/chunk-QUYK5PAZ.js +338 -0
  25. package/dist/{chunk-5V7PMLQN.js → chunk-QYHRRSEC.js} +1118 -24
  26. package/dist/{chunk-ZZBZPBO5.js → chunk-S36ZLWDC.js} +2 -2
  27. package/dist/{chunk-7UFE2CHD.js → chunk-SKMWUKT5.js} +29 -103
  28. package/dist/{chunk-CBX2CXGH.js → chunk-U5P7E3PA.js} +6 -6
  29. package/dist/{chunk-A6Q4FWB6.js → chunk-UDS2FA24.js} +1 -1
  30. package/dist/{chunk-PICOXEUO.js → chunk-UDTAUZ7B.js} +4 -4
  31. package/dist/{chunk-PI4AW4T2.js → chunk-V6KLU67V.js} +20 -19
  32. package/dist/{chunk-5TGPH3CX.js → chunk-VRPNGY6W.js} +4 -4
  33. package/dist/{chunk-D4L5BN64.js → chunk-VXVLQ3LX.js} +94 -2
  34. package/dist/{chunk-X7XVRJK2.js → chunk-XSTTM74F.js} +1 -1
  35. package/dist/{chunk-I3DBTNWQ.js → chunk-XYLWH24V.js} +5 -5
  36. package/dist/executions.js +13 -14
  37. package/dist/history.js +5 -5
  38. package/dist/index.d.ts +35 -2
  39. package/dist/index.js +45 -46
  40. package/dist/{node-detail-view-2AFXRNX6.js → node-detail-view-JJ2JRFID.js} +8 -9
  41. package/dist/nodes.js +2 -2
  42. package/dist/observability.js +5 -5
  43. package/dist/quick-config-panel-BT2RHMXF.js +411 -0
  44. package/dist/settings.js +7 -8
  45. package/dist/templates.js +15 -16
  46. package/dist/{workflow-builder-DQ2VFyg8.d.ts → workflow-builder-DgZQtyWL.d.ts} +12 -0
  47. package/dist/workflow-builder.d.ts +1 -1
  48. package/dist/workflow-builder.js +16 -17
  49. package/dist/workflows-list.js +6 -6
  50. package/package.json +1 -1
  51. package/dist/chunk-3JGAI5YC.js +0 -1437
  52. package/dist/chunk-HORSE7WX.js +0 -54
  53. package/dist/chunk-WZ3EJVS6.js +0 -93
  54. package/dist/quick-config-panel-U4AELSCT.js +0 -363
@@ -1,30 +1,29 @@
1
- export { ExecutionDetailPage } from './chunk-WGUHISC2.js';
2
- import './chunk-G7BT24PD.js';
3
- import './chunk-OZNFRJKC.js';
4
- import './chunk-2DBAQR6F.js';
5
- import './chunk-L5MZ74DA.js';
1
+ export { ExecutionDetailPage } from './chunk-QOFEQEQL.js';
2
+ import './chunk-KLR4BZ75.js';
3
+ import './chunk-PXN3S2YU.js';
4
+ import './chunk-LOU6RJIB.js';
5
+ import './chunk-GA3DS2ZJ.js';
6
6
  import './chunk-NZAYYUQ4.js';
7
- import './chunk-OJHBCOBA.js';
7
+ import './chunk-5NZANNKX.js';
8
8
  import './chunk-5ERAJC2I.js';
9
- import './chunk-2H4XAES7.js';
9
+ import './chunk-POCNK7FY.js';
10
10
  import './chunk-JDLQ6QIB.js';
11
- import './chunk-DIIGFBYT.js';
11
+ import './chunk-6NSPCR5C.js';
12
12
  import './chunk-Y53CVZVV.js';
13
13
  import './chunk-FNZZ5JJL.js';
14
- import './chunk-K22NDWSD.js';
14
+ import './chunk-6HXJEIDT.js';
15
15
  import './chunk-PJAWNFJV.js';
16
- import './chunk-D4L5BN64.js';
17
- import './chunk-WZ3EJVS6.js';
16
+ import './chunk-VXVLQ3LX.js';
18
17
  import './chunk-6CPQVLHT.js';
19
18
  import './chunk-ERT444RG.js';
20
- import './chunk-DDINUPO3.js';
19
+ import './chunk-CXBF63PL.js';
21
20
  import './chunk-SDZEAIIE.js';
22
21
  import './chunk-K2X63CR2.js';
23
22
  import './chunk-Y7FKJJMF.js';
24
23
  import './chunk-TYI2XOSI.js';
25
24
  import './chunk-G77IGC3Y.js';
26
25
  import './chunk-JL7CASN5.js';
27
- import './chunk-A6Q4FWB6.js';
26
+ import './chunk-UDS2FA24.js';
28
27
  import './chunk-UULVIT25.js';
29
28
  import './chunk-PDODDDHY.js';
30
29
  import './chunk-JKLZ6YZ3.js';
@@ -1,24 +1,23 @@
1
- export { ExecutionsListPage } from './chunk-XLU63IUB.js';
2
- import './chunk-OZNFRJKC.js';
3
- import './chunk-2DBAQR6F.js';
1
+ export { ExecutionsListPage } from './chunk-F7C57RJE.js';
2
+ import './chunk-PXN3S2YU.js';
3
+ import './chunk-LOU6RJIB.js';
4
4
  import './chunk-5ERAJC2I.js';
5
- import './chunk-DIIGFBYT.js';
5
+ import './chunk-6NSPCR5C.js';
6
6
  import './chunk-FNZZ5JJL.js';
7
- import './chunk-K22NDWSD.js';
7
+ import './chunk-6HXJEIDT.js';
8
8
  import './chunk-PJAWNFJV.js';
9
- import './chunk-D4L5BN64.js';
10
- import './chunk-WZ3EJVS6.js';
9
+ import './chunk-VXVLQ3LX.js';
11
10
  import './chunk-4VJ3MDOV.js';
12
11
  import './chunk-6CPQVLHT.js';
13
12
  import './chunk-ERT444RG.js';
14
- import './chunk-DDINUPO3.js';
13
+ import './chunk-CXBF63PL.js';
15
14
  import './chunk-SDZEAIIE.js';
16
15
  import './chunk-K2X63CR2.js';
17
16
  import './chunk-Y7FKJJMF.js';
18
17
  import './chunk-TYI2XOSI.js';
19
18
  import './chunk-G77IGC3Y.js';
20
19
  import './chunk-JL7CASN5.js';
21
- import './chunk-A6Q4FWB6.js';
20
+ import './chunk-UDS2FA24.js';
22
21
  import './chunk-UULVIT25.js';
23
22
  import './chunk-PDODDDHY.js';
24
23
  import './chunk-JKLZ6YZ3.js';
@@ -1,43 +1,42 @@
1
- export { WorkflowBuilder } from './chunk-CBX2CXGH.js';
1
+ export { WorkflowBuilder } from './chunk-U5P7E3PA.js';
2
2
  import './chunk-NRI7AUBH.js';
3
3
  import './chunk-PIKYQE7P.js';
4
- import './chunk-7UFE2CHD.js';
4
+ import './chunk-SKMWUKT5.js';
5
5
  import './chunk-JNSHR2J2.js';
6
6
  import './chunk-GEMNVFPK.js';
7
7
  import './chunk-B6CCE2RW.js';
8
8
  import './chunk-IEVSFCFS.js';
9
9
  import './chunk-YXMFRQYV.js';
10
10
  import './chunk-TFCIZFDM.js';
11
- import './chunk-3JGAI5YC.js';
12
- import './chunk-HORSE7WX.js';
13
- import './chunk-5V7PMLQN.js';
14
- import './chunk-PI4AW4T2.js';
11
+ import './chunk-QUYK5PAZ.js';
12
+ import './chunk-DELQGUVF.js';
13
+ import './chunk-QYHRRSEC.js';
14
+ import './chunk-V6KLU67V.js';
15
15
  import './chunk-KZCNJAMK.js';
16
- import './chunk-QGRVYPQC.js';
17
- import './chunk-2H4XAES7.js';
16
+ import './chunk-KQMZ226I.js';
17
+ import './chunk-POCNK7FY.js';
18
18
  import './chunk-JDLQ6QIB.js';
19
- import './chunk-DIIGFBYT.js';
19
+ import './chunk-6NSPCR5C.js';
20
20
  import './chunk-Y53CVZVV.js';
21
- import './chunk-X7XVRJK2.js';
21
+ import './chunk-XSTTM74F.js';
22
22
  import './chunk-CKF2FBUP.js';
23
- import './chunk-K22NDWSD.js';
23
+ import './chunk-6HXJEIDT.js';
24
24
  import './chunk-XRGAH6IQ.js';
25
25
  import './chunk-QJAZXCFQ.js';
26
26
  import './chunk-GLYINMOR.js';
27
- import './chunk-ZZBZPBO5.js';
28
- import './chunk-D4L5BN64.js';
29
- import './chunk-WZ3EJVS6.js';
27
+ import './chunk-S36ZLWDC.js';
28
+ import './chunk-VXVLQ3LX.js';
30
29
  import './chunk-4VJ3MDOV.js';
31
30
  import './chunk-6CPQVLHT.js';
32
31
  import './chunk-ERT444RG.js';
33
- import './chunk-DDINUPO3.js';
32
+ import './chunk-CXBF63PL.js';
34
33
  import './chunk-SDZEAIIE.js';
35
34
  import './chunk-K2X63CR2.js';
36
35
  import './chunk-Y7FKJJMF.js';
37
36
  import './chunk-TYI2XOSI.js';
38
37
  import './chunk-G77IGC3Y.js';
39
38
  import './chunk-JL7CASN5.js';
40
- import './chunk-A6Q4FWB6.js';
39
+ import './chunk-UDS2FA24.js';
41
40
  import './chunk-UULVIT25.js';
42
41
  import './chunk-PDODDDHY.js';
43
42
  import './chunk-JKLZ6YZ3.js';
@@ -1,22 +1,22 @@
1
- export { WorkflowsList } from './chunk-I3DBTNWQ.js';
1
+ export { WorkflowsList } from './chunk-XYLWH24V.js';
2
2
  import './chunk-NRI7AUBH.js';
3
- import './chunk-2DBAQR6F.js';
3
+ import './chunk-LOU6RJIB.js';
4
4
  import './chunk-5ERAJC2I.js';
5
- import './chunk-QGRVYPQC.js';
5
+ import './chunk-KQMZ226I.js';
6
6
  import './chunk-FNZZ5JJL.js';
7
- import './chunk-K22NDWSD.js';
7
+ import './chunk-6HXJEIDT.js';
8
8
  import './chunk-PJAWNFJV.js';
9
9
  import './chunk-4VJ3MDOV.js';
10
10
  import './chunk-6CPQVLHT.js';
11
11
  import './chunk-ERT444RG.js';
12
- import './chunk-DDINUPO3.js';
12
+ import './chunk-CXBF63PL.js';
13
13
  import './chunk-SDZEAIIE.js';
14
14
  import './chunk-K2X63CR2.js';
15
15
  import './chunk-Y7FKJJMF.js';
16
16
  import './chunk-TYI2XOSI.js';
17
17
  import './chunk-G77IGC3Y.js';
18
18
  import './chunk-JL7CASN5.js';
19
- import './chunk-A6Q4FWB6.js';
19
+ import './chunk-UDS2FA24.js';
20
20
  import './chunk-UULVIT25.js';
21
21
  import './chunk-PDODDDHY.js';
22
22
  import './chunk-JKLZ6YZ3.js';
@@ -1,12 +1,12 @@
1
1
  import { computeAttachPosition } from './chunk-JNSHR2J2.js';
2
- import { nodeTitle, selectedOperationOf, paramsFromOperation, fixedParameterState } from './chunk-PI4AW4T2.js';
3
- import { NODE_CONFIGS, createConfiguredNode, isNodeConfigsInitialized, useSaveStatusStore, autosaveAllowedFor, isFlowComplete, isNodeTypeHiddenFromPalette } from './chunk-DDINUPO3.js';
2
+ import { nodeTitle, selectedOperationOf, paramsFromOperation, fixedParameterState } from './chunk-V6KLU67V.js';
3
+ import { NODE_CONFIGS, createConfiguredNode, isNodeConfigsInitialized, useSaveStatusStore, autosaveAllowedFor, isFlowComplete, isNodeTypeHiddenFromPalette } from './chunk-CXBF63PL.js';
4
4
  import './chunk-SDZEAIIE.js';
5
5
  import { resolveOutputHandles, resolveInputHandles, useFlowStore } from './chunk-K2X63CR2.js';
6
6
  import './chunk-Y7FKJJMF.js';
7
7
  import './chunk-TYI2XOSI.js';
8
8
  import './chunk-G77IGC3Y.js';
9
- import './chunk-A6Q4FWB6.js';
9
+ import './chunk-UDS2FA24.js';
10
10
  import './chunk-UULVIT25.js';
11
11
  import './chunk-PDODDDHY.js';
12
12
  import './chunk-JKLZ6YZ3.js';
@@ -1361,4 +1361,43 @@ async function decodePayloads(server, payloads, fetchImpl = fetch) {
1361
1361
  }
1362
1362
  }
1363
1363
 
1364
- export { ActionPoliciesTab, CodecServerError, RunPolicyDecisions, checkCodecServerUrl, containsEncodedPayload, decodePayloads, encodedPayloadBytes, isEncodedPayload, useRunPolicyDecisions };
1364
+ // src/modules/settings/utils/run-budget.ts
1365
+ var BUDGET_DIMENSIONS = [
1366
+ "maxSteps",
1367
+ "maxTokens",
1368
+ "maxCostMicroUsd",
1369
+ "maxWallTimeSec"
1370
+ ];
1371
+ var MICRO_USD_PER_USD = 1e6;
1372
+ function withBudgetLimit(budget, dimension, value, mode) {
1373
+ const limit = parseBudgetValue(dimension, value);
1374
+ const next = { ...budget };
1375
+ if (limit === void 0) delete next[dimension];
1376
+ else next[dimension] = { limit, mode };
1377
+ return BUDGET_DIMENSIONS.some((d) => next[d]) ? next : void 0;
1378
+ }
1379
+ function withBudgetMode(budget, dimension, mode) {
1380
+ const current = budget?.[dimension];
1381
+ if (!current) return budget;
1382
+ return { ...budget, [dimension]: { ...current, mode } };
1383
+ }
1384
+ function parseBudgetValue(dimension, value) {
1385
+ if (value.trim() === "") return void 0;
1386
+ const parsed = Number(value);
1387
+ if (!Number.isFinite(parsed) || parsed <= 0) return void 0;
1388
+ const scaled = dimension === "maxCostMicroUsd" ? parsed * MICRO_USD_PER_USD : parsed;
1389
+ const whole = Math.round(scaled);
1390
+ return whole >= 1 && Number.isSafeInteger(whole) ? whole : void 0;
1391
+ }
1392
+ function budgetInputValue(dimension, limit) {
1393
+ if (!limit) return "";
1394
+ return dimension === "maxCostMicroUsd" ? String(limit.limit / MICRO_USD_PER_USD) : String(limit.limit);
1395
+ }
1396
+ function formatBudgetUsd(microUsd) {
1397
+ const [whole = "0", digits = ""] = (microUsd / MICRO_USD_PER_USD).toFixed(6).split(".");
1398
+ let end = digits.length;
1399
+ while (end > 2 && digits[end - 1] === "0") end--;
1400
+ return `${whole}.${digits.slice(0, end)}`;
1401
+ }
1402
+
1403
+ export { ActionPoliciesTab, BUDGET_DIMENSIONS, CodecServerError, RunPolicyDecisions, budgetInputValue, checkCodecServerUrl, containsEncodedPayload, decodePayloads, encodedPayloadBytes, formatBudgetUsd, isEncodedPayload, useRunPolicyDecisions, withBudgetLimit, withBudgetMode };
@@ -1,13 +1,13 @@
1
- import { ActionPoliciesTab, checkCodecServerUrl } from './chunk-OJHBCOBA.js';
2
- import { LogStreamingTab } from './chunk-Z6D6YL7C.js';
3
- import { AgentsTab, useConnections } from './chunk-ZZBZPBO5.js';
4
- import { useResource, fetchPauseRules, FieldError, fetchSearchAttributes, StatusPill, NativeSelect, fetchArchiveSettings, fetchCodecServerSettings, deletePauseRule, createPauseRule, deleteSearchAttribute, createSearchAttribute, saveArchiveSettings, clearArchiveSettings, saveCodecServerSettings } from './chunk-D4L5BN64.js';
1
+ import { ActionPoliciesTab, BUDGET_DIMENSIONS, withBudgetLimit, budgetInputValue, withBudgetMode, checkCodecServerUrl } from './chunk-5NZANNKX.js';
2
+ import { LogStreamingTab } from './chunk-MQ24K2L4.js';
3
+ import { AgentsTab, useConnections } from './chunk-S36ZLWDC.js';
4
+ import { useResource, fetchPauseRules, FieldError, fetchSearchAttributes, StatusPill, NativeSelect, fetchArchiveSettings, fetchCodecServerSettings, deletePauseRule, createPauseRule, deleteSearchAttribute, createSearchAttribute, saveArchiveSettings, clearArchiveSettings, saveCodecServerSettings } from './chunk-VXVLQ3LX.js';
5
5
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
6
6
  import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-ERT444RG.js';
7
- import { useFluidGridsFlag, FLUIDGRIDS_FLAGS, usePhaseCFlags, useSaveStatusStore, findSaveConflict, useDurableParityEnabled } from './chunk-DDINUPO3.js';
7
+ import { useFluidGridsFlag, FLUIDGRIDS_FLAGS, usePhaseCFlags, useSaveStatusStore, findSaveConflict, useDurableParityEnabled } from './chunk-CXBF63PL.js';
8
8
  import { useFlowStore } from './chunk-K2X63CR2.js';
9
9
  import { getGlobalStoreClient } from './chunk-TYI2XOSI.js';
10
- import { useWorkflowDefinitionQuery, useUpdateWorkflowDefinitionMutation, useWorkflowDefinitionsQuery, ManagedAiWorkspacePolicyDocument, UpdateManagedAiWorkspacePolicyDocument, DurableHistoryCapsDocument, UpdateDurableHistoryCapsDocument } from './chunk-A6Q4FWB6.js';
10
+ import { useWorkflowDefinitionQuery, useUpdateWorkflowDefinitionMutation, useWorkflowDefinitionsQuery, ManagedAiWorkspacePolicyDocument, UpdateManagedAiWorkspacePolicyDocument, DurableHistoryCapsDocument, UpdateDurableHistoryCapsDocument } from './chunk-UDS2FA24.js';
11
11
  import { useTr } from './chunk-UULVIT25.js';
12
12
  import { getFluidGridsClient } from './chunk-PDODDDHY.js';
13
13
  import { throwIfResultError, describeOperationError } from './chunk-JKLZ6YZ3.js';
@@ -513,6 +513,124 @@ function SettingRow({
513
513
  /* @__PURE__ */ jsx("div", { className: "shrink-0", children })
514
514
  ] });
515
515
  }
516
+ var ROWS = {
517
+ maxSteps: {
518
+ labelKey: "fluidgrids.settings.execution.budget.stepsLabel",
519
+ label: "Max model calls per run",
520
+ descriptionKey: "fluidgrids.settings.execution.budget.stepsDescription",
521
+ description: "Every AI Agent turn and every call an AI node, tool or sub-node makes counts, including those of sub-workflows.",
522
+ unitKey: "fluidgrids.settings.execution.budget.stepsUnit",
523
+ unit: "calls",
524
+ step: "1"
525
+ },
526
+ maxTokens: {
527
+ labelKey: "fluidgrids.settings.execution.budget.tokensLabel",
528
+ label: "Max tokens per run",
529
+ descriptionKey: "fluidgrids.settings.execution.budget.tokensDescription",
530
+ description: "Input plus output tokens of the run's model calls, including those of sub-workflows.",
531
+ unitKey: "fluidgrids.settings.execution.budget.tokensUnit",
532
+ unit: "tokens",
533
+ step: "1"
534
+ },
535
+ maxCostMicroUsd: {
536
+ labelKey: "fluidgrids.settings.execution.budget.costLabel",
537
+ label: "Max AI cost per run",
538
+ descriptionKey: "fluidgrids.settings.execution.budget.costDescription",
539
+ description: "The estimated cost of the run's model calls, including those of sub-workflows. A call is priced after it returns, so the check can trail by one call.",
540
+ unitKey: "fluidgrids.settings.execution.budget.costUnit",
541
+ unit: "USD",
542
+ step: "0.01"
543
+ },
544
+ maxWallTimeSec: {
545
+ labelKey: "fluidgrids.settings.execution.budget.wallTimeLabel",
546
+ label: "Max AI running time per run",
547
+ descriptionKey: "fluidgrids.settings.execution.budget.wallTimeDescription",
548
+ description: "Checked before each model call. Time the run spends paused (an approval, a long Wait) does not count.",
549
+ unitKey: "fluidgrids.settings.execution.budget.wallTimeUnit",
550
+ unit: "seconds",
551
+ step: "1"
552
+ }
553
+ };
554
+ function RunBudgetSettings({
555
+ budget,
556
+ disabled,
557
+ onChange
558
+ }) {
559
+ const tr = useTr();
560
+ return /* @__PURE__ */ jsx(Fragment, { children: BUDGET_DIMENSIONS.map((dimension) => {
561
+ const row = ROWS[dimension];
562
+ const limit = budget?.[dimension];
563
+ const mode = limit?.mode ?? "HARD";
564
+ const label = tr(row.labelKey, row.label);
565
+ return /* @__PURE__ */ jsx(
566
+ SettingRow,
567
+ {
568
+ label,
569
+ description: tr(row.descriptionKey, row.description),
570
+ children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
571
+ /* @__PURE__ */ jsx(
572
+ Input,
573
+ {
574
+ type: "number",
575
+ min: 0,
576
+ step: row.step,
577
+ value: budgetInputValue(dimension, limit),
578
+ placeholder: tr(
579
+ "fluidgrids.settings.execution.budget.noLimit",
580
+ "No limit"
581
+ ),
582
+ "aria-label": label,
583
+ onChange: (e) => onChange(
584
+ withBudgetLimit(budget, dimension, e.target.value, mode)
585
+ ),
586
+ disabled,
587
+ className: "w-[110px] text-right"
588
+ }
589
+ ),
590
+ /* @__PURE__ */ jsx("span", { className: "w-[52px] text-xs text-text-secondary", children: tr(row.unitKey, row.unit) }),
591
+ /* @__PURE__ */ jsxs(
592
+ Select,
593
+ {
594
+ value: mode,
595
+ onValueChange: (next) => onChange(
596
+ withBudgetMode(
597
+ budget,
598
+ dimension,
599
+ next === "SOFT" ? "SOFT" : "HARD"
600
+ )
601
+ ),
602
+ disabled: disabled || !limit,
603
+ children: [
604
+ /* @__PURE__ */ jsx(
605
+ SelectTrigger,
606
+ {
607
+ "aria-label": tr(
608
+ "fluidgrids.settings.execution.budget.modeLabel",
609
+ "When reached"
610
+ ),
611
+ className: "w-[150px] bg-background-secondary border-border-secondary",
612
+ children: /* @__PURE__ */ jsx(SelectValue, {})
613
+ }
614
+ ),
615
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
616
+ /* @__PURE__ */ jsx(SelectItem, { value: "HARD", children: tr(
617
+ "fluidgrids.settings.execution.budget.modeHard",
618
+ "Stop the run"
619
+ ) }),
620
+ /* @__PURE__ */ jsx(SelectItem, { value: "SOFT", children: tr(
621
+ "fluidgrids.settings.execution.budget.modeSoft",
622
+ "Warn only"
623
+ ) })
624
+ ] })
625
+ ]
626
+ }
627
+ )
628
+ ] })
629
+ },
630
+ dimension
631
+ );
632
+ }) });
633
+ }
516
634
  var FIELDS = `
517
635
  saveSuccessfulRuns
518
636
  saveFailedRuns
@@ -3095,12 +3213,20 @@ var DATA_PRIVACY_KEYS = [
3095
3213
  "doNotStoreRunData",
3096
3214
  "redactFields"
3097
3215
  ];
3216
+ var BUDGET_KEYS = [
3217
+ "maxSteps",
3218
+ "maxWallTimeSec",
3219
+ "maxTokens",
3220
+ "maxCostMicroUsd"
3221
+ ];
3098
3222
  function mergeWorkflowExecutionSettings(existing, next) {
3099
3223
  const merged = { ...existing, ...next };
3100
3224
  for (const [key, editable] of [
3101
3225
  ["dataSaving", DATA_SAVING_KEYS],
3102
3226
  ["retention", RETENTION_KEYS],
3103
- ["dataPrivacy", DATA_PRIVACY_KEYS]
3227
+ ["dataPrivacy", DATA_PRIVACY_KEYS],
3228
+ // BOFF-9943: a limit the form cleared means "no limit", so it must not come back either.
3229
+ ["budget", BUDGET_KEYS]
3104
3230
  ]) {
3105
3231
  const nested = mergeNested(existing[key], next[key], editable);
3106
3232
  if (nested) merged[key] = nested;
@@ -3489,6 +3615,24 @@ function ExecutionTab({ workflowKey }) {
3489
3615
  )
3490
3616
  }
3491
3617
  ),
3618
+ /* @__PURE__ */ jsxs("div", { className: "pt-5 pb-1", children: [
3619
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-text-primary", children: tr(
3620
+ "fluidgrids.settings.execution.budget.heading",
3621
+ "AI budget per run"
3622
+ ) }),
3623
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-text-secondary mt-0.5", children: tr(
3624
+ "fluidgrids.settings.execution.budget.intro",
3625
+ "Leave a limit empty for no limit. A run started through the API can lower these limits for itself, never raise them."
3626
+ ) })
3627
+ ] }),
3628
+ /* @__PURE__ */ jsx(
3629
+ RunBudgetSettings,
3630
+ {
3631
+ budget: form.budget,
3632
+ disabled: locked,
3633
+ onChange: (budget) => setForm((f) => ({ ...f, budget }))
3634
+ }
3635
+ ),
3492
3636
  /* @__PURE__ */ jsx(
3493
3637
  SettingRow,
3494
3638
  {
@@ -1,5 +1,5 @@
1
- import { useFluidGridsAnalytics, emitWorkflowCreated, emitRunStarted, runTriggerFromMode, openRunQuotaUpgradePrompt, emitWorkflowPublished } from './chunk-DDINUPO3.js';
2
- import { WorkflowDefinitionsDocument, WorkflowDefinitionDocument, WorkflowVersionsDocument, CreateWorkflowDefinitionDocument, ImportWorkflowDocument, PreviewN8nImportDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, DeleteWorkflowDefinitionDocument, DuplicateWorkflowDocument, RestoreWorkflowVersionDocument, TriggerWorkflowDocument, WorkflowRunsDocument, WorkflowRunDocument, DashboardSummaryDocument, ActivateWorkflowDefinitionDocument, DeactivateWorkflowDefinitionDocument } from './chunk-A6Q4FWB6.js';
1
+ import { useFluidGridsAnalytics, emitWorkflowCreated, emitRunStarted, runTriggerFromMode, openRunQuotaUpgradePrompt, emitWorkflowPublished } from './chunk-CXBF63PL.js';
2
+ import { WorkflowDefinitionsDocument, WorkflowDefinitionDocument, WorkflowVersionsDocument, CreateWorkflowDefinitionDocument, ImportWorkflowDocument, PreviewN8nImportDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, DeleteWorkflowDefinitionDocument, DuplicateWorkflowDocument, RestoreWorkflowVersionDocument, TriggerWorkflowDocument, WorkflowRunsDocument, WorkflowRunDocument, DashboardSummaryDocument, ActivateWorkflowDefinitionDocument, DeactivateWorkflowDefinitionDocument } from './chunk-UDS2FA24.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
4
  import { getFluidGridsClient } from './chunk-PDODDDHY.js';
5
5
  import { throwIfResultError, emitFluidGridsEvent, emitOperationErrorEvent } from './chunk-JKLZ6YZ3.js';
@@ -1,4 +1,4 @@
1
- import { FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, DataTablesTagsDocument } from './chunk-A6Q4FWB6.js';
1
+ import { FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, DataTablesTagsDocument } from './chunk-UDS2FA24.js';
2
2
  import { getFluidGridsClient } from './chunk-PDODDDHY.js';
3
3
  import { useState, useCallback, useEffect } from 'react';
4
4
 
@@ -1,6 +1,6 @@
1
- import { versionsOfWorkflow, VersionDiffDialog } from './chunk-X7XVRJK2.js';
1
+ import { versionsOfWorkflow, VersionDiffDialog } from './chunk-XSTTM74F.js';
2
2
  import { historyControls } from './chunk-FNZZ5JJL.js';
3
- import { useWorkflowDefinitions, useRestoreWorkflowVersion } from './chunk-K22NDWSD.js';
3
+ import { useWorkflowDefinitions, useRestoreWorkflowVersion } from './chunk-6HXJEIDT.js';
4
4
  import { useFluidGridsPageControls } from './chunk-PJAWNFJV.js';
5
5
  import { FluidGridsDocsLink } from './chunk-4VJ3MDOV.js';
6
6
  import { useTr } from './chunk-UULVIT25.js';
@@ -2,7 +2,7 @@ import { useBuilderReadOnly } from './chunk-SDZEAIIE.js';
2
2
  import { STICKY_NOTE_TYPE, useFlowStore, resolveStickyColor, STICKY_COLORS, stickySurfaceStyle, resolveOperationName, synchronizeOperationUpdate, isNodeTrigger, resolveOutputHandles, resolveInputHandles, outputHandlesSpacerHeight, WAIT_FOR_SIGNAL_NODE_TYPE, CODE_WORKFLOW_NODE_TYPE, readSignalName, LogicNodeCard, NodeCard, NodeCardHeader, NodeCardBody, InputHandles, OutputHandles, NodeTypeIcon, nodeAccent, readCodeWorkflowState, interfaceFields, interfaceHandlers, partitionStickyNotes, DEFAULT_STICKY_COLOR } from './chunk-K2X63CR2.js';
3
3
  import { getGlobalStoreClient, createGlobalStoreClient, setGlobalStoreClient, resetGlobalStoreClient } from './chunk-TYI2XOSI.js';
4
4
  import { GetMyNodeInstallationsDocument } from './chunk-G77IGC3Y.js';
5
- import { fetchAllNodeEndpointConfigs, NodeManifestDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowRunDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, WorkflowDefinitionDocument } from './chunk-A6Q4FWB6.js';
5
+ import { fetchAllNodeEndpointConfigs, NodeManifestDocument, ExecuteStepDocument, TriggerWorkflowDocument, RunFromNodeDocument, ExecutionDetailDocument, WorkflowRunDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, WorkflowDefinitionDocument } from './chunk-UDS2FA24.js';
6
6
  import { useTr, ENGLISH_FALLBACK_TRANSLATOR, FluidGridsTranslationProvider } from './chunk-UULVIT25.js';
7
7
  import { waitForFluidGridsClient, getFluidGridsClient, getFluidGridsClientSafe, createFluidGridsClient, setFluidGridsClient, resetFluidGridsClient } from './chunk-PDODDDHY.js';
8
8
  import { throwIfResultError, describeOperationError, emitFluidGridsEvent, emitOperationErrorEvent, emitRunCompletedOnce } from './chunk-JKLZ6YZ3.js';
@@ -1,5 +1,5 @@
1
1
  import { PublishCustomNodeAction } from './chunk-XRGAH6IQ.js';
2
- import { NodeEndpointConfigsDocument, NodeEndpointConfigDocument, NodeManifestDocument, fetchAllNodeEndpointConfigs } from './chunk-A6Q4FWB6.js';
2
+ import { NodeEndpointConfigsDocument, NodeEndpointConfigDocument, NodeManifestDocument, fetchAllNodeEndpointConfigs } from './chunk-UDS2FA24.js';
3
3
  import { useTr } from './chunk-UULVIT25.js';
4
4
  import { getFluidGridsClient } from './chunk-PDODDDHY.js';
5
5
  import { useMemo, useState, useCallback, useEffect } from 'react';
@@ -0,0 +1,172 @@
1
+ import { TabButton, ReadOnlyFieldset, NodeSettingsPanel, NodeParamsForm, SchedulePanel, SCHEDULE_NODE_TYPE } from './chunk-QYHRRSEC.js';
2
+ import { nodeTitle, FieldTree } from './chunk-V6KLU67V.js';
3
+ import { useFluidGridsPermission, FLUIDGRIDS_PERMISSIONS } from './chunk-ERT444RG.js';
4
+ import { usePhaseCFlags } from './chunk-CXBF63PL.js';
5
+ import { useFlowStore } from './chunk-K2X63CR2.js';
6
+ import { useTr } from './chunk-UULVIT25.js';
7
+ import { Icon } from '@iconify/react';
8
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
9
+ import { cn } from '@burdenoff/fe-libs/utils';
10
+ import { useState } from 'react';
11
+
12
+ function NodeInputFields({
13
+ config,
14
+ testIdPrefix
15
+ }) {
16
+ const tr = useTr();
17
+ const { nodes, sourceIds, selectedSource, setSelectedSource, inputFields } = config;
18
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
19
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-2 border-b border-border px-3 py-2", children: [
20
+ /* @__PURE__ */ jsx(
21
+ Icon,
22
+ {
23
+ icon: "mdi:tray-arrow-down",
24
+ className: "size-3.5 text-muted-foreground"
25
+ }
26
+ ),
27
+ /* @__PURE__ */ jsx("span", { className: "text-[11px] font-semibold uppercase tracking-[0.12em] text-muted-foreground", children: tr("fluidgrids.builder.quickConfigPanel.inputHeading", "Input") }),
28
+ sourceIds.length > 0 && /* @__PURE__ */ jsx(
29
+ "select",
30
+ {
31
+ className: "ml-auto max-w-[55%] truncate rounded-md border border-border-default bg-bg-surface px-1.5 py-0.5 text-[11px] text-text-primary scheme-normal dark:scheme-dark outline-none focus:border-action-primary-border [&_option]:bg-bg-surface [&_option]:text-text-primary",
32
+ value: selectedSource ?? "",
33
+ onChange: (e) => setSelectedSource(e.target.value),
34
+ "aria-label": tr(
35
+ "fluidgrids.builder.quickConfigPanel.inputHeading",
36
+ "Input"
37
+ ),
38
+ "data-testid": `${testIdPrefix}-source-selector`,
39
+ children: sourceIds.map((sid) => {
40
+ const sn = nodes.find((n) => n.id === sid);
41
+ return /* @__PURE__ */ jsx("option", { value: sid, children: nodeTitle(sn) }, sid);
42
+ })
43
+ }
44
+ )
45
+ ] }),
46
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-auto px-2 py-2", children: inputFields.length > 0 ? /* @__PURE__ */ jsx(FieldTree, { fields: inputFields, draggable: true }) : /* @__PURE__ */ jsx("p", { className: "px-2 py-4 text-center text-xs text-muted-foreground", children: sourceIds.length === 0 ? tr(
47
+ "fluidgrids.builder.quickConfigPanel.noUpstreamNode",
48
+ "Connect an upstream node to map its fields."
49
+ ) : tr(
50
+ "fluidgrids.builder.quickConfigPanel.noOutputFields",
51
+ "The selected source has no declared output fields."
52
+ ) }) }),
53
+ /* @__PURE__ */ jsx("p", { className: "shrink-0 border-t border-border px-3 py-1.5 text-[10px] leading-snug text-muted-foreground", children: tr(
54
+ "fluidgrids.builder.quickConfigPanel.dragFieldHint",
55
+ "Drag a field onto a parameter to map it."
56
+ ) })
57
+ ] });
58
+ }
59
+ function NodeEditorTabs({
60
+ active,
61
+ onChange,
62
+ hasSchedule,
63
+ testIdPrefix,
64
+ className
65
+ }) {
66
+ const tr = useTr();
67
+ return /* @__PURE__ */ jsxs(
68
+ "div",
69
+ {
70
+ className: cn(
71
+ "flex shrink-0 items-center gap-4 border-b border-border px-3",
72
+ className
73
+ ),
74
+ children: [
75
+ /* @__PURE__ */ jsx(
76
+ TabButton,
77
+ {
78
+ active: active === "parameters",
79
+ onClick: () => onChange("parameters"),
80
+ testId: `${testIdPrefix}-tab-parameters`,
81
+ children: tr("fluidgrids.builder.nodeDetailView.tabParameters", "Parameters")
82
+ }
83
+ ),
84
+ hasSchedule && /* @__PURE__ */ jsx(
85
+ TabButton,
86
+ {
87
+ active: active === "schedule",
88
+ onClick: () => onChange("schedule"),
89
+ testId: `${testIdPrefix}-tab-schedule`,
90
+ children: tr("fluidgrids.builder.nodeDetailView.tabSchedule", "Schedule")
91
+ }
92
+ ),
93
+ /* @__PURE__ */ jsx(
94
+ TabButton,
95
+ {
96
+ active: active === "settings",
97
+ onClick: () => onChange("settings"),
98
+ testId: `${testIdPrefix}-tab-settings`,
99
+ children: tr("fluidgrids.builder.nodeDetailView.tabSettings", "Settings")
100
+ }
101
+ )
102
+ ]
103
+ }
104
+ );
105
+ }
106
+ function activeNodeEditorTab(tab, hasSchedule) {
107
+ return tab === "schedule" && !hasSchedule ? "parameters" : tab;
108
+ }
109
+ function nodeHasScheduleTab(nodeType, schedulePolicies) {
110
+ return schedulePolicies && nodeType === SCHEDULE_NODE_TYPE;
111
+ }
112
+ function useNodeEditorTab(nodeType) {
113
+ const { schedulePolicies } = usePhaseCFlags();
114
+ const hasSchedule = nodeHasScheduleTab(nodeType, schedulePolicies);
115
+ const [tab, setTab] = useState("parameters");
116
+ return { tab: activeNodeEditorTab(tab, hasSchedule), setTab, hasSchedule };
117
+ }
118
+ function NodeEditorTabBody({
119
+ tab,
120
+ config,
121
+ nodeId,
122
+ testIdPrefix
123
+ }) {
124
+ if (tab === "schedule") {
125
+ return /* @__PURE__ */ jsx(
126
+ NodeEditorSchedule,
127
+ {
128
+ config,
129
+ nodeId,
130
+ testIdPrefix
131
+ }
132
+ );
133
+ }
134
+ if (tab === "settings") {
135
+ return /* @__PURE__ */ jsx("div", { className: "p-3", "data-testid": `${testIdPrefix}-settings`, children: /* @__PURE__ */ jsx(ReadOnlyFieldset, { children: /* @__PURE__ */ jsx(NodeSettingsPanel, { config }) }) });
136
+ }
137
+ return /* @__PURE__ */ jsx("div", { className: "space-y-4 p-3", "data-testid": `${testIdPrefix}-params`, children: /* @__PURE__ */ jsx(ReadOnlyFieldset, { className: "space-y-4", children: /* @__PURE__ */ jsx(
138
+ NodeParamsForm,
139
+ {
140
+ config,
141
+ nodeType: config.node?.type,
142
+ testIdPrefix
143
+ }
144
+ ) }) });
145
+ }
146
+ function NodeEditorSchedule({
147
+ config,
148
+ nodeId,
149
+ testIdPrefix
150
+ }) {
151
+ const workflowKey = useFlowStore((s) => s.workflow.workflowKey);
152
+ const workflowDbId = useFlowStore((s) => s.workflow.dbId);
153
+ const { allowed: canExecute } = useFluidGridsPermission(
154
+ FLUIDGRIDS_PERMISSIONS.WORKFLOW_RUN_EXECUTE
155
+ );
156
+ const { allowed: canUpdate } = useFluidGridsPermission(
157
+ FLUIDGRIDS_PERMISSIONS.WORKFLOW_UPDATE
158
+ );
159
+ return /* @__PURE__ */ jsx("div", { "data-testid": `${testIdPrefix}-schedule`, children: /* @__PURE__ */ jsx(
160
+ SchedulePanel,
161
+ {
162
+ state: config.argsState,
163
+ writeField: config.writeFixed,
164
+ workflowKey: workflowDbId && workflowKey ? workflowKey : null,
165
+ triggerNodeId: nodeId,
166
+ canExecute,
167
+ canUpdate
168
+ }
169
+ ) });
170
+ }
171
+
172
+ export { NodeEditorTabBody, NodeEditorTabs, NodeInputFields, useNodeEditorTab };