@burdenoff/fluidgrids-fe-sdk 2026.1112.11 → 2026.1113.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 (127) hide show
  1. package/dist/{AiStudioPage-Q3455WO6.js → AiStudioPage-5KYZ8r8-.js} +464 -7
  2. package/dist/{ApprovalInboxPage-Bb8H9ruw.js → ApprovalInboxPage-BsJX4osU.js} +4 -3
  3. package/dist/{ConnectionFormDialog-Bg9_OdHX.js → ConnectionFormDialog-Dr1-CTan.js} +2 -1
  4. package/dist/CreateFluidgridsTagDocument-Dtp9KPLJ.js +1055 -0
  5. package/dist/{DataSinkDashboardPage-B5bqPnUn.js → DataSinkDashboardPage-8ZDn85e2.js} +1 -1
  6. package/dist/{DataTablesPage-Zz23QZQp.js → DataTablesPage-BBvABuxE.js} +5 -4
  7. package/dist/{EntityTagPicker-CuZAMby_.js → EntityTagPicker-BppBSEJk.js} +2 -2
  8. package/dist/{ExecutionDetailPage-UyXErYuS.js → ExecutionDetailPage-BXDF2eoT.js} +1601 -31
  9. package/dist/ExecutionsListDocument-CzdLPpj5.js +1259 -0
  10. package/dist/{ExecutionsListPage-CUJQA0Vk.js → ExecutionsListPage--4BthM8L.js} +286 -12
  11. package/dist/FailureTriagePanel-B5WCSRFo.js +1252 -0
  12. package/dist/{FluidGridsProvider-CGi9a1So.js → FluidGridsProvider-Dc_Jhtch.js} +8666 -8734
  13. package/dist/{HistoryPage-DLqmeQ12.js → HistoryPage-BvFk2m1m.js} +4 -3
  14. package/dist/{InsightsPage-CqtPCpj7.js → InsightsPage-Dwmb02F6.js} +2682 -5
  15. package/dist/{MissingNodesInstallModal-Df4fEAnr.js → MissingNodesInstallModal-Cze674hp.js} +2 -2
  16. package/dist/{NodesPage-YQ-hP60x.js → NodesPage-C5Dq-ru-.js} +3 -2
  17. package/dist/{OpenTemplateAsCodeButton-BmuHhDRr.js → OpenTemplateAsCodeButton-8MZHih6I.js} +2 -2
  18. package/dist/{PaidTemplateConfirm-BTrK35af.js → PaidTemplateConfirm-0G-gv29n.js} +1 -1
  19. package/dist/{PublishCustomNodeAction-5XXnSA3H.js → PublishCustomNodeAction-OOY35dUv.js} +1 -1
  20. package/dist/QuotaExhaustedDialog-wvu_-WJ-.js +55 -0
  21. package/dist/{RunnerStatusPill-Ctg4TJcP.js → RunnerStatusPill-Bh7mEsPh.js} +2 -1
  22. package/dist/{RunnersPage-CAt4YDhB.js → RunnersPage-DHeuUDil.js} +2 -2
  23. package/dist/{SettingsPage-CVvaQ_g9.js → SettingsPage-CfjXiGpb.js} +694 -14
  24. package/dist/{TagFilterSelect-DcusTt1p.js → TagFilterSelect-CAShgvbS.js} +1 -1
  25. package/dist/{TaskQueuesPage-C2dkenVF.js → TaskQueuesPage--Mmn36b-.js} +3 -3
  26. package/dist/{TemplateCard-DFbYdC2c.js → TemplateCard-BA_9em22.js} +644 -352
  27. package/dist/{TemplateConfigurationModal-Dw2UgWYF.js → TemplateConfigurationModal-BT3PaR0O.js} +4 -3
  28. package/dist/{TemplateDetailPanel-DDySr7_1.js → TemplateDetailPanel-BxFNnlXm.js} +2 -1
  29. package/dist/{TemplatePreview-D8zWdTGv.js → TemplatePreview-Bagja6WN.js} +7 -7
  30. package/dist/{TemplatesPage-XCwxJjN6.js → TemplatesPage-CAajpJ5w.js} +711 -6
  31. package/dist/{VariablesPage-DpiLh99E.js → VariablesPage-CgUBKhAe.js} +3 -3
  32. package/dist/{VersionDiffDialog-c27yet_-.js → VersionDiffDialog-D9W5Fm56.js} +233 -129
  33. package/dist/VersionLifecycleBar-DuphLOT0.js +131 -0
  34. package/dist/{WorkflowBuilder-CXqwzR7a.js → WorkflowBuilder-DMpSPElu.js} +16 -13
  35. package/dist/{WorkflowBuilder-BaNAX7Nk.js → WorkflowBuilder-v8h8skwG.js} +5 -5
  36. package/dist/WorkflowDefinitionDocument-DZLbTPUZ.js +321 -0
  37. package/dist/WorkflowEditLeaseStatusDocument-Dp62med3.js +627 -0
  38. package/dist/WorkflowProposalCard-zCdUpCk8.js +249 -0
  39. package/dist/WorkflowProposalDocument-BdUbsrd0.js +620 -0
  40. package/dist/{WorkflowSearchRedirect-DsQ71VcC.js → WorkflowSearchRedirect-G78lINAE.js} +1 -1
  41. package/dist/{WorkflowShareDialog-BRwTF9QB.js → WorkflowShareDialog-B7VOgr4-.js} +304 -3
  42. package/dist/WorkflowVersionsDocument-CfPMloRW.js +3195 -0
  43. package/dist/{WorkflowsList-DQW-WLl5.js → WorkflowsList-CPYzfE4K.js} +11 -9
  44. package/dist/agent-form-D0uLvzx4.js +718 -0
  45. package/dist/{agentTools-edsllozS.js → agentTools-DTXUqtfu.js} +4 -4
  46. package/dist/api-BZVyX5d2.js +2286 -0
  47. package/dist/api-BqA-f-AD.js +8064 -0
  48. package/dist/app-BJUvugPM.js +3813 -0
  49. package/dist/assert-rules-CPNrO44K.js +318 -0
  50. package/dist/attach-node-helpers-CNsYtLOR.js +32 -0
  51. package/dist/badge-CXfPhoMH.js +26 -0
  52. package/dist/{canvasNoteTools-DzNTcQGo.js → canvasNoteTools-DmfZwtnL.js} +3 -3
  53. package/dist/{channel-CZ70oI81.js → channel-DtF1n_ab.js} +1 -1
  54. package/dist/client-Ctl4jmY3.js +127 -0
  55. package/dist/code-editor-diagnostics-Zr0cIcx1.js +46 -0
  56. package/dist/{code-editor-field-B2l-B8in.js → code-editor-field-Cv907s3W.js} +2 -2
  57. package/dist/{codec-client-CJ95Rmqo.js → codec-client-CAYl6j46.js} +2 -1
  58. package/dist/conditionBuilder-D8aLGL1w.js +1134 -0
  59. package/dist/config-X97zrIvn.js +600 -0
  60. package/dist/{definition-canvas-Bshn_dSP.js → definition-canvas-DL25_6NH.js} +1 -1
  61. package/dist/{dialog-Cjb4lB4D.js → dialog-BVd152GS.js} +3 -14
  62. package/dist/durable-nodes-DXCCQYWD.js +81 -0
  63. package/dist/errors-xPZ-IbQd.js +142 -0
  64. package/dist/executions.js +2 -2
  65. package/dist/{flow-builder-B2JGvYeK.js → flow-builder-Dv5fWJ6F.js} +9781 -8416
  66. package/dist/{node-registry-refresh-Dy0uRg9f.js → global-client-DP_Wxe5t.js} +2 -27
  67. package/dist/global-operations-7pvXw_j9.js +145 -0
  68. package/dist/history.js +1 -1
  69. package/dist/{index-ChYBGz_a.d.ts → index-DtMUtXNq.d.ts} +306 -246
  70. package/dist/index.d.ts +2 -2
  71. package/dist/index.js +4404 -47
  72. package/dist/input-ChT6Q-Pr.js +17 -0
  73. package/dist/logs-panel-DtG93ocy.js +342 -0
  74. package/dist/mapping-colors-BIX_YeCQ.js +48 -0
  75. package/dist/{node-detail-view-BDXhEGVD.js → node-detail-view-BKI_2kM6.js} +12 -11
  76. package/dist/{node-editor-tab-body-DBnsqYUK.js → node-editor-tab-body-Cc1MWEFR.js} +3 -3
  77. package/dist/{node-operation-selection-DAbS6jSY.js → node-operation-selection-Czeeb2D4.js} +2 -139
  78. package/dist/node-registry-refresh-s3okf83X.js +27 -0
  79. package/dist/nodes.js +1 -1
  80. package/dist/notesKey-5EaREBGA.js +12 -0
  81. package/dist/observability.d.ts +1 -1
  82. package/dist/observability.js +2 -2
  83. package/dist/{popover-Cl7_tXph.js → popover-DDv7J1Kl.js} +717 -6
  84. package/dist/{quick-config-panel-C_Z0RXEG.js → quick-config-panel-BPCRfqWI.js} +4 -4
  85. package/dist/read-only-context-Dt9N9SIG.js +18 -0
  86. package/dist/{schedule-panel-CFAKmrBH.js → schedule-panel-C1KwfLCE.js} +197 -79
  87. package/dist/settings.js +1 -1
  88. package/dist/{shared-CMfn30xT.js → shared-Ctl9ZHo1.js} +2 -1
  89. package/dist/{sidebar-node-editor-DZZlDElK.js → sidebar-node-editor-d9Rlq5pU.js} +4 -4
  90. package/dist/sticky-notes-23j-wL6Q.js +96 -0
  91. package/dist/template-code-dqRunGOv.js +184 -0
  92. package/dist/template-preview-C01KV277.js +29 -0
  93. package/dist/templates.js +2 -2
  94. package/dist/token-refresh-link-BjN7H4qA.js +291 -0
  95. package/dist/useAgentDefinitions-ZKX2N9aP.js +3101 -0
  96. package/dist/useConnections-BlB0gbOB.js +931 -0
  97. package/dist/useDurableParity-BgLH_SCF.js +2088 -0
  98. package/dist/{useEntityTags-BpDeLhzV.js → useEntityTags-4iW6UTly.js} +227 -3
  99. package/dist/{useExecutions-D2iKpt1Z.js → useExecutions-Bm7q_UwN.js} +6 -3
  100. package/dist/useGlobalStoreClient-DMTrywdX.js +24 -0
  101. package/dist/{useHumanRequests-ZiR0sSzS.js → useHumanRequests-DwG2tQ3f.js} +2 -1
  102. package/dist/{useObservability-DIhzs9F-.js → useObservability-DPATdbw7.js} +4 -2
  103. package/dist/{useRunHistory-BhVY82Pg.js → useRunHistory-CGfjCsJ3.js} +1122 -4
  104. package/dist/{useVariables-2ddyJX4a.js → useVariables-DFdZofLQ.js} +2 -1
  105. package/dist/{useWorkflowCodeExport-BXy4NPsE.js → useWorkflowCodeExport-D_mCuhKP.js} +289 -4
  106. package/dist/useWorkflowOrganization-r5FWNBs6.js +1690 -0
  107. package/dist/useWorkflowProposal-Bh2_qjmM.js +7478 -0
  108. package/dist/{useWorkflows-Clsu0o8t.js → useWorkflows-aqVD7kGa.js} +694 -4
  109. package/dist/workflow-builder.js +5 -5
  110. package/dist/{workflow-code-transfer-DemcCpOv.js → workflow-code-transfer-5C0HUzae.js} +1 -53
  111. package/dist/workflow-host.js +4 -2
  112. package/dist/workflow-pages.d.ts +1 -1
  113. package/dist/workflow-pages.js +19 -19
  114. package/dist/workflow-preview.js +3 -2
  115. package/dist/workflows-list.js +1 -1
  116. package/package.json +1 -1
  117. package/dist/FailureTriagePanel-BjatYyAa.js +0 -311
  118. package/dist/WorkflowProposalCard-BvmJ5ea8.js +0 -1245
  119. package/dist/agent-form-Bfvm32j1.js +0 -83
  120. package/dist/api-Dw8nfVRD.js +0 -55
  121. package/dist/api-m8hX_l2k.js +0 -224
  122. package/dist/client-C9XSzSXr.js +0 -1147
  123. package/dist/graphql-operation-types-DZVhCBEi.js +0 -52817
  124. package/dist/useAgentDefinitions-B4sw7bLw.js +0 -550
  125. package/dist/useConnections-Cs7LCWEM.js +0 -401
  126. package/dist/useDurableParity-jtqJF547.js +0 -504
  127. package/dist/useWorkflowOrganization-C4y6BOnN.js +0 -282
