mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-26 09:52:11 +03:00
Merge F10 into parent: audit report (GREEN) + docs + micro-fixes for stale cli-tools paths (plan 14)
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -32,28 +32,28 @@ import * as __fd_glob_35 from "../docs/ops/PROXY_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_34 from "../docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_33 from "../docs/ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md?collection=docs"
|
||||
import * as __fd_glob_32 from "../docs/ops/COVERAGE_PLAN.md?collection=docs"
|
||||
import * as __fd_glob_31 from "../docs/frameworks/WEBHOOKS.md?collection=docs"
|
||||
import * as __fd_glob_30 from "../docs/frameworks/SKILLS.md?collection=docs"
|
||||
import * as __fd_glob_29 from "../docs/frameworks/OPENCODE.md?collection=docs"
|
||||
import * as __fd_glob_28 from "../docs/frameworks/MEMORY.md?collection=docs"
|
||||
import * as __fd_glob_27 from "../docs/frameworks/MCP-SERVER.md?collection=docs"
|
||||
import * as __fd_glob_26 from "../docs/frameworks/GAMIFICATION.md?collection=docs"
|
||||
import * as __fd_glob_25 from "../docs/frameworks/EVALS.md?collection=docs"
|
||||
import * as __fd_glob_24 from "../docs/frameworks/EMBEDDED-SERVICES.md?collection=docs"
|
||||
import * as __fd_glob_23 from "../docs/frameworks/CLOUD_AGENT.md?collection=docs"
|
||||
import * as __fd_glob_22 from "../docs/frameworks/AGENT_PROTOCOLS_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_21 from "../docs/frameworks/A2A-SERVER.md?collection=docs"
|
||||
import * as __fd_glob_20 from "../docs/guides/USER_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_19 from "../docs/guides/UNINSTALL.md?collection=docs"
|
||||
import * as __fd_glob_18 from "../docs/guides/TROUBLESHOOTING.md?collection=docs"
|
||||
import * as __fd_glob_17 from "../docs/guides/TERMUX_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_16 from "../docs/guides/SETUP_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_15 from "../docs/guides/PWA_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_14 from "../docs/guides/KIRO_SETUP.md?collection=docs"
|
||||
import * as __fd_glob_13 from "../docs/guides/I18N.md?collection=docs"
|
||||
import * as __fd_glob_12 from "../docs/guides/FEATURES.md?collection=docs"
|
||||
import * as __fd_glob_11 from "../docs/guides/ELECTRON_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_10 from "../docs/guides/DOCKER_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_31 from "../docs/guides/USER_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_30 from "../docs/guides/UNINSTALL.md?collection=docs"
|
||||
import * as __fd_glob_29 from "../docs/guides/TROUBLESHOOTING.md?collection=docs"
|
||||
import * as __fd_glob_28 from "../docs/guides/TERMUX_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_27 from "../docs/guides/SETUP_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_26 from "../docs/guides/PWA_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_25 from "../docs/guides/KIRO_SETUP.md?collection=docs"
|
||||
import * as __fd_glob_24 from "../docs/guides/I18N.md?collection=docs"
|
||||
import * as __fd_glob_23 from "../docs/guides/FEATURES.md?collection=docs"
|
||||
import * as __fd_glob_22 from "../docs/guides/ELECTRON_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_21 from "../docs/guides/DOCKER_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_20 from "../docs/frameworks/WEBHOOKS.md?collection=docs"
|
||||
import * as __fd_glob_19 from "../docs/frameworks/SKILLS.md?collection=docs"
|
||||
import * as __fd_glob_18 from "../docs/frameworks/OPENCODE.md?collection=docs"
|
||||
import * as __fd_glob_17 from "../docs/frameworks/MEMORY.md?collection=docs"
|
||||
import * as __fd_glob_16 from "../docs/frameworks/MCP-SERVER.md?collection=docs"
|
||||
import * as __fd_glob_15 from "../docs/frameworks/GAMIFICATION.md?collection=docs"
|
||||
import * as __fd_glob_14 from "../docs/frameworks/EVALS.md?collection=docs"
|
||||
import * as __fd_glob_13 from "../docs/frameworks/EMBEDDED-SERVICES.md?collection=docs"
|
||||
import * as __fd_glob_12 from "../docs/frameworks/CLOUD_AGENT.md?collection=docs"
|
||||
import * as __fd_glob_11 from "../docs/frameworks/AGENT_PROTOCOLS_GUIDE.md?collection=docs"
|
||||
import * as __fd_glob_10 from "../docs/frameworks/A2A-SERVER.md?collection=docs"
|
||||
import * as __fd_glob_9 from "../docs/compression/RTK_COMPRESSION.md?collection=docs"
|
||||
import * as __fd_glob_8 from "../docs/compression/COMPRESSION_RULES_FORMAT.md?collection=docs"
|
||||
import * as __fd_glob_7 from "../docs/compression/COMPRESSION_LANGUAGE_PACKS.md?collection=docs"
|
||||
@@ -72,4 +72,4 @@ const create = server<typeof Config, import("fumadocs-mdx/runtime/types").Intern
|
||||
}
|
||||
}>({"doc":{"passthroughs":["extractedReferences"]}});
|
||||
|
||||
export const docs = await create.docs("docs", "docs", {"meta.json": __fd_glob_55, "architecture/meta.json": __fd_glob_56, "compression/meta.json": __fd_glob_57, "frameworks/meta.json": __fd_glob_58, "guides/meta.json": __fd_glob_59, "ops/meta.json": __fd_glob_60, "reference/meta.json": __fd_glob_61, "reference/openapi.yaml": __fd_glob_62, "routing/meta.json": __fd_glob_63, "security/meta.json": __fd_glob_64, }, {"architecture/ARCHITECTURE.md": __fd_glob_0, "architecture/AUTHZ_GUIDE.md": __fd_glob_1, "architecture/CODEBASE_DOCUMENTATION.md": __fd_glob_2, "architecture/REPOSITORY_MAP.md": __fd_glob_3, "architecture/RESILIENCE_GUIDE.md": __fd_glob_4, "compression/COMPRESSION_ENGINES.md": __fd_glob_5, "compression/COMPRESSION_GUIDE.md": __fd_glob_6, "compression/COMPRESSION_LANGUAGE_PACKS.md": __fd_glob_7, "compression/COMPRESSION_RULES_FORMAT.md": __fd_glob_8, "compression/RTK_COMPRESSION.md": __fd_glob_9, "guides/DOCKER_GUIDE.md": __fd_glob_10, "guides/ELECTRON_GUIDE.md": __fd_glob_11, "guides/FEATURES.md": __fd_glob_12, "guides/I18N.md": __fd_glob_13, "guides/KIRO_SETUP.md": __fd_glob_14, "guides/PWA_GUIDE.md": __fd_glob_15, "guides/SETUP_GUIDE.md": __fd_glob_16, "guides/TERMUX_GUIDE.md": __fd_glob_17, "guides/TROUBLESHOOTING.md": __fd_glob_18, "guides/UNINSTALL.md": __fd_glob_19, "guides/USER_GUIDE.md": __fd_glob_20, "frameworks/A2A-SERVER.md": __fd_glob_21, "frameworks/AGENT_PROTOCOLS_GUIDE.md": __fd_glob_22, "frameworks/CLOUD_AGENT.md": __fd_glob_23, "frameworks/EMBEDDED-SERVICES.md": __fd_glob_24, "frameworks/EVALS.md": __fd_glob_25, "frameworks/GAMIFICATION.md": __fd_glob_26, "frameworks/MCP-SERVER.md": __fd_glob_27, "frameworks/MEMORY.md": __fd_glob_28, "frameworks/OPENCODE.md": __fd_glob_29, "frameworks/SKILLS.md": __fd_glob_30, "frameworks/WEBHOOKS.md": __fd_glob_31, "ops/COVERAGE_PLAN.md": __fd_glob_32, "ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md": __fd_glob_33, "ops/FLY_IO_DEPLOYMENT_GUIDE.md": __fd_glob_34, "ops/PROXY_GUIDE.md": __fd_glob_35, "ops/RELEASE_CHECKLIST.md": __fd_glob_36, "ops/SQLITE_RUNTIME.md": __fd_glob_37, "ops/TUNNELS_GUIDE.md": __fd_glob_38, "ops/VM_DEPLOYMENT_GUIDE.md": __fd_glob_39, "reference/API_REFERENCE.md": __fd_glob_40, "reference/CLI-TOOLS.md": __fd_glob_41, "reference/ENVIRONMENT.md": __fd_glob_42, "reference/FREE_TIERS.md": __fd_glob_43, "reference/PROVIDER_REFERENCE.md": __fd_glob_44, "routing/AUTO-COMBO.md": __fd_glob_45, "routing/REASONING_REPLAY.md": __fd_glob_46, "security/CLI_TOKEN.md": __fd_glob_47, "security/CLI_TOKEN_AUTH.md": __fd_glob_48, "security/COMPLIANCE.md": __fd_glob_49, "security/ERROR_SANITIZATION.md": __fd_glob_50, "security/GUARDRAILS.md": __fd_glob_51, "security/PUBLIC_CREDS.md": __fd_glob_52, "security/ROUTE_GUARD_TIERS.md": __fd_glob_53, "security/STEALTH_GUIDE.md": __fd_glob_54, });
|
||||
export const docs = await create.docs("docs", "docs", {"meta.json": __fd_glob_55, "architecture/meta.json": __fd_glob_56, "compression/meta.json": __fd_glob_57, "frameworks/meta.json": __fd_glob_58, "guides/meta.json": __fd_glob_59, "ops/meta.json": __fd_glob_60, "reference/meta.json": __fd_glob_61, "reference/openapi.yaml": __fd_glob_62, "routing/meta.json": __fd_glob_63, "security/meta.json": __fd_glob_64, }, {"architecture/ARCHITECTURE.md": __fd_glob_0, "architecture/AUTHZ_GUIDE.md": __fd_glob_1, "architecture/CODEBASE_DOCUMENTATION.md": __fd_glob_2, "architecture/REPOSITORY_MAP.md": __fd_glob_3, "architecture/RESILIENCE_GUIDE.md": __fd_glob_4, "compression/COMPRESSION_ENGINES.md": __fd_glob_5, "compression/COMPRESSION_GUIDE.md": __fd_glob_6, "compression/COMPRESSION_LANGUAGE_PACKS.md": __fd_glob_7, "compression/COMPRESSION_RULES_FORMAT.md": __fd_glob_8, "compression/RTK_COMPRESSION.md": __fd_glob_9, "frameworks/A2A-SERVER.md": __fd_glob_10, "frameworks/AGENT_PROTOCOLS_GUIDE.md": __fd_glob_11, "frameworks/CLOUD_AGENT.md": __fd_glob_12, "frameworks/EMBEDDED-SERVICES.md": __fd_glob_13, "frameworks/EVALS.md": __fd_glob_14, "frameworks/GAMIFICATION.md": __fd_glob_15, "frameworks/MCP-SERVER.md": __fd_glob_16, "frameworks/MEMORY.md": __fd_glob_17, "frameworks/OPENCODE.md": __fd_glob_18, "frameworks/SKILLS.md": __fd_glob_19, "frameworks/WEBHOOKS.md": __fd_glob_20, "guides/DOCKER_GUIDE.md": __fd_glob_21, "guides/ELECTRON_GUIDE.md": __fd_glob_22, "guides/FEATURES.md": __fd_glob_23, "guides/I18N.md": __fd_glob_24, "guides/KIRO_SETUP.md": __fd_glob_25, "guides/PWA_GUIDE.md": __fd_glob_26, "guides/SETUP_GUIDE.md": __fd_glob_27, "guides/TERMUX_GUIDE.md": __fd_glob_28, "guides/TROUBLESHOOTING.md": __fd_glob_29, "guides/UNINSTALL.md": __fd_glob_30, "guides/USER_GUIDE.md": __fd_glob_31, "ops/COVERAGE_PLAN.md": __fd_glob_32, "ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md": __fd_glob_33, "ops/FLY_IO_DEPLOYMENT_GUIDE.md": __fd_glob_34, "ops/PROXY_GUIDE.md": __fd_glob_35, "ops/RELEASE_CHECKLIST.md": __fd_glob_36, "ops/SQLITE_RUNTIME.md": __fd_glob_37, "ops/TUNNELS_GUIDE.md": __fd_glob_38, "ops/VM_DEPLOYMENT_GUIDE.md": __fd_glob_39, "reference/API_REFERENCE.md": __fd_glob_40, "reference/CLI-TOOLS.md": __fd_glob_41, "reference/ENVIRONMENT.md": __fd_glob_42, "reference/FREE_TIERS.md": __fd_glob_43, "reference/PROVIDER_REFERENCE.md": __fd_glob_44, "routing/AUTO-COMBO.md": __fd_glob_45, "routing/REASONING_REPLAY.md": __fd_glob_46, "security/CLI_TOKEN.md": __fd_glob_47, "security/CLI_TOKEN_AUTH.md": __fd_glob_48, "security/COMPLIANCE.md": __fd_glob_49, "security/ERROR_SANITIZATION.md": __fd_glob_50, "security/GUARDRAILS.md": __fd_glob_51, "security/PUBLIC_CREDS.md": __fd_glob_52, "security/ROUTE_GUARD_TIERS.md": __fd_glob_53, "security/STEALTH_GUIDE.md": __fd_glob_54, });
|
||||
@@ -1,30 +1,39 @@
|
||||
---
|
||||
title: "CLI Tools — OmniRoute v3.8.0"
|
||||
version: 3.8.2
|
||||
lastUpdated: 2026-05-13
|
||||
title: "CLI Tools — OmniRoute v3.8.6"
|
||||
version: 3.8.6
|
||||
lastUpdated: 2026-05-28
|
||||
---
|
||||
|
||||
# CLI Tools — OmniRoute v3.8.0
|
||||
# CLI Tools — OmniRoute v3.8.6
|
||||
|
||||
Last updated: 2026-05-13
|
||||
Last updated: 2026-05-28
|
||||
|
||||
OmniRoute integrates with two categories of CLI tools:
|
||||
OmniRoute integrates with three categories of CLI tools spread across three dedicated dashboard pages:
|
||||
|
||||
1. **External CLI integrations** — third-party CLIs (Cursor, Cline, Codex, Claude Code, Qwen Code, Windsurf, Hermes, Amp, etc.) that you point at OmniRoute's local OpenAI-compatible endpoint.
|
||||
2. **Internal OmniRoute CLI** — commands bundled with the `omniroute` binary for server lifecycle, setup, diagnostics, and provider management.
|
||||
| Page | Route | Concept | Count |
|
||||
|------|-------|---------|-------|
|
||||
| **CLI Code's** | `/dashboard/cli-code` | Coding tools you point at OmniRoute (Client → CLI → OmniRoute → Provider) | 19 |
|
||||
| **CLI Agents** | `/dashboard/cli-agents` | Autonomous agents you point at OmniRoute (same flow, broader scope) | 6 |
|
||||
| **ACP Agents** | `/dashboard/acp-agents` | CLIs that OmniRoute spawns as backend via stdio/ACP (reverse flow) | see registry |
|
||||
|
||||
Legacy routes redirect via 308: `/dashboard/cli-tools` → `/dashboard/cli-code`, `/dashboard/agents` → `/dashboard/acp-agents`.
|
||||
|
||||
---
|
||||
|
||||
## How It Works
|
||||
|
||||
```
|
||||
Claude / Codex / OpenCode / Cline / KiloCode / Continue / Cursor / Windsurf / Hermes / Amp / Qwen
|
||||
CLI Code's / CLI Agents (consumption flow):
|
||||
Claude / Codex / OpenCode / Cline / KiloCode / Continue / Hermes Agent / Goose / ...
|
||||
│
|
||||
▼ (all point to OmniRoute)
|
||||
http://YOUR_SERVER:20128/v1
|
||||
│
|
||||
▼ (OmniRoute routes to the right provider)
|
||||
Anthropic / OpenAI / Gemini / DeepSeek / Groq / Mistral / ...
|
||||
|
||||
ACP Agents (reverse spawn flow):
|
||||
Client request → OmniRoute → spawns CLI via stdio/ACP → response
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
@@ -36,70 +45,197 @@ Claude / Codex / OpenCode / Cline / KiloCode / Continue / Cursor / Windsurf / He
|
||||
|
||||
---
|
||||
|
||||
## 1. External CLI Integrations
|
||||
## Source of Truth
|
||||
|
||||
### Source of Truth
|
||||
The unified catalog lives in `src/shared/constants/cliTools.ts` as `CLI_TOOLS: Record<string, CliCatalogEntry>`.
|
||||
|
||||
The dashboard cards in `/dashboard/cli-tools` are generated from
|
||||
`src/shared/constants/cliTools.ts`. The `omniroute setup` command can write
|
||||
config files automatically for the scriptable tools.
|
||||
Each entry has these fields (defined in `src/shared/schemas/cliCatalog.ts`):
|
||||
|
||||
### Current Catalog (v3.8.0)
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `category` | `"code" \| "agent"` | Which page the tool appears on |
|
||||
| `vendor` | `string` | Tool origin ("Anthropic", "OSS (P. Gauthier)") |
|
||||
| `acpSpawnable` | `boolean` | Also usable as an ACP Agent (badge shown) |
|
||||
| `baseUrlSupport` | `"full" \| "partial" \| "none"` | Custom endpoint support level. `"none"` = MITM backlog |
|
||||
| `configType` | `"env" \| "custom" \| "guide" \| "custom-builder" \| "mitm"` | Configuration mechanism |
|
||||
| `id`, `name`, `color`, `description`, `docsUrl` | standard | Core display fields |
|
||||
|
||||
| Tool | ID | Type / Config | Install / Access | Auth |
|
||||
| ------------------ | ------------- | ------------------- | ------------------------------------ | ----------------------------------- |
|
||||
| **Claude Code** | `claude` | env / settings.json | `npm i -g @anthropic-ai/claude-code` | API key (Anthropic gateway) |
|
||||
| **OpenAI Codex** | `codex` | custom (toml) | `npm i -g @openai/codex` | API key (OpenAI) |
|
||||
| **Factory Droid** | `droid` | custom | bundled / CLI | API key |
|
||||
| **Open Claw** | `openclaw` | custom | bundled / CLI | API key |
|
||||
| **Cursor** | `cursor` | guide (Cloud) | Cursor desktop app | API key (Cloud Endpoint) |
|
||||
| **Windsurf** | `windsurf` | guide | Windsurf desktop IDE | API key (BYOK) |
|
||||
| **Cline** | `cline` | custom / VS Code | `npm i -g cline` + VS Code ext | API key |
|
||||
| **Kilo Code** | `kilo` | custom / VS Code | `npm i -g kilocode` + VS Code ext | API key |
|
||||
| **Continue** | `continue` | guide (config.yaml) | VS Code extension | API key |
|
||||
| **Antigravity** | `antigravity` | MITM | OmniRoute built-in | API key (MITM proxy) |
|
||||
| **GitHub Copilot** | `copilot` | custom / VS Code | VS Code extension | API key (CLI fingerprint: `github`) |
|
||||
| **OpenCode** | `opencode` | guide (json) | `npm i -g opencode-ai` | API key (OpenAI-compatible) |
|
||||
| **Hermes** | `hermes` | guide (json) | install per docs | API key (OpenAI-compatible) |
|
||||
| **Amp CLI** | `amp` | guide (env) | install per Sourcegraph docs | API key (OpenAI-compatible) |
|
||||
| **Kiro AI** | `kiro` | MITM | Amazon Kiro IDE / CLI | API key (MITM proxy) |
|
||||
| **Qwen Code** | `qwen` | guide (json/env) | `npm i -g @qwen-code/qwen-code` | API key (OpenAI-compatible) |
|
||||
| **Custom CLI** | `custom` | custom-builder | any OpenAI-compatible client | API key |
|
||||
|
||||
> Notes:
|
||||
>
|
||||
> - "Web wrappers" like ChatGPT/Claude/Grok/Perplexity browser sessions are not
|
||||
> listed here. OmniRoute can proxy them through the `chatgpt-web`,
|
||||
> `claude-web`, `grok-web`, `perplexity-web`, `blackbox-web`,
|
||||
> `muse-spark-web` provider connections, but those are **provider connections**
|
||||
> (configured under `/dashboard/providers`), not CLI tools. They do not surface
|
||||
> as cards under `/dashboard/cli-tools`.
|
||||
> - Tools marked **MITM** (Antigravity, Kiro) intercept the desktop app traffic
|
||||
> locally and require enabling the corresponding mitm endpoint in
|
||||
> `/dashboard/settings`.
|
||||
|
||||
### CLI fingerprint sync (Agents + Settings)
|
||||
|
||||
`/dashboard/agents` and `Settings > CLI Fingerprint` use
|
||||
`src/shared/constants/cliCompatProviders.ts`. This keeps provider IDs aligned
|
||||
with the CLI cards and legacy IDs.
|
||||
|
||||
| CLI ID | Fingerprint Provider ID |
|
||||
| --------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------- |
|
||||
| `kilo` | `kilocode` |
|
||||
| `copilot` | `github` |
|
||||
| `claude` / `codex` / `antigravity` / `kiro` / `cursor` / `windsurf` / `cline` / `opencode` / `hermes` / `amp` / `qwen` / `droid` / `openclaw` | same ID |
|
||||
|
||||
Legacy IDs still accepted for compatibility: `copilot`, `kimi-coding`, `qwen`.
|
||||
Entries with `baseUrlSupport: "none"` are **not shown** in the dashboard pages — they are registered in the MITM backlog for plan 11 (see `_tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md`).
|
||||
|
||||
---
|
||||
|
||||
## 1. CLI Code's Catalog (19 tools)
|
||||
|
||||
Tools that support custom base URL and appear in `/dashboard/cli-code`:
|
||||
|
||||
| id | name | vendor | baseUrlSupport | configType | acpSpawnable |
|
||||
|----|------|--------|---------------|-----------|-------------|
|
||||
| claude | Claude Code | Anthropic | full | env | true |
|
||||
| codex | OpenAI Codex CLI | OpenAI | full | custom | true |
|
||||
| cline | Cline | OSS (ex-Claude Dev) | full | custom | true |
|
||||
| kilo | Kilo Code | Kilo-Org | full | custom | false |
|
||||
| roo | Roo Code | Roo (OSS) | full | guide | false |
|
||||
| continue | Continue | continue.dev | full | guide | false |
|
||||
| qwen | Qwen Code | Alibaba | full | guide | true |
|
||||
| aider | Aider | OSS (P. Gauthier) | full | guide | true |
|
||||
| forge | ForgeCode | Antinomy HQ | full | custom | true |
|
||||
| jcode | jcode | 1jehuang (OSS) | full | custom | false |
|
||||
| deepseek-tui | DeepSeek TUI | Hunter Bown (OSS) | full | custom | false |
|
||||
| opencode | OpenCode | Anomaly (ex-SST) | full | guide | true |
|
||||
| droid | Factory Droid | Factory AI | partial | guide | false |
|
||||
| copilot | GitHub Copilot CLI | GitHub/MS | full | custom | false |
|
||||
| gemini-cli | Gemini CLI | Google | partial | guide | true |
|
||||
| cursor-cli | Cursor CLI | Anysphere | partial | guide | true |
|
||||
| smelt | Smelt | leonardcser (OSS) | full | custom | false |
|
||||
| pi | Pi (pi-coding-agent) | M. Zechner (OSS) | full | custom | false |
|
||||
| custom | Custom CLI | — | full | custom-builder | false |
|
||||
|
||||
Tools with `baseUrlSupport: "partial"` show a badge "⚠ Base URL parcial" in the dashboard card.
|
||||
|
||||
---
|
||||
|
||||
## 2. CLI Agents Catalog (6 tools)
|
||||
|
||||
Autonomous agents that appear in `/dashboard/cli-agents`:
|
||||
|
||||
| id | name | vendor | baseUrlSupport | acpSpawnable |
|
||||
|----|------|--------|---------------|-------------|
|
||||
| hermes-agent | Hermes Agent | Nous Research | full | false |
|
||||
| openclaw | OpenClaw | OSS (P. Steinberger) | full | true |
|
||||
| goose | Goose | Block / Linux Foundation | full | true |
|
||||
| interpreter | Open Interpreter | OSS | full | true |
|
||||
| warp | Warp AI | Warp Inc. | partial | true |
|
||||
| agent-deck | Agent Deck | asheshgoplani (OSS) | full | false |
|
||||
|
||||
---
|
||||
|
||||
## 3. ACP Agents (/dashboard/acp-agents)
|
||||
|
||||
This page (renamed from `/dashboard/agents`) shows CLIs that OmniRoute can **spawn** as backend execution engines via stdio/ACP protocol. The catalog is maintained separately in `src/lib/acp/registry.ts` and is **not** the same as `CLI_TOOLS`.
|
||||
|
||||
Current ACP-spawnable CLIs (from `acpSpawnable: true` in `CLI_TOOLS` + ACP registry): codex, claude, goose, gemini-cli, openclaw, aider, opencode, cline, qwen-code, forge, interpreter, cursor-cli, warp.
|
||||
|
||||
---
|
||||
|
||||
## 4. MITM Backlog (not shown in dashboard)
|
||||
|
||||
The following CLIs do not support custom base URL natively and are **not listed** in CLI Code's or CLI Agents pages. They are candidates for MITM interception in plan 11:
|
||||
|
||||
| CLI | Reason |
|
||||
|-----|--------|
|
||||
| windsurf | BYOK limited to select Claude models + corporate URL/token |
|
||||
| amp | Closed ecosystem (Sourcegraph) |
|
||||
| amazon-q / kiro-cli | AWS SSO auth, no custom URL |
|
||||
| cowork | Anthropic Desktop, no configurable endpoint |
|
||||
|
||||
See `_tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md` for the full cross-reference.
|
||||
|
||||
---
|
||||
|
||||
## 5. Batch Detection API
|
||||
|
||||
All tool detection is aggregated via a single endpoint:
|
||||
|
||||
**`GET /api/cli-tools/all-statuses`**
|
||||
|
||||
- Auth: `requireCliToolsAuth(request)` (same as other `/api/cli-tools/` routes)
|
||||
- Returns: `Record<toolId, ToolBatchStatus>` (type: `src/shared/types/cliBatchStatus.ts`)
|
||||
- Strategy: `Promise.all` over all tools, 5s timeout per tool
|
||||
- Cache: in-memory LRU indexed by config file `mtime`. Cache invalidated when mtime changes. Reset on server restart.
|
||||
|
||||
Response shape per tool:
|
||||
```ts
|
||||
interface ToolBatchStatus {
|
||||
detection: {
|
||||
installed: boolean;
|
||||
runnable: boolean;
|
||||
version?: string;
|
||||
command?: string;
|
||||
commandPath?: string;
|
||||
reason?: string;
|
||||
};
|
||||
config: {
|
||||
status: "configured" | "not_configured" | "not_installed" | "unknown" | "other";
|
||||
endpoint?: string | null;
|
||||
lastConfiguredAt?: string | null;
|
||||
};
|
||||
error?: string; // sanitized, no stack traces
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Settings Handlers for New Tools
|
||||
|
||||
New tools with `configType: "custom"` have dedicated settings API routes:
|
||||
|
||||
| Route | Tool |
|
||||
|-------|------|
|
||||
| `POST /api/cli-tools/forge-settings` | ForgeCode (.forge.toml) |
|
||||
| `POST /api/cli-tools/jcode-settings` | jcode (--base-url flag) |
|
||||
| `POST /api/cli-tools/deepseek-tui-settings` | DeepSeek TUI (OPENAI_BASE_URL) |
|
||||
| `POST /api/cli-tools/smelt-settings` | Smelt |
|
||||
| `POST /api/cli-tools/pi-settings` | Pi coding agent |
|
||||
|
||||
All routes use `sanitizeErrorMessage()` for error responses (Hard Rule #12).
|
||||
|
||||
---
|
||||
|
||||
## 7. Dashboard Pages Architecture
|
||||
|
||||
### CLI Code's (`/dashboard/cli-code`)
|
||||
- `src/app/(dashboard)/dashboard/cli-code/page.tsx` — server component
|
||||
- `src/app/(dashboard)/dashboard/cli-code/CliCodePageClient.tsx` — client grid
|
||||
- `src/app/(dashboard)/dashboard/cli-code/[id]/page.tsx` — tool detail page
|
||||
- `src/app/(dashboard)/dashboard/cli-code/components/` — 12 specialized tool cards + `ToolDetailClient.tsx`
|
||||
|
||||
### CLI Agents (`/dashboard/cli-agents`)
|
||||
- `src/app/(dashboard)/dashboard/cli-agents/page.tsx` — server component
|
||||
- `src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx` — client grid
|
||||
- `src/app/(dashboard)/dashboard/cli-agents/[id]/page.tsx` — reuses `ToolDetailClient`
|
||||
|
||||
### ACP Agents (`/dashboard/acp-agents`)
|
||||
- `src/app/(dashboard)/dashboard/acp-agents/page.tsx` — server component (moved from `agents/`)
|
||||
|
||||
### Shared UI Components (`src/shared/components/cli/`)
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `CliToolCard.tsx` | Smart status card (detection + config + endpoint) |
|
||||
| `CliConceptCard.tsx` | Per-page concept explanation card |
|
||||
| `CliComparisonCard.tsx` | Three-column comparison across CLI types |
|
||||
| `BaseUrlSelect.tsx` | Endpoint dropdown (Local/Cloud/Custom) |
|
||||
| `ApiKeySelect.tsx` | API key selector |
|
||||
| `ManualConfigModal.tsx` | Copiable config snippet modal |
|
||||
|
||||
### Shared Hook (`src/shared/hooks/cli/`)
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `useToolBatchStatuses.ts` | Fetches `/api/cli-tools/all-statuses`, manages loading/refresh state |
|
||||
|
||||
---
|
||||
|
||||
## 8. i18n
|
||||
|
||||
New namespaces added in plan 14 F9:
|
||||
|
||||
| Namespace | Purpose |
|
||||
|-----------|---------|
|
||||
| `cliCommon` | Shared strings (card labels, concept/comparison texts, detail page labels) |
|
||||
| `cliCode` | CLI Code's page strings |
|
||||
| `cliAgents` | CLI Agents page strings |
|
||||
| `acpAgents` | ACP Agents page strings |
|
||||
|
||||
Full PT-BR and EN translations are provided. 39 other locales fall back to EN automatically via namespace-level merge in `src/i18n/request.ts`.
|
||||
|
||||
---
|
||||
|
||||
## 9. Quick Start
|
||||
|
||||
### Step 1 — Get an OmniRoute API Key
|
||||
|
||||
1. Open the OmniRoute dashboard → **API Manager** (`/dashboard/api-manager`)
|
||||
2. Click **Create API Key**
|
||||
3. Give it a name (e.g. `cli-tools`) and select all permissions
|
||||
4. Copy the key — you'll need it for every CLI below
|
||||
1. Open `/dashboard/api-manager` → **Create API Key**
|
||||
2. Give it a name (e.g. `cli-tools`) and select all permissions
|
||||
3. Copy the key — you'll need it for every CLI below
|
||||
|
||||
> Your key looks like: `sk-xxxxxxxxxxxxxxxx-xxxxxxxxx`
|
||||
|
||||
@@ -128,29 +264,32 @@ npm install -g kilocode
|
||||
# Qwen Code (Alibaba)
|
||||
npm install -g @qwen-code/qwen-code
|
||||
|
||||
# Kiro CLI (Amazon — requires curl + unzip)
|
||||
apt-get install -y unzip # on Debian/Ubuntu
|
||||
curl -fsSL https://cli.kiro.dev/install | bash
|
||||
export PATH="$HOME/.local/bin:$PATH" # add to ~/.bashrc
|
||||
```
|
||||
# Aider
|
||||
pip install aider-chat
|
||||
|
||||
**Verify:**
|
||||
# Smelt
|
||||
cargo install smelt # Rust-based
|
||||
|
||||
```bash
|
||||
claude --version # 2.x.x
|
||||
codex --version # 0.x.x
|
||||
opencode --version # x.x.x
|
||||
cline --version # 2.x.x
|
||||
kilocode --version # x.x.x (or: kilo --version)
|
||||
qwen --version # x.x.x
|
||||
kiro-cli --version # 1.x.x
|
||||
# Pi coding agent
|
||||
# see https://github.com/zechnerj/pi-coding-agent for install
|
||||
|
||||
# jcode
|
||||
# see https://github.com/1jehuang/jcode for install
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 3 — Set Global Environment Variables
|
||||
### Step 3 — Configure via Dashboard
|
||||
|
||||
Add to `~/.bashrc` (or `~/.zshrc`), then run `source ~/.bashrc`:
|
||||
1. Go to `http://localhost:20128/dashboard/cli-code`
|
||||
2. Find your tool in the grid
|
||||
3. Click the card to open the tool detail page
|
||||
4. Select your API key and base URL
|
||||
5. Click **Apply Config** or copy the manual config snippet
|
||||
|
||||
---
|
||||
|
||||
### Step 4 — Set Global Environment Variables
|
||||
|
||||
```bash
|
||||
# OmniRoute Universal Endpoint
|
||||
@@ -158,533 +297,39 @@ export OPENAI_BASE_URL="http://localhost:20128/v1"
|
||||
export OPENAI_API_KEY="sk-your-omniroute-key"
|
||||
export ANTHROPIC_BASE_URL="http://localhost:20128"
|
||||
export ANTHROPIC_AUTH_TOKEN="sk-your-omniroute-key"
|
||||
export GEMINI_BASE_URL="http://localhost:20128/v1"
|
||||
export GEMINI_API_KEY="sk-your-omniroute-key"
|
||||
```
|
||||
|
||||
> For a **remote server** replace `localhost:20128` with the server IP or domain,
|
||||
> e.g. `http://192.168.0.15:20128`.
|
||||
|
||||
---
|
||||
|
||||
### Step 4 — Configure Each Tool
|
||||
|
||||
#### Claude Code
|
||||
|
||||
```bash
|
||||
# Create ~/.claude/settings.json:
|
||||
mkdir -p ~/.claude && cat > ~/.claude/settings.json << EOF
|
||||
{
|
||||
"env": {
|
||||
"ANTHROPIC_BASE_URL": "http://localhost:20128",
|
||||
"ANTHROPIC_AUTH_TOKEN": "sk-your-omniroute-key"
|
||||
}
|
||||
}
|
||||
EOF
|
||||
```
|
||||
|
||||
Use the unified Anthropic gateway root for Claude Code. Do not append `/v1` here.
|
||||
|
||||
**Test:** `claude "say hello"`
|
||||
|
||||
---
|
||||
|
||||
#### OpenAI Codex
|
||||
|
||||
```bash
|
||||
mkdir -p ~/.codex && cat > ~/.codex/config.yaml << EOF
|
||||
model: auto
|
||||
apiKey: sk-your-omniroute-key
|
||||
apiBaseUrl: http://localhost:20128/v1
|
||||
EOF
|
||||
```
|
||||
|
||||
**Test:** `codex "what is 2+2?"`
|
||||
|
||||
---
|
||||
|
||||
#### OpenCode
|
||||
|
||||
```bash
|
||||
mkdir -p ~/.config/opencode && cat > ~/.config/opencode/opencode.json << EOF
|
||||
{
|
||||
"\$schema": "https://opencode.ai/config.json",
|
||||
"provider": {
|
||||
"omniroute": {
|
||||
"npm": "@ai-sdk/openai-compatible",
|
||||
"name": "OmniRoute",
|
||||
"options": {
|
||||
"baseURL": "http://localhost:20128/v1",
|
||||
"apiKey": "sk-your-omniroute-key"
|
||||
},
|
||||
"models": {
|
||||
"claude-sonnet-4-5": { "name": "claude-sonnet-4-5" },
|
||||
"claude-sonnet-4-5-thinking": { "name": "claude-sonnet-4-5-thinking" },
|
||||
"gemini-3-flash": { "name": "gemini-3-flash" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
```
|
||||
|
||||
**Test:** `opencode`
|
||||
|
||||
> Use `opencode run "your prompt" --model omniroute/claude-sonnet-4-5-thinking --variant high`
|
||||
> to send thinking variants.
|
||||
|
||||
---
|
||||
|
||||
#### Cline (CLI or VS Code)
|
||||
|
||||
**CLI mode:**
|
||||
|
||||
```bash
|
||||
mkdir -p ~/.cline/data && cat > ~/.cline/data/globalState.json << EOF
|
||||
{
|
||||
"apiProvider": "openai",
|
||||
"openAiBaseUrl": "http://localhost:20128/v1",
|
||||
"openAiApiKey": "sk-your-omniroute-key"
|
||||
}
|
||||
EOF
|
||||
```
|
||||
|
||||
**VS Code mode:**
|
||||
Cline extension settings → API Provider: `OpenAI Compatible` → Base URL: `http://localhost:20128/v1`
|
||||
|
||||
Or use the OmniRoute dashboard → **CLI Tools → Cline → Apply Config**.
|
||||
|
||||
---
|
||||
|
||||
#### KiloCode (CLI or VS Code)
|
||||
|
||||
**CLI mode:**
|
||||
|
||||
```bash
|
||||
kilocode --api-base http://localhost:20128/v1 --api-key sk-your-omniroute-key
|
||||
```
|
||||
|
||||
**VS Code settings:**
|
||||
|
||||
```json
|
||||
{
|
||||
"kilo-code.openAiBaseUrl": "http://localhost:20128/v1",
|
||||
"kilo-code.apiKey": "sk-your-omniroute-key"
|
||||
}
|
||||
```
|
||||
|
||||
Or use the OmniRoute dashboard → **CLI Tools → KiloCode → Apply Config**.
|
||||
|
||||
---
|
||||
|
||||
#### Continue (VS Code Extension)
|
||||
|
||||
Edit `~/.continue/config.yaml`:
|
||||
|
||||
```yaml
|
||||
models:
|
||||
- name: OmniRoute
|
||||
provider: openai
|
||||
model: auto
|
||||
apiBase: http://localhost:20128/v1
|
||||
apiKey: sk-your-omniroute-key
|
||||
default: true
|
||||
```
|
||||
|
||||
Restart VS Code after editing.
|
||||
|
||||
---
|
||||
|
||||
#### Kiro CLI (Amazon)
|
||||
|
||||
```bash
|
||||
# Login to your AWS/Kiro account:
|
||||
kiro-cli login
|
||||
|
||||
# The CLI uses its own auth — OmniRoute is not needed as backend for Kiro CLI itself.
|
||||
# Use kiro-cli alongside OmniRoute for other tools.
|
||||
kiro-cli status
|
||||
```
|
||||
|
||||
For the **Kiro IDE** desktop app, use the MITM endpoint exposed by OmniRoute
|
||||
under `/dashboard/cli-tools → Kiro`.
|
||||
|
||||
---
|
||||
|
||||
#### Qwen Code (Alibaba)
|
||||
|
||||
Qwen Code supports OpenAI-compatible API endpoints via environment variables or `settings.json`.
|
||||
|
||||
> Qwen OAuth free tier was discontinued on 2026-04-15. Use OmniRoute with
|
||||
> `bailian-coding-plan` / `alibaba` / `alibaba-cn` / `openrouter` / `anthropic` /
|
||||
> `gemini` providers instead.
|
||||
|
||||
**Option 1: Environment variables (`~/.qwen/.env`)**
|
||||
|
||||
```bash
|
||||
mkdir -p ~/.qwen && cat > ~/.qwen/.env << EOF
|
||||
OPENAI_API_KEY="sk-your-omniroute-key"
|
||||
OPENAI_BASE_URL="http://localhost:20128/v1"
|
||||
OPENAI_MODEL="auto"
|
||||
EOF
|
||||
```
|
||||
|
||||
**Option 2: `settings.json` with `security.auth`**
|
||||
|
||||
```json
|
||||
// ~/.qwen/settings.json
|
||||
{
|
||||
"security": {
|
||||
"auth": {
|
||||
"selectedType": "openai",
|
||||
"apiKey": "sk-your-omniroute-key",
|
||||
"baseUrl": "http://localhost:20128/v1"
|
||||
}
|
||||
},
|
||||
"model": {
|
||||
"name": "claude-sonnet-4-6"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Option 3: Inline CLI flags**
|
||||
|
||||
```bash
|
||||
OPENAI_BASE_URL="http://localhost:20128/v1" \
|
||||
OPENAI_API_KEY="sk-your-omniroute-key" \
|
||||
OPENAI_MODEL="auto" \
|
||||
qwen
|
||||
```
|
||||
|
||||
> For a **remote server** replace `localhost:20128` with the server IP or domain.
|
||||
|
||||
**Test:** `qwen "say hello"`
|
||||
|
||||
---
|
||||
|
||||
#### Cursor (Desktop App)
|
||||
## 10. Internal OmniRoute CLI
|
||||
|
||||
> **Note:** Cursor routes requests through its cloud. For OmniRoute integration,
|
||||
> enable **Cloud Endpoint** in OmniRoute Settings and use your public domain URL.
|
||||
|
||||
Via GUI: **Settings → Models → OpenAI API Key**
|
||||
|
||||
- Base URL: `https://your-domain.com/v1`
|
||||
- API Key: your OmniRoute key
|
||||
|
||||
---
|
||||
|
||||
#### Windsurf (Desktop IDE)
|
||||
|
||||
> Official Windsurf docs currently describe BYOK for select Claude models plus
|
||||
> enterprise URL/token settings, not a generic custom OpenAI-compatible provider.
|
||||
> Test BYOK behavior in your environment before relying on this integration.
|
||||
|
||||
1. Open AI Settings inside Windsurf.
|
||||
2. Select **Add custom provider** (OpenAI-compatible).
|
||||
3. Base URL: `http://localhost:20128/v1`
|
||||
4. API Key: your OmniRoute key
|
||||
5. Pick a model from the OmniRoute catalog.
|
||||
|
||||
---
|
||||
|
||||
#### Hermes
|
||||
|
||||
```json
|
||||
// Hermes config file
|
||||
{
|
||||
"provider": {
|
||||
"type": "openai",
|
||||
"baseURL": "http://localhost:20128/v1",
|
||||
"apiKey": "sk-your-omniroute-key",
|
||||
"model": "claude-sonnet-4-6"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### Amp CLI (Sourcegraph)
|
||||
|
||||
```bash
|
||||
export OPENAI_API_KEY="sk-your-omniroute-key"
|
||||
export OPENAI_BASE_URL="http://localhost:20128/v1"
|
||||
amp --model "claude-sonnet-4-6"
|
||||
|
||||
# Suggested shorthand aliases you can map locally:
|
||||
# g25p -> gemini/gemini-2.5-pro
|
||||
# g25f -> gemini/gemini-2.5-flash
|
||||
# cs45 -> cc/claude-sonnet-4-5-20250929
|
||||
# g54 -> gemini/gemini-3.1-pro-high
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Dashboard Auto-Configuration
|
||||
|
||||
The OmniRoute dashboard automates configuration for most tools:
|
||||
|
||||
1. Go to `http://localhost:20128/dashboard/cli-tools`
|
||||
2. Expand any tool card
|
||||
3. Select your API key from the dropdown
|
||||
4. Click **Apply Config** (if the tool is detected as installed)
|
||||
5. Or copy the generated config snippet manually
|
||||
|
||||
---
|
||||
|
||||
### Built-in Agents: Droid & Open Claw
|
||||
|
||||
**Droid** and **Open Claw** are AI agents built directly into OmniRoute — no
|
||||
installation needed. They run as internal routes and use OmniRoute's model
|
||||
routing automatically.
|
||||
|
||||
- Access: `http://localhost:20128/dashboard/agents`
|
||||
- Configure: same combos and providers as all other tools
|
||||
- No API key or CLI install required
|
||||
|
||||
---
|
||||
|
||||
## 2. Internal OmniRoute CLI
|
||||
|
||||
The `omniroute` binary (installed via `npm install -g omniroute` or bundled
|
||||
with the desktop app) provides commands beyond running the server. The full
|
||||
matrix is implemented in:
|
||||
|
||||
- `bin/omniroute.mjs` — entry point, env loading, special-case dispatch (`--mcp`)
|
||||
- `bin/cli/program.mjs` — Commander program builder
|
||||
- `bin/cli/commands/<cmd>.mjs` — one file per command/group, registered in `registry.mjs`
|
||||
- `bin/cli/output.mjs` — output formatters (json/jsonl/table/csv)
|
||||
- `bin/cli/runtime.mjs` — withRuntime helper (server-first/db-fallback)
|
||||
- `bin/cli/i18n.mjs` — t() helper with locales
|
||||
|
||||
### Server Lifecycle
|
||||
The `omniroute` binary provides commands for server lifecycle, setup, diagnostics, and provider management. Entry point: `bin/omniroute.mjs`.
|
||||
|
||||
```bash
|
||||
omniroute # Start server (default port 20128)
|
||||
omniroute --port 3000 # Override port
|
||||
omniroute --no-open # Don't auto-open browser
|
||||
omniroute --mcp # Start as MCP server (stdio transport)
|
||||
omniroute serve # Same as `omniroute`
|
||||
omniroute stop # Stop the running server
|
||||
omniroute restart # Restart the server
|
||||
omniroute dashboard # Open dashboard in default browser
|
||||
omniroute open # Alias for `dashboard`
|
||||
omniroute setup # Interactive setup wizard
|
||||
omniroute doctor # Check config, DB, ports, runtime
|
||||
omniroute providers list # Configured provider connections
|
||||
omniroute providers test-all # Test every active connection
|
||||
omniroute reset-password # Reset the admin password
|
||||
omniroute logs # Stream request logs
|
||||
omniroute health # Detailed health (breakers, cache, memory)
|
||||
omniroute --version # Print version
|
||||
omniroute --help # Show all commands
|
||||
```
|
||||
|
||||
### Setup & Initialization
|
||||
|
||||
```bash
|
||||
omniroute setup # Interactive setup wizard
|
||||
omniroute setup --non-interactive # CI/automation mode (reads env vars + flags)
|
||||
omniroute setup --password '<value>' # Set admin password directly
|
||||
omniroute setup --add-provider \
|
||||
--provider openai \
|
||||
--api-key '<value>' \
|
||||
--test-provider # Add and test a provider in one shot
|
||||
```
|
||||
|
||||
Recognized environment variables for non-interactive setup:
|
||||
|
||||
| Var | Purpose |
|
||||
| ----------------------------- | -------------------------------------------- |
|
||||
| `OMNIROUTE_SETUP_PASSWORD` | Admin password (>=8 chars) |
|
||||
| `OMNIROUTE_PROVIDER` | Provider id (e.g. `openai`, `anthropic`) |
|
||||
| `OMNIROUTE_PROVIDER_NAME` | Display name for the connection |
|
||||
| `OMNIROUTE_PROVIDER_BASE_URL` | Optional OpenAI-compatible base URL override |
|
||||
| `OMNIROUTE_API_KEY` | Provider API key |
|
||||
| `OMNIROUTE_DEFAULT_MODEL` | Optional default model |
|
||||
| `DATA_DIR` | Override the OmniRoute data directory |
|
||||
|
||||
### Diagnostics
|
||||
|
||||
```bash
|
||||
omniroute doctor # Check config, DB, ports, runtime, memory, liveness
|
||||
omniroute doctor --json # Machine-readable JSON
|
||||
omniroute doctor --no-liveness # Skip the HTTP health probe
|
||||
omniroute doctor --host 0.0.0.0 # Override liveness host
|
||||
omniroute doctor --liveness-url <url> # Full health endpoint URL override
|
||||
```
|
||||
|
||||
The doctor runs these checks: `Config`, `Database`, `Storage/encryption`,
|
||||
`Port availability`, `Node runtime`, `Native binary` (better-sqlite3),
|
||||
`Memory`, and `Server liveness`. It exits non-zero if any check is `fail`.
|
||||
|
||||
### Provider Management
|
||||
|
||||
```bash
|
||||
omniroute providers available # OmniRoute provider catalog
|
||||
omniroute providers available --search openai # Filter catalog by id/name/alias/category
|
||||
omniroute providers available --category api-key # Filter by category (api-key, oauth, free, ...)
|
||||
omniroute providers available --json # Machine-readable JSON
|
||||
|
||||
omniroute providers list # Configured provider connections
|
||||
omniroute providers list --json
|
||||
|
||||
omniroute providers test <id|name> # Test one configured connection
|
||||
omniroute providers test-all # Test every active connection
|
||||
omniroute providers validate # Local-only structural validation
|
||||
```
|
||||
|
||||
> `providers available` reads the OmniRoute catalog; `providers list/test/test-all/validate`
|
||||
> read the local SQLite database directly and do not require the server to be running.
|
||||
|
||||
### Recovery & Reset
|
||||
|
||||
```bash
|
||||
omniroute reset-password # Reset the admin password (legacy alias still works)
|
||||
omniroute reset-encrypted-columns # Show warning + dry-run for encrypted credential reset
|
||||
omniroute reset-encrypted-columns --force # Actually null out encrypted credentials in SQLite
|
||||
```
|
||||
|
||||
### Other subcommands
|
||||
|
||||
These assume a running OmniRoute server, unless noted otherwise:
|
||||
|
||||
```bash
|
||||
omniroute status # Comprehensive runtime status
|
||||
omniroute logs # Stream request logs (--json, --search, --follow)
|
||||
omniroute config show # Display current configuration
|
||||
|
||||
omniroute provider list # List available providers (alias of providers list)
|
||||
omniroute provider add # Register OmniRoute as a provider on a tool
|
||||
omniroute keys add | list | remove # Manage API keys
|
||||
omniroute models [provider] # List models (--json, --search)
|
||||
omniroute combo list | switch | create | delete
|
||||
|
||||
omniroute backup # Snapshot config + DB
|
||||
omniroute restore # Restore from a previous snapshot
|
||||
|
||||
omniroute health # Detailed health (breakers, cache, memory)
|
||||
omniroute quota # Provider quota usage
|
||||
omniroute cache # Cache status
|
||||
omniroute cache clear # Clear semantic + signature caches
|
||||
|
||||
omniroute mcp status | restart # MCP server status / restart
|
||||
omniroute a2a status | card # A2A server status / agent card
|
||||
|
||||
omniroute tunnel list | create | stop # Manage tunnels (cloudflare/tailscale/ngrok)
|
||||
omniroute env show | get <k> | set <k> <v> # Inspect / set env vars (temporary)
|
||||
|
||||
omniroute test # Provider connectivity smoke test
|
||||
omniroute update # Check for updates
|
||||
omniroute completion # Generate shell completion
|
||||
```
|
||||
|
||||
### Common flags
|
||||
|
||||
| Flag | Description |
|
||||
| ------------------- | ------------------------------------------------------ |
|
||||
| `--no-open` | Don't auto-open the browser on start |
|
||||
| `--port <n>` | Override the API port (default 20128) |
|
||||
| `--mcp` | Run as MCP server over stdio (for IDEs) |
|
||||
| `--non-interactive` | CI mode (no prompts; reads from env/flags) |
|
||||
| `--json` | Machine-readable JSON output (doctor, providers, etc.) |
|
||||
| `--help`, `-h` | Show command-specific help |
|
||||
| `--version`, `-v` | Print the installed version |
|
||||
|
||||
---
|
||||
|
||||
## Available API Endpoints
|
||||
|
||||
| Endpoint | Description | Use For |
|
||||
| -------------------------- | ----------------------------- | --------------------------- |
|
||||
| `/v1/chat/completions` | Standard chat (all providers) | All modern tools |
|
||||
| `/v1/responses` | Responses API (OpenAI format) | Codex, agentic workflows |
|
||||
| `/v1/completions` | Legacy text completions | Older tools using `prompt:` |
|
||||
| `/v1/embeddings` | Text embeddings | RAG, search |
|
||||
| `/v1/images/generations` | Image generation | GPT-Image, Flux, etc. |
|
||||
| `/v1/audio/speech` | Text-to-speech | ElevenLabs, OpenAI TTS |
|
||||
| `/v1/audio/transcriptions` | Speech-to-text | Deepgram, AssemblyAI |
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Error | Cause | Fix |
|
||||
| ------------------------------------------------- | --------------------------- | --------------------------------------------------------------------------- |
|
||||
| `Connection refused` | OmniRoute not running | `omniroute serve` or `pm2 start omniroute` |
|
||||
| `401 Unauthorized` | Wrong API key | Check in `/dashboard/api-manager` |
|
||||
| `No combo configured` | No active routing combo | Set up in `/dashboard/combos` |
|
||||
| `invalid model` | Model not in catalog | Use `auto` or check `/dashboard/providers` |
|
||||
| CLI shows "not installed" | Binary not in PATH | Check `which <command>` |
|
||||
| `kiro-cli: not found` | Not in PATH | `export PATH="$HOME/.local/bin:$PATH"` |
|
||||
| `doctor` reports SQLite incompatible | Wrong native binary | `cd app && npm rebuild better-sqlite3` |
|
||||
| `doctor` reports `STORAGE_ENCRYPTION_KEY` missing | Encrypted creds without key | Set `STORAGE_ENCRYPTION_KEY` or `omniroute reset-encrypted-columns --force` |
|
||||
|
||||
---
|
||||
|
||||
## Quick Setup Script (One Command)
|
||||
|
||||
```bash
|
||||
cat > my-setup.sh <<'EOF'
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# === Edit these ===
|
||||
OMNIROUTE_URL="http://localhost:20128/v1"
|
||||
OMNIROUTE_ANTHROPIC_URL="http://localhost:20128"
|
||||
OMNIROUTE_KEY="sk-your-omniroute-key"
|
||||
# ==================
|
||||
|
||||
# 1. Install the external CLIs
|
||||
npm install -g \
|
||||
@anthropic-ai/claude-code \
|
||||
@openai/codex \
|
||||
opencode-ai \
|
||||
cline \
|
||||
kilocode \
|
||||
@qwen-code/qwen-code
|
||||
|
||||
# 2. Optional: Kiro CLI (needs unzip)
|
||||
if ! command -v unzip >/dev/null 2>&1; then
|
||||
sudo apt-get install -y unzip
|
||||
fi
|
||||
curl -fsSL https://cli.kiro.dev/install | bash
|
||||
|
||||
# 3. Write the per-tool config files
|
||||
mkdir -p ~/.claude ~/.codex ~/.config/opencode ~/.continue ~/.qwen
|
||||
|
||||
cat > ~/.claude/settings.json <<JSON
|
||||
{
|
||||
"env": {
|
||||
"ANTHROPIC_BASE_URL": "${OMNIROUTE_ANTHROPIC_URL}",
|
||||
"ANTHROPIC_AUTH_TOKEN": "${OMNIROUTE_KEY}"
|
||||
}
|
||||
}
|
||||
JSON
|
||||
|
||||
cat > ~/.codex/config.yaml <<YAML
|
||||
model: auto
|
||||
apiKey: ${OMNIROUTE_KEY}
|
||||
apiBaseUrl: ${OMNIROUTE_URL}
|
||||
YAML
|
||||
|
||||
cat > ~/.qwen/.env <<ENV
|
||||
OPENAI_API_KEY="${OMNIROUTE_KEY}"
|
||||
OPENAI_BASE_URL="${OMNIROUTE_URL}"
|
||||
OPENAI_MODEL="auto"
|
||||
ENV
|
||||
|
||||
# 4. Append global env vars (idempotent guard)
|
||||
if ! grep -q "OmniRoute Universal Endpoint" ~/.bashrc 2>/dev/null; then
|
||||
cat >> ~/.bashrc <<ENV
|
||||
|
||||
# OmniRoute Universal Endpoint
|
||||
export OPENAI_BASE_URL="${OMNIROUTE_URL}"
|
||||
export OPENAI_API_KEY="${OMNIROUTE_KEY}"
|
||||
export ANTHROPIC_BASE_URL="${OMNIROUTE_ANTHROPIC_URL}"
|
||||
export ANTHROPIC_AUTH_TOKEN="${OMNIROUTE_KEY}"
|
||||
ENV
|
||||
fi
|
||||
|
||||
# 5. Validate via the internal CLI
|
||||
omniroute doctor || true
|
||||
omniroute providers list || true
|
||||
|
||||
echo "All CLIs installed and configured for OmniRoute"
|
||||
EOF
|
||||
chmod +x my-setup.sh
|
||||
./my-setup.sh
|
||||
```
|
||||
| Error | Cause | Fix |
|
||||
|-------|-------|-----|
|
||||
| `Connection refused` | OmniRoute not running | `omniroute serve` |
|
||||
| `401 Unauthorized` | Wrong API key | Check in `/dashboard/api-manager` |
|
||||
| `No combo configured` | No active routing combo | Set up in `/dashboard/combos` |
|
||||
| CLI shows "not installed" | Binary not in PATH | Check `which <command>` |
|
||||
| Dashboard shows "not detected" after install | Cache stale | Click "⟳ Refresh detection" in dashboard |
|
||||
| Old link `/dashboard/cli-tools` | Pre-v3.8.6 bookmark | Auto-redirected to `/dashboard/cli-code` (308) |
|
||||
| Old link `/dashboard/agents` | Pre-v3.8.6 bookmark | Auto-redirected to `/dashboard/acp-agents` (308) |
|
||||
|
||||
@@ -4594,7 +4594,7 @@ export default function ProviderDetailPage() {
|
||||
</div>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<Link
|
||||
href="/dashboard/cli-tools"
|
||||
href="/dashboard/cli-code"
|
||||
className="inline-flex items-center gap-2 rounded-lg border border-border px-3 py-2 text-sm text-text-main hover:border-primary/40 hover:text-text-primary transition-colors"
|
||||
>
|
||||
<span className="material-symbols-outlined text-base">terminal</span>
|
||||
|
||||
@@ -4,7 +4,7 @@ import Link from "next/link";
|
||||
import Image from "next/image";
|
||||
import type { CliCatalogEntry } from "@/shared/schemas/cliCatalog";
|
||||
import type { ToolBatchStatus } from "@/shared/types/cliBatchStatus";
|
||||
import CliStatusBadge from "@/app/(dashboard)/dashboard/cli-tools/components/CliStatusBadge";
|
||||
import CliStatusBadge from "@/app/(dashboard)/dashboard/cli-code/components/CliStatusBadge";
|
||||
import { cn } from "@/shared/utils/cn";
|
||||
|
||||
export interface CliToolCardProps {
|
||||
|
||||
@@ -26,7 +26,7 @@ vi.mock("next-intl", () => ({
|
||||
}));
|
||||
|
||||
// Stub CliStatusBadge so it doesn't need next-intl internals
|
||||
vi.mock("@/app/(dashboard)/dashboard/cli-tools/components/CliStatusBadge", () => ({
|
||||
vi.mock("@/app/(dashboard)/dashboard/cli-code/components/CliStatusBadge", () => ({
|
||||
default: ({
|
||||
effectiveConfigStatus,
|
||||
}: {
|
||||
|
||||
Reference in New Issue
Block a user