From 124736124768a48122453e33b2c3d4e38d39b069 Mon Sep 17 00:00:00 2001 From: xTRam1 Date: Fri, 29 May 2026 14:52:01 -0700 Subject: [PATCH] Forward window agent timeout to remote dispatch --- packages/narada-pyodide/src/narada/window.py | 1 + .../tests/test_cloud_browser.py | 4 +++- packages/narada/src/narada/window.py | 5 +++-- .../tests/test_window_human_interaction.py | 22 +++++++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/narada-pyodide/src/narada/window.py b/packages/narada-pyodide/src/narada/window.py index c69444b..6df842a 100644 --- a/packages/narada-pyodide/src/narada/window.py +++ b/packages/narada-pyodide/src/narada/window.py @@ -398,6 +398,7 @@ async def dispatch_request( "prompt": agent_prefix + prompt, "browserWindowId": self.browser_window_id, "timeZone": time_zone, + "timeout": timeout, } parent_run_ids = self._current_parent_run_ids() if parent_run_ids: diff --git a/packages/narada-pyodide/tests/test_cloud_browser.py b/packages/narada-pyodide/tests/test_cloud_browser.py index c5b4081..c5374b9 100644 --- a/packages/narada-pyodide/tests/test_cloud_browser.py +++ b/packages/narada-pyodide/tests/test_cloud_browser.py @@ -789,7 +789,7 @@ async def test_local_browser_window_dispatch_request_uses_latest_parent_run_ids( window = window_module.LocalBrowserWindow() window_module._narada_parent_run_ids = _FakeJsProxy(["run-a"]) - first_response = await window.dispatch_request(prompt="first prompt") + first_response = await window.dispatch_request(prompt="first prompt", timeout=17) window_module._narada_parent_run_ids = _FakeJsProxy(["run-b", "run-c"]) second_response = await window.dispatch_request(prompt="second prompt") @@ -799,6 +799,8 @@ async def test_local_browser_window_dispatch_request_uses_latest_parent_run_ids( first_post = json.loads(pyfetch.await_args_list[0].kwargs["body"]) second_post = json.loads(pyfetch.await_args_list[2].kwargs["body"]) + assert first_post["timeout"] == 17 + assert second_post["timeout"] == 1000 assert first_post["parentRunIds"] == ["run-a"] assert second_post["parentRunIds"] == ["run-b", "run-c"] diff --git a/packages/narada/src/narada/window.py b/packages/narada/src/narada/window.py index 494a976..9c9c569 100644 --- a/packages/narada/src/narada/window.py +++ b/packages/narada/src/narada/window.py @@ -24,10 +24,10 @@ from narada_core.actions.critic import run_critic from narada_core.actions.models import ( DEFAULT_HITL_TIMEOUT_SECONDS, - AgenticMouseAction, - AgenticMouseActionRequest, AgenticMatchingSelectorsFinderRequest, AgenticMatchingSelectorsFinderResponse, + AgenticMouseAction, + AgenticMouseActionRequest, AgenticSelectorAction, AgenticSelectorRequest, AgenticSelectorResponse, @@ -404,6 +404,7 @@ async def dispatch_request( "prompt": agent_prefix + prompt, "browserWindowId": self.browser_window_id, "timeZone": time_zone, + "timeout": timeout, } cloud_browser_session_id = self.cloud_browser_session_id if cloud_browser_session_id is not None: diff --git a/packages/narada/tests/test_window_human_interaction.py b/packages/narada/tests/test_window_human_interaction.py index 093b8c9..723ed53 100644 --- a/packages/narada/tests/test_window_human_interaction.py +++ b/packages/narada/tests/test_window_human_interaction.py @@ -44,6 +44,28 @@ def post(self, _url: str, **kwargs: Any) -> _FakeResponse: self.post_bodies.append(kwargs["json"]) return _FakeResponse(next(self._responses)) + def get(self, _url: str, **_kwargs: Any) -> _FakeResponse: + return _FakeResponse(next(self._responses)) + + +@pytest.mark.asyncio +async def test_dispatch_request_forwards_timeout( + monkeypatch: pytest.MonkeyPatch, +) -> None: + fake_session = _FakeSession( + [ + {"requestId": "request-123"}, + {"status": "success", "response": None}, + ] + ) + monkeypatch.setattr("narada.window.aiohttp.ClientSession", lambda: fake_session) + window = RemoteBrowserWindow(browser_window_id="bw-1", api_key="test-key") + + response = await window.dispatch_request(prompt="hello", timeout=17) + + assert response["status"] == "success" + assert fake_session.post_bodies[0]["timeout"] == 17 + @pytest.mark.asyncio async def test_prompt_for_user_input_uses_hitl_default_timeout(