@datatechsolutions/ui 2.11.83 → 2.11.84

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 (101) hide show
  1. package/dist/astrlabe/index.d.mts +3 -52
  2. package/dist/astrlabe/index.d.ts +3 -52
  3. package/dist/astrlabe/index.js +107 -107
  4. package/dist/astrlabe/index.mjs +4 -4
  5. package/dist/astrlabe/workflow-canvas.js +4 -4
  6. package/dist/astrlabe/workflow-canvas.mjs +3 -3
  7. package/dist/chunk-3T2WGL47.js +44 -0
  8. package/dist/chunk-3T2WGL47.js.map +1 -0
  9. package/dist/{chunk-UVGMKHWH.mjs → chunk-63AL2RN5.mjs} +4 -4
  10. package/dist/{chunk-UVGMKHWH.mjs.map → chunk-63AL2RN5.mjs.map} +1 -1
  11. package/dist/chunk-64G2HBRQ.mjs +481 -0
  12. package/dist/chunk-64G2HBRQ.mjs.map +1 -0
  13. package/dist/{chunk-J3OYJ44D.mjs → chunk-BH2AU3LG.mjs} +3 -3
  14. package/dist/{chunk-J3OYJ44D.mjs.map → chunk-BH2AU3LG.mjs.map} +1 -1
  15. package/dist/chunk-CCRBT7TA.mjs +941 -0
  16. package/dist/chunk-CCRBT7TA.mjs.map +1 -0
  17. package/dist/chunk-CHLJUSXX.mjs +128 -0
  18. package/dist/chunk-CHLJUSXX.mjs.map +1 -0
  19. package/dist/chunk-CXIQWPBH.js +214 -0
  20. package/dist/chunk-CXIQWPBH.js.map +1 -0
  21. package/dist/chunk-EDE36MKE.mjs +412 -0
  22. package/dist/chunk-EDE36MKE.mjs.map +1 -0
  23. package/dist/{chunk-M7P2TQ6X.js → chunk-EFREXNZB.js} +64 -64
  24. package/dist/{chunk-M7P2TQ6X.js.map → chunk-EFREXNZB.js.map} +1 -1
  25. package/dist/chunk-FAGDZEKM.js +23 -0
  26. package/dist/chunk-FAGDZEKM.js.map +1 -0
  27. package/dist/{chunk-TUEYBNWL.js → chunk-GV6WJCEB.js} +3 -3
  28. package/dist/{chunk-TUEYBNWL.js.map → chunk-GV6WJCEB.js.map} +1 -1
  29. package/dist/chunk-HU3EAHFO.mjs +20 -0
  30. package/dist/chunk-HU3EAHFO.mjs.map +1 -0
  31. package/dist/{chunk-LLFU42KC.mjs → chunk-I6WYV2AN.mjs} +3 -3
  32. package/dist/{chunk-LLFU42KC.mjs.map → chunk-I6WYV2AN.mjs.map} +1 -1
  33. package/dist/chunk-JJWFMKZY.js +132 -0
  34. package/dist/chunk-JJWFMKZY.js.map +1 -0
  35. package/dist/{chunk-JFWZHROG.js → chunk-L6FVIWAJ.js} +128 -128
  36. package/dist/{chunk-JFWZHROG.js.map → chunk-L6FVIWAJ.js.map} +1 -1
  37. package/dist/chunk-MNQEZL7B.mjs +210 -0
  38. package/dist/chunk-MNQEZL7B.mjs.map +1 -0
  39. package/dist/chunk-SGJ24J2Q.js +943 -0
  40. package/dist/chunk-SGJ24J2Q.js.map +1 -0
  41. package/dist/chunk-SW6TVAIJ.js +418 -0
  42. package/dist/chunk-SW6TVAIJ.js.map +1 -0
  43. package/dist/chunk-SYNVNTLJ.mjs +20 -0
  44. package/dist/chunk-SYNVNTLJ.mjs.map +1 -0
  45. package/dist/chunk-UQXVCVAN.mjs +41 -0
  46. package/dist/chunk-UQXVCVAN.mjs.map +1 -0
  47. package/dist/chunk-WGELLCOZ.js +22 -0
  48. package/dist/chunk-WGELLCOZ.js.map +1 -0
  49. package/dist/chunk-YXPHJ2BQ.js +541 -0
  50. package/dist/chunk-YXPHJ2BQ.js.map +1 -0
  51. package/dist/index.d.mts +3 -47
  52. package/dist/index.d.ts +3 -47
  53. package/dist/index.js +765 -765
  54. package/dist/index.mjs +2 -2
  55. package/dist/navigation-BiWVffAN.d.mts +49 -0
  56. package/dist/navigation-BiWVffAN.d.ts +49 -0
  57. package/dist/platform/agents-workspace.d.mts +19 -0
  58. package/dist/platform/agents-workspace.d.ts +19 -0
  59. package/dist/platform/agents-workspace.js +26 -0
  60. package/dist/platform/agents-workspace.js.map +1 -0
  61. package/dist/platform/agents-workspace.mjs +17 -0
  62. package/dist/platform/agents-workspace.mjs.map +1 -0
  63. package/dist/platform/app-shell.d.mts +58 -0
  64. package/dist/platform/app-shell.d.ts +58 -0
  65. package/dist/platform/app-shell.js +17 -0
  66. package/dist/platform/app-shell.js.map +1 -0
  67. package/dist/platform/app-shell.mjs +8 -0
  68. package/dist/platform/app-shell.mjs.map +1 -0
  69. package/dist/platform/index.d.mts +100 -3
  70. package/dist/platform/index.d.ts +100 -3
  71. package/dist/platform/index.js +499 -28
  72. package/dist/platform/index.js.map +1 -1
  73. package/dist/platform/index.mjs +472 -27
  74. package/dist/platform/index.mjs.map +1 -1
  75. package/dist/platform/pages/index.d.mts +243 -82
  76. package/dist/platform/pages/index.d.ts +243 -82
  77. package/dist/platform/pages/index.js +886 -614
  78. package/dist/platform/pages/index.js.map +1 -1
  79. package/dist/platform/pages/index.mjs +756 -511
  80. package/dist/platform/pages/index.mjs.map +1 -1
  81. package/dist/platform/utils/index.js +18 -56
  82. package/dist/platform/utils/index.js.map +1 -1
  83. package/dist/platform/utils/index.mjs +3 -53
  84. package/dist/platform/utils/index.mjs.map +1 -1
  85. package/dist/platform/workflow-api-client.d.mts +6 -0
  86. package/dist/platform/workflow-api-client.d.ts +6 -0
  87. package/dist/platform/workflow-api-client.js +246 -0
  88. package/dist/platform/workflow-api-client.js.map +1 -0
  89. package/dist/platform/workflow-api-client.mjs +5 -0
  90. package/dist/platform/workflow-api-client.mjs.map +1 -0
  91. package/dist/platform/workflow-canvas-shell.d.mts +18 -0
  92. package/dist/platform/workflow-canvas-shell.d.ts +18 -0
  93. package/dist/platform/workflow-canvas-shell.js +20 -0
  94. package/dist/platform/workflow-canvas-shell.js.map +1 -0
  95. package/dist/platform/workflow-canvas-shell.mjs +11 -0
  96. package/dist/platform/workflow-canvas-shell.mjs.map +1 -0
  97. package/dist/{rule-form-F5jBOeqk.d.mts → rule-form-BYJzyork.d.mts} +50 -1
  98. package/dist/{rule-form-F5jBOeqk.d.ts → rule-form-BYJzyork.d.ts} +50 -1
  99. package/dist/workflow-api-client-C8gPn_D1.d.mts +386 -0
  100. package/dist/workflow-api-client-Dy1Ph8W-.d.ts +386 -0
  101. package/package.json +21 -1
