Merge branch 'diegosouzapw:release/v3.8.51' into release/v3.8.51

This commit is contained in:
BillyOutlast
2026-09-03 13:58:14 -04:00
committed by GitHub
19 changed files with 57 additions and 48 deletions

View File

@@ -1290,7 +1290,7 @@ GITHUB_OAUTH_CLIENT_ID=Iv1.b507a08c87ecfe98
# Used by: open-sse/executors/base.ts — buildHeaders() dynamic lookup. # Used by: open-sse/executors/base.ts — buildHeaders() dynamic lookup.
# Update these when providers release new CLI versions to avoid blocks. # Update these when providers release new CLI versions to avoid blocks.
CLAUDE_USER_AGENT="claude-cli/2.1.219 (external, cli)" CLAUDE_USER_AGENT="claude-cli/2.1.258 (external, cli)"
# Disable the deterministic tool-name cloak applied on both Anthropic-bound paths # Disable the deterministic tool-name cloak applied on both Anthropic-bound paths
# (executors/base.ts native OAuth + executors/cliproxyapi.ts CLIProxyAPI) — # (executors/base.ts native OAuth + executors/cliproxyapi.ts CLIProxyAPI) —

View File

@@ -0,0 +1 @@
- **chore(providers):** bump the Claude Code wire identity and the Devin bridge image pin from `2.1.220` to `2.1.258` ([#12402](https://github.com/diegosouzapw/OmniRoute/pull/12402)) — thanks @ggiak

View File

@@ -439,7 +439,7 @@
"src/app/(dashboard)/dashboard/runtime/RuntimePageClient.tsx": 1201, "src/app/(dashboard)/dashboard/runtime/RuntimePageClient.tsx": 1201,
"src/app/(dashboard)/dashboard/settings/components/ProxyRegistryManager.tsx": 1475, "src/app/(dashboard)/dashboard/settings/components/ProxyRegistryManager.tsx": 1475,
"src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx": 1271, "src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx": 1271,
"src/app/(dashboard)/dashboard/settings/components/RoutingTab.tsx": 1606, "src/app/(dashboard)/dashboard/settings/components/RoutingTab.tsx": 1607,
"src/app/(dashboard)/dashboard/settings/components/SystemStorageTab.tsx": 1597, "src/app/(dashboard)/dashboard/settings/components/SystemStorageTab.tsx": 1597,
"src/app/(dashboard)/dashboard/usage/components/EvalsTab.tsx": 2152, "src/app/(dashboard)/dashboard/usage/components/EvalsTab.tsx": 2152,
"src/app/api/providers/[id]/models/route.ts": 2432, "src/app/api/providers/[id]/models/route.ts": 2432,
@@ -635,5 +635,6 @@
"_relax_velocity_2026_08_30": "127 frozen line caps and cap/testCap raised by 20% (velocity phase; see quality-baseline.json _policy).", "_relax_velocity_2026_08_30": "127 frozen line caps and cap/testCap raised by 20% (velocity phase; see quality-baseline.json _policy).",
"_rebaseline_2026_09_02_12325_merge_v3851": "Merge of release/v3.8.51 into #12325. Both sides grew chatCore.ts at the same chokepoint: #12239 took it 5946->5976 upstream, and this PR adds its +9 non-Codex 429 branch on top. check-file-size.mjs counts split(\"\\\\n\").length (trailing-newline empty element), so the merged file is 5981. The cap is the merged LOC, not either side alone; no other entry moves.", "_rebaseline_2026_09_02_12325_merge_v3851": "Merge of release/v3.8.51 into #12325. Both sides grew chatCore.ts at the same chokepoint: #12239 took it 5946->5976 upstream, and this PR adds its +9 non-Codex 429 branch on top. check-file-size.mjs counts split(\"\\\\n\").length (trailing-newline empty element), so the merged file is 5981. The cap is the merged LOC, not either side alone; no other entry moves.",
"_rebaseline_2026_09_03_houminxi_batch_stacked": "Crescimento medido DEPOIS que os 9 PRs da leva HouMinXi entraram, quando cada um empilhou sobre o rebaseline do anterior: providers/page.tsx 2007->2025 (+18 = feedback de erro por linha do import CSV do #12504 somado a busca por nome/baseUrl do #12495, ambos no mesmo painel de conexoes); chatCore.ts 5981->5984 (+3 = o #12325 invalida o cache generico de quota no 429 upstream, ao lado do ramo Codex ja existente); accountFallback.ts 2461->2467 (+6 = o #12566 empilha a carve-out de familia Antigravity sobre o rebaseline 2422->2461 que o #12590 registrou para o carve-out credits_exhausted da Moonshot; os dois tocam checkFallbackError). Cada PR mediu certo isoladamente, mas nenhum enxergava o empilhamento. Fiacao em chokepoints existentes. NAO cobre codex.ts nem stream.ts, que ja violavam no tip antes desta leva (drift da base).", "_rebaseline_2026_09_03_houminxi_batch_stacked": "Crescimento medido DEPOIS que os 9 PRs da leva HouMinXi entraram, quando cada um empilhou sobre o rebaseline do anterior: providers/page.tsx 2007->2025 (+18 = feedback de erro por linha do import CSV do #12504 somado a busca por nome/baseUrl do #12495, ambos no mesmo painel de conexoes); chatCore.ts 5981->5984 (+3 = o #12325 invalida o cache generico de quota no 429 upstream, ao lado do ramo Codex ja existente); accountFallback.ts 2461->2467 (+6 = o #12566 empilha a carve-out de familia Antigravity sobre o rebaseline 2422->2461 que o #12590 registrou para o carve-out credits_exhausted da Moonshot; os dois tocam checkFallbackError). Cada PR mediu certo isoladamente, mas nenhum enxergava o empilhamento. Fiacao em chokepoints existentes. NAO cobre codex.ts nem stream.ts, que ja violavam no tip antes desta leva (drift da base).",
"_rebaseline_2026_09_03_12604_claude_code_2_1_258": "PR #12604 (bump da wire identity do Claude Code 2.1.220->2.1.258, commits do @ggiak vindos do #12402) crescimento proprio: src/app/(dashboard)/dashboard/settings/components/RoutingTab.tsx 1606->1607 (+1, a linha do seletor que acompanha a nova versao de identidade). Uma linha num painel de settings ja existente; nao ha o que extrair. Coberto por client-identity-profiles e claude-codex-identity-version-sync (138/138 focados).",
"_rebaseline_2026_09_03_hartmark_batch": "Leva hartmark (#12293 #12355 #12447 #12445 #12446 #12460 #12461 #12338 #12448) crescimento proprio, medido no tip com os nove mergeados: src/app/(dashboard)/dashboard/combos/page.tsx 5012->5018 (+6, #12355 impede que a falha de bundling do tiktoken de um provider sem relacao derrube /api/providers, e o painel passa a lidar com o estado degradado); open-sse/services/combo.ts 4023->4036 (+13, #12338 nos fixes do universal-handoff: nota de bare-fallback, escopo por mesma requisicao e log da falha silenciosa). Fiacao em chokepoints existentes do roteamento de combo. NAO cobre codex.ts nem stream.ts, ja violando no tip antes desta leva (drift da base)." "_rebaseline_2026_09_03_hartmark_batch": "Leva hartmark (#12293 #12355 #12447 #12445 #12446 #12460 #12461 #12338 #12448) crescimento proprio, medido no tip com os nove mergeados: src/app/(dashboard)/dashboard/combos/page.tsx 5012->5018 (+6, #12355 impede que a falha de bundling do tiktoken de um provider sem relacao derrube /api/providers, e o painel passa a lidar com o estado degradado); open-sse/services/combo.ts 4023->4036 (+13, #12338 nos fixes do universal-handoff: nota de bare-fallback, escopo por mesma requisicao e log da falha silenciosa). Fiacao em chokepoints existentes do roteamento de combo. NAO cobre codex.ts nem stream.ts, ja violando no tip antes desta leva (drift da base)."
} }

