Files
OmniRoute/bin/cli/locales/en.json
Diego Rodrigues de Sa e Souza f165efcd0b Release v3.8.28 (#4053)
* chore(release): open v3.8.28 development cycle

* fix(ws): warm SSE auth import on LiveWS startup; relocate boot test to integration (#4063)

The live dashboard WebSocket sidecar lazily import()-ed the SSE auth module
inside the connection handler, only on the API-key path. That cold import pulls
in hundreds of transitive modules and takes ~7s under tsx, blocking the
single-threaded event loop. The first API-key WebSocket connection therefore
stalled the loop long enough that any connection arriving in that window — e.g.
a same-origin cookie client — could not complete its handshake and timed out.

This was deterministic, not an "env flake": the boot test fires an API-key
connection immediately followed by a cookie connection, so the cookie connection
always raced the cold import and timed out (reproduced 3/3 locally and red on
every CI run; proven via instrumented probes — reversing the order or warming
the module first makes both connections open in ~20ms).

Fix:
- Memoize the auth-module import and warm it once at startup (before listen), so
  connection handling never pays the cold-import cost. Real improvement: the
  first API-key client no longer stalls the event loop for concurrent clients.
- Relocate the boot test from tests/unit/cli to tests/integration. It spawns a
  real subprocess + WS server + SQLite (~9-11s); under the unit suite's
  --test-concurrency=20 it contended for CPU and destabilized the shard. The
  serial integration runner is its correct home; it still guards #4004's
  cookie-parse fix on every PR via the integration CI job.
- Bump the test's startup/overall timeouts to absorb the eager auth warm.

Makes `npm run test:unit` deterministically green (the only remaining unit red).

Validated: relocated test 3/3 green via the integration runner (was 3/3 red);
typecheck:core + eslint clean; confirmed it no longer matches the test:unit glob
and does match tests/integration/*.test.ts.

* fix(ws): start LiveWS sidecar with cwd at package root (#4055) (#4064)

* chore(deps): bump ossf/scorecard-action from 2.4.0 to 2.4.3 (#4045)

Integrado em release/v3.8.28. Patch de SHA do ossf/scorecard-action (2.4.0→2.4.3), mantém SHA-pin. Reds de CI são exclusivamente os shards flaky pré-existentes branch-wide (Unit 7/8, Integration, Coverage 7/8, Node 1/2) — não relacionados ao bump (PR deps-only).

* deps: bump electron from 42.4.0 to 42.4.1 in /electron (#4049)

Integrado em release/v3.8.28. Patch do electron (42.4.0→42.4.1). Reds de CI: shards flaky pré-existentes + PR Test Policy = falso-positivo (mudança deps-only sob electron/ não comporta teste de código) + Node 26(2/2) sem step (flake/infra). Precedente #3913/#3914 (electron dependabot mergeado nessas condições).

* fix(auto): resolve built-in auto catalog combos (#4058)

Integrado em release/v3.8.28. Resolve os IDs de catálogo `auto/*` built-in (combos virtuais) — corrige o 400 "No auto combos configured" em auto/best-coding etc. Ajuste de review: os mapas AUTO_TEMPLATE_VARIANTS/VALID_AUTO_VARIANTS duplicados em chat.ts e chatHelpers.ts foram extraídos para open-sse/services/autoCombo/builtinCatalog.ts (DRY), devolvendo chatHelpers.ts <800 LOC; baseline de chat.ts rebaselinado 1432→1458 (lógica nova). Fast QG + semgrep + dast verdes; 22/22 testes.

* chore(docs): update Discord invite link to a non-expiring one (#4067)

* chore(deps): freeze @huggingface/transformers in dependabot (hard-pin) (#4066)

Integrado em release/v3.8.28. Congela @huggingface/transformers no dependabot (pin exato 3.5.2, load-bearing p/ LLMLingua + memory embeddings, VPS-validado #4014). Fast QG + semgrep + dast verdes.

* ci(quality): flip TIA impacted-unit-tests gate from advisory to blocking (#4069)

The pre-existing release unit test-debt that kept the TIA "Impacted unit tests"
step advisory has been cleared:
- #4030 restored 16 lossless Zod/registry reds (from the oyi77 modularize refactors).
- #4063 fixed the last red — the LiveWS boot test — which was a real deterministic
  event-loop stall in the WS sidecar (cold ~7s lazy auth import racing a second
  connection), not an env flake; fixed (warm the import at startup) and relocated to
  the integration suite.

A full workflow_dispatch ci.yml run on release/v3.8.28 then showed all 8 Unit Tests
shards green. The remaining Integration Tests / Quality Ratchet reds are pre-existing
and unrelated (combo/resilience env-flakes; eslint/i18n baseline drift).

Removing continue-on-error makes PR->release block on unit-test regressions in the
TIA-selected impacted set (fail-safe still runs the full unit suite on hub/unmapped
changes). typecheck:core was already blocking. Closes the fast-gates "no tests on
PR->release" hole (Quality Gate v2 / Fase 9, P2).

* docs(compression): document LLMLingua optional deps + on-demand install (#4061)

Integrado em release/v3.8.28. Docs LLMLingua optional deps + on-demand install (F3.1).

* feat(dashboard): Combo Studio connection-cooldown badge (U1b Slice 2) (#4068)

Integrado em release/v3.8.28. Combo Studio connection-cooldown badge (U1b Slice 2 / F5.1).

* feat(compression): record Context Editing telemetry (engine: context-editing) (#4062)

Integrado em release/v3.8.28. Context Editing telemetry (F4.1).

* feat(sse): Context Editing relay coverage + 400-fallback (#4065)

Integrado em release/v3.8.28. Context Editing relay coverage (cc-*) + 400-fallback (F4.2/F4.3). Conflito de file-size-baseline.json (vs #4062) resolvido por união (ambas justificativas + base.ts 1292 + chatCore.ts 5898). Validado local no tree mergeado: typecheck:core ✓, eslint ✓, check:file-size ✓, 4/4 testes ✓; semgrep + semgrep-cloud verdes. Fast QG enfileirado (saturação de runner) — mergeado nos gates de política verificados (precedente #4034/#4020).

* feat(providers): add OrcaRouter (OpenAI-compatible routing gateway) (#4070)

Integrado em release/v3.8.28. Adiciona o provider OrcaRouter (OpenAI-compatible, API-key, DefaultExecutor). Ajuste de review: rebaseline de file-size de providers.ts 3147→3159 (+12 da entrada OrcaRouter). Validado local no tree sincronizado: provider-consistency ✓, docs-counts STRICT 227 ✓, typecheck:core ✓, teste 3/3 ✓, eslint ✓; semgrep + semgrep-cloud verdes. Fast QG/dast enfileirados (saturação de runner) — merge nos gates de política verificados (precedente #4034/#4065).

* test(infra): isolate DATA_DIR per test process; raise Stryker concurrency 1→4 (#4078)

* test(infra): isolate DATA_DIR per test process; raise Stryker concurrency 1→4

Every test process resolved DATA_DIR to the same default (~/.omniroute) when the env
var was unset (src/lib/dataPaths.ts::resolveDataDir), so concurrent test files opened
the SAME on-disk storage.sqlite. node:test spawns a process per file and Stryker spawns
one per sandbox, so this shared file caused cross-file state races:
- SQLite lock contention that hung `npm run test:unit` under high --test-concurrency
  (the ~95-min local hang), and
- the non-deterministic baseline that forced stryker.conf.json to concurrency: 1, which
  in turn could not finish the ~15k-mutant run inside the nightly timeout (the cancelled
  2026-06-16/17 nightly-mutation runs) — blocking Quality Gate v2 / Fase 9 Onda 2.

open-sse/utils/setupPolyfill.ts could NOT host the fix: it is imported by production
(bin/omniroute.mjs, proxyFetch.ts, proxyDispatcher.ts), where redirecting DATA_DIR would
point the live SQLite DB at a throwaway temp dir. So this adds a TEST-ONLY
tests/_setup/isolateDataDir.ts that gives each process its own temp DATA_DIR when none is
set (tests that set DATA_DIR explicitly still win), wired via --import into the test,
mutation and CI invocations.

Verified:
- Stryker dry-run A/B at concurrency=4: FAILS without the isolation import
  (account-fallback-service tap exit 9, a cross-file race) and PASSES with it.
- Full `npm run test:unit` green with isolation (0 fail; a one-off
  chatcore-translation-paths timeout flake did not reproduce and passes 3/3 isolated)
  and noticeably faster — the DB lock contention is gone.
- New tests/unit/isolate-datadir.test.ts guards the contract (unique temp DATA_DIR when
  unset; explicit DATA_DIR respected).

Wired the --import into: package.json (13 test scripts), stryker.conf.json (tap.nodeArgs
+ concurrency 1→4), .github/workflows/quality.yml (TIA step), ci.yml (the 5
unit/coverage/integration commands), and bumped nightly-mutation.yml timeout 120→180 for
the first cold run before the incremental cache is seeded.

* ci(quality): run the TIA gate at CI concurrency (4) to stop oversubscription flakes

The TIA "Impacted unit tests" step (made blocking in #4069) ran its fail-safe via
`npm run test:unit` — concurrency=20, tuned for multi-core dev machines. On a 4-vCPU CI
runner that is 5x oversubscribed, so timing-sensitive tests flake under the load (e.g.
`db-backup-extended` "The database connection is not open", `chatcore-translation-paths`
upstream-timeout). That intermittently fails a blocking gate on legitimate PRs — exactly
what surfaced on the DATA_DIR-isolation PR, whose package.json/workflow changes trip the
__RUN_ALL__ fail-safe.

Run both the impacted set and the fail-safe at --test-concurrency=4, matching the stable
ci.yml unit job. Adds a `test:unit:ci` script (test:unit at concurrency=4). The DATA_DIR
isolation in this PR keeps the parallel run race-free, so the only change here is matching
the runner's core count. Verified locally: db-backup-extended passes 8/8 in isolation
(5 with isolation, 3 without).

* docs(quality-gates): reconcile gate inventory with ci.yml + add ROI rationalization backlog (#4095)

The "authoritative" gate inventory in QUALITY_GATES.md had drifted from ci.yml: it omitted
9 wired gates — `audit:deps`, `check:tracked-artifacts`, `check:lockfile`, `check:licenses`
(lint job), `check:dead-code`, `check:cognitive-complexity`, `check:type-coverage`,
`check:codeql-ratchet` (quality-gate job), and `check:pr-evidence` (pr-test-policy job).
You can't rationalize an inventory you can't trust, so this reconciles it first.

Adds those 9 rows to their job tables and a "Rationalization Backlog (ROI review)" section
capturing the Fase 9 Onda 3 findings: mechanical merge/dedup candidates (CVE scanners
audit:deps↔osv, the two complexity ESLint passes, cycles↔circular-deps, the two /api
anti-hallucination gates, the doubly-run check:docs-sync, check:node-runtime ×11) and the
operator-only flip/drop decisions (typecheck:noimplicit vs the type-coverage ratchet,
test:vitest:ui parked fails, check:secrets frozen FPs, openapi-security-tiers, pr-evidence,
the orphaned semgrep baseline). Also flags the undocumented advisory docs-lint job and the
standalone scanner workflows.

Docs-only — no gate behavior changes. The merges (CI changes) and flips (policy) are
deferred to operator-scoped follow-ups; this PR only makes the map accurate.

* test(dashboard): smoke e2e for the Combo Live Studio page (#4075)

Integrated into release/v3.8.28

* fix(sse): friendly 413 message for ChatGPT web payload-too-large (#4080)

Integrated into release/v3.8.28

* feat(sse): port Claude Code quota-probe bypass + command meta-request helpers (#4083)

Integrated into release/v3.8.28

* feat(api): exact offline token counting for count_tokens fallback via tiktoken (#4087)

Integrated into release/v3.8.28

* feat(compression): RTK learn/discover (sample source + API + UI) (#4088)

Integrated into release/v3.8.28

* feat(dashboard): 2026-06-17 free-tier refresh — honest catalog, uncapped + boost tiers, Layout A budget table (#4089)

Integrated into release/v3.8.28

* feat(mitm): capture-pipeline self-test route (Gap 12) (#4093)

Integrated into release/v3.8.28

* fix(mitm): crash-safe system-state teardown + socket timeouts (ProxyBridge-inspired hardening) (#4084)

Integrated into release/v3.8.28 (Fast QG TIA red = 3 pre-existing timing flakes verified passing locally 82/82; PR own tests green)

* feat(mitm): attribute intercepted requests to originating process (Gap 1) (#4085)

Integrated into release/v3.8.28 (Fast QG TIA red = 3 pre-existing timing flakes verified passing locally 82/82; PR own tests green)

* fix(sse): route image requests only to confirmed-vision combo targets (#4071)

Integrated into release/v3.8.28

* fix(security): injection guard respects INJECTION_GUARD_MODE DB feature flag (#4077)

Integrated into release/v3.8.28

* fix(ws): proxy LAN /live-ws upgrades and add unset JWT_SECRET warning (#4079)

Integrated into release/v3.8.28

* fix(dev): force webpack in custom dev server (Turbopack 16.2.x panics) (#4092)

Integrated into release/v3.8.28

* ci(quality): dedup the doubly-run check:docs-sync + record validated ROI backlog (#4099)

Onda 3 (gate ROI-review) Phase 2. Two parts, both low-risk:

1. Remove the standalone `check:docs-sync` from the `lint` job — it already runs in the
   `docs-sync-strict` job (via `check:docs-all`) and the husky pre-commit hook, so the
   `lint`-job copy was a pure duplicate. No coverage lost.

2. Update the Rationalization Backlog in QUALITY_GATES.md with trust-but-verify findings:
   several "obvious" merges/flips from the ROI review turned out to hide debt and are NOT
   clean drop-ins —
   - CVE merge (audit:deps→osv): different semantics (hard high/critical vs regression-ratchet) — keep both.
   - cycles→circular-deps: dpdm reports 91 cycles (can't promote to blocking) and is broader-scope than the green curated check:cycles — keep both.
   - openapi-security-tiers flip: blocked by traffic-inspector routes missing the x-loopback-only annotation.
   - complexity + /api merges: valid but real config/script surgery — deferred.
   - node-runtime ×11: ~10s savings vs a cheap guard — low ROI, skip.

   The remaining flips (typecheck:noimplicit, test:vitest:ui, check:secrets, pr-evidence,
   semgrep) are operator policy decisions, left for the owner.

* chore(deps): bump actions/github-script from 7 to 9 (#4046)

Integrated into release/v3.8.28 (dependabot GH-Action bump; SHA-pin preserved)

* chore(deps): bump actions/setup-node from 4 to 6 (#4048)

Integrated into release/v3.8.28 (dependabot GH-Action bump; SHA-pin preserved)

* chore(deps): bump actions/upload-artifact from 4 to 7 (#4044)

Integrated into release/v3.8.28 (dependabot GH-Action bump; SHA-pin preserved)

* chore(deps): bump actions/cache from 4.3.0 to 5.0.5 (#4047)

Integrated into release/v3.8.28 (dependabot GH-Action bump; SHA-pin preserved)

* deps: bump the development group with 10 updates (#4051)

Integrated into release/v3.8.28 (dependabot dev group; cyclonedx 4->5 verified compatible with the SBOM invocation --ignore-npm-errors/--output-format JSON/--output-file)

* fix(dashboard): event-driven fail-open auto-refresh for embedded log views (#4054) (#4103)

The Request Logger gated each auto-refresh tick on a static
document.visibilityState === "visible" read. Hosts that report a permanent
non-"visible" state without ever firing a visibilitychange event (Docker
dashboard wrappers, embedded/proxied webviews) froze auto-refresh entirely —
only the manual Refresh button worked, a regression from 3.8.24's unconditional
polling.

The pause is now event-driven and fail-open: visibleRef starts true and is only
flipped to false on a real visibilitychange → hidden transition, so a host that
never signals a genuine background transition keeps polling, while normal
browser tabs still pause when actually backgrounded.

Regression test reproduces the misreporting-host case (RED) and the perf guard
is re-encoded under the event-driven semantics.

* fix(docker): raise build-stage Node heap to stop production-build OOM (#4076) (#4104)

The Docker builder stage ran `npm run build` with V8's default heap ceiling
(~2 GB). After #4052 forced the heavier webpack engine (Turbopack panics on this
Next.js version), the production optimization pass exceeded that ceiling and the
build died with "FATAL ERROR: ... JavaScript heap out of memory" at
[builder] npm run build.

The builder stage now sets NODE_OPTIONS=--max-old-space-size (default 4096 MB,
overridable via --build-arg OMNIROUTE_BUILD_MEMORY_MB) before the build; the
value propagates to the spawned next build (resolveNextBuildEnv spreads
process.env). Build-only — the runtime heap on the runner stage is unchanged,
and CI/local builds (which invoke npm run build directly) are unaffected.

Regression guard: tests/unit/dockerfile-build-heap-4076.test.ts asserts the
builder stage sets the heap ceiling, before npm run build, at >= 4096 MB.

* feat(agent-bridge): portable JSON import/export of config (Gap 4) (#4094)

Integrated into release/v3.8.28

* feat(cli): add 'omniroute launch' zero-config Claude Code launcher (#4097)

Integrated into release/v3.8.28 (Fast QG TIA red = pre-existing env-doc-contract drift [MITM_IDLE_TIMEOUT_MS/TURBOPACK from #4084/#4092] + opencode-plugin-dist env flake; #4097 own test 3/3 green)

* feat(mitm): loop-guard self-check + verbosity control in server.cjs (Gaps 14+15) (#4101)

Integrated into release/v3.8.28 (rebased onto release — dropped the already-squash-merged #4084 commits; only the Gaps 14+15 loop-guard/verbosity delta remains)

* feat(sse): generic 400 field-downgrade retry + Groq field stripping (#4096)

Integrated into release/v3.8.28

* feat(providers): add Wafer AI (Anthropic-compatible, Bearer auth) (#4098)

Integrated into release/v3.8.28

* chore(docs)

* fix(responses): clear /v1/responses keepalive timer on cancel/abort (timer + CPU leak) (#4105)

Integrated into release/v3.8.28 (r7).

* perf(gemini): cache reasoning close-tag regex instead of recompiling per token (#4106)

Integrated into release/v3.8.28 (r7).

* fix(usage): reap orphaned pending-request details (unbounded memory leak) (#4107)

Integrated into release/v3.8.28 (r7).

* perf(stream): use structuredClone instead of JSON round-trip for per-chunk reasoning split (#4108)

Integrated into release/v3.8.28 (r7).

* fix(dashboard): restore Update Available banner with npm-binary-free version fallback (#4100) (#4112)

getLatestNpmVersion() derived the latest version only from the npm CLI binary and returned null on any error, so Docker/desktop/locked-down installs without npm on PATH silently hid the home banner even when an update existed. Add resolveLatestVersion() (npm CLI -> registry HTTP fallback -> logged warning) and harden version parsing for v-prefix/pre-release strings. Extracted into testable src/lib/system/versionCheck.ts with TDD coverage.

* fix(auth): prune expired entries from login brute-force guard map (unbounded growth) (#4111)

Integrated into release/v3.8.28 (r8)

* fix(logger): hard-cap the error-dedup map to bound memory under unique-message bursts (#4113)

Integrated into release/v3.8.28 (r8)

* fix(circuit-breaker): enforce MAX_REGISTRY_SIZE (declared but never applied) (#4114)

Integrated into release/v3.8.28 (r8)

* perf(obfuscation): cache per-word regexes instead of recompiling every request (#4109)

Integrated into release/v3.8.28 (r8)

* perf(registry): precompute model->provider index in parseModelFromRegistry (#4110)

Integrated into release/v3.8.28 (r8)

* fix(timers): unref background interval timers so they don't block clean shutdown (#4117)

Integrated into release/v3.8.28 (r8)

* fix(webhook): clear abort timer in finally to avoid dangling timers on fetch error (#4115)

Integrated into release/v3.8.28 (r8)

* fix(combo): detach per-target listener from shared hedge abort signal (#4116)

Integrated into release/v3.8.28 (r8)

* chore(release): finalize v3.8.28 CHANGELOG + reconcile env-doc contract

- Build the complete [3.8.28] CHANGELOG section (55 bullets) covering every
  commit since v3.8.27, grouped by type with PR back-references and human
  contributor attribution (artickc's memory-leak/perf cluster, OrcaRouter,
  Wafer AI, MITM gaps, etc.); move the OrcaRouter bullet out of [Unreleased].
- Inject the EN [3.8.28] section into all 41 i18n CHANGELOG mirrors (parity).
- Reconcile the env/docs contract: document MITM_IDLE_TIMEOUT_MS + MITM_VERBOSE
  in .env.example and ENVIRONMENT.md; allowlist the framework-internal TURBOPACK
  and the Claude Code ANTHROPIC_AUTH_TOKEN in check-env-doc-sync.
- Fix 3 broken relative links in docs/providers/AGENTROUTER.md (regressed when
  the file was relocated this cycle) so docs-sync-strict passes.

* fix(quality): treat test→test renames as relocations, not deletions

The anti-test-masking gate's subcheck-1 collected deleted AND renamed test
files via `--diff-filter=DR --name-only` and flagged every one as "deleted —
human review required", contradicting its own documented contract ("DELETADOS
ou renomeados-e-NÃO-substituídos"): a rename test→test IS a substitution (the
test moved, coverage preserved). This false-positived on #4063's legitimate
relocation of live-ws-startup.test.ts (unit/cli → integration, asserts 2→2)
and would block every PR that relocates a test — surfacing only at release-day
because the Fast QG (PR→release) doesn't run test-masking.

The gate now parses `--name-status -M`: true deletions and test→non-test
renames still flag; a test→test rename is run through the assert-reduction
check across the move, so a clean relocation passes while gutting-via-rename
(dropped asserts / new tautologies / skips) still fires. Adds
partitionDeletedRenamed + 6 regression tests.

---------

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Demiurge The Single <megamen932@gmail.com>
Co-authored-by: jinhaosong-source <jinhao.song@myflashcloud.com>
Co-authored-by: diego-anselmo <contato@diegoanselmo.com.br>
Co-authored-by: Felipe Almeman <4226997+zhiru@users.noreply.github.com>
Co-authored-by: Rahul sharma <sharmaR0810@gmail.com>
Co-authored-by: Chirag Singhal <76880977+chirag127@users.noreply.github.com>
Co-authored-by: NOXX - Commiter <artur1992123@mail.ru>
2026-06-17 19:26:32 -03:00

1267 lines
45 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"common": {
"error": "Error: {message}",
"serverOffline": "OmniRoute server is offline. Start it with: omniroute serve",
"authRequired": "Authentication required. Set OMNIROUTE_API_KEY or run: omniroute setup",
"rateLimited": "Rate limit exceeded. Retry after {seconds}s.",
"timeout": "Request timed out after {ms}ms.",
"success": "Done.",
"yes": "yes",
"no": "no",
"confirm": "Are you sure? (yes/no)",
"dryRun": "[dry-run] would {action}",
"cancelled": "Cancelled.",
"jsonOpt": "Output as JSON",
"yesOpt": "Skip confirmation prompt"
},
"setup": {
"title": "OmniRoute Setup",
"passwordPrompt": "Admin password",
"providerPrompt": "Default provider (leave blank to skip)",
"done": "Setup complete",
"passwordSet": "Admin password configured",
"providerSet": "Provider configured: {name}",
"testingProvider": "Testing provider connection: {name}",
"testPassed": "Provider test passed",
"testFailed": "Provider test failed: {error}",
"loginEnabled": "Login: enabled (password updated)",
"loginDisabled": "Login: disabled",
"providerInfo": "Provider: {info}",
"opencode": "Install and configure the bundled @omniroute/opencode-plugin for OpenCode"
},
"doctor": {
"title": "OmniRoute Doctor",
"dbOk": "Database: OK ({path})",
"dbMissing": "Database: not initialized — run `omniroute setup`",
"portOk": "Port {port}: available",
"portConflict": "Port {port}: in use by another process",
"encryptionOk": "Encryption key: configured",
"encryptionMissing": "Encryption key missing — run `omniroute setup`",
"allGood": "All checks passed.",
"warnings": "{count} warning(s) — see above."
},
"providers": {
"title": "Providers",
"noProviders": "No providers configured. Run: omniroute setup",
"testing": "Testing {name}...",
"available": "{count} provider(s) available",
"connected": "Connected",
"disconnected": "Disconnected",
"validationFailed": "Validation failed: {error}",
"metrics": {
"description": "Show provider performance metrics (latency, success rate, cost)",
"provider": "Filter by provider ID",
"connection_id": "Filter by connection ID",
"period": "Time period: 1h|6h|24h|7d|30d (default: 24h)",
"metric": "Focus on a specific metric field",
"sort": "Sort by field (descending)",
"limit": "Maximum rows (default: 50)",
"watch": "Refresh every 5s (live mode)",
"compare": "Comma-separated provider IDs to compare side-by-side"
},
"metric_single": {
"description": "Get a single metric value for a specific connection"
},
"rotate": {
"description": "Rotate the upstream API key for a provider connection",
"newKeyOpt": "New API key value (avoid: prefer --from-env)",
"fromEnvOpt": "Read new key from environment variable VAR",
"oauthOpt": "Trigger OAuth re-authentication flow instead",
"skipTestOpt": "Skip post-rotation connectivity test",
"dryRunOpt": "Print what would change without writing",
"confirmPrompt": "Replace API key for connection \"{name}\" ({id})? [y/N] ",
"dryRunResult": "[dry-run] Would rotate key for \"{name}\" ({id}). No changes made.",
"oauthHint": "OAuth connection — run: omniroute oauth {provider}",
"envVarEmpty": "Environment variable {var} is not set or is empty.",
"success": "Key rotated for \"{name}\". Run `providers test {id}` to verify.",
"testPassed": "Post-rotation test passed.",
"testFailed": "Post-rotation test failed: {error}"
},
"status": {
"description": "Show key health for all provider connections (age, expiry, cooldown)",
"providerOpt": "Filter by provider name",
"header": "ID Provider Name Expiry Status Test Status Cooldown Until",
"noData": "No provider connection data available.",
"requiresServer": "providers status requires the OmniRoute server to be running."
}
},
"keys": {
"title": "API Keys",
"addDescription": "Add or update an API key for a provider",
"listDescription": "List all configured API keys",
"removeDescription": "Remove an API key for a provider",
"regenerateDescription": "Regenerate an OmniRoute API key",
"revokeDescription": "Revoke an OmniRoute API key",
"revealDescription": "Reveal the unmasked API key value",
"usageDescription": "Show recent usage for an API key",
"usageLimitOpt": "Number of recent requests",
"rotateDescription": "Generate a new key and invalidate the old one",
"graceOpt": "Grace period (ms) before the old key is invalidated",
"stdinOpt": "Read API key from stdin instead of argument",
"added": "Key added for {provider}.",
"removed": "Key removed.",
"listed": "{count} key(s).",
"noKeys": "No keys configured.",
"noUsage": "No usage data found.",
"confirmRemove": "Remove key {id}?",
"confirmRegenerate": "Regenerate key {id}?",
"confirmRevoke": "Revoke key {id}?",
"confirmRotate": "Rotate key {id}? (old key will be invalidated after grace period)",
"regenerated": "Regenerated. New key: {key}",
"revoked": "Key {id} revoked.",
"rotated": "Key {id} rotated. New key ID: {newId}",
"revealWarning": "⚠ This will display the full unmasked key. Ensure your screen is private.",
"providerRequired": "Provider is required.",
"keyRequired": "API key is required.",
"stdinEmpty": "No API key provided via stdin.",
"unknownProvider": "Unknown provider: {provider}",
"policy": {
"title": "Key Policy",
"showDescription": "Show rate/cost policy for a key",
"setDescription": "Set rate/cost policy for a key",
"rateLimitOpt": "Max requests per minute",
"maxCostOpt": "Max cost per day (USD)",
"allowedModelsOpt": "Comma-separated list of allowed models",
"nothingToSet": "No policy fields provided. Use --rate-limit, --max-cost, or --allowed-models.",
"updated": "Policy updated."
},
"expiration": {
"title": "Key Expiration",
"listDescription": "List keys expiring soon",
"daysOpt": "Show keys expiring within N days",
"none": "No keys expiring within {days} days.",
"listTitle": "Keys expiring within {days} days:"
}
},
"stream": {
"description": "Stream a chat response with SSE inspection modes",
"file": "Read prompt from file",
"stdin": "Read prompt from stdin",
"model": "Model ID (default: auto)",
"system": "System prompt",
"combo": "Force a specific combo by name",
"max_tokens": "Maximum tokens in response",
"responses_api": "Use /v1/responses instead of /v1/chat/completions",
"raw": "Print raw SSE lines as received",
"debug": "Print per-chunk timing info to stderr",
"save": "Save all SSE events to a .jsonl file",
"error": {
"empty_prompt": "Error: prompt is required (positional arg, --file, or --stdin)"
}
},
"usage": {
"description": "Usage analytics, budgets, quotas, and logs",
"analytics": {
"description": "Show aggregated usage analytics",
"period": "Time range: 1d|7d|30d|90d|ytd|all (default: 30d)",
"provider": "Filter by provider ID"
},
"budget": {
"description": "Manage cost budgets",
"set": {
"scope": "Budget scope (default: global)",
"period": "Budget period: daily|weekly|monthly (default: monthly)"
}
},
"quota": {
"description": "Show provider quota usage",
"provider": "Filter by provider ID",
"check": "Show whether quota is available for a new request"
},
"logs": {
"description": "Show request call logs",
"limit": "Number of log entries to return (default: 100)",
"search": "Search query to filter logs",
"since": "Return logs since this timestamp",
"follow": "Continuously tail new log entries",
"api_key": "Filter logs by API key"
},
"utilization": {
"description": "Show API key utilization metrics",
"api_key": "Filter by API key"
},
"history": {
"description": "Show request history",
"limit": "Number of history entries (default: 100)"
},
"proxy_logs": {
"description": "Show proxy-level request logs",
"limit": "Number of proxy log entries (default: 100)"
}
},
"cost": {
"description": "Show cost report with breakdown by provider, model, combo, or API key",
"period": "Time range: 1d|7d|30d|90d|ytd|all (default: 30d)",
"since": "Start date (ISO format, e.g. 2026-01-01) — overrides --period",
"until": "End date (ISO format)",
"group_by": "Group results by: provider|model|api-key|combo|day (default: provider)",
"api_key_filter": "Filter by a specific API key",
"limit": "Maximum number of rows to show (default: 100)"
},
"simulate": {
"description": "Dry-run routing simulation — show which providers would be selected without calling upstream",
"file": "Load full request body from JSON file",
"model": "Model ID (default: auto)",
"combo": "Force a specific combo by name",
"reasoning": "Reasoning effort level (low|medium|high)",
"thinking": "Extended thinking token budget",
"explain": "Print fallback tree and cost range to stderr",
"noCombo": "No matching combo found. Configure one with: omniroute combo create"
},
"chat": {
"description": "Send a one-shot chat prompt to OmniRoute",
"file": "Read prompt from file",
"stdin": "Read prompt from stdin",
"system": "System prompt",
"model": "Model ID (default: auto)",
"max_tokens": "Maximum tokens in response",
"temperature": "Sampling temperature (02)",
"top_p": "Top-p nucleus sampling",
"reasoning_effort": "Reasoning effort level (low|medium|high)",
"thinking_budget": "Extended thinking token budget",
"combo": "Force a specific combo by name",
"responses_api": "Use /v1/responses instead of /v1/chat/completions",
"stream": "Stream response incrementally",
"no_history": "Do not save to ~/.omniroute/cli-history.jsonl",
"error": {
"empty_prompt": "Error: prompt is required (positional arg, --file, or --stdin)"
}
},
"serve": {
"description": "Start the OmniRoute server (default action)",
"starting": "Starting OmniRoute server on port {port}...",
"ready": "Ready at http://localhost:{port}",
"stopping": "Stopping server (PID {pid})...",
"stopped": "Server stopped.",
"notRunning": "Server is not running.",
"port": "Port to listen on (default: 20128)",
"no_open": "Do not open browser automatically",
"daemon": "Run server as a background daemon",
"log": "Show server logs inline",
"no_recovery": "Disable auto-restart on crash (debugging mode)",
"max_restarts": "Max crash restarts within 30s before giving up (default: 2)",
"tray": "Show system tray icon (desktop only, opt-in)",
"no_tray": "Disable system tray icon"
},
"backup": {
"title": "Backup",
"description": "Create a backup of OmniRoute data",
"creating": "Creating backup...",
"done": "Backup saved to {path}",
"noFiles": "No files to backup (database not initialized)",
"failed": "Backup failed: {error}",
"restoring": "Restoring from {path}...",
"restored": "Restore complete.",
"restoreDescription": "Restore from a backup",
"listTitle": "Available Backups",
"noBackups": "No backups found.",
"notFound": "Backup not found: {name}",
"confirmRestore": "Overwrite current data with backup from {ts}?",
"createDescription": "Create a backup of OmniRoute data",
"nameOpt": "Custom backup name",
"cloudOpt": "Upload backup to cloud storage",
"encryptOpt": "Encrypt backup with AES-256-GCM",
"keyFileOpt": "Path to file containing encryption passphrase",
"excludeOpt": "Exclude file matching pattern (repeatable)",
"retentionOpt": "Keep only the last N backups",
"passphrasePrompt": "Encryption passphrase: ",
"noPassphrase": "Passphrase is required for encrypted backup.",
"cloudFailed": "Warning: cloud upload failed. Local backup was saved.",
"cloudUploaded": "Cloud backup uploaded: {url}",
"auto": {
"title": "Backup Schedule",
"enableDescription": "Enable scheduled automatic backups",
"disableDescription": "Disable scheduled automatic backups",
"statusDescription": "Show current backup schedule status",
"cronOpt": "Cron expression for schedule (default: daily at 3am)",
"enabled": "Automatic backup enabled (cron: {cron}).",
"hint": " The schedule is read by omniroute serve on startup.",
"disabled": "Automatic backup disabled.",
"notConfigured": "No backup schedule configured."
}
},
"health": {
"description": "Check server health and component status",
"noServer": "Server not running. Start with: omniroute serve",
"title": "Health",
"status": "Status: {status}",
"uptime": "Uptime: {uptime}",
"requests": "Requests (24h): {count}",
"cost": "Cost (24h): ${cost}"
},
"quota": {
"description": "Show provider quota usage",
"noServer": "Server not running. Start with: omniroute serve",
"noData": "No quota information available."
},
"cache": {
"description": "Manage response cache",
"noServer": "Server not running. Start with: omniroute serve",
"cleared": "Cache cleared.",
"clearFailed": "Failed to clear cache."
},
"test": {
"description": "Test a provider connection",
"noServer": "Server not running. Start with: omniroute serve",
"testing": "Testing {provider} / {model}...",
"passed": "Connection successful!",
"failed": "Connection failed: {error}",
"allProvidersOpt": "Test all configured providers",
"latencyOpt": "Show latency measurements (avg/min/max ms)",
"repeatOpt": "Repeat test N times and aggregate results",
"compareOpt": "Comma-separated models to compare (e.g. gpt-4o,claude-3-5-sonnet)",
"saveOpt": "Save results to a JSON file",
"saved": "Results saved to {path}",
"compareTitle": "Model Comparison",
"compareMinTwo": "At least two models required for --compare (comma-separated)",
"noProviders": "No providers configured. Add one with: omniroute keys add"
},
"update": {
"checking": "Checking for updates...",
"upToDate": "Already up to date ({version}).",
"available": "Update available: {current} → {latest}",
"installing": "Installing {latest}...",
"done": "Updated to {latest}. Restart the server to apply."
},
"mcp": {
"title": "MCP Server",
"running": "MCP server running ({transport})",
"stopped": "MCP server stopped.",
"restarted": "MCP server restarted.",
"call": {
"description": "Invoke an MCP tool directly",
"args": "JSON arguments object (inline)",
"args_file": "Path to JSON arguments file",
"stream": "Use streaming endpoint (/api/mcp/stream)",
"scope": "Required scope (repeatable, e.g. read:health)"
},
"scopes": {
"description": "List available MCP scopes",
"tool": "Show scopes required by a specific tool"
},
"tools": {
"description": "Inspect MCP tools",
"list": {
"description": "List all MCP tools",
"scope": "Filter by scope"
},
"info": {
"description": "Show metadata for an MCP tool"
},
"schema": {
"description": "Show input/output JSON schema for an MCP tool",
"io": "Schema kind: input|output (default: input)"
}
},
"audit": {
"description": "MCP audit log (alias for audit --source mcp)"
}
},
"a2a": {
"skills": {
"description": "List available A2A skills from the agent card"
},
"invoke": {
"description": "Invoke an A2A skill and return the task ID",
"input": "JSON input object",
"input_file": "Path to JSON input file",
"wait": "Wait for task completion before returning",
"timeout": "Timeout waiting for completion in ms (default: 60000)"
},
"tasks": {
"description": "Manage A2A tasks",
"list": {
"status": "Filter by status",
"skill": "Filter by skill ID"
},
"watch": {
"description": "Poll task status until completion"
},
"stream": {
"description": "Stream task execution events via SSE"
},
"logs": {
"description": "Show task messages and artifacts"
}
}
},
"policy": {
"description": "Manage OmniRoute authorization policies",
"list": {
"description": "List policies",
"kind": "Filter by kind (allow|deny|rate-limit|cost-cap)",
"scope": "Filter by scope (global|api-key|provider)"
},
"get": {
"description": "Get policy details by ID"
},
"create": {
"description": "Create a policy from a JSON file",
"file": "Path to policy JSON file"
},
"update": {
"description": "Update a policy from a JSON file",
"file": "Path to policy JSON file"
},
"delete": {
"description": "Delete a policy by ID",
"yes": "Skip confirmation prompt"
},
"evaluate": {
"description": "Dry-run policy evaluation (exit 0=allowed, 4=denied)",
"api_key": "API key to evaluate",
"action": "Action to check (e.g. chat, embed, admin)",
"resource": "Resource path or identifier",
"context": "Additional context as JSON object"
},
"export": {
"description": "Export all policies to a JSON file"
},
"import": {
"description": "Import policies from a JSON file",
"overwrite": "Overwrite existing policies with same ID"
}
},
"compression": {
"description": "Configure and inspect the OmniRoute compression pipeline",
"status": {
"description": "Show current compression status and settings"
},
"configure": {
"description": "Configure compression settings",
"engine": "Compression engine (caveman|rtk|hybrid|none)",
"caveman_agg": "Caveman aggressiveness 0.01.0",
"rtk_budget": "RTK token budget",
"language_pack": "Language pack to activate"
},
"engine": {
"description": "Get or set the active compression engine"
},
"combos": {
"description": "Manage compression combo statistics"
},
"rules": {
"description": "Manage compression rules",
"add": {
"pattern": "Pattern to match (regex or field:pattern)",
"action": "Action: drop|shrink|replace"
}
},
"language_packs": {
"description": "List available compression language packs"
},
"preview": {
"description": "Preview compression effect on a request",
"file": "Path to request JSON file"
}
},
"tunnel": {
"title": "Tunnels",
"listDescription": "List active tunnels",
"createDescription": "Create a tunnel",
"created": "Tunnel created: {url}",
"stopped": "Tunnel stopped.",
"confirmStop": "Stop tunnel {id}?",
"stopDescription": "Stop a tunnel",
"statusDescription": "Show detailed status of a tunnel",
"logsDescription": "Show logs for a tunnel",
"infoDescription": "Show configuration details of a tunnel",
"rotateDescription": "Generate a new tunnel URL",
"tailOpt": "Number of log lines to show",
"typeRequired": "Tunnel type is required.",
"noLogs": "No logs available.",
"notAvailable": "Tunnel info not available.",
"noTunnels": "No active tunnels.",
"infoTitle": "Tunnel info: {type}",
"rotated": "Tunnel URL rotated: {url}",
"confirmRotate": "Rotate tunnel {type}? (a new URL will be generated)"
},
"stop": {
"description": "Stop the OmniRoute server",
"stopping": "Stopping server (PID {pid})...",
"stopped": "Server stopped.",
"notRunning": "No server is running.",
"portFallback": "No PID file found, attempting port-based stop..."
},
"restart": {
"description": "Restart the OmniRoute server",
"restarting": "Restarting OmniRoute server..."
},
"dashboard": {
"description": "Open the OmniRoute dashboard in a browser",
"opening": "Opening dashboard at {url}",
"urlOnly": "Print dashboard URL without opening browser",
"tui": "Open interactive TUI dashboard (terminal UI, 7 tabs)"
},
"models": {
"description": "List available models (requires server)",
"search": "Filter models by id, name, provider, or description",
"noServer": "Server not running. Start with: omniroute serve",
"noModels": "No models found."
},
"audit": {
"description": "Access compliance and MCP audit logs",
"source": "Log source: all|compliance|mcp (default: all)",
"since": "Return entries since this timestamp (ISO 8601)",
"until": "Return entries until this timestamp (ISO 8601)",
"tail": {
"description": "Show recent audit log entries",
"follow": "Continuously tail new entries (2s poll)",
"limit": "Maximum entries to show (default: 100)"
},
"search": {
"description": "Search audit log entries by keyword",
"limit": "Maximum results (default: 200)",
"actor": "Filter by actor ID",
"action": "Filter by action name"
},
"export": {
"description": "Export audit log to file",
"format": "Output format: jsonl|csv (default: jsonl)"
},
"stats": {
"description": "Show audit log statistics",
"period": "Time period: 1d|7d|30d (default: 7d)"
},
"get": {
"description": "Get a single audit log entry by ID"
}
},
"skills": {
"description": "Manage OmniRoute skills (sandbox, builtin, custom, hybrid, skillssh)",
"list": {
"description": "List installed skills",
"type": "Filter by type (sandbox|custom|builtin|hybrid|skillssh)",
"enabled": "Show only enabled skills",
"disabled": "Show only disabled skills",
"api_key": "Filter by API key"
},
"get": {
"description": "Get details for a skill by ID"
},
"install": {
"description": "Install a skill from file or URL",
"from_file": "Path to skill JSON definition file",
"from_url": "URL of remote skill definition",
"type": "Skill type (sandbox|custom|hybrid)",
"enable": "Enable skill after install"
},
"enable": {
"description": "Enable a skill by ID"
},
"disable": {
"description": "Disable a skill by ID",
"yes": "Skip confirmation prompt"
},
"delete": {
"description": "Delete a skill by ID",
"yes": "Skip confirmation prompt"
},
"execute": {
"description": "Execute a skill by ID",
"input": "JSON input object",
"input_file": "Path to JSON input file",
"timeout": "Execution timeout in ms (default: 30000)"
},
"executions": {
"description": "List skill execution history",
"skill": "Filter by skill ID",
"limit": "Maximum results (default: 50)",
"status": "Filter by status (running|completed|failed)"
},
"skillssh": {
"description": "Manage skills installed via SSH"
},
"marketplace": {
"description": "Browse and install skills from the marketplace"
},
"mp": {
"search": {
"description": "Search marketplace packages",
"category": "Filter by category",
"tag": "Filter by tag",
"limit": "Maximum results (default: 30)",
"sort": "Sort by: downloads|rating|recent"
},
"info": {
"description": "Show package details and readme"
},
"install": {
"description": "Install a marketplace package",
"version": "Package version (default: latest)",
"enable": "Enable after install",
"yes": "Skip confirmation prompt"
},
"categories": {
"description": "List marketplace categories"
},
"featured": {
"description": "Show featured marketplace packages"
}
}
},
"memory": {
"description": "Manage OmniRoute conversational memory (FTS5 + vector)",
"search": {
"description": "Search memory entries by semantic query",
"type": "Filter by memory type (user|feedback|project|reference)",
"limit": "Maximum results (default: 20)",
"api_key": "Filter by API key",
"token_budget": "Limit total tokens in results"
},
"add": {
"description": "Add a new memory entry",
"content": "Memory text content",
"file": "Read content from file",
"type": "Memory type (default: user)",
"metadata": "JSON metadata object",
"api_key": "Associate with API key"
},
"clear": {
"description": "Delete memory entries matching filters",
"type": "Filter by type",
"older": "Delete entries older than duration (30d, 6m, 1y)",
"api_key": "Filter by API key",
"yes": "Skip confirmation prompt"
},
"list": {
"description": "List memory entries without search ranking",
"type": "Filter by type",
"limit": "Maximum results (default: 100)",
"api_key": "Filter by API key"
},
"get": {
"description": "Get a single memory entry by ID"
},
"delete": {
"description": "Delete a memory entry by ID",
"yes": "Skip confirmation prompt"
},
"health": {
"description": "Show memory subsystem health (FTS5 + Qdrant)"
}
},
"oauth": {
"description": "Manage OAuth provider connections",
"providers": {
"description": "List OAuth-capable providers and their flow types"
},
"start": {
"description": "Start OAuth authorization flow for a provider",
"provider": "Provider ID (gemini, copilot, cursor, …)",
"no_browser": "Print URL only — do not open browser",
"import_system": "Auto-import credentials from local system config",
"social": "Social login provider (google|github) — required for kiro",
"timeout": "Timeout waiting for authorization in ms (default: 300000)"
},
"status": {
"description": "List active OAuth connections",
"provider": "Filter by provider ID"
},
"revoke": {
"description": "Revoke an OAuth connection",
"provider": "Provider ID to revoke",
"connection_id": "Revoke a specific connection by ID",
"yes": "Skip confirmation prompt"
}
},
"cloud": {
"description": "Manage cloud AI agent tasks (codex, devin, jules)",
"agents": {
"description": "List available cloud agents"
},
"agent": {
"description": "Manage {agent} cloud agent tasks",
"auth": {
"description": "Authorize {agent} via OAuth"
}
},
"task": {
"description": "Manage cloud agent tasks",
"create": {
"description": "Create a new agent task",
"title": "Task title (defaults to first 80 chars of prompt)",
"prompt": "Task prompt text",
"prompt_file": "Read prompt from file",
"repo": "Repository URL to clone for the task",
"branch": "Branch name to use",
"metadata": "JSON metadata object"
},
"list": {
"description": "List agent tasks",
"status": "Filter by status (running|completed|failed|cancelled)",
"limit": "Maximum results (default: 50)"
},
"get": {
"description": "Get task details by ID"
},
"status": {
"description": "Print task status (running|completed|failed|cancelled)"
},
"cancel": {
"description": "Cancel a running task",
"yes": "Skip confirmation prompt"
},
"approve": {
"description": "Approve the agent plan to start execution"
},
"message": {
"description": "Send a message to a running task"
}
},
"sources": {
"description": "List source files produced by a task"
}
},
"eval": {
"description": "Manage eval suites and runs",
"suites": {
"description": "Manage eval suites",
"list": {
"description": "List eval suites"
},
"get": {
"description": "Get eval suite details by ID"
},
"create": {
"description": "Create an eval suite from a JSON file",
"file": "Path to suite definition JSON file"
}
},
"run": {
"description": "Start an eval run for a suite",
"model": "Model ID to evaluate (default: auto)",
"combo": "Force a specific combo by name",
"concurrency": "Number of concurrent samples (default: 4)",
"tag": "Tag this run for later filtering",
"watch": "Watch run progress until completion"
},
"list": {
"description": "List eval runs",
"suite": "Filter by suite ID",
"status": "Filter by status",
"since": "Return runs since this timestamp",
"limit": "Maximum results (default: 50)"
},
"get": {
"description": "Get eval run details by ID"
},
"results": {
"description": "Show sample results for an eval run",
"failed": "Show only failed samples"
},
"cancel": {
"description": "Cancel a running eval",
"yes": "Skip confirmation prompt"
},
"scorecard": {
"description": "Show scorecard for a completed eval run"
}
},
"webhooks": {
"description": "Manage OmniRoute webhooks",
"events": {
"description": "List all available webhook event types"
},
"list": {
"description": "List configured webhooks"
},
"get": {
"description": "Get webhook details by ID"
},
"add": {
"description": "Register a new webhook",
"url": "Destination URL",
"events": "Comma-separated list of event types",
"secret": "HMAC signing secret",
"header": "Extra header in key=value format (repeatable)",
"no_enabled": "Create webhook in disabled state"
},
"update": {
"description": "Update an existing webhook",
"enabled": "Set enabled state (true|false)"
},
"remove": {
"description": "Delete a webhook",
"yes": "Skip confirmation prompt"
},
"test": {
"description": "Send a test event to a webhook",
"event": "Event type to simulate (default: request.completed)"
}
},
"program": {
"description": "OmniRoute — Smart AI Router with Auto Fallback",
"version": "Print version and exit",
"output": "Output format (table, json, jsonl, csv)",
"quiet": "Suppress non-essential output",
"no_color": "Disable colored output",
"timeout": "HTTP request timeout in milliseconds",
"api_key": "API key for OmniRoute server",
"base_url": "OmniRoute server base URL",
"context": "Server context/profile to use for this command",
"lang": "Set CLI display language (overrides OMNIROUTE_LANG)"
},
"files": {
"description": "Manage files (upload, list, get, download, delete)",
"list": {
"purpose": "Filter by purpose",
"limit": "Max results"
},
"get": {
"description": "Get file metadata"
},
"upload": {
"description": "Upload a file",
"purpose": "File purpose (batch, assistants, fine-tune)"
},
"content": {
"description": "Download file content",
"out": "Save to path (default: stdout)"
},
"delete": {
"yes": "Skip confirmation"
}
},
"batches": {
"description": "Manage OpenAI-compatible batch jobs",
"list": {
"status": "Filter by status",
"limit": "Max results"
},
"create": {
"description": "Create a batch job",
"inputFile": "Input file ID",
"endpoint": "Target endpoint",
"window": "Completion window",
"metadata": "Add metadata key=value"
},
"submit": {
"description": "Upload JSONL file and create batch",
"jsonl": "Path to JSONL file",
"endpoint": "Target endpoint",
"wait": "Wait for completion"
},
"cancel": {
"yes": "Skip confirmation"
},
"wait": {
"timeout": "Timeout in ms"
},
"output": {
"out": "Save output to path"
},
"errors": {
"out": "Save errors to path"
}
},
"translator": {
"description": "Translate request bodies between LLM formats",
"detect": {
"description": "Detect body format"
},
"translate": {
"description": "Convert body from one format to another"
},
"send": {
"description": "Translate and dispatch upstream"
},
"stream": {
"description": "Stream-translate a request body"
},
"from": "Source format (openai|anthropic|gemini|cohere)",
"to": "Target format (openai|anthropic|gemini|cohere)",
"file": "Path to request body JSON file",
"out": "Save output to file",
"model": "Override model",
"history": {
"limit": "Max results"
}
},
"pricing": {
"description": "Manage pricing data for models",
"sync": {
"description": "Sync prices from upstream sources",
"provider": "Filter by provider",
"force": "Force re-sync"
},
"list": {
"provider": "Filter by provider",
"model": "Filter by model",
"limit": "Max results"
},
"defaults": {
"description": "Manage default pricing",
"input": "Input cost per 1M tokens (USD)",
"output": "Output cost per 1M tokens (USD)",
"cacheRead": "Cache read cost per 1M tokens (USD)",
"cacheWrite": "Cache write cost per 1M tokens (USD)"
},
"diff": {
"description": "Show divergence from upstream prices",
"model": "Filter by model"
}
},
"resilience": {
"description": "Inspect and manage resilience mechanisms",
"status": {
"provider": "Filter by provider"
},
"breakers": {
"provider": "Filter by provider"
},
"cooldowns": {
"provider": "Filter by provider",
"connectionId": "Filter by connection ID"
},
"lockouts": {
"provider": "Filter by provider",
"model": "Filter by model"
},
"reset": {
"description": "Reset breaker/cooldown state",
"provider": "Provider to reset",
"connectionId": "Connection ID to reset",
"model": "Model to reset lockout",
"allCooldowns": "Reset all cooldowns for provider",
"yes": "Skip confirmation"
},
"profile": {
"description": "Manage resilience profile",
"name": "Profile name"
},
"config": {
"description": "Manage resilience config",
"threshold": "Failure threshold",
"resetTimeout": "Reset timeout in ms",
"baseCooldown": "Base cooldown in ms"
}
},
"nodes": {
"description": "Manage provider nodes (endpoints)",
"list": {
"provider": "Filter by provider",
"enabled": "Only show enabled nodes"
},
"add": {
"provider": "Provider name",
"baseUrl": "Base URL for the node",
"name": "Node name",
"weight": "Load balancing weight",
"region": "Region tag",
"authHeader": "Custom auth header (key=value)"
},
"update": {
"baseUrl": "New base URL",
"name": "New name",
"weight": "New weight",
"region": "New region",
"enabled": "Enable or disable (true|false)"
},
"remove": {
"yes": "Skip confirmation"
},
"validate": {
"baseUrl": "URL to validate",
"provider": "Provider to validate against"
},
"test": {
"description": "Send test request to node"
},
"metrics": {
"description": "Show node metrics",
"period": "Time period (e.g. 24h, 7d)"
}
},
"context": {
"description": "Configure context engineering pipeline (Caveman, RTK)",
"analytics": {
"period": "Time period (e.g. 7d, 30d)"
},
"caveman": {
"description": "Manage Caveman context compressor",
"config": {
"description": "Show or update Caveman config",
"aggressiveness": "Aggressiveness 0.01.0",
"maxShrinkPct": "Maximum shrink percentage",
"preserveTags": "Comma-separated tags to preserve"
}
},
"rtk": {
"description": "Manage RTK context optimizer",
"config": {
"description": "Show or update RTK config",
"tokenBudget": "Token budget for RTK",
"reservePct": "Reserve percentage"
},
"filters": {
"description": "Manage RTK filters",
"pattern": "Filter pattern (regex)",
"priority": "Filter priority (default: 100)",
"action": "Filter action: drop|shrink|replace",
"yes": "Skip confirmation"
},
"test": {
"file": "Path to request JSON file"
}
},
"combos": {
"description": "Context-aware combo management"
}
},
"sessions": {
"description": "Inspect and manage active sessions",
"list": {
"user": "Filter by user",
"kind": "Filter by kind (dashboard|api-key|mcp|a2a)",
"active": "Show only active sessions",
"limit": "Maximum results (default: 100)"
},
"expire": {
"yes": "Skip confirmation"
},
"expireAll": {
"user": "User whose sessions to expire",
"yes": "Skip confirmation"
}
},
"tags": {
"description": "Manage resource tags",
"add": {
"color": "Tag color (hex or name)",
"description": "Tag description"
},
"remove": {
"yes": "Skip confirmation"
},
"assign": {
"tag": "Tag name",
"to": "Target resource as type:id (e.g. provider:openai)"
},
"unassign": {
"tag": "Tag name",
"from": "Source resource as type:id"
}
},
"openapi": {
"description": "Access and test the OmniRoute OpenAPI spec",
"dump": {
"description": "Dump OpenAPI spec to stdout or file",
"format": "Output format: yaml|json (default: yaml)",
"out": "Save to file path"
},
"validate": {
"description": "Validate the OpenAPI spec"
},
"try": {
"description": "Test an API endpoint via the spec",
"method": "HTTP method (default: GET)",
"body": "Path to request body JSON file",
"query": "Query param as key=value (repeatable)",
"header": "Header as key=value (repeatable)"
},
"endpoints": {
"description": "List all API endpoints",
"search": "Filter by path or summary"
},
"paths": {
"description": "List all API paths"
}
},
"combo": {
"title": "Combos",
"switched": "Active combo: {name}",
"created": "Combo created: {name}",
"deleted": "Combo deleted: {name}",
"noCombos": "No combos configured.",
"confirmDelete": "Delete combo {name}?",
"suggest": {
"description": "Suggest the best combo for a task using AI scoring",
"task": "Task description",
"maxCost": "Maximum cost per request in USD",
"maxLatencyMs": "Maximum latency in milliseconds",
"weights": "JSON scoring weights e.g. {\"latency\":0.7,\"cost\":0.3}",
"top": "Number of top candidates to show (default: 5)",
"explain": "Print rationale to stderr",
"switch": "Activate the top-ranked combo"
}
},
"oneproxy": {
"description": "Manage the OneProxy upstream pool",
"stats": {
"provider": "Filter by provider",
"period": "Time period (default: 24h)"
},
"fetch": {
"description": "Fetch proxies from the pool",
"count": "Number of proxies to fetch (default: 1)",
"type": "Proxy type: http|socks5 (default: http)"
},
"rotate": {
"description": "Force proxy rotation",
"provider": "Provider to rotate for",
"connectionId": "Specific connection ID to rotate"
},
"config": {
"description": "Show or update OneProxy config",
"enabled": "Enable proxy pool (true|false)",
"poolSize": "Pool size",
"providerSource": "URL for proxy provider",
"rotationPolicy": "Rotation policy: sticky|per-request|periodic"
},
"pool": {
"description": "List current proxy pool with metrics"
}
},
"open": {
"description": "Open a specific OmniRoute dashboard page in the browser",
"url": "Print URL only, do not open browser"
},
"telemetry": {
"description": "Access aggregated telemetry data",
"summary": {
"description": "Show aggregated telemetry summary",
"period": "Time period: 24h|7d|30d (default: 24h)",
"compareTo": "Compare to previous period"
},
"export": {
"description": "Export telemetry events to JSONL",
"out": "Output file path (default: telemetry.jsonl)",
"period": "Time period for export (default: 7d)"
}
},
"sync": {
"description": "Sync configuration between OmniRoute instances",
"push": {
"description": "Push config to cloud or remote instance",
"target": "Target (cloud or context:name)",
"bundle": "Bundle parts to sync",
"dryRun": "Preview without applying"
},
"pull": {
"description": "Pull config from cloud or remote",
"source": "Source (cloud or context:name)",
"merge": "Merge with existing config",
"replace": "Replace existing config",
"dryRun": "Preview without applying"
},
"diff": {
"source": "Source context",
"target": "Target context"
},
"bundle": {
"description": "Export config as a bundle file",
"include": "Parts to include (comma-separated)"
},
"import": {
"description": "Import a bundle file",
"dryRun": "Validate without applying"
},
"initialize": {
"fromCloud": "Initialize from cloud backup"
},
"tokens": {
"description": "Manage sync tokens",
"create": {
"name": "Token name",
"scope": "Token scope",
"ttl": "Token TTL (e.g. 30d)"
},
"revoke": {
"yes": "Skip confirmation"
}
},
"resolve": {
"description": "Resolve sync conflicts interactively"
}
},
"config": {
"contexts": {
"description": "Manage server contexts/profiles (add, use, list, show, remove, rename, export, import)"
},
"lang": {
"description": "Manage CLI display language",
"getDescription": "Show the currently active language code",
"setDescription": "Set the display language and save it to config",
"listDescription": "List all available languages",
"listTitle": "Available Languages",
"current": "Language: {code} ({name})",
"saved": "Language set to {code} ({name}).",
"noCode": "Language code required. Run 'omniroute config lang list' to see available codes.",
"unknown": "Unknown language code: {code}. Run 'omniroute config lang list' to see available codes.",
"alreadySet": "Language is already set to {code}.",
"envHint": "Tip: you can also set OMNIROUTE_LANG={code} in your environment."
}
},
"completion": {
"description": "Generate or install shell completion scripts",
"zsh": "Print zsh completion script",
"bash": "Print bash completion script",
"fish": "Print fish completion script",
"install": "Install completion script globally for detected shell",
"refresh": "Refresh cache of combos/providers/models"
},
"logs": {
"description": "Stream or export request logs",
"follow": "Stream logs in real-time",
"filter": "Filter by level (error,warn,info) — comma-separated",
"lines": "Number of lines to fetch",
"timeout": "Connection timeout in ms",
"baseUrl": "OmniRoute API base URL",
"requestId": "Filter by request ID",
"apiKey": "Filter by API key",
"combo": "Filter by combo name",
"status": "Filter by HTTP status code",
"durationMin": "Min request duration in ms",
"durationMax": "Max request duration in ms",
"export": "Save logs to file (json/jsonl/csv)",
"exported": "Logs saved to {path}",
"stopped": "Log stream stopped.",
"streamError": "Log stream error: {message}"
},
"tray": {
"description": "Control the system tray icon",
"show": "Show the tray icon (if server is running with --tray)",
"hide": "Hide the tray icon",
"quit": "Quit OmniRoute via tray"
},
"autostart": {
"description": "Manage OmniRoute autostart at boot (Linux: systemd user service)",
"enable": "Enable autostart at boot",
"disable": "Disable autostart at boot",
"toggle": "Toggle autostart at boot",
"status": "Show autostart status"
},
"runtime": {
"description": "Manage native runtime dependencies",
"check": "Check status of native deps in runtime directory",
"repair": "Reinstall native deps in runtime directory",
"repair_force": "Force reinstall even if valid",
"clean": "Remove runtime directory (frees disk space)",
"clean_yes": "Skip confirmation"
},
"repl": {
"description": "Interactive multi-turn REPL with LLM",
"model": "Model to use (default: auto)",
"combo": "Combo name to use",
"system": "System prompt",
"resume": "Resume a saved session by name"
},
"plugin": {
"description": "Manage CLI plugins (omniroute-cmd-*)",
"list": "List installed plugins",
"install": "Install a plugin from npm or local path",
"remove": "Remove an installed plugin",
"info": "Show details for an installed plugin",
"search": "Search npm registry for available plugins",
"update": "Update installed plugin(s)",
"scaffold": "Scaffold a new plugin boilerplate"
},
"launch": {
"description": "Launch Claude Code pointed at the local OmniRoute proxy",
"token": "API key the Claude client should send (ANTHROPIC_AUTH_TOKEN)",
"notRunning": "OmniRoute is not running on port {port}. Start it with 'omniroute serve'.",
"notFound": "The 'claude' CLI was not found in PATH."
}
}