feat: add node-registry dashboard, matrix-presence-aggregator, ocr-service updates
This commit is contained in:
@@ -21,20 +21,33 @@ class AgentsSource:
|
||||
- display_name
|
||||
- kind
|
||||
- status
|
||||
- room_id (current_room_id)
|
||||
- room_id
|
||||
- color
|
||||
- node_id
|
||||
- district
|
||||
- model
|
||||
- role
|
||||
- avatar_url
|
||||
"""
|
||||
query = text("""
|
||||
SELECT
|
||||
id as agent_id,
|
||||
display_name,
|
||||
kind,
|
||||
status,
|
||||
current_room_id as room_id,
|
||||
color
|
||||
FROM agents
|
||||
WHERE status IN ('online', 'busy')
|
||||
ORDER BY display_name
|
||||
a.id as agent_id,
|
||||
a.display_name,
|
||||
a.kind,
|
||||
a.status,
|
||||
COALESCE(cr.id, a.current_room_id) as room_id,
|
||||
COALESCE(a.color_hint, a.color, 'cyan') as color,
|
||||
a.node_id,
|
||||
a.district,
|
||||
a.model,
|
||||
a.role,
|
||||
a.avatar_url,
|
||||
a.primary_room_slug
|
||||
FROM agents a
|
||||
LEFT JOIN city_rooms cr ON cr.slug = a.primary_room_slug
|
||||
WHERE a.status IN ('online', 'busy')
|
||||
AND (a.is_active = true OR a.is_active IS NULL)
|
||||
ORDER BY a.display_name
|
||||
""")
|
||||
|
||||
try:
|
||||
@@ -69,17 +82,25 @@ class AgentsSource:
|
||||
return []
|
||||
|
||||
def get_all_agents(self) -> List[Dict]:
|
||||
"""Get all agents (including offline)"""
|
||||
"""Get all active agents (including offline)"""
|
||||
query = text("""
|
||||
SELECT
|
||||
id as agent_id,
|
||||
display_name,
|
||||
kind,
|
||||
status,
|
||||
current_room_id as room_id,
|
||||
color
|
||||
FROM agents
|
||||
ORDER BY display_name
|
||||
a.id as agent_id,
|
||||
a.display_name,
|
||||
a.kind,
|
||||
a.status,
|
||||
COALESCE(cr.id, a.current_room_id) as room_id,
|
||||
COALESCE(a.color_hint, a.color, 'cyan') as color,
|
||||
a.node_id,
|
||||
a.district,
|
||||
a.model,
|
||||
a.role,
|
||||
a.avatar_url,
|
||||
a.primary_room_slug
|
||||
FROM agents a
|
||||
LEFT JOIN city_rooms cr ON cr.slug = a.primary_room_slug
|
||||
WHERE a.is_active = true OR a.is_active IS NULL
|
||||
ORDER BY a.display_name
|
||||
""")
|
||||
|
||||
try:
|
||||
|
||||
@@ -86,7 +86,12 @@ class PresenceAggregator:
|
||||
kind=agent.get("kind", "assistant"),
|
||||
status=agent.get("status", "online"),
|
||||
room_id=agent.get("room_id"),
|
||||
color=agent.get("color", "cyan")
|
||||
color=agent.get("color", "cyan"),
|
||||
node_id=agent.get("node_id"),
|
||||
district=agent.get("district"),
|
||||
model=agent.get("model"),
|
||||
role=agent.get("role"),
|
||||
avatar_url=agent.get("avatar_url"),
|
||||
)
|
||||
all_agents.append(ap)
|
||||
|
||||
|
||||
@@ -103,6 +103,7 @@ async def health():
|
||||
|
||||
|
||||
@app.get("/presence/summary")
|
||||
@app.get("/presence/snapshot")
|
||||
async def get_presence_summary():
|
||||
"""
|
||||
Get current presence snapshot.
|
||||
|
||||
@@ -8,10 +8,15 @@ class AgentPresence(BaseModel):
|
||||
"""Agent presence in a room"""
|
||||
agent_id: str
|
||||
display_name: str
|
||||
kind: str = "assistant" # assistant, civic, oracle, builder
|
||||
kind: str = "assistant" # assistant, civic, oracle, builder, vision, etc.
|
||||
status: str = "offline" # online, offline, busy
|
||||
room_id: Optional[str] = None
|
||||
color: Optional[str] = None
|
||||
node_id: Optional[str] = None # Node where agent runs (node-1-hetzner, node-2-macbook)
|
||||
district: Optional[str] = None # City district (leadership, engineering, etc.)
|
||||
model: Optional[str] = None # LLM model used by agent
|
||||
role: Optional[str] = None # Agent's role description
|
||||
avatar_url: Optional[str] = None # Agent avatar URL
|
||||
|
||||
|
||||
class RoomPresence(BaseModel):
|
||||
|
||||
Reference in New Issue
Block a user