# platform/interface.py from __future__ import annotations from datetime import datetime from typing import Any, Protocol from pydantic import BaseModel class User(BaseModel): user_id: str external_id: str platform: str display_name: str | None = None created_at: datetime is_new: bool = False class MessageResponse(BaseModel): message_id: str response: str tokens_used: int finished: bool class UserSettings(BaseModel): skills: dict[str, bool] = {} connectors: dict[str, dict] = {} soul: dict[str, str] = {} safety: dict[str, bool] = {} plan: dict[str, Any] = {} class PlatformError(Exception): def __init__(self, message: str, code: str = "PLATFORM_ERROR"): super().__init__(message) self.code = code class PlatformClient(Protocol): async def get_or_create_user( self, external_id: str, platform: str, display_name: str | None = None, ) -> User: ... # Master manages container lifecycle — bot only sends user_id + chat_id. async def send_message( self, user_id: str, chat_id: str, text: str, attachments: list | None = None, ) -> MessageResponse: ... async def get_settings(self, user_id: str) -> UserSettings: ... async def update_settings(self, user_id: str, action: Any) -> None: ...