Pular para o conteúdo
OmniRoute source

Stealth Guide (Português (Brasil))

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 de FETCH_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, portanto TLS_CLIENT_TIMEOUT_MS, por si só, não consegue limitar um corpo que nunca produz um primeiro byte. guardTlsFirstByte() faz uma corrida entre o primeiro read() do corpo e TLS_FIRST_BYTE_WATCHDOG_MS (padrão 10000; 0 o 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 de proxyFetch prossiga 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 ReadableStream da 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 403 e páginas HTML intermediárias para 502.
  • 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 é proxyUrl por 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 a arena.ai.
  • byteResponse retorna uma URL data: tipada por conteúdo, sem corrupção de UTF-8.
  • Os erros são TlsClientUnavailableError (pacote/addon indisponível), TlsClientHangError (prazo excedido) e WreqTransportCapacityError (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.


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:

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

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:

  1. Serializar o corpo com o marcador de posição cch=00000;
  2. xxhash64(bytes, seed) & 0xFFFFF
  3. Valor hexadecimal em letras minúsculas, com 5 caracteres e preenchimento com zeros
  4. Substituir cch=00000; pelo token calculado

Constantes:

  • Semente: 0x6e52736ac806831e
  • Padrão: /\bcch=([0-9a-f]{5});/

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, codecompanion

Aplicado 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-12 quando um upstream CC Compatible exige especificamente fluxos de raciocínio ocultado
  • A opção “Enable summarized thinking display” por conexão armazena providerSpecificData.requestDefaults.summarizeThinking e adiciona display: "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 cache
  • claudeCodeToolRemapper.ts — remapeamento de nomes de ferramentas
  • claudeCodeExtraRemap.ts — normalização adicional do payload

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.

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:

  1. 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. retry envia primeiro a solicitação normal e injeta créditos no máximo uma vez após um erro 429 de cota elegível; always injeta créditos na primeira solicitação.
  2. Distribua a carga entre os provedores por meio do Auto-Combo (model: "auto" ou combo kr/glm/etc) em vez de saturar uma única conta do Antigravity.
  3. 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.
  4. 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.
  5. Em caso de banimento: envie uma contestação por support.google.com → “Restore Workspace/Account access”, incluindo o corpo exato da resposta quota_exceeded / service disabled enviada 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_CREDITS
  • src/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.


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)”
  1. Gerar um certificado autoassinado via selfsigned (RSA-2048, SHA-256, 1 ano) — cert/generate.ts
  2. Instalar o certificado no repositório de confiança do sistema — cert/install.ts
  3. Adicionar a entrada de hosts 127.0.0.1 daily-cloudcode-pa.googleapis.com — dns/dnsConfig.ts
  4. Iniciar src/mitm/server.cjs com ROUTER_API_KEY + MITM_LOCAL_PORT (padrão 443)
  5. 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: security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain
  • Windows: PowerShell elevado → certutil -addstore Root

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.


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”
  1. Capture o tráfego da CLI oficial com mitmproxy (interceptação TLS + despejo)
  2. Extraia JA3/JA4 e a ordem literal dos cabeçalhos
  3. Atualize a entrada relevante de CLI_FINGERPRINTS[...]
  4. Atualize o padrão correspondente de *_USER_AGENT em .env.example
  5. Se o próprio handshake TLS tiver mudado, atualize o wrapper do provedor relevante ou a opção browser: do wreq-js
  6. Execute os testes TLS específicos do provedor e um teste canário manual no provedor em produção
  7. Publique em uma versão de correção; documente em CHANGELOG.md

  • open-sse/services/__tests__/claudeTlsClient.test.ts — comportamento do wrapper TLS compartilhado
  • tests/unit/anthropic-cache-fingerprint.test.ts — determinismo da impressão digital
  • tests/unit/chatgpt-web-source-retirement.test.ts — a origem furtiva comum do ChatGPT Web permanece ausente, enquanto o Codex Web continua presente


Código-fonte do OmniRoute (a58000c7685f)

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.

Interface principal do HagiCode no tema claro
  • 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.
Acessar HagiCode