@burdenoff/fluidgrids-fe-sdk 2026.1023.2 → 2026.1023.3

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.
@@ -1,4 +1,4 @@
1
- export { ExecutionDetailPage } from './chunk-MP7MRTB4.js';
1
+ export { ExecutionDetailPage } from './chunk-VMVY65DC.js';
2
2
  import './chunk-XCQROWIZ.js';
3
3
  import './chunk-LLPLOWMA.js';
4
4
  import './chunk-QBFAJNUC.js';
@@ -11,9 +11,14 @@ import { Tabs, TabsList, TabsTrigger, TabsContent, Input, Switch, Select, Select
11
11
  import { toast } from 'sonner';
12
12
  import { jsxs, jsx } from 'react/jsx-runtime';
13
13
 
14
+ // src/modules/settings/utils/max-parallelism.ts
15
+ function parseMaxParallelism(value) {
16
+ if (value.trim() === "") return void 0;
17
+ const parsed = Number.parseInt(value, 10);
18
+ return Number.isFinite(parsed) ? Math.max(1, parsed) : void 0;
19
+ }
14
20
  var DEFAULT_EXECUTION_SETTINGS = {
15
21
  timeout: 300,
16
- maxParallelism: 5,
17
22
  onError: "stop"
18
23
  };
19
24
  var DEFAULT_SETTINGS = {
@@ -295,25 +300,33 @@ function ExecutionTab({ workflowKey }) {
295
300
  SettingRow,
296
301
  {
297
302
  label: tr(
298
- "fluidgrids.settings.execution.concurrencyLimitLabel",
299
- "Concurrency Limit"
303
+ "fluidgrids.settings.execution.maxParallelLabel",
304
+ "Max parallel executions"
300
305
  ),
301
306
  description: tr(
302
- "fluidgrids.settings.execution.concurrencyLimitDescription",
303
- "Maximum number of this workflow's executions running simultaneously"
307
+ "fluidgrids.settings.execution.maxParallelDescription",
308
+ "How many production runs of this workflow may run at once. Extra runs wait in a queue and start in order; manual test runs are never held back. Leave empty for no limit."
304
309
  ),
305
310
  children: /* @__PURE__ */ jsx(
306
311
  Input,
307
312
  {
308
313
  type: "number",
309
314
  min: 1,
310
- value: form.maxParallelism ?? DEFAULT_EXECUTION_SETTINGS.maxParallelism,
315
+ value: form.maxParallelism ?? "",
316
+ placeholder: tr(
317
+ "fluidgrids.settings.execution.maxParallelPlaceholder",
318
+ "No limit"
319
+ ),
320
+ "aria-label": tr(
321
+ "fluidgrids.settings.execution.maxParallelLabel",
322
+ "Max parallel executions"
323
+ ),
311
324
  onChange: (e) => setForm((f) => ({
312
325
  ...f,
313
- maxParallelism: Math.max(1, parseInt(e.target.value, 10) || 1)
326
+ maxParallelism: parseMaxParallelism(e.target.value)
314
327
  })),
315
328
  disabled: loading,
316
- className: "w-[80px] text-right"
329
+ className: "w-[100px] text-right"
317
330
  }
318
331
  )
319
332
  }
@@ -674,7 +674,7 @@ function RunHumanRequests({ requests }) {
674
674
  children: [
675
675
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-text-primary", children: [
676
676
  /* @__PURE__ */ jsx(Icon, { icon: "mdi:account-clock-outline", width: 18 }),
677
- tr("fluidgrids.humanResponse.runHeading", "Waiting on people")
677
+ requests.some((request) => request.status === "PENDING") ? tr("fluidgrids.humanResponse.runHeading", "Waiting on people") : tr("fluidgrids.humanResponse.runHeadingDone", "People asked")
678
678
  ] }),
679
679
  requests.map((request) => /* @__PURE__ */ jsx(RunHumanRequestRow, { request }, request.id))
680
680
  ]
@@ -723,6 +723,57 @@ function RunHumanRequestRow({ request }) {
723
723
  }
724
724
  );
725
725
  }
726
+
727
+ // src/modules/executions/utils/run-queue-marker.ts
728
+ function isRecord(value) {
729
+ return typeof value === "object" && value !== null && !Array.isArray(value);
730
+ }
731
+ function readRunQueueMarker(context) {
732
+ if (!isRecord(context)) return null;
733
+ const marker = context.concurrency;
734
+ if (!isRecord(marker)) return null;
735
+ const { queuedAt, checkedAt, limit, active, position } = marker;
736
+ if (typeof queuedAt !== "string" || typeof checkedAt !== "string" || typeof limit !== "number" || typeof active !== "number" || typeof position !== "number") {
737
+ return null;
738
+ }
739
+ return { queuedAt, checkedAt, limit, active, position };
740
+ }
741
+ function RunQueuedBanner({
742
+ status,
743
+ context
744
+ }) {
745
+ const tr = useTr();
746
+ if (status !== "PENDING") return null;
747
+ const marker = readRunQueueMarker(context);
748
+ if (!marker) return null;
749
+ return /* @__PURE__ */ jsxs(
750
+ "div",
751
+ {
752
+ className: "mb-6 rounded-lg border border-border-secondary bg-background-secondary p-4",
753
+ "data-testid": "run-queued-banner",
754
+ children: [
755
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-text-primary", children: [
756
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:tray-full", width: 18 }),
757
+ tr("fluidgrids.executions.queued.heading", "Queued")
758
+ ] }),
759
+ /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-text-secondary", children: tr(
760
+ "fluidgrids.executions.queued.body",
761
+ "This workflow allows {{limit}} runs at a time and {{active}} are in progress. This run is number {{position}} in line and starts automatically when a slot frees up.",
762
+ {
763
+ limit: String(marker.limit),
764
+ active: String(marker.active),
765
+ position: String(marker.position)
766
+ }
767
+ ) }),
768
+ /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-text-tertiary", children: tr(
769
+ "fluidgrids.executions.queued.since",
770
+ "Queued since {{time}} \xB7 change the limit in the workflow's Settings (Max parallel executions)",
771
+ { time: new Date(marker.queuedAt).toLocaleString() }
772
+ ) })
773
+ ]
774
+ }
775
+ );
776
+ }
726
777
  function ExecutionDetailPage() {
727
778
  const tr = useTr();
728
779
  const { runId } = useParams();
@@ -1311,6 +1362,7 @@ function ExecutionDetailPage() {
1311
1362
  ] }),
