diff --git a/examples/get_url.py b/examples/get_url.py new file mode 100644 index 0000000..d2edaa7 --- /dev/null +++ b/examples/get_url.py @@ -0,0 +1,17 @@ +import asyncio + +from narada import Narada +from narada_core.actions.models import parse_action_trace + + +async def main() -> None: + async with Narada() as narada: + window = await narada.open_and_initialize_browser_window() + + await window.go_to_url(url="https://www.google.com", timeout=60) + result = await window.get_url(timeout=30) + print(f"Current URL: {result.url}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/packages/narada-core/src/narada_core/actions/models.py b/packages/narada-core/src/narada_core/actions/models.py index 61cfde7..220fa3b 100644 --- a/packages/narada-core/src/narada_core/actions/models.py +++ b/packages/narada-core/src/narada_core/actions/models.py @@ -36,6 +36,12 @@ class GoToUrlTrace(BaseModel): description: str +class GetUrlTrace(BaseModel): + step_type: Literal["getUrl"] + url: str + description: str + + class PrintTrace(BaseModel): step_type: Literal["print"] url: str @@ -154,6 +160,7 @@ class GetScreenshotTrace(BaseModel): ApaStepTrace = Annotated[ GoToUrlTrace + | GetUrlTrace | PrintTrace | AgentTrace | ForLoopTrace @@ -484,6 +491,14 @@ class GetScreenshotResponse(BaseModel): timestamp: str +class GetUrlRequest(BaseModel): + name: Literal["get_url"] = "get_url" + + +class GetUrlResponse(BaseModel): + url: str + + type ExtensionActionRequest = ( AgenticSelectorRequest | AgenticMouseActionRequest @@ -495,6 +510,7 @@ class GetScreenshotResponse(BaseModel): | GetFullHtmlRequest | GetSimplifiedHtmlRequest | GetScreenshotRequest + | GetUrlRequest ) diff --git a/packages/narada-core/src/narada_core/models.py b/packages/narada-core/src/narada_core/models.py index be1ab0f..48bc0cb 100644 --- a/packages/narada-core/src/narada_core/models.py +++ b/packages/narada-core/src/narada_core/models.py @@ -81,6 +81,12 @@ class GoToUrlTrace(TypedDict): description: str +class GetUrlTrace(TypedDict): + step_type: Literal["getUrl"] + url: str + description: str + + class PrintTrace(TypedDict): step_type: Literal["print"] url: str @@ -199,6 +205,7 @@ class GetScreenshotTrace(TypedDict): ApaStepTrace = ( GoToUrlTrace + | GetUrlTrace | PrintTrace | AgentTrace | ForLoopTrace diff --git a/packages/narada-pyodide/src/narada/window.py b/packages/narada-pyodide/src/narada/window.py index 02e85a0..732c8ef 100644 --- a/packages/narada-pyodide/src/narada/window.py +++ b/packages/narada-pyodide/src/narada/window.py @@ -25,6 +25,8 @@ GetScreenshotResponse, GetSimplifiedHtmlRequest, GetSimplifiedHtmlResponse, + GetUrlRequest, + GetUrlResponse, GoToUrlRequest, PrintMessageRequest, ReadGoogleSheetRequest, @@ -448,6 +450,15 @@ async def go_to_url( GoToUrlRequest(url=url, new_tab=new_tab), timeout=timeout ) + async def get_url(self, *, timeout: int | None = None) -> str: + """Gets the URL of the current active page.""" + result = await self._run_extension_action( + GetUrlRequest(), + GetUrlResponse, + timeout=timeout, + ) + return result.url + async def print_message(self, *, message: str, timeout: int | None = None) -> None: """Prints a message in the Narada extension side panel chat.""" return await self._run_extension_action( diff --git a/packages/narada/src/narada/window.py b/packages/narada/src/narada/window.py index 01ca230..1be90e5 100644 --- a/packages/narada/src/narada/window.py +++ b/packages/narada/src/narada/window.py @@ -26,6 +26,8 @@ GetScreenshotResponse, GetSimplifiedHtmlRequest, GetSimplifiedHtmlResponse, + GetUrlRequest, + GetUrlResponse, GoToUrlRequest, PrintMessageRequest, ReadGoogleSheetRequest, @@ -422,6 +424,14 @@ async def go_to_url( GoToUrlRequest(url=url, new_tab=new_tab), timeout=timeout ) + async def get_url(self, *, timeout: int | None = None) -> GetUrlResponse: + """Gets the URL of the current active page.""" + return await self._run_extension_action( + GetUrlRequest(), + GetUrlResponse, + timeout=timeout, + ) + async def print_message(self, *, message: str, timeout: int | None = None) -> None: """Prints a message in the Narada extension side panel chat.""" return await self._run_extension_action(