"""
Domain-specific tool policy mappings.
This module defines the allowed tools and their policies for each domain
(Invoice, Contract, Vendor) and page type. Every tool MUST have a policy.
"""
from __future__ import annotations
from typing import Dict, Set
from src.core.tool_context import EntityType, PageType, ToolContextPolicy
# System tools (available everywhere)
SYSTEM_POLICIES: Dict[str, ToolContextPolicy] = {
# Core system tools
"echo": ToolContextPolicy(
allowed_page_types={PageType.DASHBOARD, PageType.SETTINGS, PageType.PROFILE},
requires_entity=False,
read_only=True
),
"get_system_info": ToolContextPolicy(
allowed_page_types={PageType.DASHBOARD, PageType.SETTINGS},
requires_entity=False,
read_only=True
),
"get_user_profile": ToolContextPolicy(
allowed_page_types={PageType.PROFILE, PageType.DASHBOARD},
requires_entity=False,
read_only=True
),
"list_organizations": ToolContextPolicy(
allowed_page_types={PageType.DASHBOARD},
requires_entity=False,
read_only=True
)
}
# Invoice domain policies
INVOICE_POLICIES: Dict[str, ToolContextPolicy] = {
# Table-level tools
"list_invoices": ToolContextPolicy(
allowed_page_types={PageType.INVOICE_TABLE},
requires_entity=False,
read_only=True
),
"bulk_approve_invoices": ToolContextPolicy(
allowed_page_types={PageType.INVOICE_TABLE},
requires_entity=False,
read_only=False
),
"export_invoices": ToolContextPolicy(
allowed_page_types={PageType.INVOICE_TABLE},
requires_entity=False,
read_only=True
),
# Detail-level tools
"get_invoice_details": ToolContextPolicy(
allowed_page_types={PageType.INVOICE_DETAIL},
requires_entity=True,
entity_type=EntityType.INVOICE,
read_only=True
),
"approve_invoice": ToolContextPolicy(
allowed_page_types={PageType.INVOICE_DETAIL},
requires_entity=True,
entity_type=EntityType.INVOICE,
read_only=False
),
"reject_invoice": ToolContextPolicy(
allowed_page_types={PageType.INVOICE_DETAIL},
requires_entity=True,
entity_type=EntityType.INVOICE,
read_only=False
),
# Creation tools
"create_invoice": ToolContextPolicy(
allowed_page_types={PageType.INVOICE_CREATE},
requires_entity=False,
read_only=False
)
}
# Contract domain policies
CONTRACT_POLICIES: Dict[str, ToolContextPolicy] = {
# Table-level tools
"list_contracts": ToolContextPolicy(
allowed_page_types={PageType.CONTRACT_TABLE},
requires_entity=False,
read_only=True
),
"export_contracts": ToolContextPolicy(
allowed_page_types={PageType.CONTRACT_TABLE},
requires_entity=False,
read_only=True
),
# Detail-level tools
"get_contract_details": ToolContextPolicy(
allowed_page_types={PageType.CONTRACT_DETAIL},
requires_entity=True,
entity_type=EntityType.CONTRACT,
read_only=True
),
"analyze_contract": ToolContextPolicy(
allowed_page_types={PageType.CONTRACT_DETAIL},
requires_entity=True,
entity_type=EntityType.CONTRACT,
read_only=True
),
"update_contract_status": ToolContextPolicy(
allowed_page_types={PageType.CONTRACT_DETAIL},
requires_entity=True,
entity_type=EntityType.CONTRACT,
read_only=False
),
# Creation tools
"upload_contract": ToolContextPolicy(
allowed_page_types={PageType.CONTRACT_CREATE},
requires_entity=False,
read_only=False
)
}
# Vendor domain policies
VENDOR_POLICIES: Dict[str, ToolContextPolicy] = {
# Table-level tools
"list_vendors": ToolContextPolicy(
allowed_page_types={
PageType.VENDOR_TABLE,
PageType.DASHBOARD,
PageType.ORGANIZATION_DETAIL,
PageType.PLATFORM_DETAIL,
PageType.DEALERSHIP_DETAIL
},
requires_entity=False,
read_only=True
),
"export_vendors": ToolContextPolicy(
allowed_page_types={PageType.VENDOR_TABLE},
requires_entity=False,
read_only=True
),
# Detail-level tools
"get_vendor_details": ToolContextPolicy(
allowed_page_types={PageType.VENDOR_DETAIL},
requires_entity=True,
entity_type=EntityType.VENDOR,
read_only=True
),
"get_vendor_contracts": ToolContextPolicy(
allowed_page_types={PageType.VENDOR_DETAIL},
requires_entity=True,
entity_type=EntityType.VENDOR,
read_only=True
),
"get_vendor_invoices": ToolContextPolicy(
allowed_page_types={PageType.VENDOR_DETAIL},
requires_entity=True,
entity_type=EntityType.VENDOR,
read_only=True
),
"update_vendor": ToolContextPolicy(
allowed_page_types={PageType.VENDOR_DETAIL},
requires_entity=True,
entity_type=EntityType.VENDOR,
read_only=False
),
# Creation tools
"create_vendor": ToolContextPolicy(
allowed_page_types={PageType.VENDOR_CREATE, PageType.VENDOR_TABLE},
requires_entity=False,
read_only=False
),
"create_vendor_simple": ToolContextPolicy(
allowed_page_types={PageType.VENDOR_CREATE, PageType.VENDOR_TABLE},
requires_entity=False,
read_only=False
),
# V2 tools
"list_vendors_v2": ToolContextPolicy(
allowed_page_types={
PageType.VENDOR_TABLE,
PageType.DASHBOARD,
PageType.ORGANIZATION_DETAIL,
PageType.PLATFORM_DETAIL,
PageType.DEALERSHIP_DETAIL
},
requires_entity=False,
read_only=True
)
}
# Combined policies
ALL_POLICIES: Dict[str, ToolContextPolicy] = {
**SYSTEM_POLICIES,
**INVOICE_POLICIES,
**CONTRACT_POLICIES,
**VENDOR_POLICIES
}
# Utility functions
def get_tools_for_page(page_type: PageType) -> Set[str]:
"""Get all tools allowed on a specific page type."""
return {
name for name, policy in ALL_POLICIES.items()
if policy.can_run_on_page(page_type)
}
def get_tools_for_entity(entity_type: EntityType) -> Set[str]:
"""Get all tools that operate on a specific entity type."""
return {
name for name, policy in ALL_POLICIES.items()
if policy.requires_entity and policy.entity_type == entity_type
}