from __future__ import annotations
from typing import Any, Callable
from .client import AsyncA1Client, A1Client, IntentSpec
def a1_tool(
tool: Any,
chain: Any,
executor_pk_hex: str,
intent_name: str,
intent_params: dict[str, str] | None = None,
gateway_url: str | None = None,
) -> Any:
client = A1Client(gateway_url)
original_invoke = tool.invoke
def guarded_invoke(input: Any, **kwargs: Any) -> Any:
client.authorize(
chain=chain,
intent_name=intent_name,
executor_pk_hex=executor_pk_hex,
intent_params=intent_params,
)
return original_invoke(input, **kwargs)
tool.invoke = guarded_invoke
return tool
def async_a1_tool(
tool: Any,
chain: Any,
executor_pk_hex: str,
intent_name: str,
intent_params: dict[str, str] | None = None,
gateway_url: str | None = None,
) -> Any:
original_ainvoke = tool.ainvoke
async def guarded_ainvoke(input: Any, **kwargs: Any) -> Any:
async with AsyncA1Client(gateway_url) as c:
await c.authorize(
chain=chain,
intent_name=intent_name,
executor_pk_hex=executor_pk_hex,
intent_params=intent_params,
)
return await original_ainvoke(input, **kwargs)
tool.ainvoke = guarded_ainvoke
return tool