View File

@@ -1,6 +1,6 @@
FROM node:26.0.0-bookworm-slim FROM node:26.0.0-bookworm-slim
ARG CLAUDE_CODE_VERSION=2.1.220 ARG CLAUDE_CODE_VERSION=2.1.258
ARG DEVIN_CLI_VERSION=3000.2.17 ARG DEVIN_CLI_VERSION=3000.2.17
ARG TARGETARCH ARG TARGETARCH

View File

@@ -28,7 +28,7 @@ x-runtime: &runtime
context: ../.. context: ../..
dockerfile: docker/devin-bridge/Dockerfile dockerfile: docker/devin-bridge/Dockerfile
args: args:
CLAUDE_CODE_VERSION: 2.1.220 CLAUDE_CODE_VERSION: 2.1.258
DEVIN_CLI_VERSION: 3000.2.17 DEVIN_CLI_VERSION: 3000.2.17
user: "10001:10001" user: "10001:10001"
read_only: true read_only: true

View File

@@ -4,16 +4,22 @@
Messages endpoint while the official Devin CLI supplies model responses over ACP stdio. It Messages endpoint while the official Devin CLI supplies model responses over ACP stdio. It
does not modify the existing Anthropic, Claude OAuth, Claude Web, or `devin-cli` providers. does not modify the existing Anthropic, Claude OAuth, Claude Web, or `devin-cli` providers.
> **Current status: offline and live validated.** The pinned Claude Code `2.1.220` completed > **Current status: pinned Claude Code `2.1.258`; offline and live validation last recorded
> three isolated scenarios through Devin CLI `3000.2.17` and model > on `2.1.220`.** The `2.1.220` pin completed three isolated scenarios through Devin CLI
> `swe-1-7-lightning`. The final live run proved client-owned `Read`, `Edit`, and `Bash` > `3000.2.17` and model `swe-1-7-lightning`; that final live run proved client-owned `Read`,
> turns, successful `npm test` results, project command and skill discovery, Devin-only > `Edit`, and `Bash` turns, successful `npm test` results, project command and skill
> routing, and zero Claude egress. > discovery, Devin-only routing, and zero Claude egress. The pin was then raised to `2.1.258`
> (the CLI generation OmniRoute's Claude identity impersonates, and the first line that ships
> the Fable 5.1 tier natively). On the new pin the install layer and `claude --version` were
> verified on the pinned base image, and the bridge unit suite, `compose config` and the
> static isolation proof pass — but the offline mock scenario and the live three-scenario
> suite have not been re-run yet. Re-run them (see "Updating pinned tools") before relying on
> the bridge with this pin.
## Architecture ## Architecture
```text ```text
Claude Code 2.1.220 (isolated non-root Linux container) Claude Code 2.1.258 (isolated non-root Linux container)
-> http://omniroute:20128/v1/messages -> http://omniroute:20128/v1/messages
-> devin-cli-agentic (Claude-format, no-auth provider) -> devin-cli-agentic (Claude-format, no-auth provider)
-> devin acp --agent-type summarizer (official ACP stdio, no Devin tools) -> devin acp --agent-type summarizer (official ACP stdio, no Devin tools)

