@burdenoff/fluidgrids-fe-sdk 2026.1028.4 → 2026.1028.6
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.
- package/dist/ExecutionDetailPage-DHIQNBAZ.js +20 -0
- package/dist/{ExecutionsListPage-XQ5FQJ4M.js → ExecutionsListPage-IMN7OTNZ.js} +7 -7
- package/dist/{WorkflowBuilder-2UHPYNQI.js → WorkflowBuilder-VJAAKETX.js} +10 -9
- package/dist/{WorkflowsList-QBKX733V.js → WorkflowsList-3EWDWWIH.js} +7 -7
- package/dist/chunk-3KNW5QLR.js +328 -0
- package/dist/{chunk-UUUDSVC7.js → chunk-3VJ3AIFS.js} +2 -2
- package/dist/{chunk-JBLYBD2B.js → chunk-6J4RR46J.js} +6 -1
- package/dist/{chunk-CSBKB5EX.js → chunk-A2JSAGNQ.js} +1 -1
- package/dist/{chunk-DB23N7KO.js → chunk-ACUNTZTQ.js} +3 -3
- package/dist/{chunk-5LKZ4PNK.js → chunk-C4AY6JI2.js} +3 -1
- package/dist/{chunk-H7CJXSMI.js → chunk-F6NH55LU.js} +3 -3
- package/dist/chunk-FDEZGRRL.js +1201 -0
- package/dist/{chunk-UKTLRE7N.js → chunk-FO22JCOW.js} +5 -5
- package/dist/{chunk-P2NRMJ7Z.js → chunk-HHN2TIK2.js} +1 -1
- package/dist/{chunk-LWF5J43N.js → chunk-I2ZNBBRK.js} +1 -1
- package/dist/{chunk-SSJIK6WS.js → chunk-IQE7ZY6Q.js} +2 -2
- package/dist/chunk-LOZ6XNOX.js +10550 -0
- package/dist/{chunk-QGXA2USP.js → chunk-MKKBEVXO.js} +1 -1
- package/dist/{chunk-SRZITTB2.js → chunk-NAFJQGLV.js} +4 -4
- package/dist/{chunk-Y6YOY33Z.js → chunk-Q22GC7RJ.js} +1 -1
- package/dist/{chunk-AYFKS4MM.js → chunk-QW24ZBSR.js} +1 -1
- package/dist/{chunk-FOEEDKBP.js → chunk-RLA4YUDY.js} +22 -1
- package/dist/{chunk-63BP6O6E.js → chunk-RZQPHWFV.js} +2 -2
- package/dist/{chunk-JH6YDVT5.js → chunk-STPQQDIJ.js} +6 -10554
- package/dist/{chunk-ZF55RVJ3.js → chunk-UWNYWWWG.js} +4 -4
- package/dist/{chunk-CPEIOFYR.js → chunk-VP2RXXRF.js} +134 -5
- package/dist/{chunk-JAKWVVVQ.js → chunk-VQHBQAJY.js} +15 -3
- package/dist/{chunk-VXLUYQDO.js → chunk-XZPXIOGE.js} +17 -3
- package/dist/executions.js +12 -9
- package/dist/history.js +4 -4
- package/dist/index.d.ts +355 -74
- package/dist/index.js +34 -31
- package/dist/nodes.js +2 -2
- package/dist/observability.js +6 -4
- package/dist/settings.js +5 -4
- package/dist/templates.js +9 -8
- package/dist/workflow-builder.js +11 -10
- package/dist/workflows-list.js +7 -7
- package/package.json +1 -1
- package/dist/ExecutionDetailPage-MYBCDBV7.js +0 -17
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { ExecutionDetailPage } from './chunk-VP2RXXRF.js';
|
|
2
|
+
import './chunk-IQE7ZY6Q.js';
|
|
3
|
+
import './chunk-3VJ3AIFS.js';
|
|
4
|
+
import './chunk-3KNW5QLR.js';
|
|
5
|
+
import './chunk-FDEZGRRL.js';
|
|
6
|
+
import './chunk-5ERAJC2I.js';
|
|
7
|
+
import './chunk-VQHBQAJY.js';
|
|
8
|
+
import './chunk-MKKBEVXO.js';
|
|
9
|
+
import './chunk-D3UWK7GY.js';
|
|
10
|
+
import './chunk-PJAWNFJV.js';
|
|
11
|
+
import './chunk-LOZ6XNOX.js';
|
|
12
|
+
import './chunk-C4AY6JI2.js';
|
|
13
|
+
import './chunk-JL7CASN5.js';
|
|
14
|
+
import './chunk-PXIFUMLA.js';
|
|
15
|
+
import './chunk-CY6KX4RG.js';
|
|
16
|
+
import './chunk-WBH2XEWO.js';
|
|
17
|
+
import './chunk-6J4RR46J.js';
|
|
18
|
+
import './chunk-UULVIT25.js';
|
|
19
|
+
import './chunk-NTWG3CJX.js';
|
|
20
|
+
import './chunk-62GWEYJ5.js';
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
export { ExecutionsListPage } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
1
|
+
export { ExecutionsListPage } from './chunk-F6NH55LU.js';
|
|
2
|
+
import './chunk-IQE7ZY6Q.js';
|
|
3
|
+
import './chunk-3VJ3AIFS.js';
|
|
4
4
|
import './chunk-5ERAJC2I.js';
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
5
|
+
import './chunk-MKKBEVXO.js';
|
|
6
|
+
import './chunk-RZQPHWFV.js';
|
|
7
7
|
import './chunk-D3UWK7GY.js';
|
|
8
8
|
import './chunk-PJAWNFJV.js';
|
|
9
9
|
import './chunk-4VJ3MDOV.js';
|
|
10
|
-
import './chunk-
|
|
10
|
+
import './chunk-C4AY6JI2.js';
|
|
11
11
|
import './chunk-JL7CASN5.js';
|
|
12
12
|
import './chunk-PXIFUMLA.js';
|
|
13
13
|
import './chunk-CY6KX4RG.js';
|
|
14
14
|
import './chunk-WBH2XEWO.js';
|
|
15
|
-
import './chunk-
|
|
15
|
+
import './chunk-6J4RR46J.js';
|
|
16
16
|
import './chunk-UULVIT25.js';
|
|
17
17
|
import './chunk-NTWG3CJX.js';
|
|
18
18
|
import './chunk-62GWEYJ5.js';
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
export { WorkflowBuilder } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
1
|
+
export { WorkflowBuilder } from './chunk-NAFJQGLV.js';
|
|
2
|
+
import './chunk-A2JSAGNQ.js';
|
|
3
|
+
import './chunk-STPQQDIJ.js';
|
|
4
4
|
import './chunk-GEMNVFPK.js';
|
|
5
5
|
import './chunk-IEVSFCFS.js';
|
|
6
6
|
import './chunk-YXMFRQYV.js';
|
|
7
7
|
import './chunk-BQXVT32O.js';
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
11
|
-
import './chunk-
|
|
8
|
+
import './chunk-HHN2TIK2.js';
|
|
9
|
+
import './chunk-VQHBQAJY.js';
|
|
10
|
+
import './chunk-MKKBEVXO.js';
|
|
11
|
+
import './chunk-RZQPHWFV.js';
|
|
12
|
+
import './chunk-LOZ6XNOX.js';
|
|
12
13
|
import './chunk-4VJ3MDOV.js';
|
|
13
|
-
import './chunk-
|
|
14
|
+
import './chunk-C4AY6JI2.js';
|
|
14
15
|
import './chunk-JL7CASN5.js';
|
|
15
16
|
import './chunk-PXIFUMLA.js';
|
|
16
17
|
import './chunk-CY6KX4RG.js';
|
|
17
18
|
import './chunk-WBH2XEWO.js';
|
|
18
|
-
import './chunk-
|
|
19
|
+
import './chunk-6J4RR46J.js';
|
|
19
20
|
import './chunk-UULVIT25.js';
|
|
20
21
|
import './chunk-NTWG3CJX.js';
|
|
21
22
|
import './chunk-62GWEYJ5.js';
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
export { WorkflowsList } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
1
|
+
export { WorkflowsList } from './chunk-FO22JCOW.js';
|
|
2
|
+
import './chunk-A2JSAGNQ.js';
|
|
3
|
+
import './chunk-3VJ3AIFS.js';
|
|
4
4
|
import './chunk-5ERAJC2I.js';
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
5
|
+
import './chunk-HHN2TIK2.js';
|
|
6
|
+
import './chunk-RZQPHWFV.js';
|
|
7
7
|
import './chunk-D3UWK7GY.js';
|
|
8
8
|
import './chunk-PJAWNFJV.js';
|
|
9
9
|
import './chunk-4VJ3MDOV.js';
|
|
10
|
-
import './chunk-
|
|
10
|
+
import './chunk-C4AY6JI2.js';
|
|
11
11
|
import './chunk-JL7CASN5.js';
|
|
12
12
|
import './chunk-PXIFUMLA.js';
|
|
13
13
|
import './chunk-CY6KX4RG.js';
|
|
14
14
|
import './chunk-WBH2XEWO.js';
|
|
15
|
-
import './chunk-
|
|
15
|
+
import './chunk-6J4RR46J.js';
|
|
16
16
|
import './chunk-UULVIT25.js';
|
|
17
17
|
import './chunk-NTWG3CJX.js';
|
|
18
18
|
import './chunk-62GWEYJ5.js';
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { throwIfResultError } from './chunk-C4AY6JI2.js';
|
|
2
|
+
import { RunFailureClustersDocument, DismissRunFailureClusterDocument, RunFailureTriageSettingsDocument, SetRunFailureTriageEnabledDocument, FgTriageFailedRunsDocument } from './chunk-6J4RR46J.js';
|
|
3
|
+
import { useTr } from './chunk-UULVIT25.js';
|
|
4
|
+
import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
|
|
5
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
6
|
+
import { Icon } from '@iconify/react';
|
|
7
|
+
import { Button } from '@burdenoff/fe-libs/ui';
|
|
8
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
var OPEN_STATUSES = [
|
|
11
|
+
"OPEN" /* Open */,
|
|
12
|
+
"PROPOSED" /* Proposed */
|
|
13
|
+
];
|
|
14
|
+
function messageOf(error) {
|
|
15
|
+
return error instanceof Error ? error.message : String(error);
|
|
16
|
+
}
|
|
17
|
+
async function fetchRunFailureClusters(variables) {
|
|
18
|
+
const result = throwIfResultError(
|
|
19
|
+
await getFluidGridsClient().query({
|
|
20
|
+
query: RunFailureClustersDocument,
|
|
21
|
+
variables,
|
|
22
|
+
fetchPolicy: "network-only"
|
|
23
|
+
})
|
|
24
|
+
);
|
|
25
|
+
return result.data?.runFailureClusters.items ?? [];
|
|
26
|
+
}
|
|
27
|
+
async function dismissRunFailureCluster(id) {
|
|
28
|
+
throwIfResultError(
|
|
29
|
+
await getFluidGridsClient().mutate({ mutation: DismissRunFailureClusterDocument, variables: { id } })
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
function useFailureTriage() {
|
|
33
|
+
const [settings, setSettings] = useState(
|
|
34
|
+
null
|
|
35
|
+
);
|
|
36
|
+
const [clusters, setClusters] = useState([]);
|
|
37
|
+
const [loading, setLoading] = useState(true);
|
|
38
|
+
const [busy, setBusy] = useState(false);
|
|
39
|
+
const [error, setError] = useState(null);
|
|
40
|
+
const [lastRun, setLastRun] = useState(null);
|
|
41
|
+
const refetch = useCallback(async () => {
|
|
42
|
+
setLoading(true);
|
|
43
|
+
setError(null);
|
|
44
|
+
try {
|
|
45
|
+
const [settingsResult, items] = await Promise.all([
|
|
46
|
+
getFluidGridsClient().query({
|
|
47
|
+
query: RunFailureTriageSettingsDocument,
|
|
48
|
+
fetchPolicy: "network-only"
|
|
49
|
+
}),
|
|
50
|
+
fetchRunFailureClusters({
|
|
51
|
+
filter: { status: OPEN_STATUSES },
|
|
52
|
+
limit: 20
|
|
53
|
+
})
|
|
54
|
+
]);
|
|
55
|
+
setSettings(
|
|
56
|
+
throwIfResultError(settingsResult).data?.runFailureTriageSettings ?? null
|
|
57
|
+
);
|
|
58
|
+
setClusters(items);
|
|
59
|
+
} catch (loadError) {
|
|
60
|
+
setError(messageOf(loadError));
|
|
61
|
+
} finally {
|
|
62
|
+
setLoading(false);
|
|
63
|
+
}
|
|
64
|
+
}, []);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
void refetch();
|
|
67
|
+
}, [refetch]);
|
|
68
|
+
const setEnabled = useCallback(async (enabled) => {
|
|
69
|
+
setBusy(true);
|
|
70
|
+
setError(null);
|
|
71
|
+
try {
|
|
72
|
+
const result = throwIfResultError(
|
|
73
|
+
await getFluidGridsClient().mutate({
|
|
74
|
+
mutation: SetRunFailureTriageEnabledDocument,
|
|
75
|
+
variables: { enabled }
|
|
76
|
+
})
|
|
77
|
+
);
|
|
78
|
+
setSettings(result.data?.setRunFailureTriageEnabled ?? null);
|
|
79
|
+
} catch (toggleError) {
|
|
80
|
+
setError(messageOf(toggleError));
|
|
81
|
+
} finally {
|
|
82
|
+
setBusy(false);
|
|
83
|
+
}
|
|
84
|
+
}, []);
|
|
85
|
+
const runNow = useCallback(async () => {
|
|
86
|
+
setBusy(true);
|
|
87
|
+
setError(null);
|
|
88
|
+
try {
|
|
89
|
+
const result = throwIfResultError(
|
|
90
|
+
await getFluidGridsClient().mutate({ mutation: FgTriageFailedRunsDocument, variables: {} })
|
|
91
|
+
);
|
|
92
|
+
setLastRun(result.data?.fgTriageFailedRuns ?? null);
|
|
93
|
+
setClusters(
|
|
94
|
+
await fetchRunFailureClusters({
|
|
95
|
+
filter: { status: OPEN_STATUSES },
|
|
96
|
+
limit: 20
|
|
97
|
+
})
|
|
98
|
+
);
|
|
99
|
+
} catch (runError) {
|
|
100
|
+
setError(messageOf(runError));
|
|
101
|
+
} finally {
|
|
102
|
+
setBusy(false);
|
|
103
|
+
}
|
|
104
|
+
}, []);
|
|
105
|
+
const dismiss = useCallback(async (id) => {
|
|
106
|
+
setError(null);
|
|
107
|
+
try {
|
|
108
|
+
await dismissRunFailureCluster(id);
|
|
109
|
+
setClusters((current) => current.filter((cluster) => cluster.id !== id));
|
|
110
|
+
} catch (dismissError) {
|
|
111
|
+
setError(messageOf(dismissError));
|
|
112
|
+
}
|
|
113
|
+
}, []);
|
|
114
|
+
return {
|
|
115
|
+
settings,
|
|
116
|
+
clusters,
|
|
117
|
+
loading,
|
|
118
|
+
busy,
|
|
119
|
+
error,
|
|
120
|
+
lastRun,
|
|
121
|
+
refetch,
|
|
122
|
+
setEnabled,
|
|
123
|
+
runNow,
|
|
124
|
+
dismiss
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
var BUCKET_LABELS = {
|
|
128
|
+
EXPIRED_CONNECTION: {
|
|
129
|
+
label: "Expired connection",
|
|
130
|
+
icon: "mdi:key-alert-outline"
|
|
131
|
+
},
|
|
132
|
+
CONNECTOR_CONTRACT_CHANGE: {
|
|
133
|
+
label: "Connector change",
|
|
134
|
+
icon: "mdi:swap-horizontal"
|
|
135
|
+
},
|
|
136
|
+
BAD_NODE_CONFIG: { label: "Node configuration", icon: "mdi:cog-outline" },
|
|
137
|
+
UPSTREAM_TRANSIENT: { label: "Transient", icon: "mdi:weather-cloudy-alert" },
|
|
138
|
+
UNKNOWN: { label: "Unclassified", icon: "mdi:help-circle-outline" }
|
|
139
|
+
};
|
|
140
|
+
function ClusterRow({
|
|
141
|
+
cluster,
|
|
142
|
+
canRetry,
|
|
143
|
+
onOpenRun,
|
|
144
|
+
onRetry,
|
|
145
|
+
onDismiss
|
|
146
|
+
}) {
|
|
147
|
+
const tr = useTr();
|
|
148
|
+
const bucket = BUCKET_LABELS[String(cluster.bucket)] ?? {
|
|
149
|
+
label: String(cluster.bucket),
|
|
150
|
+
icon: "mdi:alert-outline"
|
|
151
|
+
};
|
|
152
|
+
return /* @__PURE__ */ jsx(
|
|
153
|
+
"li",
|
|
154
|
+
{
|
|
155
|
+
className: "rounded-lg border border-border-secondary bg-background-primary p-3",
|
|
156
|
+
"data-testid": "failure-cluster",
|
|
157
|
+
"data-bucket": String(cluster.bucket),
|
|
158
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between", children: [
|
|
159
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
160
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2 text-sm", children: [
|
|
161
|
+
/* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-background-secondary px-2 py-0.5 text-xs text-text-secondary", children: [
|
|
162
|
+
/* @__PURE__ */ jsx(Icon, { icon: bucket.icon, width: 14 }),
|
|
163
|
+
tr(
|
|
164
|
+
`fluidgrids.triage.bucket.${String(cluster.bucket)}`,
|
|
165
|
+
bucket.label
|
|
166
|
+
)
|
|
167
|
+
] }),
|
|
168
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-text-primary", children: cluster.workflowName || cluster.workflowKey }),
|
|
169
|
+
/* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: tr("fluidgrids.triage.atNode", "at {{node}}", {
|
|
170
|
+
node: cluster.nodeId
|
|
171
|
+
}) })
|
|
172
|
+
] }),
|
|
173
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 break-words text-sm text-text-secondary", children: cluster.signature }),
|
|
174
|
+
/* @__PURE__ */ jsxs("p", { className: "mt-1 text-xs text-text-secondary", children: [
|
|
175
|
+
tr(
|
|
176
|
+
"fluidgrids.triage.runCount",
|
|
177
|
+
"{{count}} failed run(s), last {{when}}",
|
|
178
|
+
{
|
|
179
|
+
count: cluster.runCount,
|
|
180
|
+
when: new Date(String(cluster.lastSeenAt)).toLocaleString()
|
|
181
|
+
}
|
|
182
|
+
),
|
|
183
|
+
cluster.proposalId ? ` \xB7 ${tr("fluidgrids.triage.proposalReady", "Fix proposal ready to review")}` : ""
|
|
184
|
+
] }),
|
|
185
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-text-primary", children: cluster.advice })
|
|
186
|
+
] }),
|
|
187
|
+
/* @__PURE__ */ jsxs("div", { className: "flex shrink-0 flex-wrap gap-2", children: [
|
|
188
|
+
/* @__PURE__ */ jsx(
|
|
189
|
+
Button,
|
|
190
|
+
{
|
|
191
|
+
size: "sm",
|
|
192
|
+
variant: "outline",
|
|
193
|
+
onClick: () => onOpenRun(cluster.lastRunId),
|
|
194
|
+
"data-testid": "failure-cluster-open",
|
|
195
|
+
children: cluster.proposalId ? tr("fluidgrids.triage.reviewFix", "Review fix") : tr("fluidgrids.triage.openRun", "Open run")
|
|
196
|
+
}
|
|
197
|
+
),
|
|
198
|
+
canRetry && /* @__PURE__ */ jsx(
|
|
199
|
+
Button,
|
|
200
|
+
{
|
|
201
|
+
size: "sm",
|
|
202
|
+
variant: "outline",
|
|
203
|
+
onClick: () => onRetry([cluster.lastRunId]),
|
|
204
|
+
children: tr("fluidgrids.triage.retry", "Retry")
|
|
205
|
+
}
|
|
206
|
+
),
|
|
207
|
+
/* @__PURE__ */ jsx(
|
|
208
|
+
Button,
|
|
209
|
+
{
|
|
210
|
+
size: "sm",
|
|
211
|
+
variant: "ghost",
|
|
212
|
+
onClick: () => onDismiss(cluster.id),
|
|
213
|
+
"data-testid": "failure-cluster-dismiss",
|
|
214
|
+
children: tr("fluidgrids.triage.dismiss", "Dismiss")
|
|
215
|
+
}
|
|
216
|
+
)
|
|
217
|
+
] })
|
|
218
|
+
] })
|
|
219
|
+
}
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
function FailureTriagePanel({
|
|
223
|
+
canManage,
|
|
224
|
+
canRetry,
|
|
225
|
+
onOpenRun,
|
|
226
|
+
onRetry
|
|
227
|
+
}) {
|
|
228
|
+
const tr = useTr();
|
|
229
|
+
const triage = useFailureTriage();
|
|
230
|
+
const enabled = triage.settings?.enabled ?? false;
|
|
231
|
+
return /* @__PURE__ */ jsxs(
|
|
232
|
+
"section",
|
|
233
|
+
{
|
|
234
|
+
className: "mb-6 rounded-xl border border-border-secondary bg-background-secondary p-4",
|
|
235
|
+
"data-testid": "failure-triage-panel",
|
|
236
|
+
children: [
|
|
237
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [
|
|
238
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
239
|
+
/* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-base font-semibold text-text-primary", children: [
|
|
240
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:stethoscope", width: 18 }),
|
|
241
|
+
tr("fluidgrids.triage.title", "Failure triage")
|
|
242
|
+
] }),
|
|
243
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 max-w-2xl text-sm text-text-secondary", children: tr(
|
|
244
|
+
"fluidgrids.triage.description",
|
|
245
|
+
"Every hour, groups failed production runs, leaves temporary failures to the retry and prepares a fix proposal for you to review. It never changes a workflow on its own."
|
|
246
|
+
) }),
|
|
247
|
+
/* @__PURE__ */ jsxs(
|
|
248
|
+
"p",
|
|
249
|
+
{
|
|
250
|
+
className: "mt-1 text-xs text-text-secondary",
|
|
251
|
+
"data-testid": "failure-triage-status",
|
|
252
|
+
children: [
|
|
253
|
+
enabled ? tr("fluidgrids.triage.on", "On") : tr("fluidgrids.triage.off", "Off"),
|
|
254
|
+
triage.settings?.lastTickAt ? ` \xB7 ${tr("fluidgrids.triage.lastRun", "last run {{when}}", {
|
|
255
|
+
when: new Date(
|
|
256
|
+
String(triage.settings.lastTickAt)
|
|
257
|
+
).toLocaleString()
|
|
258
|
+
})}` : "",
|
|
259
|
+
triage.settings && !triage.settings.killSwitchOn ? ` \xB7 ${tr("fluidgrids.triage.paused", "paused for this workspace")}` : ""
|
|
260
|
+
]
|
|
261
|
+
}
|
|
262
|
+
)
|
|
263
|
+
] }),
|
|
264
|
+
canManage && /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 flex-wrap gap-2", children: [
|
|
265
|
+
enabled && /* @__PURE__ */ jsx(
|
|
266
|
+
Button,
|
|
267
|
+
{
|
|
268
|
+
size: "sm",
|
|
269
|
+
variant: "outline",
|
|
270
|
+
onClick: () => void triage.runNow(),
|
|
271
|
+
disabled: triage.busy,
|
|
272
|
+
"data-testid": "failure-triage-run-now",
|
|
273
|
+
children: tr("fluidgrids.triage.runNow", "Run now")
|
|
274
|
+
}
|
|
275
|
+
),
|
|
276
|
+
/* @__PURE__ */ jsx(
|
|
277
|
+
Button,
|
|
278
|
+
{
|
|
279
|
+
size: "sm",
|
|
280
|
+
variant: enabled ? "outline" : "default",
|
|
281
|
+
onClick: () => void triage.setEnabled(!enabled),
|
|
282
|
+
disabled: triage.busy || triage.loading,
|
|
283
|
+
"data-testid": "failure-triage-toggle",
|
|
284
|
+
children: enabled ? tr("fluidgrids.triage.turnOff", "Turn off") : tr("fluidgrids.triage.turnOn", "Turn on")
|
|
285
|
+
}
|
|
286
|
+
)
|
|
287
|
+
] })
|
|
288
|
+
] }),
|
|
289
|
+
triage.error && /* @__PURE__ */ jsx("p", { className: "mt-3 text-sm text-status-error-text", children: triage.error }),
|
|
290
|
+
triage.lastRun && !triage.lastRun.skipped && /* @__PURE__ */ jsx("p", { className: "mt-3 text-xs text-text-secondary", children: tr(
|
|
291
|
+
"fluidgrids.triage.lastRunSummary",
|
|
292
|
+
"Checked {{scanned}} failed run(s): {{created}} new cluster(s), {{suppressed}} left to the retry.",
|
|
293
|
+
{
|
|
294
|
+
scanned: triage.lastRun.scannedRuns,
|
|
295
|
+
created: triage.lastRun.newClusterCount,
|
|
296
|
+
suppressed: triage.lastRun.suppressedTransient
|
|
297
|
+
}
|
|
298
|
+
) }),
|
|
299
|
+
triage.clusters.length > 0 ? /* @__PURE__ */ jsx("ul", { className: "mt-4 space-y-2", "data-testid": "failure-cluster-list", children: triage.clusters.map((cluster) => /* @__PURE__ */ jsx(
|
|
300
|
+
ClusterRow,
|
|
301
|
+
{
|
|
302
|
+
cluster,
|
|
303
|
+
canRetry,
|
|
304
|
+
onOpenRun,
|
|
305
|
+
onRetry,
|
|
306
|
+
onDismiss: (id) => void triage.dismiss(id)
|
|
307
|
+
},
|
|
308
|
+
cluster.id
|
|
309
|
+
)) }) : !triage.loading && /* @__PURE__ */ jsx(
|
|
310
|
+
"p",
|
|
311
|
+
{
|
|
312
|
+
className: "mt-4 text-sm text-text-secondary",
|
|
313
|
+
"data-testid": "failure-triage-empty",
|
|
314
|
+
children: enabled ? tr(
|
|
315
|
+
"fluidgrids.triage.empty",
|
|
316
|
+
"No repeated failures need attention."
|
|
317
|
+
) : tr(
|
|
318
|
+
"fluidgrids.triage.emptyOff",
|
|
319
|
+
"Turn failure triage on to have repeated failures grouped and explained here."
|
|
320
|
+
)
|
|
321
|
+
}
|
|
322
|
+
)
|
|
323
|
+
]
|
|
324
|
+
}
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
export { BUCKET_LABELS, FailureTriagePanel, OPEN_STATUSES, dismissRunFailureCluster, fetchRunFailureClusters };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { REPLAY_WORKFLOW_RUN, RETRY_WORKFLOW_RUNS } from './chunk-5ERAJC2I.js';
|
|
2
|
-
import { useFluidGridsAnalytics, throwIfResultError, emitRunStarted, openRunQuotaUpgradePrompt } from './chunk-
|
|
2
|
+
import { useFluidGridsAnalytics, throwIfResultError, emitRunStarted, openRunQuotaUpgradePrompt } from './chunk-C4AY6JI2.js';
|
|
3
3
|
import { useExecutionsStore } from './chunk-CY6KX4RG.js';
|
|
4
|
-
import { ExecutionsListDocument, ExecutionDetailDocument, ExecutionStatsDocument, PauseExecutionDocument, ResumeExecutionDocument, CancelExecutionDocument, RetryNodeDocument, TriggerWorkflowDocument, TerminateExecutionDocument } from './chunk-
|
|
4
|
+
import { ExecutionsListDocument, ExecutionDetailDocument, ExecutionStatsDocument, PauseExecutionDocument, ResumeExecutionDocument, CancelExecutionDocument, RetryNodeDocument, TriggerWorkflowDocument, TerminateExecutionDocument } from './chunk-6J4RR46J.js';
|
|
5
5
|
import { useTr } from './chunk-UULVIT25.js';
|
|
6
6
|
import { getFluidGridsClient } from './chunk-NTWG3CJX.js';
|
|
7
7
|
import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
|