{
  "log_dir": "~/.robopark/logs",
  "services": [
    {
      "name": "preview_agent",
      "enabled": true,
      "comment": "Core service — heartbeat, LiveKit publish, motion webhook listener. Reads its own settings from ~/.robopark/preview_agent.json (device_id, scheduler_url, etc), enrolled once via `robopark add-robot`.",
      "command": ["python", "preview_agent.py"],
      "cwd": "/absolute/path/to/infinicode-main/packages/robopark/scheduler"
    },
    {
      "name": "vision_app",
      "enabled": false,
      "comment": "Real motion/object detection (e.g. RoboVisionAI_PI's app_pi_clean.py). Must POST to preview_agent's motion webhook (http://localhost:<vision-webhook-port>/, default 5057) on detection. Disabled by default — no safe generic command, fill in your robot's actual vision app path.",
      "command": ["python", "app_pi_clean.py"],
      "cwd": "/absolute/path/to/RoboVisionAI_PI"
    },
    {
      "name": "motor_server",
      "enabled": false,
      "comment": "Only needed if your robot's motors are NOT wired to preview_agent's LiveKit data-channel path — i.e. voice_agent.py falls back to motor_server_url (set on the character preset / device) instead of the data-channel. Disabled by default.",
      "command": ["python", "-m", "uvicorn", "motors:app", "--host", "0.0.0.0", "--port", "8001"],
      "cwd": "/absolute/path/to/motor-server-project"
    }
  ]
}
