|
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)
|
|---|
|
|
| ai-hub/app/api/routes/nodes.py |
|---|
| ai-hub/app/api/schemas.py |
|---|
| ai-hub/app/core/services/node_registry.py |
|---|
| ai-hub/app/db/migrate.py |
|---|
| ai-hub/app/db/models.py |
|---|
| ai-hub/app/db/session.py |
|---|