/** * pm2 ecosystem entry for legal-chat-service — the host-side SSE bridge * to ``claude`` CLI that powers the /training chat tab. * * Why pm2: * - Auto-restart if the process dies (claude CLI subprocess failures * should never leave the service in a half-dead state). * - Log rotation matches paperclip's behavior so the chair sees * consistent log paths under ~/.pm2/logs/. * * Install (once): * pm2 start /home/chaim/legal-ai/scripts/legal-chat-service.config.cjs * pm2 save * * Smoke test: * curl http://127.0.0.1:8770/health * # → {"ok":true,"service":"legal-chat-service"} * * Update: * pm2 restart legal-chat-service * * Stop: * pm2 stop legal-chat-service */ module.exports = { apps: [ { name: "legal-chat-service", cwd: "/home/chaim/legal-ai/mcp-server", // Run the in-package server via the venv interpreter so all // imports (claude_session, etc) resolve. script: "/home/chaim/legal-ai/mcp-server/.venv/bin/python", // Bind to 0.0.0.0 so the legal-ai container can reach the service // via the docker bridge gateway (10.0.1.1:8770). Oracle Cloud's // security list keeps port 8770 closed to the public internet; // ufw is inactive but iptables INPUT default ACCEPT is fine here // because the cloud-level firewall is the actual perimeter (same // pattern paperclip uses for its 0.0.0.0:3100 binding). args: "-m legal_mcp.chat_service.server --port 8770 --host 0.0.0.0", // claude CLI looks up credentials under HOME — make sure it // sees Daphna's session, not an empty container HOME. env: { HOME: "/home/chaim", PATH: "/home/chaim/.local/bin:/usr/local/bin:/usr/bin:/bin", PYTHONUNBUFFERED: "1", }, restart_delay: 5000, max_restarts: 10, autorestart: true, max_memory_restart: "500M", }, ], };