View File

@@ -130,7 +130,7 @@ request (see `open-sse/services/claudeCodeCompatible.ts`):
| Header | Value | | Header | Value |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------- | | ------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| `Authorization` | `Bearer <api-key>` | | `Authorization` | `Bearer <api-key>` |
| `User-Agent` | `claude-cli/2.1.219 (external, sdk-cli)` | | `User-Agent` | `claude-cli/2.1.258 (external, sdk-cli)` |
| `anthropic-version` | `2023-06-01` | | `anthropic-version` | `2023-06-01` |
| `anthropic-beta` | `claude-code-20250219,interleaved-thinking-2025-05-14,effort-2025-11-24` | | `anthropic-beta` | `claude-code-20250219,interleaved-thinking-2025-05-14,effort-2025-11-24` |
| Per-connection redact-thinking beta toggle | Adds `redact-thinking-2026-02-12` for upstreams that specifically require redacted thinking streams | | Per-connection redact-thinking beta toggle | Adds `redact-thinking-2026-02-12` for upstreams that specifically require redacted thinking streams |

View File

@@ -622,7 +622,7 @@ process.env[`${PROVIDER_ID}_USER_AGENT`]
| Variable | Default Value | When to Update | | Variable | Default Value | When to Update |
| -------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | -------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `CLAUDE_USER_AGENT` | `claude-cli/2.1.219 (external, cli)` | When Anthropic releases a new CLI version | | `CLAUDE_USER_AGENT` | `claude-cli/2.1.258 (external, cli)` | When Anthropic releases a new CLI version |
| `CLAUDE_DISABLE_TOOL_NAME_CLOAK` | `false` | `executors/base.ts` + `executors/cliproxyapi.ts` | Set to `1`/`true` to forward third-party harness tool names verbatim to Anthropic on both Anthropic-bound paths (native OAuth and CLIProxyAPI). By default the executor deterministically aliases non-Claude-Code tool names (Claude Code canonical mapping where one exists, otherwise PascalCase) and reverses them on the response via `_toolNameMap`, so harnesses with snake_case tools are not refused as fingerprinted third-party clients. Debugging only. | | `CLAUDE_DISABLE_TOOL_NAME_CLOAK` | `false` | `executors/base.ts` + `executors/cliproxyapi.ts` | Set to `1`/`true` to forward third-party harness tool names verbatim to Anthropic on both Anthropic-bound paths (native OAuth and CLIProxyAPI). By default the executor deterministically aliases non-Claude-Code tool names (Claude Code canonical mapping where one exists, otherwise PascalCase) and reverses them on the response via `_toolNameMap`, so harnesses with snake_case tools are not refused as fingerprinted third-party clients. Debugging only. |
| `CODEX_USER_AGENT` | `codex-cli/0.142.0 (Windows 10.0.26200; x64)` | When OpenAI updates the Codex CLI | | `CODEX_USER_AGENT` | `codex-cli/0.142.0 (Windows 10.0.26200; x64)` | When OpenAI updates the Codex CLI |
| `CODEX_CLIENT_VERSION` | `0.131.0` | Override Codex client version independently of full UA string | | `CODEX_CLIENT_VERSION` | `0.131.0` | Override Codex client version independently of full UA string |

