Skip to content

Commit 80600bf

Browse files
committed
682 client - Additional fixes
1 parent 3f22b9d commit 80600bf

File tree

16 files changed

+871
-210
lines changed

16 files changed

+871
-210
lines changed

client/src/ee/pages/embedded/automation-workflows/workflow-builder/components/workflow-builder-header/hooks/useWorkflowBuilderHeader.ts

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -101,18 +101,24 @@ export const useWorkflowBuilderHeader = ({bottomResizablePanelRef, chatTrigger,
101101
);
102102
};
103103

104-
const {close, error, getPersistedJobId, persistJobId, setStreamRequest} = useWorkflowTestStream(
105-
workflow.id!,
106-
() => {
104+
const {
105+
close: closeWorkflowTestStream,
106+
error: workflowTestStreamError,
107+
getPersistedJobId,
108+
persistJobId,
109+
setStreamRequest,
110+
} = useWorkflowTestStream({
111+
onError: () => setJobId(null),
112+
onResult: () => {
107113
if (bottomResizablePanelRef.current && bottomResizablePanelRef.current.getSize() === 0) {
108114
bottomResizablePanelRef.current.resize(35);
109115
}
110116

111117
setJobId(null);
112118
},
113-
() => setJobId(null),
114-
(jobId) => setJobId(jobId)
115-
);
119+
onStart: (jobId) => setJobId(jobId),
120+
workflowId: workflow.id!,
121+
});
116122

117123
const handleRunClick = useCallback(() => {
118124
setShowBottomPanelOpen(true);
@@ -170,7 +176,7 @@ export const useWorkflowBuilderHeader = ({bottomResizablePanelRef, chatTrigger,
170176

171177
const handleStopClick = useCallback(() => {
172178
setWorkflowIsRunning(false);
173-
close();
179+
closeWorkflowTestStream();
174180
setStreamRequest(null);
175181

176182
if (jobId) {
@@ -190,7 +196,7 @@ export const useWorkflowBuilderHeader = ({bottomResizablePanelRef, chatTrigger,
190196
}, [
191197
bottomResizablePanelRef,
192198
chatTrigger,
193-
close,
199+
closeWorkflowTestStream,
194200
jobId,
195201
persistJobId,
196202
setStreamRequest,
@@ -215,23 +221,23 @@ export const useWorkflowBuilderHeader = ({bottomResizablePanelRef, chatTrigger,
215221
setStreamRequest(getTestWorkflowAttachRequest({jobId}));
216222
}, [workflow.id, currentEnvironmentId, getPersistedJobId, setWorkflowIsRunning, setJobId, setStreamRequest]);
217223

224+
// Stop the workflow execution only when:
225+
// - The node details panel is opened (always cancels runs), or
226+
// - We are in chat mode and the chat panel is not open
218227
useEffect(() => {
219-
// Stop only when:
220-
// - The node details panel is opened (always cancels runs), or
221-
// - We are in chat mode and the chat panel is not open
222228
if (workflowNodeDetailsPanelOpen || (chatTrigger && !workflowTestChatPanelOpen)) {
223229
handleStopClick();
224230
}
225231
}, [chatTrigger, handleStopClick, workflowNodeDetailsPanelOpen, workflowTestChatPanelOpen]);
226232

227233
useEffect(() => {
228-
if (error) {
234+
if (workflowTestStreamError) {
229235
setWorkflowIsRunning(false);
230236
setStreamRequest(null);
231237
persistJobId(null);
232238
setJobId(null);
233239
}
234-
}, [error, persistJobId, setWorkflowIsRunning, setStreamRequest]);
240+
}, [workflowTestStreamError, persistJobId, setWorkflowIsRunning, setStreamRequest]);
235241

236242
return {
237243
handleProjectWorkflowValueChange,

client/src/ee/pages/embedded/integration/components/integration-header/IntegrationHeader.tsx

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,24 @@ const IntegrationHeader = ({
9797
!showDeleteIntegrationAlertDialog
9898
);
9999

100-
const {close, error, getPersistedJobId, persistJobId, setStreamRequest} = useWorkflowTestStream(
101-
workflow.id!,
102-
() => {
100+
const {
101+
close: closeWorkflowTestStream,
102+
error: workflowTestStreamError,
103+
getPersistedJobId,
104+
persistJobId,
105+
setStreamRequest,
106+
} = useWorkflowTestStream({
107+
onError: () => setJobId(null),
108+
onResult: () => {
103109
if (bottomResizablePanelRef.current && bottomResizablePanelRef.current.getSize() === 0) {
104110
bottomResizablePanelRef.current.resize(35);
105111
}
106112

107113
setJobId(null);
108114
},
109-
() => setJobId(null),
110-
(jobId) => setJobId(jobId)
111-
);
115+
onStart: (jobId) => setJobId(jobId),
116+
workflowId: workflow.id!,
117+
});
112118

113119
const createIntegrationWorkflowMutation = useCreateIntegrationWorkflowMutation({
114120
onSuccess: (integrationWorkflowId) => {
@@ -208,11 +214,11 @@ const IntegrationHeader = ({
208214
setJobId(null);
209215
persistJobId(null);
210216

211-
const req = getTestWorkflowStreamPostRequest({
217+
const request = getTestWorkflowStreamPostRequest({
212218
environmentId: currentEnvironmentId,
213219
id: workflow.id,
214220
});
215-
setStreamRequest(req);
221+
setStreamRequest(request);
216222
}
217223
}, [
218224
captureIntegrationWorkflowTested,
@@ -228,7 +234,7 @@ const IntegrationHeader = ({
228234

229235
const handleStopClick = useCallback(() => {
230236
setWorkflowIsRunning(false);
231-
close();
237+
closeWorkflowTestStream();
232238
setStreamRequest(null);
233239

234240
if (jobId) {
@@ -237,7 +243,7 @@ const IntegrationHeader = ({
237243
setJobId(null);
238244
});
239245
}
240-
}, [close, jobId, persistJobId, setStreamRequest, setWorkflowIsRunning]);
246+
}, [closeWorkflowTestStream, jobId, persistJobId, setStreamRequest, setWorkflowIsRunning]);
241247

242248
useEffect(() => {
243249
if (!workflow.id || currentEnvironmentId === undefined) return;
@@ -254,15 +260,15 @@ const IntegrationHeader = ({
254260
setStreamRequest(getTestWorkflowAttachRequest({jobId}));
255261
}, [workflow.id, currentEnvironmentId, getPersistedJobId, setWorkflowIsRunning, setJobId, setStreamRequest]);
256262

257-
// On transport error (e.g., 4xx/5xx), make sure to reset running state and clear the request to prevent retries
263+
// On transport error (e.g., 4xx/5xx), make sure to reset the running state and clear the request to prevent retries
258264
useEffect(() => {
259-
if (error) {
265+
if (workflowTestStreamError) {
260266
setWorkflowIsRunning(false);
261267
setStreamRequest(null);
262268
persistJobId(null);
263269
setJobId(null);
264270
}
265-
}, [error, persistJobId, setWorkflowIsRunning, setStreamRequest]);
271+
}, [workflowTestStreamError, persistJobId, setWorkflowIsRunning, setStreamRequest]);
266272

267273
return (
268274
<header className="flex items-center px-3 py-2.5">

client/src/pages/automation/project/components/project-header/hooks/useProjectHeader.ts

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,24 @@ export const useProjectHeader = ({bottomResizablePanelRef, chatTrigger, projectI
7373

7474
const queryClient = useQueryClient();
7575

76-
const {close, error, getPersistedJobId, persistJobId, setStreamRequest} = useWorkflowTestStream(
77-
workflow.id!,
78-
() => {
76+
const {
77+
close: closeWorkflowTestStream,
78+
error: workflowTestStreamError,
79+
getPersistedJobId,
80+
persistJobId,
81+
setStreamRequest,
82+
} = useWorkflowTestStream({
83+
onError: () => setJobId(null),
84+
onResult: () => {
7985
if (bottomResizablePanelRef.current && bottomResizablePanelRef.current.getSize() === 0) {
8086
bottomResizablePanelRef.current.resize(35);
8187
}
8288

8389
setJobId(null);
8490
},
85-
() => setJobId(null),
86-
(jobId) => setJobId(jobId)
87-
);
91+
onStart: (jobId) => setJobId(jobId),
92+
workflowId: workflow.id!,
93+
});
8894

8995
const publishProjectMutation = usePublishProjectMutation({
9096
onSuccess: () => {
@@ -154,11 +160,11 @@ export const useProjectHeader = ({bottomResizablePanelRef, chatTrigger, projectI
154160
setJobId(null);
155161
persistJobId(null);
156162

157-
const req = getTestWorkflowStreamPostRequest({
163+
const request = getTestWorkflowStreamPostRequest({
158164
environmentId: currentEnvironmentId,
159165
id: workflow.id,
160166
});
161-
setStreamRequest(req);
167+
setStreamRequest(request);
162168
}
163169
}
164170
}, [
@@ -188,7 +194,7 @@ export const useProjectHeader = ({bottomResizablePanelRef, chatTrigger, projectI
188194

189195
const handleStopClick = useCallback(() => {
190196
setWorkflowIsRunning(false);
191-
close();
197+
closeWorkflowTestStream();
192198
setStreamRequest(null);
193199

194200
if (jobId) {
@@ -208,25 +214,25 @@ export const useProjectHeader = ({bottomResizablePanelRef, chatTrigger, projectI
208214
}, [
209215
bottomResizablePanelRef,
210216
chatTrigger,
211-
close,
217+
closeWorkflowTestStream,
212218
jobId,
213219
persistJobId,
214220
setStreamRequest,
215221
setWorkflowIsRunning,
216222
setWorkflowTestChatPanelOpen,
217223
]);
218224

225+
// Stop the workflow execution only when:
226+
// - The node details panel is opened (always cancels runs), or
227+
// - We are in chat mode and the chat panel is not open
219228
useEffect(() => {
220-
// Stop only when:
221-
// - The node details panel is opened (always cancels runs), or
222-
// - We are in chat mode and the chat panel is not open
223229
if (workflowNodeDetailsPanelOpen || (chatTrigger && !workflowTestChatPanelOpen)) {
224230
handleStopClick();
225231
}
226232
}, [chatTrigger, handleStopClick, workflowNodeDetailsPanelOpen, workflowTestChatPanelOpen]);
227233

228-
// On mount: try to restore an ongoing run using jobId persisted in localStorage.
229-
// Attach-first approach: immediately call attach with the exact jobId string.
234+
// On mount: try to restore an ongoing workflow execution using jobId persisted in localStorage by calling
235+
// attach endpoint.
230236
useEffect(() => {
231237
if (!workflow.id || currentEnvironmentId === undefined) return;
232238

@@ -243,13 +249,13 @@ export const useProjectHeader = ({bottomResizablePanelRef, chatTrigger, projectI
243249
}, [workflow.id, currentEnvironmentId, getPersistedJobId, setWorkflowIsRunning, setJobId, setStreamRequest]);
244250

245251
useEffect(() => {
246-
if (error) {
252+
if (workflowTestStreamError) {
247253
setWorkflowIsRunning(false);
248254
setStreamRequest(null);
249255
persistJobId(null);
250256
setJobId(null);
251257
}
252-
}, [error, persistJobId, setWorkflowIsRunning, setStreamRequest]);
258+
}, [workflowTestStreamError, persistJobId, setWorkflowIsRunning, setStreamRequest]);
253259

254260
return {
255261
handleProjectWorkflowValueChange,

client/src/pages/platform/workflow-editor/components/WorkflowCodeEditorSheet.tsx

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ import MonacoEditorLoader from '@/shared/components/MonacoEditorLoader';
1919
import {usePersistJobId} from '@/shared/hooks/usePersistJobId';
2020
import {useWorkflowTestStream} from '@/shared/hooks/useWorkflowTestStream';
2121
import {Workflow, WorkflowTestConfiguration} from '@/shared/middleware/platform/configuration';
22-
import {WorkflowTestExecution} from '@/shared/middleware/platform/workflow/test';
22+
import {WorkflowTestApi, WorkflowTestExecution} from '@/shared/middleware/platform/workflow/test';
2323
import {useEnvironmentStore} from '@/shared/stores/useEnvironmentStore';
24-
import {getTestWorkflowStreamPostRequest} from '@/shared/util/testWorkflow-utils';
24+
import {getTestWorkflowAttachRequest, getTestWorkflowStreamPostRequest} from '@/shared/util/testWorkflow-utils';
2525
import {PlayIcon, RefreshCwIcon, SaveIcon, Settings2Icon, SquareIcon} from 'lucide-react';
26-
import {Suspense, lazy, useState} from 'react';
26+
import {Suspense, lazy, useCallback, useEffect, useMemo, useState} from 'react';
2727

2828
interface WorkflowCodeEditorSheetProps {
2929
invalidateWorkflowQueries: () => void;
@@ -48,30 +48,51 @@ const WorkflowCodeEditorSheet = ({
4848
}: WorkflowCodeEditorSheetProps) => {
4949
const [dirty, setDirty] = useState<boolean>(false);
5050
const [definition, setDefinition] = useState<string>(workflow.definition!);
51+
const [jobId, setJobId] = useState<string | null>(null);
5152
const [showCloseAlertDialog, setShowCloseAlertDialog] = useState(false);
5253
const [showWorkflowTestConfigurationDialog, setShowWorkflowTestConfigurationDialog] = useState(false);
5354
const [workflowTestExecution, setWorkflowTestExecution] = useState<WorkflowTestExecution>();
5455
const [workflowIsRunning, setWorkflowIsRunning] = useState(false);
5556

5657
const currentEnvironmentId = useEnvironmentStore((state) => state.currentEnvironmentId);
5758

58-
const {persistJobId} = usePersistJobId(workflow.id, currentEnvironmentId);
59-
const {close, setStreamRequest} = useWorkflowTestStream(
60-
workflow.id!,
61-
(execution) => {
62-
setWorkflowTestExecution(execution);
59+
const workflowTestApi = useMemo(() => new WorkflowTestApi(), []);
60+
61+
const {getPersistedJobId, persistJobId} = usePersistJobId(workflow.id, currentEnvironmentId);
62+
const {close: closeWorkflowTestStream, setStreamRequest} = useWorkflowTestStream({
63+
onError: () => {
64+
setWorkflowTestExecution(undefined);
6365
setWorkflowIsRunning(false);
66+
setJobId(null);
6467
},
65-
() => {
66-
setWorkflowTestExecution(undefined);
68+
onResult: (execution) => {
69+
setWorkflowTestExecution(execution);
6770
setWorkflowIsRunning(false);
68-
}
69-
);
71+
setJobId(null);
72+
},
73+
onStart: (jobId) => setJobId(jobId),
74+
workflowId: workflow.id!,
75+
});
7076
const {updateWorkflowMutation} = useWorkflowEditor();
7177

78+
const handleStopClick = useCallback(() => {
79+
setWorkflowIsRunning(false);
80+
setStreamRequest(null);
81+
closeWorkflowTestStream();
82+
83+
if (jobId) {
84+
workflowTestApi.stopWorkflowTest({jobId}).finally(() => {
85+
persistJobId(null);
86+
setJobId(null);
87+
});
88+
}
89+
}, [closeWorkflowTestStream, jobId, persistJobId, setStreamRequest, workflowTestApi]);
90+
7291
const handleRunClick = () => {
7392
setWorkflowTestExecution(undefined);
7493
setWorkflowIsRunning(true);
94+
setJobId(null);
95+
persistJobId(null);
7596

7697
if (workflow?.id) {
7798
const request = getTestWorkflowStreamPostRequest({
@@ -121,6 +142,21 @@ const WorkflowCodeEditorSheet = ({
121142
}
122143
};
123144

145+
useEffect(() => {
146+
if (!workflow.id || currentEnvironmentId === undefined) return;
147+
148+
const jobId = getPersistedJobId();
149+
150+
if (!jobId) {
151+
return;
152+
}
153+
154+
setWorkflowIsRunning(true);
155+
setJobId(jobId);
156+
157+
setStreamRequest(getTestWorkflowAttachRequest({jobId}));
158+
}, [workflow.id, currentEnvironmentId, getPersistedJobId, setWorkflowIsRunning, setJobId, setStreamRequest]);
159+
124160
return (
125161
<Sheet onOpenChange={handleOpenOnChange} open={sheetOpen}>
126162
<SheetContent
@@ -184,17 +220,7 @@ const WorkflowCodeEditorSheet = ({
184220
)}
185221

186222
{workflowIsRunning && (
187-
<Button
188-
icon={<SquareIcon />}
189-
onClick={() => {
190-
setWorkflowIsRunning(false);
191-
setStreamRequest(null);
192-
persistJobId(null);
193-
close();
194-
}}
195-
size="icon"
196-
variant="destructive"
197-
/>
223+
<Button icon={<SquareIcon />} onClick={handleStopClick} size="icon" variant="destructive" />
198224
)}
199225

200226
<SheetCloseButton />

client/src/pages/platform/workflow-editor/components/workflow-test-chat/runtime-providers/WorkflowTestChatRuntimeProvider.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,11 @@ export function WorkflowTestChatRuntimeProvider({
4242
}))
4343
);
4444

45-
const {setStreamRequest} = useWorkflowTestStream(
46-
workflow.id!,
47-
() => {
48-
setIsRunning(false);
49-
},
50-
() => setIsRunning(false)
51-
);
45+
const {setStreamRequest} = useWorkflowTestStream({
46+
onError: () => setIsRunning(false),
47+
onResult: () => setIsRunning(false),
48+
workflowId: workflow.id!,
49+
});
5250

5351
const onNew = async (message: AppendMessage) => {
5452
if (message.content[0]?.type !== 'text') {

0 commit comments

Comments
 (0)