New router intelligence modules (26 files): alert_ingest/store, audit_store, architecture_pressure, backlog_generator/store, cost_analyzer, data_governance, dependency_scanner, drift_analyzer, incident_* (5 files), llm_enrichment, platform_priority_digest, provider_budget, release_check_runner, risk_* (6 files), signature_state_store, sofiia_auto_router, tool_governance New services: - sofiia-console: Dockerfile, adapters/, monitor/nodes/ops/voice modules, launchd, react static - memory-service: integration_endpoints, integrations, voice_endpoints, static UI - aurora-service: full app suite (analysis, job_store, orchestrator, reporting, schemas, subagents) - sofiia-supervisor: new supervisor service - aistalk-bridge-lite: Telegram bridge lite - calendar-service: CalDAV calendar service with reminders - mlx-stt-service / mlx-tts-service: Apple Silicon speech services - binance-bot-monitor: market monitor service - node-worker: STT/TTS memory providers New tools (9): agent_email, browser_tool, contract_tool, observability_tool, oncall_tool, pr_reviewer_tool, repo_tool, safe_code_executor, secure_vault New crews: agromatrix_crew (10 modules: depth_classifier, doc_facts, doc_focus, farm_state, light_reply, llm_factory, memory_manager, proactivity, reflection_engine, session_context, style_adapter, telemetry) Tests: 85+ test files for all new modules Made-with: Cursor
DAGI Router Service
Routes events to appropriate agents and services
Purpose
DAGI Router is the central orchestrator that routes various events (filter decisions, direct invocations, scheduled jobs) to agent-runtime for execution.
Features
- Filter Decision Routing: Processes
agent.filter.decisionevents - Agent Invocation: Creates and publishes
router.invoke.agentmessages - Configurable: YAML-based routing configuration
- Test Mode: HTTP endpoint for testing routing logic
Architecture
agent.filter.decision (NATS)
↓
router: Create AgentInvocation
↓
router.invoke.agent (NATS)
↓
agent-runtime (subscribes)
Routing Rules
Messaging Inbound (Phase 2)
Input: agent.filter.decision (from agent-filter)
Output: router.invoke.agent (to agent-runtime)
Logic:
- Only process
decision == "allow" - Ensure
target_agent_idis present - Create
AgentInvocationwith channel context - Publish to NATS
Future Rules (Phase 3+)
- Direct agent invocations (API calls)
- Scheduled/cron invocations
- Webhook-triggered invocations
- Agent-to-agent communication
API
Health Check
GET /health
Response:
{
"status": "ok",
"service": "router",
"version": "1.0.0",
"nats_connected": true,
"messaging_inbound_enabled": true
}
Test Routing (Manual)
POST /internal/router/test-messaging
Content-Type: application/json
{
"channel_id": "test-channel",
"matrix_event_id": "$event123",
"microdao_id": "microdao:daarion",
"decision": "allow",
"target_agent_id": "agent:sofia"
}
Response:
{
"agent_id": "agent:sofia",
"entrypoint": "channel_message",
"payload": {
"channel_id": "test-channel",
"matrix_event_id": "$event123",
"microdao_id": "microdao:daarion",
"rewrite_prompt": null
}
}
Configuration
File: router_config.yaml
messaging_inbound:
enabled: true
source_subject: "agent.filter.decision"
target_subject: "router.invoke.agent"
Environment Variables
NATS_URL: NATS server URL (default:nats://nats:4222)
Running Locally
Install Dependencies
pip install -r requirements.txt
Run Service
uvicorn main:app --reload --port 8000
Test
# Health check
curl http://localhost:8000/health
# Test routing
curl -X POST http://localhost:8000/internal/router/test-messaging \
-H "Content-Type: application/json" \
-d '{
"channel_id": "test-123",
"matrix_event_id": "$test",
"microdao_id": "microdao:daarion",
"decision": "allow",
"target_agent_id": "agent:sofia"
}'
Docker
Build
docker build -t daarion/router:latest .
Run
docker run -p 8000:8000 \
-e NATS_URL=nats://nats:4222 \
daarion/router:latest
NATS Events
Subscribes To
- Subject:
agent.filter.decision - Payload:
FilterDecision
Publishes To
- Subject:
router.invoke.agent - Payload:
AgentInvocation
Monitoring
Logs
docker logs -f router
# Look for:
# ✅ Connected to NATS
# ✅ Subscribed to agent.filter.decision
# 🔀 Processing filter decision
# ✅ Decision: allow
# 🚀 Created invocation for agent:sofia
# ✅ Published invocation
Troubleshooting
Not Routing Messages
Check:
- Is router subscribed to NATS?
- Is agent-filter publishing decisions?
- Are decisions "allow"?
- Is target_agent_id present?
# Check NATS subscription
docker exec -it router cat /app/router_config.yaml
# Test routing logic
curl -X POST http://localhost:8000/internal/router/test-messaging \
-d @test_decision.json
Future Enhancements
- Multiple routing strategies
- Agent load balancing
- Priority queues
- Rate limiting per agent
- Retry logic
- Dead letter queue
- Routing analytics
Version
Current: 1.0.0
Status: Production Ready (Phase 2)
Last Updated: 2025-11-24