chore(providers): bump Claude Code wire identity + Devin bridge pin to 2.1.258 (#12604)

17 de 18 checks verdes, **zero falhas** — incluindo os quatro shards de unit, Vitest, CodeQL, semgrep, Docs Gates, Merge integrity e o **Fast Quality Gates**, que era exatamente o que o rebaseline do `RoutingTab.tsx` (1606→1607, a linha do seletor que acompanha a nova versão de identidade) veio consertar.

O único check restante, `No new ESLint warnings`, ficou enfileirado sem iniciar (duração 0) atrás da saturação de runners de hoje. Cobri os dois comandos que ele executa, localmente e sobre este HEAD:

- `npm run check:codeql-ratchet` → **0 alertas abertos** contra baseline 6 (sem regressão).
- `npx eslint --max-warnings 0` nos 9 arquivos de código que esta branch altera → **exit 0**, nenhum warning.

Conteúdo: os dois commits do #12402 que não estavam subsumidos, com autoria do @ggiak preservada pelo cherry-pick `-x`, mais o rebaseline e o fragmento de changelog que faltava. `typecheck:core` limpo e **138/138** nos testes focados. As três versões (`claudeCodeClient.ts`, `Dockerfile`, `compose.yml`) conferem em 2.1.258, e `npm view @anthropic-ai/claude-code@2.1.258` resolve — o Dockerfile instala esse pin exato.
This commit is contained in:
Diego Rodrigues de Sa e Souza
2026-09-03 13:49:46 -03:00
committed by GitHub
parent ad500de9e3
commit f51cd295c8
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.
# 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
# (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/settings/components/ProxyRegistryManager.tsx": 1475,
"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/usage/components/EvalsTab.tsx": 2152,
"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).",
"_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_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)."
}

View File

@@ -1,6 +1,6 @@
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 TARGETARCH

View File

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

View File

@@ -4,16 +4,22 @@
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.
> **Current status: offline and live validated.** The pinned Claude Code `2.1.220` completed
> three isolated scenarios through Devin CLI `3000.2.17` and model
> `swe-1-7-lightning`. The final live run proved client-owned `Read`, `Edit`, and `Bash`
> turns, successful `npm test` results, project command and skill discovery, Devin-only
> routing, and zero Claude egress.
> **Current status: pinned Claude Code `2.1.258`; offline and live validation last recorded
> on `2.1.220`.** The `2.1.220` pin completed three isolated scenarios through Devin CLI
> `3000.2.17` and model `swe-1-7-lightning`; that final live run proved client-owned `Read`,
> `Edit`, and `Bash` turns, successful `npm test` results, project command and skill
> 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
```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
-> devin-cli-agentic (Claude-format, no-auth provider)
-> 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 |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| `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-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 |

View File