View File

@@ -117,8 +117,8 @@ Applied to: `system` blocks, all `messages[].content`, and `tools[].description`
For third-party Anthropic relays that only accept "real Claude Code" traffic: For third-party Anthropic relays that only accept "real Claude Code" traffic:
- `CLAUDE_CODE_COMPATIBLE_USER_AGENT = "claude-cli/2.1.220 (external, sdk-cli)"` - `CLAUDE_CODE_COMPATIBLE_USER_AGENT = "claude-cli/2.1.258 (external, sdk-cli)"`
- `CLAUDE_CODE_COMPATIBLE_STAINLESS_PACKAGE_VERSION = "0.94.0"` - `CLAUDE_CODE_COMPATIBLE_STAINLESS_PACKAGE_VERSION = "0.112.1"`
- `CLAUDE_CODE_COMPATIBLE_STAINLESS_RUNTIME_VERSION = "v26.3.0"` - `CLAUDE_CODE_COMPATIBLE_STAINLESS_RUNTIME_VERSION = "v26.3.0"`
- `anthropic-beta = "claude-code-20250219,interleaved-thinking-2025-05-14,effort-2025-11-24"` by default - `anthropic-beta = "claude-code-20250219,interleaved-thinking-2025-05-14,effort-2025-11-24"` by default
- The per-connection "Enable redact-thinking beta" toggle adds `redact-thinking-2026-02-12` when a CC Compatible upstream specifically requires redacted thinking streams - The per-connection "Enable redact-thinking beta" toggle adds `redact-thinking-2026-02-12` when a CC Compatible upstream specifically requires redacted thinking streams
@@ -241,7 +241,7 @@ All MITM endpoints require management auth (`requireCliToolsAuth`). The sudo pas
| Variable | Default | | Variable | Default |
| ------------------------ | --------------------------------------------------------------- | | ------------------------ | --------------------------------------------------------------- |
| `CLAUDE_USER_AGENT` | `claude-cli/2.1.220 (external, cli)` | | `CLAUDE_USER_AGENT` | `claude-cli/2.1.258 (external, cli)` |
| `CODEX_USER_AGENT` | `codex-cli/0.149.0 (Windows 10.0.26200; x64)` | | `CODEX_USER_AGENT` | `codex-cli/0.149.0 (Windows 10.0.26200; x64)` |
| `GITHUB_USER_AGENT` | `GitHubCopilotChat/0.54.0` | | `GITHUB_USER_AGENT` | `GitHubCopilotChat/0.54.0` |
| `ANTIGRAVITY_USER_AGENT` | `antigravity/2.0.1 linux/arm64 google-api-nodejs-client/10.3.0` | | `ANTIGRAVITY_USER_AGENT` | `antigravity/2.0.1 linux/arm64 google-api-nodejs-client/10.3.0` |

View File

@@ -11,6 +11,7 @@ import {
normalizeCliCompatProviderId, normalizeCliCompatProviderId,
} from "@/shared/constants/cliCompatProviders"; } from "@/shared/constants/cliCompatProviders";
import { AI_PROVIDERS } from "@/shared/constants/providers"; import { AI_PROVIDERS } from "@/shared/constants/providers";
import { CLAUDE_CODE_CLIENT_BUILD_REVISION } from "@/shared/constants/claudeCodeClient";
import { compareTr } from "@/shared/utils/turkishText"; import { compareTr } from "@/shared/utils/turkishText";
import { HERMES } from "./systemTransformsHermesDefaults"; import { HERMES } from "./systemTransformsHermesDefaults";
@@ -169,7 +170,7 @@ const DEFAULT_SYSTEM_TRANSFORMS_CLIENT = {
entrypoint: "sdk-cli", entrypoint: "sdk-cli",
versionFormat: "ex-machina", versionFormat: "ex-machina",
cchAlgo: "sha256-first-user", cchAlgo: "sha256-first-user",
buildRevision: "1f2", buildRevision: CLAUDE_CODE_CLIENT_BUILD_REVISION,
}, },
], ],
}, },

