from datetime import datetime from typing import Literal from pydantic import BaseModel, Field TerminalMode = Literal[1, 2, 3] SearchProvider = Literal["brave", "searxng"] ModelProvider = Literal["local", "zai"] AutomationScheduleType = Literal["daily", "weekdays", "weekly", "hourly"] AutomationStatus = Literal["active", "paused"] 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 UserProfileRecord(BaseModel): telegram_user_id: int display_name: str | None = None bio: str | None = None occupation: str | None = None primary_use_cases: list[str] = Field(default_factory=list) answer_priorities: list[str] = Field(default_factory=list) tone_preference: str | None = None response_length: str | None = None language_preference: str | None = None workflow_preference: str | None = None interests: list[str] = Field(default_factory=list) approval_preferences: list[str] = Field(default_factory=list) avoid_preferences: str | None = None onboarding_completed: bool = False last_onboarding_step: int = 0 class RuntimeSettings(BaseModel): terminal_mode: TerminalMode = 3 search_provider: SearchProvider = "brave" model_provider: ModelProvider = "local" local_base_url: str = "http://127.0.0.1:1234" local_model: str = "qwen3-vl-8b-instruct-mlx@5bit" zai_model: Literal["glm-4.7", "glm-5"] = "glm-5" anythingllm_base_url: str = "http://127.0.0.1:3001" anythingllm_workspace_slug: str = "benim-calisma-alanim" tools: list[ToolToggle] = Field( default_factory=lambda: [ ToolToggle(name="brave_search", enabled=True), ToolToggle(name="second_brain", enabled=True), ToolToggle(name="browser_use", enabled=True), ToolToggle(name="gmail", enabled=True), ToolToggle(name="google_drive", 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 provider: ModelProvider = "local" 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 class GoogleIntegrationStatus(BaseModel): client_configured: bool connected: bool connect_url: str message: str class AnythingLLMStatus(BaseModel): reachable: bool workspace_found: bool base_url: str workspace_slug: str message: str class AutomationRecord(BaseModel): id: int telegram_user_id: int name: str prompt: str schedule_type: AutomationScheduleType interval_hours: int | None = None time_of_day: str | None = None days_of_week: list[str] = Field(default_factory=list) status: AutomationStatus = "active" last_run_at: datetime | None = None next_run_at: datetime | None = None last_result: str | None = None created_at: datetime updated_at: datetime