# 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 \ libglib2.0-0 libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 \ libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 \ libxfixes3 libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2 \ && 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). COPY docker/npm-real /usr/local/bin/npm-real COPY docker/npm-shim /usr/local/bin/npm-ignore-scripts # rm first: /usr/local/bin/npm is a symlink into npm's lib dir, and COPY # would follow it and clobber npm-cli.js itself. RUN rm -f /usr/local/bin/npm \ && mv /usr/local/bin/npm-ignore-scripts /usr/local/bin/npm \ && chmod +x /usr/local/bin/npm-real /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.fallback # 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 # MCP tooling (same as workers; ops also browses). RUN npm-real install -g --ignore-scripts cloakbrowser-mcp@1.4.0 \ && mkdir -p /root/.config/mcp COPY docker/mcp.json /root/.config/mcp/mcp.json ENV PI_SESSION_DIR=/pi-sessions WORKDIR /ops ENTRYPOINT ["/entrypoint.sh"] CMD ["node", "/bridge/index.mjs"]