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,74 @@
import httpx
import os
LLM_PROXY_URL = os.getenv("LLM_PROXY_URL", "http://llm-proxy:7007")
async def generate_response(model: str, messages: list[dict], max_tokens: int = 1000) -> str:
"""
Call LLM Proxy to generate response
Falls back to mock response if LLM Proxy is not available
"""
try:
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.post(
f"{LLM_PROXY_URL}/internal/llm/proxy",
headers={
"X-Internal-Secret": os.getenv("LLM_PROXY_SECRET", "dev-secret-token"),
"Content-Type": "application/json"
},
json={
"model": model,
"messages": messages,
"max_tokens": max_tokens,
"metadata": {
"agent_id": "agent:runtime",
"microdao_id": "microdao:daarion"
}
}
)
response.raise_for_status()
data = response.json()
return data.get("content", "")
except httpx.HTTPStatusError as e:
print(f"⚠️ LLM Proxy HTTP error: {e.response.status_code}")
return await generate_mock_response(messages)
except httpx.ConnectError:
print(f"⚠️ LLM Proxy not available, using mock response")
return await generate_mock_response(messages)
except Exception as e:
print(f"⚠️ LLM error: {e}")
return await generate_mock_response(messages)
async def generate_mock_response(messages: list[dict]) -> str:
"""
Generate mock response based on user message
This is used when LLM Proxy is not available (Phase 2 testing)
"""
# Extract last user message
user_message = ""
for msg in reversed(messages):
if msg.get("role") == "user":
user_message = msg.get("content", "").lower()
break
# Simple keyword-based responses
if "привіт" in user_message or "hello" in user_message or "hi" in user_message:
return "Привіт! Я Sofia, асистент команди DAARION. Як можу допомогти?"
if "допомож" in user_message or "help" in user_message:
return "Звичайно! Я можу допомогти з:\n- Плануванням задач\n- Підсумуванням обговорень\n- Організацією проєктів\n- Відповідями на питання про систему\n\nПро що хочете поговорити?"
if "дяку" in user_message or "thank" in user_message:
return "Завжди радий допомогти! 😊"
if "phase 2" in user_message or "фаза 2" in user_message:
return "Phase 2 — це інтеграція агентів у Messenger! Я вже працюю через agent-runtime, agent-filter та DAGI Router. Це дозволяє мені автоматично відповідати на повідомлення в каналах. 🚀"
if "?" in user_message:
return "Це цікаве питання! На даний момент я використовую mock LLM (Phase 2 testing mode). Коли буде підключено справжній LLM Proxy, я зможу давати більш розгорнуті відповіді."
# Default response
return "Дякую за повідомлення! Я Sofia, і я тут щоб допомогти. Зараз працюю в тестовому режимі (Phase 2), але скоро буду підключена до повноцінного LLM. Що вас цікавить?"