Stealth Guide (Português (Brasil))
Camada de Impressão Digital TLS
Seção intitulada “Camada de Impressão Digital TLS”open-sse/utils/tlsClient.ts — wreq-js (Chrome 124)
Seção intitulada “open-sse/utils/tlsClient.ts — wreq-js (Chrome 124)”Sessões persistentes do wreq-js são criadas de forma tardia por escopo de conta e proxy resolvido. O
TlsClient do processo mantém um pool de no máximo 128 sessões que se passam pelo Chrome 124 no macOS para
serviços upstream protegidos pelo Cloudflare. TlsClient.fetch() falha de forma segura quando o runtime nativo
não está disponível; um chamador pode selecionar explicitamente uma alternativa fora deste wrapper.
- Perfil da sessão:
browser: "chrome_124", os: "macos" - Resolução de proxy (prioridade):
HTTPS_PROXY→HTTP_PROXY→ALL_PROXY(também em letras minúsculas) - Tempo limite:
TLS_CLIENT_TIMEOUT_MS(herdado deFETCH_TIMEOUT_MS, padrão 600000) - A Response do
wreq-jsé compatível com fetch (headers,text(),json(),clone(),body). - Watchdog do primeiro byte (
open-sse/utils/tlsFirstByteWatchdog.ts, #12656):TlsClient.fetch()é resolvido assim que os cabeçalhos do upstream chegam, portantoTLS_CLIENT_TIMEOUT_MS, por si só, não consegue limitar um corpo que nunca produz um primeiro byte.guardTlsFirstByte()faz uma corrida entre o primeiroread()do corpo eTLS_FIRST_BYTE_WATCHDOG_MS(padrão10000;0o desativa); um corpo saudável não é afetado, enquanto um corpo travado cancela o leitor do wreq e permite que a lógica de fallback TLS já existente deproxyFetchprossiga para o dispatcher direto/proxy (uma solicitação que não pode ser repetida com segurança, por exemplo, um POST com corpo, ainda gera um erro em vez de ser repetida silenciosamente).
Transporte de provedor por cookies da web — wreq-js 3.2.0
Seção intitulada “Transporte de provedor por cookies da web — wreq-js 3.2.0”open-sse/services/tlsClientBase.ts é o adaptador compartilhado pelos cinco transportes especializados
por cookies da web abaixo. Cada wrapper leve de provedor seleciona um perfil de navegador/SO. O adaptador
usa o único carregador de runtime do wreq e o pool de transportes em open-sse/utils/tlsClient.ts, indexado por
perfil + SO + proxy resolvido, enquanto cada solicitação usa cookieMode: "ephemeral". Portanto, contas e
solicitações compartilham conexões no nível de transporte, mas nunca uma sessão do wreq ou um repositório de cookies.
| Provedor | Perfil | SO emulado | Política de EOF do stream |
|---|---|---|---|
| Claude | chrome_146 |
Linux | incluir [DONE] |
| Perplexity | firefox_148 |
macOS | incluir event: end_of_stream |
| Grok | chrome_146 |
Linux | excluir [DONE] |
| Notion | chrome_146 |
Windows | incluir [DONE] |
| LMArena | chrome_146 |
Windows | sem sentinela; fechar no EOF nativo |
- O streaming consome diretamente o
ReadableStreamda resposta nativa; nenhum arquivo temporário ou processo auxiliar é criado. - Até 256 bytes iniciais são inspecionados antes que um stream seja exposto. Provedores SSE armazenam em buffer erros que não são SSE;
Grok/LMArena mapeiam desafios do Cloudflare para
403e páginas HTML intermediárias para502. - O tempo limite da solicitação nativa continua sendo envolvido por um prazo máximo absoluto em JS. Um travamento invalida e fecha somente o transporte de perfil/SO/proxy afetado antes que a próxima solicitação o recrie.
- A prioridade de resolução de proxy é
proxyUrlpor chamada → contexto de conta/painel limitado à solicitação →HTTPS_PROXY/HTTP_PROXY/ALL_PROXY(incluindo variantes em letras minúsculas). Erros de resolução resultam em falha segura, em vez de permitir o vazamento de uma conexão direta. O LMArena resolve deliberadamente em relação aarena.ai. byteResponseretorna uma URLdata:tipada por conteúdo, sem corrupção de UTF-8.- Os erros são
TlsClientUnavailableError(pacote/addon indisponível),TlsClientHangError(prazo excedido) eWreqTransportCapacityError(o código de erro compartilhado de capacidade de sessão) quando todos os 128 slots limitados de perfil/SO/proxy estão ativos ou em processo de encerramento.
A sessão genérica de TlsClient acima continua especializada em estado persistente de cookies baseado no navegador.
Ambos os caminhos reutilizam um único carregador de módulo do wreq em cache e um hook do ciclo de vida do processo; seus pools permanecem
separados porque a duração dos cookies é intencionalmente diferente.
Os perfis são compatíveis com o pacote fixado, mas a aceitação por WAFs reais pode mudar independentemente dos testes de contrato locais. Valide alterações de impressão digital com uma conta real explicitamente autorizada antes de alegar paridade com um navegador upstream.
Pacote de Furtividade do Claude Code
Seção intitulada “Pacote de Furtividade do Claude Code”Quando cliCompatMode está ativado, o OmniRoute reformata as solicitações de saída do Claude para que sejam indistinguíveis do tráfego do claude-cli. Três módulos trabalham em conjunto:
claudeCodeFingerprint.ts
Seção intitulada “claudeCodeFingerprint.ts”Calcula a impressão digital de 3 caracteres cc_version incorporada no cabeçalho de cobrança:
SHA256(SALT + msg[4] + msg[7] + msg[20] + version)[:3]FINGERPRINT_SALT = "59cf53e54c78"(fixo no código; corresponde ao cliente oficial)- Entradas: caracteres nos índices 4, 7 e 20 do texto da primeira mensagem do usuário + string da versão
- Saída: prefixo hexadecimal de 3 caracteres
claudeCodeCCH.ts (Hash do Conteúdo do Cliente)
Seção intitulada “claudeCodeCCH.ts (Hash do Conteúdo do Cliente)”Verificação de integridade no lado do servidor que a CLI oficial do Claude Code calcula por meio de Bun/Zig. O OmniRoute a reimplementa com xxhash-wasm:
- Serializar o corpo com o marcador de posição
cch=00000; xxhash64(bytes, seed) & 0xFFFFF- Valor hexadecimal em letras minúsculas, com 5 caracteres e preenchimento com zeros
- Substituir
cch=00000;pelo token calculado
Constantes:
- Semente:
0x6e52736ac806831e - Padrão:
/\bcch=([0-9a-f]{5});/
claudeCodeObfuscation.ts
Seção intitulada “claudeCodeObfuscation.ts”Insere um zero-width joiner Unicode (U+200D) após o primeiro caractere de nomes de clientes “sensíveis”, para que os filtros upstream não possam localizá-los com grep. Lista de palavras padrão:
opencode, open-code, cline, roo-cline, roo_cline, cursor, windsurf,aider, continue.dev, copilot, avante, codecompanionAplicado a: blocos system, todo o conteúdo de messages[].content e tools[].description / tools[].function.description. Pode ser substituído pelo operador por meio de setSensitiveWords().
claudeCodeCompatible.ts — provedores anthropic-compatible-cc-*
Seção intitulada “claudeCodeCompatible.ts — provedores anthropic-compatible-cc-*”Para relays Anthropic de terceiros que aceitam somente tráfego do “Claude Code real”:
CLAUDE_CODE_COMPATIBLE_USER_AGENT = "claude-cli/2.1.258 (external, sdk-cli)"CLAUDE_CODE_COMPATIBLE_STAINLESS_PACKAGE_VERSION = "0.112.1"CLAUDE_CODE_COMPATIBLE_STAINLESS_RUNTIME_VERSION = "v26.3.0"anthropic-beta = "claude-code-20250219,interleaved-thinking-2025-05-14,effort-2025-11-24"por padrão- A opção “Enable redact-thinking beta” por conexão adiciona
redact-thinking-2026-02-12quando um upstream CC Compatible exige especificamente fluxos de raciocínio ocultado - A opção “Enable summarized thinking display” por conexão armazena
providerSpecificData.requestDefaults.summarizeThinkinge adicionadisplay: "summarized"às solicitações de raciocínio CC Compatible que ainda não definiram um modo de exibição CONTEXT_1M_BETA_HEADER = "context-1m-2025-08-07"(família Opus/Sonnet 4.x)- Caminho padrão:
/v1/messages?beta=true
Módulos relacionados no mesmo pacote:
claudeCodeConstraints.ts— regras de temperatura + controle de cacheclaudeCodeToolRemapper.ts— remapeamento de nomes de ferramentasclaudeCodeExtraRemap.ts— normalização adicional do payload
Furtividade do Antigravity
Seção intitulada “Furtividade do Antigravity”As solicitações do Antigravity preservam o texto do chamador byte por byte. O OmniRoute não insere caracteres de largura zero nos prompts nem renomeia/injeta ferramentas para imitar um cliente de IDE.
antigravityHeaderScrub.ts
Seção intitulada “antigravityHeaderScrub.ts”Remove os marcadores do SDK Stainless (x-stainless-lang, x-stainless-package-version, x-stainless-os, x-stainless-arch, x-stainless-runtime, x-stainless-runtime-version, x-stainless-timeout, x-stainless-retry-count, x-stainless-helper-method) antes do encaminhamento.
⚠️ Risco: ANTIGRAVITY_CREDITS=always (alto risco de banimento da conta)
Seção intitulada “⚠️ Risco: ANTIGRAVITY_CREDITS=always (alto risco de banimento da conta)”ANTIGRAVITY_CREDITS=always (consumido por open-sse/executors/antigravity.ts) encaminha todas as solicitações pelos créditos pagos de excedente do Antigravity AI, em vez de permitir que a cota do nível gratuito do Google limite o uso. Isso está documentado como um recurso, mas é o relato mais comum de violação dos Termos de Serviço que recebemos — várias contas Google Ultra foram banidas com 403 / "service disabled for ToS violation" / insufficient_quota após executarem por algumas horas com =always.
A aplicação das regras pelo upstream ocorre do lado do Google e não é algo que o OmniRoute possa impedir. O nome da variável de ambiente e a documentação existente fazem com que pareça uma opção segura de ativar; não é.
Por que isso aciona a detecção de abuso de forma mais agressiva do que o uso exclusivo do nível gratuito:
- Gastos automatizados contínuos em uma única conta do Google são sinalizados de forma diferente de usos do nível gratuito que atingem a cota e param.
- Os créditos de excedente não têm limite de taxa, portanto um cliente configurado incorretamente pode consumir várias centenas de dólares em minutos e parecer revenda de chave de API ou tráfego de bots.
- Vários usuários do OmniRoute consumindo créditos de excedente em paralelo a partir do mesmo IP externo intensificam o sinal.
Postura recomendada:
- Mantenha o padrão
ANTIGRAVITY_CREDITS=off, a menos que o operador aceite explicitamente o risco de créditos pagos e de medidas contra a conta.retryenvia primeiro a solicitação normal e injeta créditos no máximo uma vez após um erro 429 de cota elegível;alwaysinjeta créditos na primeira solicitação. - Distribua a carga entre os provedores por meio do Auto-Combo (
model: "auto"ou combokr/glm/etc) em vez de saturar uma única conta do Antigravity. - Defina limites de RPM por conexão na página de edição do provedor Antigravity (Dashboard → Providers → Antigravity → connection → rate limit). De 30 a 60 RPM é um limite superior justificável para uso contínuo.
- Use uma rede upstream estável e controlada pelo operador e evite compartilhar uma conta entre usuários ou cargas de trabalho não relacionados.
- Em caso de banimento: envie uma contestação por
support.google.com→ “Restore Workspace/Account access”, incluindo o corpo exato da respostaquota_exceeded/service disabledenviada pelo Google. A restauração não é garantida.
A referência de ambiente documenta as implicações de cada modo de créditos para a conta e os gastos.
Pontos de contato:
open-sse/executors/antigravity.ts— lêprocess.env.ANTIGRAVITY_CREDITSsrc/lib/oauth/providers/antigravity.ts— infraestrutura de credenciais- Relato original do incidente: Discussão #1183
Registro de impressões digitais da CLI — open-sse/config/cliFingerprints.ts
Seção intitulada “Registro de impressões digitais da CLI — open-sse/config/cliFingerprints.ts”Tabela por provedor que fixa a ordem exata dos cabeçalhos e dos campos do corpo JSON capturada dos rastreamentos do mitmproxy das CLIs oficiais. Atualmente registrados: codex, claude, além de perfis derivados em tempo de execução em providerHeaderProfiles.ts para antigravity e github.
interface CliFingerprint { headerOrder: string[]; // diferencia maiúsculas de minúsculas bodyFieldOrder: string[]; // chaves JSON de nível superior userAgent?: string | (() => string); extraHeaders?: Record<string, string>;}Ative ou desative por provedor via variáveis de ambiente (veja abaixo). Quando desativado, os cabeçalhos e as chaves do corpo aparecem na ordem fornecida pelo Node/JSON — facilitando a identificação por impressão digital.
Proxy MITM (Antigravity, Linux/macOS/Windows)
Seção intitulada “Proxy MITM (Antigravity, Linux/macOS/Windows)”Para CLIs cujos binários não podem ser redirecionados via OPENAI_BASE_URL, o OmniRoute executa um proxy local com terminação TLS. Os endpoints ficam em src/app/api/cli-tools/antigravity-mitm/.
| Método | Endpoint | Finalidade |
|---|---|---|
| GET | /api/cli-tools/antigravity-mitm |
Status — em execução, pid, dnsConfigured, certExists |
| POST | /api/cli-tools/antigravity-mitm |
Iniciar MITM (requer apiKey + sudoPassword) |
| DELETE | /api/cli-tools/antigravity-mitm |
Parar MITM |
| GET | /api/cli-tools/antigravity-mitm/alias |
Listar aliases de modelos |
| PUT | /api/cli-tools/antigravity-mitm/alias |
Salvar aliases de modelos para uma ferramenta |
Host de destino interceptado: daily-cloudcode-pa.googleapis.com (upstream do Antigravity).
Sequência de inicialização (src/mitm/manager.ts::startMitm)
Seção intitulada “Sequência de inicialização (src/mitm/manager.ts::startMitm)”- Gerar um certificado autoassinado via
selfsigned(RSA-2048, SHA-256, 1 ano) —cert/generate.ts - Instalar o certificado no repositório de confiança do sistema —
cert/install.ts - Adicionar a entrada de hosts
127.0.0.1 daily-cloudcode-pa.googleapis.com—dns/dnsConfig.ts - Iniciar
src/mitm/server.cjscomROUTER_API_KEY+MITM_LOCAL_PORT(padrão443) - Persistir o PID em
<DATA_DIR>/mitm/.mitm.pid
Detecção dinâmica do repositório de confiança no Linux — cert/install.ts
Seção intitulada “Detecção dinâmica do repositório de confiança no Linux — cert/install.ts”getLinuxCertConfig() percorre uma lista de prioridades e seleciona o primeiro diretório existente:
| Família da distribuição | Diretório | Comando de atualização |
|---|---|---|
| Debian / Ubuntu | /usr/local/share/ca-certificates |
update-ca-certificates |
| Arch / CachyOS / Manjaro | /etc/ca-certificates/trust-source/anchors |
update-ca-trust |
| Fedora / RHEL / CentOS | /etc/pki/ca-trust/source/anchors |
update-ca-trust |
| openSUSE | /etc/pki/trust/anchors |
update-ca-certificates |
Nome do arquivo do certificado: omniroute-mitm.crt. Correspondência da impressão digital via getCertFingerprint() (SHA-1 do DER).
Além disso, updateNssDatabases() instala o certificado em bancos de dados NSS por usuário quando certutil está disponível: ~/.pki/nssdb, ~/snap/chromium/.../nssdb, todos os perfis do Firefox (incluindo snap), sob o nome OmniRoute MITM Root CA.
macOS / Windows
Seção intitulada “macOS / Windows”- macOS:
security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain - Windows: PowerShell elevado →
certutil -addstore Root
Autenticação
Seção intitulada “Autenticação”Todos os endpoints MITM exigem autenticação de gerenciamento (requireCliToolsAuth). A senha do sudo é armazenada em cache no escopo do módulo (nunca em globalThis) e apagada em stopMitm().
Substituições de User-Agent — variáveis de ambiente (seção 12 do .env.example)
Seção intitulada “Substituições de User-Agent — variáveis de ambiente (seção 12 do .env.example)”| Variável | Padrão |
|---|---|
CLAUDE_USER_AGENT |
claude-cli/2.1.258 (external, cli) |
CODEX_USER_AGENT |
codex-cli/0.155.0 (Windows 10.0.26200; x64) |
GITHUB_USER_AGENT |
GitHubCopilotChat/0.54.0 |
ANTIGRAVITY_USER_AGENT |
antigravity/2.0.1 linux/arm64 google-api-nodejs-client/10.3.0 |
KIRO_USER_AGENT |
AWS-SDK-JS/3.0.0 kiro-ide/1.0.0 |
QODER_USER_AGENT |
Qoder-Cli |
CURSOR_USER_AGENT |
Cursor/3.4 |
Consumidas por open-sse/executors/base.ts::buildHeaders() por meio de uma busca dinâmica. Atualize-as quando os provedores lançarem novas versões da CLI — strings de UA desatualizadas começam a ser rejeitadas por pertencerem a clientes obsoletos.
Alternadores do modo de compatibilidade com CLI (.env.example seção 13)
Seção intitulada “Alternadores do modo de compatibilidade com CLI (.env.example seção 13)”| Variável | Efeito |
|---|---|
CLI_COMPAT_CODEX=1 |
Impressão digital do Codex |
CLI_COMPAT_CLAUDE=1 |
Impressão digital do claude-cli |
CLI_COMPAT_GITHUB=1 |
Impressão digital do GitHub Copilot Chat |
CLI_COMPAT_ANTIGRAVITY=1 |
Impressão digital do Antigravity |
CLI_COMPAT_KIRO=1 |
Kiro |
CLI_COMPAT_CURSOR=1 |
Cursor |
CLI_COMPAT_KIMI_CODING=1 |
Kimi Coding |
CLI_COMPAT_KILOCODE=1 |
KiloCode |
CLI_COMPAT_CLINE=1 |
Cline |
CLI_COMPAT_ALL=1 |
Habilita todos os itens acima |
O IP do provedor é sempre preservado — o alternador apenas reformata a representação da requisição na rede; ele não altera a saída de tráfego por IP.
Sanitização de cabeçalhos de entrada
Seção intitulada “Sanitização de cabeçalhos de entrada”O OmniRoute remove cabeçalhos do cliente de entrada antes do encaminhamento, para que uma requisição proveniente do Cursor não exponha User-Agent: Cursor/X.Y.Z para um upstream do Claude. Consulte src/shared/constants/upstreamHeaders.ts para ver a lista de bloqueio, mantida em sincronia com os esquemas Zod e os testes unitários.
Atualização de impressões digitais quando um provedor faz a rotação
Seção intitulada “Atualização de impressões digitais quando um provedor faz a rotação”- Capture o tráfego da CLI oficial com
mitmproxy(interceptação TLS + despejo) - Extraia JA3/JA4 e a ordem literal dos cabeçalhos
- Atualize a entrada relevante de
CLI_FINGERPRINTS[...] - Atualize o padrão correspondente de
*_USER_AGENTem.env.example - Se o próprio handshake TLS tiver mudado, atualize o wrapper do provedor relevante ou a opção
browser:do wreq-js - Execute os testes TLS específicos do provedor e um teste canário manual no provedor em produção
- Publique em uma versão de correção; documente em
CHANGELOG.md
open-sse/services/__tests__/claudeTlsClient.test.ts— comportamento do wrapper TLS compartilhadotests/unit/anthropic-cache-fingerprint.test.ts— determinismo da impressão digitaltests/unit/chatgpt-web-source-retirement.test.ts— a origem furtiva comum do ChatGPT Web permanece ausente, enquanto o Codex Web continua presente
Veja também
Seção intitulada “Veja também”- RESILIENCE_GUIDE.md — o que acontece quando um caminho furtivo recebe um
403 - TROUBLESHOOTING.md
- ENVIRONMENT.md — referência completa das variáveis de ambiente
- CLI-TOOLS.md — visão do operador sobre o fluxo de trabalho MITM
HagiCode
HagiCode é um ambiente de programação com agentes, fluxos estruturados, execução multiagente e visualizações Hero Dungeon.
Transforme ideias em software útil com um fluxo de trabalho com agentes mais inteligente, rápido e agradável.

- SmartFluxos estruturados transformam intenções em um caminho executável da ideia à entrega.
- EfficientFluxos multiagente mantêm pesquisa, implementação e revisão em andamento simultaneamente.
- FunO Hero Dungeon torna longas sessões de programação mais visuais e colaborativas.