Skip to content

Commit 1cfeab8

Browse files
authored
Merge pull request #48 from UiPath/fix/refactor
fix: handle long running instances
2 parents 4b071d4 + abe4ad0 commit 1cfeab8

File tree

3 files changed

+24
-9
lines changed

3 files changed

+24
-9
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "uipath-mcp"
3-
version = "0.0.48"
3+
version = "0.0.49"
44
description = "UiPath MCP SDK"
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.10"

src/uipath_mcp/_cli/_runtime/_runtime.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/uipath_mcp/_cli/_runtime/_session.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ async def start(self) -> None:
5353
logger.error(
5454
f"Error starting session {self._session_id}: {e}", exc_info=True
5555
)
56-
await self.cleanup()
56+
await self.stop()
5757
raise
5858

5959
async def on_message_received(self) -> None:
@@ -74,7 +74,7 @@ async def on_message_received(self) -> None:
7474
) as _:
7575
await self._message_queue.put(message)
7676

77-
async def cleanup(self) -> None:
77+
async def stop(self) -> None:
7878
"""Clean up resources and stop the server."""
7979
# Cancel the context task if it exists
8080
if self._run_task and not self._run_task.done():

0 commit comments

Comments
 (0)