"""Pydantic input/output models for the AI tool layer. Input models double as JSON Schemas advertised to LLMs (via ``model_json_schema``) and as validation for arguments received over MCP. """ from __future__ import annotations from typing import Any from pydantic import BaseModel, Field class ListVaultsInput(BaseModel): """No parameters — lists the vaults the caller can access.""" class ListDirectoryInput(BaseModel): """Browse a directory inside a vault.""" vault: str = Field(..., description="Vault name") path: str = Field("", description="Vault-relative directory path (empty = vault root)") class ReadFileInput(BaseModel): """Read a text file's content from a vault.""" vault: str = Field(..., description="Vault name") path: str = Field(..., description="Vault-relative file path") class SearchFulltextInput(BaseModel): """Full-text search across one or all accessible vaults.""" q: str = Field(..., min_length=1, description="Search query") vault: str = Field("all", description="Vault name or 'all'") tag: str | None = Field(None, description="Optional comma-separated tag filter") limit: int = Field(50, ge=1, le=200, description="Maximum number of results") class ListTagsInput(BaseModel): """List tags and their occurrence counts.""" vault: str | None = Field(None, description="Vault name or 'all' (default: all accessible)") class ToolResult(BaseModel): """Uniform result returned by :func:`backend.tools.registry.call_tool`.""" ok: bool = True data: Any = None error: str | None = None