View File

@@ -4,10 +4,10 @@
* Keep this leaf dependency-free so server executors, compatibility bridges, * Keep this leaf dependency-free so server executors, compatibility bridges,
* and client-facing identity presets can share one source of truth. * and client-facing identity presets can share one source of truth.
*/ */
export const CLAUDE_CODE_CLIENT_VERSION = "2.1.220"; export const CLAUDE_CODE_CLIENT_VERSION = "2.1.258";
export const CLAUDE_CODE_CLIENT_BUILD_REVISION = "1f2"; export const CLAUDE_CODE_CLIENT_BUILD_REVISION = "1e2";
export const CLAUDE_CODE_CLIENT_BILLING_VERSION = `${CLAUDE_CODE_CLIENT_VERSION}.${CLAUDE_CODE_CLIENT_BUILD_REVISION}`; export const CLAUDE_CODE_CLIENT_BILLING_VERSION = `${CLAUDE_CODE_CLIENT_VERSION}.${CLAUDE_CODE_CLIENT_BUILD_REVISION}`;
export const CLAUDE_CODE_SDK_PACKAGE_VERSION = "0.94.0"; export const CLAUDE_CODE_SDK_PACKAGE_VERSION = "0.112.1";
export const CLAUDE_CODE_RUNTIME_VERSION = "v26.3.0"; export const CLAUDE_CODE_RUNTIME_VERSION = "v26.3.0";
export type ClaudeCodeEntrypoint = "cli" | "sdk-cli"; export type ClaudeCodeEntrypoint = "cli" | "sdk-cli";

View File

