@burdenoff/fluidgrids-fe-sdk 2026.1111.1 → 2026.1111.2

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-BLQ9mPPO.js} +72 -19
  2. package/dist/{FailureTriagePanel-BJoO3lsL.js → FailureTriagePanel-DquVHzGD.js} +97 -3
  3. package/dist/{FluidGridsProvider-CraUhM4E.js → FluidGridsProvider-Bve22Hxu.js} +1 -1
  4. package/dist/{HistoryPage-CYqyngbp.js → HistoryPage-CCVLBD8a.js} +3 -3
  5. package/dist/{InsightsPage-DBnOta71.js → InsightsPage-BCRRKaja.js} +352 -72
  6. package/dist/{ManagedAiPolicyAuthority-D3AYZ5FP.js → ManagedAiPolicyAuthority-PhyUARha.js} +6 -6
  7. package/dist/{MissingNodesInstallModal-LdB_-hSf.js → MissingNodesInstallModal-CkbBf648.js} +2 -2
  8. package/dist/{NodesPage-fEUyUKLC.js → NodesPage-XglgbnFQ.js} +2 -2
  9. package/dist/{PublishCustomNodeAction-C6qkAIjG.js → PublishCustomNodeAction-CtRHgitG.js} +1 -1
  10. package/dist/{TemplateConfigurationModal-CnqJFt2f.js → TemplateConfigurationModal-DPe69XFz.js} +2 -2
  11. package/dist/{TemplateDetailPanel-BWnLqcA7.js → TemplateDetailPanel-ahqcAMmr.js} +2 -2
  12. package/dist/{TemplatesPage-omZCh0-D.js → TemplatesPage-CRIn51Qa.js} +5 -5
  13. package/dist/{VersionDiffDialog-CLgIj_jc.js → VersionDiffDialog-BejQlKec.js} +1 -1
  14. package/dist/{WorkflowProposalCard-CV4kV4_Z.js → WorkflowProposalCard-aoR_tT2f.js} +1 -1
  15. package/dist/{WorkflowSearchRedirect-D34qC1Qm.js → WorkflowSearchRedirect-5x2HX5tx.js} +10 -10
  16. package/dist/{WorkflowShareDialog-DiD8Gqim.js → WorkflowShareDialog-BONVJpp_.js} +2 -2
  17. package/dist/{WorkflowsList-Bgsy1OPw.js → WorkflowsList-CDPqtaa3.js} +5 -5
  18. package/dist/{agent-form-Ci_vxQF5.js → agent-form-m8tkBULw.js} +1 -1
  19. package/dist/{agentTools-D61qQFfw.js → agentTools-DxuakWxT.js} +2 -2
  20. package/dist/{codec-client-Cm4GXmJ9.js → codec-client-aN37SXBf.js} +1 -1
  21. package/dist/executions.js +1 -1
  22. package/dist/{flow-builder-sG8ZsMYV.js → flow-builder-CmJi6XWS.js} +22 -22
  23. package/dist/history.js +1 -1
  24. package/dist/{index-FrgTpWov.d.ts → index-CpEB91Ys.d.ts} +33 -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-CAUbejnM.js} +6 -6
  28. package/dist/{node-endpoint-configs-DXCKkK_9.js → node-endpoint-configs-BgZARXHI.js} +264 -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-BxM7KKaU.js} +2 -2
  33. package/dist/settings.js +1 -1
  34. package/dist/templates.js +1 -1
  35. package/dist/{useAgentDefinitions-Czl2aHJb.js → useAgentDefinitions-BKimckKY.js} +1 -1
  36. package/dist/{useExecutions-CZuOL3RI.js → useExecutions-BIrUuMlR.js} +3 -2
  37. package/dist/{useObservability-D402nqXD.js → useObservability-cCsmALjS.js} +2 -2
  38. package/dist/{useRunHistory-CsXQohcH.js → useRunHistory-DG0Nfolg.js} +2 -2
  39. package/dist/{useWorkflows-UyKrrkX-.js → useWorkflows-CQbVEHc0.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, B as DeleteTaskQueueDocument, D as CreateWorkerTokenDocument, E as CreateTaskQueueDocument, En as SetWorkflowRunVersioningOverrideDocument, Fi as throwIfResultError, Gr as WorkflowRunPendingDocument, Jr as WorkflowRunsCountDocument, Mi as describeOperationError, Rn as TaskQueueStatsDocument, V as DeleteWorkerTokenDocument, Vr as WorkflowRunHierarchyDocument, Wr as WorkflowRunMetadataDocument, Xi as DEFAULT_EXECUTIONS_FILTER, Zi as useExecutionsStore, _n as RunLogsDocument, bi as getFluidGridsClient, cr as WorkerTokensDocument, ct as ExplainRunDocument, er as UpdateTaskQueueDocument, hi as WorkflowWorkersDocument, hn as RunLogAppendedDocument, hr as WorkflowBatchOperationUpdatedDocument, on as RotateWorkerTokenDocument, sn as RunAiUsageDocument, wn as SetWorkerTokenConnectionAllowlistDocument, xi as getFluidGridsClientSafe, zi as getFluidGridsConfig, zn as TaskQueuesDocument } from "./node-endpoint-configs-BgZARXHI.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-Bve22Hxu.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-CQbVEHc0.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-BIrUuMlR.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-m8tkBULw.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-aoR_tT2f.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-DquVHzGD.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-aN37SXBf.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-DG0Nfolg.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);
@@ -1,12 +1,106 @@
1
1
  "use client";
2
+ import { Cn as SetRunFailureTriageEnabledDocument, Fi as throwIfResultError, X as DismissRunFailureClusterDocument, bi as getFluidGridsClient, dn as RunFailureClustersDocument, fn as RunFailureTriageSettingsDocument, ft as FgTriageFailedRunsDocument } from "./node-endpoint-configs-BgZARXHI.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 { Ai as emitOperationErrorEvent, Ci as resetFluidGridsClient, Ei as createFluidGridsTokenRefreshLink, Et as NodeManifestDocument, F as CreateWorkflowVersionDocument, Fi as throwIfResultError, Hi as resetFluidGridsExecutionState, Hn as TriggerWorkflowDocument, Ii as createLiveTokenReader, Mi as describeOperationError, O as CreateWorkflowDefinitionDocument, Ti as waitForFluidGridsClient, Ui as setFluidGridsConfig, Vi as resetFluidGridsConfig, Wi as validateTrustedOrigin, bi as getFluidGridsClient, br as WorkflowDefinitionDocument, it as ExecutionDetailDocument, ji as emitRunCompletedOnce, ki as emitFluidGridsEvent, nt as EventRegistrationsDocument, pn as RunFromNodeDocument, rt as ExecuteStepDocument, t as fetchAllNodeEndpointConfigs, tr as UpdateWorkflowDefinitionDocument, wi as setFluidGridsClient, xi as getFluidGridsClientSafe, yi as createFluidGridsClient, zi as getFluidGridsConfig, zr as WorkflowRunDocument } from "./node-endpoint-configs-BgZARXHI.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-CQbVEHc0.js";
3
+ import { i as versionsOfWorkflow, t as VersionDiffDialog } from "./VersionDiffDialog-BejQlKec.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 { zi as getFluidGridsConfig } from "./node-endpoint-configs-BgZARXHI.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";