from datetime import datetime from typing import Literal from pydantic import BaseModel, Field TerminalMode = Literal[1, 2, 3] SearchProvider = Literal["brave", "searxng"] class HealthStatus(BaseModel): service: str = "wiseclaw" status: str = "ok" timestamp: datetime = Field(default_factory=datetime.utcnow) class SettingRecord(BaseModel): key: str value: str updated_at: datetime = Field(default_factory=datetime.utcnow) class ToolToggle(BaseModel): name: str enabled: bool class UserRecord(BaseModel): telegram_user_id: int username: str | None = None display_name: str | None = None is_active: bool = True class RuntimeSettings(BaseModel): terminal_mode: TerminalMode = 3 search_provider: SearchProvider = "brave" ollama_base_url: str = "http://127.0.0.1:11434" default_model: str = "qwen3.5:4b" tools: list[ToolToggle] = Field( default_factory=lambda: [ ToolToggle(name="brave_search", enabled=True), ToolToggle(name="searxng_search", enabled=False), ToolToggle(name="web_fetch", enabled=True), ToolToggle(name="apple_notes", enabled=True), ToolToggle(name="files", enabled=True), ToolToggle(name="terminal", enabled=True), ] ) class DashboardSnapshot(BaseModel): settings: RuntimeSettings whitelist_count: int memory_items: int recent_logs: list[str] class MemoryRecord(BaseModel): id: int content: str kind: str created_at: datetime class OllamaStatus(BaseModel): reachable: bool base_url: str model: str installed_models: list[str] = Field(default_factory=list) message: str class TelegramStatus(BaseModel): configured: bool polling_active: bool message: str