# heather — pi-web (web UI для pi coding agent). # # https://github.com/agegr/pi-web, npm-пакет @agegr/pi-web # Next.js 16 + lobehub-ui. Читает ~/.pi/agent/sessions/*.jsonl напрямую, # общается с pi через RPC (spawn бинаря pi). НЕ демон — запускается как # systemd-сервис, который держит next-server на 127.0.0.1. # # Слушает 127.0.0.1:30141 → Caddy pi.iscg.dev терминирует TLS + basicauth # (см. caddy.nix, piBasicAuth). Auth-пароль в pass iscg.dev/pi-web/auth. # # Установка pi и pi-web — ручная (npm global в ~/.npm-global, НЕ в nix store): # npm config set prefix ~/.npm-global # npm i -g @earendil-works/pi-coding-agent @agegr/pi-web # Это разовая операция на хосте (как tuwunel-admin бинарник вне nix-store). # nodejs ставим через systemPackages — нужен и для npm, и для next-server. { config, pkgs, lib, ... }: { # Node.js: нужен для pi-web (next-server) и для spawn'а pi из pi-web. environment.systemPackages = [ pkgs.nodejs ]; systemd.services.pi-web = { description = "pi-web (web UI for pi coding agent)"; after = [ "network-online.target" ]; wants = [ "network-online.target" ]; wantedBy = [ "multi-user.target" ]; # PATH: nodejs (node/npm) + ~/.npm-global/bin (где лежат pi и pi-web). path = [ pkgs.nodejs "/home/mikl/.npm-global/bin" ]; environment = { # Где pi-web ищет sessions/pi-конфиг. Совпадает с ~/.pi/agent на heather. PI_CODING_AGENT_DIR = "/home/mikl/.pi/agent"; HOME = "/home/mikl"; NODE_ENV = "production"; }; serviceConfig = { Type = "simple"; User = "mikl"; Group = "users"; ExecStart = "/home/mikl/.npm-global/bin/pi-web --hostname 127.0.0.1 --port 30141"; WorkingDirectory = "/home/mikl"; Restart = "on-failure"; RestartSec = 5; }; }; }