Merge v0.2.1 release into main

This commit is contained in:
Mohamed Boudra
2026-07-24 22:20:25 +02:00
16 changed files with 76 additions and 45 deletions
+6
View File
@@ -1,5 +1,11 @@
# Changelog # Changelog
## 0.2.1 - 2026-07-24
### Added
- Claude Opus 5 is available
## 0.2.0 - 2026-07-24 ## 0.2.0 - 2026-07-24
### Added ### Added
+21 -21
View File
@@ -1,12 +1,12 @@
{ {
"name": "paseo", "name": "paseo",
"version": "0.2.0", "version": "0.2.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "paseo", "name": "paseo",
"version": "0.2.0", "version": "0.2.1",
"hasInstallScript": true, "hasInstallScript": true,
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"workspaces": [ "workspaces": [
@@ -35211,7 +35211,7 @@
}, },
"packages/app": { "packages/app": {
"name": "@getpaseo/app", "name": "@getpaseo/app",
"version": "0.2.0", "version": "0.2.1",
"dependencies": { "dependencies": {
"@codemirror/commands": "6.10.4", "@codemirror/commands": "6.10.4",
"@codemirror/language": "6.12.4", "@codemirror/language": "6.12.4",
@@ -36236,12 +36236,12 @@
}, },
"packages/cli": { "packages/cli": {
"name": "@getpaseo/cli", "name": "@getpaseo/cli",
"version": "0.2.0", "version": "0.2.1",
"dependencies": { "dependencies": {
"@clack/prompts": "^1.0.0", "@clack/prompts": "^1.0.0",
"@getpaseo/client": "0.2.0", "@getpaseo/client": "0.2.1",
"@getpaseo/protocol": "0.2.0", "@getpaseo/protocol": "0.2.1",
"@getpaseo/server": "0.2.0", "@getpaseo/server": "0.2.1",
"chalk": "^5.3.0", "chalk": "^5.3.0",
"commander": "^12.0.0", "commander": "^12.0.0",
"mime-types": "^2.1.35", "mime-types": "^2.1.35",
@@ -36488,10 +36488,10 @@
}, },
"packages/client": { "packages/client": {
"name": "@getpaseo/client", "name": "@getpaseo/client",
"version": "0.2.0", "version": "0.2.1",
"dependencies": { "dependencies": {
"@getpaseo/protocol": "0.2.0", "@getpaseo/protocol": "0.2.1",
"@getpaseo/relay": "0.2.0", "@getpaseo/relay": "0.2.1",
"zod": "^4.4.3" "zod": "^4.4.3"
}, },
"devDependencies": { "devDependencies": {
@@ -36502,7 +36502,7 @@
}, },
"packages/desktop": { "packages/desktop": {
"name": "@getpaseo/desktop", "name": "@getpaseo/desktop",
"version": "0.2.0", "version": "0.2.1",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"dependencies": { "dependencies": {
"@getpaseo/cli": "*", "@getpaseo/cli": "*",
@@ -36745,7 +36745,7 @@
}, },
"packages/expo-two-way-audio": { "packages/expo-two-way-audio": {
"name": "@getpaseo/expo-two-way-audio", "name": "@getpaseo/expo-two-way-audio",
"version": "0.2.0", "version": "0.2.1",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@types/jest": "^29.5.14", "@types/jest": "^29.5.14",
@@ -37641,7 +37641,7 @@
}, },
"packages/highlight": { "packages/highlight": {
"name": "@getpaseo/highlight", "name": "@getpaseo/highlight",
"version": "0.2.0", "version": "0.2.1",
"dependencies": { "dependencies": {
"@codemirror/language": "6.12.4", "@codemirror/language": "6.12.4",
"@codemirror/legacy-modes": "^6.5.3", "@codemirror/legacy-modes": "^6.5.3",
@@ -37873,7 +37873,7 @@
}, },
"packages/protocol": { "packages/protocol": {
"name": "@getpaseo/protocol", "name": "@getpaseo/protocol",
"version": "0.2.0", "version": "0.2.1",
"dependencies": { "dependencies": {
"zod": "^4.4.3" "zod": "^4.4.3"
}, },
@@ -37886,7 +37886,7 @@
}, },
"packages/relay": { "packages/relay": {
"name": "@getpaseo/relay", "name": "@getpaseo/relay",
"version": "0.2.0", "version": "0.2.1",
"dependencies": { "dependencies": {
"base64-js": "^1.5.1", "base64-js": "^1.5.1",
"tweetnacl": "^1.0.3", "tweetnacl": "^1.0.3",
@@ -38104,15 +38104,15 @@
}, },
"packages/server": { "packages/server": {
"name": "@getpaseo/server", "name": "@getpaseo/server",
"version": "0.2.0", "version": "0.2.1",
"dependencies": { "dependencies": {
"@agentclientprotocol/sdk": "^0.17.1", "@agentclientprotocol/sdk": "^0.17.1",
"@anthropic-ai/claude-agent-sdk": "^0.3.214", "@anthropic-ai/claude-agent-sdk": "^0.3.214",
"@anthropic-ai/sdk": "^0.104.2", "@anthropic-ai/sdk": "^0.104.2",
"@getpaseo/client": "0.2.0", "@getpaseo/client": "0.2.1",
"@getpaseo/highlight": "0.2.0", "@getpaseo/highlight": "0.2.1",
"@getpaseo/protocol": "0.2.0", "@getpaseo/protocol": "0.2.1",
"@getpaseo/relay": "0.2.0", "@getpaseo/relay": "0.2.1",
"@isaacs/ttlcache": "^2.1.4", "@isaacs/ttlcache": "^2.1.4",
"@modelcontextprotocol/sdk": "^1.20.1", "@modelcontextprotocol/sdk": "^1.20.1",
"@opencode-ai/sdk": "1.14.46", "@opencode-ai/sdk": "1.14.46",
@@ -38649,7 +38649,7 @@
}, },
"packages/website": { "packages/website": {
"name": "@getpaseo/website", "name": "@getpaseo/website",
"version": "0.2.0", "version": "0.2.1",
"dependencies": { "dependencies": {
"@cloudflare/vite-plugin": "^1.29.1", "@cloudflare/vite-plugin": "^1.29.1",
"@cloudflare/workers-types": "^4.20260317.1", "@cloudflare/workers-types": "^4.20260317.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "paseo", "name": "paseo",
"version": "0.2.0", "version": "0.2.1",
"private": true, "private": true,
"description": "Paseo: voice-controlled development environment for local AI coding agents", "description": "Paseo: voice-controlled development environment for local AI coding agents",
"keywords": [ "keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@getpaseo/app", "name": "@getpaseo/app",
"version": "0.2.0", "version": "0.2.1",
"private": true, "private": true,
"main": "index.ts", "main": "index.ts",
"scripts": { "scripts": {
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"name": "@getpaseo/cli", "name": "@getpaseo/cli",
"version": "0.2.0", "version": "0.2.1",
"description": "Paseo CLI - control your AI coding agents from the command line", "description": "Paseo CLI - control your AI coding agents from the command line",
"bin": { "bin": {
"paseo": "bin/paseo" "paseo": "bin/paseo"
@@ -28,9 +28,9 @@
}, },
"dependencies": { "dependencies": {
"@clack/prompts": "^1.0.0", "@clack/prompts": "^1.0.0",
"@getpaseo/client": "0.2.0", "@getpaseo/client": "0.2.1",
"@getpaseo/protocol": "0.2.0", "@getpaseo/protocol": "0.2.1",
"@getpaseo/server": "0.2.0", "@getpaseo/server": "0.2.1",
"chalk": "^5.3.0", "chalk": "^5.3.0",
"commander": "^12.0.0", "commander": "^12.0.0",
"mime-types": "^2.1.35", "mime-types": "^2.1.35",
+3 -3
View File
@@ -1,6 +1,6 @@
{ {
"name": "@getpaseo/client", "name": "@getpaseo/client",
"version": "0.2.0", "version": "0.2.1",
"description": "Paseo client SDK package", "description": "Paseo client SDK package",
"files": [ "files": [
"dist", "dist",
@@ -35,8 +35,8 @@
"test": "vitest run" "test": "vitest run"
}, },
"dependencies": { "dependencies": {
"@getpaseo/protocol": "0.2.0", "@getpaseo/protocol": "0.2.1",
"@getpaseo/relay": "0.2.0", "@getpaseo/relay": "0.2.1",
"zod": "^4.4.3" "zod": "^4.4.3"
}, },
"devDependencies": { "devDependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@getpaseo/desktop", "name": "@getpaseo/desktop",
"version": "0.2.0", "version": "0.2.1",
"private": true, "private": true,
"description": "Paseo desktop app (Electron wrapper)", "description": "Paseo desktop app (Electron wrapper)",
"homepage": "https://paseo.sh", "homepage": "https://paseo.sh",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@getpaseo/expo-two-way-audio", "name": "@getpaseo/expo-two-way-audio",
"version": "0.2.0", "version": "0.2.1",
"description": "Native module for two way audio streaming", "description": "Native module for two way audio streaming",
"keywords": [ "keywords": [
"ExpoTwoWayAudio", "ExpoTwoWayAudio",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@getpaseo/highlight", "name": "@getpaseo/highlight",
"version": "0.2.0", "version": "0.2.1",
"files": [ "files": [
"dist", "dist",
"!dist/**/*.map" "!dist/**/*.map"
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@getpaseo/protocol", "name": "@getpaseo/protocol",
"version": "0.2.0", "version": "0.2.1",
"description": "Paseo shared protocol schemas and wire types", "description": "Paseo shared protocol schemas and wire types",
"files": [ "files": [
"dist", "dist",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@getpaseo/relay", "name": "@getpaseo/relay",
"version": "0.2.0", "version": "0.2.1",
"description": "Paseo relay for bridging daemon and client connections", "description": "Paseo relay for bridging daemon and client connections",
"files": [ "files": [
"dist", "dist",
+5 -5
View File
@@ -1,6 +1,6 @@
{ {
"name": "@getpaseo/server", "name": "@getpaseo/server",
"version": "0.2.0", "version": "0.2.1",
"description": "Paseo backend server", "description": "Paseo backend server",
"files": [ "files": [
"dist/server", "dist/server",
@@ -67,10 +67,10 @@
"@agentclientprotocol/sdk": "^0.17.1", "@agentclientprotocol/sdk": "^0.17.1",
"@anthropic-ai/claude-agent-sdk": "^0.3.214", "@anthropic-ai/claude-agent-sdk": "^0.3.214",
"@anthropic-ai/sdk": "^0.104.2", "@anthropic-ai/sdk": "^0.104.2",
"@getpaseo/client": "0.2.0", "@getpaseo/client": "0.2.1",
"@getpaseo/highlight": "0.2.0", "@getpaseo/highlight": "0.2.1",
"@getpaseo/protocol": "0.2.0", "@getpaseo/protocol": "0.2.1",
"@getpaseo/relay": "0.2.0", "@getpaseo/relay": "0.2.1",
"@isaacs/ttlcache": "^2.1.4", "@isaacs/ttlcache": "^2.1.4",
"@modelcontextprotocol/sdk": "^1.20.1", "@modelcontextprotocol/sdk": "^1.20.1",
"@opencode-ai/sdk": "1.14.46", "@opencode-ai/sdk": "1.14.46",
@@ -414,6 +414,7 @@ describe("ClaudeAgentClient.fetchCatalog", () => {
}); });
expect(models.map((m) => m.id)).toEqual([ expect(models.map((m) => m.id)).toEqual([
"claude-opus-5",
"claude-fable-5", "claude-fable-5",
"claude-opus-4-8[1m]", "claude-opus-4-8[1m]",
"claude-opus-4-8", "claude-opus-4-8",
@@ -433,7 +434,7 @@ describe("ClaudeAgentClient.fetchCatalog", () => {
} }
const defaultModel = models.find((m) => m.isDefault); const defaultModel = models.find((m) => m.isDefault);
expect(defaultModel?.id).toBe("claude-opus-4-8"); expect(defaultModel?.id).toBe("claude-opus-5");
} finally { } finally {
await fs.rm(emptyConfigDir, { recursive: true, force: true }); 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); 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-fable-5")).toContain("ultracode");
expect(getThinkingIds("claude-opus-4-8[1m]")).toContain("ultracode"); expect(getThinkingIds("claude-opus-4-8[1m]")).toContain("ultracode");
expect(getThinkingIds("claude-opus-4-8")).toContain("ultracode"); expect(getThinkingIds("claude-opus-4-8")).toContain("ultracode");
@@ -30,6 +30,15 @@ export const CLAUDE_DISABLED_THINKING_OPTION_ID = "off";
export const CLAUDE_ULTRACODE_THINKING_OPTION_ID = "ultracode"; export const CLAUDE_ULTRACODE_THINKING_OPTION_ID = "ultracode";
export const CLAUDE_MODEL_MANIFEST = [ 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", id: "claude-fable-5",
label: "Fable 5", label: "Fable 5",
@@ -49,8 +58,7 @@ export const CLAUDE_MODEL_MANIFEST = [
{ {
id: "claude-opus-4-8", id: "claude-opus-4-8",
label: "Opus 4.8", label: "Opus 4.8",
description: "Opus 4.8 · Latest release", description: "Opus 4.8 · Previous release",
isDefault: true,
contextWindowMaxTokens: 200_000, contextWindowMaxTokens: 200_000,
effortLevels: CLAUDE_EFFORT_LEVELS.xhigh, effortLevels: CLAUDE_EFFORT_LEVELS.xhigh,
supportsThinkingDisabled: true, supportsThinkingDisabled: true,
@@ -42,6 +42,7 @@ describe("getClaudeModels", () => {
it("returns all claude models", () => { it("returns all claude models", () => {
const models = getClaudeModels(); const models = getClaudeModels();
expect(models.map((m) => m.id)).toEqual([ expect(models.map((m) => m.id)).toEqual([
"claude-opus-5",
"claude-fable-5", "claude-fable-5",
"claude-opus-4-8[1m]", "claude-opus-4-8[1m]",
"claude-opus-4-8", "claude-opus-4-8",
@@ -60,7 +61,7 @@ describe("getClaudeModels", () => {
const models = getClaudeModels(); const models = getClaudeModels();
const defaults = models.filter((m) => m.isDefault); const defaults = models.filter((m) => m.isDefault);
expect(defaults).toHaveLength(1); 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", () => { it("defines context window sizes in the catalog", () => {
@@ -70,6 +71,7 @@ describe("getClaudeModels", () => {
expect(contextWindows).toEqual( expect(contextWindows).toEqual(
new Map([ new Map([
["claude-opus-5", 1_000_000],
["claude-fable-5", 1_000_000], ["claude-fable-5", 1_000_000],
["claude-opus-4-8[1m]", 1_000_000], ["claude-opus-4-8[1m]", 1_000_000],
["claude-opus-4-8", 200_000], ["claude-opus-4-8", 200_000],
@@ -88,6 +90,15 @@ describe("getClaudeModels", () => {
it("derives thinking options from model effort capabilities", () => { it("derives thinking options from model effort capabilities", () => {
const models = new Map(getClaudeModels().map((model) => [model.id, model])); 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([ expect(models.get("claude-sonnet-5")?.thinkingOptions?.map((option) => option.id)).toEqual([
CLAUDE_DISABLED_THINKING_OPTION_ID, CLAUDE_DISABLED_THINKING_OPTION_ID,
"low", "low",
@@ -128,6 +139,8 @@ describe("getClaudeModels", () => {
}); });
it.each([ it.each([
["claude-opus-5", true, "low"],
["claude-opus-5-20260724", true, "low"],
["claude-sonnet-5", true, "low"], ["claude-sonnet-5", true, "low"],
["claude-sonnet-5-20260101", true, "low"], ["claude-sonnet-5-20260101", true, "low"],
["claude-fable-5", false, "low"], ["claude-fable-5", false, "low"],
@@ -286,6 +299,7 @@ describe("ClaudeAgentClient.fetchCatalog", () => {
describe("normalizeClaudeRuntimeModelId", () => { describe("normalizeClaudeRuntimeModelId", () => {
it("returns exact match for known model IDs", () => { 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-fable-5")).toBe("claude-fable-5");
expect(normalizeClaudeRuntimeModelId("claude-sonnet-5")).toBe("claude-sonnet-5"); expect(normalizeClaudeRuntimeModelId("claude-sonnet-5")).toBe("claude-sonnet-5");
expect(normalizeClaudeRuntimeModelId("claude-opus-4-6")).toBe("claude-opus-4-6"); 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", () => { 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-fable-5-20260301")).toBe("claude-fable-5");
expect(normalizeClaudeRuntimeModelId("claude-sonnet-5-20260101")).toBe("claude-sonnet-5"); expect(normalizeClaudeRuntimeModelId("claude-sonnet-5-20260101")).toBe("claude-sonnet-5");
expect(normalizeClaudeRuntimeModelId("claude-opus-4-6-20260101")).toBe("claude-opus-4-6"); expect(normalizeClaudeRuntimeModelId("claude-opus-4-6-20260101")).toBe("claude-opus-4-6");
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@getpaseo/website", "name": "@getpaseo/website",
"version": "0.2.0", "version": "0.2.1",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {