Files
microdao-daarion/docker-compose.matrix-bridge-node1.yml
Apple cad3663508 feat(matrix-bridge-dagi): add egress, audit integration, fix router endpoint (PR-M1.4)
Closes the full Matrix ↔ DAGI loop:

Egress:
- invoke Router POST /v1/agents/{agent_id}/infer (field: prompt, response: response)
- send_text() reply to Matrix room with idempotent txn_id = make_txn_id(room_id, event_id)
- empty reply → skip send (no spam)
- reply truncated to 4000 chars if needed

Audit (via sofiia-console POST /api/audit/internal):
- matrix.message.received (on ingress)
- matrix.agent.replied (on successful reply)
- matrix.error (on router/send failure, with error_code)
- fire-and-forget: audit failures never crash the loop

Router URL fix:
- DAGI_GATEWAY_URL now points to dagi-router-node1:8000 (not gateway:9300)
- Session ID: stable per room — matrix:{room_localpart} (memory context)

9 tests: invoke endpoint, fallback fields, audit write, full cycle,
dedupe, empty reply skip, metric callbacks

Made-with: Cursor
2026-03-03 08:06:49 -08:00

68 lines
2.5 KiB
YAML

# Matrix Bridge DAGI — Phase M1
# Include into the main NODA1 stack or run standalone:
# docker compose -f docker-compose.node1.yml -f docker-compose.matrix-bridge-node1.yml up -d matrix-bridge-dagi
version: "3.9"
services:
matrix-bridge-dagi:
build:
context: ./services/matrix-bridge-dagi
args:
BUILD_SHA: "${BUILD_SHA:-dev}"
BUILD_TIME: "${BUILD_TIME:-local}"
container_name: matrix-bridge-dagi-node1
ports:
- "127.0.0.1:7030:7030" # internal only — not exposed publicly
environment:
- PORT=7030
- ENV=prod
- NODE_ID=NODA1
- BUILD_SHA=${BUILD_SHA:-dev}
- BUILD_TIME=${BUILD_TIME:-local}
# ── Matrix homeserver ────────────────────────────────────────────────
# Required: set in .env on NODA1 before first launch
- MATRIX_HOMESERVER_URL=${MATRIX_HOMESERVER_URL:-}
- MATRIX_ACCESS_TOKEN=${MATRIX_ACCESS_TOKEN:-}
- MATRIX_USER_ID=${MATRIX_USER_ID:-}
# ── Room → Agent mapping (M1: single room for Sofiia) ────────────────
# Create the room manually, then paste the room_id here
- SOFIIA_ROOM_ID=${SOFIIA_ROOM_ID:-}
# ── DAGI backend — Router for /v1/agents/{id}/infer ─────────────────
# Router internal port 8000 on dagi-network (ext port 9102 on host)
- DAGI_GATEWAY_URL=http://dagi-router-node1:8000
- DEFAULT_NODE_ID=NODA1
# ── Sofiia Console (audit write) ─────────────────────────────────────
- SOFIIA_CONSOLE_URL=http://dagi-sofiia-console-node1:8002
- SOFIIA_INTERNAL_TOKEN=${SOFIIA_INTERNAL_TOKEN:-}
# ── Policy ───────────────────────────────────────────────────────────
- BRIDGE_ALLOWED_AGENTS=sofiia
- BRIDGE_ROOM_MAP=${BRIDGE_ROOM_MAP:-}
- RATE_LIMIT_ROOM_RPM=20
- RATE_LIMIT_SENDER_RPM=10
healthcheck:
test:
- "CMD"
- "python3"
- "-c"
- "import urllib.request; urllib.request.urlopen('http://localhost:7030/health', timeout=5)"
interval: 30s
timeout: 10s
retries: 3
start_period: 15s
networks:
- dagi-network
restart: unless-stopped
networks:
dagi-network:
external: true