@datatechsolutions/ui 3.6.0 → 3.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/astrlabe/index.js +106 -106
- package/dist/astrlabe/index.mjs +2 -2
- package/dist/astrlabe/workflow-canvas.js +2 -2
- package/dist/astrlabe/workflow-canvas.mjs +1 -1
- package/dist/{chunk-I63NFWIA.mjs → chunk-3Z66NXEB.mjs} +3 -3
- package/dist/{chunk-I63NFWIA.mjs.map → chunk-3Z66NXEB.mjs.map} +1 -1
- package/dist/{chunk-XTXLRQ3H.mjs → chunk-4JDJRGAB.mjs} +27 -28
- package/dist/chunk-4JDJRGAB.mjs.map +1 -0
- package/dist/{chunk-WEZ722BS.mjs → chunk-5ZAZ2C7A.mjs} +4 -4
- package/dist/{chunk-WEZ722BS.mjs.map → chunk-5ZAZ2C7A.mjs.map} +1 -1
- package/dist/{chunk-UWSMHKOF.js → chunk-6ZMTJSQF.js} +78 -78
- package/dist/chunk-6ZMTJSQF.js.map +1 -0
- package/dist/{chunk-VPOIX2DY.js → chunk-DRORQGN2.js} +27 -27
- package/dist/{chunk-VPOIX2DY.js.map → chunk-DRORQGN2.js.map} +1 -1
- package/dist/{chunk-QTA5I6FC.mjs → chunk-KDFBN2L2.mjs} +34 -31
- package/dist/chunk-KDFBN2L2.mjs.map +1 -0
- package/dist/{chunk-QHP2MR2F.js → chunk-KEWRLEYV.js} +4 -4
- package/dist/{chunk-QHP2MR2F.js.map → chunk-KEWRLEYV.js.map} +1 -1
- package/dist/{chunk-DYWSG42B.mjs → chunk-MQNXKBFP.mjs} +8 -8
- package/dist/chunk-MQNXKBFP.mjs.map +1 -0
- package/dist/{chunk-3WXMBAGN.js → chunk-MUOTTGCX.js} +27 -28
- package/dist/chunk-MUOTTGCX.js.map +1 -0
- package/dist/{chunk-S7AV6XEY.js → chunk-SQZGQOKU.js} +32 -29
- package/dist/chunk-SQZGQOKU.js.map +1 -0
- package/dist/platform/agents-workspace.js +4 -4
- package/dist/platform/agents-workspace.mjs +3 -3
- package/dist/platform/index.js +15 -15
- package/dist/platform/index.mjs +6 -6
- package/dist/platform/pages/index.js +325 -320
- package/dist/platform/pages/index.js.map +1 -1
- package/dist/platform/pages/index.mjs +320 -315
- package/dist/platform/pages/index.mjs.map +1 -1
- package/dist/platform/workflow-canvas-shell.js +3 -3
- package/dist/platform/workflow-canvas-shell.mjs +2 -2
- package/package.json +1 -1
- package/dist/chunk-3WXMBAGN.js.map +0 -1
- package/dist/chunk-DYWSG42B.mjs.map +0 -1
- package/dist/chunk-QTA5I6FC.mjs.map +0 -1
- package/dist/chunk-S7AV6XEY.js.map +0 -1
- package/dist/chunk-UWSMHKOF.js.map +0 -1
- package/dist/chunk-XTXLRQ3H.mjs.map +0 -1
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var chunkLVK7VXW7_js = require('./chunk-LVK7VXW7.js');
|
|
5
|
-
var
|
|
5
|
+
var chunk6ZMTJSQF_js = require('./chunk-6ZMTJSQF.js');
|
|
6
6
|
var chunkDJDZIRM6_js = require('./chunk-DJDZIRM6.js');
|
|
7
|
-
var
|
|
7
|
+
var chunkSQZGQOKU_js = require('./chunk-SQZGQOKU.js');
|
|
8
8
|
var chunkGCYYGSHU_js = require('./chunk-GCYYGSHU.js');
|
|
9
9
|
var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
|
|
10
10
|
var chunkSY4MUT5V_js = require('./chunk-SY4MUT5V.js');
|
|
@@ -180,9 +180,9 @@ function applyWorkflowExecutionEventToStore(actions, event) {
|
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
function useWorkflowRunPresentation(events, status) {
|
|
183
|
-
const clearNodeResults =
|
|
184
|
-
const setIsRunning =
|
|
185
|
-
const setNodeResult =
|
|
183
|
+
const clearNodeResults = chunkSQZGQOKU_js.useWorkflowStore((state) => state.clearNodeResults);
|
|
184
|
+
const setIsRunning = chunkSQZGQOKU_js.useWorkflowStore((state) => state.setIsRunning);
|
|
185
|
+
const setNodeResult = chunkSQZGQOKU_js.useWorkflowStore((state) => state.setNodeResult);
|
|
186
186
|
react.useEffect(() => {
|
|
187
187
|
if (status === "idle") {
|
|
188
188
|
resetWorkflowRunPresentation({ clearNodeResults, setIsRunning, setNodeResult });
|
|
@@ -205,9 +205,9 @@ function useWorkflowExecution(workflowId) {
|
|
|
205
205
|
const [activeRunId, setActiveRunId] = react.useState(null);
|
|
206
206
|
const [isLaunching, setIsLaunching] = react.useState(false);
|
|
207
207
|
const stream = useRunEvents(workflowId || null, activeRunId);
|
|
208
|
-
const clearNodeResults =
|
|
209
|
-
const setIsRunning =
|
|
210
|
-
const setNodeResult =
|
|
208
|
+
const clearNodeResults = chunkSQZGQOKU_js.useWorkflowStore((state) => state.clearNodeResults);
|
|
209
|
+
const setIsRunning = chunkSQZGQOKU_js.useWorkflowStore((state) => state.setIsRunning);
|
|
210
|
+
const setNodeResult = chunkSQZGQOKU_js.useWorkflowStore((state) => state.setNodeResult);
|
|
211
211
|
useWorkflowRunPresentation(stream.events, activeRunId ? stream.status : "idle");
|
|
212
212
|
react.useEffect(() => {
|
|
213
213
|
if (stream.status === "completed" || stream.status === "failed" || stream.status === "error") {
|
|
@@ -356,20 +356,20 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
356
356
|
const [datasources, setDatasources] = react.useState([]);
|
|
357
357
|
const [modelConnections, setModelConnections] = react.useState([]);
|
|
358
358
|
const [showDatasourceModal, setShowDatasourceModal] = react.useState(false);
|
|
359
|
-
const openPipelineSettingsModal =
|
|
359
|
+
const openPipelineSettingsModal = chunkSQZGQOKU_js.useModalStore((s) => s.openPipelineSettingsModal);
|
|
360
360
|
const [showRunInputDialog, setShowRunInputDialog] = react.useState(false);
|
|
361
361
|
const [showPreviewPanel, setShowPreviewPanel] = react.useState(false);
|
|
362
362
|
const [isCreatingAgent, setIsCreatingAgent] = react.useState(false);
|
|
363
|
-
const openSubworkflowModal =
|
|
364
|
-
const closeSubworkflowModal =
|
|
363
|
+
const openSubworkflowModal = chunk6ZMTJSQF_js.useSubworkflowStore((s) => s.openModal);
|
|
364
|
+
const closeSubworkflowModal = chunk6ZMTJSQF_js.useSubworkflowStore((s) => s.closeModal);
|
|
365
365
|
const [deleteTarget, setDeleteTarget] = react.useState(null);
|
|
366
366
|
const [saveStatus, setSaveStatus] = react.useState("idle");
|
|
367
367
|
const latestGraphRef = react.useRef(null);
|
|
368
368
|
const saveTimerRef = react.useRef(null);
|
|
369
369
|
const skipInitialAutoSaveRef = react.useRef(true);
|
|
370
|
-
const showRunPanel =
|
|
371
|
-
const toggleRunPanel =
|
|
372
|
-
const workflowNodes =
|
|
370
|
+
const showRunPanel = chunkSQZGQOKU_js.useWorkflowStore((state) => state.showRunPanel);
|
|
371
|
+
const toggleRunPanel = chunkSQZGQOKU_js.useWorkflowStore((state) => state.toggleRunPanel);
|
|
372
|
+
const workflowNodes = chunkSQZGQOKU_js.useWorkflowStore((state) => state.nodes);
|
|
373
373
|
const { execute: executeWorkflowRun, stop: stopWorkflowRun, isRunning } = useWorkflowExecution(workflowId);
|
|
374
374
|
const loadWorkspaceData = react.useCallback(async () => {
|
|
375
375
|
setIsLoading(true);
|
|
@@ -671,7 +671,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
671
671
|
}
|
|
672
672
|
) });
|
|
673
673
|
}
|
|
674
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
674
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkSQZGQOKU_js.WorkflowBuilderProvider, { publishableKey: getPublishableKey(), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-[calc(100vh-120px)] flex-col", "data-testid": "agents-workspace", children: [
|
|
675
675
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "liquid-surface flex h-full flex-col overflow-hidden rounded-2xl", children: [
|
|
676
676
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-shrink-0 items-center justify-between px-5 py-3", children: [
|
|
677
677
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
@@ -695,7 +695,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
695
695
|
),
|
|
696
696
|
/* @__PURE__ */ jsxRuntime.jsx(chunkGCYYGSHU_js.CopyableId, { id: workflowId, className: "text-[10px]" }),
|
|
697
697
|
workflow.isDraft ? /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.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") }),
|
|
698
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
698
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk6ZMTJSQF_js.SaveStatusBadge, { status: saveStatus })
|
|
699
699
|
] }),
|
|
700
700
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
701
701
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -735,7 +735,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
735
735
|
] }),
|
|
736
736
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "liquid-divider border-t" }),
|
|
737
737
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 pt-3", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
738
|
-
|
|
738
|
+
chunk6ZMTJSQF_js.WorkflowListBar,
|
|
739
739
|
{
|
|
740
740
|
workflows,
|
|
741
741
|
activeWorkflowId: workflowId,
|
|
@@ -751,7 +751,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
751
751
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "liquid-divider border-t" }),
|
|
752
752
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1 overflow-hidden", children: [
|
|
753
753
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
754
|
-
|
|
754
|
+
chunk6ZMTJSQF_js.NodePalette,
|
|
755
755
|
{
|
|
756
756
|
agents,
|
|
757
757
|
tools,
|
|
@@ -773,7 +773,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
773
773
|
}
|
|
774
774
|
),
|
|
775
775
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
776
|
-
|
|
776
|
+
chunk6ZMTJSQF_js.AutoSaveWorkspace,
|
|
777
777
|
{
|
|
778
778
|
workflowId,
|
|
779
779
|
className: "h-full w-full",
|
|
@@ -801,7 +801,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
801
801
|
latestGraphRef.current = graph;
|
|
802
802
|
},
|
|
803
803
|
renderAgentModal: (props) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
804
|
-
|
|
804
|
+
chunk6ZMTJSQF_js.AgentModal,
|
|
805
805
|
{
|
|
806
806
|
...props,
|
|
807
807
|
onSaved: () => {
|
|
@@ -842,7 +842,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
842
842
|
] })
|
|
843
843
|
] }),
|
|
844
844
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
845
|
-
|
|
845
|
+
chunk6ZMTJSQF_js.PipelineSettingsModal,
|
|
846
846
|
{
|
|
847
847
|
onSave: async (changes) => {
|
|
848
848
|
const metadata = {
|
|
@@ -859,7 +859,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
859
859
|
}
|
|
860
860
|
),
|
|
861
861
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
862
|
-
|
|
862
|
+
chunk6ZMTJSQF_js.SubworkflowModal,
|
|
863
863
|
{
|
|
864
864
|
onMaximize: (subworkflowId) => {
|
|
865
865
|
closeSubworkflowModal();
|
|
@@ -883,7 +883,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
883
883
|
}
|
|
884
884
|
),
|
|
885
885
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
886
|
-
|
|
886
|
+
chunk6ZMTJSQF_js.RunPanel,
|
|
887
887
|
{
|
|
888
888
|
open: showRunPanel,
|
|
889
889
|
onClose: toggleRunPanel,
|
|
@@ -892,7 +892,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
892
892
|
}
|
|
893
893
|
),
|
|
894
894
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
895
|
-
|
|
895
|
+
chunk6ZMTJSQF_js.RunInputDialog,
|
|
896
896
|
{
|
|
897
897
|
open: showRunInputDialog,
|
|
898
898
|
onClose: () => setShowRunInputDialog(false),
|
|
@@ -905,7 +905,7 @@ function AgentsWorkspace({ workflowId, messages }) {
|
|
|
905
905
|
}
|
|
906
906
|
),
|
|
907
907
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
908
|
-
|
|
908
|
+
chunk6ZMTJSQF_js.PreviewPanel,
|
|
909
909
|
{
|
|
910
910
|
open: showPreviewPanel,
|
|
911
911
|
onClose: () => setShowPreviewPanel(false),
|
|
@@ -944,5 +944,5 @@ exports.resetWorkflowRunPresentation = resetWorkflowRunPresentation;
|
|
|
944
944
|
exports.useRunEvents = useRunEvents;
|
|
945
945
|
exports.useWorkflowExecution = useWorkflowExecution;
|
|
946
946
|
exports.useWorkflowRunPresentation = useWorkflowRunPresentation;
|
|
947
|
-
//# sourceMappingURL=chunk-
|
|
948
|
-
//# sourceMappingURL=chunk-
|
|
947
|
+
//# sourceMappingURL=chunk-DRORQGN2.js.map
|
|
948
|
+
//# sourceMappingURL=chunk-DRORQGN2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-run-events.ts","../src/hooks/use-workflow-run-presentation.ts","../src/hooks/use-workflow-execution.ts","../src/platform/agents-workspace.tsx"],"names":["buildAuthenticatedApiUrl","useState","useRef","useCallback","useEffect","useWorkflowStore","executeWorkflow","useTranslations","useMemo","useNavigate","useLocale","useNotifications","useModalStore","useSubworkflowStore","getWorkflowById","getAgentConfigsWithPrompts","getAgentModels","getAgentToolDefinitions","getAgentRules","getDatasources","listModelProviderConnections","getAgentTools","getWorkflows","saveWorkflowDraft","validateWorkflowGraph","publishWorkflow","createWorkflow","deleteWorkflow","updateAgentTool","updateAgentRule","workflow","createDatasource","jsxs","jsx","PageErrorState","PageEmptyState","WorkflowBuilderProvider","CopyableId","SaveStatusBadge","Button","ChartBarIcon","StopIcon","PlayIcon","DocumentCheckIcon","WorkflowListBar","NodePalette","AutoSaveWorkspace","getDatasourceTables","getDatasourceSchema","AgentModal","updateAgentConfig","createAgentConfig","PipelineSettingsModal","updateWorkflowSettings","SubworkflowModal","RunPanel","RunInputDialog","PreviewPanel","getWorkflowRuns","DatasourceFormModal","DynamicIslandConfirm"],"mappings":"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","file":"chunk-VPOIX2DY.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { WorkflowExecutionEvent } from '@datatechsolutions/shared-domain/common'\nimport { buildAuthenticatedApiUrl } from '@ui/platform/workflow-api-client'\n\nexport type RunEventStreamState = {\n /** All events received so far, in order */\n events: WorkflowExecutionEvent[]\n /** Whether the stream is currently connected */\n isStreaming: boolean\n /** Terminal status once the workflow finishes */\n status: 'idle' | 'streaming' | 'completed' | 'failed' | 'error'\n /** Error message if stream errored */\n error: string | null\n}\n\n/**\n * Detect transport based on environment.\n * - VITE_WS_ENDPOINT set → WebSocket (AWS production)\n * - otherwise → SSE (local dev, Kafka-backed)\n */\nconst WS_ENDPOINT = import.meta.env.VITE_WS_ENDPOINT ?? ''\nconst useWebSocket = WS_ENDPOINT.length > 0\n\n// ── SSE transport (local dev) ───────────────────────────────────────\n\nfunction connectSSE(\n workflowId: string,\n runId: string,\n callbacks: StreamCallbacks,\n): () => void {\n // EventSource cannot set an Authorization header, so the SSE endpoint\n // also accepts the JWT via `?accessToken=`. The Rust handler promotes it\n // to `Authorization: Bearer` before the standard JWT middleware runs.\n let eventSource: EventSource | null = null\n let cancelled = false\n\n buildAuthenticatedApiUrl(\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/events`,\n { includeAccessToken: true },\n )\n .then((url) => {\n if (cancelled) return\n eventSource = new EventSource(url)\n\n eventSource.addEventListener('connected', () => callbacks.onConnected())\n\n eventSource.addEventListener('execution', (messageEvent) => {\n try {\n callbacks.onEvent(JSON.parse(messageEvent.data) as WorkflowExecutionEvent)\n } catch { /* ignore malformed */ }\n })\n\n eventSource.addEventListener('done', (messageEvent) => {\n try {\n const data = JSON.parse(messageEvent.data) as { status: string }\n callbacks.onDone(data.status === 'run_completed' ? 'completed' : 'failed')\n } catch {\n callbacks.onDone('completed')\n }\n eventSource?.close()\n })\n\n eventSource.addEventListener('error', () => {\n eventSource?.close()\n callbacks.onError()\n })\n })\n .catch(() => callbacks.onError())\n\n return () => {\n cancelled = true\n eventSource?.close()\n }\n}\n\n// ── WebSocket transport (AWS production) ────────────────────────────\n\nfunction connectWebSocket(\n _workflowId: string,\n runId: string,\n callbacks: StreamCallbacks,\n): () => void {\n const ws = new WebSocket(WS_ENDPOINT)\n\n ws.addEventListener('open', () => {\n // Subscribe to the specific run\n ws.send(JSON.stringify({ action: 'subscribe', runId }))\n callbacks.onConnected()\n })\n\n ws.addEventListener('message', (messageEvent) => {\n try {\n const data = JSON.parse(messageEvent.data as string) as WorkflowExecutionEvent\n if (data.type === 'run_completed' || data.type === 'run_failed') {\n callbacks.onDone(data.type === 'run_completed' ? 'completed' : 'failed')\n ws.send(JSON.stringify({ action: 'unsubscribe', runId }))\n ws.close()\n return\n }\n callbacks.onEvent(data)\n } catch { /* ignore malformed */ }\n })\n\n ws.addEventListener('error', () => {\n callbacks.onError()\n })\n\n ws.addEventListener('close', () => {\n // If not explicitly closed by us, treat as error for reconnect\n })\n\n return () => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ action: 'unsubscribe', runId }))\n }\n ws.close()\n }\n}\n\n// ── Shared callback interface ───────────────────────────────────────\n\ntype StreamCallbacks = {\n onConnected: () => void\n onEvent: (event: WorkflowExecutionEvent) => void\n onDone: (status: 'completed' | 'failed') => void\n onError: () => void\n}\n\n// ── Hook ────────────────────────────────────────────────────────────\n\n/**\n * React hook that subscribes to real-time workflow execution events.\n *\n * Automatically selects transport:\n * - WebSocket when VITE_WS_ENDPOINT is set (AWS production)\n * - SSE when running locally (Kafka-backed)\n *\n * The stream auto-closes when the workflow completes or fails.\n * Reconnects automatically if the connection drops (up to 3 retries).\n */\nexport function useRunEvents(\n workflowId: string | null,\n runId: string | null,\n): RunEventStreamState {\n const [events, setEvents] = useState<WorkflowExecutionEvent[]>([])\n const [status, setStatus] = useState<RunEventStreamState['status']>('idle')\n const [error, setError] = useState<string | null>(null)\n const cleanupRef = useRef<(() => void) | null>(null)\n const retriesRef = useRef(0)\n\n const connect = useCallback(() => {\n if (!workflowId || !runId) return\n\n const connectFn = useWebSocket ? connectWebSocket : connectSSE\n\n const callbacks: StreamCallbacks = {\n onConnected: () => {\n setStatus('streaming')\n setError(null)\n retriesRef.current = 0\n },\n onEvent: (event) => {\n setEvents((prev) => [...prev, event])\n },\n onDone: (terminalStatus) => {\n setStatus(terminalStatus)\n cleanupRef.current = null\n },\n onError: () => {\n cleanupRef.current = null\n if (retriesRef.current < 3) {\n retriesRef.current++\n const delay = Math.min(1000 * Math.pow(2, retriesRef.current - 1), 5000)\n setTimeout(connect, delay)\n } else {\n setStatus('error')\n setError('Connection lost after 3 retries')\n }\n },\n }\n\n cleanupRef.current = connectFn(workflowId, runId, callbacks)\n }, [workflowId, runId])\n\n useEffect(() => {\n if (!workflowId || !runId) return\n\n setEvents([])\n setStatus('streaming')\n setError(null)\n retriesRef.current = 0\n\n connect()\n\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current()\n cleanupRef.current = null\n }\n }\n }, [workflowId, runId, connect])\n\n return {\n events,\n isStreaming: status === 'streaming',\n status,\n error,\n }\n}\n","import { useEffect } from 'react'\nimport type { WorkflowExecutionEvent } from '@datatechsolutions/shared-domain/common'\nimport { useWorkflowStore, type NodeRunResult } from '@ui/astrlabe'\nimport type { RunEventStreamState } from './use-run-events'\n\ntype WorkflowRunPresentationActions = {\n clearNodeResults: () => void\n setIsRunning: (running: boolean) => void\n setNodeResult: (nodeId: string, result: NodeRunResult) => void\n}\n\nexport function resetWorkflowRunPresentation(actions: WorkflowRunPresentationActions): void {\n actions.clearNodeResults()\n actions.setIsRunning(false)\n}\n\nexport function applyWorkflowExecutionEventToStore(\n actions: WorkflowRunPresentationActions,\n event: WorkflowExecutionEvent,\n): void {\n switch (event.type) {\n case 'run_started':\n actions.clearNodeResults()\n actions.setIsRunning(true)\n return\n case 'node_started':\n if (!event.nodeId) return\n actions.setNodeResult(event.nodeId, {\n status: 'running',\n durationMs: event.durationMs,\n })\n return\n case 'node_completed':\n if (!event.nodeId) return\n actions.setNodeResult(event.nodeId, {\n status: 'success',\n data: event.outputs,\n durationMs: event.durationMs,\n })\n return\n case 'node_error':\n if (!event.nodeId) return\n actions.setNodeResult(event.nodeId, {\n status: 'error',\n error: event.error,\n durationMs: event.durationMs,\n })\n return\n case 'run_completed':\n case 'run_failed':\n actions.setIsRunning(false)\n return\n default:\n return\n }\n}\n\nexport function useWorkflowRunPresentation(\n events: WorkflowExecutionEvent[],\n status: RunEventStreamState['status'],\n): void {\n const clearNodeResults = useWorkflowStore((state) => state.clearNodeResults)\n const setIsRunning = useWorkflowStore((state) => state.setIsRunning)\n const setNodeResult = useWorkflowStore((state) => state.setNodeResult)\n\n useEffect(() => {\n if (status === 'idle') {\n resetWorkflowRunPresentation({ clearNodeResults, setIsRunning, setNodeResult })\n return\n }\n\n clearNodeResults()\n for (const event of events) {\n applyWorkflowExecutionEventToStore({ clearNodeResults, setIsRunning, setNodeResult }, event)\n }\n\n if (status === 'completed' || status === 'failed' || status === 'error') {\n setIsRunning(false)\n } else if (status === 'streaming') {\n setIsRunning(true)\n }\n }, [clearNodeResults, events, setIsRunning, setNodeResult, status])\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport type { VariableValue } from '@ui/astrlabe/contracts'\nimport { executeWorkflow } from '@ui/platform/workflow-api-client'\nimport { useRunEvents } from './use-run-events'\nimport { resetWorkflowRunPresentation, useWorkflowRunPresentation } from './use-workflow-run-presentation'\nimport { useWorkflowStore } from '@ui/astrlabe'\n\nexport function useWorkflowExecution(workflowId: string) {\n const [activeRunId, setActiveRunId] = useState<string | null>(null)\n const [isLaunching, setIsLaunching] = useState(false)\n const stream = useRunEvents(workflowId || null, activeRunId)\n const clearNodeResults = useWorkflowStore((state) => state.clearNodeResults)\n const setIsRunning = useWorkflowStore((state) => state.setIsRunning)\n const setNodeResult = useWorkflowStore((state) => state.setNodeResult)\n\n useWorkflowRunPresentation(stream.events, activeRunId ? stream.status : 'idle')\n\n useEffect(() => {\n if (stream.status === 'completed' || stream.status === 'failed' || stream.status === 'error') {\n setIsLaunching(false)\n }\n }, [stream.status])\n\n const run = useCallback(async (inputVariables?: Record<string, VariableValue>) => {\n if (!workflowId) return\n setIsLaunching(true)\n try {\n const runRecord = await executeWorkflow(workflowId, inputVariables)\n setActiveRunId(runRecord.id)\n } finally {\n setIsLaunching(false)\n }\n }, [workflowId])\n\n const stop = useCallback(() => {\n setActiveRunId(null)\n setIsLaunching(false)\n resetWorkflowRunPresentation({ clearNodeResults, setIsRunning, setNodeResult })\n }, [clearNodeResults, setIsRunning, setNodeResult])\n\n useEffect(() => {\n setActiveRunId(null)\n setIsLaunching(false)\n resetWorkflowRunPresentation({ clearNodeResults, setIsRunning, setNodeResult })\n }, [clearNodeResults, setIsRunning, setNodeResult, workflowId])\n\n return {\n isRunning: isLaunching || stream.status === 'streaming',\n execute: run,\n stop,\n runId: activeRunId,\n runStatus: activeRunId ? stream.status : 'idle',\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useNavigate } from 'react-router'\nimport { useLocale, useTranslations } from '@ui/lib/i18n-context'\nimport {\n ChartBarIcon,\n DocumentCheckIcon,\n PlayIcon,\n StopIcon,\n} from '@heroicons/react/24/outline'\nimport {\n Button,\n CopyableId,\n DynamicIslandConfirm,\n PageEmptyState,\n PageErrorState,\n useNotifications,\n} from '@ui/index'\nimport {\n AgentModal,\n SubworkflowModal,\n AutoSaveWorkspace,\n NodePalette,\n PipelineSettingsModal,\n PreviewPanel,\n RunInputDialog,\n RunPanel,\n SaveStatusBadge,\n WorkflowBuilderProvider,\n WorkflowListBar,\n useModalStore,\n useWorkflowStore,\n useSubworkflowStore,\n validateWorkflowGraph,\n type AgentWithPrompts,\n type WorkflowEntityDefinition,\n} from '@ui/astrlabe'\nimport type {\n AgentModel,\n AgentRule,\n AgentTool,\n StartNodeConfig,\n WorkflowTool,\n Workflow,\n WorkflowGraph,\n} from '@ui/astrlabe/contracts'\nimport type { AgentsWorkspaceProps as SharedAgentsWorkspaceProps, DataSource, SaveState } from '@datatechsolutions/shared-domain/common'\nimport {\n createAgentConfig,\n createDatasource,\n createWorkflow,\n deleteWorkflow,\n getAgentConfigsWithPrompts,\n getAgentModels,\n getAgentRules,\n getAgentToolDefinitions,\n getAgentTools,\n getDatasources,\n getDatasourceTables,\n getDatasourceSchema,\n listModelProviderConnections,\n type ModelProviderConnection,\n getWorkflowById,\n getWorkflowRuns,\n getWorkflows,\n publishWorkflow,\n saveWorkflowDraft,\n updateWorkflowSettings,\n updateAgentConfig,\n updateAgentRule,\n updateAgentTool,\n} from './workflow-api-client'\nimport { useWorkflowExecution } from '@ui/hooks/use-workflow-execution'\nimport { DatasourceFormModal, type DatasourceFormData } from './pages/datasource-modal'\n\nfunction getPublishableKey() {\n return import.meta.env.VITE_WORKFLOW_BUILDER_PUBLISHABLE_KEY ?? ''\n}\n\nfunction useDatasourceLabels(): Record<string, string> {\n const t = useTranslations('platform.datasources')\n return useMemo(() => {\n const keys = [\n 'title', 'subtitle', 'addDatasource', 'createTitle', 'emptyTitle', 'emptyDescription',\n 'stepSelectType', 'stepConfigure',\n 'categoryRelational', 'categoryNoSql', 'categoryWarehouse', 'categoryTimeSeries',\n 'categoryGraph', 'categoryKeyValue', 'categorySearch',\n 'fieldName', 'fieldNamePlaceholder', 'fieldHost', 'fieldHostPlaceholder', 'fieldPort',\n 'fieldDatabase', 'fieldDatabasePlaceholder', 'fieldUsername', 'fieldUsernamePlaceholder',\n 'fieldPassword', 'fieldPasswordPlaceholder', 'fieldSchema', 'fieldSchemaPlaceholder',\n 'fieldSsl', 'fieldReadOnly', 'fieldReadOnlyHelp',\n 'fieldConnectionString', 'fieldConnectionStringPlaceholder',\n 'fieldProjectId', 'fieldProjectIdPlaceholder', 'fieldDataset', 'fieldDatasetPlaceholder',\n 'fieldKeyFile', 'fieldKeyFilePlaceholder', 'fieldAccount', 'fieldAccountPlaceholder',\n 'fieldWarehouse', 'fieldWarehousePlaceholder', 'fieldRegion', 'fieldRegionPlaceholder',\n 'fieldBucket', 'fieldBucketPlaceholder', 'fieldToken', 'fieldTokenPlaceholder',\n 'fieldApiKey', 'fieldApiKeyPlaceholder', 'fieldEnvironment', 'fieldEnvironmentPlaceholder',\n 'fieldIndex', 'fieldIndexPlaceholder', 'fieldUrl', 'fieldUrlPlaceholder',\n 'testConnection', 'testing', 'connectionSuccess', 'connectionFailed',\n 'save', 'saving', 'cancel', 'back', 'enabled', 'disabled', 'dialect', 'created', 'deleted', 'deleteConfirm',\n ]\n const labels: Record<string, string> = {}\n for (const key of keys) labels[key] = t(key)\n return labels\n }, [t])\n}\n\n/**\n * Props accepted by the workspace.\n *\n * Extends the shared-domain `AgentsWorkspaceProps` (just `workflowId`) with\n * an optional `messages` bundle. Most consumers wrap their tree in\n * `<I18nProvider>` so the canvas reads its translations from context — in\n * that case `messages` can be omitted. Apps that need to inject a\n * precomputed bundle (e.g. tests, app-specific overrides) pass it\n * explicitly and it forwards into `<AutoSaveWorkspace>`.\n */\nexport type AgentsWorkspaceProps = SharedAgentsWorkspaceProps & {\n messages?: Record<string, unknown>\n}\n\nexport function AgentsWorkspace({ workflowId, messages }: AgentsWorkspaceProps) {\n const navigate = useNavigate()\n const locale = useLocale()\n const tWorkflow = useTranslations('agents.workflow')\n const tCommon = useTranslations('common')\n const datasourceLabels = useDatasourceLabels()\n\n const { error: notifyError, success: notifySuccess } = useNotifications()\n\n const showSuccess = useCallback((title: string, message?: string) => {\n notifySuccess(title, message)\n }, [notifySuccess])\n const showError = useCallback((title: string, message?: string) => {\n notifyError(title, message)\n if (message) {\n console.error('[AgentsWorkspace]', message)\n }\n }, [])\n\n const [isLoading, setIsLoading] = useState(true)\n const [loadError, setLoadError] = useState<string | null>(null)\n const [isLoadingWorkflows, setIsLoadingWorkflows] = useState(true)\n const [isPublishing, setIsPublishing] = useState(false)\n\n const [workflows, setWorkflows] = useState<Workflow[]>([])\n const [workflow, setWorkflow] = useState<Workflow | null>(null)\n\n const [agents, setAgents] = useState<AgentWithPrompts[]>([])\n const [models, setModels] = useState<AgentModel[]>([])\n const [tools, setTools] = useState<WorkflowTool[]>([])\n const [agentToolDefs, setAgentToolDefs] = useState<AgentTool[]>([])\n const [rules, setRules] = useState<AgentRule[]>([])\n const [datasources, setDatasources] = useState<DataSource[]>([])\n const [modelConnections, setModelConnections] = useState<ModelProviderConnection[]>([])\n const [showDatasourceModal, setShowDatasourceModal] = useState(false)\n\n const openPipelineSettingsModal = useModalStore((s) => s.openPipelineSettingsModal)\n const [showRunInputDialog, setShowRunInputDialog] = useState(false)\n const [showPreviewPanel, setShowPreviewPanel] = useState(false)\n const [isCreatingAgent, setIsCreatingAgent] = useState(false)\n const openSubworkflowModal = useSubworkflowStore((s) => s.openModal)\n const closeSubworkflowModal = useSubworkflowStore((s) => s.closeModal)\n\n const [deleteTarget, setDeleteTarget] = useState<{ id: string; name: string } | null>(null)\n const [saveStatus, setSaveStatus] = useState<SaveState>('idle')\n\n const latestGraphRef = useRef<WorkflowGraph | null>(null)\n const saveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const skipInitialAutoSaveRef = useRef(true)\n\n const showRunPanel = useWorkflowStore((state) => state.showRunPanel)\n const toggleRunPanel = useWorkflowStore((state) => state.toggleRunPanel)\n const workflowNodes = useWorkflowStore((state) => state.nodes)\n\n const { execute: executeWorkflowRun, stop: stopWorkflowRun, isRunning } = useWorkflowExecution(workflowId)\n\n const loadWorkspaceData = useCallback(async () => {\n setIsLoading(true)\n setLoadError(null)\n try {\n const [workflowData, agentList, modelList, agentToolDefList, ruleList, datasourceList, connectionList] = await Promise.all([\n getWorkflowById(workflowId),\n getAgentConfigsWithPrompts(),\n getAgentModels(),\n getAgentToolDefinitions().catch(() => [] as AgentTool[]),\n getAgentRules(),\n getDatasources().catch(() => [] as DataSource[]),\n listModelProviderConnections().catch(() => [] as ModelProviderConnection[]),\n ])\n\n // Load tools per-agent (agentId is required by the API)\n const toolResults = await Promise.all(\n agentList.map(agent => getAgentTools(agent.agentId).catch(() => [] as WorkflowTool[]))\n )\n const toolList = toolResults.flat()\n\n setWorkflow(workflowData)\n latestGraphRef.current = workflowData.graph\n setAgents(agentList)\n setModels(modelList)\n setTools(toolList)\n setAgentToolDefs(agentToolDefList)\n setRules(ruleList)\n setDatasources(datasourceList)\n setModelConnections(connectionList)\n } catch (error) {\n const message = error instanceof Error ? error.message : tCommon('loadWorkspaceFailed')\n setWorkflow(null)\n setAgents([])\n setModels([])\n setTools([])\n setAgentToolDefs([])\n setRules([])\n setDatasources([])\n setModelConnections([])\n setLoadError(message)\n notifyError(tCommon('serverError'), message)\n } finally {\n setIsLoading(false)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [workflowId])\n\n const loadWorkflowList = useCallback(async () => {\n setIsLoadingWorkflows(true)\n try {\n const list = await getWorkflows()\n setWorkflows(list)\n } catch {\n setWorkflows([])\n } finally {\n setIsLoadingWorkflows(false)\n }\n }, [])\n\n useEffect(() => {\n void loadWorkspaceData()\n }, [loadWorkspaceData])\n\n useEffect(() => {\n void loadWorkflowList()\n }, [loadWorkflowList])\n\n useEffect(() => {\n skipInitialAutoSaveRef.current = true\n }, [workflowId])\n\n useEffect(() => {\n return () => {\n if (saveTimerRef.current) {\n clearTimeout(saveTimerRef.current)\n }\n }\n }, [])\n\n const handleAutoSaveGraph = useCallback((graph: WorkflowGraph) => {\n latestGraphRef.current = graph\n\n // Don't auto-save until initial data has loaded\n if (isLoading || skipInitialAutoSaveRef.current) {\n skipInitialAutoSaveRef.current = false\n return\n }\n\n if (saveTimerRef.current) {\n clearTimeout(saveTimerRef.current)\n }\n\n setSaveStatus('saving')\n saveTimerRef.current = setTimeout(() => {\n void saveWorkflowDraft(workflowId, graph)\n .then((updatedWorkflow) => {\n setWorkflow(updatedWorkflow)\n setWorkflows((current) => current.map((item) => (\n item.id === updatedWorkflow.id ? updatedWorkflow : item\n )))\n setSaveStatus('saved')\n setTimeout(() => setSaveStatus('idle'), 900)\n })\n .catch(() => {\n setSaveStatus('idle')\n })\n }, 800)\n }, [workflowId])\n\n const handlePublish = useCallback(async () => {\n if (!latestGraphRef.current) return\n\n const validation = validateWorkflowGraph(latestGraphRef.current, { locale })\n if (!validation.valid) {\n showError(tWorkflow('validationError'), validation.errors[0] ?? tWorkflow('validation'))\n return\n }\n\n setIsPublishing(true)\n try {\n const published = await publishWorkflow(workflowId)\n setWorkflow(published)\n setWorkflows((current) => current.map((item) => (\n item.id === published.id ? published : item\n )))\n } finally {\n setIsPublishing(false)\n }\n }, [locale, showError, tWorkflow, workflowId])\n\n const handleSelectWorkflow = useCallback((selected: Workflow) => {\n if (selected.id === workflowId) return\n navigate(`/workflows/edit?workflowId=${encodeURIComponent(selected.id)}`)\n }, [navigate, workflowId])\n\n const handleCreateWorkflow = useCallback(async () => {\n const created = await createWorkflow({\n name: tWorkflow('defaultWorkflowName'),\n })\n navigate(`/workflows/edit?workflowId=${encodeURIComponent(created.id)}`)\n }, [navigate, tWorkflow])\n\n const handleDeleteWorkflow = useCallback((id: string, name: string) => {\n setDeleteTarget({ id, name })\n }, [])\n\n const confirmDelete = useCallback(async () => {\n if (!deleteTarget) return\n await deleteWorkflow(deleteTarget.id)\n const remaining = workflows.filter((item) => item.id !== deleteTarget.id)\n if (remaining.length > 0) {\n navigate(`/workflows/edit?workflowId=${encodeURIComponent(remaining[0].id)}`)\n } else {\n navigate('/workflows')\n }\n setDeleteTarget(null)\n }, [deleteTarget, workflows, navigate])\n\n const handleOpenRunDialog = useCallback(() => {\n const startNode = workflowNodes.find((node) => node.type === 'start')\n const hasEndNode = workflowNodes.some((node) => node.type === 'end')\n const hasValidStartConfig = Boolean(\n startNode &&\n typeof startNode.data === 'object' &&\n startNode.data !== null &&\n 'config' in startNode.data &&\n startNode.data.config &&\n (startNode.data.config as StartNodeConfig).type === 'start'\n )\n\n if (!hasValidStartConfig) {\n showError(tWorkflow('validationError'), tWorkflow('startNodeRequired'))\n return\n }\n if (!hasEndNode) {\n showError(tWorkflow('validationError'), tWorkflow('endNodeRequired'))\n return\n }\n\n setShowRunInputDialog(true)\n }, [workflowNodes, showError, tWorkflow])\n\n const handleCreateAgent = useCallback(() => {\n setIsCreatingAgent(true)\n }, [])\n\n const handleCancelCreateAgent = useCallback(() => {\n setIsCreatingAgent(false)\n }, [])\n\n const handleAgentSaved = useCallback(async () => {\n const nextAgents = await getAgentConfigsWithPrompts()\n setAgents(nextAgents)\n setIsCreatingAgent(false)\n }, [])\n\n const handleToggleTool = useCallback(async (tool: WorkflowTool) => {\n try {\n const updated = await updateAgentTool(tool.toolId, { enabled: !tool.enabled })\n setTools((current) => current.map((item) => (item.toolId === tool.toolId ? updated : item)))\n showSuccess(\n tWorkflow('toolsSection'),\n updated.enabled ? tWorkflow('published') : tWorkflow('draftBadge')\n )\n } catch (error) {\n showError(\n tWorkflow('validationError'),\n error instanceof Error ? error.message : tWorkflow('publishError')\n )\n }\n }, [showError, showSuccess, tWorkflow])\n\n const handleToggleRule = useCallback(async (rule: AgentRule) => {\n try {\n const updated = await updateAgentRule(rule.ruleId, { ...rule, enabled: !rule.enabled })\n setRules((current) => current.map((item) => (item.ruleId === rule.ruleId ? updated : item)))\n showSuccess(\n tWorkflow('rulesSection'),\n updated.enabled ? tWorkflow('published') : tWorkflow('draftBadge')\n )\n } catch (error) {\n showError(\n tWorkflow('validationError'),\n error instanceof Error ? error.message : tWorkflow('publishError')\n )\n }\n }, [showError, showSuccess, tWorkflow])\n\n const handleCreateTool = useCallback(() => {\n openSubworkflowModal({ toolId: '', name: '', category: 'external', enabled: true } as WorkflowTool)\n }, [openSubworkflowModal])\n\n const handleCreateRule = useCallback(() => {\n // TODO: open rule drawer in create mode\n }, [])\n\n const handleCreateAgentTool = useCallback(() => {\n // TODO: open agent tool drawer in create mode\n }, [])\n\n const handleConvertToSubworkflow = useCallback((workflow: Workflow) => {\n openSubworkflowModal({\n toolId: '',\n name: workflow.name,\n description: workflow.description ?? '',\n category: 'external',\n enabled: true,\n config: { type: 'workflow', graph: workflow.graph },\n } as WorkflowTool)\n }, [openSubworkflowModal])\n\n const handleEditTool = useCallback((tool: WorkflowTool) => {\n openSubworkflowModal(tool)\n }, [openSubworkflowModal])\n\n const handleCreateDatasource = useCallback(() => {\n setShowDatasourceModal(true)\n }, [])\n\n const handleSaveDatasource = useCallback(async (data: DatasourceFormData) => {\n try {\n const created = await createDatasource(data)\n setDatasources((current) => [...current, created])\n showSuccess(tWorkflow('dataSourcesSection'), tCommon('created') ?? 'Created')\n } catch (error) {\n showError(\n tWorkflow('dataSourcesSection'),\n error instanceof Error ? error.message : tCommon('createDatasourceFailed')\n )\n }\n }, [showSuccess, showError, tWorkflow, tCommon])\n\n const datasourceEntities: WorkflowEntityDefinition[] = useMemo(() =>\n datasources.map((ds) => ({\n id: ds.id,\n label: ds.name ?? ds.id,\n description: ds.dialect ?? '',\n defaultLimit: 100,\n fields: [],\n })),\n [datasources])\n\n // Canvas datasource-node config modals expect `{id, name, dialect}[]` —\n // the same rows that `/datasources` admin manages. Pass them through\n // to AutoSaveWorkspace so opening a datasource node inside the canvas\n // picker lists what the admin page created, and vice versa.\n const datasourceDefinitions = useMemo(() =>\n datasources.map((ds) => ({\n id: ds.id,\n name: ds.name ?? ds.id,\n dialect: ds.dialect ?? 'postgres',\n })),\n [datasources])\n\n // NodePalette expects its own `ModelProvider` shape (distinct from both\n // our DB row and the UI's slug union). The `provider` field is the key\n // the palette uses to pick a logo (`PROVIDER_LOGOS`) and to synthesize\n // the node config's `providerType`. Keep the mapping honest so dragging\n // a provider chip spawns a node pointing at a real connection id.\n const paletteModelProviders = useMemo(() => {\n const toPaletteKey = (slug: string | undefined): string => {\n switch (slug) {\n case 'anthropic_api': return 'anthropic'\n case 'openai_api': return 'openai'\n case 'aws_bedrock': return 'amazon'\n case 'google_vertex': return 'google'\n default: return slug ?? 'custom'\n }\n }\n return modelConnections.map((connection) => ({\n id: connection.id,\n name: connection.name,\n provider: toPaletteKey(connection.providerSlug),\n modelCount: connection.modelFilter?.length ?? 1,\n configured: connection.enabled,\n }))\n }, [modelConnections])\n\n if (isLoading) {\n return (\n <div className=\"flex h-[calc(100vh-120px)] flex-col\">\n <div className=\"liquid-surface flex h-full flex-col overflow-hidden rounded-2xl\">\n <div className=\"flex flex-shrink-0 items-center justify-between px-5 py-3\">\n <div className=\"shimmer h-6 w-40 rounded-lg\" />\n <div className=\"shimmer h-8 w-24 rounded-lg\" />\n </div>\n <div className=\"liquid-divider border-t\" />\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <div className=\"w-56 border-r border-white/20 p-4 dark:border-white/10\">\n <div className=\"shimmer mb-3 h-5 w-24 rounded\" />\n <div className=\"space-y-2\">\n {[1, 2, 3].map((index) => (\n <div key={index} className=\"shimmer h-10 w-full rounded-lg\" />\n ))}\n </div>\n </div>\n <div className=\"flex flex-1 items-center justify-center\">\n <div className=\"shimmer h-8 w-48 rounded-lg\" />\n </div>\n </div>\n </div>\n </div>\n )\n }\n\n if (!workflow) {\n return (\n <div className=\"flex h-[calc(100vh-120px)] items-center justify-center\">\n {loadError ? (\n <PageErrorState\n statusCode={500}\n title={tCommon('serverError')}\n message={loadError}\n onRetry={() => { void loadWorkspaceData() }}\n retryLabel={tCommon('retry')}\n />\n ) : (\n <PageEmptyState\n title={tWorkflow('emptyTitle')}\n message={tWorkflow('emptyDescription')}\n iconName=\"cpu-chip\"\n />\n )}\n </div>\n )\n }\n\n return (\n <WorkflowBuilderProvider publishableKey={getPublishableKey()}>\n <div className=\"flex h-[calc(100vh-120px)] flex-col\" data-testid=\"agents-workspace\">\n <div className=\"liquid-surface flex h-full flex-col overflow-hidden rounded-2xl\">\n <div className=\"flex flex-shrink-0 items-center justify-between px-5 py-3\">\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => openPipelineSettingsModal(\n workflow.name,\n workflow.description ?? '',\n {\n slug: (workflow as unknown as { slug?: string | null }).slug ?? null,\n isDraft: (workflow as unknown as { isDraft?: boolean }).isDraft,\n isActive: (workflow as unknown as { isActive?: boolean }).isActive,\n },\n )}\n 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\"\n title={tWorkflow('editName')}\n >\n {workflow.name || tWorkflow('title')}\n </button>\n <CopyableId id={workflowId} className=\"text-[10px]\" />\n {workflow.isDraft ? (\n <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\">\n {tWorkflow('draftBadge')}\n </span>\n ) : (\n <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\">\n {tWorkflow('published')}\n </span>\n )}\n <SaveStatusBadge status={saveStatus} />\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"xs\"\n plain\n onClick={() => setShowPreviewPanel((previous) => !previous)}\n title={tWorkflow('previewPanel.title')}\n >\n <ChartBarIcon className=\"h-3.5 w-3.5\" data-slot=\"icon\" />\n </Button>\n\n {/* Run / Stop for the authenticated editor — these\n trigger real backend execution against live Bedrock.\n The button stays disabled until there's a published\n graph (or an in-memory edit) so a brand-new workflow\n can't fire an empty run. The landing-page preview\n uses a separate mocked executor (see preview-runtime). */}\n {isRunning ? (\n <Button size=\"xs\" outline onClick={stopWorkflowRun}>\n <StopIcon className=\"h-3.5 w-3.5\" data-slot=\"icon\" />\n {tWorkflow('runPanel.stop')}\n </Button>\n ) : (\n <Button\n size=\"xs\"\n outline\n onClick={handleOpenRunDialog}\n disabled={!workflow.publishedGraph && !latestGraphRef.current}\n title={!workflow.publishedGraph && !latestGraphRef.current ? tWorkflow('noPublishedWorkflow') : undefined}\n >\n <PlayIcon className=\"h-3.5 w-3.5\" data-slot=\"icon\" />\n {tWorkflow('runPanel.run')}\n </Button>\n )}\n\n <Button gradient size=\"xs\" onClick={() => { void handlePublish() }} disabled={isPublishing}>\n <DocumentCheckIcon className=\"h-3.5 w-3.5\" data-slot=\"icon\" />\n {tWorkflow('publish')}\n </Button>\n </div>\n </div>\n\n <div className=\"liquid-divider border-t\" />\n <div className=\"px-4 pt-3\">\n <WorkflowListBar\n workflows={workflows}\n activeWorkflowId={workflowId}\n isLoading={isLoadingWorkflows}\n onSelect={handleSelectWorkflow}\n onCreate={() => { void handleCreateWorkflow() }}\n onDelete={handleDeleteWorkflow}\n onConvertToSubworkflow={handleConvertToSubworkflow}\n />\n </div>\n\n <div className=\"liquid-divider border-t\" />\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <NodePalette\n agents={agents}\n tools={tools}\n agentTools={agentToolDefs}\n rules={rules}\n entities={datasourceEntities}\n modelProviders={paletteModelProviders}\n onCreateAgent={handleCreateAgent}\n onCreateTool={() => { void handleCreateTool() }}\n onCreateAgentTool={() => { void handleCreateAgentTool() }}\n onCreateRule={() => { void handleCreateRule() }}\n onCreateDatasource={handleCreateDatasource}\n />\n\n <div className=\"flex-1\">\n <AutoSaveWorkspace\n workflowId={workflowId}\n className=\"h-full w-full\"\n locale={locale}\n {...(messages ? { messages } : {})}\n initialGraph={workflow.graph}\n agents={agents}\n models={models}\n tools={tools}\n agentTools={agentToolDefs}\n rules={rules}\n datasources={datasourceDefinitions}\n onLoadTables={getDatasourceTables}\n onLoadSchema={getDatasourceSchema}\n onEditTool={handleEditTool}\n onToggleTool={handleToggleTool}\n onToggleRule={handleToggleRule}\n onAgentSaved={() => { void handleAgentSaved() }}\n isCreatingAgent={isCreatingAgent}\n onCancelCreateAgent={handleCancelCreateAgent}\n onAutoSaveGraph={handleAutoSaveGraph}\n onGraphSnapshot={(graph) => {\n latestGraphRef.current = graph\n }}\n renderAgentModal={(props) => (\n <AgentModal\n {...props}\n onSaved={() => {\n props.onSaved()\n void handleAgentSaved()\n }}\n onPersist={async (payload) => {\n // Translate the modal's canonical payload into the\n // shape the backend (`/agents/configs`) expects.\n // The handler ignores unknown fields, so it's safe\n // to spread the full payload and let serde pick\n // the ones it recognises.\n const body = {\n name: payload.name,\n displayName: payload.displayName,\n description: payload.description,\n avatar: payload.avatar,\n modelId: payload.modelId,\n modelProviderId: payload.connectionId,\n framework: payload.framework,\n systemPrompt: payload.systemPrompt,\n instruction: payload.systemPrompt,\n temperature: payload.temperature,\n maxOutputTokens: payload.maxOutputTokens,\n maxTokens: payload.maxOutputTokens,\n topP: payload.topP,\n topK: payload.topK,\n elo: payload.elo,\n status: payload.status,\n tags: payload.tags,\n agentToolIds: payload.enabledToolIds,\n }\n if (payload.agentId) {\n await updateAgentConfig(payload.agentId, body)\n } else {\n await createAgentConfig(body)\n }\n }}\n />\n )}\n />\n </div>\n </div>\n </div>\n\n <PipelineSettingsModal\n onSave={async (changes) => {\n // `saveWorkflowDraft` also piggy-backs the latest graph so\n // renames + graph-auto-save land in a single PATCH. The\n // lifecycle deltas (`isDraft`/`isActive`/`slug`) ride\n // alongside the name/description metadata.\n const metadata: {\n name?: string; description?: string;\n isDraft?: boolean; isActive?: boolean;\n slug?: string | null;\n } = {\n name: changes.name,\n description: changes.description,\n }\n if (changes.slug !== undefined) metadata.slug = changes.slug\n if (changes.isDraft !== undefined) metadata.isDraft = changes.isDraft\n if (changes.isActive !== undefined) metadata.isActive = changes.isActive\n\n // Use saveWorkflowDraft when the graph is loaded (so the\n // PATCH stays single-round-trip); fall back to the pure\n // settings-only updater otherwise.\n const updated = latestGraphRef.current\n ? await saveWorkflowDraft(workflowId, latestGraphRef.current, metadata)\n : await updateWorkflowSettings(workflowId, metadata)\n setWorkflow(updated)\n setWorkflows((current) => current.map((item) => (\n item.id === updated.id ? updated : item\n )))\n }}\n />\n\n <SubworkflowModal\n onMaximize={(subworkflowId: string) => {\n closeSubworkflowModal()\n navigate(`/workflows/edit?workflowId=${encodeURIComponent(subworkflowId)}`)\n }}\n onSaved={async (saved: WorkflowTool) => {\n const isNew = !saved.toolId\n if (isNew) {\n const created = await createWorkflow({\n name: saved.name,\n description: saved.description as string | undefined,\n })\n closeSubworkflowModal()\n navigate(`/workflows/edit?workflowId=${encodeURIComponent(created.id)}`)\n } else {\n const updated = await updateAgentTool(saved.toolId, saved)\n setTools((current) => current.map((item) => (item.toolId === saved.toolId ? updated : item)))\n closeSubworkflowModal()\n }\n }}\n />\n\n <RunPanel\n open={showRunPanel}\n onClose={toggleRunPanel}\n onRun={handleOpenRunDialog}\n onStop={stopWorkflowRun}\n />\n\n <RunInputDialog\n open={showRunInputDialog}\n onClose={() => setShowRunInputDialog(false)}\n onRun={(inputVariables) => {\n void executeWorkflowRun(inputVariables)\n if (!showRunPanel) {\n toggleRunPanel()\n }\n }}\n />\n\n <PreviewPanel\n open={showPreviewPanel}\n onClose={() => setShowPreviewPanel(false)}\n workflowId={workflowId}\n loadRuns={getWorkflowRuns}\n />\n\n <DatasourceFormModal\n open={showDatasourceModal}\n onClose={() => setShowDatasourceModal(false)}\n labels={datasourceLabels}\n onSave={(data) => { void handleSaveDatasource(data) }}\n />\n\n <DynamicIslandConfirm\n open={deleteTarget !== null}\n onClose={() => setDeleteTarget(null)}\n onConfirm={() => { void confirmDelete() }}\n title={`${tWorkflow('deleteWorkflowConfirm')} ${deleteTarget?.name ?? ''}?`}\n />\n </div>\n </WorkflowBuilderProvider>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-run-events.ts","../src/hooks/use-workflow-run-presentation.ts","../src/hooks/use-workflow-execution.ts","../src/platform/agents-workspace.tsx"],"names":["buildAuthenticatedApiUrl","useState","useRef","useCallback","useEffect","useWorkflowStore","executeWorkflow","useTranslations","useMemo","useNavigate","useLocale","useNotifications","useModalStore","useSubworkflowStore","getWorkflowById","getAgentConfigsWithPrompts","getAgentModels","getAgentToolDefinitions","getAgentRules","getDatasources","listModelProviderConnections","getAgentTools","getWorkflows","saveWorkflowDraft","validateWorkflowGraph","publishWorkflow","createWorkflow","deleteWorkflow","updateAgentTool","updateAgentRule","workflow","createDatasource","jsxs","jsx","PageErrorState","PageEmptyState","WorkflowBuilderProvider","CopyableId","SaveStatusBadge","Button","ChartBarIcon","StopIcon","PlayIcon","DocumentCheckIcon","WorkflowListBar","NodePalette","AutoSaveWorkspace","getDatasourceTables","getDatasourceSchema","AgentModal","updateAgentConfig","createAgentConfig","PipelineSettingsModal","updateWorkflowSettings","SubworkflowModal","RunPanel","RunInputDialog","PreviewPanel","getWorkflowRuns","DatasourceFormModal","DynamicIslandConfirm"],"mappings":"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","file":"chunk-DRORQGN2.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { WorkflowExecutionEvent } from '@datatechsolutions/shared-domain/common'\nimport { buildAuthenticatedApiUrl } from '@ui/platform/workflow-api-client'\n\nexport type RunEventStreamState = {\n /** All events received so far, in order */\n events: WorkflowExecutionEvent[]\n /** Whether the stream is currently connected */\n isStreaming: boolean\n /** Terminal status once the workflow finishes */\n status: 'idle' | 'streaming' | 'completed' | 'failed' | 'error'\n /** Error message if stream errored */\n error: string | null\n}\n\n/**\n * Detect transport based on environment.\n * - VITE_WS_ENDPOINT set → WebSocket (AWS production)\n * - otherwise → SSE (local dev, Kafka-backed)\n */\nconst WS_ENDPOINT = import.meta.env.VITE_WS_ENDPOINT ?? ''\nconst useWebSocket = WS_ENDPOINT.length > 0\n\n// ── SSE transport (local dev) ───────────────────────────────────────\n\nfunction connectSSE(\n workflowId: string,\n runId: string,\n callbacks: StreamCallbacks,\n): () => void {\n // EventSource cannot set an Authorization header, so the SSE endpoint\n // also accepts the JWT via `?accessToken=`. The Rust handler promotes it\n // to `Authorization: Bearer` before the standard JWT middleware runs.\n let eventSource: EventSource | null = null\n let cancelled = false\n\n buildAuthenticatedApiUrl(\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/events`,\n { includeAccessToken: true },\n )\n .then((url) => {\n if (cancelled) return\n eventSource = new EventSource(url)\n\n eventSource.addEventListener('connected', () => callbacks.onConnected())\n\n eventSource.addEventListener('execution', (messageEvent) => {\n try {\n callbacks.onEvent(JSON.parse(messageEvent.data) as WorkflowExecutionEvent)\n } catch { /* ignore malformed */ }\n })\n\n eventSource.addEventListener('done', (messageEvent) => {\n try {\n const data = JSON.parse(messageEvent.data) as { status: string }\n callbacks.onDone(data.status === 'run_completed' ? 'completed' : 'failed')\n } catch {\n callbacks.onDone('completed')\n }\n eventSource?.close()\n })\n\n eventSource.addEventListener('error', () => {\n eventSource?.close()\n callbacks.onError()\n })\n })\n .catch(() => callbacks.onError())\n\n return () => {\n cancelled = true\n eventSource?.close()\n }\n}\n\n// ── WebSocket transport (AWS production) ────────────────────────────\n\nfunction connectWebSocket(\n _workflowId: string,\n runId: string,\n callbacks: StreamCallbacks,\n): () => void {\n const ws = new WebSocket(WS_ENDPOINT)\n\n ws.addEventListener('open', () => {\n // Subscribe to the specific run\n ws.send(JSON.stringify({ action: 'subscribe', runId }))\n callbacks.onConnected()\n })\n\n ws.addEventListener('message', (messageEvent) => {\n try {\n const data = JSON.parse(messageEvent.data as string) as WorkflowExecutionEvent\n if (data.type === 'run_completed' || data.type === 'run_failed') {\n callbacks.onDone(data.type === 'run_completed' ? 'completed' : 'failed')\n ws.send(JSON.stringify({ action: 'unsubscribe', runId }))\n ws.close()\n return\n }\n callbacks.onEvent(data)\n } catch { /* ignore malformed */ }\n })\n\n ws.addEventListener('error', () => {\n callbacks.onError()\n })\n\n ws.addEventListener('close', () => {\n // If not explicitly closed by us, treat as error for reconnect\n })\n\n return () => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ action: 'unsubscribe', runId }))\n }\n ws.close()\n }\n}\n\n// ── Shared callback interface ───────────────────────────────────────\n\ntype StreamCallbacks = {\n onConnected: () => void\n onEvent: (event: WorkflowExecutionEvent) => void\n onDone: (status: 'completed' | 'failed') => void\n onError: () => void\n}\n\n// ── Hook ────────────────────────────────────────────────────────────\n\n/**\n * React hook that subscribes to real-time workflow execution events.\n *\n * Automatically selects transport:\n * - WebSocket when VITE_WS_ENDPOINT is set (AWS production)\n * - SSE when running locally (Kafka-backed)\n *\n * The stream auto-closes when the workflow completes or fails.\n * Reconnects automatically if the connection drops (up to 3 retries).\n */\nexport function useRunEvents(\n workflowId: string | null,\n runId: string | null,\n): RunEventStreamState {\n const [events, setEvents] = useState<WorkflowExecutionEvent[]>([])\n const [status, setStatus] = useState<RunEventStreamState['status']>('idle')\n const [error, setError] = useState<string | null>(null)\n const cleanupRef = useRef<(() => void) | null>(null)\n const retriesRef = useRef(0)\n\n const connect = useCallback(() => {\n if (!workflowId || !runId) return\n\n const connectFn = useWebSocket ? connectWebSocket : connectSSE\n\n const callbacks: StreamCallbacks = {\n onConnected: () => {\n setStatus('streaming')\n setError(null)\n retriesRef.current = 0\n },\n onEvent: (event) => {\n setEvents((prev) => [...prev, event])\n },\n onDone: (terminalStatus) => {\n setStatus(terminalStatus)\n cleanupRef.current = null\n },\n onError: () => {\n cleanupRef.current = null\n if (retriesRef.current < 3) {\n retriesRef.current++\n const delay = Math.min(1000 * Math.pow(2, retriesRef.current - 1), 5000)\n setTimeout(connect, delay)\n } else {\n setStatus('error')\n setError('Connection lost after 3 retries')\n }\n },\n }\n\n cleanupRef.current = connectFn(workflowId, runId, callbacks)\n }, [workflowId, runId])\n\n useEffect(() => {\n if (!workflowId || !runId) return\n\n setEvents([])\n setStatus('streaming')\n setError(null)\n retriesRef.current = 0\n\n connect()\n\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current()\n cleanupRef.current = null\n }\n }\n }, [workflowId, runId, connect])\n\n return {\n events,\n isStreaming: status === 'streaming',\n status,\n error,\n }\n}\n","import { useEffect } from 'react'\nimport type { WorkflowExecutionEvent } from '@datatechsolutions/shared-domain/common'\nimport { useWorkflowStore, type NodeRunResult } from '@ui/astrlabe'\nimport type { RunEventStreamState } from './use-run-events'\n\ntype WorkflowRunPresentationActions = {\n clearNodeResults: () => void\n setIsRunning: (running: boolean) => void\n setNodeResult: (nodeId: string, result: NodeRunResult) => void\n}\n\nexport function resetWorkflowRunPresentation(actions: WorkflowRunPresentationActions): void {\n actions.clearNodeResults()\n actions.setIsRunning(false)\n}\n\nexport function applyWorkflowExecutionEventToStore(\n actions: WorkflowRunPresentationActions,\n event: WorkflowExecutionEvent,\n): void {\n switch (event.type) {\n case 'run_started':\n actions.clearNodeResults()\n actions.setIsRunning(true)\n return\n case 'node_started':\n if (!event.nodeId) return\n actions.setNodeResult(event.nodeId, {\n status: 'running',\n durationMs: event.durationMs,\n })\n return\n case 'node_completed':\n if (!event.nodeId) return\n actions.setNodeResult(event.nodeId, {\n status: 'success',\n data: event.outputs,\n durationMs: event.durationMs,\n })\n return\n case 'node_error':\n if (!event.nodeId) return\n actions.setNodeResult(event.nodeId, {\n status: 'error',\n error: event.error,\n durationMs: event.durationMs,\n })\n return\n case 'run_completed':\n case 'run_failed':\n actions.setIsRunning(false)\n return\n default:\n return\n }\n}\n\nexport function useWorkflowRunPresentation(\n events: WorkflowExecutionEvent[],\n status: RunEventStreamState['status'],\n): void {\n const clearNodeResults = useWorkflowStore((state) => state.clearNodeResults)\n const setIsRunning = useWorkflowStore((state) => state.setIsRunning)\n const setNodeResult = useWorkflowStore((state) => state.setNodeResult)\n\n useEffect(() => {\n if (status === 'idle') {\n resetWorkflowRunPresentation({ clearNodeResults, setIsRunning, setNodeResult })\n return\n }\n\n clearNodeResults()\n for (const event of events) {\n applyWorkflowExecutionEventToStore({ clearNodeResults, setIsRunning, setNodeResult }, event)\n }\n\n if (status === 'completed' || status === 'failed' || status === 'error') {\n setIsRunning(false)\n } else if (status === 'streaming') {\n setIsRunning(true)\n }\n }, [clearNodeResults, events, setIsRunning, setNodeResult, status])\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport type { VariableValue } from '@ui/astrlabe/contracts'\nimport { executeWorkflow } from '@ui/platform/workflow-api-client'\nimport { useRunEvents } from './use-run-events'\nimport { resetWorkflowRunPresentation, useWorkflowRunPresentation } from './use-workflow-run-presentation'\nimport { useWorkflowStore } from '@ui/astrlabe'\n\nexport function useWorkflowExecution(workflowId: string) {\n const [activeRunId, setActiveRunId] = useState<string | null>(null)\n const [isLaunching, setIsLaunching] = useState(false)\n const stream = useRunEvents(workflowId || null, activeRunId)\n const clearNodeResults = useWorkflowStore((state) => state.clearNodeResults)\n const setIsRunning = useWorkflowStore((state) => state.setIsRunning)\n const setNodeResult = useWorkflowStore((state) => state.setNodeResult)\n\n useWorkflowRunPresentation(stream.events, activeRunId ? stream.status : 'idle')\n\n useEffect(() => {\n if (stream.status === 'completed' || stream.status === 'failed' || stream.status === 'error') {\n setIsLaunching(false)\n }\n }, [stream.status])\n\n const run = useCallback(async (inputVariables?: Record<string, VariableValue>) => {\n if (!workflowId) return\n setIsLaunching(true)\n try {\n const runRecord = await executeWorkflow(workflowId, inputVariables)\n setActiveRunId(runRecord.id)\n } finally {\n setIsLaunching(false)\n }\n }, [workflowId])\n\n const stop = useCallback(() => {\n setActiveRunId(null)\n setIsLaunching(false)\n resetWorkflowRunPresentation({ clearNodeResults, setIsRunning, setNodeResult })\n }, [clearNodeResults, setIsRunning, setNodeResult])\n\n useEffect(() => {\n setActiveRunId(null)\n setIsLaunching(false)\n resetWorkflowRunPresentation({ clearNodeResults, setIsRunning, setNodeResult })\n }, [clearNodeResults, setIsRunning, setNodeResult, workflowId])\n\n return {\n isRunning: isLaunching || stream.status === 'streaming',\n execute: run,\n stop,\n runId: activeRunId,\n runStatus: activeRunId ? stream.status : 'idle',\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useNavigate } from 'react-router'\nimport { useLocale, useTranslations } from '@ui/lib/i18n-context'\nimport {\n ChartBarIcon,\n DocumentCheckIcon,\n PlayIcon,\n StopIcon,\n} from '@heroicons/react/24/outline'\nimport {\n Button,\n CopyableId,\n DynamicIslandConfirm,\n PageEmptyState,\n PageErrorState,\n useNotifications,\n} from '@ui/index'\nimport {\n AgentModal,\n SubworkflowModal,\n AutoSaveWorkspace,\n NodePalette,\n PipelineSettingsModal,\n PreviewPanel,\n RunInputDialog,\n RunPanel,\n SaveStatusBadge,\n WorkflowBuilderProvider,\n WorkflowListBar,\n useModalStore,\n useWorkflowStore,\n useSubworkflowStore,\n validateWorkflowGraph,\n type AgentWithPrompts,\n type WorkflowEntityDefinition,\n} from '@ui/astrlabe'\nimport type {\n AgentModel,\n AgentRule,\n AgentTool,\n StartNodeConfig,\n WorkflowTool,\n Workflow,\n WorkflowGraph,\n} from '@ui/astrlabe/contracts'\nimport type { AgentsWorkspaceProps as SharedAgentsWorkspaceProps, DataSource, SaveState } from '@datatechsolutions/shared-domain/common'\nimport {\n createAgentConfig,\n createDatasource,\n createWorkflow,\n deleteWorkflow,\n getAgentConfigsWithPrompts,\n getAgentModels,\n getAgentRules,\n getAgentToolDefinitions,\n getAgentTools,\n getDatasources,\n getDatasourceTables,\n getDatasourceSchema,\n listModelProviderConnections,\n type ModelProviderConnection,\n getWorkflowById,\n getWorkflowRuns,\n getWorkflows,\n publishWorkflow,\n saveWorkflowDraft,\n updateWorkflowSettings,\n updateAgentConfig,\n updateAgentRule,\n updateAgentTool,\n} from './workflow-api-client'\nimport { useWorkflowExecution } from '@ui/hooks/use-workflow-execution'\nimport { DatasourceFormModal, type DatasourceFormData } from './pages/datasource-modal'\n\nfunction getPublishableKey() {\n return import.meta.env.VITE_WORKFLOW_BUILDER_PUBLISHABLE_KEY ?? ''\n}\n\nfunction useDatasourceLabels(): Record<string, string> {\n const t = useTranslations('platform.datasources')\n return useMemo(() => {\n const keys = [\n 'title', 'subtitle', 'addDatasource', 'createTitle', 'emptyTitle', 'emptyDescription',\n 'stepSelectType', 'stepConfigure',\n 'categoryRelational', 'categoryNoSql', 'categoryWarehouse', 'categoryTimeSeries',\n 'categoryGraph', 'categoryKeyValue', 'categorySearch',\n 'fieldName', 'fieldNamePlaceholder', 'fieldHost', 'fieldHostPlaceholder', 'fieldPort',\n 'fieldDatabase', 'fieldDatabasePlaceholder', 'fieldUsername', 'fieldUsernamePlaceholder',\n 'fieldPassword', 'fieldPasswordPlaceholder', 'fieldSchema', 'fieldSchemaPlaceholder',\n 'fieldSsl', 'fieldReadOnly', 'fieldReadOnlyHelp',\n 'fieldConnectionString', 'fieldConnectionStringPlaceholder',\n 'fieldProjectId', 'fieldProjectIdPlaceholder', 'fieldDataset', 'fieldDatasetPlaceholder',\n 'fieldKeyFile', 'fieldKeyFilePlaceholder', 'fieldAccount', 'fieldAccountPlaceholder',\n 'fieldWarehouse', 'fieldWarehousePlaceholder', 'fieldRegion', 'fieldRegionPlaceholder',\n 'fieldBucket', 'fieldBucketPlaceholder', 'fieldToken', 'fieldTokenPlaceholder',\n 'fieldApiKey', 'fieldApiKeyPlaceholder', 'fieldEnvironment', 'fieldEnvironmentPlaceholder',\n 'fieldIndex', 'fieldIndexPlaceholder', 'fieldUrl', 'fieldUrlPlaceholder',\n 'testConnection', 'testing', 'connectionSuccess', 'connectionFailed',\n 'save', 'saving', 'cancel', 'back', 'enabled', 'disabled', 'dialect', 'created', 'deleted', 'deleteConfirm',\n ]\n const labels: Record<string, string> = {}\n for (const key of keys) labels[key] = t(key)\n return labels\n }, [t])\n}\n\n/**\n * Props accepted by the workspace.\n *\n * Extends the shared-domain `AgentsWorkspaceProps` (just `workflowId`) with\n * an optional `messages` bundle. Most consumers wrap their tree in\n * `<I18nProvider>` so the canvas reads its translations from context — in\n * that case `messages` can be omitted. Apps that need to inject a\n * precomputed bundle (e.g. tests, app-specific overrides) pass it\n * explicitly and it forwards into `<AutoSaveWorkspace>`.\n */\nexport type AgentsWorkspaceProps = SharedAgentsWorkspaceProps & {\n messages?: Record<string, unknown>\n}\n\nexport function AgentsWorkspace({ workflowId, messages }: AgentsWorkspaceProps) {\n const navigate = useNavigate()\n const locale = useLocale()\n const tWorkflow = useTranslations('agents.workflow')\n const tCommon = useTranslations('common')\n const datasourceLabels = useDatasourceLabels()\n\n const { error: notifyError, success: notifySuccess } = useNotifications()\n\n const showSuccess = useCallback((title: string, message?: string) => {\n notifySuccess(title, message)\n }, [notifySuccess])\n const showError = useCallback((title: string, message?: string) => {\n notifyError(title, message)\n if (message) {\n console.error('[AgentsWorkspace]', message)\n }\n }, [])\n\n const [isLoading, setIsLoading] = useState(true)\n const [loadError, setLoadError] = useState<string | null>(null)\n const [isLoadingWorkflows, setIsLoadingWorkflows] = useState(true)\n const [isPublishing, setIsPublishing] = useState(false)\n\n const [workflows, setWorkflows] = useState<Workflow[]>([])\n const [workflow, setWorkflow] = useState<Workflow | null>(null)\n\n const [agents, setAgents] = useState<AgentWithPrompts[]>([])\n const [models, setModels] = useState<AgentModel[]>([])\n const [tools, setTools] = useState<WorkflowTool[]>([])\n const [agentToolDefs, setAgentToolDefs] = useState<AgentTool[]>([])\n const [rules, setRules] = useState<AgentRule[]>([])\n const [datasources, setDatasources] = useState<DataSource[]>([])\n const [modelConnections, setModelConnections] = useState<ModelProviderConnection[]>([])\n const [showDatasourceModal, setShowDatasourceModal] = useState(false)\n\n const openPipelineSettingsModal = useModalStore((s) => s.openPipelineSettingsModal)\n const [showRunInputDialog, setShowRunInputDialog] = useState(false)\n const [showPreviewPanel, setShowPreviewPanel] = useState(false)\n const [isCreatingAgent, setIsCreatingAgent] = useState(false)\n const openSubworkflowModal = useSubworkflowStore((s) => s.openModal)\n const closeSubworkflowModal = useSubworkflowStore((s) => s.closeModal)\n\n const [deleteTarget, setDeleteTarget] = useState<{ id: string; name: string } | null>(null)\n const [saveStatus, setSaveStatus] = useState<SaveState>('idle')\n\n const latestGraphRef = useRef<WorkflowGraph | null>(null)\n const saveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const skipInitialAutoSaveRef = useRef(true)\n\n const showRunPanel = useWorkflowStore((state) => state.showRunPanel)\n const toggleRunPanel = useWorkflowStore((state) => state.toggleRunPanel)\n const workflowNodes = useWorkflowStore((state) => state.nodes)\n\n const { execute: executeWorkflowRun, stop: stopWorkflowRun, isRunning } = useWorkflowExecution(workflowId)\n\n const loadWorkspaceData = useCallback(async () => {\n setIsLoading(true)\n setLoadError(null)\n try {\n const [workflowData, agentList, modelList, agentToolDefList, ruleList, datasourceList, connectionList] = await Promise.all([\n getWorkflowById(workflowId),\n getAgentConfigsWithPrompts(),\n getAgentModels(),\n getAgentToolDefinitions().catch(() => [] as AgentTool[]),\n getAgentRules(),\n getDatasources().catch(() => [] as DataSource[]),\n listModelProviderConnections().catch(() => [] as ModelProviderConnection[]),\n ])\n\n // Load tools per-agent (agentId is required by the API)\n const toolResults = await Promise.all(\n agentList.map(agent => getAgentTools(agent.agentId).catch(() => [] as WorkflowTool[]))\n )\n const toolList = toolResults.flat()\n\n setWorkflow(workflowData)\n latestGraphRef.current = workflowData.graph\n setAgents(agentList)\n setModels(modelList)\n setTools(toolList)\n setAgentToolDefs(agentToolDefList)\n setRules(ruleList)\n setDatasources(datasourceList)\n setModelConnections(connectionList)\n } catch (error) {\n const message = error instanceof Error ? error.message : tCommon('loadWorkspaceFailed')\n setWorkflow(null)\n setAgents([])\n setModels([])\n setTools([])\n setAgentToolDefs([])\n setRules([])\n setDatasources([])\n setModelConnections([])\n setLoadError(message)\n notifyError(tCommon('serverError'), message)\n } finally {\n setIsLoading(false)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [workflowId])\n\n const loadWorkflowList = useCallback(async () => {\n setIsLoadingWorkflows(true)\n try {\n const list = await getWorkflows()\n setWorkflows(list)\n } catch {\n setWorkflows([])\n } finally {\n setIsLoadingWorkflows(false)\n }\n }, [])\n\n useEffect(() => {\n void loadWorkspaceData()\n }, [loadWorkspaceData])\n\n useEffect(() => {\n void loadWorkflowList()\n }, [loadWorkflowList])\n\n useEffect(() => {\n skipInitialAutoSaveRef.current = true\n }, [workflowId])\n\n useEffect(() => {\n return () => {\n if (saveTimerRef.current) {\n clearTimeout(saveTimerRef.current)\n }\n }\n }, [])\n\n const handleAutoSaveGraph = useCallback((graph: WorkflowGraph) => {\n latestGraphRef.current = graph\n\n // Don't auto-save until initial data has loaded\n if (isLoading || skipInitialAutoSaveRef.current) {\n skipInitialAutoSaveRef.current = false\n return\n }\n\n if (saveTimerRef.current) {\n clearTimeout(saveTimerRef.current)\n }\n\n setSaveStatus('saving')\n saveTimerRef.current = setTimeout(() => {\n void saveWorkflowDraft(workflowId, graph)\n .then((updatedWorkflow) => {\n setWorkflow(updatedWorkflow)\n setWorkflows((current) => current.map((item) => (\n item.id === updatedWorkflow.id ? updatedWorkflow : item\n )))\n setSaveStatus('saved')\n setTimeout(() => setSaveStatus('idle'), 900)\n })\n .catch(() => {\n setSaveStatus('idle')\n })\n }, 800)\n }, [workflowId])\n\n const handlePublish = useCallback(async () => {\n if (!latestGraphRef.current) return\n\n const validation = validateWorkflowGraph(latestGraphRef.current, { locale })\n if (!validation.valid) {\n showError(tWorkflow('validationError'), validation.errors[0] ?? tWorkflow('validation'))\n return\n }\n\n setIsPublishing(true)\n try {\n const published = await publishWorkflow(workflowId)\n setWorkflow(published)\n setWorkflows((current) => current.map((item) => (\n item.id === published.id ? published : item\n )))\n } finally {\n setIsPublishing(false)\n }\n }, [locale, showError, tWorkflow, workflowId])\n\n const handleSelectWorkflow = useCallback((selected: Workflow) => {\n if (selected.id === workflowId) return\n navigate(`/workflows/edit?workflowId=${encodeURIComponent(selected.id)}`)\n }, [navigate, workflowId])\n\n const handleCreateWorkflow = useCallback(async () => {\n const created = await createWorkflow({\n name: tWorkflow('defaultWorkflowName'),\n })\n navigate(`/workflows/edit?workflowId=${encodeURIComponent(created.id)}`)\n }, [navigate, tWorkflow])\n\n const handleDeleteWorkflow = useCallback((id: string, name: string) => {\n setDeleteTarget({ id, name })\n }, [])\n\n const confirmDelete = useCallback(async () => {\n if (!deleteTarget) return\n await deleteWorkflow(deleteTarget.id)\n const remaining = workflows.filter((item) => item.id !== deleteTarget.id)\n if (remaining.length > 0) {\n navigate(`/workflows/edit?workflowId=${encodeURIComponent(remaining[0].id)}`)\n } else {\n navigate('/workflows')\n }\n setDeleteTarget(null)\n }, [deleteTarget, workflows, navigate])\n\n const handleOpenRunDialog = useCallback(() => {\n const startNode = workflowNodes.find((node) => node.type === 'start')\n const hasEndNode = workflowNodes.some((node) => node.type === 'end')\n const hasValidStartConfig = Boolean(\n startNode &&\n typeof startNode.data === 'object' &&\n startNode.data !== null &&\n 'config' in startNode.data &&\n startNode.data.config &&\n (startNode.data.config as StartNodeConfig).type === 'start'\n )\n\n if (!hasValidStartConfig) {\n showError(tWorkflow('validationError'), tWorkflow('startNodeRequired'))\n return\n }\n if (!hasEndNode) {\n showError(tWorkflow('validationError'), tWorkflow('endNodeRequired'))\n return\n }\n\n setShowRunInputDialog(true)\n }, [workflowNodes, showError, tWorkflow])\n\n const handleCreateAgent = useCallback(() => {\n setIsCreatingAgent(true)\n }, [])\n\n const handleCancelCreateAgent = useCallback(() => {\n setIsCreatingAgent(false)\n }, [])\n\n const handleAgentSaved = useCallback(async () => {\n const nextAgents = await getAgentConfigsWithPrompts()\n setAgents(nextAgents)\n setIsCreatingAgent(false)\n }, [])\n\n const handleToggleTool = useCallback(async (tool: WorkflowTool) => {\n try {\n const updated = await updateAgentTool(tool.toolId, { enabled: !tool.enabled })\n setTools((current) => current.map((item) => (item.toolId === tool.toolId ? updated : item)))\n showSuccess(\n tWorkflow('toolsSection'),\n updated.enabled ? tWorkflow('published') : tWorkflow('draftBadge')\n )\n } catch (error) {\n showError(\n tWorkflow('validationError'),\n error instanceof Error ? error.message : tWorkflow('publishError')\n )\n }\n }, [showError, showSuccess, tWorkflow])\n\n const handleToggleRule = useCallback(async (rule: AgentRule) => {\n try {\n const updated = await updateAgentRule(rule.ruleId, { ...rule, enabled: !rule.enabled })\n setRules((current) => current.map((item) => (item.ruleId === rule.ruleId ? updated : item)))\n showSuccess(\n tWorkflow('rulesSection'),\n updated.enabled ? tWorkflow('published') : tWorkflow('draftBadge')\n )\n } catch (error) {\n showError(\n tWorkflow('validationError'),\n error instanceof Error ? error.message : tWorkflow('publishError')\n )\n }\n }, [showError, showSuccess, tWorkflow])\n\n const handleCreateTool = useCallback(() => {\n openSubworkflowModal({ toolId: '', name: '', category: 'external', enabled: true } as WorkflowTool)\n }, [openSubworkflowModal])\n\n const handleCreateRule = useCallback(() => {\n // TODO: open rule drawer in create mode\n }, [])\n\n const handleCreateAgentTool = useCallback(() => {\n // TODO: open agent tool drawer in create mode\n }, [])\n\n const handleConvertToSubworkflow = useCallback((workflow: Workflow) => {\n openSubworkflowModal({\n toolId: '',\n name: workflow.name,\n description: workflow.description ?? '',\n category: 'external',\n enabled: true,\n config: { type: 'workflow', graph: workflow.graph },\n } as WorkflowTool)\n }, [openSubworkflowModal])\n\n const handleEditTool = useCallback((tool: WorkflowTool) => {\n openSubworkflowModal(tool)\n }, [openSubworkflowModal])\n\n const handleCreateDatasource = useCallback(() => {\n setShowDatasourceModal(true)\n }, [])\n\n const handleSaveDatasource = useCallback(async (data: DatasourceFormData) => {\n try {\n const created = await createDatasource(data)\n setDatasources((current) => [...current, created])\n showSuccess(tWorkflow('dataSourcesSection'), tCommon('created') ?? 'Created')\n } catch (error) {\n showError(\n tWorkflow('dataSourcesSection'),\n error instanceof Error ? error.message : tCommon('createDatasourceFailed')\n )\n }\n }, [showSuccess, showError, tWorkflow, tCommon])\n\n const datasourceEntities: WorkflowEntityDefinition[] = useMemo(() =>\n datasources.map((ds) => ({\n id: ds.id,\n label: ds.name ?? ds.id,\n description: ds.dialect ?? '',\n defaultLimit: 100,\n fields: [],\n })),\n [datasources])\n\n // Canvas datasource-node config modals expect `{id, name, dialect}[]` —\n // the same rows that `/datasources` admin manages. Pass them through\n // to AutoSaveWorkspace so opening a datasource node inside the canvas\n // picker lists what the admin page created, and vice versa.\n const datasourceDefinitions = useMemo(() =>\n datasources.map((ds) => ({\n id: ds.id,\n name: ds.name ?? ds.id,\n dialect: ds.dialect ?? 'postgres',\n })),\n [datasources])\n\n // NodePalette expects its own `ModelProvider` shape (distinct from both\n // our DB row and the UI's slug union). The `provider` field is the key\n // the palette uses to pick a logo (`PROVIDER_LOGOS`) and to synthesize\n // the node config's `providerType`. Keep the mapping honest so dragging\n // a provider chip spawns a node pointing at a real connection id.\n const paletteModelProviders = useMemo(() => {\n const toPaletteKey = (slug: string | undefined): string => {\n switch (slug) {\n case 'anthropic_api': return 'anthropic'\n case 'openai_api': return 'openai'\n case 'aws_bedrock': return 'amazon'\n case 'google_vertex': return 'google'\n default: return slug ?? 'custom'\n }\n }\n return modelConnections.map((connection) => ({\n id: connection.id,\n name: connection.name,\n provider: toPaletteKey(connection.providerSlug),\n modelCount: connection.modelFilter?.length ?? 1,\n configured: connection.enabled,\n }))\n }, [modelConnections])\n\n if (isLoading) {\n return (\n <div className=\"flex h-[calc(100vh-120px)] flex-col\">\n <div className=\"liquid-surface flex h-full flex-col overflow-hidden rounded-2xl\">\n <div className=\"flex flex-shrink-0 items-center justify-between px-5 py-3\">\n <div className=\"shimmer h-6 w-40 rounded-lg\" />\n <div className=\"shimmer h-8 w-24 rounded-lg\" />\n </div>\n <div className=\"liquid-divider border-t\" />\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <div className=\"w-56 border-r border-white/20 p-4 dark:border-white/10\">\n <div className=\"shimmer mb-3 h-5 w-24 rounded\" />\n <div className=\"space-y-2\">\n {[1, 2, 3].map((index) => (\n <div key={index} className=\"shimmer h-10 w-full rounded-lg\" />\n ))}\n </div>\n </div>\n <div className=\"flex flex-1 items-center justify-center\">\n <div className=\"shimmer h-8 w-48 rounded-lg\" />\n </div>\n </div>\n </div>\n </div>\n )\n }\n\n if (!workflow) {\n return (\n <div className=\"flex h-[calc(100vh-120px)] items-center justify-center\">\n {loadError ? (\n <PageErrorState\n statusCode={500}\n title={tCommon('serverError')}\n message={loadError}\n onRetry={() => { void loadWorkspaceData() }}\n retryLabel={tCommon('retry')}\n />\n ) : (\n <PageEmptyState\n title={tWorkflow('emptyTitle')}\n message={tWorkflow('emptyDescription')}\n iconName=\"cpu-chip\"\n />\n )}\n </div>\n )\n }\n\n return (\n <WorkflowBuilderProvider publishableKey={getPublishableKey()}>\n <div className=\"flex h-[calc(100vh-120px)] flex-col\" data-testid=\"agents-workspace\">\n <div className=\"liquid-surface flex h-full flex-col overflow-hidden rounded-2xl\">\n <div className=\"flex flex-shrink-0 items-center justify-between px-5 py-3\">\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => openPipelineSettingsModal(\n workflow.name,\n workflow.description ?? '',\n {\n slug: (workflow as unknown as { slug?: string | null }).slug ?? null,\n isDraft: (workflow as unknown as { isDraft?: boolean }).isDraft,\n isActive: (workflow as unknown as { isActive?: boolean }).isActive,\n },\n )}\n 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\"\n title={tWorkflow('editName')}\n >\n {workflow.name || tWorkflow('title')}\n </button>\n <CopyableId id={workflowId} className=\"text-[10px]\" />\n {workflow.isDraft ? (\n <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\">\n {tWorkflow('draftBadge')}\n </span>\n ) : (\n <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\">\n {tWorkflow('published')}\n </span>\n )}\n <SaveStatusBadge status={saveStatus} />\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"xs\"\n plain\n onClick={() => setShowPreviewPanel((previous) => !previous)}\n title={tWorkflow('previewPanel.title')}\n >\n <ChartBarIcon className=\"h-3.5 w-3.5\" data-slot=\"icon\" />\n </Button>\n\n {/* Run / Stop for the authenticated editor — these\n trigger real backend execution against live Bedrock.\n The button stays disabled until there's a published\n graph (or an in-memory edit) so a brand-new workflow\n can't fire an empty run. The landing-page preview\n uses a separate mocked executor (see preview-runtime). */}\n {isRunning ? (\n <Button size=\"xs\" outline onClick={stopWorkflowRun}>\n <StopIcon className=\"h-3.5 w-3.5\" data-slot=\"icon\" />\n {tWorkflow('runPanel.stop')}\n </Button>\n ) : (\n <Button\n size=\"xs\"\n outline\n onClick={handleOpenRunDialog}\n disabled={!workflow.publishedGraph && !latestGraphRef.current}\n title={!workflow.publishedGraph && !latestGraphRef.current ? tWorkflow('noPublishedWorkflow') : undefined}\n >\n <PlayIcon className=\"h-3.5 w-3.5\" data-slot=\"icon\" />\n {tWorkflow('runPanel.run')}\n </Button>\n )}\n\n <Button gradient size=\"xs\" onClick={() => { void handlePublish() }} disabled={isPublishing}>\n <DocumentCheckIcon className=\"h-3.5 w-3.5\" data-slot=\"icon\" />\n {tWorkflow('publish')}\n </Button>\n </div>\n </div>\n\n <div className=\"liquid-divider border-t\" />\n <div className=\"px-4 pt-3\">\n <WorkflowListBar\n workflows={workflows}\n activeWorkflowId={workflowId}\n isLoading={isLoadingWorkflows}\n onSelect={handleSelectWorkflow}\n onCreate={() => { void handleCreateWorkflow() }}\n onDelete={handleDeleteWorkflow}\n onConvertToSubworkflow={handleConvertToSubworkflow}\n />\n </div>\n\n <div className=\"liquid-divider border-t\" />\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <NodePalette\n agents={agents}\n tools={tools}\n agentTools={agentToolDefs}\n rules={rules}\n entities={datasourceEntities}\n modelProviders={paletteModelProviders}\n onCreateAgent={handleCreateAgent}\n onCreateTool={() => { void handleCreateTool() }}\n onCreateAgentTool={() => { void handleCreateAgentTool() }}\n onCreateRule={() => { void handleCreateRule() }}\n onCreateDatasource={handleCreateDatasource}\n />\n\n <div className=\"flex-1\">\n <AutoSaveWorkspace\n workflowId={workflowId}\n className=\"h-full w-full\"\n locale={locale}\n {...(messages ? { messages } : {})}\n initialGraph={workflow.graph}\n agents={agents}\n models={models}\n tools={tools}\n agentTools={agentToolDefs}\n rules={rules}\n datasources={datasourceDefinitions}\n onLoadTables={getDatasourceTables}\n onLoadSchema={getDatasourceSchema}\n onEditTool={handleEditTool}\n onToggleTool={handleToggleTool}\n onToggleRule={handleToggleRule}\n onAgentSaved={() => { void handleAgentSaved() }}\n isCreatingAgent={isCreatingAgent}\n onCancelCreateAgent={handleCancelCreateAgent}\n onAutoSaveGraph={handleAutoSaveGraph}\n onGraphSnapshot={(graph) => {\n latestGraphRef.current = graph\n }}\n renderAgentModal={(props) => (\n <AgentModal\n {...props}\n onSaved={() => {\n props.onSaved()\n void handleAgentSaved()\n }}\n onPersist={async (payload) => {\n // Translate the modal's canonical payload into the\n // shape the backend (`/agents/configs`) expects.\n // The handler ignores unknown fields, so it's safe\n // to spread the full payload and let serde pick\n // the ones it recognises.\n const body = {\n name: payload.name,\n displayName: payload.displayName,\n description: payload.description,\n avatar: payload.avatar,\n modelId: payload.modelId,\n modelProviderId: payload.connectionId,\n framework: payload.framework,\n systemPrompt: payload.systemPrompt,\n instruction: payload.systemPrompt,\n temperature: payload.temperature,\n maxOutputTokens: payload.maxOutputTokens,\n maxTokens: payload.maxOutputTokens,\n topP: payload.topP,\n topK: payload.topK,\n elo: payload.elo,\n status: payload.status,\n tags: payload.tags,\n agentToolIds: payload.enabledToolIds,\n }\n if (payload.agentId) {\n await updateAgentConfig(payload.agentId, body)\n } else {\n await createAgentConfig(body)\n }\n }}\n />\n )}\n />\n </div>\n </div>\n </div>\n\n <PipelineSettingsModal\n onSave={async (changes) => {\n // `saveWorkflowDraft` also piggy-backs the latest graph so\n // renames + graph-auto-save land in a single PATCH. The\n // lifecycle deltas (`isDraft`/`isActive`/`slug`) ride\n // alongside the name/description metadata.\n const metadata: {\n name?: string; description?: string;\n isDraft?: boolean; isActive?: boolean;\n slug?: string | null;\n } = {\n name: changes.name,\n description: changes.description,\n }\n if (changes.slug !== undefined) metadata.slug = changes.slug\n if (changes.isDraft !== undefined) metadata.isDraft = changes.isDraft\n if (changes.isActive !== undefined) metadata.isActive = changes.isActive\n\n // Use saveWorkflowDraft when the graph is loaded (so the\n // PATCH stays single-round-trip); fall back to the pure\n // settings-only updater otherwise.\n const updated = latestGraphRef.current\n ? await saveWorkflowDraft(workflowId, latestGraphRef.current, metadata)\n : await updateWorkflowSettings(workflowId, metadata)\n setWorkflow(updated)\n setWorkflows((current) => current.map((item) => (\n item.id === updated.id ? updated : item\n )))\n }}\n />\n\n <SubworkflowModal\n onMaximize={(subworkflowId: string) => {\n closeSubworkflowModal()\n navigate(`/workflows/edit?workflowId=${encodeURIComponent(subworkflowId)}`)\n }}\n onSaved={async (saved: WorkflowTool) => {\n const isNew = !saved.toolId\n if (isNew) {\n const created = await createWorkflow({\n name: saved.name,\n description: saved.description as string | undefined,\n })\n closeSubworkflowModal()\n navigate(`/workflows/edit?workflowId=${encodeURIComponent(created.id)}`)\n } else {\n const updated = await updateAgentTool(saved.toolId, saved)\n setTools((current) => current.map((item) => (item.toolId === saved.toolId ? updated : item)))\n closeSubworkflowModal()\n }\n }}\n />\n\n <RunPanel\n open={showRunPanel}\n onClose={toggleRunPanel}\n onRun={handleOpenRunDialog}\n onStop={stopWorkflowRun}\n />\n\n <RunInputDialog\n open={showRunInputDialog}\n onClose={() => setShowRunInputDialog(false)}\n onRun={(inputVariables) => {\n void executeWorkflowRun(inputVariables)\n if (!showRunPanel) {\n toggleRunPanel()\n }\n }}\n />\n\n <PreviewPanel\n open={showPreviewPanel}\n onClose={() => setShowPreviewPanel(false)}\n workflowId={workflowId}\n loadRuns={getWorkflowRuns}\n />\n\n <DatasourceFormModal\n open={showDatasourceModal}\n onClose={() => setShowDatasourceModal(false)}\n labels={datasourceLabels}\n onSave={(data) => { void handleSaveDatasource(data) }}\n />\n\n <DynamicIslandConfirm\n open={deleteTarget !== null}\n onClose={() => setDeleteTarget(null)}\n onConfirm={() => { void confirmDelete() }}\n title={`${tWorkflow('deleteWorkflowConfirm')} ${deleteTarget?.name ?? ''}?`}\n />\n </div>\n </WorkflowBuilderProvider>\n )\n}\n"]}
|