volumes:
  qdrant_data:

services:
  # Fix permissions for config directory
  init-permissions:
    image: alpine
    command: chown -R 1000:1000 /config
    volumes:
      - ${CONFIG_PATH:-~/.claude-self-reflect/config}:/config
    profiles: ["watch", "mcp", "import"]

  # Qdrant vector database - the heart of semantic search
  qdrant:
    image: qdrant/qdrant:v1.15.1
    container_name: claude-reflection-qdrant
    ports:
      - "${QDRANT_PORT:-6333}:6333"
    volumes:
      - qdrant_data:/qdrant/storage
    environment:
      - QDRANT__LOG_LEVEL=INFO
      - QDRANT__SERVICE__HTTP_PORT=6333
    restart: unless-stopped
    mem_limit: ${QDRANT_MEMORY:-2g}
    memswap_limit: ${QDRANT_MEMORY:-2g}

  # One-time import service (runs once then exits)
  importer:
    build:
      context: .
      dockerfile: Dockerfile.importer
    container_name: claude-reflection-importer
    depends_on:
      - init-permissions
      - qdrant
    volumes:
      - ${CLAUDE_LOGS_PATH:-~/.claude/projects}:/logs:ro
      - ${CONFIG_PATH:-~/.claude-self-reflect/config}:/config
      - ./scripts:/scripts:ro
    environment:
      - QDRANT_URL=http://qdrant:6333
      - STATE_FILE=/config/imported-files.json
      - OPENAI_API_KEY=${OPENAI_API_KEY:-}
      - VOYAGE_API_KEY=${VOYAGE_API_KEY:-}
      - VOYAGE_KEY=${VOYAGE_KEY:-}
      - PREFER_LOCAL_EMBEDDINGS=${PREFER_LOCAL_EMBEDDINGS:-false}
      - EMBEDDING_MODEL=${EMBEDDING_MODEL:-voyage-3}
      - BATCH_SIZE=${BATCH_SIZE:-50}
      - CHUNK_SIZE=${CHUNK_SIZE:-10}
      - PYTHONUNBUFFERED=1
    restart: "no"
    profiles: ["import"]
    command: python /scripts/import-conversations-unified.py

  # Continuous watcher service (optional)
  watcher:
    build:
      context: .
      dockerfile: Dockerfile.watcher
    container_name: claude-reflection-watcher
    depends_on:
      - init-permissions
      - qdrant
    volumes:
      - ${CLAUDE_LOGS_PATH:-~/.claude/projects}:/logs:ro
      - ${CONFIG_PATH:-~/.claude-self-reflect/config}:/config
      - ./scripts:/scripts:ro
      - /tmp:/tmp
    environment:
      - QDRANT_URL=http://qdrant:6333
      - STATE_FILE=/config/imported-files.json
      - OPENAI_API_KEY=${OPENAI_API_KEY:-}
      - VOYAGE_API_KEY=${VOYAGE_API_KEY:-}
      - VOYAGE_KEY=${VOYAGE_KEY:-}
      - PREFER_LOCAL_EMBEDDINGS=${PREFER_LOCAL_EMBEDDINGS:-false}
      - EMBEDDING_MODEL=${EMBEDDING_MODEL:-voyage-3}
      - WATCH_INTERVAL=${WATCH_INTERVAL:-60}
      - PYTHONUNBUFFERED=1
    restart: unless-stopped
    profiles: ["watch"]
    mem_limit: 1g
    memswap_limit: 1g

  # MCP server for Claude integration
  mcp-server:
    build:
      context: .
      dockerfile: Dockerfile.mcp-server
    container_name: claude-reflection-mcp
    depends_on:
      - qdrant
    environment:
      - QDRANT_URL=http://qdrant:6333
      - VOYAGE_KEY=${VOYAGE_KEY:-}
      - PREFER_LOCAL_EMBEDDINGS=${PREFER_LOCAL_EMBEDDINGS:-true}
      - ENABLE_MEMORY_DECAY=${ENABLE_MEMORY_DECAY:-true}
      - DECAY_WEIGHT=${DECAY_WEIGHT:-0.3}
      - DECAY_SCALE_DAYS=${DECAY_SCALE_DAYS:-90}
      - PYTHONUNBUFFERED=1
    restart: unless-stopped
    stdin_open: true
    tty: true
    profiles: ["mcp"]

networks:
  default:
    name: claude-reflection-network
    external: false
