@burdenoff/fluidgrids-fe-sdk 2026.1111.1 → 2026.1111.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.
Files changed (42) hide show
  1. package/dist/{ExecutionDetailPage-DpAYZYx2.js → ExecutionDetailPage-Dpv1mVsb.js} +96 -34
  2. package/dist/{FailureTriagePanel-BJoO3lsL.js → FailureTriagePanel-D2RjCsYa.js} +97 -3
  3. package/dist/{FluidGridsProvider-CraUhM4E.js → FluidGridsProvider-Bg6wKnX4.js} +1 -1
  4. package/dist/{HistoryPage-CYqyngbp.js → HistoryPage-D75ICUi7.js} +3 -3
  5. package/dist/{InsightsPage-DBnOta71.js → InsightsPage-DFJ--w4r.js} +352 -72
  6. package/dist/{ManagedAiPolicyAuthority-D3AYZ5FP.js → ManagedAiPolicyAuthority-DsW8Jmm7.js} +297 -71
  7. package/dist/{MissingNodesInstallModal-LdB_-hSf.js → MissingNodesInstallModal-SlsOhIEf.js} +2 -2
  8. package/dist/{NodesPage-fEUyUKLC.js → NodesPage-CcHVwFdc.js} +2 -2
  9. package/dist/{PublishCustomNodeAction-C6qkAIjG.js → PublishCustomNodeAction-BzYU-juH.js} +1 -1
  10. package/dist/{TemplateConfigurationModal-CnqJFt2f.js → TemplateConfigurationModal-CdaNA1-J.js} +2 -2
  11. package/dist/{TemplateDetailPanel-BWnLqcA7.js → TemplateDetailPanel-B83bYkbT.js} +2 -2
  12. package/dist/{TemplatesPage-omZCh0-D.js → TemplatesPage-WTy20LXZ.js} +5 -5
  13. package/dist/{VersionDiffDialog-CLgIj_jc.js → VersionDiffDialog-BEIc5QBh.js} +1 -1
  14. package/dist/{WorkflowProposalCard-CV4kV4_Z.js → WorkflowProposalCard-KEvkgAE1.js} +1 -1
  15. package/dist/{WorkflowSearchRedirect-D34qC1Qm.js → WorkflowSearchRedirect-DB9R9UDy.js} +10 -10
  16. package/dist/{WorkflowShareDialog-DiD8Gqim.js → WorkflowShareDialog-C6icr074.js} +2 -2
  17. package/dist/{WorkflowsList-Bgsy1OPw.js → WorkflowsList-DZ_QxXEV.js} +5 -5
  18. package/dist/{agent-form-Ci_vxQF5.js → agent-form-hb7BR-JZ.js} +1 -1
  19. package/dist/{agentTools-D61qQFfw.js → agentTools-eOm3_v4A.js} +2 -2
  20. package/dist/{codec-client-Cm4GXmJ9.js → codec-client-B3ugmi-P.js} +1 -1
  21. package/dist/executions.js +1 -1
  22. package/dist/{flow-builder-sG8ZsMYV.js → flow-builder-B31fZz3L.js} +22 -22
  23. package/dist/history.js +1 -1
  24. package/dist/{index-FrgTpWov.d.ts → index-lX6U7gi1.d.ts} +67 -1
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.js +24 -24
  27. package/dist/{node-detail-view-pyTakx4l.js → node-detail-view-DIR_J4IW.js} +6 -6
  28. package/dist/{node-endpoint-configs-DXCKkK_9.js → node-endpoint-configs-DS59aLlH.js} +560 -4
  29. package/dist/nodes.js +1 -1
  30. package/dist/observability.d.ts +1 -1
  31. package/dist/observability.js +1 -1
  32. package/dist/{quick-config-panel-Zpsh2brj.js → quick-config-panel-iYkp65in.js} +2 -2
  33. package/dist/settings.js +1 -1
  34. package/dist/templates.js +1 -1
  35. package/dist/{useAgentDefinitions-Czl2aHJb.js → useAgentDefinitions-SRq-nq4y.js} +1 -1
  36. package/dist/{useExecutions-CZuOL3RI.js → useExecutions-D08C6QHV.js} +3 -2
  37. package/dist/{useObservability-D402nqXD.js → useObservability-111g9mWF.js} +2 -2
  38. package/dist/{useRunHistory-CsXQohcH.js → useRunHistory-DV-ad0I8.js} +2 -2
  39. package/dist/{useWorkflows-UyKrrkX-.js → useWorkflows-B0-aiUr8.js} +2 -2
  40. package/dist/workflow-builder.js +2 -2
  41. package/dist/workflows-list.js +1 -1
  42. package/package.json +1 -1
