from typing import List, Optional, Dict, Any from pydantic import BaseModel, Field from enum import Enum import time # --- Enums --- class SessionStatus(str, Enum): ACTIVE = "active" STOPPED = "stopped" ARCHIVED = "archived" class MessageRole(str, Enum): USER = "user" ASSISTANT = "assistant" SYSTEM = "system" TOOL = "tool" # --- Entities --- class Message(BaseModel): role: MessageRole content: str timestamp: int = Field(default_factory=lambda: int(time.time())) tool_calls: Optional[List[Dict[str, Any]]] = None tool_call_id: Optional[str] = None class Session(BaseModel): session_id: str title: str created_at: int = Field(default_factory=lambda: int(time.time())) updated_at: int = Field(default_factory=lambda: int(time.time())) status: SessionStatus = SessionStatus.ACTIVE messages: List[Message] = [] metadata: Dict[str, Any] = {} # --- API Request/Response Models --- class StandardResponse(BaseModel): code: int msg: str data: Optional[Any] = None class SessionResponse(BaseModel): session_id: str title: str latest_message: Optional[str] = None latest_message_at: Optional[int] = None status: SessionStatus unread_message_count: int = 0 class SessionDetailResponse(BaseModel): session_id: str title: str events: List[Dict[str, Any]] = [] # Simplified for now, can be specific Event models class ChatRequest(BaseModel): message: str timestamp: Optional[int] = None event_id: Optional[str] = None class ShellRequest(BaseModel): session_id: str class FileRequest(BaseModel): file: str class ShellResponse(BaseModel): output: str session_id: str console: List[Dict[str, str]] class FileResponse(BaseModel): content: str file: str