From ed8a6fefadb7260801bc77d76e6f31174e911065 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Mon, 8 Jun 2026 13:59:44 +0700 Subject: [PATCH] Migrate workspace schemas to zod 4 --- package-lock.json | 147 ++++---- packages/app/package.json | 2 +- .../create-agent-preferences/preferences.ts | 6 +- packages/client/package.json | 2 +- packages/client/src/daemon-client.test.ts | 2 +- packages/desktop/package.json | 2 +- packages/protocol/package.json | 2 +- packages/protocol/src/messages.ts | 335 +++++++++--------- packages/protocol/src/provider-config.ts | 8 +- packages/protocol/src/schedule/types.ts | 8 +- packages/server/package.json | 3 +- .../server/scripts/test-codex-mcp-servers.ts | 2 +- .../server/src/server/agent/agent-manager.ts | 2 +- .../server/agent/agent-metadata-generator.ts | 2 +- .../agent-response-loop.real.e2e.test.ts | 2 +- .../server/agent/agent-response-loop.test.ts | 2 +- .../src/server/agent/agent-response-loop.ts | 2 +- .../server/src/server/agent/agent-storage.ts | 14 +- .../src/server/agent/import-sessions.ts | 2 +- .../src/server/agent/mcp-parity.e2e.test.ts | 10 +- .../src/server/agent/mcp-server.test.ts | 8 +- .../server/src/server/agent/mcp-server.ts | 11 +- .../server/src/server/agent/mcp-shared.ts | 2 +- .../providers/claude/project-dir.test.ts | 4 +- .../agent/providers/claude/project-dir.ts | 16 +- .../claude/task-notification-tool-call.ts | 2 +- .../claude/tool-call-detail-parser.ts | 2 +- .../providers/claude/tool-call-mapper.ts | 2 +- .../agent/providers/codex-app-server-agent.ts | 2 +- .../providers/codex/app-server-transport.ts | 2 +- .../codex/tool-call-detail-parser.ts | 2 +- .../agent/providers/codex/tool-call-mapper.ts | 2 +- .../server/agent/providers/opencode-agent.ts | 2 +- .../opencode/tool-call-detail-parser.ts | 2 +- .../providers/opencode/tool-call-mapper.ts | 2 +- .../agent/providers/pi/tool-call-mapper.ts | 2 +- .../providers/tool-call-detail-primitives.ts | 36 +- .../server/src/server/chat/chat-service.ts | 2 +- packages/server/src/server/config.ts | 2 +- .../daemon-e2e/checkout-pr-merge.e2e.test.ts | 2 +- packages/server/src/server/daemon-keypair.ts | 2 +- packages/server/src/server/loop-service.ts | 2 +- packages/server/src/server/package-version.ts | 2 +- .../server/src/server/persisted-config.ts | 2 +- packages/server/src/server/pid-lock.ts | 2 +- packages/server/src/server/session.ts | 2 +- .../src/server/session.workspaces.test.ts | 2 +- .../server/speech/providers/local/config.ts | 10 +- .../providers/local/sherpa/model-catalog.ts | 6 +- .../server/speech/providers/openai/config.ts | 6 +- .../server/speech/speech-config-resolver.ts | 2 +- .../server/src/server/speech/speech-types.ts | 2 +- .../websocket-server.relay-reconnect.test.ts | 2 +- .../server/src/server/websocket-server.ts | 2 +- .../server/src/server/wire-compat.test.ts | 2 +- .../server/src/server/workspace-registry.ts | 6 +- .../server/worktree-branch-name-generator.ts | 2 +- .../server/src/services/github-service.ts | 2 +- .../server/src/utils/tool-call-parsers.ts | 2 +- .../server/src/utils/worktree-metadata.ts | 2 +- 60 files changed, 378 insertions(+), 342 deletions(-) diff --git a/package-lock.json b/package-lock.json index 06e901cbc..cc9d08748 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4992,6 +4992,16 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/@expo/eas-build-job/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@expo/eas-json": { "version": "16.30.0", "resolved": "https://registry.npmjs.org/@expo/eas-json/-/eas-json-16.30.0.tgz", @@ -5185,6 +5195,16 @@ "dev": true, "license": "0BSD" }, + "node_modules/@expo/eas-json/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@expo/env": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@expo/env/-/env-1.0.7.tgz", @@ -6413,6 +6433,16 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/@expo/steps/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@expo/sudo-prompt": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", @@ -12052,15 +12082,6 @@ "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/@tanstack/router-generator/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/@tanstack/router-plugin": { "version": "1.167.35", "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.167.35.tgz", @@ -12113,15 +12134,6 @@ } } }, - "node_modules/@tanstack/router-plugin/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/@tanstack/router-utils": { "version": "1.161.8", "resolved": "https://registry.npmjs.org/@tanstack/router-utils/-/router-utils-1.161.8.tgz", @@ -12471,15 +12483,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@tanstack/start-plugin-core/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/@tanstack/start-server-core": { "version": "1.167.30", "resolved": "https://registry.npmjs.org/@tanstack/start-server-core/-/start-server-core-1.167.30.tgz", @@ -18225,6 +18228,16 @@ "node": ">= 14" } }, + "node_modules/eas-cli/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -21184,16 +21197,6 @@ "node": ">=0.10.0" } }, - "node_modules/expo-module-scripts/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/expo-modules-autolinking": { "version": "3.0.24", "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", @@ -26138,6 +26141,16 @@ "typescript": ">=5.0.4 <7" } }, + "node_modules/knip/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/lan-network": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", @@ -36793,9 +36806,9 @@ } }, "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -36823,16 +36836,6 @@ "zod": "^3.18.0" } }, - "node_modules/zod3": { - "name": "zod", - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/zustand": { "version": "5.0.11", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.11.tgz", @@ -36962,7 +36965,7 @@ "react-native-worklets": "~0.8.3", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.6.0", - "zod": "^3.23.8", + "zod": "^4.1.8", "zustand": "^5.0.9" }, "devDependencies": { @@ -37102,9 +37105,9 @@ } }, "packages/app/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -37367,7 +37370,7 @@ "dependencies": { "@getpaseo/protocol": "0.1.91-beta.2", "@getpaseo/relay": "0.1.91-beta.2", - "zod": "^3.23.8" + "zod": "^4.1.8" }, "devDependencies": { "@types/node": "^20.9.0", @@ -37376,9 +37379,9 @@ } }, "packages/client/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -37394,7 +37397,7 @@ "electron-log": "^5.4.3", "electron-updater": "^6.6.2", "ws": "^8.14.2", - "zod": "^3.23.8" + "zod": "^4.1.8" }, "devDependencies": { "@types/node": "24.6.0", @@ -37628,9 +37631,9 @@ } }, "packages/desktop/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -37907,7 +37910,7 @@ "name": "@getpaseo/protocol", "version": "0.1.91-beta.2", "dependencies": { - "zod": "^3.23.8" + "zod": "^4.1.8" }, "devDependencies": { "@types/node": "^20.9.0", @@ -37916,9 +37919,9 @@ } }, "packages/protocol/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -38180,8 +38183,7 @@ "which": "^5.0.0", "ws": "^8.14.2", "zod": "^4.1.8", - "zod-to-json-schema": "^3.25.1", - "zod3": "npm:zod@^3.25.76" + "zod-to-json-schema": "^3.25.1" }, "devDependencies": { "@playwright/test": "^1.56.1", @@ -38910,6 +38912,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/server/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "packages/website": { "name": "@getpaseo/website", "version": "0.1.91-beta.2", diff --git a/packages/app/package.json b/packages/app/package.json index f030d1de4..b91662fcc 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -104,7 +104,7 @@ "react-native-worklets": "~0.8.3", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.6.0", - "zod": "^3.23.8", + "zod": "^4.1.8", "zustand": "^5.0.9" }, "devDependencies": { diff --git a/packages/app/src/create-agent-preferences/preferences.ts b/packages/app/src/create-agent-preferences/preferences.ts index 24405acb6..e9c42b6d9 100644 --- a/packages/app/src/create-agent-preferences/preferences.ts +++ b/packages/app/src/create-agent-preferences/preferences.ts @@ -18,13 +18,13 @@ export interface FavoriteModelRow { const providerPreferencesSchema = z.object({ model: z.string().optional(), mode: z.string().optional(), - thinkingByModel: z.record(z.string()).optional(), - featureValues: z.record(z.unknown()).optional(), + thinkingByModel: z.record(z.string(), z.string()).optional(), + featureValues: z.record(z.string(), z.unknown()).optional(), }); const formPreferencesSchema = z.object({ provider: z.string().optional(), - providerPreferences: z.record(providerPreferencesSchema).optional(), + providerPreferences: z.record(z.string(), providerPreferencesSchema).optional(), favoriteModels: z .array( z.object({ diff --git a/packages/client/package.json b/packages/client/package.json index fedd9c08a..2ef930869 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -37,7 +37,7 @@ "dependencies": { "@getpaseo/protocol": "0.1.91-beta.2", "@getpaseo/relay": "0.1.91-beta.2", - "zod": "^3.23.8" + "zod": "^4.1.8" }, "devDependencies": { "@types/node": "^20.9.0", diff --git a/packages/client/src/daemon-client.test.ts b/packages/client/src/daemon-client.test.ts index b3ea3f2fc..7ef5d7b70 100644 --- a/packages/client/src/daemon-client.test.ts +++ b/packages/client/src/daemon-client.test.ts @@ -116,7 +116,7 @@ function parseSentFrame( return z .object({ type: z.literal("session"), - message: z.record(z.unknown()), + message: z.record(z.string(), z.unknown()), }) .parse(JSON.parse(assertStr(data))).message; } diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 5a57fa13b..6d7504893 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -28,7 +28,7 @@ "electron-log": "^5.4.3", "electron-updater": "^6.6.2", "ws": "^8.14.2", - "zod": "^3.23.8" + "zod": "^4.1.8" }, "devDependencies": { "@types/node": "24.6.0", diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 381e92921..bc15bba40 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -26,7 +26,7 @@ "test": "vitest run" }, "dependencies": { - "zod": "^3.23.8" + "zod": "^4.1.8" }, "devDependencies": { "@types/node": "^20.9.0", diff --git a/packages/protocol/src/messages.ts b/packages/protocol/src/messages.ts index cff305f13..1e9b0dbb5 100644 --- a/packages/protocol/src/messages.ts +++ b/packages/protocol/src/messages.ts @@ -182,7 +182,7 @@ const AgentSelectOptionSchema = z.object({ label: z.string(), description: z.string().optional(), isDefault: z.boolean().optional(), - metadata: z.record(z.unknown()).optional(), + metadata: z.record(z.string(), z.unknown()).optional(), }); export const AgentFeatureToggleSchema = z.object({ @@ -218,7 +218,7 @@ const AgentModelDefinitionSchema: z.ZodType = z label: z.string(), description: z.string().optional(), isDefault: z.boolean().optional(), - metadata: z.record(z.unknown()).optional(), + metadata: z.record(z.string(), z.unknown()).optional(), thinkingOptions: z.array(AgentSelectOptionSchema).optional(), defaultThinkingOptionId: z.string().optional(), }) @@ -265,21 +265,21 @@ const McpStdioServerConfigSchema = z.object({ type: z.literal("stdio"), command: z.string(), args: z.array(z.string()).optional(), - env: z.record(z.string()).optional(), + env: z.record(z.string(), z.string()).optional(), alwaysLoad: z.boolean().optional(), }); const McpHttpServerConfigSchema = z.object({ type: z.literal("http"), url: z.string(), - headers: z.record(z.string()).optional(), + headers: z.record(z.string(), z.string()).optional(), alwaysLoad: z.boolean().optional(), }); const McpSseServerConfigSchema = z.object({ type: z.literal("sse"), url: z.string(), - headers: z.record(z.string()).optional(), + headers: z.record(z.string(), z.string()).optional(), alwaysLoad: z.boolean().optional(), }); @@ -295,7 +295,7 @@ const AgentSessionConfigSchema = z.object({ modeId: z.string().optional(), model: z.string().optional(), thinkingOptionId: z.string().optional(), - featureValues: z.record(z.unknown()).optional(), + featureValues: z.record(z.string(), z.unknown()).optional(), title: z.string().trim().min(1).max(MAX_EXPLICIT_AGENT_TITLE_CHARS).optional().nullable(), approvalPolicy: z.string().optional(), sandboxMode: z.string().optional(), @@ -303,16 +303,16 @@ const AgentSessionConfigSchema = z.object({ webSearch: z.boolean().optional(), extra: z .object({ - codex: z.record(z.unknown()).optional(), - claude: z.record(z.unknown()).optional(), + codex: z.record(z.string(), z.unknown()).optional(), + claude: z.record(z.string(), z.unknown()).optional(), }) .partial() .optional(), systemPrompt: z.string().optional(), - mcpServers: z.record(McpServerConfigSchema).optional(), + mcpServers: z.record(z.string(), McpServerConfigSchema).optional(), }); -const AgentPermissionUpdateSchema = z.record(z.unknown()); +const AgentPermissionUpdateSchema = z.record(z.string(), z.unknown()); const AgentPermissionActionSchema = z.object({ id: z.string(), label: z.string(), @@ -325,7 +325,7 @@ export const AgentPermissionResponseSchema: z.ZodType = z.object({ behavior: z.literal("allow"), selectedActionId: z.string().optional(), - updatedInput: z.record(z.unknown()).optional(), + updatedInput: z.record(z.string(), z.unknown()).optional(), updatedPermissions: z.array(AgentPermissionUpdateSchema).optional(), }), z.object({ @@ -336,22 +336,18 @@ export const AgentPermissionResponseSchema: z.ZodType = }), ]); -export const AgentPermissionRequestPayloadSchema: z.ZodType< - AgentPermissionRequest, - z.ZodTypeDef, - unknown -> = z.object({ +export const AgentPermissionRequestPayloadSchema: z.ZodType = z.object({ id: z.string(), provider: AgentProviderSchema, name: z.string(), kind: z.enum(["tool", "plan", "question", "mode", "other"]), title: z.string().optional(), description: z.string().optional(), - input: z.record(z.unknown()).optional(), + input: z.record(z.string(), z.unknown()).optional(), detail: z.lazy(() => ToolCallDetailPayloadSchema).optional(), suggestions: z.array(AgentPermissionUpdateSchema).optional(), actions: z.array(AgentPermissionActionSchema).optional(), - metadata: z.record(z.unknown()).optional(), + metadata: z.record(z.string(), z.unknown()).optional(), }); const UnknownValueSchema = z.union([ @@ -390,102 +386,101 @@ const WorktreeSetupDetailPayloadSchema = z.object({ truncated: z.boolean().optional(), }); -const ToolCallDetailPayloadSchema: z.ZodType = - z.discriminatedUnion("type", [ - WorktreeSetupDetailPayloadSchema, - z.object({ - type: z.literal("shell"), - command: z.string(), - cwd: z.string().optional(), - output: z.string().optional(), - exitCode: z.number().nullable().optional(), - }), - z.object({ - type: z.literal("read"), - filePath: z.string(), - content: z.string().optional(), - offset: z.number().optional(), - limit: z.number().optional(), - }), - z.object({ - type: z.literal("edit"), - filePath: z.string(), - oldString: z.string().optional(), - newString: z.string().optional(), - unifiedDiff: z.string().optional(), - }), - z.object({ - type: z.literal("write"), - filePath: z.string(), - content: z.string().optional(), - }), - z.object({ - type: z.literal("search"), - query: z.string(), - toolName: z.enum(["search", "grep", "glob", "web_search"]).optional(), - content: z.string().optional(), - filePaths: z.array(z.string()).optional(), - webResults: z - .array( - z.object({ - title: z.string(), - url: z.string(), - }), - ) - .optional(), - annotations: z.array(z.string()).optional(), - numFiles: z.number().optional(), - numMatches: z.number().optional(), - durationMs: z.number().optional(), - durationSeconds: z.number().optional(), - truncated: z.boolean().optional(), - mode: z.enum(["content", "files_with_matches", "count"]).optional(), - }), - z.object({ - type: z.literal("fetch"), - url: z.string(), - prompt: z.string().optional(), - result: z.string().optional(), - code: z.number().optional(), - codeText: z.string().optional(), - bytes: z.number().optional(), - durationMs: z.number().optional(), - }), - z.object({ - type: z.literal("sub_agent"), - subAgentType: z.string().optional(), - description: z.string().optional(), - childSessionId: z.string().optional(), - log: z.string(), - // Compat cruft for clients <= 0.1.65-beta.3 that required this field. Producers still - // emit `[]`; nothing reads it. Drop the field (and the `[]` emissions) once those - // clients are no longer in the field. - actions: z - .array( - z.object({ - index: z.number().int().positive(), - toolName: z.string(), - summary: z.string().optional(), - }), - ) - .optional(), - }), - z.object({ - type: z.literal("plain_text"), - label: z.string().optional(), - text: z.string().optional(), - icon: z.enum(TOOL_CALL_ICON_NAMES).optional(), - }), - z.object({ - type: z.literal("plan"), - text: z.string(), - }), - z.object({ - type: z.literal("unknown"), - input: UnknownValueSchema, - output: UnknownValueSchema, - }), - ]); +const ToolCallDetailPayloadSchema: z.ZodType = z.discriminatedUnion("type", [ + WorktreeSetupDetailPayloadSchema, + z.object({ + type: z.literal("shell"), + command: z.string(), + cwd: z.string().optional(), + output: z.string().optional(), + exitCode: z.number().nullable().optional(), + }), + z.object({ + type: z.literal("read"), + filePath: z.string(), + content: z.string().optional(), + offset: z.number().optional(), + limit: z.number().optional(), + }), + z.object({ + type: z.literal("edit"), + filePath: z.string(), + oldString: z.string().optional(), + newString: z.string().optional(), + unifiedDiff: z.string().optional(), + }), + z.object({ + type: z.literal("write"), + filePath: z.string(), + content: z.string().optional(), + }), + z.object({ + type: z.literal("search"), + query: z.string(), + toolName: z.enum(["search", "grep", "glob", "web_search"]).optional(), + content: z.string().optional(), + filePaths: z.array(z.string()).optional(), + webResults: z + .array( + z.object({ + title: z.string(), + url: z.string(), + }), + ) + .optional(), + annotations: z.array(z.string()).optional(), + numFiles: z.number().optional(), + numMatches: z.number().optional(), + durationMs: z.number().optional(), + durationSeconds: z.number().optional(), + truncated: z.boolean().optional(), + mode: z.enum(["content", "files_with_matches", "count"]).optional(), + }), + z.object({ + type: z.literal("fetch"), + url: z.string(), + prompt: z.string().optional(), + result: z.string().optional(), + code: z.number().optional(), + codeText: z.string().optional(), + bytes: z.number().optional(), + durationMs: z.number().optional(), + }), + z.object({ + type: z.literal("sub_agent"), + subAgentType: z.string().optional(), + description: z.string().optional(), + childSessionId: z.string().optional(), + log: z.string(), + // Compat cruft for clients <= 0.1.65-beta.3 that required this field. Producers still + // emit `[]`; nothing reads it. Drop the field (and the `[]` emissions) once those + // clients are no longer in the field. + actions: z + .array( + z.object({ + index: z.number().int().positive(), + toolName: z.string(), + summary: z.string().optional(), + }), + ) + .optional(), + }), + z.object({ + type: z.literal("plain_text"), + label: z.string().optional(), + text: z.string().optional(), + icon: z.enum(TOOL_CALL_ICON_NAMES).optional(), + }), + z.object({ + type: z.literal("plan"), + text: z.string(), + }), + z.object({ + type: z.literal("unknown"), + input: UnknownValueSchema, + output: UnknownValueSchema, + }), +]); const ToolCallBasePayloadSchema = z.object({ type: z.literal("tool_call"), @@ -515,51 +510,49 @@ const ToolCallCanceledPayloadSchema = ToolCallBasePayloadSchema.extend({ error: z.null(), }); -const ToolCallTimelineItemPayloadSchema: z.ZodType = - z.union([ - ToolCallRunningPayloadSchema, - ToolCallCompletedPayloadSchema, - ToolCallFailedPayloadSchema, - ToolCallCanceledPayloadSchema, - ]); +const ToolCallTimelineItemPayloadSchema: z.ZodType = z.union([ + ToolCallRunningPayloadSchema, + ToolCallCompletedPayloadSchema, + ToolCallFailedPayloadSchema, + ToolCallCanceledPayloadSchema, +]); -export const AgentTimelineItemPayloadSchema: z.ZodType = - z.union([ - z.object({ - type: z.literal("user_message"), - text: z.string(), - messageId: z.string().optional(), - }), - z.object({ - type: z.literal("assistant_message"), - text: z.string(), - messageId: z.string().optional(), - }), - z.object({ - type: z.literal("reasoning"), - text: z.string(), - }), - ToolCallTimelineItemPayloadSchema, - z.object({ - type: z.literal("todo"), - items: z.array( - z.object({ - text: z.string(), - completed: z.boolean(), - }), - ), - }), - z.object({ - type: z.literal("error"), - message: z.string(), - }), - z.object({ - type: z.literal("compaction"), - status: z.enum(["loading", "completed"]), - trigger: z.enum(["auto", "manual"]).optional(), - preTokens: z.number().optional(), - }), - ]); +export const AgentTimelineItemPayloadSchema: z.ZodType = z.union([ + z.object({ + type: z.literal("user_message"), + text: z.string(), + messageId: z.string().optional(), + }), + z.object({ + type: z.literal("assistant_message"), + text: z.string(), + messageId: z.string().optional(), + }), + z.object({ + type: z.literal("reasoning"), + text: z.string(), + }), + ToolCallTimelineItemPayloadSchema, + z.object({ + type: z.literal("todo"), + items: z.array( + z.object({ + text: z.string(), + completed: z.boolean(), + }), + ), + }), + z.object({ + type: z.literal("error"), + message: z.string(), + }), + z.object({ + type: z.literal("compaction"), + status: z.enum(["loading", "completed"]), + trigger: z.enum(["auto", "manual"]).optional(), + preTokens: z.number().optional(), + }), +]); export const AgentStreamEventPayloadSchema = z.discriminatedUnion("type", [ z.object({ @@ -734,7 +727,7 @@ export const AudioPlayedMessageSchema = z.object({ }); const AgentDirectoryFilterSchema = z.object({ - labels: z.record(z.string()).optional(), + labels: z.record(z.string(), z.string()).optional(), projectKeys: z.array(z.string()).optional(), statuses: z.array(AgentStatusSchema).optional(), includeArchived: z.boolean().optional(), @@ -765,7 +758,7 @@ export const UpdateAgentRequestMessageSchema = z.object({ type: z.literal("update_agent_request"), agentId: z.string(), name: z.string().optional(), - labels: z.record(z.string()).optional(), + labels: z.record(z.string(), z.string()).optional(), requestId: z.string(), }); @@ -1108,18 +1101,18 @@ export type CreateAgentWorktreeTarget = z.infer { const builtinProviderIdSet = new Set(BUILTIN_PROVIDER_IDS); const validExtendsValues = new Set([...BUILTIN_PROVIDER_IDS, "acp"]); @@ -110,7 +110,7 @@ export const ProviderOverridesSchema = z }); export const AgentProviderRuntimeSettingsMapSchema = z - .record(ProviderRuntimeSettingsSchema) + .record(z.string(), ProviderRuntimeSettingsSchema) .superRefine((providers, ctx) => { for (const providerId of Object.keys(providers)) { const parsedProviderId = AgentProviderSchema.safeParse(providerId); diff --git a/packages/protocol/src/schedule/types.ts b/packages/protocol/src/schedule/types.ts index 44129f77a..5ff799193 100644 --- a/packages/protocol/src/schedule/types.ts +++ b/packages/protocol/src/schedule/types.ts @@ -35,16 +35,16 @@ export const ScheduleTargetSchema = z.discriminatedUnion("type", [ sandboxMode: z.string().trim().min(1).optional(), networkAccess: z.boolean().optional(), webSearch: z.boolean().optional(), - featureValues: z.record(z.unknown()).optional(), + featureValues: z.record(z.string(), z.unknown()).optional(), extra: z .object({ - codex: z.record(z.unknown()).optional(), - claude: z.record(z.unknown()).optional(), + codex: z.record(z.string(), z.unknown()).optional(), + claude: z.record(z.string(), z.unknown()).optional(), }) .partial() .optional(), systemPrompt: z.string().optional(), - mcpServers: z.record(z.unknown()).optional(), + mcpServers: z.record(z.string(), z.unknown()).optional(), }), }), ]); diff --git a/packages/server/package.json b/packages/server/package.json index 0685d9be0..14836c098 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -91,8 +91,7 @@ "which": "^5.0.0", "ws": "^8.14.2", "zod": "^4.1.8", - "zod-to-json-schema": "^3.25.1", - "zod3": "npm:zod@^3.25.76" + "zod-to-json-schema": "^3.25.1" }, "devDependencies": { "@playwright/test": "^1.56.1", diff --git a/packages/server/scripts/test-codex-mcp-servers.ts b/packages/server/scripts/test-codex-mcp-servers.ts index 323430f81..f5e98a9e4 100644 --- a/packages/server/scripts/test-codex-mcp-servers.ts +++ b/packages/server/scripts/test-codex-mcp-servers.ts @@ -1,6 +1,6 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"; -import { z } from "zod3"; +import { z } from "zod"; async function main() { const transport = new StdioClientTransport({ diff --git a/packages/server/src/server/agent/agent-manager.ts b/packages/server/src/server/agent/agent-manager.ts index 6e7fe91cb..dc6d61480 100644 --- a/packages/server/src/server/agent/agent-manager.ts +++ b/packages/server/src/server/agent/agent-manager.ts @@ -7,7 +7,7 @@ import { } from "@getpaseo/protocol/agent-lifecycle"; import { isDelegatedAgent, PARENT_AGENT_ID_LABEL } from "@getpaseo/protocol/agent-labels"; import type { Logger } from "pino"; -import { z } from "zod3"; +import { z } from "zod"; import type { TerminalManager } from "../../terminal/terminal-manager.js"; import { diff --git a/packages/server/src/server/agent/agent-metadata-generator.ts b/packages/server/src/server/agent/agent-metadata-generator.ts index bc8f51acf..35035b3fc 100644 --- a/packages/server/src/server/agent/agent-metadata-generator.ts +++ b/packages/server/src/server/agent/agent-metadata-generator.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { Logger } from "pino"; import type { AgentManager } from "./agent-manager.js"; diff --git a/packages/server/src/server/agent/agent-response-loop.real.e2e.test.ts b/packages/server/src/server/agent/agent-response-loop.real.e2e.test.ts index 725534a7b..ec9dbfdb1 100644 --- a/packages/server/src/server/agent/agent-response-loop.real.e2e.test.ts +++ b/packages/server/src/server/agent/agent-response-loop.real.e2e.test.ts @@ -4,7 +4,7 @@ import { mkdtempSync, rmSync } from "fs"; import { tmpdir } from "os"; import path from "path"; import { randomUUID } from "crypto"; -import { z } from "zod3"; +import { z } from "zod"; import express from "express"; import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js"; diff --git a/packages/server/src/server/agent/agent-response-loop.test.ts b/packages/server/src/server/agent/agent-response-loop.test.ts index 10691404c..5e2b84d59 100644 --- a/packages/server/src/server/agent/agent-response-loop.test.ts +++ b/packages/server/src/server/agent/agent-response-loop.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { z } from "zod3"; +import { z } from "zod"; import { getStructuredAgentResponse, generateStructuredAgentResponseWithFallback, diff --git a/packages/server/src/server/agent/agent-response-loop.ts b/packages/server/src/server/agent/agent-response-loop.ts index c6985fac0..ac72af9c4 100644 --- a/packages/server/src/server/agent/agent-response-loop.ts +++ b/packages/server/src/server/agent/agent-response-loop.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import { zodToJsonSchema } from "zod-to-json-schema"; import Ajv, { type ErrorObject, type Options as AjvOptions } from "ajv"; import type { AgentProvider, AgentSessionConfig } from "./agent-sdk-types.js"; diff --git a/packages/server/src/server/agent/agent-storage.ts b/packages/server/src/server/agent/agent-storage.ts index 6c02fb5b1..22c61268b 100644 --- a/packages/server/src/server/agent/agent-storage.ts +++ b/packages/server/src/server/agent/agent-storage.ts @@ -1,6 +1,6 @@ import { promises as fs } from "node:fs"; import path from "node:path"; -import { z } from "zod3"; +import { z } from "zod"; import type { Logger } from "pino"; import { writeJsonFileAtomic } from "../atomic-file.js"; @@ -14,10 +14,10 @@ const SERIALIZABLE_CONFIG_SCHEMA = z modeId: z.string().nullable().optional(), model: z.string().nullable().optional(), thinkingOptionId: z.string().nullable().optional(), - featureValues: z.record(z.unknown()).nullable().optional(), - extra: z.record(z.any()).nullable().optional(), + featureValues: z.record(z.string(), z.unknown()).nullable().optional(), + extra: z.record(z.string(), z.any()).nullable().optional(), systemPrompt: z.string().nullable().optional(), - mcpServers: z.record(z.any()).nullable().optional(), + mcpServers: z.record(z.string(), z.any()).nullable().optional(), }) .nullable() .optional(); @@ -27,7 +27,7 @@ const PERSISTENCE_HANDLE_SCHEMA = z provider: z.string(), sessionId: z.string(), nativeHandle: z.any().optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }) .nullable() .optional(); @@ -41,7 +41,7 @@ const STORED_AGENT_SCHEMA = z.object({ lastActivityAt: z.string().optional(), lastUserMessageAt: z.string().nullable().optional(), title: z.string().nullable().optional(), - labels: z.record(z.string()).default({}), + labels: z.record(z.string(), z.string()).default({}), lastStatus: AgentStatusSchema.default("closed"), lastModeId: z.string().nullable().optional(), config: SERIALIZABLE_CONFIG_SCHEMA, @@ -52,7 +52,7 @@ const STORED_AGENT_SCHEMA = z.object({ model: z.string().nullable().optional(), thinkingOptionId: z.string().nullable().optional(), modeId: z.string().nullable().optional(), - extra: z.record(z.unknown()).optional(), + extra: z.record(z.string(), z.unknown()).optional(), }) .optional(), features: z.array(AgentFeatureSchema).optional(), diff --git a/packages/server/src/server/agent/import-sessions.ts b/packages/server/src/server/agent/import-sessions.ts index 2ffda2e4e..7f5922a84 100644 --- a/packages/server/src/server/agent/import-sessions.ts +++ b/packages/server/src/server/agent/import-sessions.ts @@ -1,4 +1,4 @@ -import type { z } from "zod3"; +import type { z } from "zod"; import type { Logger } from "pino"; import type { ProviderSnapshotManager } from "./provider-snapshot-manager.js"; import type { AgentManager, ManagedAgent } from "./agent-manager.js"; diff --git a/packages/server/src/server/agent/mcp-parity.e2e.test.ts b/packages/server/src/server/agent/mcp-parity.e2e.test.ts index 32b1affd1..6ad28068a 100644 --- a/packages/server/src/server/agent/mcp-parity.e2e.test.ts +++ b/packages/server/src/server/agent/mcp-parity.e2e.test.ts @@ -5,7 +5,7 @@ import { mkdtemp, rm, writeFile } from "node:fs/promises"; import { afterAll, beforeAll, describe, expect, test } from "vitest"; import { experimental_createMCPClient } from "ai"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; -import { z } from "zod3"; +import { z } from "zod"; import { AGENT_WAIT_TIMEOUT_MS } from "./mcp-shared.js"; import { createTestPaseoDaemon, type TestPaseoDaemon } from "../test-utils/paseo-daemon.js"; @@ -31,7 +31,7 @@ function str(val: unknown): string { } function recordArr(val: unknown): StructuredContent[] { - return z.array(z.record(z.unknown())).parse(val); + return z.array(z.record(z.string(), z.unknown())).parse(val); } function expectAgentFeatureValue(snapshot: StructuredContent, featureId: string, value: unknown) { @@ -355,7 +355,7 @@ describe("Suite A: Core Fixes", () => { expect(internalSnapshot?.config.featureValues).toEqual({ test_feature: true }); const status = await callToolStructured(topLevelClient, "get_agent_status", { agentId }); - const snapshot = z.record(z.unknown()).parse(status.snapshot); + const snapshot = z.record(z.string(), z.unknown()).parse(status.snapshot); expectAgentFeatureValue(snapshot, "test_feature", true); } finally { await archiveAgentIfPresent(agentId); @@ -373,7 +373,7 @@ describe("Suite A: Core Fixes", () => { expect(internalSnapshot?.config.featureValues).toEqual({ test_feature: true }); const status = await callToolStructured(topLevelClient, "get_agent_status", { agentId }); - const snapshot = z.record(z.unknown()).parse(status.snapshot); + const snapshot = z.record(z.string(), z.unknown()).parse(status.snapshot); expectAgentFeatureValue(snapshot, "test_feature", true); } finally { await archiveAgentIfPresent(agentId); @@ -393,7 +393,7 @@ describe("Suite A: Core Fixes", () => { expect(internalSnapshot?.config.featureValues).toEqual({ test_feature: true }); const status = await callToolStructured(topLevelClient, "get_agent_status", { agentId }); - const snapshot = z.record(z.unknown()).parse(status.snapshot); + const snapshot = z.record(z.string(), z.unknown()).parse(status.snapshot); expectAgentFeatureValue(snapshot, "test_feature", true); } finally { await archiveAgentIfPresent(agentId); diff --git a/packages/server/src/server/agent/mcp-server.test.ts b/packages/server/src/server/agent/mcp-server.test.ts index ad07b7c7d..7c79f27cf 100644 --- a/packages/server/src/server/agent/mcp-server.test.ts +++ b/packages/server/src/server/agent/mcp-server.test.ts @@ -5,7 +5,7 @@ import { access, mkdtemp, mkdir, rm, writeFile } from "node:fs/promises"; import { join, resolve as resolvePath } from "node:path"; import { tmpdir } from "node:os"; import Ajv from "ajv"; -import { z } from "zod3"; +import { z } from "zod"; import { zodToJsonSchema } from "zod-to-json-schema"; import { createTestLogger } from "../../test-utils/test-logger.js"; @@ -121,7 +121,7 @@ function expectOutputSchemaAccepts(tool: RegisteredMcpTool, data: unknown): void function agentsOf(response: { structuredContent: LooseStructuredContent; }): Array> { - return z.array(z.record(z.unknown())).parse(response.structuredContent.agents); + return z.array(z.record(z.string(), z.unknown())).parse(response.structuredContent.agents); } type AgentManagerSpies = ReturnType; @@ -3205,7 +3205,7 @@ describe("agent snapshot MCP serialization", () => { const tool = registeredTool(server, "list_agents"); const response = await tool.handler({}); const structured = z - .object({ agents: z.array(z.record(z.unknown())) }) + .object({ agents: z.array(z.record(z.string(), z.unknown())) }) .parse(response.structuredContent); expect(structured).toEqual({ @@ -3317,7 +3317,7 @@ describe("agent snapshot MCP serialization", () => { }); const tool = registeredTool(server, "get_agent_status"); const response = await tool.handler({ agentId: "full-detail-agent" }); - const snapshot = z.record(z.unknown()).parse(response.structuredContent.snapshot); + const snapshot = z.record(z.string(), z.unknown()).parse(response.structuredContent.snapshot); const parsed = AgentSnapshotPayloadSchema.safeParse(snapshot); if (!parsed.success) { diff --git a/packages/server/src/server/agent/mcp-server.ts b/packages/server/src/server/agent/mcp-server.ts index 33fc48823..db29e585e 100644 --- a/packages/server/src/server/agent/mcp-server.ts +++ b/packages/server/src/server/agent/mcp-server.ts @@ -1,5 +1,5 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { z } from "zod3"; +import { z } from "zod"; import { ensureValidJson } from "../json-utils.js"; import type { Logger } from "pino"; import type { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js"; @@ -690,7 +690,7 @@ export async function createAgentMcpServer(options: AgentMcpServerOptions): Prom modeId: z.string().optional().describe("Session mode to configure before the first run."), thinkingOptionId: z.string().optional().describe("Thinking option ID."), features: z - .record(z.unknown()) + .record(z.string(), z.unknown()) .optional() .describe("Provider-specific feature values, for example { fast_mode: true } for Codex."), }) @@ -705,7 +705,7 @@ export async function createAgentMcpServer(options: AgentMcpServerOptions): Prom .optional() .describe("Thinking option ID. Pass null to clear."), features: z - .record(z.unknown()) + .record(z.string(), z.unknown()) .optional() .describe("Provider-specific feature values, for example { fast_mode: true } for Codex."), }) @@ -715,7 +715,10 @@ export async function createAgentMcpServer(options: AgentMcpServerOptions): Prom modeId: z.string().optional().describe("Draft session mode ID."), model: z.string().optional().describe("Draft model ID."), thinkingOptionId: z.string().optional().describe("Draft thinking option ID."), - features: z.record(z.unknown()).optional().describe("Draft provider feature values."), + features: z + .record(z.string(), z.unknown()) + .optional() + .describe("Draft provider feature values."), }) .strict(); const agentToAgentInputSchema = { diff --git a/packages/server/src/server/agent/mcp-shared.ts b/packages/server/src/server/agent/mcp-shared.ts index 2bf31d993..db545fc06 100644 --- a/packages/server/src/server/agent/mcp-shared.ts +++ b/packages/server/src/server/agent/mcp-shared.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { Logger } from "pino"; import type { AgentPermissionRequest } from "./agent-sdk-types.js"; diff --git a/packages/server/src/server/agent/providers/claude/project-dir.test.ts b/packages/server/src/server/agent/providers/claude/project-dir.test.ts index c93ab8b2a..fb2468b13 100644 --- a/packages/server/src/server/agent/providers/claude/project-dir.test.ts +++ b/packages/server/src/server/agent/providers/claude/project-dir.test.ts @@ -66,8 +66,8 @@ const cases: ParityCase[] = [ }, { label: "non-existent path (canonicalize fallback)", - // realpath will throw; canonicalize falls back to NFC of input. SDK does - // the same, so paths should still match. + // realpath will throw; canonicalize falls back to the input path. SDK does + // the same, including platform-specific normalization, so paths should match. build: async () => join(workspaceRoot, "this-path-was-never-created-" + randomUUID()), }, ]; diff --git a/packages/server/src/server/agent/providers/claude/project-dir.ts b/packages/server/src/server/agent/providers/claude/project-dir.ts index 09af1935a..aa760702c 100644 --- a/packages/server/src/server/agent/providers/claude/project-dir.ts +++ b/packages/server/src/server/agent/providers/claude/project-dir.ts @@ -6,8 +6,8 @@ import { join } from "node:path"; // Verbatim port of the Claude Agent SDK's project-directory encoding so // paseo computes the same `~/.claude/projects/` path the SDK does. // The SDK ships only as a precompiled bundle; grep the JS source at -// node_modules/@anthropic-ai/claude-agent-sdk/sdk.mjs for `function f1`, -// `function i4`, `function tB`, `S0=200`. +// node_modules/@anthropic-ai/claude-agent-sdk/sdk.mjs for `function Ar`, +// `function wo`, `function kn`, `function Lq`, `Ai=200`. const PROJECT_DIR_LENGTH_CAP = 200; @@ -32,20 +32,24 @@ export function claudeProjectDirSync(cwd: string, options?: ClaudeProjectDirOpti async function canonicalize(input: string): Promise { try { - return (await realpath(input)).normalize("NFC"); + return normalizeLikeSdk(await realpath(input)); } catch { - return input.normalize("NFC"); + return normalizeLikeSdk(input); } } function canonicalizeSync(input: string): string { try { - return realpathSync.native(input).normalize("NFC"); + return normalizeLikeSdk(realpathSync.native(input)); } catch { - return input.normalize("NFC"); + return normalizeLikeSdk(input); } } +function normalizeLikeSdk(path: string): string { + return process.platform === "darwin" ? path.normalize("NFC") : path; +} + function encode(input: string): string { const replaced = input.replace(/[^a-zA-Z0-9]/g, "-"); if (replaced.length <= PROJECT_DIR_LENGTH_CAP) { diff --git a/packages/server/src/server/agent/providers/claude/task-notification-tool-call.ts b/packages/server/src/server/agent/providers/claude/task-notification-tool-call.ts index 0b6a97669..a0789ef39 100644 --- a/packages/server/src/server/agent/providers/claude/task-notification-tool-call.ts +++ b/packages/server/src/server/agent/providers/claude/task-notification-tool-call.ts @@ -1,5 +1,5 @@ import { createHash } from "node:crypto"; -import { z } from "zod3"; +import { z } from "zod"; import type { AgentTimelineItem } from "../../agent-sdk-types.js"; diff --git a/packages/server/src/server/agent/providers/claude/tool-call-detail-parser.ts b/packages/server/src/server/agent/providers/claude/tool-call-detail-parser.ts index 59db99d5a..a63e8b715 100644 --- a/packages/server/src/server/agent/providers/claude/tool-call-detail-parser.ts +++ b/packages/server/src/server/agent/providers/claude/tool-call-detail-parser.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { ToolCallDetail } from "../../agent-sdk-types.js"; import { diff --git a/packages/server/src/server/agent/providers/claude/tool-call-mapper.ts b/packages/server/src/server/agent/providers/claude/tool-call-mapper.ts index c6e0bc699..cc8ed529f 100644 --- a/packages/server/src/server/agent/providers/claude/tool-call-mapper.ts +++ b/packages/server/src/server/agent/providers/claude/tool-call-mapper.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { ToolCallTimelineItem } from "../../agent-sdk-types.js"; import { isSpeakToolName } from "@getpaseo/protocol/tool-name-normalization"; diff --git a/packages/server/src/server/agent/providers/codex-app-server-agent.ts b/packages/server/src/server/agent/providers/codex-app-server-agent.ts index 215523299..9f1dc6aa4 100644 --- a/packages/server/src/server/agent/providers/codex-app-server-agent.ts +++ b/packages/server/src/server/agent/providers/codex-app-server-agent.ts @@ -39,7 +39,7 @@ import * as fsSync from "node:fs"; import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { z } from "zod3"; +import { z } from "zod"; import { renderPromptAttachmentAsText } from "../prompt-attachments.js"; import { composeSystemPromptParts } from "../system-prompt.js"; import { curateAgentActivity } from "../activity-curator.js"; diff --git a/packages/server/src/server/agent/providers/codex/app-server-transport.ts b/packages/server/src/server/agent/providers/codex/app-server-transport.ts index 3649eae9e..e99360bf3 100644 --- a/packages/server/src/server/agent/providers/codex/app-server-transport.ts +++ b/packages/server/src/server/agent/providers/codex/app-server-transport.ts @@ -1,7 +1,7 @@ import type { ChildProcessWithoutNullStreams } from "node:child_process"; import readline from "node:readline"; import type { Logger } from "pino"; -import { z } from "zod3"; +import { z } from "zod"; import { terminateWithTreeKill } from "../../../../utils/tree-kill.js"; diff --git a/packages/server/src/server/agent/providers/codex/tool-call-detail-parser.ts b/packages/server/src/server/agent/providers/codex/tool-call-detail-parser.ts index e4741632c..df650e865 100644 --- a/packages/server/src/server/agent/providers/codex/tool-call-detail-parser.ts +++ b/packages/server/src/server/agent/providers/codex/tool-call-detail-parser.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { ToolCallDetail } from "../../agent-sdk-types.js"; import { stripCwdPrefix } from "@getpaseo/protocol/path-utils"; diff --git a/packages/server/src/server/agent/providers/codex/tool-call-mapper.ts b/packages/server/src/server/agent/providers/codex/tool-call-mapper.ts index 64d7b8bee..c4bdf9077 100644 --- a/packages/server/src/server/agent/providers/codex/tool-call-mapper.ts +++ b/packages/server/src/server/agent/providers/codex/tool-call-mapper.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { ToolCallTimelineItem } from "../../agent-sdk-types.js"; import { diff --git a/packages/server/src/server/agent/providers/opencode-agent.ts b/packages/server/src/server/agent/providers/opencode-agent.ts index 833dddbf8..c5e440a51 100644 --- a/packages/server/src/server/agent/providers/opencode-agent.ts +++ b/packages/server/src/server/agent/providers/opencode-agent.ts @@ -13,7 +13,7 @@ import { import { createPathEquivalenceMatcher } from "../../../utils/path.js"; import pLimit from "p-limit"; import type { Logger } from "pino"; -import { z } from "zod3"; +import { z } from "zod"; import { getAgentStreamEventTurnId, diff --git a/packages/server/src/server/agent/providers/opencode/tool-call-detail-parser.ts b/packages/server/src/server/agent/providers/opencode/tool-call-detail-parser.ts index c9050c430..992a0a4e6 100644 --- a/packages/server/src/server/agent/providers/opencode/tool-call-detail-parser.ts +++ b/packages/server/src/server/agent/providers/opencode/tool-call-detail-parser.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { ToolCallDetail } from "../../agent-sdk-types.js"; import { nonEmptyString, truncateDiffText } from "../tool-call-mapper-utils.js"; diff --git a/packages/server/src/server/agent/providers/opencode/tool-call-mapper.ts b/packages/server/src/server/agent/providers/opencode/tool-call-mapper.ts index c746514ff..6d6051f87 100644 --- a/packages/server/src/server/agent/providers/opencode/tool-call-mapper.ts +++ b/packages/server/src/server/agent/providers/opencode/tool-call-mapper.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { ToolCallTimelineItem } from "../../agent-sdk-types.js"; import { normalizeToolCallStatus } from "../tool-call-mapper-utils.js"; diff --git a/packages/server/src/server/agent/providers/pi/tool-call-mapper.ts b/packages/server/src/server/agent/providers/pi/tool-call-mapper.ts index fed5a62be..abdea5624 100644 --- a/packages/server/src/server/agent/providers/pi/tool-call-mapper.ts +++ b/packages/server/src/server/agent/providers/pi/tool-call-mapper.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { ToolCallDetail } from "../../agent-sdk-types.js"; diff --git a/packages/server/src/server/agent/providers/tool-call-detail-primitives.ts b/packages/server/src/server/agent/providers/tool-call-detail-primitives.ts index f5554d680..5c4e30cac 100644 --- a/packages/server/src/server/agent/providers/tool-call-detail-primitives.ts +++ b/packages/server/src/server/agent/providers/tool-call-detail-primitives.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { ToolCallDetail } from "../agent-sdk-types.js"; import { @@ -424,11 +424,12 @@ interface ToolReadOutputValue { content?: string; } -export const ToolReadOutputSchema: z.ZodType = - ToolReadOutputContentSchema; +export const ToolReadOutputSchema: z.ZodType = ToolReadOutputContentSchema; -export const ToolReadOutputWithPathSchema: z.ZodType = - z.union([ToolReadOutputContentSchema, ToolReadOutputPathSchema]); +export const ToolReadOutputWithPathSchema: z.ZodType = z.union([ + ToolReadOutputContentSchema, + ToolReadOutputPathSchema, +]); export const ToolWriteContentSchema = z .object({ @@ -934,8 +935,12 @@ export function toolDetailBranchByName< input: inputSchema.nullable(), output: outputSchema.nullable(), }); - return schema.transform((value: z.infer) => { - return mapper(value.input, value.output); + return schema.transform((value) => { + const parsed = value as unknown as { + input: z.infer | null; + output: z.infer | null; + }; + return mapper(parsed.input, parsed.output); }); } @@ -957,8 +962,12 @@ export function toolDetailBranchByToolName< input: inputSchema.nullable(), output: outputSchema.nullable(), }); - return schema.transform((value: z.infer) => { - return mapper(value.input, value.output); + return schema.transform((value) => { + const parsed = value as unknown as { + input: z.infer | null; + output: z.infer | null; + }; + return mapper(parsed.input, parsed.output); }); } @@ -982,7 +991,12 @@ export function toolDetailBranchByNameWithCwd< output: outputSchema.nullable(), cwd: z.string().optional().nullable(), }); - return schema.transform((value: z.infer) => { - return mapper(value.input, value.output, value.cwd ?? null); + return schema.transform((value) => { + const parsed = value as unknown as { + input: z.infer | null; + output: z.infer | null; + cwd?: string | null; + }; + return mapper(parsed.input, parsed.output, parsed.cwd ?? null); }); } diff --git a/packages/server/src/server/chat/chat-service.ts b/packages/server/src/server/chat/chat-service.ts index dc898caf4..08706d5ee 100644 --- a/packages/server/src/server/chat/chat-service.ts +++ b/packages/server/src/server/chat/chat-service.ts @@ -2,7 +2,7 @@ import { randomUUID } from "node:crypto"; import { promises as fs } from "node:fs"; import path from "node:path"; import type pino from "pino"; -import { z } from "zod3"; +import { z } from "zod"; import { writeJsonFileAtomic } from "../atomic-file.js"; import { ChatMessageSchema, diff --git a/packages/server/src/server/config.ts b/packages/server/src/server/config.ts index bdbbce9ee..3163954b0 100644 --- a/packages/server/src/server/config.ts +++ b/packages/server/src/server/config.ts @@ -1,6 +1,6 @@ import path from "node:path"; import { resolvePaseoNodeEnv } from "./paseo-env.js"; -import { z } from "zod3"; +import { z } from "zod"; import { expandTilde } from "../utils/path.js"; import type { PaseoDaemonConfig } from "./bootstrap.js"; diff --git a/packages/server/src/server/daemon-e2e/checkout-pr-merge.e2e.test.ts b/packages/server/src/server/daemon-e2e/checkout-pr-merge.e2e.test.ts index 170bd0252..e7907bd88 100644 --- a/packages/server/src/server/daemon-e2e/checkout-pr-merge.e2e.test.ts +++ b/packages/server/src/server/daemon-e2e/checkout-pr-merge.e2e.test.ts @@ -3,7 +3,7 @@ import { execSync } from "child_process"; import { existsSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "fs"; import { tmpdir } from "os"; import path from "path"; -import { z } from "zod3"; +import { z } from "zod"; import { createDaemonTestContext, diff --git a/packages/server/src/server/daemon-keypair.ts b/packages/server/src/server/daemon-keypair.ts index 3425f4cb4..27ae0bbf6 100644 --- a/packages/server/src/server/daemon-keypair.ts +++ b/packages/server/src/server/daemon-keypair.ts @@ -1,6 +1,6 @@ import { existsSync, readFileSync } from "node:fs"; import path from "node:path"; -import { z } from "zod3"; +import { z } from "zod"; import type pino from "pino"; import { diff --git a/packages/server/src/server/loop-service.ts b/packages/server/src/server/loop-service.ts index f20a6ba73..5ce736bd2 100644 --- a/packages/server/src/server/loop-service.ts +++ b/packages/server/src/server/loop-service.ts @@ -1,7 +1,7 @@ import { randomUUID } from "node:crypto"; import { promises as fs } from "node:fs"; import path from "node:path"; -import { z } from "zod3"; +import { z } from "zod"; import type { Logger } from "pino"; import { writeJsonFileAtomic } from "./atomic-file.js"; import { curateAgentActivity } from "./agent/activity-curator.js"; diff --git a/packages/server/src/server/package-version.ts b/packages/server/src/server/package-version.ts index 3cfac1f10..e30844693 100644 --- a/packages/server/src/server/package-version.ts +++ b/packages/server/src/server/package-version.ts @@ -1,7 +1,7 @@ import { existsSync, readFileSync } from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -import { z } from "zod3"; +import { z } from "zod"; interface ResolvePackageVersionParams { moduleUrl?: string; diff --git a/packages/server/src/server/persisted-config.ts b/packages/server/src/server/persisted-config.ts index 79e319ffa..cdeb0568b 100644 --- a/packages/server/src/server/persisted-config.ts +++ b/packages/server/src/server/persisted-config.ts @@ -1,6 +1,6 @@ import { existsSync, readFileSync } from "node:fs"; import path from "node:path"; -import { z } from "zod3"; +import { z } from "zod"; import { AgentProviderRuntimeSettingsMapSchema, diff --git a/packages/server/src/server/pid-lock.ts b/packages/server/src/server/pid-lock.ts index 926f893bf..96d663e89 100644 --- a/packages/server/src/server/pid-lock.ts +++ b/packages/server/src/server/pid-lock.ts @@ -2,7 +2,7 @@ import { open, readFile, unlink, mkdir } from "node:fs/promises"; import { existsSync } from "node:fs"; import { join } from "node:path"; import { hostname } from "node:os"; -import { z } from "zod3"; +import { z } from "zod"; export const pidLockInfoSchema = z.object({ pid: z.number(), diff --git a/packages/server/src/server/session.ts b/packages/server/src/server/session.ts index 3ddc05d74..42d10f22a 100644 --- a/packages/server/src/server/session.ts +++ b/packages/server/src/server/session.ts @@ -4,7 +4,7 @@ import { realpathSync } from "node:fs"; import type { FSWatcher } from "node:fs"; import { basename, resolve, sep } from "path"; import { homedir } from "node:os"; -import { z } from "zod3"; +import { z } from "zod"; import type { ToolSet } from "ai"; import { CLIENT_CAPS, type ClientCapability } from "@getpaseo/protocol/client-capabilities"; import { diff --git a/packages/server/src/server/session.workspaces.test.ts b/packages/server/src/server/session.workspaces.test.ts index a3ad7b1c6..0abe620e9 100644 --- a/packages/server/src/server/session.workspaces.test.ts +++ b/packages/server/src/server/session.workspaces.test.ts @@ -3,7 +3,7 @@ import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "nod import { homedir, tmpdir } from "node:os"; import path from "node:path"; import { expect, test, vi } from "vitest"; -import { z } from "zod3"; +import { z } from "zod"; import { Session } from "./session.js"; import type { AgentSnapshotPayload, SessionOutboundMessage } from "@getpaseo/protocol/messages"; import { AgentManager } from "./agent/agent-manager.js"; diff --git a/packages/server/src/server/speech/providers/local/config.ts b/packages/server/src/server/speech/providers/local/config.ts index e9376d129..8e7d500dc 100644 --- a/packages/server/src/server/speech/providers/local/config.ts +++ b/packages/server/src/server/speech/providers/local/config.ts @@ -1,6 +1,6 @@ import path from "node:path"; -import { z } from "zod3"; +import { z } from "zod"; import type { PersistedConfig } from "../../../persisted-config.js"; import type { RequestedSpeechProviders } from "../../speech-types.js"; @@ -45,9 +45,13 @@ export interface LocalSpeechSttLanguageConfig { const NumberLikeSchema = z.union([z.number(), z.string().trim().min(1)]); const LanguageSchema = z.string().trim().min(1).default(DEFAULT_STT_LANGUAGE); -const OptionalFiniteNumberSchema = NumberLikeSchema.pipe(z.coerce.number().finite()).optional(); +const OptionalFiniteNumberSchema = NumberLikeSchema.pipe( + z.coerce.number().finite(), +).optional(); -const OptionalIntegerSchema = NumberLikeSchema.pipe(z.coerce.number().int()).optional(); +const OptionalIntegerSchema = NumberLikeSchema.pipe( + z.coerce.number().int(), +).optional(); const LocalSpeechResolutionSchema = z.object({ includeProviderConfig: z.boolean(), diff --git a/packages/server/src/server/speech/providers/local/sherpa/model-catalog.ts b/packages/server/src/server/speech/providers/local/sherpa/model-catalog.ts index 4580f0ae5..06d838c49 100644 --- a/packages/server/src/server/speech/providers/local/sherpa/model-catalog.ts +++ b/packages/server/src/server/speech/providers/local/sherpa/model-catalog.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; export type SherpaOnnxModelKind = "stt-offline" | "tts"; @@ -85,9 +85,7 @@ function resolveDefaultModelId(role: DefaultModelRole): SherpaOnnxModelId { export const DEFAULT_LOCAL_STT_MODEL = resolveDefaultModelId("stt"); export const DEFAULT_LOCAL_TTS_MODEL = resolveDefaultModelId("tts"); -function createModelIdSchema( - modelIds: readonly T[], -): z.ZodType { +function createModelIdSchema(modelIds: readonly T[]): z.ZodType { const validIds = new Set(modelIds); return z .string() diff --git a/packages/server/src/server/speech/providers/openai/config.ts b/packages/server/src/server/speech/providers/openai/config.ts index 6ea44013a..103be8fac 100644 --- a/packages/server/src/server/speech/providers/openai/config.ts +++ b/packages/server/src/server/speech/providers/openai/config.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { PersistedConfig } from "../../../persisted-config.js"; import type { RequestedSpeechProviders } from "../../speech-types.js"; @@ -21,7 +21,9 @@ const OpenAiTtsModelSchema = z.enum(["tts-1", "tts-1-hd"]); const NumberLikeSchema = z.union([z.number(), z.string().trim().min(1)]); -const OptionalFiniteNumberSchema = NumberLikeSchema.pipe(z.coerce.number().finite()).optional(); +const OptionalFiniteNumberSchema = NumberLikeSchema.pipe( + z.coerce.number().finite(), +).optional(); const OptionalTrimmedStringSchema = z .string() diff --git a/packages/server/src/server/speech/speech-config-resolver.ts b/packages/server/src/server/speech/speech-config-resolver.ts index 05aa2541f..95c78707a 100644 --- a/packages/server/src/server/speech/speech-config-resolver.ts +++ b/packages/server/src/server/speech/speech-config-resolver.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { PersistedConfig } from "../persisted-config.js"; import type { PaseoOpenAIConfig, PaseoSpeechConfig } from "../bootstrap.js"; diff --git a/packages/server/src/server/speech/speech-types.ts b/packages/server/src/server/speech/speech-types.ts index 572f2e931..12baacd83 100644 --- a/packages/server/src/server/speech/speech-types.ts +++ b/packages/server/src/server/speech/speech-types.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; export const SpeechProviderIdSchema = z.enum(["openai", "local"]); export type SpeechProviderId = z.infer; diff --git a/packages/server/src/server/websocket-server.relay-reconnect.test.ts b/packages/server/src/server/websocket-server.relay-reconnect.test.ts index 89d526bc3..d2c9abbb4 100644 --- a/packages/server/src/server/websocket-server.relay-reconnect.test.ts +++ b/packages/server/src/server/websocket-server.relay-reconnect.test.ts @@ -98,7 +98,7 @@ vi.mock("./push/push-service.js", () => ({ }, })); -import { z } from "zod3"; +import { z } from "zod"; import { VoiceAssistantWebSocketServer } from "./websocket-server"; import { parseServerInfoStatusPayload } from "./messages.js"; import type { SpeechReadinessSnapshot } from "./speech/speech-runtime.js"; diff --git a/packages/server/src/server/websocket-server.ts b/packages/server/src/server/websocket-server.ts index 923298ece..ed83006a9 100644 --- a/packages/server/src/server/websocket-server.ts +++ b/packages/server/src/server/websocket-server.ts @@ -1048,7 +1048,7 @@ export class VoiceAssistantWebSocketServer { serverId: this.serverId, hostname: getHostname(), version: this.daemonVersion, - ...(this.serverCapabilities ? { capabilities: this.serverCapabilities } : {}), + capabilities: this.serverCapabilities, features: { // COMPAT(providersSnapshot): keep optional until all clients rely on snapshot flow. providersSnapshot: true, diff --git a/packages/server/src/server/wire-compat.test.ts b/packages/server/src/server/wire-compat.test.ts index cf687c8b3..506be11b0 100644 --- a/packages/server/src/server/wire-compat.test.ts +++ b/packages/server/src/server/wire-compat.test.ts @@ -1,5 +1,5 @@ import pino from "pino"; -import { z } from "zod3"; +import { z } from "zod"; import { describe, expect, test } from "vitest"; import { CLIENT_CAPS } from "@getpaseo/protocol/client-capabilities"; diff --git a/packages/server/src/server/workspace-registry.ts b/packages/server/src/server/workspace-registry.ts index 119a38498..60edcde41 100644 --- a/packages/server/src/server/workspace-registry.ts +++ b/packages/server/src/server/workspace-registry.ts @@ -1,7 +1,7 @@ import { promises as fs } from "node:fs"; import type { Logger } from "pino"; -import { z } from "zod3"; +import { z } from "zod"; import { writeJsonFileAtomic } from "./atomic-file.js"; import type { PersistedProjectKind, PersistedWorkspaceKind } from "./workspace-registry-model.js"; @@ -62,7 +62,7 @@ type RegistryRecord = PersistedProjectRecord | PersistedWorkspaceRecord; class FileBackedRegistry { private readonly filePath: string; private readonly logger: Logger; - private readonly schema: z.ZodType; + private readonly schema: z.ZodType; private readonly getId: (record: TRecord) => string; private loaded = false; private readonly cache = new Map(); @@ -71,7 +71,7 @@ class FileBackedRegistry { constructor(options: { filePath: string; logger: Logger; - schema: z.ZodType; + schema: z.ZodType; getId: (record: TRecord) => string; component: string; }) { diff --git a/packages/server/src/server/worktree-branch-name-generator.ts b/packages/server/src/server/worktree-branch-name-generator.ts index bba54ed43..e4c3a5485 100644 --- a/packages/server/src/server/worktree-branch-name-generator.ts +++ b/packages/server/src/server/worktree-branch-name-generator.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { FirstAgentContext } from "@getpaseo/protocol/messages"; import type { AgentManager } from "./agent/agent-manager.js"; import { diff --git a/packages/server/src/services/github-service.ts b/packages/server/src/services/github-service.ts index 5700a3d55..d0b15e990 100644 --- a/packages/server/src/services/github-service.ts +++ b/packages/server/src/services/github-service.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import type { GitHubSearchKind } from "@getpaseo/protocol/messages"; import { findExecutable } from "../utils/executable.js"; import { resolveGitHubRemote } from "../utils/github-remote.js"; diff --git a/packages/server/src/utils/tool-call-parsers.ts b/packages/server/src/utils/tool-call-parsers.ts index 7b5701c00..b76afe8d9 100644 --- a/packages/server/src/utils/tool-call-parsers.ts +++ b/packages/server/src/utils/tool-call-parsers.ts @@ -1,4 +1,4 @@ -import { z } from "zod3"; +import { z } from "zod"; import { stripCwdPrefix } from "@getpaseo/protocol/path-utils"; const SHELL_WRAPPER_PREFIX_PATTERN = /^\/bin\/(?:zsh|bash|sh)\s+(?:-[a-zA-Z]+\s+)?/; diff --git a/packages/server/src/utils/worktree-metadata.ts b/packages/server/src/utils/worktree-metadata.ts index 0b677c616..a8be30586 100644 --- a/packages/server/src/utils/worktree-metadata.ts +++ b/packages/server/src/utils/worktree-metadata.ts @@ -1,6 +1,6 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; import { isAbsolute, join, resolve } from "path"; -import { z } from "zod3"; +import { z } from "zod"; const PaseoWorktreeMetadataV1Schema = z.object({ version: z.literal(1),