diff --git a/packages/narada-core/src/narada_core/actions/models.py b/packages/narada-core/src/narada_core/actions/models.py index 900529f..badc434 100644 --- a/packages/narada-core/src/narada_core/actions/models.py +++ b/packages/narada-core/src/narada_core/actions/models.py @@ -187,15 +187,19 @@ class AgenticSelectorRequest(BaseModel): action: AgenticSelectorAction selectors: AgenticSelectors fallback_operator_query: str + pre_cond: str | None = None @override def model_dump(self) -> dict[str, Any]: - return { + result = { "name": self.name, "action": _dump_agentic_selector_action(self.action), "selectors": _dump_agentic_selectors(self.selectors), "fallback_operator_query": self.fallback_operator_query, } + if self.pre_cond is not None: + result["pre_cond"] = self.pre_cond + return result class AgenticSelectorResponse(BaseModel): diff --git a/packages/narada-pyodide/src/narada/window.py b/packages/narada-pyodide/src/narada/window.py index 2b820da..dc7dc68 100644 --- a/packages/narada-pyodide/src/narada/window.py +++ b/packages/narada-pyodide/src/narada/window.py @@ -795,12 +795,16 @@ async def agentic_selector( action: AgenticSelectorAction, selectors: AgenticSelectors, fallback_operator_query: str, + pre_cond: str | None = None, # Larger default timeout because Operator can take a bit to run. timeout: int | None = 300, ) -> AgenticSelectorResponse: """Performs an action on an element specified by the given selectors, falling back to using the Operator agent if the selectors fail to match a unique element. + If ``pre_cond`` is provided, it is checked only after selector failure and before the + Operator fallback runs. A failed precondition raises ``NaradaError`` and prevents fallback. + Returns AgenticSelectorResponse with the value for 'get_text' and 'get_property' actions, otherwise returns None. """ @@ -815,6 +819,7 @@ async def agentic_selector( action=action, selectors=selectors, fallback_operator_query=fallback_operator_query, + pre_cond=pre_cond, ), response_model, timeout=timeout, diff --git a/packages/narada/src/narada/window.py b/packages/narada/src/narada/window.py index b1eb2f2..31f3b83 100644 --- a/packages/narada/src/narada/window.py +++ b/packages/narada/src/narada/window.py @@ -730,11 +730,15 @@ async def agentic_selector( action: AgenticSelectorAction, selectors: AgenticSelectors, fallback_operator_query: str, + pre_cond: str | None = None, # Larger default timeout because Operator can take a bit to run. timeout: int | None = 300, ) -> AgenticSelectorResponse: """Performs an action on an element specified by the given selectors, falling back to using the Operator agent if the selectors fail to match a unique element. + + If ``pre_cond`` is provided, it is checked only after selector failure and before the + Operator fallback runs. A failed precondition raises ``NaradaError`` and prevents fallback. """ response_model = ( AgenticSelectorResponse @@ -746,6 +750,7 @@ async def agentic_selector( action=action, selectors=selectors, fallback_operator_query=fallback_operator_query, + pre_cond=pre_cond, ), response_model=response_model, timeout=timeout,