Skip to content

Commit 6cd498f

Browse files
committed
fix: debug wait for terminate
1 parent 028eec2 commit 6cd498f

File tree

5 files changed

+24
-18
lines changed

5 files changed

+24
-18
lines changed

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
[project]
22
name = "uipath-dev"
3-
version = "0.0.7"
3+
version = "0.0.8"
44
description = "UiPath Developer Console"
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.11"
77
dependencies = [
8-
"uipath-runtime>=0.0.21, <0.1.0",
8+
"uipath-runtime>=0.1.0, <0.2.0",
99
"textual>=6.6.0, <7.0.0",
1010
"pyperclip>=1.11.0, <2.0.0",
1111
]

src/uipath/dev/models/execution.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def __init__(
2828
self.conversational = conversational
2929
self.debug = debug
3030
self.resume_data: dict[str, Any] | None = None
31-
self.output_data: dict[str, Any] | None = None
31+
self.output_data: dict[str, Any] | str | None = None
3232
self.start_time = datetime.now()
3333
self.end_time: datetime | None = None
3434
self.status = "pending" # pending, running, completed, failed, suspended

src/uipath/dev/services/debug_bridge.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Debug bridge implementation for Textual UI."""
22

33
import asyncio
4+
import json
45
import logging
56
from typing import Any, Callable, Literal
67

@@ -18,7 +19,7 @@ def __init__(self):
1819
"""Initialize the debug bridge."""
1920
self._connected = False
2021
self._resume_event = asyncio.Event()
21-
self._quit_requested = False
22+
self._terminate_event = asyncio.Event()
2223
self._breakpoints: list[str] | Literal["*"] = "*" # Default: step mode
2324

2425
# Callbacks to UI
@@ -31,13 +32,13 @@ def __init__(self):
3132
async def connect(self) -> None:
3233
"""Establish connection to debugger."""
3334
self._connected = True
34-
self._quit_requested = False
3535
logger.debug("Debug bridge connected")
3636

3737
async def disconnect(self) -> None:
3838
"""Close connection to debugger."""
3939
self._connected = False
4040
self._resume_event.set() # Unblock any waiting tasks
41+
self._terminate_event.set()
4142
logger.debug("Debug bridge disconnected")
4243

4344
async def emit_execution_started(self, **kwargs: Any) -> None:
@@ -50,7 +51,7 @@ async def emit_state_update(self, state_event: UiPathRuntimeStateEvent) -> None:
5051
"""Notify debugger of runtime state update."""
5152
logger.debug(f"State update: {state_event.node_name}")
5253
if self.on_state_update:
53-
self.on_state_update(state_event)
54+
self.on_state_update(json.dumps(state_event.payload))
5455

5556
async def emit_breakpoint_hit(
5657
self, breakpoint_result: UiPathBreakpointResult
@@ -83,16 +84,20 @@ async def wait_for_resume(self) -> Any:
8384
self._resume_event.clear()
8485
await self._resume_event.wait()
8586

86-
if self._quit_requested:
87+
if self._terminate_event.is_set():
8788
raise UiPathDebugQuitError("Debug session quit requested")
8889

90+
async def wait_for_terminate(self) -> None:
91+
"""Wait for terminate command from debugger."""
92+
await self._terminate_event.wait()
93+
8994
def resume(self) -> None:
9095
"""Signal that execution should resume (called from UI buttons)."""
9196
self._resume_event.set()
9297

9398
def quit(self) -> None:
9499
"""Signal that execution should quit (called from UI stop button)."""
95-
self._quit_requested = True
100+
self._terminate_event.set()
96101
self._resume_event.set()
97102

98103
def get_breakpoints(self) -> list[str] | Literal["*"]:

src/uipath/dev/services/run_service.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ async def execute(self, run: ExecutionRun) -> None:
111111
debug_bridge = TextualDebugBridge()
112112

113113
# Connect callbacks
114-
debug_bridge.on_state_update = lambda event: self._handle_state_update(
115-
run.id, event
114+
debug_bridge.on_state_update = lambda state: self._handle_state_update(
115+
run.id, state
116116
)
117117
debug_bridge.on_breakpoint_hit = lambda bp: self._handle_breakpoint_hit(
118118
run.id, bp
@@ -248,10 +248,11 @@ def get_debug_bridge(self, run_id: str) -> TextualDebugBridge | None:
248248
"""Get the debug bridge for a run."""
249249
return self.debug_bridges.get(run_id)
250250

251-
def _handle_state_update(self, run_id: str, event) -> None:
251+
def _handle_state_update(self, run_id: str, state: str) -> None:
252252
"""Handle state update from debug runtime."""
253-
# You can add more logic here later if needed
254-
pass
253+
run = self.runs.get(run_id)
254+
if run:
255+
self._add_info_log(run, state)
255256

256257
def _handle_debug_started(self, run_id: str) -> None:
257258
"""Handle debug started event."""

uv.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)