@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.
Files changed (112) hide show
  1. package/README.md +41 -0
  2. package/dist/AiStudioPage-kJHSsIcj.js +774 -0
  3. package/dist/ApprovalInboxPage-dbBDSJ-f.js +558 -0
  4. package/dist/DataSinkDashboardPage-1h2QsMzH.js +270 -0
  5. package/dist/DataTablesPage-BZy2z0LB.js +1690 -0
  6. package/dist/EntityTagPicker-BqRNsLCQ.js +135 -0
  7. package/dist/{ExecutionDetailPage-DO38vZ_F.js → ExecutionDetailPage-BdcZmLT4.js} +799 -4420
  8. package/dist/ExecutionDetailPage-DvQ667OE.d.ts +10 -0
  9. package/dist/ExecutionsListPage-BCUJoAIE.js +2742 -0
  10. package/dist/{FailureTriagePanel-BHiduL7A.js → FailureTriagePanel-B9hDQymi.js} +4 -97
  11. package/dist/{FluidGridsProvider-B9RR_CI_.js → FluidGridsProvider-dvZSNtSW.js} +28 -350
  12. package/dist/HistoryPage-BLoRpJ1R.d.ts +6 -0
  13. package/dist/{HistoryPage-CA42pU85.js → HistoryPage-U0tqupBN.js} +6 -4
  14. package/dist/HumanRequestCard-D-ooVPDn.js +439 -0
  15. package/dist/{InsightsPage-CBoN_Mj9.js → InsightsPage-CALo16eB.js} +17 -328
  16. package/dist/ManagedAiPolicyAuthority-BxwJ3ptd.js +40 -0
  17. package/dist/{ManagedAiPolicyAuthority-CGux_DaV.d.ts → ManagedAiPolicyAuthority-DM3t3wNr.d.ts} +1 -5
  18. package/dist/ManagedAiPolicyAuthorityContext-CNkxIOZ1.js +10 -0
  19. package/dist/{MissingNodesInstallModal-Dm0nMBXM.js → MissingNodesInstallModal-CMybsI8h.js} +3 -2
  20. package/dist/{NodesPage-ClvhUfbh.js → NodesPage-Bf5PhfBK.js} +7 -3
  21. package/dist/NodesPage-DEbnz9iU.d.ts +6 -0
  22. package/dist/{PublishCustomNodeAction-D2F7oN0S.js → PublishCustomNodeAction-5XXnSA3H.js} +3 -45
  23. package/dist/QuotaExhaustedDialog-7IFSaLyi.js +54 -0
  24. package/dist/RunnerStatusPill-Ctg4TJcP.js +187 -0
  25. package/dist/RunnersPage-CLCOCclc.js +467 -0
  26. package/dist/{ManagedAiPolicyAuthority-CKihmbJE.js → SettingsPage-CgkRlCM5.js} +19 -50
  27. package/dist/SettingsPage-DMHQFj5-.d.ts +9 -0
  28. package/dist/TagFilterSelect-DCBOH6Ou.js +41 -0
  29. package/dist/TaskQueuesPage-9VgSnLdL.js +951 -0
  30. package/dist/TemplateCard-DsC0KNH1.js +1416 -0
  31. package/dist/{TemplateConfigurationModal-Bs_V-E4u.js → TemplateConfigurationModal-BhGWIzpm.js} +3 -2
  32. package/dist/{TemplateDetailPanel-MlT39VLG.js → TemplateDetailPanel-D4cUVr-m.js} +3 -3
  33. package/dist/TemplatePreview-GthzCOSo.js +231 -0
  34. package/dist/TemplatesPage-BG3H-6v6.d.ts +10 -0
  35. package/dist/{TemplatesPage-CHVpWBuw.js → TemplatesPage-CsDNT54N.js} +11 -228
  36. package/dist/VariablesPage-67WR_lVE.js +949 -0
  37. package/dist/{VersionDiffDialog-Dq2xlPFI.js → VersionDiffDialog-DSN0mU0f.js} +2 -1
  38. package/dist/WorkflowBuilder-DEi_9YOb.js +555 -0
  39. package/dist/{WorkflowSearchRedirect-3gyHcYY2.js → WorkflowBuilder-iPqXgbYr.js} +19 -585
  40. package/dist/{WorkflowProposalCard-8Vr56kQa.js → WorkflowProposalCard-qrEeNyYG.js} +4 -405
  41. package/dist/WorkflowSearchRedirect-DwDNZ_q5.js +36 -0
  42. package/dist/{WorkflowShareDialog-0Ai1HED-.js → WorkflowShareDialog-B_gn968c.js} +6 -52
  43. package/dist/{WorkflowsList-CJ3KmMHX.js → WorkflowsList-CA20dVIl.js} +11 -6
  44. package/dist/WorkflowsList-CcNDQge5.d.ts +6 -0
  45. package/dist/agent-form-Bfvm32j1.js +83 -0
  46. package/dist/{agentTools-B1IK1JEO.js → agentTools-CkRJB7r5.js} +3 -2
  47. package/dist/{ai-usage-D5p7ZeRR.js → ai-usage-glCwHyQz.js} +1 -1
  48. package/dist/api-BrCHB5oA.js +224 -0
  49. package/dist/api-C8e0iV-Q.js +55 -0
  50. package/dist/button-DG7y_FVJ.js +48 -0
  51. package/dist/{canvasNoteTools-eewVHVuy.js → canvasNoteTools-CQIc7Oxg.js} +2 -2
  52. package/dist/client-C9XSzSXr.js +1147 -0
  53. package/dist/{codec-client-DstqyzTN.js → codec-client-CJ95Rmqo.js} +1 -1
  54. package/dist/constants-B2lhWNoN.js +202 -0
  55. package/dist/constants-XdvUxeWK.d.ts +162 -0
  56. package/dist/dialog-Cjb4lB4D.js +105 -0
  57. package/dist/executions.d.ts +1 -1
  58. package/dist/executions.js +2 -1
  59. package/dist/feature-flags-DM5myWaD.js +296 -0
  60. package/dist/flags.d.ts +3 -0
  61. package/dist/flags.js +4 -0
  62. package/dist/{flow-builder-C_3sY3pZ.js → flow-builder-y2Y1iG4Y.js} +182 -1821
  63. package/dist/{node-endpoint-configs-DHFGA5MQ.js → graphql-operation-types-kX-MMjgW.js} +1 -1194
  64. package/dist/{graphql-types-XcDLtFwU.js → graphql-types-CDKVWH2R.js} +2 -202
  65. package/dist/history.d.ts +1 -1
  66. package/dist/history.js +1 -1
  67. package/dist/index-72XFgvbn.d.ts +132 -0
  68. package/dist/index-BcdtKBM-.d.ts +56 -0
  69. package/dist/{index-B3BWqafN.d.ts → index-DjiFgEQl.d.ts} +5 -131
  70. package/dist/{index-DRf25-D3.d.ts → index-W2o__Nm6.d.ts} +32 -214
  71. package/dist/index.d.ts +13 -9
  72. package/dist/index.js +50 -5300
  73. package/dist/{node-detail-view-CAws5qjg.js → node-detail-view-B91kXzIy.js} +11 -8
  74. package/dist/node-endpoint-configs-B5bjNMDW.js +37 -0
  75. package/dist/node-registry-refresh-Dy0uRg9f.js +84 -0
  76. package/dist/nodes.d.ts +1 -1
  77. package/dist/nodes.js +1 -1
  78. package/dist/observability.d.ts +1 -1
  79. package/dist/observability.js +2 -1
  80. package/dist/{quick-config-panel-DOzNkSVV.js → quick-config-panel-DggPl1vY.js} +2 -2
  81. package/dist/rolldown-runtime-hDbaFkMy.js +18 -0
  82. package/dist/run-display-BycKYSU0.js +46 -0
  83. package/dist/run-list-links-ByYC0OlV.js +98 -0
  84. package/dist/settings.d.ts +2 -1
  85. package/dist/settings.js +2 -1
  86. package/dist/shared-CMfn30xT.js +196 -0
  87. package/dist/templates.d.ts +1 -1
  88. package/dist/templates.js +2 -1
  89. package/dist/theme-provider-B3mIuz2d.js +11 -0
  90. package/dist/{useAgentDefinitions-NFtLytDR.js → useAgentDefinitions-Dpz0HDTq.js} +2 -1
  91. package/dist/useDurableParity-CzUQMFJ3.js +415 -0
  92. package/dist/useEntityTags-DhnsZcTl.js +236 -0
  93. package/dist/{useExecutions-DkS0FTfw.js → useExecutions-9aLuOt1c.js} +4 -3
  94. package/dist/{useObservability-BkxhHZsX.js → useObservability-CfEw3ZFD.js} +2 -2
  95. package/dist/{useRunHistory-DHehG09Z.js → useRunHistory-B1xJDwl1.js} +4 -3
  96. package/dist/{useWorkflows-DyhtoVwp.js → useWorkflows-BlVVu8NM.js} +3 -2
  97. package/dist/utils-uaL5UVxb.js +65 -0
  98. package/dist/workflow-builder.d.ts +1 -1
  99. package/dist/workflow-builder.js +4 -2
  100. package/dist/workflow-host.d.ts +6 -0
  101. package/dist/workflow-host.js +9 -0
  102. package/dist/workflow-pages.d.ts +55 -0
  103. package/dist/workflow-pages.js +113 -0
  104. package/dist/workflows-list.d.ts +1 -1
  105. package/dist/workflows-list.js +1 -1
  106. package/package.json +13 -1
  107. package/dist/ExecutionDetailPage-MvsnOnE1.d.ts +0 -4
  108. package/dist/HistoryPage-BqUizaFv.d.ts +0 -3
  109. package/dist/NodesPage-C97-9K2Y.d.ts +0 -3
  110. package/dist/TemplatesPage-D0qnXzHh.d.ts +0 -4
  111. package/dist/WorkflowsList-0d5GSKdh.d.ts +0 -3
  112. 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 { Jn as TriggerWorkflowDocument, Kn as TerminateExecutionDocument, Li as emitFluidGridsEvent, Oi as getFluidGridsClient, Ri as emitOperationErrorEvent, Rt as PauseExecutionDocument, Ui as throwIfResultError, aa as useExecutionsStore, cn as ResumeExecutionDocument, ln as RetryNodeDocument, lt as ExecutionStatsDocument, st as ExecutionDetailDocument, ut as ExecutionsListDocument, y as CancelExecutionDocument } from "./node-endpoint-configs-DHFGA5MQ.js";