@@ -1,20 +1,20 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { $ as DurableParityRunFieldsDocument, $n as UpdateTaskQueueDocument, B as DeleteTaskQueueDocument, Br as WorkflowRunHierarchyDocument, Cn as SetWorkerTokenConnectionAllowlistDocument, D as CreateWorkerTokenDocument, E as CreateTaskQueueDocument, Ln as TaskQueueStatsDocument, Pi as throwIfResultError, Ri as getFluidGridsConfig, Rn as TaskQueuesDocument, Tn as SetWorkflowRunVersioningOverrideDocument, Ur as WorkflowRunMetadataDocument, V as DeleteWorkerTokenDocument, Wr as WorkflowRunPendingDocument, Yi as useExecutionsStore, an as RotateWorkerTokenDocument, bi as getFluidGridsClientSafe, gn as RunLogsDocument, ji as describeOperationError, mi as WorkflowWorkersDocument, mn as RunLogAppendedDocument, mr as WorkflowBatchOperationUpdatedDocument, on as RunAiUsageDocument, qr as WorkflowRunsCountDocument, sr as WorkerTokensDocument, st as ExplainRunDocument, yi as getFluidGridsClient } from "./node-endpoint-configs-DXCKkK_9.js";
4
- import { $t as runDurationMs, Hn as useDurableFunctionNodesEnabled, Pn as runSignalTargets, Qt as nodeStateDurationMs, Un as useDurableParityEnabled, Yn as useWorkflowTestsEnabled, Zt as formatElapsedMs, jn as durableInterfaceOf, kn as canSignalRun, qn as usePhaseCFlags } from "./FluidGridsProvider-CraUhM4E.js";
3
+ import { $ as DurableParityRunFieldsDocument, $i as useExecutionsStore, B as DeleteTaskQueueDocument, Ci as getFluidGridsClientSafe, D as CreateWorkerTokenDocument, E as CreateTaskQueueDocument, En as SetWorkflowRunVersioningOverrideDocument, Kr as WorkflowRunMetadataDocument, Li as throwIfResultError, Pi as describeOperationError, Qi as DEFAULT_EXECUTIONS_FILTER, Rn as TaskQueueStatsDocument, Si as getFluidGridsClient, Ur as WorkflowRunHierarchyDocument, V as DeleteWorkerTokenDocument, Vi as getFluidGridsConfig, Xr as WorkflowRunsCountDocument, _i as WorkflowWorkersDocument, _n as RunLogsDocument, ct as ExplainRunDocument, er as UpdateTaskQueueDocument, gr as WorkflowBatchOperationUpdatedDocument, hn as RunLogAppendedDocument, lr as WorkerTokensDocument, on as RotateWorkerTokenDocument, qr as WorkflowRunPendingDocument, sn as RunAiUsageDocument, wn as SetWorkerTokenConnectionAllowlistDocument, zn as TaskQueuesDocument } from "./node-endpoint-configs-DS59aLlH.js";
4
+ import { $t as runDurationMs, Hn as useDurableFunctionNodesEnabled, Pn as runSignalTargets, Qt as nodeStateDurationMs, Un as useDurableParityEnabled, Yn as useWorkflowTestsEnabled, Zt as formatElapsedMs, jn as durableInterfaceOf, kn as canSignalRun, qn as usePhaseCFlags } from "./FluidGridsProvider-Bg6wKnX4.js";
5
5
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
6
- import { h as useWorkflowDefinitions, v as useWorkflowVersions } from "./useWorkflows-UyKrrkX-.js";
6
+ import { h as useWorkflowDefinitions, v as useWorkflowVersions } from "./useWorkflows-B0-aiUr8.js";
7
7
  import { KF as WorkflowUpdateWaitFor, OF as WorkflowQueryRejectCondition, Qu as ErrorType, dF as WorkflowBatchOperationType, fI as useFluidGridsPermission, kF as WorkflowResetType, lI as SdkPermissionButton, oI as FLUIDGRIDS_PERMISSIONS, pP as VersioningBehavior } from "./graphql-types-CulUbQWN.js";
8
- import { _ as statusCountFilter, c as OPERATORS_BY_TYPE, d as STATUS_COUNT_GROUP_BY, f as callbackTone, g as shortRunId, h as runChainLinks, i as useExecutionStats, l as buildSearchAttributeFilter, m as parseMetadataDefinition, n as useExecution, o as useExecutionsWithStore, p as overrideRequestOf, r as useExecutionActions, s as EMPTY_SEARCH_FILTER, t as useAutoRefresh, u as searchFilterConflicts, v as statusCountsOf, y as validateDateRange } from "./useExecutions-CZuOL3RI.js";
8
+ import { _ as statusCountFilter, c as OPERATORS_BY_TYPE, d as STATUS_COUNT_GROUP_BY, f as callbackTone, g as shortRunId, h as runChainLinks, i as useExecutionStats, l as buildSearchAttributeFilter, m as parseMetadataDefinition, n as useExecution, o as useExecutionsWithStore, p as overrideRequestOf, r as useExecutionActions, s as EMPTY_SEARCH_FILTER, t as useAutoRefresh, u as searchFilterConflicts, v as statusCountsOf, y as validateDateRange } from "./useExecutions-D08C6QHV.js";
9
9
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
10
10
  import { t as executionsControls } from "./pageControlSpecs-DZJ9K37m.js";
