# OmniRoute Codebase Documentation (Português (Brasil)) 🌐 **Languages:** 🇺🇸 [English](../../../../architecture/CODEBASE_DOCUMENTATION.md) · 🇪🇹 [am](../../../am/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇸🇦 [ar](../../../ar/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇦🇿 [az](../../../az/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇧🇬 [bg](../../../bg/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇧🇩 [bn](../../../bn/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇧🇦 [bs](../../../bs/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇨🇿 [cs](../../../cs/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇩🇰 [da](../../../da/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇩🇪 [de](../../../de/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇬🇷 [el](../../../el/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇪🇸 [es](../../../es/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇪🇪 [et](../../../et/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇷 [fa](../../../fa/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇫🇮 [fi](../../../fi/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇫🇷 [fr](../../../fr/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇪 [ga](../../../ga/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [gu](../../../gu/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇳🇬 [ha](../../../ha/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇱 [he](../../../he/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [hi](../../../hi/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇭🇷 [hr](../../../hr/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇭🇺 [hu](../../../hu/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇦🇲 [hy](../../../hy/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇩 [id](../../../id/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇳🇬 [ig](../../../ig/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇹 [it](../../../it/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇯🇵 [ja](../../../ja/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇬🇪 [ka](../../../ka/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇰🇭 [km](../../../km/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [kn](../../../kn/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇰🇷 [ko](../../../ko/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇱🇹 [lt](../../../lt/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇱🇻 [lv](../../../lv/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [ml](../../../ml/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [mr](../../../mr/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇲🇾 [ms](../../../ms/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇲🇹 [mt](../../../mt/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇲🇲 [my](../../../my/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇳🇵 [ne](../../../ne/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇳🇱 [nl](../../../nl/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇳🇴 [no](../../../no/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [or](../../../or/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [pa](../../../pa/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇵🇭 [phi](../../../phi/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇵🇱 [pl](../../../pl/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇵🇹 [pt](../../../pt/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇷🇴 [ro](../../../ro/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇷🇺 [ru](../../../ru/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇱🇰 [si](../../../si/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇸🇰 [sk](../../../sk/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇸🇮 [sl](../../../sl/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇷🇸 [sr](../../../sr/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇸🇪 [sv](../../../sv/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇰🇪 [sw](../../../sw/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [ta](../../../ta/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [te](../../../te/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇹🇭 [th](../../../th/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇹🇷 [tr](../../../tr/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇵🇰 [ur](../../../ur/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇺🇿 [uz](../../../uz/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇻🇳 [vi](../../../vi/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇳🇬 [yo](../../../yo/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/architecture/CODEBASE_DOCUMENTATION.md) --- > **Versão:** v3.8.51 > **Última atualização:** 2026-06-28 > **Público-alvo:** Engenheiros que contribuem com o OmniRoute ou criam integrações sobre ele. > > Para diagramas de arquitetura de alto nível e a justificativa por trás de cada subsistema, leia > [ARCHITECTURE.md](./ARCHITECTURE.md). Para análises aprofundadas de subsistemas individuais > (Auto Combo, servidor MCP, servidor A2A, Skills, Memory, Cloud Agents, Resilience, > Compression etc.), consulte seus arquivos dedicados neste diretório `docs/`. Este arquivo descreve **o que existe atualmente no repositório** para que um novo engenheiro possa navegar pela árvore, entender as camadas de runtime e saber onde adicionar código sem criar novos módulos. --- ## 1. Stack de tecnologias | Aspecto | Escolha | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | Framework web | **Next.js 16** (App Router, saída standalone, sem middleware global) | | Linguagem | **TypeScript 6.0+** — alvo `ES2022`, `module: esnext`, `moduleResolution: bundler`, `strict: false` | | Ambiente de execução | **Node.js** `>=22.22.2 <23` ou `>=24.0.0 <27` (imposto por meio de `engines` + `SUPPORTED_NODE_RANGE`) | | Banco de dados | **SQLite** por meio de `better-sqlite3` (singleton, registro em log WAL) | | Desktop | **Electron 41** + `electron-builder` 26.10 (workspace separado em `electron/`) | | Testes | **Executor de testes nativo do Node** (unidade/integração), **Vitest** (MCP, autoCombo, cache), **Playwright** (e2e + protocols-e2e) | | Build | Next.js standalone por meio de `scripts/build/build-next-isolated.mjs` | | Lint/formatação | Configuração flat do ESLint + Prettier (`lint-staged` por meio do pre-commit do Husky) | | Sistema de módulos | ESM em todos os lugares (`"type": "module"`) | | Interface do painel | **Tailwind CSS 4** + o **Keak CI UI Kit** incluído no repositório (`packages/ui-kit`), ícones Lucide — consulte `DESIGN_SYSTEM.md` | | Workspaces | workspaces do npm — `open-sse`, `packages/browser-pool`, `packages/ui-kit` | Aliases de caminho (`tsconfig.json`): - `@/*` → `src/*` - `@omniroute/open-sse` → `open-sse/index.ts` - `@omniroute/open-sse/*` → `open-sse/*` - `@omniroute/ui-kit` → `packages/ui-kit/src`, `@omniroute/ui-kit/*` → `packages/ui-kit/src/*` Porta HTTP padrão: **`20128`** (a API e o painel compartilham o mesmo processo). O diretório de dados é definido pela variável de ambiente `DATA_DIR`, com o padrão `~/.omniroute/`. --- ## 2. Estrutura do Repositório ``` OmniRoute/ ├── src/ Aplicação Next.js (App Router, bibliotecas, domínio, servidor, compartilhados) ├── open-sse/ Workspace do mecanismo de streaming (@omniroute/open-sse) ├── packages/ Workspaces: ui-kit (Keak CI UI Kit incorporado), browser-pool ├── electron/ Wrapper para desktop (processo principal do Electron 41 + preload) ├── bin/ Pontos de entrada da CLI (omniroute, reset-password) ├── tests/ Testes unitários, de integração, e2e, protocols-e2e, tradutor, segurança, fixtures ├── scripts/ Scripts auxiliares de build, sincronização, verificação, migração e runtime ├── docs/ Documentação pública (este diretório) ├── public/ Recursos estáticos, manifesto PWA, service worker ├── config/ Exemplos de configuração de runtime ├── images/ Recursos de marketing/capturas de tela ├── _ideia/, _references/, _mono_repo/, _tasks/ Rascunhos/planejamento internos (não distribuídos) ├── CLAUDE.md Regras do repositório para o Claude Code ├── AGENTS.md Referência mais detalhada da arquitetura para agentes ├── package.json v3.8.51, raiz do workspace └── tsconfig.json Aliases de caminho + principais opções do compilador ``` --- ## 3. `src/` — Aplicativo Next.js ``` src/ ├── app/ Páginas do App Router + rotas de API ├── lib/ Bibliotecas principais (BD, autenticação, OAuth, habilidades, memória, …) ├── domain/ Camada de domínio pura (política, fallback, custo, bloqueio, …) ├── server/ Módulos exclusivos do servidor (autorização, CORS, autenticação) ├── shared/ Tipos, constantes, validação, contratos e utilitários (seguros entre fronteiras) ├── mitm/ Auxiliares de proxy man-in-the-middle para integração com a CLI ├── models/ Metadados/aliases de modelos locais ├── sse/ Manipuladores SSE legados que ainda residem em src/ (não em open-sse/) ├── store/ Stores de estado do lado do cliente ├── middleware/ Utilitários de middleware no nível das rotas (não o middleware global do Next.js) ├── scripts/ Scripts na árvore importáveis pelo código do aplicativo ├── types/ Tipos TS globais e compartilhados ├── i18n/ Pacotes de localidades ├── instrumentation.ts Hook de instrumentação do Next.js ├── instrumentation-node.ts └── proxy.ts Auxiliar de inicialização do proxy no nível superior ``` ### 3.1 `src/app/` — App Router O App Router expõe tanto a interface do dashboard quanto a API HTTP pública/de gerenciamento. **Não há middleware global** — a interceptação é feita por rota. Segmentos de nível superior em `src/app/`: | Caminho | Finalidade | | ----------------------------------------------------------------------------- | ----------------------------------------------------------- | | `api/` | Todas as rotas da API HTTP (veja os detalhes abaixo) | | `a2a/` | Endpoint A2A JSON-RPC 2.0 (`POST /a2a`) | | `.well-known/agent.json/` | Documento de descoberta do A2A Agent Card | | `(dashboard)/` | Interface do dashboard (grupo de rotas, sem prefixo de URL) | | `auth/`, `login/`, `forgot-password/`, `callback/` | Fluxos de autenticação | | `landing/` | Página de marketing/landing page | | `docs/` | Visualizador incorporado da documentação da API | | `status/`, `maintenance/`, `offline/` | Páginas operacionais | | `privacy/`, `terms/` | Páginas jurídicas | | `400/`, `401/`, `403/`, `408/`, `429/`, `500/`, `502/`, `503/` | Páginas de erro estáticas | | `error.tsx`, `global-error.tsx`, `not-found.tsx`, `forbidden/`, `loading.tsx` | Limites de erro/carregamento do framework | | `layout.tsx`, `page.tsx`, `globals.css`, `manifest.ts` | Estrutura raiz | #### 3.1.1 `src/app/(dashboard)/dashboard/` — Páginas da interface `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`, além dos arquivos raiz `page.tsx`, `HomePageClient.tsx`, `BootstrapBanner.tsx`. #### 3.1.2 `src/app/api/` — Grupos de API de nível superior ``` 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/ Gerenciamento de serviços incorporados (9router, cliproxy) — LOCAL_ONLY ├── upstream-proxy/ ├── usage/ ├── v1/ API pública compatível com OpenAI ├── v1beta/ Compatibilidade no estilo Gemini ├── version-manager/ └── webhooks/ ``` #### 3.1.2a `src/app/api/services/` — Gerenciamento de serviços incorporados Rotas para instalar, iniciar, interromper e monitorar 9Router e CLIProxyAPI. Todos os caminhos são classificados como **LOCAL_ONLY** (somente loopback, regra rígida nº 17), pois podem invocar `npm install` e gerar processos filhos. ``` src/app/api/services/ ├── 9router/ │ ├── _lib.ts auxiliar getOrInitSupervisor() │ ├── install/route.ts POST — npm install por meio de 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 de uma versão mais recente │ ├── rotate-key/route.ts POST — gerar nova chave de API + reiniciar │ ├── status/route.ts GET — status em tempo real + no banco de dados + metadados da versão │ └── auto-start/route.ts POST — alternar o sinalizador auto_start ├── cliproxy/ │ ├── _lib.ts auxiliar getOrInitSupervisor() │ ├── 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 de uma versão mais recente │ ├── status/route.ts GET — status em tempo real + no banco de dados + metadados da versão │ └── auto-start/route.ts POST — alternar o sinalizador auto_start └── [name]/ └── logs/route.ts GET — acompanhamento de logs via SSE (compartilhado por todos os serviços) ``` Interface correspondente do painel: `src/app/(dashboard)/dashboard/providers/services/` — página com duas abas (CLIProxyAPI + 9Router). Proxy reverso para a interface incorporada do 9Router: `src/app/(dashboard)/dashboard/providers/services/[name]/embed/[[...path]]/route.ts` Análise detalhada: `docs/frameworks/EMBEDDED-SERVICES.md` #### 3.1.3 `src/app/api/v1/` — API pública compatível com a OpenAI ``` v1/ ├── accounts/[id]/ consulta de conta ├── agents/tasks/[id]/, agents/tasks/ endpoints de tarefas no estilo A2A ├── api/ auxiliares internos de API expostos em v1/api ├── audio/{speech, transcriptions}/ TTS + STT ├── batches/[id]/{cancel}, batches/ API de lotes da OpenAI ├── chat/completions/ Chat Completions (o endpoint principal) ├── completions/ conclusões de texto legadas ├── embeddings/ embeddings ├── files/[id]/, files/ API de arquivos ├── _helpers/ auxiliares de rota compartilhados (sem URL pública) ├── images/{edits, generations}/ geração + edição de imagens ├── issues/ endpoints auxiliares de triagem ├── management/{proxies}/ rotas com escopo de gerenciamento dentro de v1 ├── messages/{count_tokens}/ compatibilidade com mensagens no estilo Anthropic ├── models/ listagem de modelos (`route.ts`, `catalog.ts`) ├── moderations/ moderação ├── music/ geração de música ├── providers/[provider]/ operações por provedor ├── quotas/{check} sondagens de cota ├── registered-keys/ administração de chaves registradas ├── rerank/ reclassificação ├── responses/[...path]/ API Responses da OpenAI (captura abrangente) ├── search/ pesquisa na web ├── videos/ geração de vídeos ├── ws/ ponte WebSocket └── route.ts manipulador de índice ``` Cada arquivo de rota segue o mesmo padrão: ``` Rota → preflight de CORS → validação do corpo com Zod → autenticação opcional → aplicação da política de chaves de API → delegação ao manipulador (open-sse) ``` `v1beta/` é a superfície de compatibilidade no estilo Gemini (um wrapper leve que traduz para o mesmo pipeline `open-sse/handlers/`). ### 3.2 `src/lib/` — Bibliotecas principais Sempre importe dados, sincronização, OAuth, habilidades, memória etc. por meio desses módulos. A tabela agrupa os diretórios reais e os arquivos de nível superior relevantes. | Módulo | Finalidade | | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `a2a/` | Servidor do protocolo A2A: `taskManager.ts`, `streaming.ts`, `taskExecution.ts`, `routingLogger.ts`, `skills/` (6 habilidades: análise de custos, relatório de integridade, descoberta de provedores, gerenciamento de cotas, roteamento inteligente, listagem de recursos) | | `acp/` | Protocolo de Controle de Agentes: `index.ts`, `manager.ts`, `registry.ts` | | `api/` | Utilitários internos da API: `requireManagementAuth.ts`, `requireCliToolsAuth.ts`, `errorResponse.ts` | | `auth/` | `managementPassword.ts` (redefinição de senha / hashing) | | `batches/` | Serviço da API Batches da OpenAI (`service.ts`) | | `catalog/` | Sincronização do catálogo do OpenRouter (`openrouterCatalog.ts`) | | `cloudAgent/` | Registro de agentes na nuvem: `api.ts`, `baseAgent.ts`, `db.ts`, `index.ts`, `registry.ts`, `types.ts`, `agents/{codex, devin, jules}.ts` | | `combos/` | Utilitários de resolução de combos | | `compliance/` | Auditoria + auditoria de provedores: `index.ts`, `providerAudit.ts` | | `config/` | Integração da configuração de runtime | | `db/` | Módulos de domínio SQLite (consulte §3.2.1) | | `display/` | Utilitários de UI/exibição usados pelas respostas da API | | `embeddings/` | Registro de serviços de embedding | | `env/` | Carregamento + introspecção de variáveis de ambiente | | `evals/` | Runtime de avaliações | | `guardrails/` | `piiMasker.ts`, `promptInjection.ts`, `visionBridge.ts`, `visionBridgeHelpers.ts`, `registry.ts`, `base.ts` | | `jobs/` | Tarefas em segundo plano (`autoUpdate.ts`, …) | | `memory/` | Memória persistente: `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/` | Módulos de provedores de OAuth/importação (22): `agy`, `antigravity`, `claude`, `cline`, `codebuddy-cn`, `codex`, `cursor`, `devin-desktop`, `ghe-copilot`, `github`, `gitlab-duo`, `grok-cli-oauth`, `grok-cli`, `kilocode`, `kimi-coding`, `kiro`, `openference`, `qoder`, `trae`, `xai-oauth`, `zed-hosted`, `zed`, além de `services/`, `utils/` e `constants/oauth.ts` | | `plugins/` | Carregador de plugins (`index.ts`) | | `promptCache/` | `prefixAnalyzer.ts`, `index.ts` | | `providerModels/` | Ciclo de vida de modelos gerenciados: `modelDiscovery.ts`, `managedModelImport.ts`, `managedAvailableModels.ts`, `cursorAgent.ts` | | `providers/` | Utilitários de provedores: `catalog.ts`, `validation.ts`, `imageValidation.ts`, `claudeExtraUsage.ts`, `codexConnectionDefaults.ts`, `codexFastTier.ts`, `webCookieAuth.ts`, `managedAvailableModels.ts`, `requestDefaults.ts` | | `resilience/` | `settings.ts` — configurações de circuit breaker, período de espera e bloqueio | | `runtime/` | Detecção de recursos em tempo de execução | | `search/` | `executeWebSearch.ts` | | `services/` | Framework de serviços integrados: `ServiceSupervisor.ts` (supervisor genérico de processos filhos com bloqueio de operações, buffer circular e verificador de integridade), `bootstrap.ts` (registro no nível do processo e inicialização automática), `registry.ts` (mapa de ferramenta → supervisor), `apiKey.ts` (armazenamento de chaves AES-256-GCM), `modelSync.ts` (sincronização periódica de modelos), `ringBuffer.ts` (buffer circular de logs de 5 MB), `healthCheck.ts` (sonda HTTP de integridade), `types.ts`, `embedWsProxy.ts` (proxy WebSocket), `installers/{ninerouter,cliproxy}.ts`. Consulte `docs/frameworks/EMBEDDED-SERVICES.md` | | `agentSkills/` | Catálogo e gerador de Agent Skills: `catalog.ts` (getCatalog/getSkillById/filterCatalog/computeCoverage), `generator.ts` (generateAgentSkills → grava `skills/{id}/SKILL.md`), `openapiParser.ts` (extrai endpoints REST da especificação OpenAPI), `cliRegistryParser.ts` (extrai subcomandos da CLI de bin/cli-registry), `schemas.ts` (Zod: AgentSkillSchema, SkillCoverageSchema, ListQuerySchema, GenerateBodySchema), `types.ts` (AgentSkill, SkillCoverage, SkillMarkdown, GeneratorReport). Consumido por rotas REST (`/api/agent-skills/*`), ferramentas MCP (`omniroute_agent_skills_*`) e pela skill A2A `list-capabilities`. Consulte [AGENT-SKILLS.md](../frameworks/AGENT-SKILLS.md). | | `skills/` | Framework de skills: `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`, além de `builtin/browser.ts` | | `spend/` | `batchWriter.ts` (buffer de gravação postergada) | | `sync/` | `bundle.ts`, `tokens.ts` (Sincronização na Nuvem) | | `system/` | Utilitários de nível de sistema | | `translator/` | Integração de nível superior do tradutor (delega para `open-sse/translator/`) | | `usage/` | Contabilização de uso: `costCalculator.ts`, `tokenAccounting.ts`, `usageHistory.ts`, `aggregateHistory.ts`, `usageStats.ts`, `callLogs.ts`, `callLogArtifacts.ts`, `fetcher.ts`, `providerLimits.ts`, `migrations.ts` | | `versionManager/` | Atualização automática + manifesto de versão | | `ws/` | Ponte WebSocket | | `zed-oauth/` | Fluxo OAuth do editor Zed | Arquivos de nível superior em `src/lib/`: - O antigo arquivo agregador `localDb.ts` foi removido — os consumidores importam módulos específicos de `src/lib/db/*` diretamente. - `proxyHealth.ts`, `proxyLogger.ts`, `tokenHealthCheck.ts`, `localHealthCheck.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/` Banco de dados SQLite singleton (`getDbInstance()` em `core.ts`, registro em diário WAL). **Nunca escreva SQL bruto em rotas ou manipuladores** — use estes módulos. ![Visão geral do esquema do banco de dados (principais tabelas selecionadas)](../diagrams/exported/db-schema-overview.svg) > Fonte: [diagrams/db-schema-overview.mmd](../diagrams/db-schema-overview.mmd) Módulos de domínio (cada um é responsável por uma ou mais tabelas): `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/` contém 168 arquivos `.sql` versionados (idempotentes e transacionais) e é executado por `migrationRunner.ts` durante a inicialização. Tabelas criadas ao longo das migrações (123 no 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` (além de tabelas virtuais FTS5 para busca em memórias). ### 3.3 `src/domain/` — Camada de domínio Lógica de negócios pura, sem E/S. Importada por rotas e manipuladores. | Arquivo | Finalidade | | ------------------------------------------ | -------------------------------------------------------------- | | `policyEngine.ts` | Resolvedor de políticas de nível superior | | `fallbackPolicy.ts` | Árvore de decisão de fallback | | `costRules.ts` | Regras de cálculo de custos | | `lockoutPolicy.ts` | Decisões de bloqueio de modelos | | `tagRouter.ts` | Roteamento baseado em tags | | `comboResolver.ts` | Resolução de combinação da solicitação → lista de destinos | | `connectionModelRules.ts` | Filtros de modelo por conexão | | `modelAvailability.ts` | Verificação de disponibilidade do modelo | | `degradation.ts` | Transições para o modo degradado | | `providerExpiration.ts` | Detecção de contas/chaves expiradas | | `quotaCache.ts` | Decisões de cota armazenadas em cache | | `responses.ts`, `omnirouteResponseMeta.ts` | Utilitários para formatos de resposta | | `configAudit.ts` | Auditoria de alterações de configuração | | `assessment/` | Avaliação de modelos (conforme RFC, parcialmente implementada) | | `types.ts` | Tipos de domínio compartilhados | ### 3.4 `src/server/` — Somente servidor Não pode ser importado por componentes de cliente. ``` server/ ├── auth/loginGuard.ts ├── authz/ │ ├── classify.ts Classifica as rotas como públicas ou de gerenciamento │ ├── assertAuth.ts Utilitário de asserção │ ├── context.ts Contexto de autorização por solicitação │ ├── headers.ts │ ├── pipeline.ts Pipeline de autorização │ ├── policies/ Políticas concretas │ └── types.ts └── cors/origins.ts Lista de permissões de origens CORS ``` ### 3.5 `src/shared/` — Seguro para compartilhamento Dividido em subdiretórios específicos: - `constants/` — `providers.ts` (catálogo de provedores validado com Zod), `models.ts`, `modelSpecs.ts`, `modelCompat.ts`, `pricing.ts`, `cliTools.ts`, `cliCompatProviders.ts`, `routingStrategies.ts`, `comboConfigMode.ts`, `headers.ts`, `upstreamHeaders.ts` (lista de bloqueio), `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 esquemas Zod), `compressionConfigSchemas.ts`, `providerSchema.ts`, `settingsSchemas.ts`, `helpers.ts`. - `contracts/` — contratos da API pública distribuídos pelo npm. - `types/` — tipos TS compartilhados. - `utils/` — `circuitBreaker.ts`, `apiAuth.ts`, `apiKey.ts`, `apiKeyPolicy.ts`, `api.ts`, `classify429.ts`, `cliCompat.ts`, `clipboard.ts`, `cloud.ts`, `cn.ts`, `cors.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`, além de hooks/componentes do dashboard em `services/`, `network/`, `middleware/`, `schemas/`, `hooks/`, `components/`. - `components/` — a API de componentes do dashboard (barrel `index.tsx`: `Button`, `Input`, `Select`, `Modal`, `Card`, `DataTable`, …). Os componentes primitivos são adaptadores para o kit incorporado (`packages/ui-kit`, importado pelo subcaminho do componente, como `@omniroute/ui-kit/button`), de modo que as telas mantenham suas importações enquanto a marcação pertence ao kit. O shell é `layouts/DashboardLayout.tsx` → `layouts/DashboardShell.tsx` (`SidebarProvider`/`SidebarInset` do kit), com `Sidebar.tsx` e `Header.tsx`; os ícones passam por `Icon.tsx` e `constants/iconMap.ts`. Consulte `docs/architecture/DESIGN_SYSTEM.md`. --- ## 4. Espaço de trabalho do mecanismo de streaming `open-sse/` — Espaço de trabalho npm separado publicado como `@omniroute/open-sse`. Possui processamento de solicitações, executores, tradutores, serviços, transformador e servidor MCP. ``` 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/ 159 provider executor modules (executor classes + per-provider helpers) ├── 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, 33 scopes, 110 tools) ``` ### 4.1 `open-sse/handlers/` | Manipulador | Propósito | | ----------------------- | ------------------------------------------------------------------------------------------- | | `chatCore.ts` | Pipeline de chat principal (cache, limite de taxa, roteamento combinado, envio de executor) | | `responsesHandler.ts` | Respostas OpenAI ponto de entrada API | | `embeddings.ts` | Incorporações | | `imageGeneration.ts` | Geração de imagem | | `audioSpeech.ts` | Conversão de texto para fala | | `audioTranscription.ts` | Fala para texto | | `videoGeneration.ts` | Geração de vídeo | | `musicGeneration.ts` | Geração musical | | `rerank.ts` | Reclassificação | | `moderations.ts` | Moderação | | `search.ts` | Pesquisa na web | | `sseParser.ts` | analisador de eventos SSE | | `usageExtractor.ts` | Extrair contagens de tokens de fluxos upstream | | `responseSanitizer.ts` | Retirar ruído específico do provedor | | `responseTranslator.ts` | Colagem entre a resposta do provedor e a camada do tradutor | ### 4.2 `open-sse/executors/` 159 módulos executores de nível superior (`*.ts` menos `base.ts`, `index.ts` e testes — as medidas de contagem `npm run check:docs-counts` ). Cada classe de executor estende `BaseExecutor` (`base.ts`), diretamente ou através de `DefaultExecutor` ou outro executor; os módulos restantes são auxiliares por provedor (esquemas de ferramentas, adaptadores fetch/TTS, manipuladores de peculiaridades). Os executores incluem: `antigravity`, `azure-openai`, `blackbox-web`, `cliproxyapi`, `chatgpt-web-codex`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, `muse-spark-web`, `nlpcloud`, `opencode`, `perplexity-web`, `petals`, `pollinations`, `qoder`, `vertex`, `devin-desktop`, mais `claudeIdentity.ts` (ajudante de identidade compartilhada) e `index.ts` (registro). > Observação: os provedores não listados aqui são atendidos pelo `default.ts` usando o executor genérico compatível com OpenAI. O catálogo completo de provedores (381 provedores) está em `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` Tradução hub-and-spoke (OpenAI é o hub). - **9 solicitar tradutores** (`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`. - **9 tradutores de resposta** (`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 ajudantes** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, além de testes auxiliares. - **Ajudantes de imagem** (`translator/image/sizeMapper.ts`). - Nível superior: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` - `responsesTransformer.ts` — `TransformStream` -based Respostas API ↔ Conversor de conclusões de bate-papo (usado pela rota `responses/` pega-tudo). ### 4.5 `open-sse/services/` Destaques (lista completa em `open-sse/services/`): | Preocupação | Arquivos | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Roteamento combinado | `combo.ts` (20 estratégias), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | | Motor combinado automático | `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` | | Resiliência | `accountFallback.ts` (bloqueio de resfriamento + ), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | | Cotas | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | | Cache | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | | Inteligência de roteamento | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | | Manipulação de modelo | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | | Compressão | Fiação do motor de compressão total `compression/` — | | Sessão de token + | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | | Camada/manifesto | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | | IP / rede | `ipFilter.ts`, `webSearchFallback.ts` | | Lotes | `batchProcessor.ts` | | Uso | `usage.ts` | ### 4.6 `open-sse/mcp-server/` - **110 ferramentas exclusivas** conectado em `server.ts` (45 canônicos em `schemas/tools.ts` + memória, habilidades, habilidades GitHub, pool, gamificação, plugin, Notion, Obsidian, corpus local e módulos de compressão — union contados por `countUniqueMcpTools`). - **3 transportes** : stdio, HTTP Transmissível, SSE. - **33 escopos** aplicada em tempo de execução — base list em `src/shared/constants/mcpScopes.ts`, full set é a união dos escopos declarados por cada módulo de ferramenta. - Tabela de auditoria: `mcp_tool_audit` (preenchida por `audit.ts`). - Arquivos: `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`, além de testes em `__tests__/`. - Consulte [MCP-SERVER.md](../frameworks/MCP-SERVER.md) para obter o catálogo completo de ferramentas. ### 4.7 `open-sse/config/` Registros de provedor (`providerRegistry.ts`, `providerModels.ts`, `providerHeaderProfiles.ts`), registros de modelo por formato (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), auxiliares de identidade (`codexIdentity.ts`, `codexInstructions.ts`, `anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, `cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`), credencial ajudantes (`credentialLoader.ts`, `codexClient.ts`) e adaptadores de nuvem (`azureAi.ts`, `bedrock.ts`, `datarobot.ts`, `maritalk.ts` `glmProvider.ts` `oci.ts`, `petals.ts`, `runway.ts`, `sap.ts`, `watsonx.ts`, `ollamaModels.ts`, `errorConfig.ts`, `constants.ts`, `registryUtils.ts`). ### 4.8 `open-sse/utils/` Primitivas de streaming e auxiliares de provedor: `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/` — Wrapper para desktop ``` electron/ ├── main.js Processo principal do Electron ├── preload.js Ponte de pré-carregamento (contextIsolation habilitado) ├── types.d.ts ├── package.json Configuração do electron-builder, versão 3.8.51 ├── README.md ├── assets/ Recursos de build (ícones, entitlements, …) ├── node_modules/ node_modules dedicado (better-sqlite3, electron-updater) └── dist-electron/ Saída do build (não versionada) ``` Cinco scripts npm na raiz do workspace: `electron:dev`, `electron:build`, `electron:build:{win,mac,linux}`, `electron:smoke:packaged`. A atualização automática é feita via `electron-updater`, apontando para o feed de releases do GitHub. --- ## 6. `bin/` — CLI ``` bin/ ├── omniroute.mjs Entrada principal da CLI (Node ESM) ├── reset-password.mjs Redefine a senha de gerenciamento pela CLI ├── mcp-server.mjs Inicializador do servidor MCP (stdio) ├── nodeRuntimeSupport.mjs Verificação da versão do Node └── cli/ ├── program.mjs Construtor do programa Commander ├── runtime.mjs Auxiliar withRuntime (servidor primeiro/fallback para banco de dados) ├── output.mjs Formatadores de saída (json/jsonl/table/csv) ├── i18n.mjs Auxiliar t() com localidades ├── api.mjs Auxiliar de fetch da API ├── data-dir.mjs ├── encryption.mjs ├── sqlite.mjs └── commands/ ├── registry.mjs Registro de comandos ├── setup.mjs ├── doctor.mjs ├── providers.mjs └── ... (um arquivo por comando/grupo) ``` Dois binários são expostos em `package.json` → `bin`: - `omniroute` → `bin/omniroute.mjs` - `omniroute-reset-password` → `bin/reset-password.mjs` --- ## 7. `tests/` | Diretório | Tipo | | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | `tests/unit/` | Testes unitários pelo executor de testes nativo do Node (1821 arquivos, além dos subdiretórios `api/`, `auth/`, `authz/`) | | `tests/integration/` | Testes entre módulos e do estado do banco de dados | | `tests/e2e/` | Testes de interface com Playwright | | `tests/e2e/protocol-clients.test.ts` | Testes e2e dos protocolos MCP/A2A | | `tests/translator/` | Testes específicos do tradutor | | `tests/security/` | Regressões de segurança | | `tests/load/` | Testes de carga / estresse | | `tests/golden-set/` | Saídas de referência para regressões do tradutor | | `tests/helpers/`, `tests/fixtures/`, `tests/manual/` | Suporte | Comandos comuns: | Comando | O que executa | | -------------------------------------------------------- | --------------------------------------------------------------------------------- | | `npm run test:unit` | Todos os `tests/unit/*.test.ts` pelo executor de testes do Node (concorrência 10) | | `npm run test:vitest` | Suíte Vitest (MCP, autoCombo, cache) | | `npm run test:e2e` | Suíte de interface do Playwright | | `npm run test:protocols:e2e` | Testes e2e dos protocolos MCP + A2A | | `npm run test:coverage` | Limite mínimo de cobertura (≥60% de linhas/instruções/funções/ramificações) | | `node --import tsx/esm --test tests/unit/.test.ts` | Execução de um único arquivo | --- ## 8. `scripts/` Organizado em 6 subpastas por finalidade. - **`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`, além dos utilitários somente leitura para acompanhamento de PRs: `ci-discriminate.sh` (classifica as assinaturas de verificações com falha de um PR como próprias / herdadas / desconhecidas, comparando-as com um PR de referência ou com a issue de falhas na base) e `audit-worktree.sh` (arquivos modificados, superfícies protegidas, asserções removidas, contagens de supressões, tsconfigs temporários remanescentes, head do PR em comparação com o HEAD local — antes que o PR de um worker seja aceito). - **`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. Pipeline de requisições (resumo) ![Pipeline de requisições (/v1/chat/completions)](../diagrams/exported/request-pipeline.svg) > Fonte: [diagrams/request-pipeline.mmd](../diagrams/request-pipeline.mmd) ``` Requisição do cliente → /v1/chat/completions (route.ts) Verificação de preflight CORS Validação Zod (chatCompletionsSchema em shared/validation/schemas.ts) Autenticação (extractApiKey + isValidApiKey OU requireManagementAuth) Mecanismo de políticas (src/server/authz/pipeline.ts) Proteções (mascarador de PII, injeção de prompt, ponte de visão) → handleChatCore() (open-sse/handlers/chatCore.ts) Verificação de cache (cache semântico + cache de leitura) Limitação de taxa (rateLimitManager, accountSemaphore) Roteamento combinado (se o modelo for resolvido como uma combinação) comboResolver → loop por destino → handleSingleModel() translateRequest() (open-sse/translator/request/*) getExecutor(providerId).execute() (open-sse/executors/*) fetch upstream → nova tentativa/recuo via accountFallback translateResponse() (open-sse/translator/response/*) Stream SSE OU resposta JSON Se for a Responses API: TransformStream via open-sse/transformer/responsesTransformer.ts → Auditoria de conformidade (src/lib/compliance/) → Resposta ao cliente ``` ### Estado de resiliência em tempo de execução (três mecanismos) | Mecanismo | Escopo | Onde | | -------------------------- | --------------------------- | -------------------------------------------------------------------------------------------------------------- | | Disjuntor do provedor | Provedor inteiro | `src/shared/utils/circuitBreaker.ts`, persistido em `domain_circuit_breakers` | | Tempo de espera da conexão | Uma conta/chave | `markAccountUnavailable()` em `src/sse/services/auth.ts`; consumido por `accountFallback.checkFallbackError()` | | Bloqueio de modelo | Provedor + conexão + modelo | `open-sse/services/accountFallback.ts`, persistido em `domain_lockout_state` | Consulte [RESILIENCE_GUIDE.md](./RESILIENCE_GUIDE.md) e a seção dedicada em [CLAUDE.md](../../CLAUDE.md). --- ## 10. Como contribuir ### Adicionar um novo provedor 1. Registre em `src/shared/constants/providers.ts` (validado pelo Zod durante o carregamento). 2. Adicione um executor em `open-sse/executors/` se for necessária uma lógica personalizada (estenda `BaseExecutor`). 3. Adicione um tradutor em `open-sse/translator/` se ele não utilizar o formato da OpenAI. 4. Se for baseado em OAuth, adicione a configuração em `src/lib/oauth/providers/` e `src/lib/oauth/services/`. 5. Registre os modelos em `open-sse/config/providerRegistry.ts` (ou no registro específico do formato em `open-sse/config/`). 6. Escreva testes em `tests/unit/`. ### Adicionar uma nova rota de API 1. Crie `src/app/api/your-route/route.ts`. 2. Siga o padrão: CORS → validação do corpo com Zod → autenticação → delegação ao manipulador. 3. Se houver um novo formato de requisição: adicione o esquema Zod em `src/shared/validation/schemas.ts`. 4. Se for exclusiva para gerenciamento: adicione o caminho a `src/shared/constants/publicApiRoutes.ts` (lista de bloqueio para a superfície da API pública). 5. Adicione testes em `tests/unit/`. 6. Atualize `docs/reference/API_REFERENCE.md` e `docs/openapi.yaml`. ### Adicionar um novo módulo de banco de dados 1. Crie `src/lib/db/yourModule.ts` e importe `getDbInstance()` de `./core.ts`. 2. Exporte funções CRUD para o seu domínio. 3. Se houver novas tabelas: adicione uma migração em `src/lib/db/migrations/`, numerada sequencialmente, idempotente e transacional. 4. Os importadores usam importações diretas de `@/lib/db/yourModule` (sem arquivo agregador — a antiga camada de reexportação `localDb.ts` foi removida). 5. Adicione testes em `tests/unit/`. ### Adicionar uma nova ferramenta MCP 1. Adicione a definição da ferramenta em `open-sse/mcp-server/tools/` (ou estenda `open-sse/mcp-server/schemas/tools.ts`). 2. Atribua o(s) escopo(s) apropriado(s) em `src/shared/constants/mcpScopes.ts`. 3. Registre a ferramenta em `open-sse/mcp-server/server.ts`. 4. Adicione testes em `open-sse/mcp-server/__tests__/`. 5. Atualize [MCP-SERVER.md](../frameworks/MCP-SERVER.md). ### Adicionar uma nova habilidade A2A Consulte [A2A-SERVER.md § Adicionando uma nova habilidade](../frameworks/A2A-SERVER.md). As habilidades ficam em `src/lib/a2a/skills/` e são registradas por meio do gerenciador de tarefas A2A. --- ## 11. Convenções - **Estilo de código**: recuo de 2 espaços, aspas duplas, largura de 100 caracteres, ponto e vírgula, vírgulas finais no estilo `es5` — aplicados pelo Prettier por meio do `lint-staged`. - **Importações**: externas → internas (`@/`, `@omniroute/open-sse`) → relativas. - **Nomenclatura**: arquivos em `camelCase` ou `kebab-case`, componentes em `PascalCase`, constantes em `UPPER_SNAKE`. - **ESLint**: `no-eval`, `no-implied-eval`, `no-new-func` = `error` em todos os lugares; `no-explicit-any` = `warn` em `open-sse/` e `tests/`, erro nos demais locais. - **TypeScript**: `strict: false` (postura herdada). Prefira tipos explícitos em vez de inferência nos limites entre módulos. - **Banco de dados**: nunca escreva SQL bruto em rotas ou manipuladores — sempre utilize módulos de `src/lib/db/`. Nunca importe por meio de um arquivo agregador — use diretamente módulos específicos de `src/lib/db/*`. - **Tipagem de entidades do banco de dados (#3512)**: uma função que grava ou lê o formato de linha de uma tabela do banco de dados deve receber/retornar uma interface TS nomeada que espelhe as colunas dessa tabela na proporção 1:1, não `any` nem um tipo anônimo em linha no local da chamada. Coloque a interface ao lado da função (por exemplo, `export interface UsageEntry` em `src/lib/usage/usageHistory.ts` acima de `saveRequestUsage`), mantenha campos individuais opcionais/anuláveis quando diferentes gravadores preencherem a linha de forma incremental e prefira `unknown` a `any` para um campo cujo formato varie entre os chamadores (documentado no campo; por exemplo, `UsageEntry.tokens` aceita tanto o uso bruto no formato do provedor quanto o formato normalizado). Quando a contagem de `any` de um arquivo chegar a zero dessa forma, adicione-o à lista de permissões de `check:any-budget:t11` (`scripts/check/check-t11-any-budget.mjs`, `maxAny: 0`) para evitar regressões. Esta é uma convenção para a primeira etapa — a remoção mais ampla de "`any` anônimo" é iterativa no restante da base de código. - **Erros**: use try/catch com tipos de erro específicos e registre logs com contexto do pino. Nunca ignore silenciosamente erros em fluxos SSE; use sinais de cancelamento para a limpeza. - **Segurança**: nunca use `eval()` / `new Function()` / eval implícito. Valide todas as entradas com Zod. Criptografe credenciais em repouso (AES-256-GCM). Mantenha a lista de bloqueio `src/shared/constants/upstreamHeaders.ts` alinhada com a camada de sanitização/validação. - **Commits**: Conventional Commits — `feat(scope): subject`. Escopos permitidos: `db`, `sse`, `oauth`, `dashboard`, `api`, `cli`, `docker`, `ci`, `mcp`, `a2a`, `memory`, `skills`. - **Branches**: prefixos `feat/`, `fix/`, `refactor/`, `docs/`, `test/`, `chore/`. Nunca faça commits diretamente em `main`. - **Husky**: o pre-commit executa `lint-staged` + `check:docs-sync` + `check:any-budget:t11`; o pre-push executa `check:any-budget:t11` + `check:tracked-artifacts` (verificações rápidas; exclui `test:unit`). --- ## 12. Regras Rígidas (do CLAUDE.md) 1. Nunca faça commit de segredos ou credenciais. 2. Nunca faça barrel import — use diretamente módulos específicos de `src/lib/db/*`. 3. Nunca use `eval()` / `new Function()` / eval implícito. 4. Nunca faça commit diretamente na `main`. 5. Nunca escreva SQL bruto em rotas — sempre use os módulos de `src/lib/db/`. 6. Nunca ignore silenciosamente erros em fluxos SSE. 7. Sempre valide as entradas com esquemas Zod. 8. Sempre inclua testes ao alterar código de produção. 9. A cobertura deve permanecer ≥ 60% (instruções, linhas, funções e ramificações). --- ## 13. Veja Também - [ARCHITECTURE.md](./ARCHITECTURE.md) — arquitetura de alto nível e responsabilidades dos módulos. - [API_REFERENCE.md](../reference/API_REFERENCE.md) — referência das APIs pública e de gerenciamento. - [FEATURES.md](../guides/FEATURES.md) — matriz de recursos e destaques das versões. - [RESILIENCE_GUIDE.md](./RESILIENCE_GUIDE.md) — análise detalhada de circuit breaker, cooldown e lockout. - [AUTO-COMBO.md](../routing/AUTO-COMBO.md) — pontuação e estratégias do Auto Combo. - [MCP-SERVER.md](../frameworks/MCP-SERVER.md) — catálogo completo de ferramentas MCP + transportes. - [A2A-SERVER.md](../frameworks/A2A-SERVER.md) — habilidades e descoberta do protocolo A2A. - [COMPRESSION_GUIDE.md](../compression/COMPRESSION_GUIDE.md) — compactação RTK + Caveman. - [CLI-TOOLS.md](../reference/CLI-TOOLS.md) — integrações de CLI. - [ELECTRON_GUIDE.md](../guides/ELECTRON_GUIDE.md) (se presente), [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) — destinos de implantação. - [TROUBLESHOOTING.md](../guides/TROUBLESHOOTING.md) — problemas operacionais comuns. - [CONTRIBUTING.md](../../CONTRIBUTING.md) — fluxo de trabalho dos colaboradores. - [CLAUDE.md](../../CLAUDE.md) — regras do repositório para o Claude Code (a fonte oficial para muitas das convenções acima). - [AGENTS.md](../../AGENTS.md) — referência de arquitetura mais detalhada usada pelos agentes.