@@ -622,7 +622,7 @@ process.env[`${PROVIDER_ID}_USER_AGENT`]
| 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. |
| `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 |

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:
- `CLAUDE_CODE_COMPATIBLE_USER_AGENT = "claude-cli/2.1.220 (external, sdk-cli)"`
- `CLAUDE_CODE_COMPATIBLE_STAINLESS_PACKAGE_VERSION = "0.94.0"`
- `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"` 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
@@ -241,7 +241,7 @@ All MITM endpoints require management auth (`requireCliToolsAuth`). The sudo pas
| 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)` |
| `GITHUB_USER_AGENT` | `GitHubCopilotChat/0.54.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,
} from "@/shared/constants/cliCompatProviders";
import { AI_PROVIDERS } from "@/shared/constants/providers";
import { CLAUDE_CODE_CLIENT_BUILD_REVISION } from "@/shared/constants/claudeCodeClient";
import { compareTr } from "@/shared/utils/turkishText";
import { HERMES } from "./systemTransformsHermesDefaults";
@@ -169,7 +170,7 @@ const DEFAULT_SYSTEM_TRANSFORMS_CLIENT = {
entrypoint: "sdk-cli",
versionFormat: "ex-machina",
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,
* 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_BUILD_REVISION = "1f2";
export const CLAUDE_CODE_CLIENT_VERSION = "2.1.258";
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_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 type ClaudeCodeEntrypoint = "cli" | "sdk-cli";

View File

@@ -28,11 +28,11 @@
"apiKey": {
"Accept": "text/event-stream",
"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-Lang": "js",
"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-Runtime": "node",
"X-Stainless-Runtime-Version": "v26.3.0",
@@ -47,11 +47,11 @@
"nonStream": {
"Accept": "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-Lang": "js",
"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-Runtime": "node",
"X-Stainless-Runtime-Version": "v26.3.0",
@@ -66,11 +66,11 @@
"oauth": {
"Accept": "text/event-stream",
"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-Lang": "js",
"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-Runtime": "node",
"X-Stainless-Runtime-Version": "v26.3.0",
@@ -989,13 +989,13 @@
"Anthropic-Dangerous-Direct-Browser-Access": "true",
"Anthropic-Version": "2023-06-01",
"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-Stainless-Arch": "<ARCH>",
"X-Stainless-Helper-Method": "stream",
"X-Stainless-Lang": "js",
"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-Runtime": "node",
"X-Stainless-Runtime-Version": "v26.3.0",
@@ -1007,13 +1007,13 @@
"Anthropic-Dangerous-Direct-Browser-Access": "true",
"Anthropic-Version": "2023-06-01",
"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-Stainless-Arch": "<ARCH>",
"X-Stainless-Helper-Method": "stream",
"X-Stainless-Lang": "js",
"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-Runtime": "node",
"X-Stainless-Runtime-Version": "v26.3.0",
@@ -1026,13 +1026,13 @@
"Anthropic-Dangerous-Direct-Browser-Access": "true",
"Anthropic-Version": "2023-06-01",
"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-Stainless-Arch": "<ARCH>",
"X-Stainless-Helper-Method": "stream",
"X-Stainless-Lang": "js",
"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-Runtime": "node",
"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)", () => {
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
);
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);
});

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", () => {
assert.equal(canonical.CLAUDE_CODE_CLIENT_VERSION, "2.1.220");
assert.equal(canonical.CLAUDE_CODE_CLIENT_BUILD_REVISION, "1f2");
assert.equal(canonical.CLAUDE_CODE_CLIENT_BILLING_VERSION, "2.1.220.1f2");
assert.equal(canonical.CLAUDE_CODE_SDK_PACKAGE_VERSION, "0.94.0");
test("Claude CLI wire versions match the captured 2.1.258 binary", () => {
assert.equal(canonical.CLAUDE_CODE_CLIENT_VERSION, "2.1.258");
assert.equal(canonical.CLAUDE_CODE_CLIENT_BUILD_REVISION, "1e2");
assert.equal(canonical.CLAUDE_CODE_CLIENT_BILLING_VERSION, "2.1.258.1e2");
assert.equal(canonical.CLAUDE_CODE_SDK_PACKAGE_VERSION, "0.112.1");
assert.equal(canonical.CLAUDE_CODE_RUNTIME_VERSION, "v26.3.0");
assert.equal(
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", () => {
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");
const codexCli = getClientIdentityProfileHeaders("codex-cli");
@@ -55,7 +55,7 @@ test("getClientIdentityProfileHeaders: returns a fresh mutable copy (catalog sta
headers["User-Agent"] = "tampered";
assert.equal(
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
) 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["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(capturedHeaders[versionKeys[0]], "2023-06-01");
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 }> };
assert.match(
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 () => {
assert.equal(await getExecutor("glm") instanceof GlmExecutor, true);
assert.equal(await getExecutor("glm-cn") instanceof GlmExecutor, true);
assert.equal(await getExecutor("glmt") instanceof GlmExecutor, true);
assert.equal((await getExecutor("glm")) instanceof GlmExecutor, true);
assert.equal((await getExecutor("glm-cn")) instanceof GlmExecutor, true);
assert.equal((await getExecutor("glmt")) instanceof GlmExecutor, true);
const executor = new GlmExecutor("glm");
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.match(anthropicHeaders["anthropic-beta"], /claude-code-20250219/);
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-Runtime"], "node");
});

View File

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