diff --git a/CHANGELOG.md b/CHANGELOG.md index 550ffd6c2..6287f6a59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.2.1 - 2026-07-24 + +### Added + +- Claude Opus 5 is available + ## 0.2.0 - 2026-07-24 ### Added diff --git a/package-lock.json b/package-lock.json index 6357980ff..3ef7ac8bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "paseo", - "version": "0.2.0", + "version": "0.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "paseo", - "version": "0.2.0", + "version": "0.2.1", "hasInstallScript": true, "license": "AGPL-3.0-or-later", "workspaces": [ @@ -35211,7 +35211,7 @@ }, "packages/app": { "name": "@getpaseo/app", - "version": "0.2.0", + "version": "0.2.1", "dependencies": { "@codemirror/commands": "6.10.4", "@codemirror/language": "6.12.4", @@ -36236,12 +36236,12 @@ }, "packages/cli": { "name": "@getpaseo/cli", - "version": "0.2.0", + "version": "0.2.1", "dependencies": { "@clack/prompts": "^1.0.0", - "@getpaseo/client": "0.2.0", - "@getpaseo/protocol": "0.2.0", - "@getpaseo/server": "0.2.0", + "@getpaseo/client": "0.2.1", + "@getpaseo/protocol": "0.2.1", + "@getpaseo/server": "0.2.1", "chalk": "^5.3.0", "commander": "^12.0.0", "mime-types": "^2.1.35", @@ -36488,10 +36488,10 @@ }, "packages/client": { "name": "@getpaseo/client", - "version": "0.2.0", + "version": "0.2.1", "dependencies": { - "@getpaseo/protocol": "0.2.0", - "@getpaseo/relay": "0.2.0", + "@getpaseo/protocol": "0.2.1", + "@getpaseo/relay": "0.2.1", "zod": "^4.4.3" }, "devDependencies": { @@ -36502,7 +36502,7 @@ }, "packages/desktop": { "name": "@getpaseo/desktop", - "version": "0.2.0", + "version": "0.2.1", "license": "AGPL-3.0-or-later", "dependencies": { "@getpaseo/cli": "*", @@ -36745,7 +36745,7 @@ }, "packages/expo-two-way-audio": { "name": "@getpaseo/expo-two-way-audio", - "version": "0.2.0", + "version": "0.2.1", "license": "MIT", "devDependencies": { "@types/jest": "^29.5.14", @@ -37641,7 +37641,7 @@ }, "packages/highlight": { "name": "@getpaseo/highlight", - "version": "0.2.0", + "version": "0.2.1", "dependencies": { "@codemirror/language": "6.12.4", "@codemirror/legacy-modes": "^6.5.3", @@ -37873,7 +37873,7 @@ }, "packages/protocol": { "name": "@getpaseo/protocol", - "version": "0.2.0", + "version": "0.2.1", "dependencies": { "zod": "^4.4.3" }, @@ -37886,7 +37886,7 @@ }, "packages/relay": { "name": "@getpaseo/relay", - "version": "0.2.0", + "version": "0.2.1", "dependencies": { "base64-js": "^1.5.1", "tweetnacl": "^1.0.3", @@ -38104,15 +38104,15 @@ }, "packages/server": { "name": "@getpaseo/server", - "version": "0.2.0", + "version": "0.2.1", "dependencies": { "@agentclientprotocol/sdk": "^0.17.1", "@anthropic-ai/claude-agent-sdk": "^0.3.214", "@anthropic-ai/sdk": "^0.104.2", - "@getpaseo/client": "0.2.0", - "@getpaseo/highlight": "0.2.0", - "@getpaseo/protocol": "0.2.0", - "@getpaseo/relay": "0.2.0", + "@getpaseo/client": "0.2.1", + "@getpaseo/highlight": "0.2.1", + "@getpaseo/protocol": "0.2.1", + "@getpaseo/relay": "0.2.1", "@isaacs/ttlcache": "^2.1.4", "@modelcontextprotocol/sdk": "^1.20.1", "@opencode-ai/sdk": "1.14.46", @@ -38649,7 +38649,7 @@ }, "packages/website": { "name": "@getpaseo/website", - "version": "0.2.0", + "version": "0.2.1", "dependencies": { "@cloudflare/vite-plugin": "^1.29.1", "@cloudflare/workers-types": "^4.20260317.1", diff --git a/package.json b/package.json index 17d451895..812039714 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "paseo", - "version": "0.2.0", + "version": "0.2.1", "private": true, "description": "Paseo: voice-controlled development environment for local AI coding agents", "keywords": [ diff --git a/packages/app/package.json b/packages/app/package.json index 26875c61c..2df5e0a57 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@getpaseo/app", - "version": "0.2.0", + "version": "0.2.1", "private": true, "main": "index.ts", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 15fba8ca5..96ba2e6cd 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@getpaseo/cli", - "version": "0.2.0", + "version": "0.2.1", "description": "Paseo CLI - control your AI coding agents from the command line", "bin": { "paseo": "bin/paseo" @@ -28,9 +28,9 @@ }, "dependencies": { "@clack/prompts": "^1.0.0", - "@getpaseo/client": "0.2.0", - "@getpaseo/protocol": "0.2.0", - "@getpaseo/server": "0.2.0", + "@getpaseo/client": "0.2.1", + "@getpaseo/protocol": "0.2.1", + "@getpaseo/server": "0.2.1", "chalk": "^5.3.0", "commander": "^12.0.0", "mime-types": "^2.1.35", diff --git a/packages/client/package.json b/packages/client/package.json index 769bb447f..672adae3a 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@getpaseo/client", - "version": "0.2.0", + "version": "0.2.1", "description": "Paseo client SDK package", "files": [ "dist", @@ -35,8 +35,8 @@ "test": "vitest run" }, "dependencies": { - "@getpaseo/protocol": "0.2.0", - "@getpaseo/relay": "0.2.0", + "@getpaseo/protocol": "0.2.1", + "@getpaseo/relay": "0.2.1", "zod": "^4.4.3" }, "devDependencies": { diff --git a/packages/desktop/package.json b/packages/desktop/package.json index d8d27190b..600bb8ab3 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@getpaseo/desktop", - "version": "0.2.0", + "version": "0.2.1", "private": true, "description": "Paseo desktop app (Electron wrapper)", "homepage": "https://paseo.sh", diff --git a/packages/expo-two-way-audio/package.json b/packages/expo-two-way-audio/package.json index d48a2f982..12a461c73 100644 --- a/packages/expo-two-way-audio/package.json +++ b/packages/expo-two-way-audio/package.json @@ -1,6 +1,6 @@ { "name": "@getpaseo/expo-two-way-audio", - "version": "0.2.0", + "version": "0.2.1", "description": "Native module for two way audio streaming", "keywords": [ "ExpoTwoWayAudio", diff --git a/packages/highlight/package.json b/packages/highlight/package.json index 601fe88d4..a899c1476 100644 --- a/packages/highlight/package.json +++ b/packages/highlight/package.json @@ -1,6 +1,6 @@ { "name": "@getpaseo/highlight", - "version": "0.2.0", + "version": "0.2.1", "files": [ "dist", "!dist/**/*.map" diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 80275143f..e60ef71c0 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -1,6 +1,6 @@ { "name": "@getpaseo/protocol", - "version": "0.2.0", + "version": "0.2.1", "description": "Paseo shared protocol schemas and wire types", "files": [ "dist", diff --git a/packages/relay/package.json b/packages/relay/package.json index 6af768b68..f2cac7da2 100644 --- a/packages/relay/package.json +++ b/packages/relay/package.json @@ -1,6 +1,6 @@ { "name": "@getpaseo/relay", - "version": "0.2.0", + "version": "0.2.1", "description": "Paseo relay for bridging daemon and client connections", "files": [ "dist", diff --git a/packages/server/package.json b/packages/server/package.json index 38eb24a37..61d3e3ea8 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@getpaseo/server", - "version": "0.2.0", + "version": "0.2.1", "description": "Paseo backend server", "files": [ "dist/server", @@ -67,10 +67,10 @@ "@agentclientprotocol/sdk": "^0.17.1", "@anthropic-ai/claude-agent-sdk": "^0.3.214", "@anthropic-ai/sdk": "^0.104.2", - "@getpaseo/client": "0.2.0", - "@getpaseo/highlight": "0.2.0", - "@getpaseo/protocol": "0.2.0", - "@getpaseo/relay": "0.2.0", + "@getpaseo/client": "0.2.1", + "@getpaseo/highlight": "0.2.1", + "@getpaseo/protocol": "0.2.1", + "@getpaseo/relay": "0.2.1", "@isaacs/ttlcache": "^2.1.4", "@modelcontextprotocol/sdk": "^1.20.1", "@opencode-ai/sdk": "1.14.46", diff --git a/packages/server/src/server/agent/providers/claude/agent.test.ts b/packages/server/src/server/agent/providers/claude/agent.test.ts index 50e505011..60c6cc16e 100644 --- a/packages/server/src/server/agent/providers/claude/agent.test.ts +++ b/packages/server/src/server/agent/providers/claude/agent.test.ts @@ -414,6 +414,7 @@ describe("ClaudeAgentClient.fetchCatalog", () => { }); expect(models.map((m) => m.id)).toEqual([ + "claude-opus-5", "claude-fable-5", "claude-opus-4-8[1m]", "claude-opus-4-8", @@ -433,7 +434,7 @@ describe("ClaudeAgentClient.fetchCatalog", () => { } const defaultModel = models.find((m) => m.isDefault); - expect(defaultModel?.id).toBe("claude-opus-4-8"); + expect(defaultModel?.id).toBe("claude-opus-5"); } finally { await fs.rm(emptyConfigDir, { recursive: true, force: true }); } @@ -456,6 +457,7 @@ describe("ClaudeAgentClient.fetchCatalog", () => { return models.find((model) => model.id === modelId)?.thinkingOptions?.map(({ id }) => id); }; + expect(getThinkingIds("claude-opus-5")).toContain("ultracode"); expect(getThinkingIds("claude-fable-5")).toContain("ultracode"); expect(getThinkingIds("claude-opus-4-8[1m]")).toContain("ultracode"); expect(getThinkingIds("claude-opus-4-8")).toContain("ultracode"); diff --git a/packages/server/src/server/agent/providers/claude/model-manifest.ts b/packages/server/src/server/agent/providers/claude/model-manifest.ts index 88c469ad3..b569f0da1 100644 --- a/packages/server/src/server/agent/providers/claude/model-manifest.ts +++ b/packages/server/src/server/agent/providers/claude/model-manifest.ts @@ -30,6 +30,15 @@ export const CLAUDE_DISABLED_THINKING_OPTION_ID = "off"; export const CLAUDE_ULTRACODE_THINKING_OPTION_ID = "ultracode"; export const CLAUDE_MODEL_MANIFEST = [ + { + id: "claude-opus-5", + label: "Opus 5", + description: "Opus 5 · Latest release", + isDefault: true, + contextWindowMaxTokens: 1_000_000, + effortLevels: CLAUDE_EFFORT_LEVELS.xhigh, + supportsThinkingDisabled: true, + }, { id: "claude-fable-5", label: "Fable 5", @@ -49,8 +58,7 @@ export const CLAUDE_MODEL_MANIFEST = [ { id: "claude-opus-4-8", label: "Opus 4.8", - description: "Opus 4.8 · Latest release", - isDefault: true, + description: "Opus 4.8 · Previous release", contextWindowMaxTokens: 200_000, effortLevels: CLAUDE_EFFORT_LEVELS.xhigh, supportsThinkingDisabled: true, diff --git a/packages/server/src/server/agent/providers/claude/models.test.ts b/packages/server/src/server/agent/providers/claude/models.test.ts index a62784494..5b069dce1 100644 --- a/packages/server/src/server/agent/providers/claude/models.test.ts +++ b/packages/server/src/server/agent/providers/claude/models.test.ts @@ -42,6 +42,7 @@ describe("getClaudeModels", () => { it("returns all claude models", () => { const models = getClaudeModels(); expect(models.map((m) => m.id)).toEqual([ + "claude-opus-5", "claude-fable-5", "claude-opus-4-8[1m]", "claude-opus-4-8", @@ -60,7 +61,7 @@ describe("getClaudeModels", () => { const models = getClaudeModels(); const defaults = models.filter((m) => m.isDefault); expect(defaults).toHaveLength(1); - expect(defaults[0].id).toBe("claude-opus-4-8"); + expect(defaults[0].id).toBe("claude-opus-5"); }); it("defines context window sizes in the catalog", () => { @@ -70,6 +71,7 @@ describe("getClaudeModels", () => { expect(contextWindows).toEqual( new Map([ + ["claude-opus-5", 1_000_000], ["claude-fable-5", 1_000_000], ["claude-opus-4-8[1m]", 1_000_000], ["claude-opus-4-8", 200_000], @@ -88,6 +90,15 @@ describe("getClaudeModels", () => { it("derives thinking options from model effort capabilities", () => { const models = new Map(getClaudeModels().map((model) => [model.id, model])); + expect(models.get("claude-opus-5")?.thinkingOptions?.map((option) => option.id)).toEqual([ + CLAUDE_DISABLED_THINKING_OPTION_ID, + "low", + "medium", + "high", + "xhigh", + "max", + CLAUDE_ULTRACODE_THINKING_OPTION_ID, + ]); expect(models.get("claude-sonnet-5")?.thinkingOptions?.map((option) => option.id)).toEqual([ CLAUDE_DISABLED_THINKING_OPTION_ID, "low", @@ -128,6 +139,8 @@ describe("getClaudeModels", () => { }); it.each([ + ["claude-opus-5", true, "low"], + ["claude-opus-5-20260724", true, "low"], ["claude-sonnet-5", true, "low"], ["claude-sonnet-5-20260101", true, "low"], ["claude-fable-5", false, "low"], @@ -286,6 +299,7 @@ describe("ClaudeAgentClient.fetchCatalog", () => { describe("normalizeClaudeRuntimeModelId", () => { it("returns exact match for known model IDs", () => { + expect(normalizeClaudeRuntimeModelId("claude-opus-5")).toBe("claude-opus-5"); expect(normalizeClaudeRuntimeModelId("claude-fable-5")).toBe("claude-fable-5"); expect(normalizeClaudeRuntimeModelId("claude-sonnet-5")).toBe("claude-sonnet-5"); expect(normalizeClaudeRuntimeModelId("claude-opus-4-6")).toBe("claude-opus-4-6"); @@ -295,6 +309,7 @@ describe("normalizeClaudeRuntimeModelId", () => { }); it("normalizes dated model IDs to base model", () => { + expect(normalizeClaudeRuntimeModelId("claude-opus-5-20260724")).toBe("claude-opus-5"); expect(normalizeClaudeRuntimeModelId("claude-fable-5-20260301")).toBe("claude-fable-5"); expect(normalizeClaudeRuntimeModelId("claude-sonnet-5-20260101")).toBe("claude-sonnet-5"); expect(normalizeClaudeRuntimeModelId("claude-opus-4-6-20260101")).toBe("claude-opus-4-6"); diff --git a/packages/website/package.json b/packages/website/package.json index 8835ebb24..c7b3d3b8d 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -1,6 +1,6 @@ { "name": "@getpaseo/website", - "version": "0.2.0", + "version": "0.2.1", "private": true, "type": "module", "scripts": {