diff --git a/python/copilot/client.py b/python/copilot/client.py index 774569afb..88b3d97a7 100644 --- a/python/copilot/client.py +++ b/python/copilot/client.py @@ -1589,7 +1589,7 @@ async def _execute_tool_call( toolTelemetry={}, ) - return self._normalize_tool_result(result) + return self._normalize_tool_result(cast(ToolResult, result)) def _normalize_tool_result(self, result: ToolResult) -> ToolResult: """ diff --git a/python/copilot/jsonrpc.py b/python/copilot/jsonrpc.py index cb6c5408d..8b736968d 100644 --- a/python/copilot/jsonrpc.py +++ b/python/copilot/jsonrpc.py @@ -104,7 +104,7 @@ async def stop(self): self._stderr_thread.join(timeout=1.0) async def request( - self, method: str, params: Optional[dict] = None, timeout: float = 30.0 + self, method: str, params: Optional[dict] = None, timeout: Optional[float] = None ) -> Any: """ Send a JSON-RPC request and wait for response @@ -112,14 +112,15 @@ async def request( Args: method: Method name params: Optional parameters - timeout: Request timeout in seconds (default 30s) + timeout: Optional request timeout in seconds. If None (default), + waits indefinitely for the server to respond. Returns: The result from the response Raises: JsonRpcError: If server returns an error - asyncio.TimeoutError: If request times out + asyncio.TimeoutError: If request times out (only when timeout is set) """ request_id = str(uuid.uuid4()) @@ -141,7 +142,9 @@ async def request( await self._send_message(message) try: - return await asyncio.wait_for(future, timeout=timeout) + if timeout is not None: + return await asyncio.wait_for(future, timeout=timeout) + return await future finally: with self._pending_lock: self.pending_requests.pop(request_id, None) diff --git a/python/copilot/session.py b/python/copilot/session.py index af02a312d..658d2902a 100644 --- a/python/copilot/session.py +++ b/python/copilot/session.py @@ -8,7 +8,7 @@ import asyncio import inspect import threading -from typing import Any, Callable, Optional +from typing import Any, Callable, Optional, cast from .generated.rpc import SessionRpc from .generated.session_events import SessionEvent, SessionEventType, session_event_from_dict @@ -336,7 +336,7 @@ async def _handle_permission_request( result = handler(request, {"session_id": self.session_id}) if inspect.isawaitable(result): result = await result - return result + return cast(PermissionRequestResult, result) except Exception: # pylint: disable=broad-except # Handler failed, deny permission return {"kind": "denied-no-approval-rule-and-could-not-request-from-user"} @@ -388,7 +388,7 @@ async def _handle_user_input_request(self, request: dict) -> UserInputResponse: ) if inspect.isawaitable(result): result = await result - return result + return cast(UserInputResponse, result) except Exception: raise