--- name: omni-version-manager description: Install, start, stop, restart, and update embedded services (9Router, CLIProxyAPI). Monitor service status, retrieve logs, and configure auto-start for local-only service endpoints. --- ## Overview Install, start, stop, restart, and update embedded services (9Router, CLIProxyAPI). Monitor service status, retrieve logs, and configure auto-start for local-only service endpoints. ## Authentication All requests require a valid Bearer token or session cookie. Obtain a token via `POST /api/auth/login` or configure `REQUIRE_API_KEY=false` for local development. ## Endpoints ### POST /api/services/9router/install Install 9Router from npm Installs the `9router` npm package under DATA_DIR/services/9router/. Uses execFile (no shell interpolation — hard rule #13). **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/9router/install \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### POST /api/services/9router/start Start 9Router Spawns the 9Router process. Idempotent if already running. **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/9router/start \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### POST /api/services/9router/stop Stop 9Router Gracefully stops 9Router (SIGTERM → 15 s → SIGKILL). Idempotent. **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/9router/stop \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### POST /api/services/9router/restart Restart 9Router Equivalent to stop() then start() under the operation lock. **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/9router/restart \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### POST /api/services/9router/update Update 9Router to a newer npm version Stops the service (if running), installs the newer npm version, then restarts. **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/9router/update \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### POST /api/services/9router/rotate-key Rotate the 9Router API key Generates a new API key, encrypts it at-rest, and restarts the service to apply it. The plaintext key is never returned. **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/9router/rotate-key \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### GET /api/services/9router/status Get 9Router status Returns combined live supervisor state and DB metadata. **LOCAL_ONLY** — loopback only. ```bash curl https://localhost:20128/api/services/9router/status \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" ``` ### POST /api/services/9router/auto-start Toggle 9Router auto-start When enabled, 9Router starts automatically on the next NextRoute boot. **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/9router/auto-start \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### POST /api/services/cliproxy/install Install CLIProxyAPI from npm Installs the CLIProxyAPI package under DATA_DIR/services/cliproxy/. **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/cliproxy/install \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### POST /api/services/cliproxy/start Start CLIProxyAPI Spawns the CLIProxyAPI process. Idempotent if already running. **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/cliproxy/start \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### POST /api/services/cliproxy/stop Stop CLIProxyAPI Gracefully stops CLIProxyAPI. Idempotent. **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/cliproxy/stop \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### POST /api/services/cliproxy/restart Restart CLIProxyAPI stop() then start() under the operation lock. **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/cliproxy/restart \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### POST /api/services/cliproxy/update Update CLIProxyAPI to a newer npm version Stops, installs newer version, restarts. **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/cliproxy/update \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### GET /api/services/cliproxy/status Get CLIProxyAPI status Returns live supervisor state and DB metadata (no apiKeyMasked — CLIProxyAPI does not use an injected API key). **LOCAL_ONLY** — loopback only. ```bash curl https://localhost:20128/api/services/cliproxy/status \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" ``` ### POST /api/services/cliproxy/auto-start Toggle CLIProxyAPI auto-start When enabled, CLIProxyAPI starts automatically on the next NextRoute boot. **LOCAL_ONLY** — loopback only. ```bash curl -X POST https://localhost:20128/api/services/cliproxy/auto-start \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" -H "Content-Type: application/json" \ -d '{}' ``` ### GET /api/services/{name}/logs Stream service logs via SSE Returns a Server-Sent Events stream from the service's in-memory ring buffer (5 MB, circular). Sends a `snapshot` event with historical lines first, then live `log` events, plus a `heartbeat` every 15 s. **LOCAL_ONLY** — loopback only. ```bash curl https://localhost:20128/api/services/{name}/logs \ -H "Authorization: Bearer $NEXTROUTE_TOKEN" ``` ## Payloads See the full OpenAPI specification at `GET /api/openapi/spec` or `docs/reference/openapi.yaml` for detailed request/response schemas.