11
11
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-iRiufGc2.js";
12
- import { $ as startBatchTerminate, A as fetchBatchOperation, B as jsonArg, F as fetchRunControlFields, G as resetRun, I as fetchRunHistoryArchive, K as resetRunToLastCleanTask, L as fetchRunUpdate, N as fetchCodecServerSettings, O as failActivityById, P as fetchPauseRules, Q as startBatchOperation, R as fetchSearchAttributes, U as queryRun, V as pauseActivities, W as resetActivities, X as sendRunUpdate, Z as startBatchExport, _ as useResource, at as readTyped, c as FieldError, d as NativeSelect, f as RUN_CONTROL_DIALOG_STYLE, g as parseJsonObjectInput, h as parseJsonInput, it as upsertRunSearchAttributes, j as fetchBatchOperations, l as JsonBlock, m as newRunControlId, ot as writeTyped, p as StatusPill, q as revokeSignalToken, rt as updateActivityOptions, s as isAgentNodeType, tt as unpauseActivities, u as JsonField, w as createSignalToken, x as completeActivityById, y as cancelBatchOperation, z as fetchSignalTokens } from "./agent-form-Ci_vxQF5.js";
13
- import { C as useAvailableTags, _ as buildNodeDisplayMap, b as EntityTagPicker, n as useWorkflowProposal, o as canSaveRunAsTestCase, r as saveRunAsTestCase, t as WorkflowProposalCard, v as formatRunVersion, y as nodeDisplayTitle } from "./WorkflowProposalCard-CV4kV4_Z.js";
12
+ import { $ as startBatchTerminate, A as fetchBatchOperation, B as jsonArg, F as fetchRunControlFields, G as resetRun, I as fetchRunHistoryArchive, K as resetRunToLastCleanTask, L as fetchRunUpdate, N as fetchCodecServerSettings, O as failActivityById, P as fetchPauseRules, Q as startBatchOperation, R as fetchSearchAttributes, U as queryRun, V as pauseActivities, W as resetActivities, X as sendRunUpdate, Z as startBatchExport, _ as useResource, at as readTyped, c as FieldError, d as NativeSelect, f as RUN_CONTROL_DIALOG_STYLE, g as parseJsonObjectInput, h as parseJsonInput, it as upsertRunSearchAttributes, j as fetchBatchOperations, l as JsonBlock, m as newRunControlId, ot as writeTyped, p as StatusPill, q as revokeSignalToken, rt as updateActivityOptions, s as isAgentNodeType, tt as unpauseActivities, u as JsonField, w as createSignalToken, x as completeActivityById, y as cancelBatchOperation, z as fetchSignalTokens } from "./agent-form-hb7BR-JZ.js";
13
+ import { C as useAvailableTags, _ as buildNodeDisplayMap, b as EntityTagPicker, n as useWorkflowProposal, o as canSaveRunAsTestCase, r as saveRunAsTestCase, t as WorkflowProposalCard, v as formatRunVersion, y as nodeDisplayTitle } from "./WorkflowProposalCard-KEvkgAE1.js";
14
14
  import { t as AiCreditBalanceSlot } from "./aiCreditsBridge-BuE92tKo.js";
15
- import { a as encodedPayloadBytes, f as EffectBadge, h as useRunPolicyDecisions, i as decodePayloads, l as formatBudgetUsd, n as checkCodecServerUrl, o as isEncodedPayload, r as containsEncodedPayload, t as CodecServerError } from "./codec-client-Cm4GXmJ9.js";
16
- import { a as fetchRunFailureClusters, i as dismissRunFailureCluster, r as OPEN_STATUSES, t as BUCKET_LABELS } from "./FailureTriagePanel-BJoO3lsL.js";
17
- import { a as useDurableRunFields, i as useDeterminismStatus, n as SignalRunDialog, o as useRunStackTrace, r as terminateDurableRun, s as RunHistoryView, t as useRunHistory } from "./useRunHistory-CsXQohcH.js";
15
+ import { a as fetchRunFailureClusters, i as dismissRunFailureCluster, o as runListFilterFromSearch, r as OPEN_STATUSES, s as runListLinkKey, t as BUCKET_LABELS } from "./FailureTriagePanel-D2RjCsYa.js";
16
+ import { a as encodedPayloadBytes, f as EffectBadge, h as useRunPolicyDecisions, i as decodePayloads, l as formatBudgetUsd, n as checkCodecServerUrl, o as isEncodedPayload, r as containsEncodedPayload, t as CodecServerError } from "./codec-client-B3ugmi-P.js";
17
+ import { a as useDurableRunFields, i as useDeterminismStatus, n as SignalRunDialog, o as useRunStackTrace, r as terminateDurableRun, s as RunHistoryView, t as useRunHistory } from "./useRunHistory-DV-ad0I8.js";
18
18
  import { a as formatTokens, o as modelLabel, r as aiCost } from "./ai-usage-CK61EZWc.js";
