feat(M1+M2): Agent Node API — admin-owned nodes, group access, DB persistence
DB Models:
- AgentNode: admin-owned, display_name, skill_config toggles (shell/browser/sync),
  invite_token, is_active, last_status/last_seen_at persisted on every connect
- NodeGroupAccess: admin grants groups access with access_level (view/use/admin)
- Migration updated for all new columns + node_group_access table

NodeRegistryService (M2 persistence):
- register() → upserts AgentNode in DB (status=online)
- deregister() → marks AgentNode offline in DB, keeps record for UI
- update_stats() → bumps last_seen_at on every heartbeat
- EventBus with 20 event types: per-node + per-user WS fan-out
- Uses get_db_session() context manager (no extra deps)

API (13 routes):
Admin:
  POST   /nodes/admin              — Create node + generate invite_token
  GET    /nodes/admin              — List all nodes (full detail)
  GET    /nodes/admin/{id}         — Node detail incl. invite_token
  PATCH  /nodes/admin/{id}         — Update skill_config toggles, description
  POST   /nodes/admin/{id}/access  — Grant group access
  DELETE /nodes/admin/{id}/access/{group_id} — Revoke group access
User:
  GET    /nodes/                   — List user-accessible nodes (group-filtered)
  GET    /nodes/{id}/status        — Quick probe
  POST   /nodes/{id}/dispatch      — Dispatch task
  PATCH  /nodes/preferences        — Set default_node_ids + data_source config
  GET    /nodes/preferences        — Read node preferences
WebSocket:
  WS     /nodes/{id}/stream        — Single node live execution stream
  WS     /nodes/stream/all         — Multi-node global bus (split-pane UI)
1 parent f5f1e85 commit 856ace042eace2e7d62fe4f942d3f55d2da119a6
@Antigravity AI Antigravity AI authored 15 hours ago
Showing 6 changed files
View
ai-hub/app/api/routes/nodes.py
View
ai-hub/app/api/schemas.py
View
ai-hub/app/core/services/node_registry.py
View
ai-hub/app/db/migrate.py
View
ai-hub/app/db/models.py
View
ai-hub/app/db/session.py