diff --git a/src/uipath/dev/__init__.py b/src/uipath/dev/__init__.py index da9d0e6..917f4e5 100644 --- a/src/uipath/dev/__init__.py +++ b/src/uipath/dev/__init__.py @@ -5,9 +5,10 @@ import traceback from datetime import datetime from pathlib import Path -from typing import Any +from typing import Any, Optional import pyperclip # type: ignore[import-untyped] +from pydantic import BaseModel from rich.traceback import Traceback from textual import on from textual.app import App, ComposeResult @@ -128,7 +129,7 @@ async def handle_chat_input(self, event: Input.Submitted) -> None: ) return if details_panel.current_run.status == "suspended": - details_panel.current_run.resume_data = user_text + details_panel.current_run.resume_data = {"message": user_text} asyncio.create_task(self._execute_runtime(details_panel.current_run)) event.input.clear() @@ -190,7 +191,7 @@ def action_copy(self) -> None: async def _execute_runtime(self, run: ExecutionRun): """Execute the script using UiPath runtime.""" try: - execution_input: dict[str, Any] = {} + execution_input: Optional[dict[str, Any]] = {} execution_options: UiPathExecuteOptions = UiPathExecuteOptions() if run.status == "suspended": execution_input = run.resume_data @@ -216,7 +217,12 @@ async def _execute_runtime(self, run: ExecutionRun): ): run.status = "suspended" else: - run.output_data = result.output + if result.output is None: + run.output_data = {} + elif isinstance(result.output, BaseModel): + run.output_data = result.output.model_dump() + else: + run.output_data = result.output run.status = "completed" if run.output_data: self._add_info_log(run, f"Execution result: {run.output_data}") diff --git a/src/uipath/dev/_demo/mock_runtime.py b/src/uipath/dev/_demo/mock_runtime.py index fbef925..47adf2e 100644 --- a/src/uipath/dev/_demo/mock_runtime.py +++ b/src/uipath/dev/_demo/mock_runtime.py @@ -18,6 +18,9 @@ class MockRuntime(UiPathBaseRuntime): async def get_schema(self) -> UiPathRuntimeSchema: return UiPathRuntimeSchema( + filePath="default", + uniqueId="mock-runtime", + type="agent", input={ "type": "object", "properties": {"message": {"type": "string"}}, diff --git a/src/uipath/dev/models/execution.py b/src/uipath/dev/models/execution.py index 8571528..6d67200 100644 --- a/src/uipath/dev/models/execution.py +++ b/src/uipath/dev/models/execution.py @@ -25,7 +25,7 @@ def __init__( self.entrypoint = entrypoint self.input_data = input_data self.conversational = conversational - self.resume_data: Optional[Any] = None + self.resume_data: Optional[dict[str, Any]] = None self.output_data: Optional[dict[str, Any]] = None self.start_time = datetime.now() self.end_time: Optional[datetime] = None diff --git a/src/uipath/dev/models/messages.py b/src/uipath/dev/models/messages.py index b7a237c..f7a7b22 100644 --- a/src/uipath/dev/models/messages.py +++ b/src/uipath/dev/models/messages.py @@ -1,3 +1,5 @@ +"""Messages used for inter-component communication in the UiPath Developer Console.""" + from datetime import datetime from typing import Any, Optional, Union @@ -15,6 +17,7 @@ def __init__( message: Union[str, RenderableType], timestamp: Optional[datetime] = None, ): + """Initialize a LogMessage instance.""" self.run_id = run_id self.level = level self.message = message @@ -37,6 +40,7 @@ def __init__( timestamp: Optional[datetime] = None, attributes: Optional[dict[str, Any]] = None, ): + """Initialize a TraceMessage instance.""" self.run_id = run_id self.span_name = span_name self.span_id = span_id diff --git a/tests/conftest.py b/tests/conftest.py index 7388f30..43580d0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1 @@ """Shared pytest fixtures for all tests.""" - -import pytest diff --git a/tests/test_smoke.py b/tests/test_smoke.py new file mode 100644 index 0000000..d48726b --- /dev/null +++ b/tests/test_smoke.py @@ -0,0 +1,4 @@ +def test_uipath_dev_has_developer_console() -> None: + from uipath.dev import UiPathDeveloperConsole + + assert UiPathDeveloperConsole is not None