{
  "app": "uqo-chat",
  "label": "UQO-Chat — tuteur IA IMM1003 · IMM1033",
  "domain": "www.uqo-chat.app",
  "port": 8190,
  "health_path": "/api/v1/ready",
  "dir": "~/apps/uqo-chat",
  "extra_paths": [],
  "sync_excludes": [
    ".venv/", "venv/", "data/", "__pycache__/", ".pytest_cache/", ".ruff_cache/", ".mypy_cache/",
    "*.egg-info/", ".git/", ".env", "frontend/node_modules/", "frontend/dev-dist/", "content/"
  ],
  "requires": {
    "runtimes": ["pm2", "ngrok", "uv-python@3.12", "uv"],
    "ram_gb": 3,
    "ports": [8190, 8191]
  },
  "ram_mb_observed": 900,
  "size_mb": 12,
  "placement": {
    "pin": null,
    "prefer": "M4M64a",
    "avoid": ["M3U96b", "M1M32"],
    "reason": "API + sandbox Python (sandbox-exec) ; M3U96b réservé hfmarketdata, M1M32 passerelle"
  },
  "processes": [
    {
      "name": "uqo-chat-sandbox",
      "manager": "pm2",
      "script": "{{HOME}}/apps/uqo-chat/sandbox-runner/.venv/bin/python",
      "args": ["-m", "uvicorn", "server:app", "--host", "127.0.0.1", "--port", "8191", "--no-access-log"],
      "interpreter": null,
      "cwd": "{{HOME}}/apps/uqo-chat/sandbox-runner",
      "env": { "SANDBOX_MAX_PARALLEL": "4", "SANDBOX_TOKEN": "{{SANDBOX_TOKEN}}", "PYTHONUNBUFFERED": "1" },
      "cron_restart": null,
      "autorestart": true,
      "max_memory_restart": "2G"
    },
    {
      "name": "uqo-chat-api",
      "manager": "pm2",
      "script": "{{HOME}}/apps/uqo-chat/backend/.venv/bin/python",
      "args": ["-m", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8190", "--no-access-log", "--timeout-keep-alive", "75"],
      "interpreter": null,
      "cwd": "{{HOME}}/apps/uqo-chat/backend",
      "env": {
        "APP_ENV": "production",
        "APP_URL": "https://www.uqo-chat.app",
        "CORS_ORIGINS": "https://www.uqo-chat.app",
        "PORT": "8190",
        "DATA_DIR": "{{HOME}}/apps/uqo-chat/data",
        "FRONTEND_DIST": "{{HOME}}/apps/uqo-chat/frontend/dist",
        "SANDBOX_URL": "http://127.0.0.1:8191",
        "SANDBOX_TOKEN": "{{SANDBOX_TOKEN}}",
        "LOG_LEVEL": "INFO",
        "PYTHONUNBUFFERED": "1"
      },
      "cron_restart": null,
      "autorestart": true,
      "max_memory_restart": "3G"
    }
  ],
  "ngrok": { "name": "uqo-chat-ngrok", "url": "www.uqo-chat.app", "port": 8190 },
  "launchd": [],
  "env_overrides": {},
  "hooks": {
    "post_sync": [
      "export PATH=\"$HOME/.local/bin:/opt/homebrew/bin:$PATH\"; cd backend && (test -x .venv/bin/python || uv venv --python 3.12 .venv) && uv pip install -q --python .venv/bin/python -e . && echo '  backend deps ok'",
      "export PATH=\"$HOME/.local/bin:/opt/homebrew/bin:$PATH\"; cd sandbox-runner && (test -x .venv/bin/python || uv venv --python 3.12 .venv) && uv pip install -q --python .venv/bin/python -r requirements.txt && echo '  sandbox deps ok'",
      "mkdir -p data/files && echo '  data ok'"
    ],
    "post_start": []
  },
  "ka_repo": false,
  "source_node": null,
  "rebuild": false
}
