diff --git a/docker/daytona-runner/Dockerfile b/docker/daytona-runner/Dockerfile index 5a1da31b1f..851d513265 100644 --- a/docker/daytona-runner/Dockerfile +++ b/docker/daytona-runner/Dockerfile @@ -140,7 +140,7 @@ RUN /bin/sh -lc 'set -eu; \ command -v "$command_name" >/dev/null || { echo "FATAL: $command_name not on PATH for daytona user" >&2; exit 1; }; \ done; \ test "$(codex --version)" = "codex-cli 0.156.0"; \ - test "$(claude --version)" = "2.1.280 (Claude Code)"; \ + test "$(claude --version)" = "2.1.286 (Claude Code)"; \ test "$(opencode --version)" = "1.18.32"; \ test "$(acpx --version)" = "0.13.1"; \ test "$(claude-agent-acp --version)" = "0.73.0"; \ diff --git a/docker/daytona-runner/README.md b/docker/daytona-runner/README.md index cd54962638..950553197f 100644 --- a/docker/daytona-runner/README.md +++ b/docker/daytona-runner/README.md @@ -14,12 +14,12 @@ image that this Dockerfile can extend directly. ## Harness versions -The September 22, 2026 refresh pins Codex 0.156.0, Claude Agent SDK -0.3.280 (Claude Code 2.1.280), and OpenCode 1.18.32 in the shared provider +The October 1, 2026 refresh pins Codex 0.156.0, Claude Agent SDK +0.3.286 (Claude Code 2.1.286), and OpenCode 1.18.32 in the shared provider pack. Claude Code 2.1.280 is the minimum for -[Opus 5.5](https://code.claude.com/docs/en/model-config); it also supports -Fable 5.1. Codex uses the current -[GPT-6 Sol and Luna model IDs](https://learn.chatgpt.com/docs/models). +[Opus 5.5](https://code.claude.com/docs/en/model-config) and 2.1.284 is the +minimum for Sonnet 5.5; the pinned runtime also supports Fable 5.1. Codex uses +the current [GPT-6 Sol and Luna model IDs](https://learn.chatgpt.com/docs/models). Grok CLI 1.0.41 supports the current [Grok 4.7](https://docs.x.ai/developers/grok-4-7) model family. diff --git a/package.json b/package.json index 29223ed74e..a7fe131e30 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ }, "overrides": { "@agentclientprotocol/codex-acp@1.6.2>@openai/codex": "0.156.0", - "@agentclientprotocol/claude-agent-acp@0.73.0>@anthropic-ai/claude-agent-sdk": "0.3.280", + "@agentclientprotocol/claude-agent-acp@0.73.0>@anthropic-ai/claude-agent-sdk": "0.3.286", "rollup": ">=4.59.0", "react": "^19.2.8", "react-dom": "^19.2.8", diff --git a/packages/adapters/claude-local/src/index.test.ts b/packages/adapters/claude-local/src/index.test.ts index ce8bdf5a36..ff5342c028 100644 --- a/packages/adapters/claude-local/src/index.test.ts +++ b/packages/adapters/claude-local/src/index.test.ts @@ -8,10 +8,16 @@ describe("Claude model defaults", () => { expect(claudeLocalReasoningEffortsForModel(model)).toEqual(["low", "medium", "high", "xhigh", "max"]); }); + it.each(["claude-sonnet-5-5", "claude-sonnet-5-5[1m]"])("requires CLI 2.1.284 and offers all efforts for %s", (model) => { + expect(minimumClaudeCliVersionForModel(model)).toBe("2.1.284"); + expect(claudeLocalReasoningEffortsForModel(model)).toEqual(["low", "medium", "high", "xhigh", "max"]); + }); + it("keeps model-specific Claude reasoning limits", () => { expect(claudeLocalReasoningEffortsForModel("claude-fable-5-1")).toContain("xhigh"); expect(claudeLocalReasoningEffortsForModel("claude-sonnet-5")).toContain("max"); expect(claudeLocalReasoningEffortsForModel("claude-sonnet-4-6")).toEqual(["low", "medium", "high", "max"]); + expect(claudeLocalReasoningEffortsForModel("claude-sonnet-4-5")).toEqual(["low", "medium", "high"]); expect(claudeLocalReasoningEffortsForModel("claude-haiku-4-5")).toEqual([]); expect(claudeLocalReasoningEffortsForModel("custom-model")).toEqual(["low", "medium", "high"]); }); diff --git a/packages/adapters/claude-local/src/index.ts b/packages/adapters/claude-local/src/index.ts index f5a71e4ea2..9268c47f95 100644 --- a/packages/adapters/claude-local/src/index.ts +++ b/packages/adapters/claude-local/src/index.ts @@ -26,7 +26,7 @@ export const type = "claude_local"; export function claudeLocalReasoningEffortsForModel(model: string): readonly string[] { const id = model.trim().replace(/\[1m\]$/, "").replace(/^(?:(?:us|eu|apac|global)\.)?anthropic\./, ""); if (/^claude-haiku-/.test(id)) return []; - if (/^claude-(?:opus-5(?:-5)?|opus-4-[78]|sonnet-5|fable-5(?:-1)?)$/.test(id)) { + if (/^claude-(?:opus-5(?:-5)?|opus-4-[78]|sonnet-5(?:-5)?|fable-5(?:-1)?)$/.test(id)) { return ["low", "medium", "high", "xhigh", "max"]; } if (/^claude-(?:opus|sonnet)-4-6(?:-v1)?$/.test(id)) return ["low", "medium", "high", "max"]; @@ -43,13 +43,14 @@ export const models = [ { id: "claude-fable-5-1", label: "Claude Fable 5.1" }, { id: "claude-mythos-5", label: "Claude Mythos 5" }, { id: "claude-opus-5-5", label: "Claude Opus 5.5" }, - { id: "claude-sonnet-5", label: "Claude Sonnet 5" }, + { id: "claude-sonnet-5-5", label: "Claude Sonnet 5.5" }, { id: "claude-haiku-4-5", label: "Claude Haiku 4.5" }, { id: "claude-fable-5", label: "Claude Fable 5" }, { id: "claude-opus-5", label: "Claude Opus 5" }, { id: "claude-opus-4-8", label: "Claude Opus 4.8" }, { id: "claude-opus-4-7", label: "Claude Opus 4.7" }, { id: "claude-opus-4-6", label: "Claude Opus 4.6" }, + { id: "claude-sonnet-5", label: "Claude Sonnet 5" }, { id: "claude-sonnet-4-6", label: "Claude Sonnet 4.6" }, { id: "claude-sonnet-4-5", label: "Claude Sonnet 4.5" }, ]; @@ -63,7 +64,7 @@ Core fields: - cwd (string, optional): default absolute working directory fallback for the agent process (created if missing when possible) - instructionsFilePath (string, optional): absolute path to a markdown instructions file injected at runtime - model (string, optional): Claude model id. Missing or blank defaults to ${DEFAULT_CLAUDE_LOCAL_MODEL} in both CLI and ACP, including existing agents. Explicit model IDs and ANTHROPIC_MODEL overrides are preserved. Bedrock/Vertex without an explicit model retain their provider default. -- effort (string, optional): model-specific reasoning effort passed via --effort (low|medium|high; current Opus, Sonnet 5, and Fable models also support xhigh|max) +- effort (string, optional): model-specific reasoning effort passed via --effort (low|medium|high; current Opus, Sonnet 5/5.5, and Fable models also support xhigh|max) - chrome (boolean, optional): pass --chrome when running Claude - promptTemplate (string, optional): run prompt template - maxTurnsPerRun (number, optional): max turns for one run @@ -92,6 +93,7 @@ Operational fields: Notes: - Claude Opus 5.5 uses model ID \`claude-opus-5-5\` and requires Claude Code v2.1.280 or later. +- Claude Sonnet 5.5 uses model ID \`claude-sonnet-5-5\` and requires Claude Code v2.1.284 or later. - filesystemScope and networkScope are spawn-level confinement and are orthogonal to Claude permission flags. Both require Bubblewrap on the host and explicit engine="cli"; default or explicit ACP is rejected because ACP confinement is not yet supported. networkScope="allowlist" injects HTTP_PROXY/HTTPS_PROXY for the CLI while its private network namespace blocks direct sockets, so every required provider/API hostname must be listed explicitly. - The Claude ACP lane requires Node >=24.11.0 and @agentclientprotocol/claude-agent-acp to be installed with this adapter package. Missing prerequisites fail both default and explicit ACP runs with an actionable setup error; the adapter never switches engines automatically. - For ACP runs, model selection is passed through ANTHROPIC_MODEL at ACP server startup; Paperclip-managed Claude permissions and ephemeral skill materialization are handled by the shared ACP engine. diff --git a/packages/adapters/claude-local/src/server/cli-capabilities.ts b/packages/adapters/claude-local/src/server/cli-capabilities.ts index 70da0cd3dc..dec74c2f38 100644 --- a/packages/adapters/claude-local/src/server/cli-capabilities.ts +++ b/packages/adapters/claude-local/src/server/cli-capabilities.ts @@ -38,6 +38,7 @@ function cacheKeyForTarget(command: string, target: AdapterExecutionTarget | nul export function minimumClaudeCliVersionForModel(model: string): string | null { const modelId = model.trim().replace(/\[1m\]$/, "").replace(/^(?:(?:us|eu|apac|global)\.)?anthropic\./, ""); if (modelId === "claude-opus-5-5") return "2.1.280"; + if (modelId === "claude-sonnet-5-5") return "2.1.284"; return modelId === "claude-fable-5-1" ? CLAUDE_FABLE_5_1_MIN_CLI_VERSION : null; diff --git a/packages/adapters/claude-local/src/server/execute.remote.test.ts b/packages/adapters/claude-local/src/server/execute.remote.test.ts index d848ef6010..9ccc3ef77e 100644 --- a/packages/adapters/claude-local/src/server/execute.remote.test.ts +++ b/packages/adapters/claude-local/src/server/execute.remote.test.ts @@ -18,7 +18,7 @@ const { signal: null, timedOut: false, stdout: args.includes("--version") - ? "2.1.280 (Claude Code)\n" + ? "2.1.284 (Claude Code)\n" : [ JSON.stringify({ type: "system", subtype: "init", session_id: "claude-session-1", model: "claude-sonnet" }), JSON.stringify({ type: "assistant", session_id: "claude-session-1", message: { content: [{ type: "text", text: "hello" }] } }), @@ -467,7 +467,7 @@ describe("claude remote execution", () => { return { args: call?.[2] ?? [], result }; } - it.each(["claude-fable-5-1", "claude-opus-5-5"])("passes %s as --model on the CLI lane", async (model) => { + it.each(["claude-fable-5-1", "claude-opus-5-5", "claude-sonnet-5-5"])("passes %s as --model on the CLI lane", async (model) => { const { args } = await executeWithModel("paperclip-claude-model-direct-", { model, }); @@ -500,6 +500,7 @@ describe("claude remote execution", () => { it.each([ ["claude-fable-5-1", "2.1.251", "2.1.247"], ["claude-opus-5-5", "2.1.280", "2.1.279"], + ["claude-sonnet-5-5", "2.1.284", "2.1.283"], ])("rejects %s before launch below CLI %s", async (model, minimumVersion, detectedVersion) => { runChildProcess.mockResolvedValueOnce({ exitCode: 0, diff --git a/packages/adapters/claude-local/src/server/test.probe.test.ts b/packages/adapters/claude-local/src/server/test.probe.test.ts index 817e39f34d..7273ca6adf 100644 --- a/packages/adapters/claude-local/src/server/test.probe.test.ts +++ b/packages/adapters/claude-local/src/server/test.probe.test.ts @@ -642,6 +642,7 @@ describe("claude CLI local hello probe hardening", () => { it.each([ ["claude-fable-5-1", "2.1.251"], ["claude-opus-5-5", "2.1.280"], + ["claude-sonnet-5-5", "2.1.284"], ])("warns without executing %s when runtime PATH selects a different executable", async (model, minimumVersion) => { const runtimeDir = await mkdtemp(path.join(os.tmpdir(), "paperclip-cli-runtime-path-")); const runtimeClaudePath = path.join(runtimeDir, "claude"); diff --git a/packages/adapters/claude-local/src/server/test.remote.test.ts b/packages/adapters/claude-local/src/server/test.remote.test.ts index 9062260e02..80ecd74ccc 100644 --- a/packages/adapters/claude-local/src/server/test.remote.test.ts +++ b/packages/adapters/claude-local/src/server/test.remote.test.ts @@ -144,6 +144,7 @@ describe("claude CLI model compatibility check", () => { it.each([ ["claude-fable-5-1", "2.1.251", "2.1.247"], ["claude-opus-5-5", "2.1.280", "2.1.279"], + ["claude-sonnet-5-5", "2.1.284", "2.1.283"], ])("fails before the hello probe for %s below CLI %s", async (model, minimumVersion, detectedVersion) => { probeResult.value = { exitCode: 0, diff --git a/packages/paperclip-runner/runner/crates/runner-core/src/acpx_provider_backend.rs b/packages/paperclip-runner/runner/crates/runner-core/src/acpx_provider_backend.rs index 48f8ca0e79..eb25c8310a 100644 --- a/packages/paperclip-runner/runner/crates/runner-core/src/acpx_provider_backend.rs +++ b/packages/paperclip-runner/runner/crates/runner-core/src/acpx_provider_backend.rs @@ -153,7 +153,7 @@ impl AcpxProviderDescriptor { "@agentclientprotocol/claude-agent-acp", "0.73.0", Some("@anthropic-ai/claude-agent-sdk"), - Some("0.3.280"), + Some("0.3.286"), "sha256:9d73d1f0f121fb96cc8badb28c22d5bff02d8582eb2e40360a81c189e1b9422a", ), "codex" => ( @@ -2257,7 +2257,7 @@ mod tests { "@agentclientprotocol/claude-agent-acp", "0.73.0", json!("@anthropic-ai/claude-agent-sdk"), - json!("0.3.280"), + json!("0.3.286"), "sha256:9d73d1f0f121fb96cc8badb28c22d5bff02d8582eb2e40360a81c189e1b9422a", ) } else { diff --git a/packages/paperclip-runner/runner/crates/runner-core/tests/native_provider_backend.rs b/packages/paperclip-runner/runner/crates/runner-core/tests/native_provider_backend.rs index 9699a80278..493e413d99 100644 --- a/packages/paperclip-runner/runner/crates/runner-core/tests/native_provider_backend.rs +++ b/packages/paperclip-runner/runner/crates/runner-core/tests/native_provider_backend.rs @@ -266,7 +266,7 @@ fn pending_acpx_runtime_request( provider["agentServerPackage"] = json!("@agentclientprotocol/claude-agent-acp"); provider["agentServerVersion"] = json!("0.73.0"); provider["agentRuntimePackage"] = json!("@anthropic-ai/claude-agent-sdk"); - provider["agentRuntimeVersion"] = json!("0.3.280"); + provider["agentRuntimeVersion"] = json!("0.3.286"); provider["commandDigest"] = json!(digest); provider["sidecarArgs"][3] = json!(digest); } else { diff --git a/packages/paperclip-runner/src/backends/native-backend-factory.test.ts b/packages/paperclip-runner/src/backends/native-backend-factory.test.ts index 2aa2addcd5..ca17d003e3 100644 --- a/packages/paperclip-runner/src/backends/native-backend-factory.test.ts +++ b/packages/paperclip-runner/src/backends/native-backend-factory.test.ts @@ -127,7 +127,7 @@ function acpxExecution( ? "@openai/codex" : "@anthropic-ai/claude-agent-sdk", agentRuntimeVersion: - agent === "pi" ? "0.84.2" : agent === "codex" ? "0.156.0" : "0.3.280", + agent === "pi" ? "0.84.2" : agent === "codex" ? "0.156.0" : "0.3.286", commandDigest: agent === "codex" ? "sha256:c4538599d1ab767db5dff50934f13bb5ba313a59d9c4a83e993fac4617ea63d3" diff --git a/packages/paperclip-runner/src/drivers/acpx/installation-integrity.test.ts b/packages/paperclip-runner/src/drivers/acpx/installation-integrity.test.ts index b97b7c51ac..f22dabdbe7 100644 --- a/packages/paperclip-runner/src/drivers/acpx/installation-integrity.test.ts +++ b/packages/paperclip-runner/src/drivers/acpx/installation-integrity.test.ts @@ -449,7 +449,7 @@ describe("ACPX installation integrity", () => { }, { name: "@anthropic-ai/claude-agent-sdk", - version: "0.3.280", + version: "0.3.286", directory: join(dependencyRoot, "claude-agent-sdk"), }, { diff --git a/packages/paperclip-runner/src/drivers/acpx/installation-integrity.ts b/packages/paperclip-runner/src/drivers/acpx/installation-integrity.ts index 237de315b4..1c17f6d67e 100644 --- a/packages/paperclip-runner/src/drivers/acpx/installation-integrity.ts +++ b/packages/paperclip-runner/src/drivers/acpx/installation-integrity.ts @@ -48,13 +48,13 @@ const VERIFIED_PROVIDER_RUNTIME_TARGET_ENV = const QUALIFIED_CLAUDE_LINUX_X64_RUNTIME = Object.freeze({ runtimePackageName: "@anthropic-ai/claude-agent-sdk", - runtimePackageVersion: "0.3.280", + runtimePackageVersion: "0.3.286", packageName: "@anthropic-ai/claude-agent-sdk-linux-x64", - packageVersion: "0.3.280", - dependencyDeclaration: "0.3.280", + packageVersion: "0.3.286", + dependencyDeclaration: "0.3.286", relativeExecutable: "claude", executableDigest: - "sha256:1e08503dbdf3c2cb0d706d32f3408277388d1c76ef108673e8fe42c1b322925b", + "sha256:fe503f65c6289d59c23e5b21ae44f03583f997dd33a2cbfc75ab4f96fb8fc73f", environmentVariable: "CLAUDE_CODE_EXECUTABLE", }); @@ -62,12 +62,12 @@ const QUALIFIED_CLAUDE_DARWIN_RUNTIMES = { arm64: Object.freeze({ ...QUALIFIED_CLAUDE_LINUX_X64_RUNTIME, packageName: "@anthropic-ai/claude-agent-sdk-darwin-arm64", - executableDigest: "sha256:387a5c5dcdbb815085edf0baf79591f9d8894efe922bceaf3d75b1b08055229d", + executableDigest: "sha256:75e3016e9d2570767b08e43a7467d4817a4f149232c169ca295f2c95fef21433", }), x64: Object.freeze({ ...QUALIFIED_CLAUDE_LINUX_X64_RUNTIME, packageName: "@anthropic-ai/claude-agent-sdk-darwin-x64", - executableDigest: "sha256:c1d32d87630482250633208ab77855429b24010ae3086a7ff7539b57b93168d4", + executableDigest: "sha256:53e6a936e89519d695230f9cc97943991286b72766674fba11bee845f0a7c047", }), }; @@ -95,8 +95,8 @@ const QUALIFIED_CLAUDE_PROVIDER_DEPENDENCIES = Object.freeze([ }), Object.freeze({ packageName: "@anthropic-ai/claude-agent-sdk", - packageVersion: "0.3.280", - // The package's own package.json still declares 0.3.257 — 0.3.280 is + packageVersion: "0.3.286", + // The package's own package.json still declares 0.3.257 — 0.3.286 is // only what pnpm resolves, forced by the // "claude-agent-acp@0.73.0>@anthropic-ai/claude-agent-sdk" override in // the workspace root. This field binds the declared string, not the diff --git a/packages/paperclip-runner/src/drivers/acpx/qualified-profiles.test.ts b/packages/paperclip-runner/src/drivers/acpx/qualified-profiles.test.ts index 9cde5dd0a9..f4bab678e4 100644 --- a/packages/paperclip-runner/src/drivers/acpx/qualified-profiles.test.ts +++ b/packages/paperclip-runner/src/drivers/acpx/qualified-profiles.test.ts @@ -41,7 +41,7 @@ describe("qualified ACPX profiles", () => { it("binds Claude ACP to the SDK and native CLI runtime it launches", () => { expect(QUALIFIED_ACPX_PROFILES.claude).toMatchObject({ agentRuntimePackage: "@anthropic-ai/claude-agent-sdk", - agentRuntimeVersion: "0.3.280", + agentRuntimeVersion: "0.3.286", }); }); }); diff --git a/packages/paperclip-runner/src/drivers/acpx/qualified-profiles.ts b/packages/paperclip-runner/src/drivers/acpx/qualified-profiles.ts index b7b5f39898..5232991139 100644 --- a/packages/paperclip-runner/src/drivers/acpx/qualified-profiles.ts +++ b/packages/paperclip-runner/src/drivers/acpx/qualified-profiles.ts @@ -89,7 +89,7 @@ export const QUALIFIED_ACPX_PROFILES: Readonly< agentServerPackage: "@agentclientprotocol/claude-agent-acp", agentServerVersion: "0.73.0", agentRuntimePackage: "@anthropic-ai/claude-agent-sdk", - agentRuntimeVersion: "0.3.280", + agentRuntimeVersion: "0.3.286", commandDigest: "sha256:9d73d1f0f121fb96cc8badb28c22d5bff02d8582eb2e40360a81c189e1b9422a", qualificationModel: "claude-sonnet-5", diff --git a/packages/paperclip-runner/test/acpx-codex-package-contract.test.mjs b/packages/paperclip-runner/test/acpx-codex-package-contract.test.mjs index 3868dda6c5..37e317f92a 100644 --- a/packages/paperclip-runner/test/acpx-codex-package-contract.test.mjs +++ b/packages/paperclip-runner/test/acpx-codex-package-contract.test.mjs @@ -60,7 +60,7 @@ test("the runner pins every qualified ACPX production dependency", () => { assert.equal(runnerPackage.dependencies["@openai/codex"], "0.156.0"); assert.equal(runnerPackage.dependencies["@anthropic-ai/claude-agent-sdk"], undefined); assert.equal(rootPackage.pnpm.overrides["@agentclientprotocol/codex-acp@1.6.2>@openai/codex"], runnerPackage.dependencies["@openai/codex"]); - assert.equal(rootPackage.pnpm.overrides["@agentclientprotocol/claude-agent-acp@0.73.0>@anthropic-ai/claude-agent-sdk"], "0.3.280"); + assert.equal(rootPackage.pnpm.overrides["@agentclientprotocol/claude-agent-acp@0.73.0>@anthropic-ai/claude-agent-sdk"], "0.3.286"); assert.equal(runnerPackage.optionalDependencies, undefined); assert.equal(runnerPackage.dependencies.node, undefined); assert.equal(runnerPackage.dependencies.acpx, "0.13.1"); diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 19900634e4..f5c8f084bc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -33,7 +33,7 @@ patchedDependencies: # pnpm patches change package files, but overrides control dependency resolution. overrides: "@agentclientprotocol/codex-acp@1.6.2>@openai/codex": "0.156.0" - "@agentclientprotocol/claude-agent-acp@0.73.0>@anthropic-ai/claude-agent-sdk": "0.3.280" + "@agentclientprotocol/claude-agent-acp@0.73.0>@anthropic-ai/claude-agent-sdk": "0.3.286" rollup: ">=4.59.0" react: "^19.2.8" react-dom: "^19.2.8" diff --git a/server/src/__tests__/adapter-models.test.ts b/server/src/__tests__/adapter-models.test.ts index 98ec099837..a8f736a5df 100644 --- a/server/src/__tests__/adapter-models.test.ts +++ b/server/src/__tests__/adapter-models.test.ts @@ -72,6 +72,7 @@ describe("adapter model listing", () => { // Opus 5 is a current GA flagship and must be offered even when live discovery is unavailable. expect(models.some((model) => model.id === "claude-opus-5")).toBe(true); expect(models).toContainEqual({ id: "claude-opus-5-5", label: "Claude Opus 5.5" }); + expect(models).toContainEqual({ id: "claude-sonnet-5-5", label: "Claude Sonnet 5.5" }); expect(fetchSpy).not.toHaveBeenCalled(); }); @@ -95,6 +96,7 @@ describe("adapter model listing", () => { expect(first.some((model) => model.id === "claude-opus-4-8-20260529")).toBe(true); expect(first.some((model) => model.id === "claude-opus-4-8")).toBe(true); expect(first.some((model) => model.id === "claude-opus-5-5")).toBe(true); + expect(first.some((model) => model.id === "claude-sonnet-5-5")).toBe(true); // Discovered models take the curated order too: the API's order is not shown as-is. const firstIds = first.map((model) => model.id); expect(firstIds[0]).toBe("claude-fable-5-1"); @@ -141,6 +143,7 @@ describe("adapter model listing", () => { it.each([ ["claude-fable-5-1", "Claude Fable 5.1"], ["claude-opus-5-5", "Claude Opus 5.5"], + ["claude-sonnet-5-5", "Claude Sonnet 5.5"], ])("does not duplicate %s when discovery returns the identical ID", async (id, displayName) => { process.env.ANTHROPIC_API_KEY = "sk-ant-test"; vi.spyOn(globalThis, "fetch").mockResolvedValue({ diff --git a/ui/src/lib/agent-setup-fields.test.ts b/ui/src/lib/agent-setup-fields.test.ts index e0d14f7e7d..2b3b3773c2 100644 --- a/ui/src/lib/agent-setup-fields.test.ts +++ b/ui/src/lib/agent-setup-fields.test.ts @@ -5,6 +5,8 @@ import { setupEfforts } from "./agent-setup-fields"; describe("model-specific setup efforts", () => { it("offers current Claude efforts without offering them on Haiku", () => { expect(setupEfforts("claude_local", "claude-fable-5-1")).toEqual(["low", "medium", "high", "xhigh", "max"]); + expect(setupEfforts("claude_local", "claude-sonnet-5-5")).toEqual(["low", "medium", "high", "xhigh", "max"]); + expect(setupEfforts("claude_local", "claude-opus-5-5")).toEqual(["low", "medium", "high", "xhigh", "max"]); expect(setupEfforts("claude_local", "claude-haiku-4-5")).toEqual([]); });