mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-21 22:32:22 +03:00
Merge branch 'diegosouzapw:release/v3.8.51' into release/v3.8.51
This commit is contained in:
@@ -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) —
|
||||||
|
|||||||
1
changelog.d/maintenance/12402-claude-code-2-1-258.md
Normal file
1
changelog.d/maintenance/12402-claude-code-2-1-258.md
Normal 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
|
||||||
@@ -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)."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 |
|
||||||
|
|||||||
@@ -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 |
|
||||||
|
|||||||
@@ -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` |
|
||||||
|
|||||||
@@ -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,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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");
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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};$/
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user