# syntax=docker/dockerfile:1
# Hermes Agent -- official image + custom plugins layered on top.
# No fork needed — customizations are pip-installable plugins from Gitea.
#   docker compose build hermes
# Or manually:
#   DOCKER_BUILDKIT=1 docker build --build-arg HERMES_PLUGIN_URLS="url1 url2" -t hermes-agent:custom .

# ---------- Base: official Hermes image (system deps, npm, uv, Playwright) ----------
FROM nousresearch/hermes-agent:latest

# ---------- Plugin URLs (semicolon-separated, set via compose.yml build args) ----------
ARG HERMES_PLUGIN_URLS=""

# ---------- Extra system deps ----------
USER root
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        libportaudio2 ca-certificates poppler-utils imagemagick \
        libolm-dev \
        texlive-latex-base texlive-latex-extra texlive-fonts-recommended \
        texlive-xetex texlive-science \
        qemu-user-static binfmt-support emacs-nox && \
    rm -rf /var/lib/apt/lists/*

# ---------- UV ----------
COPY --chmod=0755 --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/

# ---------- Matrix bridge + extra pip deps ----------
RUN . /opt/hermes/.venv/bin/activate && \
    uv pip install --no-cache-dir 'mautrix[encryption]' openai

# ---------- Piper TTS ----------
RUN . /opt/hermes/.venv/bin/activate && \
    uv pip install --no-cache-dir piper-tts sounddevice numpy && \
    mkdir -p /opt/hermes/.venv/share/piper/voices

RUN /opt/hermes/.venv/bin/python3 /dev/stdin << 'PYEOF'
import urllib.request
base = '/opt/hermes/.venv/share/piper/voices'
url = 'https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/ryan/high/en_US-ryan-high.onnx'
urllib.request.urlretrieve(url, base + '/en_US-ryan-high.onnx')
urllib.request.urlretrieve(url + '.json', base + '/en_US-ryan-high.onnx.json')
PYEOF

# ---------- Install Himalaya email CLI ----------
RUN /opt/hermes/.venv/bin/python3 /dev/stdin << 'PYEOF'
import urllib.request, tarfile, os, shutil
url = 'https://github.com/pimalaya/himalaya/releases/download/v1.2.0/himalaya.x86_64-linux.tgz'
tgz = '/tmp/himalaya.tgz'
urllib.request.urlretrieve(url, tgz)
with tarfile.open(tgz) as t:
    t.extractall('/tmp')
shutil.move('/tmp/himalaya', '/usr/local/bin/himalaya')
os.chmod('/usr/local/bin/himalaya', 0o755)
os.remove(tgz)
print('himalaya v1.2.0 installed')
PYEOF

# ---------- Install custom plugins from URLs ----------
# HERMES_PLUGIN_URLS is a semicolon-separated list of pip-installable
# package URLs (e.g. git+https:// or direct .tar.gz archives from Gitea).
# Each plugin is installed into the Hermes venv.
RUN if [ -n "$HERMES_PLUGIN_URLS" ]; then \
        . /opt/hermes/.venv/bin/activate && \
        IFS=';' read -ra URLS <<< "$HERMES_PLUGIN_URLS" && \
        for url in "${URLS[@]}"; do \
            echo "Installing plugin: $url" && \
            uv pip install --no-cache-dir "$url"; \
        done; \
    fi

# ---------- Install multi-gateway launcher ----------
# Launches one gateway process per profile (HERMES_PROFILES env var)
COPY --chmod=0755 run-multi-gateways.sh /usr/local/bin/run-multi-gateways.sh

# ---------- Runtime ----------
USER hermes
ENV HERMES_HOME=/opt/data
ENV PATH="/opt/data/.local/bin:${PATH}"
# Point browser tool to Playwright's Chromium (already in base image)
ENV CHROME_EXECUTABLE=/opt/hermes/.playwright/chromium/chrome-linux/chrome

# Ensure tools directory and toolsets.py are writable by the hermes runtime user
# so custom tools can be injected from the persistent volume at startup.
USER root
RUN chown -R hermes:hermes /opt/hermes/tools /opt/hermes/toolsets.py

VOLUME [ "/opt/data" ]
