@@ -165,11 +165,12 @@ async def _handle_signalr_session_closed(self, args: list) -> None:
165165 try :
166166 session_server = self ._session_servers .pop (session_id , None )
167167 if session_server :
168- await session_server .cleanup ()
168+ await session_server .stop ()
169169 if session_server .output :
170170 self ._session_outputs [session_id ] = session_server .output
171171
172- if len (self ._session_servers ) == 0 :
172+ # If this is an ephemeral runtime for a specific session, cancel the execution
173+ if self ._is_ephemeral ():
173174 self ._cancel_event .set ()
174175
175176 except Exception as e :
@@ -212,13 +213,14 @@ async def _handle_signalr_error(self, error: Any) -> None:
212213
213214 async def _handle_signalr_open (self ) -> None :
214215 """Handle SignalR connection open event."""
215-
216216 logger .info ("Websocket connection established." )
217- if self ._server .session_id :
217+ # If this is an ephemeral runtime we need to start the local MCP session
218+ if self ._is_ephemeral ():
218219 try :
219220 session_server = SessionServer (self ._server , self ._server .session_id )
220221 await session_server .start ()
221222 self ._session_servers [self ._server .session_id ] = session_server
223+ # Check for existing messages from the connected client
222224 await session_server .on_message_received ()
223225 except Exception as e :
224226 await self ._on_initialization_failure ()
@@ -328,8 +330,12 @@ async def _register(self) -> None:
328330 ) from e
329331
330332 async def _on_initialization_failure (self ) -> None :
331- """Dispose of the session on the server."""
332- if self ._server .session_id is None :
333+ """
334+ Sends a dummy initialization failure message to abort the already connected client.
335+ Ephemeral runtimes are triggered by new client connections.
336+ """
337+
338+ if self ._is_ephemeral () is False :
333339 return
334340
335341 try :
@@ -358,3 +364,12 @@ async def _on_initialization_failure(self) -> None:
358364 logger .error (
359365 f"Error sending session dispose signal to UiPath MCP Server: { e } "
360366 )
367+
368+ def _is_ephemeral (self ) -> bool :
369+ """
370+ Check if the runtime is ephemeral (created on-demand for a single agent execution).
371+
372+ Returns:
373+ bool: True if this is an ephemeral runtime (has a session_id), False otherwise.
374+ """
375+ return self ._server .session_id is not None
0 commit comments