feat: Add presence heartbeat for Matrix online status

- matrix-gateway: POST /internal/matrix/presence/online endpoint
- usePresenceHeartbeat hook with activity tracking
- Auto away after 5 min inactivity
- Offline on page close/visibility change
- Integrated in MatrixChatRoom component
This commit is contained in:
Apple
2025-11-27 00:19:40 -08:00
parent 5bed515852
commit 3de3c8cb36
6371 changed files with 1317450 additions and 932 deletions

View File

@@ -0,0 +1,68 @@
"""
Pydantic Models для Second Me Service
"""
from pydantic import BaseModel, Field
from typing import Optional, List
from datetime import datetime
# =============================================================================
# Second Me Session
# =============================================================================
class SecondMeSession(BaseModel):
id: str
user_id: str
agent_id: Optional[str] = None
created_at: datetime
last_interaction_at: Optional[datetime] = None
# =============================================================================
# Second Me Message
# =============================================================================
class SecondMeMessageBase(BaseModel):
content: str = Field(..., min_length=1, max_length=10000)
class SecondMeMessageCreate(SecondMeMessageBase):
role: str = Field(..., pattern="^(user|assistant)$")
class SecondMeMessageRead(SecondMeMessageBase):
id: str
session_id: str
user_id: str
role: str
tokens_used: Optional[int] = None
latency_ms: Optional[int] = None
created_at: datetime
# =============================================================================
# Second Me Invoke
# =============================================================================
class SecondMeInvokePayload(BaseModel):
prompt: str = Field(..., min_length=1, max_length=5000)
class SecondMeInvokeResponse(BaseModel):
response: str
tokens_used: int
latency_ms: int
history: List[dict] = []
# =============================================================================
# Second Me Profile
# =============================================================================
class SecondMeProfile(BaseModel):
user_id: str
agent_id: str
total_interactions: int
last_interaction: Optional[datetime] = None