@@ -0,0 +1,1252 @@
1
+ "use client";
2
+ import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
3
+ import { n as getFluidGridsClient } from "./client-Ctl4jmY3.js";
4
+ import { o as throwIfResultError } from "./errors-xPZ-IbQd.js";
5
+ import { qD as RunFailureClusterStatus } from "./graphql-types-v6CTGwA0.js";
6
+ import { useCallback, useEffect, useState } from "react";
7
+ import { Icon } from "@iconify/react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { Button } from "@burdenoff/fe-libs/ui";
10
+
11
+ // src/generated/documents/wspace/DismissRunFailureClusterDocument.ts
12
+ const DismissRunFailureClusterDocument = {
13
+ "kind": "Document",
14
+ "definitions": [{
15
+ "kind": "OperationDefinition",
16
+ "operation": "mutation",
17
+ "name": {
18
+ "kind": "Name",
19
+ "value": "DismissRunFailureCluster"
20
+ },
21
+ "variableDefinitions": [{
22
+ "kind": "VariableDefinition",
23
+ "variable": {
24
+ "kind": "Variable",
25
+ "name": {
26
+ "kind": "Name",
27
+ "value": "id"
28
+ }
29
+ },
30
+ "type": {
31
+ "kind": "NonNullType",
32
+ "type": {
33
+ "kind": "NamedType",
34
+ "name": {
35
+ "kind": "Name",
36
+ "value": "ID"
37
+ }
38
+ }
39
+ },
40
+ "directives": []
41
+ }],
42
+ "directives": [],
43
+ "selectionSet": {
44
+ "kind": "SelectionSet",
45
+ "selections": [{
46
+ "kind": "Field",
47
+ "name": {
48
+ "kind": "Name",
49
+ "value": "dismissRunFailureCluster"
50
+ },
51
+ "arguments": [{
52
+ "kind": "Argument",
53
+ "name": {
54
+ "kind": "Name",
55
+ "value": "id"
56
+ },
57
+ "value": {
58
+ "kind": "Variable",
59
+ "name": {
60
+ "kind": "Name",
61
+ "value": "id"
62
+ }
63
+ }
64
+ }],
65
+ "directives": [],
66
+ "selectionSet": {
67
+ "kind": "SelectionSet",
68
+ "selections": [
69
+ {
70
+ "kind": "Field",
71
+ "name": {
72
+ "kind": "Name",
73
+ "value": "id"
74
+ },
75
+ "arguments": [],
76
+ "directives": []
77
+ },
78
+ {
79
+ "kind": "Field",
80
+ "name": {
81
+ "kind": "Name",
82
+ "value": "status"
83
+ },
84
+ "arguments": [],
85
+ "directives": []
86
+ },
87
+ {
88
+ "kind": "Field",
89
+ "name": {
90
+ "kind": "Name",
91
+ "value": "dismissedAt"
92
+ },
93
+ "arguments": [],
94
+ "directives": []
95
+ }
96
+ ]
97
+ }
98
+ }]
99
+ }
100
+ }]
101
+ };
102
+
103
+ // src/generated/documents/wspace/FgTriageFailedRunsDocument.ts
104
+ const FgTriageFailedRunsDocument = {
105
+ "kind": "Document",
106
+ "definitions": [{
107
+ "kind": "OperationDefinition",
108
+ "operation": "mutation",
109
+ "name": {
110
+ "kind": "Name",
111
+ "value": "FgTriageFailedRuns"
112
+ },
113
+ "variableDefinitions": [{
114
+ "kind": "VariableDefinition",
115
+ "variable": {
116
+ "kind": "Variable",
117
+ "name": {
118
+ "kind": "Name",
119
+ "value": "input"
120
+ }
121
+ },
122
+ "type": {
123
+ "kind": "NamedType",
124
+ "name": {
125
+ "kind": "Name",
126
+ "value": "FgTriageFailedRunsInput"
127
+ }
128
+ },
129
+ "directives": []
130
+ }],
131
+ "directives": [],
132
+ "selectionSet": {
133
+ "kind": "SelectionSet",
134
+ "selections": [{
135
+ "kind": "Field",
136
+ "name": {
137
+ "kind": "Name",
138
+ "value": "fgTriageFailedRuns"
139
+ },
140
+ "arguments": [{
141
+ "kind": "Argument",
142
+ "name": {
143
+ "kind": "Name",
144
+ "value": "input"
145
+ },
146
+ "value": {
147
+ "kind": "Variable",
148
+ "name": {
149
+ "kind": "Name",
150
+ "value": "input"
151
+ }
152
+ }
153
+ }],
154
+ "directives": [],
155
+ "selectionSet": {
156
+ "kind": "SelectionSet",
157
+ "selections": [
158
+ {
159
+ "kind": "Field",
160
+ "name": {
161
+ "kind": "Name",
162
+ "value": "skipped"
163
+ },
164
+ "arguments": [],
165
+ "directives": []
166
+ },
167
+ {
168
+ "kind": "Field",
169
+ "name": {
170
+ "kind": "Name",
171
+ "value": "reason"
172
+ },
173
+ "arguments": [],
174
+ "directives": []
175
+ },
176
+ {
177
+ "kind": "Field",
178
+ "name": {
179
+ "kind": "Name",
180
+ "value": "scannedRuns"
181
+ },
182
+ "arguments": [],
183
+ "directives": []
184
+ },
185
+ {
186
+ "kind": "Field",
187
+ "name": {
188
+ "kind": "Name",
189
+ "value": "suppressedTransient"
190
+ },
191
+ "arguments": [],
192
+ "directives": []
193
+ },
194
+ {
195
+ "kind": "Field",
196
+ "name": {
197
+ "kind": "Name",
198
+ "value": "recoveredRuns"
199
+ },
200
+ "arguments": [],
201
+ "directives": []
202
+ },
203
+ {
204
+ "kind": "Field",
205
+ "name": {
206
+ "kind": "Name",
207
+ "value": "newClusterCount"
208
+ },
209
+ "arguments": [],
210
+ "directives": []
211
+ },
212
+ {
213
+ "kind": "Field",
214
+ "name": {
215
+ "kind": "Name",
216
+ "value": "deferredClusters"
217
+ },
218
+ "arguments": [],
219
+ "directives": []
220
+ },
221
+ {
222
+ "kind": "Field",
223
+ "name": {
224
+ "kind": "Name",
225
+ "value": "updatedClusters"
226
+ },
227
+ "arguments": [],
228
+ "directives": []
229
+ },
230
+ {
231
+ "kind": "Field",
232
+ "name": {
233
+ "kind": "Name",
234
+ "value": "resolvedClusters"
235
+ },
236
+ "arguments": [],
237
+ "directives": []
238
+ },
239
+ {
240
+ "kind": "Field",
241
+ "name": {
242
+ "kind": "Name",
243
+ "value": "cursorAt"
244
+ },
245
+ "arguments": [],
246
+ "directives": []
247
+ }
248
+ ]
249
+ }
250
+ }]
251
+ }
252
+ }]
253
+ };
254
+
255
+ // src/generated/documents/wspace/SetRunFailureTriageEnabledDocument.ts
256
+ const SetRunFailureTriageEnabledDocument = {
257
+ "kind": "Document",
258
+ "definitions": [{
259
+ "kind": "OperationDefinition",
260
+ "operation": "mutation",
261
+ "name": {
262
+ "kind": "Name",
263
+ "value": "SetRunFailureTriageEnabled"
264
+ },
265
+ "variableDefinitions": [{
266
+ "kind": "VariableDefinition",
267
+ "variable": {
268
+ "kind": "Variable",
269
+ "name": {
270
+ "kind": "Name",
271
+ "value": "enabled"
272
+ }
273
+ },
274
+ "type": {
275
+ "kind": "NonNullType",
276
+ "type": {
277
+ "kind": "NamedType",
278
+ "name": {
279
+ "kind": "Name",
280
+ "value": "Boolean"
281
+ }
282
+ }
283
+ },
284
+ "directives": []
285
+ }],
286
+ "directives": [],
287
+ "selectionSet": {
288
+ "kind": "SelectionSet",
289
+ "selections": [{
290
+ "kind": "Field",
291
+ "name": {
292
+ "kind": "Name",
293
+ "value": "setRunFailureTriageEnabled"
294
+ },
295
+ "arguments": [{
296
+ "kind": "Argument",
297
+ "name": {
298
+ "kind": "Name",
299
+ "value": "enabled"
300
+ },
301
+ "value": {
302
+ "kind": "Variable",
303
+ "name": {
304
+ "kind": "Name",
305
+ "value": "enabled"
306
+ }
307
+ }
308
+ }],
309
+ "directives": [],
310
+ "selectionSet": {
311
+ "kind": "SelectionSet",
312
+ "selections": [
313
+ {
314
+ "kind": "Field",
315
+ "name": {
316
+ "kind": "Name",
317
+ "value": "enabled"
318
+ },
319
+ "arguments": [],
320
+ "directives": []
321
+ },
322
+ {
323
+ "kind": "Field",
324
+ "name": {
325
+ "kind": "Name",
326
+ "value": "enabledBy"
327
+ },
328
+ "arguments": [],
329
+ "directives": []
330
+ },
331
+ {
332
+ "kind": "Field",
333
+ "name": {
334
+ "kind": "Name",
335
+ "value": "enabledAt"
336
+ },
337
+ "arguments": [],
338
+ "directives": []
339
+ },
340
+ {
341
+ "kind": "Field",
342
+ "name": {
343
+ "kind": "Name",
344
+ "value": "killSwitchOn"
345
+ },
346
+ "arguments": [],
347
+ "directives": []
348
+ },
349
+ {
350
+ "kind": "Field",
351
+ "name": {
352
+ "kind": "Name",
353
+ "value": "lastTickAt"
354
+ },
355
+ "arguments": [],
356
+ "directives": []
357
+ },
358
+ {
359
+ "kind": "Field",
360
+ "name": {
361
+ "kind": "Name",
362
+ "value": "lastTickSummary"
363
+ },
364
+ "arguments": [],
365
+ "directives": []
366
+ },
367
+ {
368
+ "kind": "Field",
369
+ "name": {
370
+ "kind": "Name",
371
+ "value": "lastDigestAt"
372
+ },
373
+ "arguments": [],
374
+ "directives": []
375
+ },
376
+ {
377
+ "kind": "Field",
378
+ "name": {
379
+ "kind": "Name",
380
+ "value": "systemWorkflows"
381
+ },
382
+ "arguments": [],
383
+ "directives": [],
384
+ "selectionSet": {
385
+ "kind": "SelectionSet",
386
+ "selections": [
387
+ {
388
+ "kind": "Field",
389
+ "name": {
390
+ "kind": "Name",
391
+ "value": "systemKey"
392
+ },
393
+ "arguments": [],
394
+ "directives": []
395
+ },
396
+ {
397
+ "kind": "Field",
398
+ "name": {
399
+ "kind": "Name",
400
+ "value": "workflowKey"
401
+ },
402
+ "arguments": [],
403
+ "directives": []
404
+ },
405
+ {
406
+ "kind": "Field",
407
+ "name": {
408
+ "kind": "Name",
409
+ "value": "version"
410
+ },
411
+ "arguments": [],
412
+ "directives": []
413
+ },
414
+ {
415
+ "kind": "Field",
416
+ "name": {
417
+ "kind": "Name",
418
+ "value": "enabled"
419
+ },
420
+ "arguments": [],
421
+ "directives": []
422
+ },
423
+ {
424
+ "kind": "Field",
425
+ "name": {
426
+ "kind": "Name",
427
+ "value": "installedBy"
428
+ },
429
+ "arguments": [],
430
+ "directives": []
431
+ },
432
+ {
433
+ "kind": "Field",
434
+ "name": {
435
+ "kind": "Name",
436
+ "value": "updatedAt"
437
+ },
438
+ "arguments": [],
439
+ "directives": []
440
+ }
441
+ ]
442
+ }
443
+ }
444
+ ]
445
+ }
446
+ }]
447
+ }
448
+ }]
449
+ };
450
+
451
+ // src/generated/documents/wspace/RunFailureClustersDocument.ts
452
+ const RunFailureClustersDocument = {
453
+ "kind": "Document",
454
+ "definitions": [{
455
+ "kind": "OperationDefinition",
456
+ "operation": "query",
457
+ "name": {
458
+ "kind": "Name",
459
+ "value": "RunFailureClusters"
460
+ },
461
+ "variableDefinitions": [
462
+ {
463
+ "kind": "VariableDefinition",
464
+ "variable": {
465
+ "kind": "Variable",
466
+ "name": {
467
+ "kind": "Name",
468
+ "value": "filter"
469
+ }
470
+ },
471
+ "type": {
472
+ "kind": "NamedType",
473
+ "name": {
474
+ "kind": "Name",
475
+ "value": "RunFailureClusterFilter"
476
+ }
477
+ },
478
+ "directives": []
479
+ },
480
+ {
481
+ "kind": "VariableDefinition",
482
+ "variable": {
483
+ "kind": "Variable",
484
+ "name": {
485
+ "kind": "Name",
486
+ "value": "limit"
487
+ }
488
+ },
489
+ "type": {
490
+ "kind": "NamedType",
491
+ "name": {
492
+ "kind": "Name",
493
+ "value": "Int"
494
+ }
495
+ },
496
+ "directives": []
497
+ },
498
+ {
499
+ "kind": "VariableDefinition",
500
+ "variable": {
501
+ "kind": "Variable",
502
+ "name": {
503
+ "kind": "Name",
504
+ "value": "offset"
505
+ }
506
+ },
507
+ "type": {
508
+ "kind": "NamedType",
509
+ "name": {
510
+ "kind": "Name",
511
+ "value": "Int"
512
+ }
513
+ },
514
+ "directives": []
515
+ }
516
+ ],
517
+ "directives": [],
518
+ "selectionSet": {
519
+ "kind": "SelectionSet",
520
+ "selections": [{
521
+ "kind": "Field",
522
+ "name": {
523
+ "kind": "Name",
524
+ "value": "runFailureClusters"
525
+ },
526
+ "arguments": [
527
+ {
528
+ "kind": "Argument",
529
+ "name": {
530
+ "kind": "Name",
531
+ "value": "filter"
532
+ },
533
+ "value": {
534
+ "kind": "Variable",
535
+ "name": {
536
+ "kind": "Name",
537
+ "value": "filter"
538
+ }
539
+ }
540
+ },
541
+ {
542
+ "kind": "Argument",
543
+ "name": {
544
+ "kind": "Name",
545
+ "value": "limit"
546
+ },
547
+ "value": {
548
+ "kind": "Variable",
549
+ "name": {
550
+ "kind": "Name",
551
+ "value": "limit"
552
+ }
553
+ }
554
+ },
555
+ {
556
+ "kind": "Argument",
557
+ "name": {
558
+ "kind": "Name",
559
+ "value": "offset"
560
+ },
561
+ "value": {
562
+ "kind": "Variable",
563
+ "name": {
564
+ "kind": "Name",
565
+ "value": "offset"
566
+ }
567
+ }
568
+ }
569
+ ],
570
+ "directives": [],
571
+ "selectionSet": {
572
+ "kind": "SelectionSet",
573
+ "selections": [{
574
+ "kind": "Field",
575
+ "name": {
576
+ "kind": "Name",
577
+ "value": "total"
578
+ },
579
+ "arguments": [],
580
+ "directives": []
581
+ }, {
582
+ "kind": "Field",
583
+ "name": {
584
+ "kind": "Name",
585
+ "value": "items"
586
+ },
587
+ "arguments": [],
588
+ "directives": [],
589
+ "selectionSet": {
590
+ "kind": "SelectionSet",
591
+ "selections": [{
592
+ "kind": "FragmentSpread",
593
+ "name": {
594
+ "kind": "Name",
595
+ "value": "RunFailureClusterFields"
596
+ },
597
+ "directives": []
598
+ }]
599
+ }
600
+ }]
601
+ }
602
+ }]
603
+ }
604
+ }, {
605
+ "kind": "FragmentDefinition",
606
+ "name": {
607
+ "kind": "Name",
608
+ "value": "RunFailureClusterFields"
609
+ },
610
+ "variableDefinitions": [],
611
+ "typeCondition": {
612
+ "kind": "NamedType",
613
+ "name": {
614
+ "kind": "Name",
615
+ "value": "RunFailureCluster"
616
+ }
617
+ },
618
+ "directives": [],
619
+ "selectionSet": {
620
+ "kind": "SelectionSet",
621
+ "selections": [
622
+ {
623
+ "kind": "Field",
624
+ "name": {
625
+ "kind": "Name",
626
+ "value": "id"
627
+ },
628
+ "arguments": [],
629
+ "directives": []
630
+ },
631
+ {
632
+ "kind": "Field",
633
+ "name": {
634
+ "kind": "Name",
635
+ "value": "workflowKey"
636
+ },
637
+ "arguments": [],
638
+ "directives": []
639
+ },
640
+ {
641
+ "kind": "Field",
642
+ "name": {
643
+ "kind": "Name",
644
+ "value": "workflowName"
645
+ },
646
+ "arguments": [],
647
+ "directives": []
648
+ },
649
+ {
650
+ "kind": "Field",
651
+ "name": {
652
+ "kind": "Name",
653
+ "value": "nodeId"
654
+ },
655
+ "arguments": [],
656
+ "directives": []
657
+ },
658
+ {
659
+ "kind": "Field",
660
+ "name": {
661
+ "kind": "Name",
662
+ "value": "nodeType"
663
+ },
664
+ "arguments": [],
665
+ "directives": []
666
+ },
667
+ {
668
+ "kind": "Field",
669
+ "name": {
670
+ "kind": "Name",
671
+ "value": "bucket"
672
+ },
673
+ "arguments": [],
674
+ "directives": []
675
+ },
676
+ {
677
+ "kind": "Field",
678
+ "name": {
679
+ "kind": "Name",
680
+ "value": "errorType"
681
+ },
682
+ "arguments": [],
683
+ "directives": []
684
+ },
685
+ {
686
+ "kind": "Field",
687
+ "name": {
688
+ "kind": "Name",
689
+ "value": "signature"
690
+ },
691
+ "arguments": [],
692
+ "directives": []
693
+ },
694
+ {
695
+ "kind": "Field",
696
+ "name": {
697
+ "kind": "Name",
698
+ "value": "sampleError"
699
+ },
700
+ "arguments": [],
701
+ "directives": []
702
+ },
703
+ {
704
+ "kind": "Field",
705
+ "name": {
706
+ "kind": "Name",
707
+ "value": "sampleRunIds"
708
+ },
709
+ "arguments": [],
710
+ "directives": []
711
+ },
712
+ {
713
+ "kind": "Field",
714
+ "name": {
715
+ "kind": "Name",
716
+ "value": "lastRunId"
717
+ },
718
+ "arguments": [],
719
+ "directives": []
720
+ },
721
+ {
722
+ "kind": "Field",
723
+ "name": {
724
+ "kind": "Name",
725
+ "value": "runCount"
726
+ },
727
+ "arguments": [],
728
+ "directives": []
729
+ },
730
+ {
731
+ "kind": "Field",
732
+ "name": {
733
+ "kind": "Name",
734
+ "value": "firstSeenAt"
735
+ },
736
+ "arguments": [],
737
+ "directives": []
738
+ },
739
+ {
740
+ "kind": "Field",
741
+ "name": {
742
+ "kind": "Name",
743
+ "value": "lastSeenAt"
744
+ },
745
+ "arguments": [],
746
+ "directives": []
747
+ },
748
+ {
749
+ "kind": "Field",
750
+ "name": {
751
+ "kind": "Name",
752
+ "value": "status"
753
+ },
754
+ "arguments": [],
755
+ "directives": []
756
+ },
757
+ {
758
+ "kind": "Field",
759
+ "name": {
760
+ "kind": "Name",
761
+ "value": "proposalId"
762
+ },
763
+ "arguments": [],
764
+ "directives": []
765
+ },
766
+ {
767
+ "kind": "Field",
768
+ "name": {
769
+ "kind": "Name",
770
+ "value": "proposedAt"
771
+ },
772
+ "arguments": [],
773
+ "directives": []
774
+ },
775
+ {
776
+ "kind": "Field",
777
+ "name": {
778
+ "kind": "Name",
779
+ "value": "advice"
780
+ },
781
+ "arguments": [],
782
+ "directives": []
783
+ }
784
+ ]
785
+ }
786
+ }]
787
+ };
788
+
789
+ // src/generated/documents/wspace/RunFailureTriageSettingsDocument.ts
790
+ const RunFailureTriageSettingsDocument = {
791
+ "kind": "Document",
792
+ "definitions": [{
793
+ "kind": "OperationDefinition",
794
+ "operation": "query",
795
+ "name": {
796
+ "kind": "Name",
797
+ "value": "RunFailureTriageSettings"
798
+ },
799
+ "variableDefinitions": [],
800
+ "directives": [],
801
+ "selectionSet": {
802
+ "kind": "SelectionSet",
803
+ "selections": [{
804
+ "kind": "Field",
805
+ "name": {
806
+ "kind": "Name",
807
+ "value": "runFailureTriageSettings"
808
+ },
809
+ "arguments": [],
810
+ "directives": [],
811
+ "selectionSet": {
812
+ "kind": "SelectionSet",
813
+ "selections": [
814
+ {
815
+ "kind": "Field",
816
+ "name": {
817
+ "kind": "Name",
818
+ "value": "enabled"
819
+ },
820
+ "arguments": [],
821
+ "directives": []
822
+ },
823
+ {
824
+ "kind": "Field",
825
+ "name": {
826
+ "kind": "Name",
827
+ "value": "enabledBy"
828
+ },
829
+ "arguments": [],
830
+ "directives": []
831
+ },
832
+ {
833
+ "kind": "Field",
834
+ "name": {
835
+ "kind": "Name",
836
+ "value": "enabledAt"
837
+ },
838
+ "arguments": [],
839
+ "directives": []
840
+ },
841
+ {
842
+ "kind": "Field",
843
+ "name": {
844
+ "kind": "Name",
845
+ "value": "killSwitchOn"
846
+ },
847
+ "arguments": [],
848
+ "directives": []
849
+ },
850
+ {
851
+ "kind": "Field",
852
+ "name": {
853
+ "kind": "Name",
854
+ "value": "lastTickAt"
855
+ },
856
+ "arguments": [],
857
+ "directives": []
858
+ },
859
+ {
860
+ "kind": "Field",
861
+ "name": {
862
+ "kind": "Name",
863
+ "value": "lastTickSummary"
864
+ },
865
+ "arguments": [],
866
+ "directives": []
867
+ },
868
+ {
869
+ "kind": "Field",
870
+ "name": {
871
+ "kind": "Name",
872
+ "value": "lastDigestAt"
873
+ },
874
+ "arguments": [],
875
+ "directives": []
876
+ },
877
+ {
878
+ "kind": "Field",
879
+ "name": {
880
+ "kind": "Name",
881
+ "value": "systemWorkflows"
882
+ },
883
+ "arguments": [],
884
+ "directives": [],
885
+ "selectionSet": {
886
+ "kind": "SelectionSet",
887
+ "selections": [
888
+ {
889
+ "kind": "Field",
890
+ "name": {
891
+ "kind": "Name",
892
+ "value": "systemKey"
893
+ },
894
+ "arguments": [],
895
+ "directives": []
896
+ },
897
+ {
898
+ "kind": "Field",
899
+ "name": {
900
+ "kind": "Name",
901
+ "value": "workflowKey"
902
+ },
903
+ "arguments": [],
904
+ "directives": []
905
+ },
906
+ {
907
+ "kind": "Field",
908
+ "name": {
909
+ "kind": "Name",
910
+ "value": "version"
911
+ },
912
+ "arguments": [],
913
+ "directives": []
914
+ },
915
+ {
916
+ "kind": "Field",
917
+ "name": {
918
+ "kind": "Name",
919
+ "value": "enabled"
920
+ },
921
+ "arguments": [],
922
+ "directives": []
923
+ },
924
+ {
925
+ "kind": "Field",
926
+ "name": {
927
+ "kind": "Name",
928
+ "value": "installedBy"
929
+ },
930
+ "arguments": [],
931
+ "directives": []
932
+ },
933
+ {
934
+ "kind": "Field",
935
+ "name": {
936
+ "kind": "Name",
937
+ "value": "updatedAt"
938
+ },
939
+ "arguments": [],
940
+ "directives": []
941
+ }
942
+ ]
943
+ }
944
+ }
945
+ ]
946
+ }
947
+ }]
948
+ }
949
+ }]
950
+ };
951
+
952
+ // src/modules/observability/hooks/useFailureTriage.ts
953
+ /**
954
+ * Failure triage (BOFF-3698): the opt-in, the caller's failure clusters and a
955
+ * manual triage pass. Clusters are built from the caller's own runs only.
956
+ */
957
+ /** Clusters that still need a decision. */
958
+ const OPEN_STATUSES = ["OPEN", "PROPOSED"];
959
+ function messageOf(error) {
960
+ return error instanceof Error ? error.message : String(error);
961
+ }
962
+ /** The caller's clusters, optionally only those that include one run. */
963
+ async function fetchRunFailureClusters(variables) {
964
+ return throwIfResultError(await getFluidGridsClient().query({
965
+ query: RunFailureClustersDocument,
966
+ variables,
967
+ fetchPolicy: "network-only"
968
+ })).data?.runFailureClusters.items ?? [];
969
+ }
970
+ async function dismissRunFailureCluster(id) {
971
+ throwIfResultError(await getFluidGridsClient().mutate({
972
+ mutation: DismissRunFailureClusterDocument,
973
+ variables: { id }
974
+ }));
975
+ }
976
+ function useFailureTriage() {
977
+ const [settings, setSettings] = useState(null);
978
+ const [clusters, setClusters] = useState([]);
979
+ const [loading, setLoading] = useState(true);
980
+ const [busy, setBusy] = useState(false);
981
+ const [error, setError] = useState(null);
982
+ const [lastRun, setLastRun] = useState(null);
983
+ const refetch = useCallback(async () => {
984
+ setLoading(true);
985
+ setError(null);
986
+ try {
987
+ const [settingsResult, items] = await Promise.all([getFluidGridsClient().query({
988
+ query: RunFailureTriageSettingsDocument,
989
+ fetchPolicy: "network-only"
990
+ }), fetchRunFailureClusters({
991
+ filter: { status: OPEN_STATUSES },
992
+ limit: 20
993
+ })]);
994
+ setSettings(throwIfResultError(settingsResult).data?.runFailureTriageSettings ?? null);
995
+ setClusters(items);
996
+ } catch (loadError) {
997
+ setError(messageOf(loadError));
998
+ } finally {
999
+ setLoading(false);
1000
+ }
1001
+ }, []);
1002
+ useEffect(() => {
1003
+ refetch();
1004
+ }, [refetch]);
1005
+ return {
1006
+ settings,
1007
+ clusters,
1008
+ loading,
1009
+ busy,
1010
+ error,
1011
+ lastRun,
1012
+ refetch,
1013
+ setEnabled: useCallback(async (enabled) => {
1014
+ setBusy(true);
1015
+ setError(null);
1016
+ try {
1017
+ const result = throwIfResultError(await getFluidGridsClient().mutate({
1018
+ mutation: SetRunFailureTriageEnabledDocument,
1019
+ variables: { enabled }
1020
+ }));
1021
+ setSettings(result.data?.setRunFailureTriageEnabled ?? null);
1022
+ } catch (toggleError) {
1023
+ setError(messageOf(toggleError));
1024
+ } finally {
1025
+ setBusy(false);
1026
+ }
1027
+ }, []),
1028
+ runNow: useCallback(async () => {
1029
+ setBusy(true);
1030
+ setError(null);
1031
+ try {
1032
+ const result = throwIfResultError(await getFluidGridsClient().mutate({
1033
+ mutation: FgTriageFailedRunsDocument,
1034
+ variables: {}
1035
+ }));
1036
+ setLastRun(result.data?.fgTriageFailedRuns ?? null);
1037
+ setClusters(await fetchRunFailureClusters({
1038
+ filter: { status: OPEN_STATUSES },
1039
+ limit: 20
1040
+ }));
1041
+ } catch (runError) {
1042
+ setError(messageOf(runError));
1043
+ } finally {
1044
+ setBusy(false);
1045
+ }
1046
+ }, []),
1047
+ dismiss: useCallback(async (id) => {
1048
+ setError(null);
1049
+ try {
1050
+ await dismissRunFailureCluster(id);
1051
+ setClusters((current) => current.filter((cluster) => cluster.id !== id));
1052
+ } catch (dismissError) {
1053
+ setError(messageOf(dismissError));
1054
+ }
1055
+ }, [])
1056
+ };
1057
+ }
1058
+
1059
+ // src/modules/observability/components/FailureTriagePanel.tsx
1060
+ /**
1061
+ * Insights: Failure triage (BOFF-3698).
1062
+ *
1063
+ * Failure triage is an opt-in, hourly FluidGrids workflow that groups this
1064
+ * workspace's failed production runs into clusters, leaves transient failures
1065
+ * to the retry, prepares an AI fix proposal for each new cluster and tells the
1066
+ * person the runs ran as. It only proposes: nothing changes until someone
1067
+ * applies a proposal on the run page. This panel turns it on and off and lists
1068
+ * the caller's open clusters.
1069
+ */
1070
+ const BUCKET_LABELS = {
1071
+ EXPIRED_CONNECTION: {
1072
+ label: "Expired connection",
1073
+ icon: "mdi:key-alert-outline"
1074
+ },
1075
+ CONNECTOR_CONTRACT_CHANGE: {
1076
+ label: "Connector change",
1077
+ icon: "mdi:swap-horizontal"
1078
+ },
1079
+ BAD_NODE_CONFIG: {
1080
+ label: "Node configuration",
1081
+ icon: "mdi:cog-outline"
1082
+ },
1083
+ UPSTREAM_TRANSIENT: {
1084
+ label: "Transient",
1085
+ icon: "mdi:weather-cloudy-alert"
1086
+ },
1087
+ UNKNOWN: {
1088
+ label: "Unclassified",
1089
+ icon: "mdi:help-circle-outline"
1090
+ }
1091
+ };
1092
+ function ClusterRow({ cluster, canRetry, onOpenRun, onRetry, onDismiss }) {
1093
+ const tr = useTr();
1094
+ const bucket = BUCKET_LABELS[String(cluster.bucket)] ?? {
1095
+ label: String(cluster.bucket),
1096
+ icon: "mdi:alert-outline"
1097
+ };
1098
+ return /* @__PURE__ */ jsx("li", {
1099
+ className: "rounded-lg border border-border-secondary bg-background-primary p-3",
1100
+ "data-testid": "failure-cluster",
1101
+ "data-bucket": String(cluster.bucket),
1102
+ children: /* @__PURE__ */ jsxs("div", {
1103
+ className: "flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",
1104
+ children: [/* @__PURE__ */ jsxs("div", {
1105
+ className: "min-w-0",
1106
+ children: [
1107
+ /* @__PURE__ */ jsxs("div", {
1108
+ className: "flex flex-wrap items-center gap-2 text-sm",
1109
+ children: [
1110
+ /* @__PURE__ */ jsxs("span", {
1111
+ className: "inline-flex items-center gap-1 rounded-full bg-background-secondary px-2 py-0.5 text-xs text-text-secondary",
1112
+ children: [/* @__PURE__ */ jsx(Icon, {
1113
+ icon: bucket.icon,
1114
+ width: 14
1115
+ }), tr(`fluidgrids.triage.bucket.${String(cluster.bucket)}`, bucket.label)]
1116
+ }),
1117
+ /* @__PURE__ */ jsx("span", {
1118
+ className: "font-medium text-text-primary",
1119
+ children: cluster.workflowName || cluster.workflowKey
1120
+ }),
1121
+ /* @__PURE__ */ jsx("span", {
1122
+ className: "text-text-secondary",
1123
+ children: tr("fluidgrids.triage.atNode", "at {{node}}", { node: cluster.nodeId })
1124
+ })
1125
+ ]
1126
+ }),
1127
+ /* @__PURE__ */ jsx("p", {
1128
+ className: "mt-1 break-words text-sm text-text-secondary",
1129
+ children: cluster.signature
1130
+ }),
1131
+ /* @__PURE__ */ jsxs("p", {
1132
+ className: "mt-1 text-xs text-text-secondary",
1133
+ children: [tr("fluidgrids.triage.runCount", "{{count}} failed run(s), last {{when}}", {
1134
+ count: cluster.runCount,
1135
+ when: new Date(String(cluster.lastSeenAt)).toLocaleString()
1136
+ }), cluster.proposalId ? ` · ${tr("fluidgrids.triage.proposalReady", "Fix proposal ready to review")}` : ""]
1137
+ }),
1138
+ /* @__PURE__ */ jsx("p", {
1139
+ className: "mt-1 text-xs text-text-primary",
1140
+ children: cluster.advice
1141
+ })
1142
+ ]
1143
+ }), /* @__PURE__ */ jsxs("div", {
1144
+ className: "flex shrink-0 flex-wrap gap-2",
1145
+ children: [
1146
+ /* @__PURE__ */ jsx(Button, {
1147
+ size: "sm",
1148
+ variant: "outline",
1149
+ onClick: () => onOpenRun(cluster.lastRunId),
1150
+ "data-testid": "failure-cluster-open",
1151
+ children: cluster.proposalId ? tr("fluidgrids.triage.reviewFix", "Review fix") : tr("fluidgrids.triage.openRun", "Open run")
1152
+ }),
1153
+ canRetry && /* @__PURE__ */ jsx(Button, {
1154
+ size: "sm",
1155
+ variant: "outline",
1156
+ onClick: () => onRetry([cluster.lastRunId]),
1157
+ children: tr("fluidgrids.triage.retry", "Retry")
1158
+ }),
1159
+ /* @__PURE__ */ jsx(Button, {
1160
+ size: "sm",
1161
+ variant: "ghost",
1162
+ onClick: () => onDismiss(cluster.id),
1163
+ "data-testid": "failure-cluster-dismiss",
1164
+ children: tr("fluidgrids.triage.dismiss", "Dismiss")
1165
+ })
1166
+ ]
1167
+ })]
1168
+ })
1169
+ });
1170
+ }
1171
+ function FailureTriagePanel({ canManage, canRetry, onOpenRun, onRetry }) {
1172
+ const tr = useTr();
1173
+ const triage = useFailureTriage();
1174
+ const enabled = triage.settings?.enabled ?? false;
1175
+ return /* @__PURE__ */ jsxs("section", {
1176
+ className: "mb-6 rounded-xl border border-border-secondary bg-background-secondary p-4",
1177
+ "data-testid": "failure-triage-panel",
1178
+ children: [
1179
+ /* @__PURE__ */ jsxs("div", {
1180
+ className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
1181
+ children: [/* @__PURE__ */ jsxs("div", { children: [
1182
+ /* @__PURE__ */ jsxs("h2", {
1183
+ className: "flex items-center gap-2 text-base font-semibold text-text-primary",
1184
+ children: [/* @__PURE__ */ jsx(Icon, {
1185
+ icon: "mdi:stethoscope",
1186
+ width: 18
1187
+ }), tr("fluidgrids.triage.title", "Failure triage")]
1188
+ }),
1189
+ /* @__PURE__ */ jsx("p", {
1190
+ className: "mt-1 max-w-2xl text-sm text-text-secondary",
1191
+ children: tr("fluidgrids.triage.description", "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.")
1192
+ }),
1193
+ /* @__PURE__ */ jsxs("p", {
1194
+ className: "mt-1 text-xs text-text-secondary",
1195
+ "data-testid": "failure-triage-status",
1196
+ children: [
1197
+ enabled ? tr("fluidgrids.triage.on", "On") : tr("fluidgrids.triage.off", "Off"),
1198
+ triage.settings?.lastTickAt ? ` · ${tr("fluidgrids.triage.lastRun", "last run {{when}}", { when: new Date(String(triage.settings.lastTickAt)).toLocaleString() })}` : "",
1199
+ triage.settings && !triage.settings.killSwitchOn ? ` · ${tr("fluidgrids.triage.paused", "paused for this workspace")}` : ""
1200
+ ]
1201
+ })
1202
+ ] }), canManage && /* @__PURE__ */ jsxs("div", {
1203
+ className: "flex shrink-0 flex-wrap gap-2",
1204
+ children: [enabled && /* @__PURE__ */ jsx(Button, {
1205
+ size: "sm",
1206
+ variant: "outline",
1207
+ onClick: () => void triage.runNow(),
1208
+ disabled: triage.busy,
1209
+ "data-testid": "failure-triage-run-now",
1210
+ children: tr("fluidgrids.triage.runNow", "Run now")
1211
+ }), /* @__PURE__ */ jsx(Button, {
1212
+ size: "sm",
1213
+ variant: enabled ? "outline" : "default",
1214
+ onClick: () => void triage.setEnabled(!enabled),
1215
+ disabled: triage.busy || triage.loading,
1216
+ "data-testid": "failure-triage-toggle",
1217
+ children: enabled ? tr("fluidgrids.triage.turnOff", "Turn off") : tr("fluidgrids.triage.turnOn", "Turn on")
1218
+ })]
1219
+ })]
1220
+ }),
1221
+ triage.error && /* @__PURE__ */ jsx("p", {
1222
+ className: "mt-3 text-sm text-status-error-text",
1223
+ children: triage.error
1224
+ }),
1225
+ triage.lastRun && !triage.lastRun.skipped && /* @__PURE__ */ jsx("p", {
1226
+ className: "mt-3 text-xs text-text-secondary",
1227
+ children: tr("fluidgrids.triage.lastRunSummary", "Checked {{scanned}} failed run(s): {{created}} new cluster(s), {{suppressed}} left to the retry.", {
1228
+ scanned: triage.lastRun.scannedRuns,
1229
+ created: triage.lastRun.newClusterCount,
1230
+ suppressed: triage.lastRun.suppressedTransient
1231
+ })
1232
+ }),
1233
+ triage.clusters.length > 0 ? /* @__PURE__ */ jsx("ul", {
1234
+ className: "mt-4 space-y-2",
1235
+ "data-testid": "failure-cluster-list",
1236
+ children: triage.clusters.map((cluster) => /* @__PURE__ */ jsx(ClusterRow, {
1237
+ cluster,
1238
+ canRetry,
1239
+ onOpenRun,
1240
+ onRetry,
1241
+ onDismiss: (id) => void triage.dismiss(id)
1242
+ }, cluster.id))
1243
+ }) : !triage.loading && /* @__PURE__ */ jsx("p", {
1244
+ className: "mt-4 text-sm text-text-secondary",
1245
+ "data-testid": "failure-triage-empty",
1246
+ children: enabled ? tr("fluidgrids.triage.empty", "No repeated failures need attention.") : tr("fluidgrids.triage.emptyOff", "Turn failure triage on to have repeated failures grouped and explained here.")
1247
+ })
1248
+ ]
1249
+ });
1250
+ }
1251
+
1252
+ export { fetchRunFailureClusters as a, SetRunFailureTriageEnabledDocument as c, dismissRunFailureCluster as i, FgTriageFailedRunsDocument as l, FailureTriagePanel as n, RunFailureTriageSettingsDocument as o, OPEN_STATUSES as r, RunFailureClustersDocument as s, BUCKET_LABELS as t, DismissRunFailureClusterDocument as u };