Files
microdao-daarion/services/router
Apple 129e4ea1fc feat(platform): add new services, tools, tests and crews modules
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
2026-03-03 07:14:14 -08:00
..
2026-01-10 04:53:17 -08:00

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.decision events
  • Agent Invocation: Creates and publishes router.invoke.agent messages
  • 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:

  1. Only process decision == "allow"
  2. Ensure target_agent_id is present
  3. Create AgentInvocation with channel context
  4. 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:

  1. Is router subscribed to NATS?
  2. Is agent-filter publishing decisions?
  3. Are decisions "allow"?
  4. 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