@@ -28,11 +28,11 @@
"apiKey": { "apiKey": {
"Accept": "text/event-stream", "Accept": "text/event-stream",
"Content-Type": "application/json", "Content-Type": "application/json",
"User-Agent": "claude-cli/2.1.220 (external, sdk-cli)", "User-Agent": "claude-cli/2.1.258 (external, sdk-cli)",
"X-Stainless-Arch": "<ARCH>", "X-Stainless-Arch": "<ARCH>",
"X-Stainless-Lang": "js", "X-Stainless-Lang": "js",
"X-Stainless-OS": "MacOS", "X-Stainless-OS": "MacOS",
"X-Stainless-Package-Version": "0.94.0", "X-Stainless-Package-Version": "0.112.1",
"X-Stainless-Retry-Count": "0", "X-Stainless-Retry-Count": "0",
"X-Stainless-Runtime": "node", "X-Stainless-Runtime": "node",
"X-Stainless-Runtime-Version": "v26.3.0", "X-Stainless-Runtime-Version": "v26.3.0",
@@ -47,11 +47,11 @@
"nonStream": { "nonStream": {
"Accept": "application/json", "Accept": "application/json",
"Content-Type": "application/json", "Content-Type": "application/json",
"User-Agent": "claude-cli/2.1.220 (external, sdk-cli)", "User-Agent": "claude-cli/2.1.258 (external, sdk-cli)",
"X-Stainless-Arch": "<ARCH>", "X-Stainless-Arch": "<ARCH>",
"X-Stainless-Lang": "js", "X-Stainless-Lang": "js",
"X-Stainless-OS": "MacOS", "X-Stainless-OS": "MacOS",
"X-Stainless-Package-Version": "0.94.0", "X-Stainless-Package-Version": "0.112.1",
"X-Stainless-Retry-Count": "0", "X-Stainless-Retry-Count": "0",
"X-Stainless-Runtime": "node", "X-Stainless-Runtime": "node",
"X-Stainless-Runtime-Version": "v26.3.0", "X-Stainless-Runtime-Version": "v26.3.0",
@@ -66,11 +66,11 @@
"oauth": { "oauth": {
"Accept": "text/event-stream", "Accept": "text/event-stream",
"Content-Type": "application/json", "Content-Type": "application/json",
"User-Agent": "claude-cli/2.1.220 (external, sdk-cli)", "User-Agent": "claude-cli/2.1.258 (external, sdk-cli)",
"X-Stainless-Arch": "<ARCH>", "X-Stainless-Arch": "<ARCH>",
"X-Stainless-Lang": "js", "X-Stainless-Lang": "js",
"X-Stainless-OS": "MacOS", "X-Stainless-OS": "MacOS",
"X-Stainless-Package-Version": "0.94.0", "X-Stainless-Package-Version": "0.112.1",
"X-Stainless-Retry-Count": "0", "X-Stainless-Retry-Count": "0",
"X-Stainless-Runtime": "node", "X-Stainless-Runtime": "node",
"X-Stainless-Runtime-Version": "v26.3.0", "X-Stainless-Runtime-Version": "v26.3.0",
@@ -989,13 +989,13 @@
"Anthropic-Dangerous-Direct-Browser-Access": "true", "Anthropic-Dangerous-Direct-Browser-Access": "true",
"Anthropic-Version": "2023-06-01", "Anthropic-Version": "2023-06-01",
"Content-Type": "application/json", "Content-Type": "application/json",
"User-Agent": "claude-cli/2.1.220 (external, cli)", "User-Agent": "claude-cli/2.1.258 (external, cli)",
"X-App": "cli", "X-App": "cli",
"X-Stainless-Arch": "<ARCH>", "X-Stainless-Arch": "<ARCH>",
"X-Stainless-Helper-Method": "stream", "X-Stainless-Helper-Method": "stream",
"X-Stainless-Lang": "js", "X-Stainless-Lang": "js",
"X-Stainless-Os": "<OS>", "X-Stainless-Os": "<OS>",
"X-Stainless-Package-Version": "0.94.0", "X-Stainless-Package-Version": "0.112.1",
"X-Stainless-Retry-Count": "0", "X-Stainless-Retry-Count": "0",
"X-Stainless-Runtime": "node", "X-Stainless-Runtime": "node",
"X-Stainless-Runtime-Version": "v26.3.0", "X-Stainless-Runtime-Version": "v26.3.0",
@@ -1007,13 +1007,13 @@
"Anthropic-Dangerous-Direct-Browser-Access": "true", "Anthropic-Dangerous-Direct-Browser-Access": "true",
"Anthropic-Version": "2023-06-01", "Anthropic-Version": "2023-06-01",
"Content-Type": "application/json", "Content-Type": "application/json",
"User-Agent": "claude-cli/2.1.220 (external, cli)", "User-Agent": "claude-cli/2.1.258 (external, cli)",
"X-App": "cli", "X-App": "cli",
"X-Stainless-Arch": "<ARCH>", "X-Stainless-Arch": "<ARCH>",
"X-Stainless-Helper-Method": "stream", "X-Stainless-Helper-Method": "stream",
"X-Stainless-Lang": "js", "X-Stainless-Lang": "js",
"X-Stainless-Os": "<OS>", "X-Stainless-Os": "<OS>",
"X-Stainless-Package-Version": "0.94.0", "X-Stainless-Package-Version": "0.112.1",
"X-Stainless-Retry-Count": "0", "X-Stainless-Retry-Count": "0",
"X-Stainless-Runtime": "node", "X-Stainless-Runtime": "node",
"X-Stainless-Runtime-Version": "v26.3.0", "X-Stainless-Runtime-Version": "v26.3.0",
@@ -1026,13 +1026,13 @@
"Anthropic-Dangerous-Direct-Browser-Access": "true", "Anthropic-Dangerous-Direct-Browser-Access": "true",
"Anthropic-Version": "2023-06-01", "Anthropic-Version": "2023-06-01",
"Content-Type": "application/json", "Content-Type": "application/json",
"User-Agent": "claude-cli/2.1.220 (external, cli)", "User-Agent": "claude-cli/2.1.258 (external, cli)",
"X-App": "cli", "X-App": "cli",
"X-Stainless-Arch": "<ARCH>", "X-Stainless-Arch": "<ARCH>",
"X-Stainless-Helper-Method": "stream", "X-Stainless-Helper-Method": "stream",
"X-Stainless-Lang": "js", "X-Stainless-Lang": "js",
"X-Stainless-Os": "<OS>", "X-Stainless-Os": "<OS>",
"X-Stainless-Package-Version": "0.94.0", "X-Stainless-Package-Version": "0.112.1",
"X-Stainless-Retry-Count": "0", "X-Stainless-Retry-Count": "0",
"X-Stainless-Runtime": "node", "X-Stainless-Runtime": "node",
"X-Stainless-Runtime-Version": "v26.3.0", "X-Stainless-Runtime-Version": "v26.3.0",

View File

@@ -5,6 +5,6 @@ import { CLAUDE_CODE_CLIENT_BILLING_VERSION } from "../../src/shared/constants/c
describe("Anthropic billing header fingerprint (#1638)", () => { describe("Anthropic billing header fingerprint (#1638)", () => {
it("uses the immutable build revision captured from the signed CLI", () => { it("uses the immutable build revision captured from the signed CLI", () => {
assert.equal(CLAUDE_CODE_CLIENT_BILLING_VERSION, "2.1.220.1f2"); assert.equal(CLAUDE_CODE_CLIENT_BILLING_VERSION, "2.1.258.1e2");
}); });
}); });

View File

@@ -52,7 +52,7 @@ test("DEFAULT_CC_BRIDGE_PIPELINE places billing header at [0] and identity at [1
DEFAULT_CC_BRIDGE_PIPELINE DEFAULT_CC_BRIDGE_PIPELINE
); );
const blocks = result.body.system as any[]; const blocks = result.body.system as any[];
assert.ok(blocks[0].text.startsWith("x-anthropic-billing-header: cc_version=2.1.220.1f2;")); assert.ok(blocks[0].text.startsWith("x-anthropic-billing-header: cc_version=2.1.258.1e2;"));
assert.equal(blocks[1].text, CLAUDE_AGENT_SDK_IDENTITY); assert.equal(blocks[1].text, CLAUDE_AGENT_SDK_IDENTITY);
}); });

View File

@@ -38,11 +38,11 @@ test("Claude CLI version constants are in lockstep across all 4 sources", () =>
); );
}); });
test("Claude CLI wire versions match the captured 2.1.220 binary", () => { test("Claude CLI wire versions match the captured 2.1.258 binary", () => {
assert.equal(canonical.CLAUDE_CODE_CLIENT_VERSION, "2.1.220"); assert.equal(canonical.CLAUDE_CODE_CLIENT_VERSION, "2.1.258");
assert.equal(canonical.CLAUDE_CODE_CLIENT_BUILD_REVISION, "1f2"); assert.equal(canonical.CLAUDE_CODE_CLIENT_BUILD_REVISION, "1e2");
assert.equal(canonical.CLAUDE_CODE_CLIENT_BILLING_VERSION, "2.1.220.1f2"); assert.equal(canonical.CLAUDE_CODE_CLIENT_BILLING_VERSION, "2.1.258.1e2");
assert.equal(canonical.CLAUDE_CODE_SDK_PACKAGE_VERSION, "0.94.0"); assert.equal(canonical.CLAUDE_CODE_SDK_PACKAGE_VERSION, "0.112.1");
assert.equal(canonical.CLAUDE_CODE_RUNTIME_VERSION, "v26.3.0"); assert.equal(canonical.CLAUDE_CODE_RUNTIME_VERSION, "v26.3.0");
assert.equal( assert.equal(
compat.CLAUDE_CODE_COMPATIBLE_STAINLESS_PACKAGE_VERSION, compat.CLAUDE_CODE_COMPATIBLE_STAINLESS_PACKAGE_VERSION,

View File

@@ -39,7 +39,7 @@ test("getClientIdentityProfileHeaders: unknown profile id falls back to no heade
test("getClientIdentityProfileHeaders: known CLI profiles expose their preset headers", () => { test("getClientIdentityProfileHeaders: known CLI profiles expose their preset headers", () => {
const claudeCli = getClientIdentityProfileHeaders("claude-cli"); const claudeCli = getClientIdentityProfileHeaders("claude-cli");
assert.equal(claudeCli["User-Agent"], "claude-cli/2.1.220 (external, cli)"); assert.equal(claudeCli["User-Agent"], "claude-cli/2.1.258 (external, cli)");
assert.equal(claudeCli["X-App"], "cli"); assert.equal(claudeCli["X-App"], "cli");
const codexCli = getClientIdentityProfileHeaders("codex-cli"); const codexCli = getClientIdentityProfileHeaders("codex-cli");
@@ -55,7 +55,7 @@ test("getClientIdentityProfileHeaders: returns a fresh mutable copy (catalog sta
headers["User-Agent"] = "tampered"; headers["User-Agent"] = "tampered";
assert.equal( assert.equal(
CLIENT_IDENTITY_PROFILES["claude-cli"].headers["User-Agent"], CLIENT_IDENTITY_PROFILES["claude-cli"].headers["User-Agent"],
"claude-cli/2.1.220 (external, cli)" "claude-cli/2.1.258 (external, cli)"
); );
}); });
@@ -100,7 +100,7 @@ test("profile headers merged into customHeaders survive applyCustomHeaders sanit
true true
) as Record<string, string>; ) as Record<string, string>;
assert.equal(headers["User-Agent"], "claude-cli/2.1.220 (external, cli)"); assert.equal(headers["User-Agent"], "claude-cli/2.1.258 (external, cli)");
assert.equal(headers["X-App"], "cli"); assert.equal(headers["X-App"], "cli");
assert.equal(headers["Authorization"], "Bearer test-key"); assert.equal(headers["Authorization"], "Bearer test-key");
}); });

View File

@@ -1571,12 +1571,12 @@ test("DefaultExecutor.execute does not produce duplicate anthropic-version heade
assert.equal(versionKeys.length, 1, "Duplicate anthropic-version header keys found"); assert.equal(versionKeys.length, 1, "Duplicate anthropic-version header keys found");
assert.equal(capturedHeaders[versionKeys[0]], "2023-06-01"); assert.equal(capturedHeaders[versionKeys[0]], "2023-06-01");
assert.equal(capturedHeaders["X-Stainless-Runtime-Version"], "v26.3.0"); assert.equal(capturedHeaders["X-Stainless-Runtime-Version"], "v26.3.0");
assert.equal(capturedHeaders["X-Stainless-Package-Version"], "0.94.0"); assert.equal(capturedHeaders["X-Stainless-Package-Version"], "0.112.1");
const sentBody = JSON.parse(capturedBody) as { system?: Array<{ text?: string }> }; const sentBody = JSON.parse(capturedBody) as { system?: Array<{ text?: string }> };
assert.match( assert.match(
sentBody.system?.[0]?.text ?? "", sentBody.system?.[0]?.text ?? "",
/^x-anthropic-billing-header: cc_version=2\.1\.220\.1f2; cc_entrypoint=cli; cch=[0-9a-f]{5};$/ /^x-anthropic-billing-header: cc_version=2\.1\.258\.1e2; cc_entrypoint=cli; cch=[0-9a-f]{5};$/
); );
}); });