@@ -0,0 +1,941 @@
1
+ "use client";
2
+ import { DatasourceFormModal } from './chunk-EDE36MKE.mjs';
3
+ import { getWorkflowById, getAgentConfigsWithPrompts, getAgentModels, getAgentToolDefinitions, getAgentRules, getDatasources, listModelProviderConnections, getAgentTools, getWorkflows, saveWorkflowDraft, publishWorkflow, createWorkflow, deleteWorkflow, updateAgentTool, updateAgentRule, createDatasource, getDatasourceSchema, getDatasourceTables, updateAgentConfig, createAgentConfig, updateWorkflowSettings, getWorkflowRuns, executeWorkflow, buildAuthenticatedApiUrl } from './chunk-64G2HBRQ.mjs';
4
+ import { useSubworkflowStore, SaveStatusBadge, WorkflowListBar, NodePalette, AutoSaveWorkspace, AgentModal, PipelineSettingsModal, SubworkflowModal, RunPanel, RunInputDialog, PreviewPanel } from './chunk-63AL2RN5.mjs';
5
+ import { validateWorkflowGraph } from './chunk-53SRKVKQ.mjs';
6
+ import { useModalStore, useWorkflowStore, WorkflowBuilderProvider } from './chunk-BH2AU3LG.mjs';
7
+ import { useNotifications, PageErrorState, PageEmptyState, CopyableId, Button, DynamicIslandConfirm } from './chunk-I6WYV2AN.mjs';
8
+ import { useLocale, useTranslations } from './chunk-7VJ7CMMT.mjs';
9
+ import { useCallback, useState, useRef, useEffect, useMemo } from 'react';
10
+ import { useNavigate } from 'react-router';
11
+ import { ChartBarIcon, StopIcon, PlayIcon, DocumentCheckIcon } from '@heroicons/react/24/outline';
12
+ import { jsx, jsxs } from 'react/jsx-runtime';
13
+
14
+ var WS_ENDPOINT = import.meta.env.VITE_WS_ENDPOINT ?? "";
15
+ var useWebSocket = WS_ENDPOINT.length > 0;
16
+ function connectSSE(workflowId, runId, callbacks) {
17
+ let eventSource = null;
18
+ let cancelled = false;
19
+ buildAuthenticatedApiUrl(
20
+ `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/events`,
21
+ { includeAccessToken: true }
22
+ ).then((url) => {
23
+ if (cancelled) return;
24
+ eventSource = new EventSource(url);
25
+ eventSource.addEventListener("connected", () => callbacks.onConnected());
26
+ eventSource.addEventListener("execution", (messageEvent) => {
27
+ try {
28
+ callbacks.onEvent(JSON.parse(messageEvent.data));
29
+ } catch {
30
+ }
31
+ });
32
+ eventSource.addEventListener("done", (messageEvent) => {
33
+ try {
34
+ const data = JSON.parse(messageEvent.data);
35
+ callbacks.onDone(data.status === "run_completed" ? "completed" : "failed");
36
+ } catch {
37
+ callbacks.onDone("completed");
38
+ }
39
+ eventSource?.close();
40
+ });
41
+ eventSource.addEventListener("error", () => {
42
+ eventSource?.close();
43
+ callbacks.onError();
44
+ });
45
+ }).catch(() => callbacks.onError());
46
+ return () => {
47
+ cancelled = true;
48
+ eventSource?.close();
49
+ };
50
+ }
51
+ function connectWebSocket(_workflowId, runId, callbacks) {
52
+ const ws = new WebSocket(WS_ENDPOINT);
53
+ ws.addEventListener("open", () => {
54
+ ws.send(JSON.stringify({ action: "subscribe", runId }));
55
+ callbacks.onConnected();
56
+ });
57
+ ws.addEventListener("message", (messageEvent) => {
58
+ try {
59
+ const data = JSON.parse(messageEvent.data);
60
+ if (data.type === "run_completed" || data.type === "run_failed") {
61
+ callbacks.onDone(data.type === "run_completed" ? "completed" : "failed");
62
+ ws.send(JSON.stringify({ action: "unsubscribe", runId }));
63
+ ws.close();
64
+ return;
65
+ }
66
+ callbacks.onEvent(data);
67
+ } catch {
68
+ }
69
+ });
70
+ ws.addEventListener("error", () => {
71
+ callbacks.onError();
72
+ });
73
+ ws.addEventListener("close", () => {
74
+ });
75
+ return () => {
76
+ if (ws.readyState === WebSocket.OPEN) {
77
+ ws.send(JSON.stringify({ action: "unsubscribe", runId }));
78
+ }
79
+ ws.close();
80
+ };
81
+ }
82
+ function useRunEvents(workflowId, runId) {
83
+ const [events, setEvents] = useState([]);
84
+ const [status, setStatus] = useState("idle");
85
+ const [error, setError] = useState(null);
86
+ const cleanupRef = useRef(null);
87
+ const retriesRef = useRef(0);
88
+ const connect = useCallback(() => {
89
+ if (!workflowId || !runId) return;
90
+ const connectFn = useWebSocket ? connectWebSocket : connectSSE;
91
+ const callbacks = {
92
+ onConnected: () => {
93
+ setStatus("streaming");
94
+ setError(null);
95
+ retriesRef.current = 0;
96
+ },
97
+ onEvent: (event) => {
98
+ setEvents((prev) => [...prev, event]);
99
+ },
100
+ onDone: (terminalStatus) => {
101
+ setStatus(terminalStatus);
102
+ cleanupRef.current = null;
103
+ },
104
+ onError: () => {
105
+ cleanupRef.current = null;
106
+ if (retriesRef.current < 3) {
107
+ retriesRef.current++;
108
+ const delay = Math.min(1e3 * Math.pow(2, retriesRef.current - 1), 5e3);
109
+ setTimeout(connect, delay);
110
+ } else {
111
+ setStatus("error");
112
+ setError("Connection lost after 3 retries");
113
+ }
114
+ }
115
+ };
116
+ cleanupRef.current = connectFn(workflowId, runId, callbacks);
117
+ }, [workflowId, runId]);
118
+ useEffect(() => {
119
+ if (!workflowId || !runId) return;
120
+ setEvents([]);
121
+ setStatus("streaming");
122
+ setError(null);
123
+ retriesRef.current = 0;
124
+ connect();
125
+ return () => {
126
+ if (cleanupRef.current) {
127
+ cleanupRef.current();
128
+ cleanupRef.current = null;
129
+ }
130
+ };
131
+ }, [workflowId, runId, connect]);
132
+ return {
133
+ events,
134
+ isStreaming: status === "streaming",
135
+ status,
136
+ error
137
+ };
138
+ }
139
+ function resetWorkflowRunPresentation(actions) {
140
+ actions.clearNodeResults();
141
+ actions.setIsRunning(false);
142
+ }
143
+ function applyWorkflowExecutionEventToStore(actions, event) {
144
+ switch (event.type) {
145
+ case "run_started":
146
+ actions.clearNodeResults();
147
+ actions.setIsRunning(true);
148
+ return;
149
+ case "node_started":
150
+ if (!event.nodeId) return;
151
+ actions.setNodeResult(event.nodeId, {
152
+ status: "running",
153
+ durationMs: event.durationMs
154
+ });
155
+ return;
156
+ case "node_completed":
157
+ if (!event.nodeId) return;
158
+ actions.setNodeResult(event.nodeId, {
159
+ status: "success",
160
+ data: event.outputs,
161
+ durationMs: event.durationMs
162
+ });
163
+ return;
164
+ case "node_error":
165
+ if (!event.nodeId) return;
166
+ actions.setNodeResult(event.nodeId, {
167
+ status: "error",
168
+ error: event.error,
169
+ durationMs: event.durationMs
170
+ });
171
+ return;
172
+ case "run_completed":
173
+ case "run_failed":
174
+ actions.setIsRunning(false);
175
+ return;
176
+ default:
177
+ return;
178
+ }
179
+ }
180
+ function useWorkflowRunPresentation(events, status) {
181
+ const clearNodeResults = useWorkflowStore((state) => state.clearNodeResults);
182
+ const setIsRunning = useWorkflowStore((state) => state.setIsRunning);
183
+ const setNodeResult = useWorkflowStore((state) => state.setNodeResult);
184
+ useEffect(() => {
185
+ if (status === "idle") {
186
+ resetWorkflowRunPresentation({ clearNodeResults, setIsRunning, setNodeResult });
187
+ return;
188
+ }
189
+ clearNodeResults();
190
+ for (const event of events) {
191
+ applyWorkflowExecutionEventToStore({ clearNodeResults, setIsRunning, setNodeResult }, event);
192
+ }
193
+ if (status === "completed" || status === "failed" || status === "error") {
194
+ setIsRunning(false);
195
+ } else if (status === "streaming") {
196
+ setIsRunning(true);
197
+ }
198
+ }, [clearNodeResults, events, setIsRunning, setNodeResult, status]);
199
+ }
200
+
201
+ // src/hooks/use-workflow-execution.ts
202
+ function useWorkflowExecution(workflowId) {
203
+ const [activeRunId, setActiveRunId] = useState(null);
204
+ const [isLaunching, setIsLaunching] = useState(false);
205
+ const stream = useRunEvents(workflowId || null, activeRunId);
206
+ const clearNodeResults = useWorkflowStore((state) => state.clearNodeResults);
207
+ const setIsRunning = useWorkflowStore((state) => state.setIsRunning);
208
+ const setNodeResult = useWorkflowStore((state) => state.setNodeResult);
209
+ useWorkflowRunPresentation(stream.events, activeRunId ? stream.status : "idle");
210
+ useEffect(() => {
211
+ if (stream.status === "completed" || stream.status === "failed" || stream.status === "error") {
212
+ setIsLaunching(false);
213
+ }
214
+ }, [stream.status]);
215
+ const run = useCallback(async (inputVariables) => {
216
+ if (!workflowId) return;
217
+ setIsLaunching(true);
218
+ try {
219
+ const runRecord = await executeWorkflow(workflowId, inputVariables);
220
+ setActiveRunId(runRecord.id);
221
+ } finally {
222
+ setIsLaunching(false);
223
+ }
224
+ }, [workflowId]);
225
+ const stop = useCallback(() => {
226
+ setActiveRunId(null);
227
+ setIsLaunching(false);
228
+ resetWorkflowRunPresentation({ clearNodeResults, setIsRunning, setNodeResult });
229
+ }, [clearNodeResults, setIsRunning, setNodeResult]);
230
+ useEffect(() => {
231
+ setActiveRunId(null);
232
+ setIsLaunching(false);
233
+ resetWorkflowRunPresentation({ clearNodeResults, setIsRunning, setNodeResult });
234
+ }, [clearNodeResults, setIsRunning, setNodeResult, workflowId]);
235
+ return {
236
+ isRunning: isLaunching || stream.status === "streaming",
237
+ execute: run,
238
+ stop,
239
+ runId: activeRunId,
240
+ runStatus: activeRunId ? stream.status : "idle"
241
+ };
242
+ }
243
+ function getPublishableKey() {
244
+ return import.meta.env.VITE_WORKFLOW_BUILDER_PUBLISHABLE_KEY ?? "";
245
+ }
246
+ function useDatasourceLabels() {
247
+ const t = useTranslations("platform.datasources");
248
+ return useMemo(() => {
249
+ const keys = [
250
+ "title",
251
+ "subtitle",
252
+ "addDatasource",
253
+ "createTitle",
254
+ "emptyTitle",
255
+ "emptyDescription",
256
+ "stepSelectType",
257
+ "stepConfigure",
258
+ "categoryRelational",
259
+ "categoryNoSql",
260
+ "categoryWarehouse",
261
+ "categoryTimeSeries",
262
+ "categoryGraph",
263
+ "categoryKeyValue",
264
+ "categorySearch",
265
+ "fieldName",
266
+ "fieldNamePlaceholder",
267
+ "fieldHost",
268
+ "fieldHostPlaceholder",
269
+ "fieldPort",
270
+ "fieldDatabase",
271
+ "fieldDatabasePlaceholder",
272
+ "fieldUsername",
273
+ "fieldUsernamePlaceholder",
274
+ "fieldPassword",
275
+ "fieldPasswordPlaceholder",
276
+ "fieldSchema",
277
+ "fieldSchemaPlaceholder",
278
+ "fieldSsl",
279
+ "fieldReadOnly",
280
+ "fieldReadOnlyHelp",
281
+ "fieldConnectionString",
282
+ "fieldConnectionStringPlaceholder",
283
+ "fieldProjectId",
284
+ "fieldProjectIdPlaceholder",
285
+ "fieldDataset",
286
+ "fieldDatasetPlaceholder",
287
+ "fieldKeyFile",
288
+ "fieldKeyFilePlaceholder",
289
+ "fieldAccount",
290
+ "fieldAccountPlaceholder",
291
+ "fieldWarehouse",
292
+ "fieldWarehousePlaceholder",
293
+ "fieldRegion",
294
+ "fieldRegionPlaceholder",
295
+ "fieldBucket",
296
+ "fieldBucketPlaceholder",
297
+ "fieldToken",
298
+ "fieldTokenPlaceholder",
299
+ "fieldApiKey",
300
+ "fieldApiKeyPlaceholder",
301
+ "fieldEnvironment",
302
+ "fieldEnvironmentPlaceholder",
303
+ "fieldIndex",
304
+ "fieldIndexPlaceholder",
305
+ "fieldUrl",
306
+ "fieldUrlPlaceholder",
307
+ "testConnection",
308
+ "testing",
309
+ "connectionSuccess",
310
+ "connectionFailed",
311
+ "save",
312
+ "saving",
313
+ "cancel",
314
+ "back",
315
+ "enabled",
316
+ "disabled",
317
+ "dialect",
318
+ "created",
319
+ "deleted",
320
+ "deleteConfirm"
321
+ ];
322
+ const labels = {};
323
+ for (const key of keys) labels[key] = t(key);
324
+ return labels;
325
+ }, [t]);
326
+ }
327
+ function AgentsWorkspace({ workflowId, messages }) {
328
+ const navigate = useNavigate();
329
+ const locale = useLocale();
330
+ const tWorkflow = useTranslations("agents.workflow");
331
+ const tCommon = useTranslations("common");
332
+ const datasourceLabels = useDatasourceLabels();
333
+ const { error: notifyError, success: notifySuccess } = useNotifications();
334
+ const showSuccess = useCallback((title, message) => {
335
+ notifySuccess(title, message);
336
+ }, [notifySuccess]);
337
+ const showError = useCallback((title, message) => {
338
+ notifyError(title, message);
339
+ if (message) {
340
+ console.error("[AgentsWorkspace]", message);
341
+ }
342
+ }, []);
343
+ const [isLoading, setIsLoading] = useState(true);
344
+ const [loadError, setLoadError] = useState(null);
345
+ const [isLoadingWorkflows, setIsLoadingWorkflows] = useState(true);
346
+ const [isPublishing, setIsPublishing] = useState(false);
347
+ const [workflows, setWorkflows] = useState([]);
348
+ const [workflow, setWorkflow] = useState(null);
349
+ const [agents, setAgents] = useState([]);
350
+ const [models, setModels] = useState([]);
351
+ const [tools, setTools] = useState([]);
352
+ const [agentToolDefs, setAgentToolDefs] = useState([]);
353
+ const [rules, setRules] = useState([]);
354
+ const [datasources, setDatasources] = useState([]);
355
+ const [modelConnections, setModelConnections] = useState([]);
356
+ const [showDatasourceModal, setShowDatasourceModal] = useState(false);
357
+ const openPipelineSettingsModal = useModalStore((s) => s.openPipelineSettingsModal);
358
+ const [showRunInputDialog, setShowRunInputDialog] = useState(false);
359
+ const [showPreviewPanel, setShowPreviewPanel] = useState(false);
360
+ const [isCreatingAgent, setIsCreatingAgent] = useState(false);
361
+ const openSubworkflowModal = useSubworkflowStore((s) => s.openModal);
362
+ const closeSubworkflowModal = useSubworkflowStore((s) => s.closeModal);
363
+ const [deleteTarget, setDeleteTarget] = useState(null);
364
+ const [saveStatus, setSaveStatus] = useState("idle");
365
+ const latestGraphRef = useRef(null);
366
+ const saveTimerRef = useRef(null);
367
+ const skipInitialAutoSaveRef = useRef(true);
368
+ const showRunPanel = useWorkflowStore((state) => state.showRunPanel);
369
+ const toggleRunPanel = useWorkflowStore((state) => state.toggleRunPanel);
370
+ const workflowNodes = useWorkflowStore((state) => state.nodes);
371
+ const { execute: executeWorkflowRun, stop: stopWorkflowRun, isRunning } = useWorkflowExecution(workflowId);
372
+ const loadWorkspaceData = useCallback(async () => {
373
+ setIsLoading(true);
374
+ setLoadError(null);
375
+ try {
376
+ const [workflowData, agentList, modelList, agentToolDefList, ruleList, datasourceList, connectionList] = await Promise.all([
377
+ getWorkflowById(workflowId),
378
+ getAgentConfigsWithPrompts(),
379
+ getAgentModels(),
380
+ getAgentToolDefinitions().catch(() => []),
381
+ getAgentRules(),
382
+ getDatasources().catch(() => []),
383
+ listModelProviderConnections().catch(() => [])
384
+ ]);
385
+ const toolResults = await Promise.all(
386
+ agentList.map((agent) => getAgentTools(agent.agentId).catch(() => []))
387
+ );
388
+ const toolList = toolResults.flat();
389
+ setWorkflow(workflowData);
390
+ latestGraphRef.current = workflowData.graph;
391
+ setAgents(agentList);
392
+ setModels(modelList);
393
+ setTools(toolList);
394
+ setAgentToolDefs(agentToolDefList);
395
+ setRules(ruleList);
396
+ setDatasources(datasourceList);
397
+ setModelConnections(connectionList);
398
+ } catch (error) {
399
+ const message = error instanceof Error ? error.message : tCommon("loadWorkspaceFailed");
400
+ setWorkflow(null);
401
+ setAgents([]);
402
+ setModels([]);
403
+ setTools([]);
404
+ setAgentToolDefs([]);
405
+ setRules([]);
406
+ setDatasources([]);
407
+ setModelConnections([]);
408
+ setLoadError(message);
409
+ notifyError(tCommon("serverError"), message);
410
+ } finally {
411
+ setIsLoading(false);
412
+ }
413
+ }, [workflowId]);
414
+ const loadWorkflowList = useCallback(async () => {
415
+ setIsLoadingWorkflows(true);
416
+ try {
417
+ const list = await getWorkflows();
418
+ setWorkflows(list);
419
+ } catch {
420
+ setWorkflows([]);
421
+ } finally {
422
+ setIsLoadingWorkflows(false);
423
+ }
424
+ }, []);
425
+ useEffect(() => {
426
+ void loadWorkspaceData();
427
+ }, [loadWorkspaceData]);
428
+ useEffect(() => {
429
+ void loadWorkflowList();
430
+ }, [loadWorkflowList]);
431
+ useEffect(() => {
432
+ skipInitialAutoSaveRef.current = true;
433
+ }, [workflowId]);
434
+ useEffect(() => {
435
+ return () => {
436
+ if (saveTimerRef.current) {
437
+ clearTimeout(saveTimerRef.current);
438
+ }
439
+ };
440
+ }, []);
441
+ const handleAutoSaveGraph = useCallback((graph) => {
442
+ latestGraphRef.current = graph;
443
+ if (isLoading || skipInitialAutoSaveRef.current) {
444
+ skipInitialAutoSaveRef.current = false;
445
+ return;
446
+ }
447
+ if (saveTimerRef.current) {
448
+ clearTimeout(saveTimerRef.current);
449
+ }
450
+ setSaveStatus("saving");
451
+ saveTimerRef.current = setTimeout(() => {
452
+ void saveWorkflowDraft(workflowId, graph).then((updatedWorkflow) => {
453
+ setWorkflow(updatedWorkflow);
454
+ setWorkflows((current) => current.map((item) => item.id === updatedWorkflow.id ? updatedWorkflow : item));
455
+ setSaveStatus("saved");
456
+ setTimeout(() => setSaveStatus("idle"), 900);
457
+ }).catch(() => {
458
+ setSaveStatus("idle");
459
+ });
460
+ }, 800);
461
+ }, [workflowId]);
462
+ const handlePublish = useCallback(async () => {
463
+ if (!latestGraphRef.current) return;
464
+ const validation = validateWorkflowGraph(latestGraphRef.current, { locale });
465
+ if (!validation.valid) {
466
+ showError(tWorkflow("validationError"), validation.errors[0] ?? tWorkflow("validation"));
467
+ return;
468
+ }
469
+ setIsPublishing(true);
470
+ try {
471
+ const published = await publishWorkflow(workflowId);
472
+ setWorkflow(published);
473
+ setWorkflows((current) => current.map((item) => item.id === published.id ? published : item));
474
+ } finally {
475
+ setIsPublishing(false);
476
+ }
477
+ }, [locale, showError, tWorkflow, workflowId]);
478
+ const handleSelectWorkflow = useCallback((selected) => {
479
+ if (selected.id === workflowId) return;
480
+ navigate(`/workflows/edit?workflowId=${encodeURIComponent(selected.id)}`);
481
+ }, [navigate, workflowId]);
482
+ const handleCreateWorkflow = useCallback(async () => {
483
+ const created = await createWorkflow({
484
+ name: tWorkflow("defaultWorkflowName")
485
+ });
486
+ navigate(`/workflows/edit?workflowId=${encodeURIComponent(created.id)}`);
487
+ }, [navigate, tWorkflow]);
488
+ const handleDeleteWorkflow = useCallback((id, name) => {
489
+ setDeleteTarget({ id, name });
490
+ }, []);
491
+ const confirmDelete = useCallback(async () => {
492
+ if (!deleteTarget) return;
493
+ await deleteWorkflow(deleteTarget.id);
494
+ const remaining = workflows.filter((item) => item.id !== deleteTarget.id);
495
+ if (remaining.length > 0) {
496
+ navigate(`/workflows/edit?workflowId=${encodeURIComponent(remaining[0].id)}`);
497
+ } else {
498
+ navigate("/workflows");
499
+ }
500
+ setDeleteTarget(null);
501
+ }, [deleteTarget, workflows, navigate]);
502
+ const handleOpenRunDialog = useCallback(() => {
503
+ const startNode = workflowNodes.find((node) => node.type === "start");
504
+ const hasEndNode = workflowNodes.some((node) => node.type === "end");
505
+ const hasValidStartConfig = Boolean(
506
+ startNode && typeof startNode.data === "object" && startNode.data !== null && "config" in startNode.data && startNode.data.config && startNode.data.config.type === "start"
507
+ );
508
+ if (!hasValidStartConfig) {
509
+ showError(tWorkflow("validationError"), tWorkflow("startNodeRequired"));
510
+ return;
511
+ }
512
+ if (!hasEndNode) {
513
+ showError(tWorkflow("validationError"), tWorkflow("endNodeRequired"));
514
+ return;
515
+ }
516
+ setShowRunInputDialog(true);
517
+ }, [workflowNodes, showError, tWorkflow]);
518
+ const handleCreateAgent = useCallback(() => {
519
+ setIsCreatingAgent(true);
520
+ }, []);
521
+ const handleCancelCreateAgent = useCallback(() => {
522
+ setIsCreatingAgent(false);
523
+ }, []);
524
+ const handleAgentSaved = useCallback(async () => {
525
+ const nextAgents = await getAgentConfigsWithPrompts();
526
+ setAgents(nextAgents);
527
+ setIsCreatingAgent(false);
528
+ }, []);
529
+ const handleToggleTool = useCallback(async (tool) => {
530
+ try {
531
+ const updated = await updateAgentTool(tool.toolId, { enabled: !tool.enabled });
532
+ setTools((current) => current.map((item) => item.toolId === tool.toolId ? updated : item));
533
+ showSuccess(
534
+ tWorkflow("toolsSection"),
535
+ updated.enabled ? tWorkflow("published") : tWorkflow("draftBadge")
536
+ );
537
+ } catch (error) {
538
+ showError(
539
+ tWorkflow("validationError"),
540
+ error instanceof Error ? error.message : tWorkflow("publishError")
541
+ );
542
+ }
543
+ }, [showError, showSuccess, tWorkflow]);
544
+ const handleToggleRule = useCallback(async (rule) => {
545
+ try {
546
+ const updated = await updateAgentRule(rule.ruleId, { ...rule, enabled: !rule.enabled });
547
+ setRules((current) => current.map((item) => item.ruleId === rule.ruleId ? updated : item));
548
+ showSuccess(
549
+ tWorkflow("rulesSection"),
550
+ updated.enabled ? tWorkflow("published") : tWorkflow("draftBadge")
551
+ );
552
+ } catch (error) {
553
+ showError(
554
+ tWorkflow("validationError"),
555
+ error instanceof Error ? error.message : tWorkflow("publishError")
556
+ );
557
+ }
558
+ }, [showError, showSuccess, tWorkflow]);
559
+ const handleCreateTool = useCallback(() => {
560
+ openSubworkflowModal({ toolId: "", name: "", category: "external", enabled: true });
561
+ }, [openSubworkflowModal]);
562
+ const handleCreateRule = useCallback(() => {
563
+ }, []);
564
+ const handleCreateAgentTool = useCallback(() => {
565
+ }, []);
566
+ const handleConvertToSubworkflow = useCallback((workflow2) => {
567
+ openSubworkflowModal({
568
+ toolId: "",
569
+ name: workflow2.name,
570
+ description: workflow2.description ?? "",
571
+ category: "external",
572
+ enabled: true,
573
+ config: { type: "workflow", graph: workflow2.graph }
574
+ });
575
+ }, [openSubworkflowModal]);
576
+ const handleEditTool = useCallback((tool) => {
577
+ openSubworkflowModal(tool);
578
+ }, [openSubworkflowModal]);
579
+ const handleCreateDatasource = useCallback(() => {
580
+ setShowDatasourceModal(true);
581
+ }, []);
582
+ const handleSaveDatasource = useCallback(async (data) => {
583
+ try {
584
+ const created = await createDatasource(data);
585
+ setDatasources((current) => [...current, created]);
586
+ showSuccess(tWorkflow("dataSourcesSection"), tCommon("created") ?? "Created");
587
+ } catch (error) {
588
+ showError(
589
+ tWorkflow("dataSourcesSection"),
590
+ error instanceof Error ? error.message : tCommon("createDatasourceFailed")
591
+ );
592
+ }
593
+ }, [showSuccess, showError, tWorkflow, tCommon]);
594
+ const datasourceEntities = useMemo(
595
+ () => datasources.map((ds) => ({
596
+ id: ds.id,
597
+ label: ds.name ?? ds.id,
598
+ description: ds.dialect ?? "",
599
+ defaultLimit: 100,
600
+ fields: []
601
+ })),
602
+ [datasources]
603
+ );
604
+ const datasourceDefinitions = useMemo(
605
+ () => datasources.map((ds) => ({
606
+ id: ds.id,
607
+ name: ds.name ?? ds.id,
608
+ dialect: ds.dialect ?? "postgres"
609
+ })),
610
+ [datasources]
611
+ );
612
+ const paletteModelProviders = useMemo(() => {
613
+ const toPaletteKey = (slug) => {
614
+ switch (slug) {
615
+ case "anthropic_api":
616
+ return "anthropic";
617
+ case "openai_api":
618
+ return "openai";
619
+ case "aws_bedrock":
620
+ return "amazon";
621
+ case "google_vertex":
622
+ return "google";
623
+ default:
624
+ return slug ?? "custom";
625
+ }
626
+ };
627
+ return modelConnections.map((connection) => ({
628
+ id: connection.id,
629
+ name: connection.name,
630
+ provider: toPaletteKey(connection.providerSlug),
631
+ modelCount: connection.modelFilter?.length ?? 1,
632
+ configured: connection.enabled
633
+ }));
634
+ }, [modelConnections]);
635
+ if (isLoading) {
636
+ return /* @__PURE__ */ jsx("div", { className: "flex h-[calc(100vh-120px)] flex-col", children: /* @__PURE__ */ jsxs("div", { className: "liquid-surface flex h-full flex-col overflow-hidden rounded-2xl", children: [
637
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-shrink-0 items-center justify-between px-5 py-3", children: [
638
+ /* @__PURE__ */ jsx("div", { className: "shimmer h-6 w-40 rounded-lg" }),
639
+ /* @__PURE__ */ jsx("div", { className: "shimmer h-8 w-24 rounded-lg" })
640
+ ] }),
641
+ /* @__PURE__ */ jsx("div", { className: "liquid-divider border-t" }),
642
+ /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 overflow-hidden", children: [
643
+ /* @__PURE__ */ jsxs("div", { className: "w-56 border-r border-white/20 p-4 dark:border-white/10", children: [
644
+ /* @__PURE__ */ jsx("div", { className: "shimmer mb-3 h-5 w-24 rounded" }),
645
+ /* @__PURE__ */ jsx("div", { className: "space-y-2", children: [1, 2, 3].map((index) => /* @__PURE__ */ jsx("div", { className: "shimmer h-10 w-full rounded-lg" }, index)) })
646
+ ] }),
647
+ /* @__PURE__ */ jsx("div", { className: "flex flex-1 items-center justify-center", children: /* @__PURE__ */ jsx("div", { className: "shimmer h-8 w-48 rounded-lg" }) })
648
+ ] })
649
+ ] }) });
650
+ }
651
+ if (!workflow) {
652
+ return /* @__PURE__ */ jsx("div", { className: "flex h-[calc(100vh-120px)] items-center justify-center", children: loadError ? /* @__PURE__ */ jsx(
653
+ PageErrorState,
654
+ {
655
+ statusCode: 500,
656
+ title: tCommon("serverError"),
657
+ message: loadError,
658
+ onRetry: () => {
659
+ void loadWorkspaceData();
660
+ },
661
+ retryLabel: tCommon("retry")
662
+ }
663
+ ) : /* @__PURE__ */ jsx(
664
+ PageEmptyState,
665
+ {
666
+ title: tWorkflow("emptyTitle"),
667
+ message: tWorkflow("emptyDescription"),
668
+ iconName: "cpu-chip"
669
+ }
670
+ ) });
671
+ }
672
+ return /* @__PURE__ */ jsx(WorkflowBuilderProvider, { publishableKey: getPublishableKey(), children: /* @__PURE__ */ jsxs("div", { className: "flex h-[calc(100vh-120px)] flex-col", "data-testid": "agents-workspace", children: [
673
+ /* @__PURE__ */ jsxs("div", { className: "liquid-surface flex h-full flex-col overflow-hidden rounded-2xl", children: [
674
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-shrink-0 items-center justify-between px-5 py-3", children: [
675
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
676
+ /* @__PURE__ */ jsx(
677
+ "button",
678
+ {
679
+ type: "button",
680
+ onClick: () => openPipelineSettingsModal(
681
+ workflow.name,
682
+ workflow.description ?? "",
683
+ {
684
+ slug: workflow.slug ?? null,
685
+ isDraft: workflow.isDraft,
686
+ isActive: workflow.isActive
687
+ }
688
+ ),
689
+ className: "rounded-lg px-2.5 py-1 text-sm font-semibold text-gray-900 transition-colors hover:bg-gray-100/80 dark:text-white dark:hover:bg-white/10",
690
+ title: tWorkflow("editName"),
691
+ children: workflow.name || tWorkflow("title")
692
+ }
693
+ ),
694
+ /* @__PURE__ */ jsx(CopyableId, { id: workflowId, className: "text-[10px]" }),
695
+ workflow.isDraft ? /* @__PURE__ */ jsx("span", { className: "inline-flex items-center rounded-full bg-amber-100 px-2.5 py-0.5 text-[10px] font-semibold text-amber-800 dark:bg-amber-900/30 dark:text-amber-300", children: tWorkflow("draftBadge") }) : /* @__PURE__ */ jsx("span", { className: "inline-flex items-center rounded-full bg-green-100 px-2.5 py-0.5 text-[10px] font-semibold text-green-800 dark:bg-green-900/30 dark:text-green-300", children: tWorkflow("published") }),
696
+ /* @__PURE__ */ jsx(SaveStatusBadge, { status: saveStatus })
697
+ ] }),
698
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
699
+ /* @__PURE__ */ jsx(
700
+ Button,
701
+ {
702
+ size: "xs",
703
+ plain: true,
704
+ onClick: () => setShowPreviewPanel((previous) => !previous),
705
+ title: tWorkflow("previewPanel.title"),
706
+ children: /* @__PURE__ */ jsx(ChartBarIcon, { className: "h-3.5 w-3.5", "data-slot": "icon" })
707
+ }
708
+ ),
709
+ isRunning ? /* @__PURE__ */ jsxs(Button, { size: "xs", outline: true, onClick: stopWorkflowRun, children: [
710
+ /* @__PURE__ */ jsx(StopIcon, { className: "h-3.5 w-3.5", "data-slot": "icon" }),
711
+ tWorkflow("runPanel.stop")
712
+ ] }) : /* @__PURE__ */ jsxs(
713
+ Button,
714
+ {
715
+ size: "xs",
716
+ outline: true,
717
+ onClick: handleOpenRunDialog,
718
+ disabled: !workflow.publishedGraph && !latestGraphRef.current,
719
+ title: !workflow.publishedGraph && !latestGraphRef.current ? tWorkflow("noPublishedWorkflow") : void 0,
720
+ children: [
721
+ /* @__PURE__ */ jsx(PlayIcon, { className: "h-3.5 w-3.5", "data-slot": "icon" }),
722
+ tWorkflow("runPanel.run")
723
+ ]
724
+ }
725
+ ),
726
+ /* @__PURE__ */ jsxs(Button, { gradient: true, size: "xs", onClick: () => {
727
+ void handlePublish();
728
+ }, disabled: isPublishing, children: [
729
+ /* @__PURE__ */ jsx(DocumentCheckIcon, { className: "h-3.5 w-3.5", "data-slot": "icon" }),
730
+ tWorkflow("publish")
731
+ ] })
732
+ ] })
733
+ ] }),
734
+ /* @__PURE__ */ jsx("div", { className: "liquid-divider border-t" }),
735
+ /* @__PURE__ */ jsx("div", { className: "px-4 pt-3", children: /* @__PURE__ */ jsx(
736
+ WorkflowListBar,
737
+ {
738
+ workflows,
739
+ activeWorkflowId: workflowId,
740
+ isLoading: isLoadingWorkflows,
741
+ onSelect: handleSelectWorkflow,
742
+ onCreate: () => {
743
+ void handleCreateWorkflow();
744
+ },
745
+ onDelete: handleDeleteWorkflow,
746
+ onConvertToSubworkflow: handleConvertToSubworkflow
747
+ }
748
+ ) }),
749
+ /* @__PURE__ */ jsx("div", { className: "liquid-divider border-t" }),
750
+ /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 overflow-hidden", children: [
751
+ /* @__PURE__ */ jsx(
752
+ NodePalette,
753
+ {
754
+ agents,
755
+ tools,
756
+ agentTools: agentToolDefs,
757
+ rules,
758
+ entities: datasourceEntities,
759
+ modelProviders: paletteModelProviders,
760
+ onCreateAgent: handleCreateAgent,
761
+ onCreateTool: () => {
762
+ void handleCreateTool();
763
+ },
764
+ onCreateAgentTool: () => {
765
+ void handleCreateAgentTool();
766
+ },
767
+ onCreateRule: () => {
768
+ void handleCreateRule();
769
+ },
770
+ onCreateDatasource: handleCreateDatasource
771
+ }
772
+ ),
773
+ /* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsx(
774
+ AutoSaveWorkspace,
775
+ {
776
+ workflowId,
777
+ className: "h-full w-full",
778
+ locale,
779
+ ...messages ? { messages } : {},
780
+ initialGraph: workflow.graph,
781
+ agents,
782
+ models,
783
+ tools,
784
+ agentTools: agentToolDefs,
785
+ rules,
786
+ datasources: datasourceDefinitions,
787
+ onLoadTables: getDatasourceTables,
788
+ onLoadSchema: getDatasourceSchema,
789
+ onEditTool: handleEditTool,
790
+ onToggleTool: handleToggleTool,
791
+ onToggleRule: handleToggleRule,
792
+ onAgentSaved: () => {
793
+ void handleAgentSaved();
794
+ },
795
+ isCreatingAgent,
796
+ onCancelCreateAgent: handleCancelCreateAgent,
797
+ onAutoSaveGraph: handleAutoSaveGraph,
798
+ onGraphSnapshot: (graph) => {
799
+ latestGraphRef.current = graph;
800
+ },
801
+ renderAgentModal: (props) => /* @__PURE__ */ jsx(
802
+ AgentModal,
803
+ {
804
+ ...props,
805
+ onSaved: () => {
806
+ props.onSaved();
807
+ void handleAgentSaved();
808
+ },
809
+ onPersist: async (payload) => {
810
+ const body = {
811
+ name: payload.name,
812
+ displayName: payload.displayName,
813
+ description: payload.description,
814
+ avatar: payload.avatar,
815
+ modelId: payload.modelId,
816
+ modelProviderId: payload.connectionId,
817
+ framework: payload.framework,
818
+ systemPrompt: payload.systemPrompt,
819
+ instruction: payload.systemPrompt,
820
+ temperature: payload.temperature,
821
+ maxOutputTokens: payload.maxOutputTokens,
822
+ maxTokens: payload.maxOutputTokens,
823
+ topP: payload.topP,
824
+ topK: payload.topK,
825
+ elo: payload.elo,
826
+ status: payload.status,
827
+ tags: payload.tags,
828
+ agentToolIds: payload.enabledToolIds
829
+ };
830
+ if (payload.agentId) {
831
+ await updateAgentConfig(payload.agentId, body);
832
+ } else {
833
+ await createAgentConfig(body);
834
+ }
835
+ }
836
+ }
837
+ )
838
+ }
839
+ ) })
840
+ ] })
841
+ ] }),
842
+ /* @__PURE__ */ jsx(
843
+ PipelineSettingsModal,
844
+ {
845
+ onSave: async (changes) => {
846
+ const metadata = {
847
+ name: changes.name,
848
+ description: changes.description
849
+ };
850
+ if (changes.slug !== void 0) metadata.slug = changes.slug;
851
+ if (changes.isDraft !== void 0) metadata.isDraft = changes.isDraft;
852
+ if (changes.isActive !== void 0) metadata.isActive = changes.isActive;
853
+ const updated = latestGraphRef.current ? await saveWorkflowDraft(workflowId, latestGraphRef.current, metadata) : await updateWorkflowSettings(workflowId, metadata);
854
+ setWorkflow(updated);
855
+ setWorkflows((current) => current.map((item) => item.id === updated.id ? updated : item));
856
+ }
857
+ }
858
+ ),
859
+ /* @__PURE__ */ jsx(
860
+ SubworkflowModal,
861
+ {
862
+ onMaximize: (subworkflowId) => {
863
+ closeSubworkflowModal();
864
+ navigate(`/workflows/edit?workflowId=${encodeURIComponent(subworkflowId)}`);
865
+ },
866
+ onSaved: async (saved) => {
867
+ const isNew = !saved.toolId;
868
+ if (isNew) {
869
+ const created = await createWorkflow({
870
+ name: saved.name,
871
+ description: saved.description
872
+ });
873
+ closeSubworkflowModal();
874
+ navigate(`/workflows/edit?workflowId=${encodeURIComponent(created.id)}`);
875
+ } else {
876
+ const updated = await updateAgentTool(saved.toolId, saved);
877
+ setTools((current) => current.map((item) => item.toolId === saved.toolId ? updated : item));
878
+ closeSubworkflowModal();
879
+ }
880
+ }
881
+ }
882
+ ),
883
+ /* @__PURE__ */ jsx(
884
+ RunPanel,
885
+ {
886
+ open: showRunPanel,
887
+ onClose: toggleRunPanel,
888
+ onRun: handleOpenRunDialog,
889
+ onStop: stopWorkflowRun
890
+ }
891
+ ),
892
+ /* @__PURE__ */ jsx(
893
+ RunInputDialog,
894
+ {
895
+ open: showRunInputDialog,
896
+ onClose: () => setShowRunInputDialog(false),
897
+ onRun: (inputVariables) => {
898
+ void executeWorkflowRun(inputVariables);
899
+ if (!showRunPanel) {
900
+ toggleRunPanel();
901
+ }
902
+ }
903
+ }
904
+ ),
905
+ /* @__PURE__ */ jsx(
906
+ PreviewPanel,
907
+ {
908
+ open: showPreviewPanel,
909
+ onClose: () => setShowPreviewPanel(false),
910
+ workflowId,
911
+ loadRuns: getWorkflowRuns
912
+ }
913
+ ),
914
+ /* @__PURE__ */ jsx(
915
+ DatasourceFormModal,
916
+ {
917
+ open: showDatasourceModal,
918
+ onClose: () => setShowDatasourceModal(false),
919
+ labels: datasourceLabels,
920
+ onSave: (data) => {
921
+ void handleSaveDatasource(data);
922
+ }
923
+ }
924
+ ),
925
+ /* @__PURE__ */ jsx(
926
+ DynamicIslandConfirm,
927
+ {
928
+ open: deleteTarget !== null,
929
+ onClose: () => setDeleteTarget(null),
930
+ onConfirm: () => {
931
+ void confirmDelete();
932
+ },
933
+ title: `${tWorkflow("deleteWorkflowConfirm")} ${deleteTarget?.name ?? ""}?`
934
+ }
935
+ )
936
+ ] }) });
937
+ }
938
+
939
+ export { AgentsWorkspace };
940
+ //# sourceMappingURL=chunk-CCRBT7TA.mjs.map
941
+ //# sourceMappingURL=chunk-CCRBT7TA.mjs.map