3
- import { hD as RunGroupBy, yP as VersioningBehavior } from "./graphql-types-XcDLtFwU.js";
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 { fn as useFluidGridsAnalytics, pn as openRunQuotaUpgradePrompt } from "./FluidGridsProvider-B9RR_CI_.js";
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 { Bi as describeOperationError, Li as emitFluidGridsEvent, Oi as getFluidGridsClient, Ui as throwIfResultError } from "./node-endpoint-configs-DHFGA5MQ.js";
3
- import { fn as useFluidGridsAnalytics, pn as openRunQuotaUpgradePrompt } from "./FluidGridsProvider-B9RR_CI_.js";
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 { Bi as describeOperationError, Oi as getFluidGridsClient, Pn as SignalWorkflowRunDocument, Qr as WorkflowRunHistoryDocument, Ui as throwIfResultError, hn as RunEventAppendedDocument, ki as getFluidGridsClientSafe, qn as TerminateWorkflowRunDocument, qr as WorkflowRunDeterminismStatusDocument, rt as DurableRunFieldsDocument, ti as WorkflowRunStackTraceDocument } from "./node-endpoint-configs-DHFGA5MQ.js";
3
- import { Cn as payloadFromCardValues, Sn as parseRawSignalPayload, Tn as signalPayloadCard } from "./FluidGridsProvider-B9RR_CI_.js";
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 { yd as ExecutionKind } from "./graphql-types-XcDLtFwU.js";
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";