# lvmh ops image: the control pi that lives inside the daemon deployment. # Has docker CLI + the daemon's docker.sock mounted (see ops.go binds), so it # can clone repos, inspect them, write Dockerfiles, build per-repo worker # images and register them via the daemon REST API. FROM node:24-bookworm-slim RUN apt-get update \ && apt-get install -y --no-install-recommends \ bash ca-certificates git ripgrep curl xz-utils make jq golang-go \ docker.io \ && rm -rf /var/lib/apt/lists/* RUN npm install -g --ignore-scripts @earendil-works/pi-coding-agent # Same npm shim as the worker image (see worker.Dockerfile). RUN mv /usr/local/bin/npm /usr/local/bin/npm-real COPY docker/npm-shim /usr/local/bin/npm RUN chmod +x /usr/local/bin/npm # Same pi config as workers (dotfiles, filtered; git: packages stripped). COPY docker/pi-agent/ /root/.pi/agent/ COPY plugin/lvmh-agent.ts /root/.pi/agent/extensions/lvmh-agent.ts COPY docker/worker-models.json /root/.pi/agent/models.json # Ops instructions live in the workspace (AGENTS.md is auto-loaded from cwd). COPY docker/ops-context/AGENTS.md /ops-seed/AGENTS.md COPY docker/bridge /bridge # Seed AGENTS.md into the persistent /ops volume on first boot only. COPY docker/ops-context/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENV PI_SESSION_DIR=/pi-sessions WORKDIR /ops ENTRYPOINT ["/entrypoint.sh"] CMD ["node", "/bridge/index.mjs"]