View File

@@ -130,9 +130,9 @@ test("GlmExecutor normalizes GLM coding and Anthropic URLs without duplicating e
}); });
test("GlmExecutor separates OpenAI-compatible coding headers from Anthropic headers", async () => { test("GlmExecutor separates OpenAI-compatible coding headers from Anthropic headers", async () => {
assert.equal(await getExecutor("glm") instanceof GlmExecutor, true); assert.equal((await getExecutor("glm")) instanceof GlmExecutor, true);
assert.equal(await getExecutor("glm-cn") instanceof GlmExecutor, true); assert.equal((await getExecutor("glm-cn")) instanceof GlmExecutor, true);
assert.equal(await getExecutor("glmt") instanceof GlmExecutor, true); assert.equal((await getExecutor("glmt")) instanceof GlmExecutor, true);
const executor = new GlmExecutor("glm"); const executor = new GlmExecutor("glm");
const codingHeaders = executor.buildHeaders( const codingHeaders = executor.buildHeaders(
@@ -183,7 +183,7 @@ test("GlmExecutor separates OpenAI-compatible coding headers from Anthropic head
assert.equal(anthropicHeaders["anthropic-version"], "2023-06-01"); assert.equal(anthropicHeaders["anthropic-version"], "2023-06-01");
assert.match(anthropicHeaders["anthropic-beta"], /claude-code-20250219/); assert.match(anthropicHeaders["anthropic-beta"], /claude-code-20250219/);
assert.equal(anthropicHeaders["anthropic-dangerous-direct-browser-access"], "true"); assert.equal(anthropicHeaders["anthropic-dangerous-direct-browser-access"], "true");
assert.match(anthropicHeaders["User-Agent"], /^claude-cli\/2\.1\.220 \(external, sdk-cli\)$/); assert.match(anthropicHeaders["User-Agent"], /^claude-cli\/2\.1\.258 \(external, sdk-cli\)$/);
assert.equal(anthropicHeaders["X-Stainless-Lang"], "js"); assert.equal(anthropicHeaders["X-Stainless-Lang"], "js");
assert.equal(anthropicHeaders["X-Stainless-Runtime"], "node"); assert.equal(anthropicHeaders["X-Stainless-Runtime"], "node");
}); });

View File

@@ -559,7 +559,7 @@ const UI_DEFAULTS_SNAPSHOT = {
entrypoint: "sdk-cli", entrypoint: "sdk-cli",
versionFormat: "ex-machina", versionFormat: "ex-machina",
cchAlgo: "sha256-first-user", cchAlgo: "sha256-first-user",
buildRevision: "1f2", buildRevision: "1e2",
}, },
], ],
}, },