Stealth Guide (日本語)
TLS フィンガープリンティングレイヤー
Section titled “TLS フィンガープリンティングレイヤー”open-sse/utils/tlsClient.ts — wreq-js(Chrome 124)
Section titled “open-sse/utils/tlsClient.ts — wreq-js(Chrome 124)”永続的な wreq-js セッションは、アカウントスコープと解決済みプロキシの組み合わせごとに遅延作成されます。プロセス全体で共有される TlsClient は、Cloudflare の背後にあるアップストリーム向けに macOS 上の Chrome 124 を偽装するセッションを最大 128 個プールします。ネイティブランタイムが利用できない場合、TlsClient.fetch() はフェイルクローズします。呼び出し元は、このラッパーの外部でフォールバックを明示的に選択できます。
- セッションプロファイル:
browser: "chrome_124", os: "macos" - プロキシ解決(優先順):
HTTPS_PROXY→HTTP_PROXY→ALL_PROXY(小文字も対象) - タイムアウト:
TLS_CLIENT_TIMEOUT_MS(FETCH_TIMEOUT_MSを継承、デフォルトは 600000) wreq-jsの Response は fetch と互換性があります(headers、text()、json()、clone()、body)。- 最初のバイトのウォッチドッグ(
open-sse/utils/tlsFirstByteWatchdog.ts、#12656):TlsClient.fetch()はアップストリームのヘッダーが到着するとすぐに解決されるため、TLS_CLIENT_TIMEOUT_MSだけでは最初のバイトを一切返さないボディを制限できません。guardTlsFirstByte()は、ボディの最初のread()とTLS_FIRST_BYTE_WATCHDOG_MS(デフォルトは10000、0で無効)の完了を競合させます。正常なボディには影響しませんが、停止したボディでは wreq リーダーをキャンセルし、proxyFetchの既存の TLS フォールバックロジックによって直接/プロキシディスパッチャーへフォールスルーできるようにします(ボディ付き POST など、再実行が安全ではないリクエストについては、サイレントに再試行せず、引き続き例外をスローします)。
Web Cookie プロバイダートランスポート — wreq-js 3.2.0
Section titled “Web Cookie プロバイダートランスポート — wreq-js 3.2.0”open-sse/services/tlsClientBase.ts は、以下に示す 5 つの専用 Web Cookie トランスポートで共有されるアダプターです。各プロバイダーの薄いラッパーが、ブラウザー/OS プロファイルを選択します。このアダプターは、open-sse/utils/tlsClient.ts 内の単一の wreq ランタイムローダーとトランスポートプールを使用し、プロファイル + OS + 解決済みプロキシをキーとします。一方、各リクエストでは cookieMode: "ephemeral" を使用します。そのため、アカウントとリクエストはトランスポートレベルの接続を共有しますが、wreq セッションや Cookie jar を共有することはありません。
| プロバイダー | プロファイル | エミュレートする OS | ストリーム EOF ポリシー |
|---|---|---|---|
| Claude | chrome_146 |
Linux | [DONE] を含める |
| Perplexity | firefox_148 |
macOS | event: end_of_stream を含める |
| Grok | chrome_146 |
Linux | [DONE] を除外 |
| Notion | chrome_146 |
Windows | [DONE] を含める |
| LMArena | chrome_146 |
Windows | センチネルなし。ネイティブ EOF で閉じる |
- ストリーミングでは、ネイティブレスポンスの
ReadableStreamを直接消費します。一時ファイルやサイドカーは作成されません。 - ストリームを公開する前に、先頭の最大 256 バイトが検査されます。SSE プロバイダーでは SSE ではないエラーをバッファリングします。Grok/LMArena は、Cloudflare チャレンジを
403に、HTML 中間ページを502にマッピングします。 - ネイティブリクエストのタイムアウトは、絶対時間に基づく JS のハードデッドラインで引き続きラップされます。ハングが発生すると、影響を受けたプロファイル/OS/プロキシのトランスポートのみが無効化およびクローズされ、次のリクエスト時に再作成されます。
- プロキシ解決の優先順は、呼び出しごとの
proxyUrl→ リクエストスコープのアカウント/ダッシュボードコンテキスト →HTTPS_PROXY/HTTP_PROXY/ALL_PROXY(小文字のバリアントを含む)です。解決エラー時には、直接接続が漏れることなくフェイルクローズします。LMArena は意図的にarena.aiを基準として解決します。 byteResponseは、UTF-8 破損なしで Content-Type が指定されたdata:URL を返します。- エラーは、
TlsClientUnavailableError(パッケージ/アドオンが利用不可)、TlsClientHangError(デッドライン超過)、および 128 個に制限されたプロファイル/OS/プロキシスロットがすべて使用中またはクローズ中の場合のWreqTransportCapacityError(共有セッション容量エラーコード)です。
上記の汎用 TlsClient セッションは、ブラウザーに保持される永続的な Cookie 状態に引き続き特化しています。両方の経路は、キャッシュされた単一の wreq モジュールローダーとプロセスライフサイクルフックを再利用します。ただし、Cookie の有効期間が意図的に異なるため、それぞれのプールは分離されています。
これらのプロファイルは固定されたパッケージでサポートされていますが、実際の WAF による受け入れ可否は、ローカルのコントラクトテストとは無関係に変化する可能性があります。アップストリームブラウザーとの同等性を主張する前に、明示的に使用許可を得た実アカウントに対してフィンガープリントの変更を検証してください。
Claude Code ステルスバンドル
Section titled “Claude Code ステルスバンドル”cliCompatMode が有効な場合、OmniRoute は送信する Claude リクエストを変形し、claude-cli のトラフィックと見分けがつかないようにします。以下の 3 つのモジュールが連携します。
claudeCodeFingerprint.ts
Section titled “claudeCodeFingerprint.ts”課金ヘッダーに埋め込まれる 3 文字の cc_version フィンガープリントを計算します。
SHA256(SALT + msg[4] + msg[7] + msg[20] + version)[:3]FINGERPRINT_SALT = "59cf53e54c78"(ハードコード済み。公式クライアントと一致)- 入力: 最初のユーザーメッセージ本文のインデックス 4、7、20 にある文字 + バージョン文字列
- 出力: 3 文字の 16 進数プレフィックス
claudeCodeCCH.ts(クライアントコンテンツハッシュ)
Section titled “claudeCodeCCH.ts(クライアントコンテンツハッシュ)”公式 Claude Code CLI が Bun/Zig を介して計算する、サーバー側の整合性チェックです。OmniRoute はこれを xxhash-wasm で再実装しています。
cch=00000;プレースホルダーを使用して本文をシリアライズxxhash64(bytes, seed) & 0xFFFFF- 5 文字になるようゼロ埋めした小文字の 16 進数
cch=00000;を計算済みトークンに置換
定数:
- シード:
0x6e52736ac806831e - パターン:
/\bcch=([0-9a-f]{5});/
claudeCodeObfuscation.ts
Section titled “claudeCodeObfuscation.ts”「機密性の高い」クライアント名の最初の文字の後に Unicode のゼロ幅接合子(U+200D)を挿入し、上流のフィルターが grep できないようにします。デフォルトの単語リスト:
opencode, open-code, cline, roo-cline, roo_cline, cursor, windsurf,aider, continue.dev, copilot, avante, codecompanion適用対象: system ブロック、すべての messages[].content、および tools[].description / tools[].function.description。オペレーターは setSensitiveWords() を使用して上書きできます。
claudeCodeCompatible.ts — anthropic-compatible-cc-* プロバイダー
Section titled “claudeCodeCompatible.ts — anthropic-compatible-cc-* プロバイダー”「本物の Claude Code」トラフィックのみを受け入れるサードパーティー製 Anthropic リレー向け:
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" - 接続ごとの「Enable redact-thinking beta」トグルは、CC Compatible の上流が編集済み思考ストリームを明示的に必要とする場合に、
redact-thinking-2026-02-12を追加します - 接続ごとの「Enable summarized thinking display」トグルは
providerSpecificData.requestDefaults.summarizeThinkingを保存し、表示モードがまだ設定されていない CC Compatible の思考リクエストにdisplay: "summarized"を追加します CONTEXT_1M_BETA_HEADER = "context-1m-2025-08-07"(Opus/Sonnet 4.x ファミリー)- デフォルトパス:
/v1/messages?beta=true
同じバンドル内の関連モジュール:
claudeCodeConstraints.ts— temperature + cache-control のルールclaudeCodeToolRemapper.ts— ツール名の再マッピングclaudeCodeExtraRemap.ts— 追加のペイロード正規化
Antigravity ステルス
Section titled “Antigravity ステルス”Antigravity リクエストは、呼び出し元のテキストをバイト単位でそのまま保持します。OmniRoute は、IDE クライアントを模倣する目的でプロンプトにゼロ幅文字を挿入したり、ツールの名前変更や注入を行ったりしません。
antigravityHeaderScrub.ts
Section titled “antigravityHeaderScrub.ts”転送前に Stainless SDK マーカー(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)を削除します。
⚠️ リスク: ANTIGRAVITY_CREDITS=always(アカウント停止が多発する要注意箇所)
Section titled “⚠️ リスク: ANTIGRAVITY_CREDITS=always(アカウント停止が多発する要注意箇所)”ANTIGRAVITY_CREDITS=always(open-sse/executors/antigravity.ts が使用)は、Google の無料枠クォータによる制限を受ける代わりに、すべてのリクエストを Antigravity AI Credit Overages(有料の Google クレジット)経由でルーティングします。これは機能として文書化されていますが、私たちが確認している中で最も一般的な ToS 違反報告の原因です。複数の Google Ultra アカウントが =always で数時間実行した後、403 / "service disabled for ToS violation" / insufficient_quota により停止されています。
上流での取り締まりは Google 側で行われるものであり、OmniRoute が防止できるものではありません。環境変数名と既存のドキュメントからは、安全に切り替えられる設定のように見えますが、実際にはそうではありません。
無料枠のみの使用よりも積極的に不正利用検出の対象となる理由:
- 単一の Google アカウントで自動化された継続的な支出が発生すると、無料枠を使い切って停止する場合とは異なる形でフラグが立ちます。
- クレジット超過にはレート上限がないため、設定ミスのあるクライアントが数分で数百 USD を消費し、API キーの転売やボットトラフィックのように見える可能性があります。
- 同じ外部 IP から複数の OmniRoute ユーザーが並行して超過クレジットを使用すると、そのシグナルがさらに強まります。
推奨される運用方針:
- オペレーターが有料クレジットとアカウント取り締まりのリスクを明示的に受け入れない限り、デフォルトの
ANTIGRAVITY_CREDITS=offを維持してください。retryは最初に通常のリクエストを送信し、対象となるクォータの 429 が返された場合に限り、最大 1 回クレジットを注入します。alwaysは最初のリクエストからクレジットを注入します。 - 単一の Antigravity アカウントに負荷を集中させるのではなく、Auto-Combo を介してプロバイダー間に負荷を分散してください(
model: "auto"またはkr/glm/etc-combo)。 - Antigravity プロバイダーの編集ページ(Dashboard → Providers → Antigravity → connection → rate limit)で、接続ごとの RPM 制限を設定してください。継続的な使用では 30~60 RPM が妥当な上限です。
- オペレーターが管理する安定した上流ネットワークを使用し、無関係なユーザーやワークロード間で 1 つのアカウントを共有しないでください。
- 停止された場合:
support.google.com→「Restore Workspace/Account access」から、Google が送信した正確なquota_exceeded/service disabledレスポンス本文を添えて異議申し立てを行ってください。復旧は保証されません。
環境変数リファレンスには、各クレジットモードがアカウントと支出に与える影響が記載されています。
関連箇所:
open-sse/executors/antigravity.ts—process.env.ANTIGRAVITY_CREDITSを読み込みsrc/lib/oauth/providers/antigravity.ts— 認証情報の受け渡し- 元のインシデント報告: Discussion #1183
CLI フィンガープリントレジストリ — open-sse/config/cliFingerprints.ts
Section titled “CLI フィンガープリントレジストリ — open-sse/config/cliFingerprints.ts”公式 CLI の mitmproxy トレースから取得した、厳密なヘッダー順序と JSON ボディフィールド順序を固定するプロバイダー別テーブルです。現在登録済み: codex、claude。さらに、antigravity と github については providerHeaderProfiles.ts にランタイムから導出されるプロファイルがあります。
interface CliFingerprint { headerOrder: string[]; // 大文字と小文字を区別 bodyFieldOrder: string[]; // トップレベルの JSON キー userAgent?: string | (() => string); extraHeaders?: Record<string, string>;}環境変数を使用してプロバイダーごとに切り替えます(下記参照)。無効にすると、ヘッダーとボディキーは Node/JSON が生成した順序のままになるため、簡単にフィンガープリントされます。
MITM プロキシ(Antigravity、Linux/macOS/Windows)
Section titled “MITM プロキシ(Antigravity、Linux/macOS/Windows)”バイナリを OPENAI_BASE_URL でリダイレクトできない CLI のために、OmniRoute はローカルで TLS を終端するプロキシを実行します。エンドポイントは src/app/api/cli-tools/antigravity-mitm/ 配下にあります。
| メソッド | エンドポイント | 用途 |
|---|---|---|
| GET | /api/cli-tools/antigravity-mitm |
ステータス — running、pid、dnsConfigured、certExists |
| POST | /api/cli-tools/antigravity-mitm |
MITM を開始(apiKey + sudoPassword が必要) |
| DELETE | /api/cli-tools/antigravity-mitm |
MITM を停止 |
| GET | /api/cli-tools/antigravity-mitm/alias |
モデルエイリアスを一覧表示 |
| PUT | /api/cli-tools/antigravity-mitm/alias |
ツールのモデルエイリアスを保存 |
インターセプト対象ホスト: daily-cloudcode-pa.googleapis.com(Antigravity のアップストリーム)。
開始シーケンス(src/mitm/manager.ts::startMitm)
Section titled “開始シーケンス(src/mitm/manager.ts::startMitm)”selfsignedを使用して自己署名証明書を生成(RSA-2048、SHA-256、1年)—cert/generate.ts- 証明書をシステムの信頼ストアにインストール —
cert/install.ts - hosts エントリ
127.0.0.1 daily-cloudcode-pa.googleapis.comを追加 —dns/dnsConfig.ts ROUTER_API_KEY+MITM_LOCAL_PORT(デフォルトは443)を指定してsrc/mitm/server.cjsを起動- PID を
<DATA_DIR>/mitm/.mitm.pidに永続化
Linux の動的な信頼ストア検出 — cert/install.ts
Section titled “Linux の動的な信頼ストア検出 — cert/install.ts”getLinuxCertConfig() は優先順位リストを走査し、最初に存在するディレクトリを選択します。
| ディストリビューションファミリー | ディレクトリ | 更新コマンド |
|---|---|---|
| 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 |
証明書ファイル名: omniroute-mitm.crt。getCertFingerprint() を使用してフィンガープリントを照合します(DER の SHA-1)。
さらに、certutil が利用可能な場合、updateNssDatabases() はユーザーごとの NSS DB に証明書をインストールします: ~/.pki/nssdb、~/snap/chromium/.../nssdb、すべての Firefox プロファイル(snap を含む)。ニックネームは OmniRoute MITM Root CA です。
macOS / Windows
Section titled “macOS / Windows”- macOS:
security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain - Windows: 管理者権限の PowerShell →
certutil -addstore Root
すべての MITM エンドポイントには管理認証(requireCliToolsAuth)が必要です。sudo パスワードはモジュールスコープ内にキャッシュされ(globalThis には決して保存されません)、stopMitm() の実行時に消去されます。
User-Agent のオーバーライド — 環境変数(.env.example セクション 12)
Section titled “User-Agent のオーバーライド — 環境変数(.env.example セクション 12)”| 変数 | デフォルト値 |
|---|---|
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 |
open-sse/executors/base.ts::buildHeaders() によって動的ルックアップを介して使用されます。プロバイダーが新しい CLI バージョンをリリースした際は、これらを更新してください — 古い UA 文字列は、旧式のクライアントとして拒否されるようになります。
CLI 互換モードの切り替え(.env.example セクション 13)
Section titled “CLI 互換モードの切り替え(.env.example セクション 13)”| 変数 | 効果 |
|---|---|
CLI_COMPAT_CODEX=1 |
Codex フィンガープリント |
CLI_COMPAT_CLAUDE=1 |
claude-cli フィンガープリント |
CLI_COMPAT_GITHUB=1 |
GitHub Copilot Chat フィンガープリント |
CLI_COMPAT_ANTIGRAVITY=1 |
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 |
上記すべてを有効化 |
プロバイダー IP は常に維持されます — この切り替えはリクエストのワイヤーイメージを整形するだけであり、送信元 IP を切り替えるものではありません。
受信ヘッダーのサニタイズ
Section titled “受信ヘッダーのサニタイズ”OmniRoute は転送前に受信クライアントヘッダーを除去するため、Cursor から到着したリクエストの User-Agent: Cursor/X.Y.Z が Claude のアップストリームに漏れることはありません。拒否リストについては src/shared/constants/upstreamHeaders.ts を参照してください。このリストは Zod スキーマおよびユニットテストと常に同期されています。
プロバイダーの変更時にフィンガープリントを更新する方法
Section titled “プロバイダーの変更時にフィンガープリントを更新する方法”mitmproxyを使用して公式 CLI のトラフィックをキャプチャする(TLS インターセプト + ダンプ)- JA3/JA4 と実際のヘッダー順序を抽出する
- 該当する
CLI_FINGERPRINTS[...]エントリを更新する .env.example内の対応する*_USER_AGENTのデフォルトを更新する- TLS ハンドシェイク自体が変更された場合は、該当するプロバイダーラッパーまたは wreq-js の
browser:オプションを更新する - プロバイダー固有の TLS テストを実行し、稼働中のプロバイダーに対して手動カナリアテストを行う
- パッチリリースとして公開し、
CHANGELOG.mdに記録する
open-sse/services/__tests__/claudeTlsClient.test.ts— 共有 TLS ラッパーの動作tests/unit/anthropic-cache-fingerprint.test.ts— フィンガープリントの決定性tests/unit/chatgpt-web-source-retirement.test.ts— 共通の ChatGPT Web ステルスソースが引き続き存在せず、Codex Web は引き続き存在すること
- RESILIENCE_GUIDE.md — ステルスパスで
403が返された場合の動作 - TROUBLESHOOTING.md
- ENVIRONMENT.md — 環境変数の完全なリファレンス
- CLI-TOOLS.md — MITM ワークフローのオペレーター向け概要
HagiCode
HagiCode は構造化ワークフロー、マルチエージェント実行、Hero Dungeon ビューを備えたエージェント型コーディングワークスペースです。
よりスマートで速く、楽しいエージェント型ワークフローで、使いやすいソフトウェアを形にします。

- Smart構造化ワークフローは意図をアイデアから変更のリリースまで実行可能な道筋にします。
- Efficientマルチエージェントのワークフローで調査、実装、レビューを並行して進めます。
- FunHero Dungeon により長時間のコーディングを視覚的で協力的な体験にします。