@burdenoff/fluidgrids-fe-sdk 2026.1111.15 → 2026.1111.17
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/README.md +41 -0
- package/dist/AiStudioPage-kJHSsIcj.js +774 -0
- package/dist/ApprovalInboxPage-dbBDSJ-f.js +558 -0
- package/dist/DataSinkDashboardPage-1h2QsMzH.js +270 -0
- package/dist/DataTablesPage-BZy2z0LB.js +1690 -0
- package/dist/EntityTagPicker-BqRNsLCQ.js +135 -0
- package/dist/{ExecutionDetailPage-DO38vZ_F.js → ExecutionDetailPage-BdcZmLT4.js} +799 -4420
- package/dist/ExecutionDetailPage-DvQ667OE.d.ts +10 -0
- package/dist/ExecutionsListPage-BCUJoAIE.js +2742 -0
- package/dist/{FailureTriagePanel-BHiduL7A.js → FailureTriagePanel-B9hDQymi.js} +4 -97
- package/dist/{FluidGridsProvider-B9RR_CI_.js → FluidGridsProvider-dvZSNtSW.js} +28 -350
- package/dist/HistoryPage-BLoRpJ1R.d.ts +6 -0
- package/dist/{HistoryPage-CA42pU85.js → HistoryPage-U0tqupBN.js} +6 -4
- package/dist/HumanRequestCard-D-ooVPDn.js +439 -0
- package/dist/{InsightsPage-CBoN_Mj9.js → InsightsPage-CALo16eB.js} +17 -328
- package/dist/ManagedAiPolicyAuthority-BxwJ3ptd.js +40 -0
- package/dist/{ManagedAiPolicyAuthority-CGux_DaV.d.ts → ManagedAiPolicyAuthority-DM3t3wNr.d.ts} +1 -5
- package/dist/ManagedAiPolicyAuthorityContext-CNkxIOZ1.js +10 -0
- package/dist/{MissingNodesInstallModal-Dm0nMBXM.js → MissingNodesInstallModal-CMybsI8h.js} +3 -2
- package/dist/{NodesPage-ClvhUfbh.js → NodesPage-Bf5PhfBK.js} +7 -3
- package/dist/NodesPage-DEbnz9iU.d.ts +6 -0
- package/dist/{PublishCustomNodeAction-D2F7oN0S.js → PublishCustomNodeAction-5XXnSA3H.js} +3 -45
- package/dist/QuotaExhaustedDialog-7IFSaLyi.js +54 -0
- package/dist/RunnerStatusPill-Ctg4TJcP.js +187 -0
- package/dist/RunnersPage-CLCOCclc.js +467 -0
- package/dist/{ManagedAiPolicyAuthority-CKihmbJE.js → SettingsPage-CgkRlCM5.js} +19 -50
- package/dist/SettingsPage-DMHQFj5-.d.ts +9 -0
- package/dist/TagFilterSelect-DCBOH6Ou.js +41 -0
- package/dist/TaskQueuesPage-9VgSnLdL.js +951 -0
- package/dist/TemplateCard-DsC0KNH1.js +1416 -0
- package/dist/{TemplateConfigurationModal-Bs_V-E4u.js → TemplateConfigurationModal-BhGWIzpm.js} +3 -2
- package/dist/{TemplateDetailPanel-MlT39VLG.js → TemplateDetailPanel-D4cUVr-m.js} +3 -3
- package/dist/TemplatePreview-GthzCOSo.js +231 -0
- package/dist/TemplatesPage-BG3H-6v6.d.ts +10 -0
- package/dist/{TemplatesPage-CHVpWBuw.js → TemplatesPage-CsDNT54N.js} +11 -228
- package/dist/VariablesPage-67WR_lVE.js +949 -0
- package/dist/{VersionDiffDialog-Dq2xlPFI.js → VersionDiffDialog-DSN0mU0f.js} +2 -1
- package/dist/WorkflowBuilder-DEi_9YOb.js +555 -0
- package/dist/{WorkflowSearchRedirect-3gyHcYY2.js → WorkflowBuilder-iPqXgbYr.js} +19 -585
- package/dist/{WorkflowProposalCard-8Vr56kQa.js → WorkflowProposalCard-qrEeNyYG.js} +4 -405
- package/dist/WorkflowSearchRedirect-DwDNZ_q5.js +36 -0
- package/dist/{WorkflowShareDialog-0Ai1HED-.js → WorkflowShareDialog-B_gn968c.js} +6 -52
- package/dist/{WorkflowsList-CJ3KmMHX.js → WorkflowsList-CA20dVIl.js} +11 -6
- package/dist/WorkflowsList-CcNDQge5.d.ts +6 -0
- package/dist/agent-form-Bfvm32j1.js +83 -0
- package/dist/{agentTools-B1IK1JEO.js → agentTools-CkRJB7r5.js} +3 -2
- package/dist/{ai-usage-D5p7ZeRR.js → ai-usage-glCwHyQz.js} +1 -1
- package/dist/api-BrCHB5oA.js +224 -0
- package/dist/api-C8e0iV-Q.js +55 -0
- package/dist/button-DG7y_FVJ.js +48 -0
- package/dist/{canvasNoteTools-eewVHVuy.js → canvasNoteTools-CQIc7Oxg.js} +2 -2
- package/dist/client-C9XSzSXr.js +1147 -0
- package/dist/{codec-client-DstqyzTN.js → codec-client-CJ95Rmqo.js} +1 -1
- package/dist/constants-B2lhWNoN.js +202 -0
- package/dist/constants-XdvUxeWK.d.ts +162 -0
- package/dist/dialog-Cjb4lB4D.js +105 -0
- package/dist/executions.d.ts +1 -1
- package/dist/executions.js +2 -1
- package/dist/feature-flags-DM5myWaD.js +296 -0
- package/dist/flags.d.ts +3 -0
- package/dist/flags.js +4 -0
- package/dist/{flow-builder-C_3sY3pZ.js → flow-builder-y2Y1iG4Y.js} +182 -1821
- package/dist/{node-endpoint-configs-DHFGA5MQ.js → graphql-operation-types-kX-MMjgW.js} +1 -1194
- package/dist/{graphql-types-XcDLtFwU.js → graphql-types-CDKVWH2R.js} +2 -202
- package/dist/history.d.ts +1 -1
- package/dist/history.js +1 -1
- package/dist/index-72XFgvbn.d.ts +132 -0
- package/dist/index-BcdtKBM-.d.ts +56 -0
- package/dist/{index-B3BWqafN.d.ts → index-DjiFgEQl.d.ts} +5 -131
- package/dist/{index-DRf25-D3.d.ts → index-W2o__Nm6.d.ts} +32 -214
- package/dist/index.d.ts +13 -9
- package/dist/index.js +50 -5300
- package/dist/{node-detail-view-CAws5qjg.js → node-detail-view-B91kXzIy.js} +11 -8
- package/dist/node-endpoint-configs-B5bjNMDW.js +37 -0
- package/dist/node-registry-refresh-Dy0uRg9f.js +84 -0
- package/dist/nodes.d.ts +1 -1
- package/dist/nodes.js +1 -1
- package/dist/observability.d.ts +1 -1
- package/dist/observability.js +2 -1
- package/dist/{quick-config-panel-DOzNkSVV.js → quick-config-panel-DggPl1vY.js} +2 -2
- package/dist/rolldown-runtime-hDbaFkMy.js +18 -0
- package/dist/run-display-BycKYSU0.js +46 -0
- package/dist/run-list-links-ByYC0OlV.js +98 -0
- package/dist/settings.d.ts +2 -1
- package/dist/settings.js +2 -1
- package/dist/shared-CMfn30xT.js +196 -0
- package/dist/templates.d.ts +1 -1
- package/dist/templates.js +2 -1
- package/dist/theme-provider-B3mIuz2d.js +11 -0
- package/dist/{useAgentDefinitions-NFtLytDR.js → useAgentDefinitions-Dpz0HDTq.js} +2 -1
- package/dist/useDurableParity-CzUQMFJ3.js +415 -0
- package/dist/useEntityTags-DhnsZcTl.js +236 -0
- package/dist/{useExecutions-DkS0FTfw.js → useExecutions-9aLuOt1c.js} +4 -3
- package/dist/{useObservability-BkxhHZsX.js → useObservability-CfEw3ZFD.js} +2 -2
- package/dist/{useRunHistory-DHehG09Z.js → useRunHistory-B1xJDwl1.js} +4 -3
- package/dist/{useWorkflows-DyhtoVwp.js → useWorkflows-BlVVu8NM.js} +3 -2
- package/dist/utils-uaL5UVxb.js +65 -0
- package/dist/workflow-builder.d.ts +1 -1
- package/dist/workflow-builder.js +4 -2
- package/dist/workflow-host.d.ts +6 -0
- package/dist/workflow-host.js +9 -0
- package/dist/workflow-pages.d.ts +55 -0
- package/dist/workflow-pages.js +113 -0
- package/dist/workflows-list.d.ts +1 -1
- package/dist/workflows-list.js +1 -1
- package/package.json +13 -1
- package/dist/ExecutionDetailPage-MvsnOnE1.d.ts +0 -4
- package/dist/HistoryPage-BqUizaFv.d.ts +0 -3
- package/dist/NodesPage-C97-9K2Y.d.ts +0 -3
- package/dist/TemplatesPage-D0qnXzHh.d.ts +0 -4
- package/dist/WorkflowsList-0d5GSKdh.d.ts +0 -3
- package/dist/agent-form-BvMWhQ42.js +0 -496
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
|
|
3
|
+
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
4
|
+
import { $r as WorkflowRunPendingDocument, Qr as WorkflowRunMetadataDocument, jn as SetWorkflowRunVersioningOverrideDocument, ni as WorkflowRunsCountDocument, tt as DurableParityRunFieldsDocument } from "./graphql-operation-types-kX-MMjgW.js";
|
|
5
|
+
import { _ as statusCountFilter, d as STATUS_COUNT_GROUP_BY, v as statusCountsOf } from "./useExecutions-9aLuOt1c.js";
|
|
6
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
7
|
+
import { Icon } from "@iconify/react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
|
|
10
|
+
// src/modules/executions/types/index.ts
|
|
11
|
+
const RUN_STATUS_CONFIG = {
|
|
12
|
+
PENDING: {
|
|
13
|
+
label: "Pending",
|
|
14
|
+
color: "text-text-secondary",
|
|
15
|
+
bgColor: "bg-bg-sunken",
|
|
16
|
+
borderColor: "border-border-default",
|
|
17
|
+
icon: "mdi:clock-outline"
|
|
18
|
+
},
|
|
19
|
+
RUNNING: {
|
|
20
|
+
label: "Running",
|
|
21
|
+
color: "text-status-info-text",
|
|
22
|
+
bgColor: "bg-status-info-bg-subtle",
|
|
23
|
+
borderColor: "border-status-info-border",
|
|
24
|
+
icon: "mdi:play-circle-outline"
|
|
25
|
+
},
|
|
26
|
+
COMPLETED: {
|
|
27
|
+
label: "Completed",
|
|
28
|
+
color: "text-status-success-text",
|
|
29
|
+
bgColor: "bg-status-success-bg-subtle",
|
|
30
|
+
borderColor: "border-status-success-border",
|
|
31
|
+
icon: "mdi:check-circle-outline"
|
|
32
|
+
},
|
|
33
|
+
FAILED: {
|
|
34
|
+
label: "Failed",
|
|
35
|
+
color: "text-status-error-text",
|
|
36
|
+
bgColor: "bg-status-error-bg-subtle",
|
|
37
|
+
borderColor: "border-status-error-border",
|
|
38
|
+
icon: "mdi:alert-circle-outline"
|
|
39
|
+
},
|
|
40
|
+
CANCELLED: {
|
|
41
|
+
label: "Cancelled",
|
|
42
|
+
color: "text-status-warning-text",
|
|
43
|
+
bgColor: "bg-status-warning-bg-subtle",
|
|
44
|
+
borderColor: "border-status-warning-border",
|
|
45
|
+
icon: "mdi:cancel"
|
|
46
|
+
},
|
|
47
|
+
WAITING: {
|
|
48
|
+
label: "Waiting",
|
|
49
|
+
color: "text-chart-3",
|
|
50
|
+
bgColor: "bg-chart-3/10",
|
|
51
|
+
borderColor: "border-chart-3/30",
|
|
52
|
+
icon: "mdi:timer-sand"
|
|
53
|
+
},
|
|
54
|
+
TERMINATED: {
|
|
55
|
+
label: "Terminated",
|
|
56
|
+
color: "text-text-secondary",
|
|
57
|
+
bgColor: "bg-bg-sunken",
|
|
58
|
+
borderColor: "border-border-strong",
|
|
59
|
+
icon: "mdi:stop-circle-outline"
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const NODE_STATUS_CONFIG = {
|
|
63
|
+
PENDING: {
|
|
64
|
+
label: "Pending",
|
|
65
|
+
color: "text-text-secondary",
|
|
66
|
+
bgColor: "bg-bg-sunken",
|
|
67
|
+
borderColor: "border-border-default",
|
|
68
|
+
icon: "mdi:clock-outline"
|
|
69
|
+
},
|
|
70
|
+
RUNNING: {
|
|
71
|
+
label: "Running",
|
|
72
|
+
color: "text-status-info-text",
|
|
73
|
+
bgColor: "bg-status-info-bg-subtle",
|
|
74
|
+
borderColor: "border-status-info-border",
|
|
75
|
+
icon: "mdi:play-circle-outline"
|
|
76
|
+
},
|
|
77
|
+
COMPLETED: {
|
|
78
|
+
label: "Completed",
|
|
79
|
+
color: "text-status-success-text",
|
|
80
|
+
bgColor: "bg-status-success-bg-subtle",
|
|
81
|
+
borderColor: "border-status-success-border",
|
|
82
|
+
icon: "mdi:check-circle-outline"
|
|
83
|
+
},
|
|
84
|
+
FAILED: {
|
|
85
|
+
label: "Failed",
|
|
86
|
+
color: "text-status-error-text",
|
|
87
|
+
bgColor: "bg-status-error-bg-subtle",
|
|
88
|
+
borderColor: "border-status-error-border",
|
|
89
|
+
icon: "mdi:alert-circle-outline"
|
|
90
|
+
},
|
|
91
|
+
SKIPPED: {
|
|
92
|
+
label: "Skipped",
|
|
93
|
+
color: "text-text-muted",
|
|
94
|
+
bgColor: "bg-bg-sunken",
|
|
95
|
+
borderColor: "border-border-default",
|
|
96
|
+
icon: "mdi:skip-next"
|
|
97
|
+
},
|
|
98
|
+
DELAYED: {
|
|
99
|
+
label: "Delayed",
|
|
100
|
+
color: "text-status-warning-text",
|
|
101
|
+
bgColor: "bg-status-warning-bg-subtle",
|
|
102
|
+
borderColor: "border-status-warning-border",
|
|
103
|
+
icon: "mdi:clock-alert-outline"
|
|
104
|
+
},
|
|
105
|
+
CANCELLED: {
|
|
106
|
+
label: "Cancelled",
|
|
107
|
+
color: "text-status-warning-text",
|
|
108
|
+
bgColor: "bg-status-warning-bg-subtle",
|
|
109
|
+
borderColor: "border-status-warning-border",
|
|
110
|
+
icon: "mdi:cancel"
|
|
111
|
+
},
|
|
112
|
+
TIMEOUT: {
|
|
113
|
+
label: "Timeout",
|
|
114
|
+
color: "text-status-error-text",
|
|
115
|
+
bgColor: "bg-status-error-bg-subtle",
|
|
116
|
+
borderColor: "border-status-error-border",
|
|
117
|
+
icon: "mdi:timer-off-outline"
|
|
118
|
+
},
|
|
119
|
+
WAITING: {
|
|
120
|
+
label: "Waiting",
|
|
121
|
+
color: "text-chart-3",
|
|
122
|
+
bgColor: "bg-chart-3/10",
|
|
123
|
+
borderColor: "border-chart-3/30",
|
|
124
|
+
icon: "mdi:timer-sand"
|
|
125
|
+
},
|
|
126
|
+
WAITING_SUBWORKFLOW: {
|
|
127
|
+
label: "Waiting",
|
|
128
|
+
color: "text-chart-3",
|
|
129
|
+
bgColor: "bg-chart-3/10",
|
|
130
|
+
borderColor: "border-chart-3/30",
|
|
131
|
+
icon: "mdi:subdirectory-arrow-right"
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// src/modules/executions/utils/run-status-labels.ts
|
|
136
|
+
function runStatusLabels(tr) {
|
|
137
|
+
return {
|
|
138
|
+
PENDING: tr("fluidgrids.executions.executionFilters.statusPending", "Pending"),
|
|
139
|
+
RUNNING: tr("fluidgrids.executions.executionFilters.statusRunning", "Running"),
|
|
140
|
+
COMPLETED: tr("fluidgrids.executions.executionFilters.statusCompleted", "Completed"),
|
|
141
|
+
FAILED: tr("fluidgrids.executions.executionFilters.statusFailed", "Failed"),
|
|
142
|
+
CANCELLED: tr("fluidgrids.executions.executionFilters.statusCancelled", "Cancelled"),
|
|
143
|
+
WAITING: tr("fluidgrids.executions.executionFilters.statusWaiting", "Waiting"),
|
|
144
|
+
TERMINATED: tr("fluidgrids.executions.executionFilters.statusTerminated", "Terminated")
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// src/modules/executions/components/ExecutionStatusBadge.tsx
|
|
149
|
+
function ExecutionStatusBadge({ status, size = "md", showIcon = true, showLabel = true, animated = true }) {
|
|
150
|
+
const tr = useTr();
|
|
151
|
+
const config = RUN_STATUS_CONFIG[status] ?? RUN_STATUS_CONFIG.PENDING;
|
|
152
|
+
const labels = runStatusLabels(tr);
|
|
153
|
+
const sizeClasses = {
|
|
154
|
+
sm: "px-1.5 py-0.5 text-xs gap-1",
|
|
155
|
+
md: "px-2 py-1 text-sm gap-1.5",
|
|
156
|
+
lg: "px-3 py-1.5 text-base gap-2"
|
|
157
|
+
};
|
|
158
|
+
const iconSizes = {
|
|
159
|
+
sm: 12,
|
|
160
|
+
md: 14,
|
|
161
|
+
lg: 16
|
|
162
|
+
};
|
|
163
|
+
const isRunning = status === "RUNNING";
|
|
164
|
+
return /* @__PURE__ */ jsxs("span", {
|
|
165
|
+
className: `
|
|
166
|
+
inline-flex items-center rounded-full font-medium
|
|
167
|
+
${config.bgColor} ${config.color} border ${config.borderColor}
|
|
168
|
+
${sizeClasses[size]}
|
|
169
|
+
${animated && isRunning ? "animate-pulse" : ""}
|
|
170
|
+
`,
|
|
171
|
+
children: [showIcon && /* @__PURE__ */ jsx(Icon, {
|
|
172
|
+
icon: config.icon,
|
|
173
|
+
width: iconSizes[size],
|
|
174
|
+
height: iconSizes[size],
|
|
175
|
+
className: animated && isRunning ? "animate-spin" : ""
|
|
176
|
+
}), showLabel && /* @__PURE__ */ jsx("span", { children: labels[status] ?? config.label })]
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function NodeStatusBadge({ status, size = "md", showIcon = true, showLabel = true, animated = true }) {
|
|
180
|
+
const config = NODE_STATUS_CONFIG[status] ?? NODE_STATUS_CONFIG.PENDING;
|
|
181
|
+
const sizeClasses = {
|
|
182
|
+
sm: "px-1.5 py-0.5 text-xs gap-1",
|
|
183
|
+
md: "px-2 py-1 text-sm gap-1.5",
|
|
184
|
+
lg: "px-3 py-1.5 text-base gap-2"
|
|
185
|
+
};
|
|
186
|
+
const iconSizes = {
|
|
187
|
+
sm: 12,
|
|
188
|
+
md: 14,
|
|
189
|
+
lg: 16
|
|
190
|
+
};
|
|
191
|
+
const isRunning = status === "RUNNING";
|
|
192
|
+
return /* @__PURE__ */ jsxs("span", {
|
|
193
|
+
className: `
|
|
194
|
+
inline-flex items-center rounded-full font-medium
|
|
195
|
+
${config.bgColor} ${config.color} border ${config.borderColor}
|
|
196
|
+
${sizeClasses[size]}
|
|
197
|
+
${animated && isRunning ? "animate-pulse" : ""}
|
|
198
|
+
`,
|
|
199
|
+
children: [showIcon && /* @__PURE__ */ jsx(Icon, {
|
|
200
|
+
icon: config.icon,
|
|
201
|
+
width: iconSizes[size],
|
|
202
|
+
height: iconSizes[size],
|
|
203
|
+
className: animated && isRunning ? "animate-spin" : ""
|
|
204
|
+
}), showLabel && /* @__PURE__ */ jsx("span", { children: config.label })]
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// src/modules/executions/hooks/useDurableParity.ts
|
|
209
|
+
/**
|
|
210
|
+
* Durable-function parity reads and writes of the run page and the Runs list
|
|
211
|
+
* (BOFF-9905, spec code-first 11): the run's workflow id, chain, metadata,
|
|
212
|
+
* callback and versioning; what it is waiting on; the `__metadata` answer;
|
|
213
|
+
* status counts; and the per-run versioning override.
|
|
214
|
+
*
|
|
215
|
+
* Like useDurableRun, every read is a plain network read and nothing is sent
|
|
216
|
+
* while `enabled` is false, which the pages tie to useDurableParityEnabled().
|
|
217
|
+
* A failed read keeps the last good answer, or none, so a gateway or service
|
|
218
|
+
* without the parity release never breaks the page: the parity views simply
|
|
219
|
+
* stay empty.
|
|
220
|
+
*/
|
|
221
|
+
/** Re-read cadence of the pending state while the run is live. */
|
|
222
|
+
const RUN_PENDING_POLL_INTERVAL_MS = 5e3;
|
|
223
|
+
async function fetchDurableParityRunFields(runId) {
|
|
224
|
+
const result = await getFluidGridsClient().query({
|
|
225
|
+
query: DurableParityRunFieldsDocument,
|
|
226
|
+
variables: { id: runId },
|
|
227
|
+
fetchPolicy: "network-only"
|
|
228
|
+
});
|
|
229
|
+
throwIfResultError(result);
|
|
230
|
+
return result.data?.workflowRun ?? null;
|
|
231
|
+
}
|
|
232
|
+
async function fetchRunPending(runId) {
|
|
233
|
+
const result = await getFluidGridsClient().query({
|
|
234
|
+
query: WorkflowRunPendingDocument,
|
|
235
|
+
variables: { id: runId },
|
|
236
|
+
fetchPolicy: "network-only"
|
|
237
|
+
});
|
|
238
|
+
throwIfResultError(result);
|
|
239
|
+
return result.data?.workflowRun?.pending ?? null;
|
|
240
|
+
}
|
|
241
|
+
async function fetchRunMetadata(runId) {
|
|
242
|
+
const result = await getFluidGridsClient().query({
|
|
243
|
+
query: WorkflowRunMetadataDocument,
|
|
244
|
+
variables: { runId },
|
|
245
|
+
fetchPolicy: "network-only"
|
|
246
|
+
});
|
|
247
|
+
throwIfResultError(result);
|
|
248
|
+
return result.data?.workflowRunStackTrace ?? null;
|
|
249
|
+
}
|
|
250
|
+
async function fetchRunStatusCounts(input) {
|
|
251
|
+
const filter = statusCountFilter(input);
|
|
252
|
+
const result = await getFluidGridsClient().query({
|
|
253
|
+
query: WorkflowRunsCountDocument,
|
|
254
|
+
variables: {
|
|
255
|
+
filter,
|
|
256
|
+
groupBy: [...STATUS_COUNT_GROUP_BY]
|
|
257
|
+
},
|
|
258
|
+
fetchPolicy: "network-only"
|
|
259
|
+
});
|
|
260
|
+
throwIfResultError(result);
|
|
261
|
+
const count = result.data?.workflowRunsCount;
|
|
262
|
+
if (!count) throw new Error("The run count returned no result");
|
|
263
|
+
return {
|
|
264
|
+
total: count.total,
|
|
265
|
+
counts: statusCountsOf(count.groups)
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
async function setRunVersioningOverride(input) {
|
|
269
|
+
const reason = input.reason?.trim();
|
|
270
|
+
const result = await getFluidGridsClient().mutate({
|
|
271
|
+
mutation: SetWorkflowRunVersioningOverrideDocument,
|
|
272
|
+
variables: {
|
|
273
|
+
runId: input.runId,
|
|
274
|
+
override: input.override,
|
|
275
|
+
reason: reason || null
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
throwIfResultError(result);
|
|
279
|
+
const data = result.data?.setWorkflowRunVersioningOverride;
|
|
280
|
+
if (!data) throw new Error("The override returned no result");
|
|
281
|
+
return data.versioning ?? null;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* A read keyed by run id that keeps the last good answer, ignores answers to
|
|
285
|
+
* superseded requests, and re-reads every `intervalMs` while `live`.
|
|
286
|
+
*/
|
|
287
|
+
function useRunRead(runId, enabled, load, { live = false, intervalMs = 0 }) {
|
|
288
|
+
const [data, setData] = useState(null);
|
|
289
|
+
const [loading, setLoading] = useState(false);
|
|
290
|
+
const [error, setError] = useState(null);
|
|
291
|
+
const request = useRef(0);
|
|
292
|
+
const refetch = useCallback(async () => {
|
|
293
|
+
if (!runId || !enabled) return;
|
|
294
|
+
const id = ++request.current;
|
|
295
|
+
setLoading(true);
|
|
296
|
+
try {
|
|
297
|
+
const next = await load(runId);
|
|
298
|
+
if (id !== request.current) return;
|
|
299
|
+
setData(next);
|
|
300
|
+
setError(null);
|
|
301
|
+
} catch (err) {
|
|
302
|
+
if (id !== request.current) return;
|
|
303
|
+
setError(describeOperationError(err));
|
|
304
|
+
} finally {
|
|
305
|
+
if (id === request.current) setLoading(false);
|
|
306
|
+
}
|
|
307
|
+
}, [
|
|
308
|
+
runId,
|
|
309
|
+
enabled,
|
|
310
|
+
load
|
|
311
|
+
]);
|
|
312
|
+
useEffect(() => {
|
|
313
|
+
request.current += 1;
|
|
314
|
+
setData(null);
|
|
315
|
+
setError(null);
|
|
316
|
+
setLoading(false);
|
|
317
|
+
refetch();
|
|
318
|
+
}, [refetch]);
|
|
319
|
+
useEffect(() => {
|
|
320
|
+
if (!live || !enabled || !runId || intervalMs <= 0) return;
|
|
321
|
+
const timer = setInterval(() => {
|
|
322
|
+
refetch();
|
|
323
|
+
}, intervalMs);
|
|
324
|
+
return () => clearInterval(timer);
|
|
325
|
+
}, [
|
|
326
|
+
live,
|
|
327
|
+
enabled,
|
|
328
|
+
runId,
|
|
329
|
+
intervalMs,
|
|
330
|
+
refetch
|
|
331
|
+
]);
|
|
332
|
+
return {
|
|
333
|
+
data: enabled ? data : null,
|
|
334
|
+
loading,
|
|
335
|
+
error,
|
|
336
|
+
refetch
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
/** The parity fields of a run; nothing is read while `enabled` is false. */
|
|
340
|
+
function useDurableParityRunFields(runId, enabled) {
|
|
341
|
+
const { data, error, refetch } = useRunRead(runId, enabled, fetchDurableParityRunFields, {});
|
|
342
|
+
return {
|
|
343
|
+
fields: data,
|
|
344
|
+
error,
|
|
345
|
+
refetch
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
/** What an open run is waiting on, re-read every 5 s while `live`. */
|
|
349
|
+
function useRunPending(runId, { enabled, live }) {
|
|
350
|
+
const { data, loading, error, refetch } = useRunRead(runId, enabled, fetchRunPending, {
|
|
351
|
+
live,
|
|
352
|
+
intervalMs: RUN_PENDING_POLL_INTERVAL_MS
|
|
353
|
+
});
|
|
354
|
+
return {
|
|
355
|
+
pending: data,
|
|
356
|
+
loading,
|
|
357
|
+
error,
|
|
358
|
+
refetch
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* `__stack_trace` with `__metadata` of an open durable run: one replay in the
|
|
363
|
+
* service, so it is read once when shown and on request, never polled.
|
|
364
|
+
*/
|
|
365
|
+
function useRunMetadata(runId, enabled) {
|
|
366
|
+
const { data, loading, error, refetch } = useRunRead(runId, enabled, fetchRunMetadata, {});
|
|
367
|
+
return {
|
|
368
|
+
answer: data,
|
|
369
|
+
loading,
|
|
370
|
+
error,
|
|
371
|
+
refetch
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Per-status counts of the Runs list's current filter. The filter is the
|
|
376
|
+
* list's own request (so the counts match it), and nothing is sent while
|
|
377
|
+
* `enabled` is false.
|
|
378
|
+
*/
|
|
379
|
+
function useRunStatusCounts(input, enabled) {
|
|
380
|
+
const [state, setState] = useState({
|
|
381
|
+
total: null,
|
|
382
|
+
counts: []
|
|
383
|
+
});
|
|
384
|
+
const [error, setError] = useState(null);
|
|
385
|
+
const request = useRef(0);
|
|
386
|
+
const filterKey = JSON.stringify(statusCountFilter(input));
|
|
387
|
+
const refetch = useCallback(async () => {
|
|
388
|
+
if (!enabled) return;
|
|
389
|
+
const id = ++request.current;
|
|
390
|
+
try {
|
|
391
|
+
const next = await fetchRunStatusCounts(JSON.parse(filterKey));
|
|
392
|
+
if (id !== request.current) return;
|
|
393
|
+
setState(next);
|
|
394
|
+
setError(null);
|
|
395
|
+
} catch (err) {
|
|
396
|
+
if (id !== request.current) return;
|
|
397
|
+
setError(describeOperationError(err));
|
|
398
|
+
}
|
|
399
|
+
}, [enabled, filterKey]);
|
|
400
|
+
useEffect(() => {
|
|
401
|
+
refetch();
|
|
402
|
+
}, [refetch]);
|
|
403
|
+
return enabled ? {
|
|
404
|
+
...state,
|
|
405
|
+
error,
|
|
406
|
+
refetch
|
|
407
|
+
} : {
|
|
408
|
+
total: null,
|
|
409
|
+
counts: [],
|
|
410
|
+
error: null,
|
|
411
|
+
refetch
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
export { useRunStatusCounts as a, runStatusLabels as c, useRunPending as i, RUN_STATUS_CONFIG as l, useDurableParityRunFields as n, ExecutionStatusBadge as o, useRunMetadata as r, NodeStatusBadge as s, setRunVersioningOverride as t };
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { n as getFluidGridsClient } from "./client-C9XSzSXr.js";
|
|
3
|
+
import { $n as UntagFluidgridsEntityDocument, D as CreateFluidgridsTagDocument, En as SearchFluidgridsTagsDocument, _t as FluidgridsEntityTagsDocument, d as AvailableFluidgridsTagsDocument, en as ReplaceFluidgridsEntityTagsDocument, z as DataTablesTagsDocument, zn as TagFluidgridsEntityDocument } from "./graphql-operation-types-kX-MMjgW.js";
|
|
4
|
+
import { useCallback, useEffect, useState } from "react";
|
|
5
|
+
|
|
6
|
+
// src/hooks/useEntityTags.ts
|
|
7
|
+
/**
|
|
8
|
+
* Entity tag hooks — thin wrappers over the generic FluidGrids tag API
|
|
9
|
+
* (wspace-workflow-svc `tags` module → wspace-tags-svc).
|
|
10
|
+
*
|
|
11
|
+
* Uses the shared Apollo client directly rather than generated hooks, matching
|
|
12
|
+
* the convention in useWorkflows.ts (works in embeds and other contexts that
|
|
13
|
+
* mount the SDK without an ApolloProvider above them).
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Entity types accepted by the FluidGrids tag API (wspace-workflow-svc
|
|
17
|
+
* `src/modules/tags/entity-tags.ts`). Workflows are tagged by `workflowKey`,
|
|
18
|
+
* every other type by its id. Connections are tagged in the integrations
|
|
19
|
+
* service, not here.
|
|
20
|
+
*/
|
|
21
|
+
const FLUIDGRIDS_ENTITY_TYPES = [
|
|
22
|
+
"FLUIDGRIDS_WORKFLOW",
|
|
23
|
+
"FLUIDGRIDS_RUN",
|
|
24
|
+
"FLUIDGRIDS_DATA_TABLE",
|
|
25
|
+
"FLUIDGRIDS_TRIGGER",
|
|
26
|
+
"FLUIDGRIDS_SCHEDULE"
|
|
27
|
+
];
|
|
28
|
+
/** Display label for an assignment, degrading to the tag id when tags-svc omits the projection. */
|
|
29
|
+
function tagLabel(assignment) {
|
|
30
|
+
return assignment.tagInfo?.label ?? assignment.tagInfo?.key ?? assignment.tagId.slice(0, 8);
|
|
31
|
+
}
|
|
32
|
+
/** Tags currently assigned to an entity. */
|
|
33
|
+
function useEntityTags(entityType, entityId) {
|
|
34
|
+
const [tags, setTags] = useState([]);
|
|
35
|
+
const [loading, setLoading] = useState(false);
|
|
36
|
+
const [error, setError] = useState(null);
|
|
37
|
+
const refetch = useCallback(async () => {
|
|
38
|
+
if (!entityId) {
|
|
39
|
+
setTags([]);
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
setLoading(true);
|
|
43
|
+
setError(null);
|
|
44
|
+
try {
|
|
45
|
+
const { data } = await getFluidGridsClient().query({
|
|
46
|
+
query: FluidgridsEntityTagsDocument,
|
|
47
|
+
variables: { input: {
|
|
48
|
+
entityType,
|
|
49
|
+
entityId
|
|
50
|
+
} },
|
|
51
|
+
fetchPolicy: "network-only"
|
|
52
|
+
});
|
|
53
|
+
const next = data?.fluidgridsEntityTags ?? [];
|
|
54
|
+
setTags(next);
|
|
55
|
+
return next;
|
|
56
|
+
} catch (err) {
|
|
57
|
+
setError(err);
|
|
58
|
+
return [];
|
|
59
|
+
} finally {
|
|
60
|
+
setLoading(false);
|
|
61
|
+
}
|
|
62
|
+
}, [entityType, entityId]);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
refetch();
|
|
65
|
+
}, [refetch]);
|
|
66
|
+
return {
|
|
67
|
+
tags,
|
|
68
|
+
loading,
|
|
69
|
+
error,
|
|
70
|
+
refetch
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** All assignable tags in the workspace. */
|
|
74
|
+
function useAvailableTags(limit = 50, options = {}) {
|
|
75
|
+
const [availableTags, setAvailableTags] = useState([]);
|
|
76
|
+
const [loading, setLoading] = useState(false);
|
|
77
|
+
const skip = options.skip ?? false;
|
|
78
|
+
const fetchTags = useCallback(async () => {
|
|
79
|
+
if (skip) return;
|
|
80
|
+
setLoading(true);
|
|
81
|
+
try {
|
|
82
|
+
const { data } = await getFluidGridsClient().query({
|
|
83
|
+
query: AvailableFluidgridsTagsDocument,
|
|
84
|
+
variables: { limit },
|
|
85
|
+
fetchPolicy: "network-only"
|
|
86
|
+
});
|
|
87
|
+
setAvailableTags(data?.availableFluidgridsTags ?? []);
|
|
88
|
+
} catch {
|
|
89
|
+
setAvailableTags([]);
|
|
90
|
+
} finally {
|
|
91
|
+
setLoading(false);
|
|
92
|
+
}
|
|
93
|
+
}, [limit, skip]);
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
fetchTags();
|
|
96
|
+
}, [fetchTags]);
|
|
97
|
+
return {
|
|
98
|
+
availableTags,
|
|
99
|
+
loading,
|
|
100
|
+
refetch: fetchTags
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/** Search assignable tags by label. */
|
|
104
|
+
function useSearchTags() {
|
|
105
|
+
return useCallback(async (query, limit = 20) => {
|
|
106
|
+
if (!query.trim()) return [];
|
|
107
|
+
try {
|
|
108
|
+
const { data } = await getFluidGridsClient().query({
|
|
109
|
+
query: SearchFluidgridsTagsDocument,
|
|
110
|
+
variables: {
|
|
111
|
+
query,
|
|
112
|
+
limit
|
|
113
|
+
},
|
|
114
|
+
fetchPolicy: "network-only"
|
|
115
|
+
});
|
|
116
|
+
return data?.searchFluidgridsTags ?? [];
|
|
117
|
+
} catch {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
}, []);
|
|
121
|
+
}
|
|
122
|
+
/** Assign a tag to an entity. */
|
|
123
|
+
function useTagEntity() {
|
|
124
|
+
return useCallback(async (entityType, entityId, tagId) => {
|
|
125
|
+
const { data } = await getFluidGridsClient().mutate({
|
|
126
|
+
mutation: TagFluidgridsEntityDocument,
|
|
127
|
+
variables: { input: {
|
|
128
|
+
entityType,
|
|
129
|
+
entityId,
|
|
130
|
+
tagId,
|
|
131
|
+
source: "MANUAL"
|
|
132
|
+
} }
|
|
133
|
+
});
|
|
134
|
+
return Boolean(data?.tagFluidgridsEntity);
|
|
135
|
+
}, []);
|
|
136
|
+
}
|
|
137
|
+
/** Remove a tag from an entity. */
|
|
138
|
+
function useUntagEntity() {
|
|
139
|
+
return useCallback(async (entityType, entityId, tagId) => {
|
|
140
|
+
const { data } = await getFluidGridsClient().mutate({
|
|
141
|
+
mutation: UntagFluidgridsEntityDocument,
|
|
142
|
+
variables: { input: {
|
|
143
|
+
entityType,
|
|
144
|
+
entityId,
|
|
145
|
+
tagId
|
|
146
|
+
} }
|
|
147
|
+
});
|
|
148
|
+
return Boolean(data?.untagFluidgridsEntity);
|
|
149
|
+
}, []);
|
|
150
|
+
}
|
|
151
|
+
/** Replace the full tag set on an entity. */
|
|
152
|
+
function useReplaceEntityTags() {
|
|
153
|
+
return useCallback(async (entityType, entityId, tagIds) => {
|
|
154
|
+
const { data } = await getFluidGridsClient().mutate({
|
|
155
|
+
mutation: ReplaceFluidgridsEntityTagsDocument,
|
|
156
|
+
variables: { input: {
|
|
157
|
+
entityType,
|
|
158
|
+
entityId,
|
|
159
|
+
tagIds
|
|
160
|
+
} }
|
|
161
|
+
});
|
|
162
|
+
return data?.replaceFluidgridsEntityTags ?? [];
|
|
163
|
+
}, []);
|
|
164
|
+
}
|
|
165
|
+
/** Create a new assignable tag (inline creation from the picker). */
|
|
166
|
+
function useCreateTag() {
|
|
167
|
+
return useCallback(async (label, color) => {
|
|
168
|
+
const { data } = await getFluidGridsClient().mutate({
|
|
169
|
+
mutation: CreateFluidgridsTagDocument,
|
|
170
|
+
variables: { input: {
|
|
171
|
+
label,
|
|
172
|
+
color
|
|
173
|
+
} }
|
|
174
|
+
});
|
|
175
|
+
return data?.createFluidgridsTag ?? null;
|
|
176
|
+
}, []);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Create-time tagging: collect tag ids while the entity does not exist yet,
|
|
180
|
+
* then flush them once it does.
|
|
181
|
+
*
|
|
182
|
+
* The flush is best-effort — the entity already exists by then, so a tag
|
|
183
|
+
* failure must never block navigation; the detail-surface picker lets the
|
|
184
|
+
* user retry.
|
|
185
|
+
*/
|
|
186
|
+
function useDraftEntityTags(entityType) {
|
|
187
|
+
const [draftTagIds, setDraftTagIds] = useState([]);
|
|
188
|
+
const tagEntity = useTagEntity();
|
|
189
|
+
return {
|
|
190
|
+
draftTagIds,
|
|
191
|
+
setDraftTagIds,
|
|
192
|
+
flushTags: useCallback(async (entityId) => {
|
|
193
|
+
if (!entityId || draftTagIds.length === 0) return;
|
|
194
|
+
await Promise.all(draftTagIds.map((tagId) => tagEntity(entityType, entityId, tagId).catch(() => false)));
|
|
195
|
+
}, [
|
|
196
|
+
draftTagIds,
|
|
197
|
+
entityType,
|
|
198
|
+
tagEntity
|
|
199
|
+
])
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Tag overlay for the Data Tables list: tableId -> assignments (G47).
|
|
204
|
+
*
|
|
205
|
+
* Separate from the list query, like {@link useWorkflowTagOverlay}: when
|
|
206
|
+
* `tagAssignments` is not in the supergraph yet, only the chips go missing.
|
|
207
|
+
*/
|
|
208
|
+
function useDataTableTagOverlay(limit = 200) {
|
|
209
|
+
const [tagsById, setTagsById] = useState({});
|
|
210
|
+
const fetchOverlay = useCallback(async () => {
|
|
211
|
+
try {
|
|
212
|
+
const { data } = await getFluidGridsClient().query({
|
|
213
|
+
query: DataTablesTagsDocument,
|
|
214
|
+
variables: { limit },
|
|
215
|
+
fetchPolicy: "network-only"
|
|
216
|
+
});
|
|
217
|
+
const next = {};
|
|
218
|
+
for (const table of data?.dataTables?.tables ?? []) {
|
|
219
|
+
const assignments = table.tagAssignments ?? [];
|
|
220
|
+
if (assignments.length > 0) next[table.id] = assignments;
|
|
221
|
+
}
|
|
222
|
+
setTagsById(next);
|
|
223
|
+
} catch {
|
|
224
|
+
setTagsById({});
|
|
225
|
+
}
|
|
226
|
+
}, [limit]);
|
|
227
|
+
useEffect(() => {
|
|
228
|
+
fetchOverlay();
|
|
229
|
+
}, [fetchOverlay]);
|
|
230
|
+
return {
|
|
231
|
+
tagsById,
|
|
232
|
+
refetch: fetchOverlay
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export { useDataTableTagOverlay as a, useReplaceEntityTags as c, useUntagEntity as d, useCreateTag as i, useSearchTags as l, tagLabel as n, useDraftEntityTags as o, useAvailableTags as r, useEntityTags as s, FLUIDGRIDS_ENTITY_TYPES as t, useTagEntity as u };
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { N as useExecutionsStore, _ as throwIfResultError, d as emitFluidGridsEvent, f as emitOperationErrorEvent, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
|
|
3
|
+
import { Gn as TerminateExecutionDocument, Lt as PauseExecutionDocument, cn as RetryNodeDocument, ct as ExecutionStatsDocument, lt as ExecutionsListDocument, ot as ExecutionDetailDocument, qn as TriggerWorkflowDocument, sn as ResumeExecutionDocument, v as CancelExecutionDocument } from "./graphql-operation-types-kX-MMjgW.js";
|
|
4
|
+
import { hD as RunGroupBy, yP as VersioningBehavior } from "./graphql-types-CDKVWH2R.js";
|
|
4
5
|
import { c as REPLAY_WORKFLOW_RUN, l as RETRY_WORKFLOW_RUNS } from "./operations-HU-xb78H.js";
|
|
5
|
-
import {
|
|
6
|
+
import { mn as openRunQuotaUpgradePrompt, pn as useFluidGridsAnalytics } from "./FluidGridsProvider-dvZSNtSW.js";
|
|
6
7
|
import { i as emitRunStarted } from "./fluidgridsEvents-CNdcrUNN.js";
|
|
7
8
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
8
9
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { _ as throwIfResultError, d as emitFluidGridsEvent, m as describeOperationError, n as getFluidGridsClient } from "./client-C9XSzSXr.js";
|
|
3
|
+
import { mn as openRunQuotaUpgradePrompt, pn as useFluidGridsAnalytics } from "./FluidGridsProvider-dvZSNtSW.js";
|
|
4
4
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
5
5
|
import { i as emitRunStarted } from "./fluidgridsEvents-CNdcrUNN.js";
|
|
6
6
|
import { a as OBSERVABILITY_DATA_SINKS, c as REPLAY_WORKFLOW_RUN, d as UPDATE_LOG_STREAM_DESTINATION, i as OBSERVABILITY_DASHBOARD_SUMMARY, l as RETRY_WORKFLOW_RUNS, n as DELETE_LOG_STREAM_DESTINATION, o as OBSERVABILITY_DATA_SINK_DATA, r as LOG_STREAM_DESTINATIONS, s as OBSERVABILITY_FAILED_RUNS, t as CREATE_LOG_STREAM_DESTINATION, u as TEST_LOG_STREAM_DESTINATION } from "./operations-HU-xb78H.js";
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { Cn as
|
|
2
|
+
import { _ as throwIfResultError, m as describeOperationError, n as getFluidGridsClient, r as getFluidGridsClientSafe } from "./client-C9XSzSXr.js";
|
|
3
|
+
import { Cn as parseRawSignalPayload, En as signalPayloadCard, wn as payloadFromCardValues } from "./FluidGridsProvider-dvZSNtSW.js";
|
|
4
4
|
import { r as useTr } from "./TranslationBridge-Da-TPgQm.js";
|
|
5
|
-
import {
|
|
5
|
+
import { Kn as TerminateWorkflowRunDocument, Kr as WorkflowRunDeterminismStatusDocument, Nn as SignalWorkflowRunDocument, Zr as WorkflowRunHistoryDocument, ei as WorkflowRunStackTraceDocument, mn as RunEventAppendedDocument, nt as DurableRunFieldsDocument } from "./graphql-operation-types-kX-MMjgW.js";
|
|
6
|
+
import { yd as ExecutionKind } from "./graphql-types-CDKVWH2R.js";
|
|
6
7
|
import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react";
|
|
7
8
|
import { Icon } from "@iconify/react";
|
|
8
9
|
import { cn } from "@burdenoff/fe-libs/utils";
|