* Add 9Router panel plugin This commit introduces the initial version of the 9Router panel plugin. It provides a Noctalia panel to manage 9Router model combos directly from the bar, without requiring the web dashboard. Key features: - List, create, rename, and delete model combos. - Reorder models within a combo via drag-and-drop. - Change combo routing kind (fallback, round-robin, fusion). - Search and filter combos. - Supports 9Router dashboard authentication via CLI token or password. Includes a bar widget showing connection status, a full UI panel, and a background service to interact with the 9Router REST API. Translations for English and Vietnamese are included. * Rename 9Router Panel to 9Router Control Update plugin IDs, IPC commands, and internal references. * Quote shell args in service commands Add shell_quote() for URLs, bodies, and file paths passed to noctalia.runAsync. Declare required external commands in plugin.toml and document them in the README.
9Router Control
Manage your 9Router combos right from the Noctalia bar — no web dashboard needed.
- List combos — see every combo with its model chain and routing kind.
- Reorder models — open a combo and move models up/down to change fallback order.
- Create / rename / delete combos — full CRUD from the panel.
- Change routing kind — fallback, round-robin, or fusion.
- Search — filter combos by name or model chain.
Plugin
| Field | Value |
|---|---|
| ID | weinguyen/9router-control |
| Widget | widget (bar) |
| Panel | panel |
| Service | service |
Toggle the panel from the bar widget, or with:
noctalia msg panel-toggle weinguyen/9router-control:panel
Requirements
-
Noctalia v5.0.0 or higher.
-
A running 9Router instance (dashboard) whose REST API the plugin talks to via
server_host:server_port. -
The following external commands, used by the service backend:
curl— password login posts to/api/auth/loginand reads theSet-Cookieheader (Noctalia's HTTP binding does not expose response headers).sha256sum,cat,cut,printf— compute the CLI authentication token from themachine-idandauth/cli-secretfiles when the dashboard has login enabled.sleep— back-off polling while a CLI token computation is in flight.
Ordinary (login-disabled) usage needs only
curl; the remaining commands are required when dashboard login is enabled.
Usage
Click the 9Router widget on the bar to open the panel.
- The combo list shows every combo; the search box filters by name or model chain.
- Select a combo to reorder its models (move up/down) and change its routing kind.
- Use create / rename / delete to manage combos without touching the web dashboard.
If the dashboard has login enabled and no CLI token is available, the panel shows a login screen where you enter the dashboard password; the plugin then reuses the session cookie for subsequent requests.
Settings
| Setting | Default | Description |
|---|---|---|
| Server Host | 127.0.0.1 |
Hostname of the 9Router dashboard. |
| Server Port | 20128 |
Port of the 9Router dashboard. |
| Data Directory | ~/.9router |
9Router data dir, used to compute the CLI token when login is required. |
| Language | auto |
UI language (auto / English / Tiếng Việt). |
| Debug Logging | off | Print debug messages to the Noctalia log. |
Notes
- The plugin talks to the local 9Router REST API (
/api/combos). By default the dashboard login is disabled, so plain requests work. - When login is enabled, the plugin first tries the 9Router CLI token (computed
from the
machine-idandauth/cli-secretfiles, sent as anx-9r-cli-tokenheader). If that isn't available, it falls back to a password login and reuses the session cookie. - Reordering writes the new
modelsarray viaPUT /api/combos/:id.
Development
widget.luau— bar widget entry.panel.luau— chat-style panel surface.service.luau— headless API / state backend.translations/— user-facing strings.