Source code for dogwood.integrations.strands.common
from __future__ import annotations
from collections.abc import Callable, Mapping
from typing import Any
InputMapper = Callable[[Any], dict[str, Any]]
IdentityResolver = Callable[[Any], str]
[docs]
def default_principal(event: Any) -> str:
"""Resolve the Cedar principal from Strands invocation state."""
state = getattr(event, "invocation_state", {}) or {}
return str(state.get("principal", 'Drupe::OAuthUser::"agent"'))
[docs]
def default_resource(event: Any) -> str:
"""Resolve the Cedar resource from Strands invocation state."""
state = getattr(event, "invocation_state", {}) or {}
return str(state.get("resource", 'Drupe::Gateway::"agent"'))
def _authorize_event(policy_hook: Any, event: Any) -> Any:
return policy_hook.authorizer.authorize_request(
policy_hook.action,
_resolve(policy_hook.principal, event),
_resolve(policy_hook.resource, event),
policy_hook.input_mapper(event),
)
def _is_allowed(decision: Any) -> bool:
return decision == "Allow"
def _tool_use(event: Any) -> Any:
return getattr(event, "tool_use", {})
def _tool_value(tool_use: Any, key: str, default: Any) -> Any:
if isinstance(tool_use, Mapping):
return tool_use.get(key, default)
return getattr(tool_use, key, default)
def _resolve(value: str | IdentityResolver, event: Any) -> str:
if callable(value):
return value(event)
return value
__all__ = [
"IdentityResolver",
"InputMapper",
"default_principal",
"default_resource",
"default_tool_input",
]