feat: initialize interactive live-stream game backend MVP

- Add FastAPI backend with WebSocket support
- Implement ConnectionManager for client connections
- Create GameEngine with async game loop (2s tick)
- Add RuleBasedAgent for keyword-based responses
- Define Pydantic schemas for GameEvent protocol
- Create debug frontend dashboard for testing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
empty
2025-12-30 14:58:38 +08:00
commit 714b5824ba
10 changed files with 834 additions and 0 deletions

53
backend/app/schemas.py Normal file
View File

@@ -0,0 +1,53 @@
"""
Pydantic models for the JSON protocol.
Defines standardized structures for game events and messages.
"""
from enum import Enum
from typing import Any
from pydantic import BaseModel, Field
import time
class EventType(str, Enum):
"""Enumeration of all possible game event types."""
COMMENT = "comment"
AGENT_RESPONSE = "agent_response"
TICK = "tick"
SYSTEM = "system"
ERROR = "error"
class GameEvent(BaseModel):
"""
Standardized game event structure for WebSocket communication.
Attributes:
event_type: The type of event (comment, agent_response, tick, etc.)
timestamp: Unix timestamp when the event was created
data: Arbitrary payload data for the event
"""
event_type: str = Field(..., description="Type of the game event")
timestamp: float = Field(default_factory=time.time, description="Unix timestamp")
data: dict[str, Any] = Field(default_factory=dict, description="Event payload")
class Config:
json_schema_extra = {
"example": {
"event_type": "comment",
"timestamp": 1704067200.0,
"data": {"user": "User123", "message": "Attack!"}
}
}
class ClientMessage(BaseModel):
"""
Message structure for client-to-server communication.
Attributes:
action: The action the client wants to perform
payload: Data associated with the action
"""
action: str = Field(..., description="Action to perform")
payload: dict[str, Any] = Field(default_factory=dict, description="Action payload")