Spaces:
Runtime error
Runtime error
| title: "OmniRoute Codebase Documentation" | |
| version: 3.8.2 | |
| lastUpdated: 2026-05-13 | |
| # OmniRoute Codebase Documentation | |
| > **Version:** v3.8.0 | |
| > **Last updated:** 2026-05-13 | |
| > **Audience:** Engineers contributing to OmniRoute or building integrations on top of it. | |
| > | |
| > For high-level architecture diagrams and the reasoning behind each subsystem, read | |
| > [ARCHITECTURE.md](./ARCHITECTURE.md). For deep dives on individual subsystems | |
| > (Auto Combo, MCP server, A2A server, Skills, Memory, Cloud Agents, Resilience, | |
| > Compression, etc.) see their dedicated files in this `docs/` directory. | |
| This file describes **what exists in the repository today** so that a new engineer | |
| can navigate the tree, understand the runtime layering, and know where to add code | |
| without inventing new modules. | |
| --- | |
| ## 1. Tech Stack | |
| | Concern | Choice | | |
| | ------------- | ------------------------------------------------------------------------------------------------------------------------ | --- | ------------- | --- | ------------------------------------ | | |
| | Web framework | **Next.js 16** (App Router, standalone output, no global middleware) | | |
| | Language | **TypeScript 5.9+** β target `ES2022`, `module: esnext`, `moduleResolution: bundler`, `strict: false` | | |
| | Runtime | **Node.js** `>=20.20.2 <21 | | >=22.22.2 <23 | | >=24.0.0 <27`(enforced via`engines`) | | |
| | Database | **SQLite** via `better-sqlite3` (singleton, WAL journaling) | | |
| | Desktop | **Electron 41** + `electron-builder` 26.10 (separate workspace at `electron/`) | | |
| | Tests | **Node native test runner** (unit/integration), **Vitest** (MCP, autoCombo, cache), **Playwright** (e2e + protocols-e2e) | | |
| | Build | Next.js standalone via `scripts/build/build-next-isolated.mjs` | | |
| | Lint/format | ESLint flat config + Prettier (`lint-staged` via Husky pre-commit) | | |
| | Module system | ESM everywhere (`"type": "module"`) | | |
| | Workspaces | npm workspace β `open-sse` is the only sub-workspace | | |
| Path aliases (`tsconfig.json`): | |
| - `@/*` β `src/*` | |
| - `@omniroute/open-sse` β `open-sse/index.ts` | |
| - `@omniroute/open-sse/*` β `open-sse/*` | |
| Default HTTP port: **`20128`** (API and dashboard share the same process). Data | |
| directory is `DATA_DIR` env var, defaulting to `~/.omniroute/`. | |
| --- | |
| ## 2. Repository Layout | |
| ``` | |
| OmniRoute/ | |
| βββ src/ Next.js application (App Router, libs, domain, server, shared) | |
| βββ open-sse/ Streaming engine workspace (@omniroute/open-sse) | |
| βββ electron/ Desktop wrapper (Electron 41 main + preload) | |
| βββ bin/ CLI entry points (omniroute, reset-password) | |
| βββ tests/ Unit, integration, e2e, protocols-e2e, translator, security, fixtures | |
| βββ scripts/ Build, sync, check, migration, and runtime helper scripts | |
| βββ docs/ Public documentation (this directory) | |
| βββ public/ Static assets, PWA manifest, service worker | |
| βββ config/ Runtime config samples | |
| βββ images/ Marketing/screenshot assets | |
| βββ _ideia/, _references/, _mono_repo/, _tasks/ Internal scratch / planning (not shipped) | |
| βββ CLAUDE.md Repo rules for Claude Code | |
| βββ AGENTS.md Deeper architecture reference for agents | |
| βββ package.json v3.8.0, workspace root | |
| βββ tsconfig.json Path aliases + core compiler options | |
| ``` | |
| --- | |
| ## 3. `src/` β Next.js Application | |
| ``` | |
| src/ | |
| βββ app/ App Router pages + API routes | |
| βββ lib/ Core libraries (DB, auth, OAuth, skills, memory, β¦) | |
| βββ domain/ Pure domain layer (policy, fallback, cost, lockout, β¦) | |
| βββ server/ Server-only modules (authz, cors, auth) | |
| βββ shared/ Types, constants, validation, contracts, utils (cross-boundary safe) | |
| βββ mitm/ Man-in-the-middle proxy helpers for CLI integration | |
| βββ models/ Local model metadata / aliasing | |
| βββ sse/ Legacy SSE handlers that still live under src/ (not open-sse/) | |
| βββ store/ Client-side state stores | |
| βββ middleware/ Route-level middleware utilities (not Next.js global middleware) | |
| βββ scripts/ In-tree scripts importable by app code | |
| βββ types/ Ambient and shared TS types | |
| βββ i18n/ Locale bundles | |
| βββ instrumentation.ts Next.js instrumentation hook | |
| βββ instrumentation-node.ts | |
| βββ server-init.ts Process-level bootstrap (env, DB, jobs, sync) | |
| βββ proxy.ts Top-level proxy bootstrap helper | |
| ``` | |
| ### 3.1 `src/app/` β App Router | |
| The App Router exposes both the dashboard UI and the public/management HTTP API. | |
| There is **no global middleware** β interception is done per-route. | |
| Top-level segments under `src/app/`: | |
| | Path | Purpose | | |
| | ----------------------------------------------------------------------------- | ----------------------------------------- | | |
| | `api/` | All HTTP API routes (see breakdown below) | | |
| | `a2a/` | A2A JSON-RPC 2.0 endpoint (`POST /a2a`) | | |
| | `.well-known/agent.json/` | A2A Agent Card discovery document | | |
| | `(dashboard)/` | Dashboard UI (route group, no URL prefix) | | |
| | `auth/`, `login/`, `forgot-password/`, `callback/` | Auth flows | | |
| | `landing/` | Marketing/landing page | | |
| | `docs/` | Embedded API docs viewer | | |
| | `status/`, `maintenance/`, `offline/` | Operational pages | | |
| | `privacy/`, `terms/` | Legal pages | | |
| | `400/`, `401/`, `403/`, `408/`, `429/`, `500/`, `502/`, `503/` | Static error pages | | |
| | `error.tsx`, `global-error.tsx`, `not-found.tsx`, `forbidden/`, `loading.tsx` | Framework error/loading boundaries | | |
| | `layout.tsx`, `page.tsx`, `globals.css`, `manifest.ts` | Root shell | | |
| #### 3.1.1 `src/app/(dashboard)/dashboard/` β UI pages | |
| `agents`, `analytics`, `api-manager`, `audit`, `auto-combo`, `batch`, `cache`, | |
| `changelog`, `cli-tools`, `cloud-agents`, `combos`, `compression`, `context`, | |
| `costs`, `endpoint`, `health`, `limits`, `logs`, `memory`, `onboarding`, | |
| `playground`, `providers`, `search-tools`, `settings`, `skills`, `system`, | |
| `translator`, `usage`, `webhooks`, plus root `page.tsx`, `HomePageClient.tsx`, | |
| `BootstrapBanner.tsx`. | |
| #### 3.1.2 `src/app/api/` β Top-level API groups | |
| ``` | |
| src/app/api/ | |
| βββ a2a/{status, tasks} | |
| βββ acp/ | |
| βββ admin/ | |
| βββ analytics/ | |
| βββ assess/ | |
| βββ auth/ | |
| βββ batches/ | |
| βββ cache/ | |
| βββ cli-tools/ | |
| βββ cloud/{codex-responses-ws} | |
| βββ combos/ | |
| βββ compliance/ | |
| βββ compression/ | |
| βββ context/ | |
| βββ db/, db-backups/ | |
| βββ evals/ | |
| βββ fallback/ | |
| βββ files/ | |
| βββ health/ | |
| βββ init/ | |
| βββ internal/{concurrency} | |
| βββ keys/ | |
| βββ logs/ | |
| βββ mcp/{audit, sse, status, stream, tools} | |
| βββ memory/{health, [id]/, route.ts} | |
| βββ model-combo-mappings/ | |
| βββ models/ | |
| βββ monitoring/ | |
| βββ oauth/ | |
| βββ openapi/ | |
| βββ policies/ | |
| βββ pricing/ | |
| βββ provider-metrics/, provider-models/, provider-nodes/ | |
| βββ providers/ | |
| βββ rate-limit/, rate-limits/ | |
| βββ resilience/ | |
| βββ restart/, shutdown/ | |
| βββ search/ | |
| βββ sessions/ | |
| βββ settings/ | |
| βββ skills/{executions, [id], install, marketplace, route.ts, skillssh} | |
| βββ storage/ | |
| βββ sync/, synced-available-models/ | |
| βββ system/ | |
| βββ tags/ | |
| βββ telemetry/ | |
| βββ token-health/ | |
| βββ translator/ | |
| βββ tunnels/ | |
| βββ services/ Embedded service management (9router, cliproxy) β LOCAL_ONLY | |
| βββ upstream-proxy/ | |
| βββ usage/ | |
| βββ v1/ OpenAI-compatible public API | |
| βββ v1beta/ Gemini-style compat | |
| βββ version-manager/ | |
| βββ webhooks/ | |
| ``` | |
| #### 3.1.2a `src/app/api/services/` β Embedded Services management | |
| Routes for installing, starting, stopping, and monitoring 9Router and CLIProxyAPI. | |
| All paths are classified **LOCAL_ONLY** (loopback only, hard rule #17) because they | |
| can invoke `npm install` and spawn child processes. | |
| ``` | |
| src/app/api/services/ | |
| βββ 9router/ | |
| β βββ _lib.ts getOrInitSupervisor() helper | |
| β βββ install/route.ts POST β npm install via execFile | |
| β βββ start/route.ts POST β supervisor.start() | |
| β βββ stop/route.ts POST β supervisor.stop() | |
| β βββ restart/route.ts POST β supervisor.restart() | |
| β βββ update/route.ts POST β npm install newer version | |
| β βββ rotate-key/route.ts POST β generate new API key + restart | |
| β βββ status/route.ts GET β live + DB status + version metadata | |
| β βββ auto-start/route.ts POST β toggle auto_start flag | |
| βββ cliproxy/ | |
| β βββ _lib.ts getOrInitSupervisor() helper | |
| β βββ install/route.ts POST β npm install | |
| β βββ start/route.ts POST β supervisor.start() | |
| β βββ stop/route.ts POST β supervisor.stop() | |
| β βββ restart/route.ts POST β supervisor.restart() | |
| β βββ update/route.ts POST β npm install newer version | |
| β βββ status/route.ts GET β live + DB status + version metadata | |
| β βββ auto-start/route.ts POST β toggle auto_start flag | |
| βββ [name]/ | |
| βββ logs/route.ts GET β SSE log tail (shared by all services) | |
| ``` | |
| Corresponding dashboard UI: | |
| `src/app/(dashboard)/dashboard/providers/services/` β two-tab page (CLIProxyAPI + 9Router). | |
| Reverse proxy for 9Router embedded UI: | |
| `src/app/(dashboard)/dashboard/providers/services/[name]/embed/[...path]/route.ts` | |
| Deep-dive: `docs/frameworks/EMBEDDED-SERVICES.md` | |
| #### 3.1.3 `src/app/api/v1/` β OpenAI-compatible public API | |
| ``` | |
| v1/ | |
| βββ accounts/[id]/ account lookup | |
| βββ agents/tasks/[id]/, agents/tasks/ A2A-flavored task endpoints | |
| βββ api/ internal API helpers exposed under v1/api | |
| βββ audio/{speech, transcriptions}/ TTS + STT | |
| βββ batches/[id]/{cancel}, batches/ OpenAI Batches API | |
| βββ chat/completions/ Chat Completions (the main endpoint) | |
| βββ chatgpt-web/ ChatGPT-Web compat | |
| βββ completions/ Legacy text completions | |
| βββ embeddings/ Embeddings | |
| βββ files/[id]/, files/ Files API | |
| βββ _helpers/ Shared route helpers (no public URL) | |
| βββ images/{edits, generations}/ Image gen + edit | |
| βββ issues/ Triage helper endpoints | |
| βββ management/{proxies}/ Management-scoped routes inside v1 | |
| βββ messages/{count_tokens}/ Anthropic-style messages compat | |
| βββ models/ Model listing (`route.ts`, `catalog.ts`) | |
| βββ moderations/ Moderation | |
| βββ music/ Music gen | |
| βββ providers/[provider]/ Per-provider operations | |
| βββ quotas/{check} Quota probes | |
| βββ registered-keys/ Registered key admin | |
| βββ rerank/ Reranking | |
| βββ responses/[...path]/ OpenAI Responses API (catch-all) | |
| βββ search/ Web search | |
| βββ videos/ Video gen | |
| βββ ws/ WebSocket bridge | |
| βββ route.ts Index handler | |
| ``` | |
| Every route file follows the same pattern: | |
| ``` | |
| Route β CORS preflight β Zod body validation β optional auth | |
| β API key policy enforcement β handler delegation (open-sse) | |
| ``` | |
| `v1beta/` is the Gemini-style compat surface (a thin wrapper that translates into | |
| the same `open-sse/handlers/` pipeline). | |
| ### 3.2 `src/lib/` β Core libraries | |
| Always import data, sync, OAuth, skill, memory, etc. through these modules. The | |
| table groups the actual directories and notable top-level files. | |
| | Module | Purpose | | |
| | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | |
| | `a2a/` | A2A protocol server: `taskManager.ts`, `streaming.ts`, `taskExecution.ts`, `routingLogger.ts`, `skills/` (6 skills: cost analysis, health report, provider discovery, quota management, smart routing, list-capabilities) | | |
| | `acp/` | Agent-Control-Protocol: `index.ts`, `manager.ts`, `registry.ts` | | |
| | `api/` | Internal API helpers: `requireManagementAuth.ts`, `requireCliToolsAuth.ts`, `errorResponse.ts` | | |
| | `auth/` | `managementPassword.ts` (password reset / hashing) | | |
| | `batches/` | OpenAI Batches API service (`service.ts`) | | |
| | `catalog/` | OpenRouter catalog sync (`openrouterCatalog.ts`) | | |
| | `cloudAgent/` | Cloud agent registry: `api.ts`, `baseAgent.ts`, `db.ts`, `index.ts`, `registry.ts`, `types.ts`, `agents/{codex, devin, jules}.ts` | | |
| | `combos/` | Combo resolution helpers | | |
| | `compliance/` | Audit + provider audit: `index.ts`, `providerAudit.ts` | | |
| | `config/` | Runtime config glue | | |
| | `db/` | SQLite domain modules (see Β§3.2.1) | | |
| | `display/` | UI/display helpers used by API responses | | |
| | `embeddings/` | Embedding service registry | | |
| | `env/` | Env loading + introspection | | |
| | `evals/` | Eval runtime | | |
| | `guardrails/` | `piiMasker.ts`, `promptInjection.ts`, `visionBridge.ts`, `visionBridgeHelpers.ts`, `registry.ts`, `base.ts` | | |
| | `jobs/` | Background jobs (`autoUpdate.ts`, β¦) | | |
| | `memory/` | Persistent memory: `store.ts`, `cache.ts`, `retrieval.ts`, `summarization.ts`, `extraction.ts`, `injection.ts`, `qdrant.ts`, `settings.ts`, `verify.ts`, `schemas.ts`, `types.ts` | | |
| | `monitoring/` | `observability.ts` | | |
| | `oauth/` | OAuth providers (14): `antigravity`, `claude`, `cline`, `codex`, `cursor`, `gemini`, `github`, `gitlab-duo`, `kilocode`, `kimi-coding`, `kiro`, `qoder`, `qwen`, `windsurf` plus `services/`, `utils/{pkce, server, banner, codexAuthFile, ui}`, `constants/oauth.ts` | | |
| | `plugins/` | Plugin loader (`index.ts`) | | |
| | `promptCache/` | `prefixAnalyzer.ts`, `index.ts` | | |
| | `providerModels/` | Managed model lifecycle: `modelDiscovery.ts`, `managedModelImport.ts`, `managedAvailableModels.ts`, `cursorAgent.ts` | | |
| | `providers/` | Provider helpers: `catalog.ts`, `validation.ts`, `imageValidation.ts`, `claudeExtraUsage.ts`, `codexConnectionDefaults.ts`, `codexFastTier.ts`, `webCookieAuth.ts`, `managedAvailableModels.ts`, `requestDefaults.ts` | | |
| | `resilience/` | `settings.ts` β settings for circuit breaker, cooldown, lockout | | |
| | `runtime/` | Runtime feature detection | | |
| | `search/` | `executeWebSearch.ts` | | |
| | `services/` | Embedded services framework: `ServiceSupervisor.ts` (generic child-process supervisor with operation lock, ring buffer, health checker), `bootstrap.ts` (process-level registration and auto-start), `registry.ts` (tool β supervisor map), `apiKey.ts` (AES-256-GCM key store), `modelSync.ts` (periodic model sync), `ringBuffer.ts` (5 MB circular log buffer), `healthCheck.ts` (HTTP health probe), `types.ts`, `embedWsProxy.ts` (WebSocket proxy), `installers/{ninerouter,cliproxy}.ts`. See `docs/frameworks/EMBEDDED-SERVICES.md` | | |
| | `agentSkills/` | Agent Skills catalog + generator: `catalog.ts` (getCatalog/getSkillById/filterCatalog/computeCoverage), `generator.ts` (generateAgentSkills β writes `skills/{id}/SKILL.md`), `openapiParser.ts` (extracts REST endpoints from OpenAPI spec), `cliRegistryParser.ts` (extracts CLI subcommands from bin/cli-registry), `schemas.ts` (Zod: AgentSkillSchema, SkillCoverageSchema, ListQuerySchema, GenerateBodySchema), `types.ts` (AgentSkill, SkillCoverage, SkillMarkdown, GeneratorReport). Consumed by REST routes (`/api/agent-skills/*`), MCP tools (`omniroute_agent_skills_*`), and A2A skill `list-capabilities`. See [AGENT-SKILLS.md](../frameworks/AGENT-SKILLS.md). | | |
| | `skills/` | Skill framework: `registry.ts`, `executor.ts`, `interception.ts`, `injection.ts`, `sandbox.ts`, `custom.ts`, `hybrid.ts`, `builtins.ts`, `a2a.ts`, `providerSettings.ts`, `schemas.ts`, `skillssh.ts`, `types.ts`, plus `builtin/browser.ts` | | |
| | `spend/` | `batchWriter.ts` (write-behind buffer) | | |
| | `sync/` | `bundle.ts`, `tokens.ts` (Cloud Sync) | | |
| | `system/` | System-level helpers | | |
| | `translator/` | Top-level translator glue (delegates into `open-sse/translator/`) | | |
| | `usage/` | Usage accounting: `costCalculator.ts`, `tokenAccounting.ts`, `usageHistory.ts`, `aggregateHistory.ts`, `usageStats.ts`, `callLogs.ts`, `callLogArtifacts.ts`, `fetcher.ts`, `providerLimits.ts`, `migrations.ts` | | |
| | `versionManager/` | Auto-update + version manifest | | |
| | `ws/` | WebSocket bridge | | |
| | `zed-oauth/` | Zed editor OAuth flow | | |
| Top-level files in `src/lib/`: | |
| - `localDb.ts` β re-export layer only. **Never** add logic here. | |
| - `proxyHealth.ts`, `proxyLogger.ts`, `tokenHealthCheck.ts`, `localHealthCheck.ts` | |
| - `oneproxyRotator.ts`, `oneproxySync.ts` | |
| - `apiBridgeServer.ts`, `cacheLayer.ts`, `semanticCache.ts`, `settingsCache.ts` | |
| - `cloudSync.ts`, `initCloudSync.ts` | |
| - `cloudflaredTunnel.ts`, `ngrokTunnel.ts`, `tailscaleTunnel.ts` | |
| - `consoleInterceptor.ts`, `container.ts`, `gracefulShutdown.ts`, `idempotencyLayer.ts` | |
| - `ipUtils.ts`, `logEnv.ts`, `logPayloads.ts`, `logRotation.ts` | |
| - `modelAliasSeed.ts`, `modelCapabilities.ts`, `modelMetadataRegistry.ts`, `modelsDevSync.ts` | |
| - `piiSanitizer.ts`, `pricingSync.ts` | |
| - `apiKeyExposure.ts`, `cacheControlSettings.ts`, `dataPaths.ts`, `toolPolicy.ts` | |
| - `translatorEvents.ts`, `usageDb.ts`, `usageAnalytics.ts`, `webhookDispatcher.ts` | |
| #### 3.2.1 `src/lib/db/` | |
| Singleton SQLite database (`getDbInstance()` in `core.ts`, WAL journaling). | |
| **Never write raw SQL in routes or handlers** β go through these modules. | |
|  | |
| > Source: [diagrams/db-schema-overview.mmd](../diagrams/db-schema-overview.mmd) | |
| Domain modules (each owns one or more tables): `apiKeys.ts`, `backup.ts`, | |
| `batches.ts`, `cleanup.ts`, `cliToolState.ts`, `combos.ts`, | |
| `commandCodeAuth.ts`, `compression.ts`, `compressionAnalytics.ts`, | |
| `compressionCacheStats.ts`, `compressionCombos.ts`, `compressionScheduler.ts`, | |
| `contextHandoffs.ts`, `core.ts`, `creditBalance.ts`, `databaseSettings.ts`, | |
| `detailedLogs.ts`, `domainState.ts`, `encryption.ts`, `evals.ts`, `files.ts`, | |
| `healthCheck.ts`, `jsonMigration.ts`, `migrationRunner.ts`, | |
| `modelComboMappings.ts`, `models.ts`, `oneproxy.ts`, `prompts.ts`, | |
| `providers.ts`, `providerLimits.ts`, `proxies.ts`, `quotaSnapshots.ts`, | |
| `readCache.ts`, `reasoningCache.ts`, `registeredKeys.ts`, `secrets.ts`, | |
| `sessionAccountAffinity.ts`, `settings.ts`, `stateReset.ts`, `stats.ts`, | |
| `syncTokens.ts`, `tierConfig.ts`, `upstreamProxy.ts`, `versionManager.ts`, | |
| `webhooks.ts`. | |
| `migrations/` holds 55 versioned `.sql` files (idempotent, transactional) and is | |
| executed by `migrationRunner.ts` at boot. | |
| Tables created across the migrations (52 total): | |
| `a`, `account_key_limits`, `api_keys`, `batches`, `call_logs`, | |
| `combo_adaptation_state`, `combos`, `command_code_auth_sessions`, | |
| `compression_analytics`, `compression_cache_stats`, | |
| `compression_combo_assignments`, `compression_combos`, `context_handoffs`, | |
| `daily_usage_summary`, `db_meta`, `domain_budgets`, `domain_circuit_breakers`, | |
| `domain_cost_history`, `domain_fallback_chains`, `domain_lockout_state`, | |
| `eval_cases`, `eval_runs`, `eval_suites`, `files`, `hourly_usage_summary`, | |
| `key_value`, `mcp_tool_audit`, `memories`, `model_combo_mappings`, | |
| `provider_connections`, `provider_key_limits`, `provider_nodes`, | |
| `proxy_assignments`, `proxy_logs`, `proxy_registry`, `quota_snapshots`, | |
| `reasoning_cache`, `registered_keys`, `request_detail_logs`, | |
| `routing_decisions`, `semantic_cache`, `session_account_affinity`, | |
| `skill_executions`, `skills`, `sync_tokens`, `tier_assignments`, | |
| `tier_config`, `upstream_proxy_config`, `usage_history`, `version_manager`, | |
| `webhooks` (plus FTS5 virtual tables for memory search). | |
| ### 3.3 `src/domain/` β Domain layer | |
| Pure business logic, no I/O. Imported by routes and handlers. | |
| | File | Purpose | | |
| | ------------------------------------------ | ------------------------------------------------- | | |
| | `policyEngine.ts` | Top-level policy resolver | | |
| | `fallbackPolicy.ts` | Fallback decision tree | | |
| | `costRules.ts` | Cost calculation rules | | |
| | `lockoutPolicy.ts` | Model lockout decisions | | |
| | `tagRouter.ts` | Tag-based routing | | |
| | `comboResolver.ts` | Combo resolution from request β target list | | |
| | `connectionModelRules.ts` | Per-connection model filters | | |
| | `modelAvailability.ts` | Model availability check | | |
| | `degradation.ts` | Degraded-mode transitions | | |
| | `providerExpiration.ts` | Expired account/key detection | | |
| | `quotaCache.ts` | Cached quota decisions | | |
| | `responses.ts`, `omnirouteResponseMeta.ts` | Response shape helpers | | |
| | `configAudit.ts` | Config change audit | | |
| | `assessment/` | Model assessment (per RFC, partially implemented) | | |
| | `types.ts` | Shared domain types | | |
| ### 3.4 `src/server/` β Server-only | |
| Cannot be imported from client components. | |
| ``` | |
| server/ | |
| βββ auth/loginGuard.ts | |
| βββ authz/ | |
| β βββ classify.ts Classifies routes as public vs management | |
| β βββ assertAuth.ts Assertion helper | |
| β βββ context.ts Per-request authz context | |
| β βββ headers.ts | |
| β βββ pipeline.ts Authz pipeline | |
| β βββ policies/ Concrete policies | |
| β βββ types.ts | |
| βββ cors/origins.ts CORS origin allowlist | |
| ``` | |
| ### 3.5 `src/shared/` β Safe-to-share | |
| Split into focused subdirectories: | |
| - `constants/` β `providers.ts` (Zod-validated provider catalog), `models.ts`, | |
| `modelSpecs.ts`, `modelCompat.ts`, `pricing.ts`, `cliTools.ts`, | |
| `cliCompatProviders.ts`, `routingStrategies.ts`, `comboConfigMode.ts`, | |
| `headers.ts`, `upstreamHeaders.ts` (denylist), `mcpScopes.ts`, | |
| `errorCodes.ts`, `publicApiRoutes.ts`, `batch.ts`, `batchEndpoints.ts`, | |
| `bodySize.ts`, `colors.ts`, `appConfig.ts`, `config.ts`, | |
| `sidebarVisibility.ts`, `visionBridgeDefaults.ts`. | |
| - `validation/` β `schemas.ts` (~80 Zod schemas), `compressionConfigSchemas.ts`, | |
| `oneproxySchemas.ts`, `providerSchema.ts`, `settingsSchemas.ts`, `helpers.ts`. | |
| - `contracts/` β public API contracts shipped to npm. | |
| - `types/` β shared TS types. | |
| - `utils/` β `circuitBreaker.ts`, `apiAuth.ts`, `apiKey.ts`, `apiKeyPolicy.ts`, | |
| `apiResponse.ts`, `api.ts`, `classify429.ts`, `cliCompat.ts`, `clipboard.ts`, | |
| `cloud.ts`, `cn.ts`, `cors.ts`, `costEstimator.ts`, `featureFlags.ts`, | |
| `fetchTimeout.ts`, `formatting.ts`, `inputSanitizer.ts`, `logger.ts`, | |
| `machine.ts`, `machineId.ts`, `maskEmail.ts`, `modelCatalogSearch.ts`, | |
| `nodeRuntimeSupport.ts`, `parseApiKeys.ts`, `providerHints.ts`, | |
| `providerModelAliases.ts`, `rateLimiter.ts`, `releaseNotes.ts`, | |
| `a11yAudit.ts`, plus dashboard hooks/components under `services/`, `network/`, | |
| `middleware/`, `schemas/`, `hooks/`, `components/`. | |
| --- | |
| ## 4. `open-sse/` β Streaming engine workspace | |
| Separate npm workspace published as `@omniroute/open-sse`. Owns request | |
| processing, executors, translators, services, transformer, and the MCP server. | |
| ``` | |
| open-sse/ | |
| βββ index.ts Public exports | |
| βββ package.json Workspace manifest | |
| βββ tsconfig.json | |
| βββ types.d.ts | |
| βββ config/ Provider registries, header profiles, identity, β¦ | |
| βββ handlers/ Request handlers (chat, embeddings, audio, image, β¦) | |
| βββ executors/ 45 provider-specific HTTP executors | |
| βββ translator/ Format conversion (OpenAI β Claude β Gemini β Cursor β Kiro) | |
| βββ transformer/ Responses API β Chat Completions stream transformer | |
| βββ services/ 80+ service modules (combos, fallback, quotas, identity, β¦) | |
| βββ utils/ Streaming helpers, TLS client, AWS SigV4, proxy fetch, β¦ | |
| βββ mcp-server/ MCP server (3 transports, 30 scopes, 87 tools) | |
| ``` | |
| ### 4.1 `open-sse/handlers/` | |
| | Handler | Purpose | | |
| | ----------------------- | ------------------------------------------------------------------------ | | |
| | `chatCore.ts` | Main chat pipeline (cache, rate limit, combo routing, executor dispatch) | | |
| | `responsesHandler.ts` | OpenAI Responses API entry point | | |
| | `embeddings.ts` | Embeddings | | |
| | `imageGeneration.ts` | Image generation | | |
| | `audioSpeech.ts` | Text-to-speech | | |
| | `audioTranscription.ts` | Speech-to-text | | |
| | `videoGeneration.ts` | Video generation | | |
| | `musicGeneration.ts` | Music generation | | |
| | `rerank.ts` | Reranking | | |
| | `moderations.ts` | Moderation | | |
| | `search.ts` | Web search | | |
| | `sseParser.ts` | SSE event parser | | |
| | `usageExtractor.ts` | Pull token counts out of upstream streams | | |
| | `responseSanitizer.ts` | Strip provider-specific noise | | |
| | `responseTranslator.ts` | Glue between provider response and translator layer | | |
| ### 4.2 `open-sse/executors/` | |
| 45 provider executors, each extending `BaseExecutor` (`base.ts`): | |
| `antigravity`, `azure-openai`, `blackbox-web`, `chatgpt-web`, `cliproxyapi`, | |
| `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, | |
| `gemini-cli`, `github`, `gitlab`, `glm`, `grok-web`, `kie`, `kiro`, | |
| `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, | |
| `pollinations`, `puter`, `qoder`, `vertex`, `windsurf`, plus `claudeIdentity.ts` | |
| (shared identity helper) and `index.ts` (registry). | |
| > Note: providers not listed here are served by `default.ts` using the generic | |
| > OpenAI-compatible executor. The full provider catalog (226+ entries) lives in | |
| > `src/shared/constants/providers.ts`. | |
| ### 4.3 `open-sse/translator/` | |
| Hub-and-spoke translation (OpenAI is the hub). | |
| - **9 request translators** (`translator/request/`): | |
| `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, | |
| `gemini-to-openai`, `openai-responses`, `openai-to-claude`, | |
| `openai-to-cursor`, `openai-to-gemini`, `openai-to-kiro`. | |
| - **8 response translators** (`translator/response/`): | |
| `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, | |
| `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, | |
| `openai-to-claude`. | |
| - **9 helpers** (`translator/helpers/`): | |
| `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, | |
| `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, plus | |
| helper tests. | |
| - **Image helpers** (`translator/image/sizeMapper.ts`). | |
| - Top-level: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. | |
| ### 4.4 `open-sse/transformer/` | |
| - `responsesTransformer.ts` β `TransformStream`-based Responses API β Chat | |
| Completions converter (used by the `responses/` route catch-all). | |
| ### 4.5 `open-sse/services/` | |
| Highlights (full list under `open-sse/services/`): | |
| | Concern | Files | | |
| | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | |
| | Combo routing | `combo.ts` (15 strategies), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | | |
| | Auto Combo engine | `autoCombo/` β `engine.ts`, `scoring.ts`, `taskFitness.ts`, `virtualFactory.ts`, `modePacks.ts`, `autoPrefix.ts`, `persistence.ts`, `providerDiversity.ts`, `providerRegistryAccessor.ts`, `routerStrategy.ts`, `selfHealing.ts`, `index.ts` | | |
| | Resilience | `accountFallback.ts` (cooldown + lockout), `errorClassifier.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | | |
| | Quotas | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | | |
| | Provider-specific shaping | `claudeCodeCCH.ts`, `claudeCodeCompatible.ts`, `claudeCodeConstraints.ts`, `claudeCodeExtraRemap.ts`, `claudeCodeFingerprint.ts`, `claudeCodeObfuscation.ts`, `claudeCodeToolRemapper.ts`, `cloudCodeHeaders.ts`, `cloudCodeThinking.ts`, `geminiCliHeaders.ts`, `geminiThoughtSignatureStore.ts`, `gigachatAuth.ts`, `antigravityHeaders.ts`, `antigravityHeaderScrub.ts`, `antigravityIdentity.ts`, `antigravityObfuscation.ts`, `antigravityVersion.ts`, `antigravity429Engine.ts`, `chatgptTlsClient.ts`, `chatgptImageCache.ts`, `cursorSessionManager.ts`, `qoderCli.ts`, `qwenThinking.ts`, `modelscopePolicy.ts` | | |
| | Caching | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | | |
| | Routing intelligence | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | | |
| | Model handling | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | | |
| | Compression | `compression/` β full compression engine wiring | | |
| | Token + session | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | | |
| | Tier / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | | |
| | IP / network | `ipFilter.ts`, `webSearchFallback.ts` | | |
| | Batches | `batchProcessor.ts` | | |
| | Usage | `usage.ts` | | |
| ### 4.6 `open-sse/mcp-server/` | |
| - **31 registered tools** wired in `server.ts` (12 scoped under `schemas/tools.ts`, | |
| 5 compression tools, 3 memory tools, 4 skills tools, plus advanced tools added | |
| through `advancedTools.ts`). | |
| - **3 transports**: stdio, HTTP Streamable, SSE. | |
| - **13 scopes** declared in `src/shared/constants/mcpScopes.ts`. | |
| - Audit table: `mcp_tool_audit` (populated by `audit.ts`). | |
| - Files: `server.ts`, `index.ts`, `httpTransport.ts`, `audit.ts`, `scopeEnforcement.ts`, | |
| `runtimeHeartbeat.ts`, `descriptionCompressor.ts`, `schemas/{tools, a2a, audit, index}.ts`, | |
| `tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts`, | |
| plus tests under `__tests__/`. | |
| - See [MCP-SERVER.md](../frameworks/MCP-SERVER.md) for the full tool catalog. | |
| ### 4.7 `open-sse/config/` | |
| Provider registries (`providerRegistry.ts`, `providerModels.ts`, | |
| `providerHeaderProfiles.ts`), per-format model registries (`audioRegistry.ts`, | |
| `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, | |
| `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), | |
| identity helpers (`codexIdentity.ts`, `codexInstructions.ts`, | |
| `anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, | |
| `cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`), | |
| credential helpers (`credentialLoader.ts`, `codexClient.ts`), and cloud | |
| adapters (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `glmProvider.ts`, | |
| `maritalk.ts`, `oci.ts`, `petals.ts`, `runway.ts`, `sap.ts`, `watsonx.ts`, | |
| `ollamaModels.ts`, `errorConfig.ts`, `constants.ts`, `registryUtils.ts`). | |
| ### 4.8 `open-sse/utils/` | |
| Streaming primitives and provider helpers: `stream.ts`, `streamHandler.ts`, | |
| `streamHelpers.ts`, `streamPayloadCollector.ts`, `streamReadiness.ts`, | |
| `sseHeartbeat.ts`, `proxyFetch.ts`, `proxyDispatcher.ts`, `tlsClient.ts`, | |
| `networkProxy.ts`, `awsSigV4.ts`, `cacheControlPolicy.ts`, | |
| `cursorChecksum.ts`, `cursorAgentProtobuf.ts`, `cursorVersionDetector.ts`, | |
| `comfyuiClient.ts`, `kieTask.ts`, `bypassHandler.ts`, `aiSdkCompat.ts`, | |
| `thinkTagParser.ts`, `urlSanitize.ts`, `usageTracking.ts`, `requestLogger.ts`, | |
| `progressTracker.ts`, `cors.ts`, `error.ts`, `logger.ts`, `sleep.ts`, | |
| `ollamaTransform.ts`. | |
| --- | |
| ## 5. `electron/` β Desktop wrapper | |
| ``` | |
| electron/ | |
| βββ main.js Electron main process | |
| βββ preload.js Preload bridge (contextIsolation enabled) | |
| βββ types.d.ts | |
| βββ package.json electron-builder config, version 3.8.0 | |
| βββ README.md | |
| βββ assets/ Build resources (icons, entitlements, β¦) | |
| βββ node_modules/ Dedicated node_modules (better-sqlite3, electron-updater) | |
| βββ dist-electron/ Build output (not committed) | |
| ``` | |
| Five npm scripts at the workspace root: `electron:dev`, `electron:build`, | |
| `electron:build:{win,mac,linux}`, `electron:smoke:packaged`. Auto-update is via | |
| `electron-updater` pointing at the GitHub release feed. | |
| --- | |
| ## 6. `bin/` β CLI | |
| ``` | |
| bin/ | |
| βββ omniroute.mjs Main CLI entry (Node ESM) | |
| βββ reset-password.mjs Reset the management password from CLI | |
| βββ mcp-server.mjs MCP server launcher (stdio) | |
| βββ nodeRuntimeSupport.mjs Node version guard | |
| βββ cli/ | |
| βββ program.mjs Commander program builder | |
| βββ runtime.mjs withRuntime helper (server-first/db-fallback) | |
| βββ output.mjs Output formatters (json/jsonl/table/csv) | |
| βββ i18n.mjs t() helper with locales | |
| βββ api.mjs API fetch helper | |
| βββ data-dir.mjs | |
| βββ encryption.mjs | |
| βββ sqlite.mjs | |
| βββ commands/ | |
| βββ registry.mjs Command registration | |
| βββ setup.mjs | |
| βββ doctor.mjs | |
| βββ providers.mjs | |
| βββ ... (one file per command/group) | |
| ``` | |
| Two binaries are exposed in `package.json` β `bin`: | |
| - `omniroute` β `bin/omniroute.mjs` | |
| - `omniroute-reset-password` β `bin/reset-password.mjs` | |
| --- | |
| ## 7. `tests/` | |
| | Directory | Type | | |
| | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | | |
| | `tests/unit/` | Unit tests via Node native test runner (506 files, plus `api/`, `auth/`, `authz/` subdirs) | | |
| | `tests/integration/` | Cross-module + DB-state tests | | |
| | `tests/e2e/` | Playwright UI tests | | |
| | `tests/protocols-e2e/` | MCP/A2A protocol e2e | | |
| | `tests/translator/` | Translator-specific tests | | |
| | `tests/security/` | Security regressions | | |
| | `tests/load/` | Load / stress tests | | |
| | `tests/golden-set/` | Reference outputs for translator regressions | | |
| | `tests/helpers/`, `tests/fixtures/`, `tests/manual/`, `tests/scratch_test.mjs` | Support | | |
| Common commands: | |
| | Command | What it runs | | |
| | -------------------------------------------------------- | ---------------------------------------------------------------- | | |
| | `npm run test:unit` | All `tests/unit/*.test.ts` via Node test runner (concurrency 10) | | |
| | `npm run test:vitest` | Vitest suite (MCP, autoCombo, cache) | | |
| | `npm run test:e2e` | Playwright UI suite | | |
| | `npm run test:protocols:e2e` | MCP + A2A protocol e2e | | |
| | `npm run test:coverage` | Coverage gate (β₯60% lines/statements/functions/branches) | | |
| | `node --import tsx/esm --test tests/unit/<file>.test.ts` | Single file run | | |
| --- | |
| ## 8. `scripts/` | |
| Organized into 6 subfolders by purpose. | |
| - **`scripts/build/`** β `build-next-isolated.mjs`, `prepublish.ts`, | |
| `prepare-electron-standalone.mjs`, `pack-artifact-policy.ts`, | |
| `validate-pack-artifact.ts`, `postinstall.mjs`, `postinstallSupport.mjs`, | |
| `uninstall.mjs`, `bootstrap-env.mjs`, `runtime-env.mjs`, | |
| `native-binary-compat.mjs`. | |
| - **`scripts/dev/`** β `run-next.mjs`, `run-next-playwright.mjs`, | |
| `run-standalone.mjs`, `standalone-server-ws.mjs`, `responses-ws-proxy.mjs`, | |
| `v1-ws-bridge.mjs`, `smoke-electron-packaged.mjs`, | |
| `run-playwright-tests.mjs`, `run-ecosystem-tests.mjs`, | |
| `run-protocol-clients-tests.mjs`, `sync-env.mjs`, `healthcheck.mjs`, | |
| `system-info.mjs`. | |
| - **`scripts/check/`** β `check-cycles.mjs`, `check-docs-sync.mjs`, | |
| `check-docs-counts-sync.mjs`, `check-env-doc-sync.mjs`, | |
| `check-deprecated-versions.mjs`, `check-route-validation.mjs`, | |
| `check-t11-any-budget.mjs`, `check-pr-test-policy.mjs`, | |
| `check-supported-node-runtime.ts`, `test-report-summary.mjs`. | |
| - **`scripts/docs/`** β `generate-docs-index.mjs`, `gen-provider-reference.ts`. | |
| - **`scripts/i18n/`** β `generate-multilang.mjs`, `run-visual-qa.mjs`, | |
| `generate-qa-checklist.mjs`, `apply-priority-overrides.mjs`, | |
| `validate_translation.py`, `check_translations.py`, `i18n_autotranslate.py`, | |
| `untranslatable-keys.json`. | |
| - **`scripts/ad-hoc/`** β `cursor-tap.cjs`, `sync-cursor-models.mjs`, | |
| `migrate-env.mjs`, `dbsetup.js`. | |
| --- | |
| ## 9. Request Pipeline (Summary) | |
|  | |
| > Source: [diagrams/request-pipeline.mmd](../diagrams/request-pipeline.mmd) | |
| ``` | |
| Client request | |
| β /v1/chat/completions (route.ts) | |
| CORS preflight check | |
| Zod validation (chatCompletionsSchema in shared/validation/schemas.ts) | |
| Auth (extractApiKey + isValidApiKey OR requireManagementAuth) | |
| Policy engine (src/server/authz/pipeline.ts) | |
| Guardrails (PII masker, prompt injection, vision bridge) | |
| β handleChatCore() (open-sse/handlers/chatCore.ts) | |
| Cache check (semantic + read cache) | |
| Rate limit (rateLimitManager, accountSemaphore) | |
| Combo routing (if model resolves to a combo) | |
| comboResolver β loop per target β handleSingleModel() | |
| translateRequest() (open-sse/translator/request/*) | |
| getExecutor(providerId).execute() (open-sse/executors/*) | |
| fetch upstream β retry/backoff via accountFallback | |
| translateResponse() (open-sse/translator/response/*) | |
| SSE stream OR JSON response | |
| If Responses API: TransformStream via open-sse/transformer/responsesTransformer.ts | |
| β Compliance audit (src/lib/compliance/) | |
| β Response to client | |
| ``` | |
| ### Resilience runtime state (three mechanisms) | |
| | Mechanism | Scope | Where | | |
| | ------------------------ | ----------------------------- | ------------------------------------------------------------------------------------------------------------ | | |
| | Provider circuit breaker | Whole provider | `src/shared/utils/circuitBreaker.ts`, persisted in `domain_circuit_breakers` | | |
| | Connection cooldown | One account/key | `markAccountUnavailable()` in `src/sse/services/auth.ts`; consumed by `accountFallback.checkFallbackError()` | | |
| | Model lockout | Provider + connection + model | `open-sse/services/accountFallback.ts`, persisted in `domain_lockout_state` | | |
| See [RESILIENCE_GUIDE.md](./RESILIENCE_GUIDE.md) and the dedicated section in | |
| [CLAUDE.md](../../CLAUDE.md). | |
| --- | |
| ## 10. How to Contribute | |
| ### Add a new provider | |
| 1. Register in `src/shared/constants/providers.ts` (Zod-validated at load). | |
| 2. Add an executor in `open-sse/executors/` if custom logic is required | |
| (extend `BaseExecutor`). | |
| 3. Add a translator in `open-sse/translator/` if it does not speak OpenAI format. | |
| 4. If OAuth-based, add config under `src/lib/oauth/providers/` and | |
| `src/lib/oauth/services/`. | |
| 5. Register models in `open-sse/config/providerRegistry.ts` (or the format-specific | |
| registry under `open-sse/config/`). | |
| 6. Write tests under `tests/unit/`. | |
| ### Add a new API route | |
| 1. Create `src/app/api/your-route/route.ts`. | |
| 2. Follow the pattern: CORS β Zod body validation β auth β handler delegation. | |
| 3. If new request shape: add the Zod schema in `src/shared/validation/schemas.ts`. | |
| 4. If management-only: add the path to `src/shared/constants/publicApiRoutes.ts` | |
| (denylist for the public API surface). | |
| 5. Add tests under `tests/unit/`. | |
| 6. Update `docs/reference/API_REFERENCE.md` and `docs/openapi.yaml`. | |
| ### Add a new DB module | |
| 1. Create `src/lib/db/yourModule.ts` and import `getDbInstance()` from `./core.ts`. | |
| 2. Export CRUD functions for your domain. | |
| 3. If new tables: add a migration under `src/lib/db/migrations/`, numbered | |
| sequentially, idempotent, transactional. | |
| 4. Re-export from `src/lib/localDb.ts` (re-export only β **no logic**). | |
| 5. Add tests under `tests/unit/`. | |
| ### Add a new MCP tool | |
| 1. Add the tool definition under `open-sse/mcp-server/tools/` (or extend | |
| `open-sse/mcp-server/schemas/tools.ts`). | |
| 2. Assign the appropriate scope(s) in `src/shared/constants/mcpScopes.ts`. | |
| 3. Register the tool in `open-sse/mcp-server/server.ts`. | |
| 4. Add tests under `open-sse/mcp-server/__tests__/`. | |
| 5. Update [MCP-SERVER.md](../frameworks/MCP-SERVER.md). | |
| ### Add a new A2A skill | |
| See [A2A-SERVER.md Β§ Adding a New Skill](../frameworks/A2A-SERVER.md). Skills live in | |
| `src/lib/a2a/skills/` and are registered through the A2A task manager. | |
| --- | |
| ## 11. Conventions | |
| - **Code style**: 2-space indent, double quotes, 100 char width, semicolons, | |
| `es5` trailing commas β enforced by Prettier via `lint-staged`. | |
| - **Imports**: external β internal (`@/`, `@omniroute/open-sse`) β relative. | |
| - **Naming**: files `camelCase` or `kebab-case`, components `PascalCase`, | |
| constants `UPPER_SNAKE`. | |
| - **ESLint**: `no-eval`, `no-implied-eval`, `no-new-func` = `error` everywhere; | |
| `no-explicit-any` = `warn` in `open-sse/` and `tests/`, error elsewhere. | |
| - **TypeScript**: `strict: false` (legacy posture). Prefer explicit types over | |
| inference for cross-module boundaries. | |
| - **Database**: never write raw SQL in routes or handlers β always go through | |
| `src/lib/db/` modules. Never add logic to `src/lib/localDb.ts`. | |
| - **Errors**: try/catch with specific error types, log with pino context. Never | |
| silently swallow errors in SSE streams; use abort signals for cleanup. | |
| - **Security**: never use `eval()` / `new Function()` / implied eval. Validate | |
| all inputs with Zod. Encrypt credentials at rest (AES-256-GCM). Keep | |
| `src/shared/constants/upstreamHeaders.ts` denylist aligned with the | |
| sanitize/validation layer. | |
| - **Commits**: Conventional Commits β `feat(scope): subject`. Allowed scopes: | |
| `db`, `sse`, `oauth`, `dashboard`, `api`, `cli`, `docker`, `ci`, `mcp`, | |
| `a2a`, `memory`, `skills`. | |
| - **Branches**: prefixes `feat/`, `fix/`, `refactor/`, `docs/`, `test/`, | |
| `chore/`. Never commit directly to `main`. | |
| - **Husky**: pre-commit runs `lint-staged` + `check:docs-sync` + | |
| `check:any-budget:t11`; pre-push runs `npm run test:unit`. | |
| --- | |
| ## 12. Hard Rules (from CLAUDE.md) | |
| 1. Never commit secrets or credentials. | |
| 2. Never add logic to `src/lib/localDb.ts`. | |
| 3. Never use `eval()` / `new Function()` / implied eval. | |
| 4. Never commit directly to `main`. | |
| 5. Never write raw SQL in routes β always go through `src/lib/db/` modules. | |
| 6. Never silently swallow errors in SSE streams. | |
| 7. Always validate inputs with Zod schemas. | |
| 8. Always include tests when changing production code. | |
| 9. Coverage must stay β₯ 60% (statements, lines, functions, branches). | |
| --- | |
| ## 13. See Also | |
| - [ARCHITECTURE.md](./ARCHITECTURE.md) β high-level architecture and module | |
| responsibilities. | |
| - [API_REFERENCE.md](../reference/API_REFERENCE.md) β public + management API reference. | |
| - [FEATURES.md](../guides/FEATURES.md) β feature matrix and version highlights. | |
| - [RESILIENCE_GUIDE.md](./RESILIENCE_GUIDE.md) β circuit breaker, cooldown, | |
| lockout deep dive. | |
| - [AUTO-COMBO.md](../routing/AUTO-COMBO.md) β Auto Combo scoring and strategies. | |
| - [MCP-SERVER.md](../frameworks/MCP-SERVER.md) β full MCP tool catalog + transports. | |
| - [A2A-SERVER.md](../frameworks/A2A-SERVER.md) β A2A protocol skills and discovery. | |
| - [COMPRESSION_GUIDE.md](../compression/COMPRESSION_GUIDE.md) β RTK + Caveman compression. | |
| - [CLI-TOOLS.md](../reference/CLI-TOOLS.md) β CLI integrations. | |
| - [ELECTRON_GUIDE.md](../guides/ELECTRON_GUIDE.md) (if present), [DOCKER_GUIDE.md](../guides/DOCKER_GUIDE.md), [FLY_IO_DEPLOYMENT_GUIDE.md](../ops/FLY_IO_DEPLOYMENT_GUIDE.md), [VM_DEPLOYMENT_GUIDE.md](../ops/VM_DEPLOYMENT_GUIDE.md), [TERMUX_GUIDE.md](../guides/TERMUX_GUIDE.md), [PWA_GUIDE.md](../guides/PWA_GUIDE.md) β deployment targets. | |
| - [TROUBLESHOOTING.md](../guides/TROUBLESHOOTING.md) β common operational issues. | |
| - [CONTRIBUTING.md](../../CONTRIBUTING.md) β contributor workflow. | |
| - [CLAUDE.md](../../CLAUDE.md) β repo rules for Claude Code (the source of truth | |
| for many of the conventions above). | |
| - [AGENTS.md](../../AGENTS.md) β deeper architecture reference used by agents. | |