# vor — Inquisitor UI sidecar.
#
# Image is built on the host from the vor git repo by the deploy
# playbook (`playbooks/deploy-vor.yaml`), which clones into
# /opt/docker/build/vor and runs `docker build -t vor:local .` before
# installing this compose and bringing it up.
#
# Sessions + responses persist under bind mounts so container rebuilds
# don't lose user-published response files (which Claude reads via the
# /api/sessions/{id} JSON path).
#
# All tunables live in .env — edit that, not this file.

services:
  vor:
    image: ${VOR_IMAGE}
    container_name: vor
    restart: unless-stopped
    ports:
      - "${VOR_BIND:-0.0.0.0}:${VOR_PORT}:8765"
    volumes:
      - ${VOR_SESSIONS_DIR}:/app/sessions
      - ${VOR_RESPONSES_DIR}:/app/responses
    environment:
      # Container always listens on 8765 internally; host port is the only knob.
      - PYTHONUNBUFFERED=1
      # Worldtree integration for the /mockup/ surface. Empty key falls
      # back to the in-process MockWorldtree (canned fixtures); a real
      # key routes /mockup/ LLM calls at the Worldtree instance below.
      - VOR_WORLDTREE_KEY=${VOR_WORLDTREE_KEY:-}
      - VOR_WORLDTREE_BASE=${VOR_WORLDTREE_BASE:-http://10.250.50.152:8080}
      - VOR_WORLDTREE_MODEL=${VOR_WORLDTREE_MODEL:-qwen3.6-35-a3b-heretic}
    healthcheck:
      test: ["CMD-SHELL", "python -c 'import urllib.request,sys; r=urllib.request.urlopen(\"http://127.0.0.1:8765/api/sessions\",timeout=3); sys.exit(0 if r.status==200 else 1)' || exit 1"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s
    networks:
      - tnet
    labels:
      - homepage.group=Toolchain
      - homepage.name=vor
      - homepage.icon=mdi-clipboard-text-search
      - homepage.description=Inquisitor UI — Claude session ↔ user response sidecar
      - homepage.href=http://10.250.50.70:${VOR_PORT}

networks:
  tnet:
    name: traefik-net
    external: true