1312
1363
  /* @__PURE__ */ jsx("p", { className: "text-[var(--color-status-error-text)]", children: execution.errorMessage })
1313
1364
  ] }),
1365
+ /* @__PURE__ */ jsx(RunQueuedBanner, { status: execution.status, context: execution.context }),
1314
1366
  /* @__PURE__ */ jsx(RunHumanRequests, { requests: humanRequests }),
1315
1367
  /* @__PURE__ */ jsx("div", { className: "border-b border-border-secondary mb-6", children: /* @__PURE__ */ jsx("nav", { className: "flex gap-4 -mb-px", children: tabs.map((tab) => /* @__PURE__ */ jsxs(
1316
1368
  "button",
@@ -1,6 +1,6 @@
1
1
  import './chunk-AD3BXTJS.js';
2
2
  export { ExecutionsListPage } from './chunk-OKWH2CHF.js';
3
- export { ExecutionDetailPage } from './chunk-MP7MRTB4.js';
3
+ export { ExecutionDetailPage } from './chunk-VMVY65DC.js';
4
4
  import './chunk-XCQROWIZ.js';
5
5
  import './chunk-LLPLOWMA.js';
6
6
  import './chunk-QBFAJNUC.js';
package/dist/index.js CHANGED
@@ -5,14 +5,14 @@ export { FirstWorkflowChecklist, FirstWorkflowChecklistView, WorkflowsList } fro
5
5
  export { GUIDED_FIRST_WORKFLOW_NAV, GUIDED_FIRST_WORKFLOW_STATE, firstWorkflowProgress, isGuidedTourIntent, pickGuidedTour } from './chunk-YGBDZ424.js';
6
6
  import './chunk-AD3BXTJS.js';
7
7
  export { ExecutionsListPage } from './chunk-OKWH2CHF.js';
8
- import { usePendingHumanRequests, HumanRequestCard } from './chunk-MP7MRTB4.js';
9
- export { ExecutionDetailPage, HumanRequestCard, RunHumanRequests, usePendingHumanRequests, useRespondToHumanRequest, useRunHumanRequests } from './chunk-MP7MRTB4.js';
8
+ import { usePendingHumanRequests, HumanRequestCard } from './chunk-VMVY65DC.js';
9
+ export { ExecutionDetailPage, HumanRequestCard, RunHumanRequests, usePendingHumanRequests, useRespondToHumanRequest, useRunHumanRequests } from './chunk-VMVY65DC.js';
10
10
  import { TagFilterSelect } from './chunk-XCQROWIZ.js';
11
11
  import './chunk-LLPLOWMA.js';
12
12
  export { HistoryPage } from './chunk-UKMXGBU3.js';
13
13
  export { NodesPage, fetchAllNodesWithManifests, useLazyNodeManifest, useNodeEndpoint, useNodeEndpoints, useNodeManifest } from './chunk-HAYSY6TZ.js';
14
14
  export { DataSinkDashboardPage, ErrorAnalyticsPage, InsightsPage } from './chunk-KAOLPDNX.js';
15
- export { SettingsPage } from './chunk-YTLPI7UV.js';
15
+ export { SettingsPage } from './chunk-GARL3KYH.js';
16
16
  export { FLUIDGRIDS_FLAGS, useDataSinkData, useDataSinks, useFluidGridsFlag, useInsightsData, useLogStreamDestinationActions, useLogStreamDestinations, useRunReplayActions } from './chunk-2QTKDR23.js';
17
17
  import './chunk-QBFAJNUC.js';
18
18
  import { ThemeProvider, extractTemplateGraph } from './chunk-3BK65TDZ.js';
@@ -81,7 +81,7 @@ var ExecutionsListPage2 = lazy(
81
81
  }))
82
82
  );
83
83
  var ExecutionDetailPage2 = lazy(
84
- () => import('./ExecutionDetailPage-K3MPJLTL.js').then((m) => ({
84
+ () => import('./ExecutionDetailPage-FDX242B5.js').then((m) => ({
85
85
  default: m.ExecutionDetailPage
86
86
  }))
87
87
  );
package/dist/settings.js CHANGED
@@ -1,4 +1,4 @@
1
- export { SettingsPage } from './chunk-YTLPI7UV.js';
1
+ export { SettingsPage } from './chunk-GARL3KYH.js';
2
2
  import './chunk-2QTKDR23.js';
3
3
  import './chunk-QBFAJNUC.js';
4
4
  import './chunk-4VJ3MDOV.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fluidgrids-fe-sdk",
3
- "version": "2026.1023.2",
3
+ "version": "2026.1023.3",
4
4
  "description": "FluidGrids Workflow Builder SDK - Embeddable visual workflow automation",
5
5
  "type": "module",
6
6
  "imports": {