19
19
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
20
20
  import { Link, useNavigate, useParams, useSearchParams } from "react-router";
@@ -239,6 +239,7 @@ function countActiveFilters(filter, parityEnabled) {
239
239
  filter.durationMaxSeconds !== null,
240
240
  filter.errorType !== "all",
241
241
  filter.nodeId !== "",
242
+ filter.failedNodeType !== "",
242
243
  filter.tagId !== "",
243
244
  parityEnabled && filter.workflowId.trim() !== ""
244
245
  ].filter(Boolean).length;
@@ -280,6 +281,36 @@ function TagFilterSelect({ value, onChange, className }) {
280
281
  }
281
282
 
282
283
  // src/modules/executions/components/ExecutionFilters.tsx
284
+ /**
285
+ * An error type set by a link (Insights, BOFF-9974) that the dropdown offers
286
+ * no option for, so it still shows as selected.
287
+ */
288
+ function LinkedErrorTypeOption({ errorType, offered }) {
289
+ if (errorType === "all" || offered.some(({ value }) => value === errorType)) return null;
290
+ return /* @__PURE__ */ jsx("option", {
291
+ value: errorType,
292
+ children: errorType
293
+ });
294
+ }
295
+ /** The failed-node-type filter (BOFF-9974), set only by links, with its clear button. */
296
+ function FailedNodeTypeChip({ nodeType, onClear }) {
297
+ const tr = useTr();
298
+ if (!nodeType) return null;
299
+ return /* @__PURE__ */ jsxs("span", {
300
+ className: "inline-flex items-center gap-1.5 rounded-lg border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary",
301
+ "data-testid": "runs-failed-node-type-filter",
302
+ children: [tr("fluidgrids.executions.executionFilters.failedNodeType", "Failed node: {{nodeType}}", { nodeType }), /* @__PURE__ */ jsx("button", {
303
+ type: "button",
304
+ onClick: onClear,
305
+ "aria-label": tr("fluidgrids.executions.executionFilters.clearFailedNodeType", "Remove the failed node filter"),
306
+ className: "text-text-secondary hover:text-text-primary",
307
+ children: /* @__PURE__ */ jsx(Icon, {
308
+ icon: "mdi:close",
309
+ width: 14
310
+ })
311
+ })]
312
+ });
313
+ }
283
314
  function ExecutionFilters({ workflows = [], onRefresh }) {
284
315
  const tr = useTr();
285
316
  const statusOptions = useMemo(() => [
@@ -376,8 +407,8 @@ function ExecutionFilters({ workflows = [], onRefresh }) {
376
407
  label: tr("fluidgrids.executions.executionFilters.dateCustomRange", "Custom Range")
377
408
  }
378
409
  ];
379
- const { filter, setStatusFilter, setWorkflowFilter, setDateRange, setSearchQuery, setTriggerTypeFilter, setDurationFilter, setErrorTypeFilter, setNodeFilter, setTagFilter, resetFilters, autoRefresh, setAutoRefresh } = useExecutionsStore();
380
- const [showCustomDate, setShowCustomDate] = useState(false);
410
+ const { filter, setStatusFilter, setWorkflowFilter, setDateRange, setSearchQuery, setTriggerTypeFilter, setDurationFilter, setErrorTypeFilter, setNodeFilter, setFailedNodeTypeFilter, setTagFilter, resetFilters, autoRefresh, setAutoRefresh } = useExecutionsStore();
411
+ const [showCustomDate, setShowCustomDate] = useState(() => filter.dateRange.preset === "custom");
381
412
  const handleDatePresetChange = useCallback((preset) => {
382
413
  const now = /* @__PURE__ */ new Date();
383
414
  let start = null;
@@ -558,13 +589,24 @@ function ExecutionFilters({ workflows = [], onRefresh }) {
558
589
  value: filter.errorType,
559
590
  onChange: (e) => setErrorTypeFilter(e.target.value),
560
591
  className: "px-3 py-2 bg-bg-surface border border-border-default rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg scheme-normal dark:scheme-dark",
561
- children: [/* @__PURE__ */ jsx("option", {
562
- value: "all",
563
- children: tr("fluidgrids.executions.executionFilters.allErrors", "All error types")
564
- }), errorOptions.map(({ value, label }) => /* @__PURE__ */ jsx("option", {
565
- value,
566
- children: label
567
- }, value))]
592
+ children: [
593
+ /* @__PURE__ */ jsx("option", {
594
+ value: "all",
595
+ children: tr("fluidgrids.executions.executionFilters.allErrors", "All error types")
596
+ }),
597
+ errorOptions.map(({ value, label }) => /* @__PURE__ */ jsx("option", {
598
+ value,
599
+ children: label
600
+ }, value)),
601
+ /* @__PURE__ */ jsx(LinkedErrorTypeOption, {
602
+ errorType: filter.errorType,
603
+ offered: errorOptions
604
+ })
605
+ ]
606
+ }),
607
+ /* @__PURE__ */ jsx(FailedNodeTypeChip, {
608
+ nodeType: filter.failedNodeType,
609
+ onClear: () => setFailedNodeTypeFilter("")
568
610
  }),
569
611
  /* @__PURE__ */ jsx("input", {
570
612
  type: "text",
@@ -3577,10 +3619,21 @@ var ExecutionsListPage_exports = /* @__PURE__ */ __exportAll({ ExecutionsListPag
3577
3619
  function ExecutionsListPage() {
3578
3620
  const tr = useTr();
3579
3621
  const navigate = useNavigate();
3580
- const { viewMode, setViewMode, setSelectedExecution, selection, clearSelection, setStatusFilter, setWorkflowFilter, setWorkflowIdFilter, filter, autoRefresh, autoRefreshInterval } = useExecutionsStore();
3622
+ const { viewMode, setViewMode, setSelectedExecution, selection, clearSelection, setStatusFilter, setWorkflowFilter, setWorkflowIdFilter, updateFilter, filter, autoRefresh, autoRefreshInterval } = useExecutionsStore();
3581
3623
  const [searchParams] = useSearchParams();
3582
3624
  const workflowKeyParam = searchParams.get("workflowKey") ?? "";
3583
3625
  const lastWorkflowKeyParam = useRef(null);
3626
+ const linkKey = runListLinkKey(searchParams);
3627
+ const [appliedLinkKey, setAppliedLinkKey] = useState(null);
3628
+ if (appliedLinkKey !== linkKey) {
3629
+ setAppliedLinkKey(linkKey);
3630
+ const linked = runListFilterFromSearch(searchParams);
3631
+ if (linked) updateFilter({
3632
+ ...DEFAULT_EXECUTIONS_FILTER,
3633
+ ...linked,
3634
+ workflowKey: workflowKeyParam
3635
+ });
3636
+ }
3584
3637
  if (lastWorkflowKeyParam.current !== workflowKeyParam) {
3585
3638
  lastWorkflowKeyParam.current = workflowKeyParam;
3586
3639
  if (useExecutionsStore.getState().filter.workflowKey !== workflowKeyParam) setWorkflowFilter(workflowKeyParam);
@@ -5023,58 +5076,67 @@ function RunDataPrunedNotice({ dataPrunedAt }) {
5023
5076
  function isRecord$1(value) {
5024
5077
  return typeof value === "object" && value !== null && !Array.isArray(value);
5025
5078
  }
5079
+ function isRunQueueScope(value) {
5080
+ return value === "WORKFLOW" || value === "WORKSPACE";
5081
+ }
5026
5082
  /** The queue marker on a run's context, or null when there is none or it is malformed. */
5027
5083
  function readRunQueueMarker(context) {
5028
5084
  if (!isRecord$1(context)) return null;
5029
5085
  const marker = context.concurrency;
5030
5086
  if (!isRecord$1(marker)) return null;
5031
- const { queuedAt, checkedAt, limit, active, position } = marker;
5032
- if (typeof queuedAt !== "string" || typeof checkedAt !== "string" || typeof limit !== "number" || typeof active !== "number" || typeof position !== "number") return null;
5087
+ const { queuedAt, checkedAt, limit, active, position, scope } = marker;
5088
+ if (typeof queuedAt !== "string" || typeof checkedAt !== "string" || typeof limit !== "number" || typeof active !== "number" || typeof position !== "number" || scope !== void 0 && !isRunQueueScope(scope)) return null;
5033
5089
  return {
5034
5090
  queuedAt,
5035
5091
  checkedAt,
5036
5092
  limit,
5037
5093
  active,
5038
- position
5094
+ position,
5095
+ scope: isRunQueueScope(scope) ? scope : "WORKFLOW"
5039
5096
  };
5040
5097
  }
5041
5098
 
5042
5099
  // src/modules/executions/components/RunQueuedBanner.tsx
5043
5100
  /**
5044
- * Run detail: why a PENDING run has not started (BOFF-7647).
5101
+ * Run detail: why a PENDING run has not started (BOFF-7647, BOFF-9949).
5045
5102
  *
5046
- * A workflow's "Max parallel executions" setting holds extra production runs
5047
- * in a queue instead of failing them; they start in order as slots free up.
5048
- * The worker records the wait on the run as `context.concurrency`. Renders
5049
- * nothing for any other run.
5103
+ * A workflow's "Max parallel executions" setting, and the workspace's
5104
+ * concurrent-run cap from its plan, hold extra production runs in a queue
5105
+ * instead of failing them; they start in order as slots free up. The worker
5106
+ * records the wait on the run as `context.concurrency`, with the limit it
5107
+ * waits behind. Renders nothing for any other run.
5050
5108
  */
5051
5109
  function RunQueuedBanner({ status, context }) {
5052
5110
  const tr = useTr();
5053
5111
  if (status !== "PENDING") return null;
5054
5112
  const marker = readRunQueueMarker(context);
5055
5113
  if (!marker) return null;
5114
+ const numbers = {
5115
+ limit: String(marker.limit),
5116
+ active: String(marker.active),
5117
+ position: String(marker.position)
5118
+ };
5119
+ const since = new Date(marker.queuedAt).toLocaleString();
5120
+ const workspace = marker.scope === "WORKSPACE";
5056
5121
  return /* @__PURE__ */ jsxs("div", {
5057
5122
  className: "mb-6 rounded-lg border border-border-secondary bg-background-secondary p-4",
5058
5123
  "data-testid": "run-queued-banner",
5124
+ "data-queue-scope": marker.scope,
5059
5125
  children: [
5060
5126
  /* @__PURE__ */ jsxs("div", {
5061
5127
  className: "flex items-center gap-2 text-sm font-medium text-text-primary",
5062
5128
  children: [/* @__PURE__ */ jsx(Icon, {
5063
5129
  icon: "mdi:tray-full",
5064
5130
  width: 18
5065
- }), tr("fluidgrids.executions.queued.heading", "Queued")]
5131
+ }), workspace ? tr("fluidgrids.executions.queued.workspaceHeading", "Waiting: workspace concurrency limit") : tr("fluidgrids.executions.queued.heading", "Queued")]
5066
5132
  }),
5067
5133
  /* @__PURE__ */ jsx("p", {
5068
5134
  className: "mt-1 text-sm text-text-secondary",
5069
- children: tr("fluidgrids.executions.queued.body", "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.", {
5070
- limit: String(marker.limit),
5071
- active: String(marker.active),
5072
- position: String(marker.position)
5073
- })
5135
+ children: workspace ? tr("fluidgrids.executions.queued.workspaceBody", "This workspace allows {{limit}} runs at a time across all its workflows and {{active}} are in progress. This run is number {{position}} in line and starts automatically when a slot frees up.", numbers) : tr("fluidgrids.executions.queued.body", "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.", numbers)
5074
5136
  }),
5075
5137
  /* @__PURE__ */ jsx("p", {
5076
5138
  className: "mt-1 text-xs text-text-tertiary",
5077
- children: tr("fluidgrids.executions.queued.since", "Queued since {{time}} · change the limit in the workflow's Settings (Max parallel executions)", { time: new Date(marker.queuedAt).toLocaleString() })
5139
+ children: workspace ? tr("fluidgrids.executions.queued.workspaceSince", "Queued since {{time}} · the limit comes from your workspace's plan", { time: since }) : tr("fluidgrids.executions.queued.since", "Queued since {{time}} · change the limit in the workflow's Settings (Max parallel executions)", { time: since })
5078
5140
  })
5079
5141
  ]
5080
5142
  });
@@ -1,12 +1,106 @@
1
1
  "use client";
2
+ import { Cn as SetRunFailureTriageEnabledDocument, Li as throwIfResultError, Si as getFluidGridsClient, X as DismissRunFailureClusterDocument, dn as RunFailureClustersDocument, fn as RunFailureTriageSettingsDocument, ft as FgTriageFailedRunsDocument } from "./node-endpoint-configs-DS59aLlH.js";
2
3
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
3
- import { Pi as throwIfResultError, Sn as SetRunFailureTriageEnabledDocument, X as DismissRunFailureClusterDocument, dn as RunFailureTriageSettingsDocument, dt as FgTriageFailedRunsDocument, un as RunFailureClustersDocument, yi as getFluidGridsClient } from "./node-endpoint-configs-DXCKkK_9.js";
4
- import { cD as RunFailureClusterStatus } from "./graphql-types-CulUbQWN.js";
4
+ import { Qu as ErrorType, cD as RunFailureClusterStatus } from "./graphql-types-CulUbQWN.js";
5
5
  import { useCallback, useEffect, useState } from "react";
6
6
  import { Icon } from "@iconify/react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  import { Button } from "@burdenoff/fe-libs/ui";
9
9
 
10
+ // src/modules/executions/utils/run-list-links.ts
11
+ /**
12
+ * Links into the Runs list that carry its filters in the query string
13
+ * (BOFF-9974), and the reading of them on the list.
14
+ *
15
+ * Insights' error panel links each failing node, error type, workflow and day
16
+ * to "the failed runs behind it". The two halves live together so a link and
17
+ * the filter it opens cannot drift apart.
18
+ *
19
+ * ../runs?status=FAILED&failedNodeType=internal%3Ahttp&from=…&to=…
20
+ *
21
+ * `from` / `to` are ISO instants (the list's custom date range); `workflowKey`
22
+ * is read by the list on its own, as it always was.
23
+ */
24
+ /** The filters a link may set; `workflowKey` stays with the list's own sync. */
25
+ const RUN_LIST_LINK_PARAMS = [
26
+ "status",
27
+ "errorType",
28
+ "failedNodeType",
29
+ "from",
30
+ "to"
31
+ ];
32
+ const RUN_STATUSES = [
33
+ "PENDING",
34
+ "RUNNING",
35
+ "COMPLETED",
36
+ "FAILED",
37
+ "CANCELLED",
38
+ "WAITING",
39
+ "TERMINATED"
40
+ ];
41
+ function isRunStatus(value) {
42
+ return RUN_STATUSES.some((status) => status === value);
43
+ }
44
+ /** A classification the service knows (its ErrorType enum). */
45
+ function isErrorType(value) {
46
+ return Object.values(ErrorType).some((type) => type === value);
47
+ }
48
+ function validDate(value) {
49
+ return value instanceof Date && Number.isFinite(value.getTime());
50
+ }
51
+ /** The Runs list with `link`'s filters, relative to an SDK page route. */
52
+ function runListPath(link) {
53
+ const params = new URLSearchParams();
54
+ if (link.workflowKey) params.set("workflowKey", link.workflowKey);
55
+ if (link.status) params.set("status", link.status);
56
+ if (link.errorType) params.set("errorType", link.errorType);
57
+ if (link.failedNodeType) params.set("failedNodeType", link.failedNodeType);
58
+ if (validDate(link.from)) params.set("from", link.from.toISOString());
59
+ if (validDate(link.to)) params.set("to", link.to.toISOString());
60
+ const query = params.toString();
61
+ return query ? `../runs?${query}` : "../runs";
62
+ }
63
+ function parseDate(value) {
64
+ if (!value) return null;
65
+ const date = new Date(value);
66
+ return Number.isFinite(date.getTime()) ? date : null;
67
+ }
68
+ /**
69
+ * The list filters a link's query string sets, or null when it carries none.
70
+ * Unknown values are ignored rather than trusted (the URL is user input); a
71
+ * reversed range is dropped, like the custom range inputs do.
72
+ */
73
+ function runListFilterFromSearch(params) {
74
+ const filter = {};
75
+ const status = params.get("status")?.trim().toUpperCase() ?? "";
76
+ if (isRunStatus(status)) filter.status = status;
77
+ const errorType = params.get("errorType")?.trim().toUpperCase() ?? "";
78
+ if (isErrorType(errorType)) filter.errorType = errorType;
79
+ const failedNodeType = params.get("failedNodeType")?.trim() ?? "";
80
+ if (failedNodeType) filter.failedNodeType = failedNodeType;
81
+ const from = parseDate(params.get("from"));
82
+ const to = parseDate(params.get("to"));
83
+ if ((from || to) && !(from && to && from.getTime() > to.getTime())) filter.dateRange = {
84
+ start: from,
85
+ end: to,
86
+ preset: "custom"
87
+ };
88
+ return Object.keys(filter).length > 0 ? filter : null;
89
+ }
90
+ /** A stable key of the link parameters in `params`, to apply each link once. */
91
+ function runListLinkKey(params) {
92
+ return RUN_LIST_LINK_PARAMS.map((name) => params.get(name) ?? "").join("|");
93
+ }
94
+ /** The UTC day [00:00, 24:00) of an ISO calendar date such as "2026-11-10". */
95
+ function utcDay(date) {
96
+ const from = /* @__PURE__ */ new Date(`${date}T00:00:00.000Z`);
97
+ if (!Number.isFinite(from.getTime())) return null;
98
+ return {
99
+ from,
100
+ to: /* @__PURE__ */ new Date(from.getTime() + 864e5 - 1)
101
+ };
102
+ }
103
+
10
104
  // src/modules/observability/hooks/useFailureTriage.ts
11
105
  /**
12
106
  * Failure triage (BOFF-3698): the opt-in, the caller's failure clusters and a
@@ -307,4 +401,4 @@ function FailureTriagePanel({ canManage, canRetry, onOpenRun, onRetry }) {
307
401
  });
308
402
  }
309
403
 
310
- export { fetchRunFailureClusters as a, dismissRunFailureCluster as i, FailureTriagePanel as n, OPEN_STATUSES as r, BUCKET_LABELS as t };
404
+ export { fetchRunFailureClusters as a, runListPath as c, dismissRunFailureCluster as i, utcDay as l, FailureTriagePanel as n, runListFilterFromSearch as o, OPEN_STATUSES as r, runListLinkKey as s, BUCKET_LABELS as t };
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { t as __exportAll } from "./rolldown-runtime-hDbaFkMy.js";
3
- import { Ai as emitRunCompletedOnce, Bi as resetFluidGridsConfig, Ci as setFluidGridsClient, F as CreateWorkflowVersionDocument, Fi as createLiveTokenReader, Hi as setFluidGridsConfig, O as CreateWorkflowDefinitionDocument, Oi as emitFluidGridsEvent, Pi as throwIfResultError, Ri as getFluidGridsConfig, Rr as WorkflowRunDocument, Si as resetFluidGridsClient, Ti as createFluidGridsTokenRefreshLink, Tt as NodeManifestDocument, Ui as validateTrustedOrigin, Vi as resetFluidGridsExecutionState, Vn as TriggerWorkflowDocument, bi as getFluidGridsClientSafe, er as UpdateWorkflowDefinitionDocument, fn as RunFromNodeDocument, ji as describeOperationError, ki as emitOperationErrorEvent, nt as ExecuteStepDocument, rt as ExecutionDetailDocument, t as fetchAllNodeEndpointConfigs, tt as EventRegistrationsDocument, vi as createFluidGridsClient, wi as waitForFluidGridsClient, yi as getFluidGridsClient, yr as WorkflowDefinitionDocument } from "./node-endpoint-configs-DXCKkK_9.js";
3
+ import { Ci as getFluidGridsClientSafe, Di as waitForFluidGridsClient, Ei as setFluidGridsClient, Et as NodeManifestDocument, F as CreateWorkflowVersionDocument, Gi as setFluidGridsConfig, Hn as TriggerWorkflowDocument, Ki as validateTrustedOrigin, Li as throwIfResultError, Mi as emitOperationErrorEvent, Ni as emitRunCompletedOnce, O as CreateWorkflowDefinitionDocument, Oi as createFluidGridsTokenRefreshLink, Pi as describeOperationError, Ri as createLiveTokenReader, Si as getFluidGridsClient, Ti as resetFluidGridsClient, Ui as resetFluidGridsConfig, Vi as getFluidGridsConfig, Vr as WorkflowRunDocument, Wi as resetFluidGridsExecutionState, it as ExecutionDetailDocument, ji as emitFluidGridsEvent, nt as EventRegistrationsDocument, pn as RunFromNodeDocument, rt as ExecuteStepDocument, t as fetchAllNodeEndpointConfigs, tr as UpdateWorkflowDefinitionDocument, xi as createFluidGridsClient, xr as WorkflowDefinitionDocument } from "./node-endpoint-configs-DS59aLlH.js";
4
4
  import { A as nodeAccent, C as nodeAdaptersOf, D as NodeCard, E as resolveOutputHandles, H as useFlowStore, I as partitionStickyNotes, L as resolveStickyColor, N as DEFAULT_STICKY_COLOR, O as NodeCardBody, P as STICKY_COLORS, R as stickySurfaceStyle, T as resolveInputHandles, V as STICKY_NOTE_TYPE, W as isNodeTrigger, _ as LogicNodeCard, b as alignPlainOutputEdges, i as WAIT_FOR_SIGNAL_NODE_TYPE, j as NodeTypeIcon, k as NodeCardHeader, l as interfaceFields, m as readSignalName, n as synchronizeOperationUpdate, p as readCodeWorkflowState, r as CODE_WORKFLOW_NODE_TYPE, t as resolveOperationName, u as interfaceHandlers, v as InputHandles, w as outputHandlesSpacerHeight, x as hasNodeManifest, y as OutputHandles } from "./node-operation-selection-61d6U9qo.js";
5
5
  import { n as FluidGridsTranslationProvider, r as useTr, t as ENGLISH_FALLBACK_TRANSLATOR } from "./TranslationBridge-CX0OMnyn.js";
6
6
  import { createContext, memo, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
@@ -1,8 +1,8 @@
1
1
  "use client";
2
- import { d as useRestoreWorkflowVersion, h as useWorkflowDefinitions } from "./useWorkflows-UyKrrkX-.js";
3
- import { i as versionsOfWorkflow, t as VersionDiffDialog } from "./VersionDiffDialog-CLgIj_jc.js";
2
+ import { d as useRestoreWorkflowVersion, h as useWorkflowDefinitions } from "./useWorkflows-B0-aiUr8.js";
3
+ import { i as versionsOfWorkflow, t as VersionDiffDialog } from "./VersionDiffDialog-BEIc5QBh.js";
4
4
  import { r as useTr } from "./TranslationBridge-CX0OMnyn.js";
5
- import { Ri as getFluidGridsConfig } from "./node-endpoint-configs-DXCKkK_9.js";
5
+ import { Vi as getFluidGridsConfig } from "./node-endpoint-configs-DS59aLlH.js";
6
6
  import { n as useFluidGridsPageControls } from "./pageControlsBridge-0pX9s-3k.js";
7
7
  import { n as historyControls } from "./pageControlSpecs-DZJ9K37m.js";
8
8
  import { t as FluidGridsDocsLink } from "./FluidGridsDocsLink-iRiufGc2.js";