diff --git a/.github/workflows/code-release.yml b/.github/workflows/code-release.yml index 606b21754..8a20432e8 100644 --- a/.github/workflows/code-release.yml +++ b/.github/workflows/code-release.yml @@ -220,4 +220,6 @@ jobs: env: GH_TOKEN: ${{ steps.app-token.outputs.token }} APP_VERSION: ${{ steps.version.outputs.version }} - run: gh release edit "v$APP_VERSION" --repo PostHog/code --draft=false --generate-notes + run: | + gh api repos/PostHog/code/releases/generate-notes -f tag_name="v$APP_VERSION" --jq '.body' > /tmp/release-notes.md + gh release edit "v$APP_VERSION" --repo PostHog/code --draft=false --notes-file /tmp/release-notes.md diff --git a/apps/code/src/main/services/agent/schemas.ts b/apps/code/src/main/services/agent/schemas.ts index b38ca4c11..5ad875f8f 100644 --- a/apps/code/src/main/services/agent/schemas.ts +++ b/apps/code/src/main/services/agent/schemas.ts @@ -63,50 +63,42 @@ export const modelOptionSchema = z.object({ export type ModelOption = z.infer; -const sessionConfigSelectOptionSchema = z - .object({ - value: z.string(), - name: z.string(), - description: z.string().nullish(), - _meta: z.record(z.string(), z.unknown()).nullish(), - }) - .passthrough(); - -const sessionConfigSelectGroupSchema = z - .object({ - group: z.string(), - name: z.string(), - options: z.array(sessionConfigSelectOptionSchema), - _meta: z.record(z.string(), z.unknown()).nullish(), - }) - .passthrough(); - -const sessionConfigSelectSchema = z - .object({ - id: z.string(), - name: z.string(), - type: z.literal("select"), - currentValue: z.string(), - options: z - .array(sessionConfigSelectOptionSchema) - .or(z.array(sessionConfigSelectGroupSchema)), - category: z.string().nullish(), - description: z.string().nullish(), - _meta: z.record(z.string(), z.unknown()).nullish(), - }) - .passthrough(); - -const sessionConfigBooleanSchema = z - .object({ - id: z.string(), - name: z.string(), - type: z.literal("boolean"), - currentValue: z.boolean(), - category: z.string().nullish(), - description: z.string().nullish(), - _meta: z.record(z.string(), z.unknown()).nullish(), - }) - .passthrough(); +const sessionConfigSelectOptionSchema = z.looseObject({ + value: z.string(), + name: z.string(), + description: z.string().nullish(), + _meta: z.record(z.string(), z.unknown()).nullish(), +}); + +const sessionConfigSelectGroupSchema = z.looseObject({ + group: z.string(), + name: z.string(), + options: z.array(sessionConfigSelectOptionSchema), + _meta: z.record(z.string(), z.unknown()).nullish(), +}); + +const sessionConfigSelectSchema = z.looseObject({ + id: z.string(), + name: z.string(), + type: z.literal("select"), + currentValue: z.string(), + options: z + .array(sessionConfigSelectOptionSchema) + .or(z.array(sessionConfigSelectGroupSchema)), + category: z.string().nullish(), + description: z.string().nullish(), + _meta: z.record(z.string(), z.unknown()).nullish(), +}); + +const sessionConfigBooleanSchema = z.looseObject({ + id: z.string(), + name: z.string(), + type: z.literal("boolean"), + currentValue: z.boolean(), + category: z.string().nullish(), + description: z.string().nullish(), + _meta: z.record(z.string(), z.unknown()).nullish(), +}); export const sessionConfigOptionSchema = z.union([ sessionConfigSelectSchema, @@ -124,13 +116,11 @@ export const sessionResponseSchema = z.object({ export type SessionResponse = z.infer; // Prompt input/output -export const contentBlockSchema = z - .object({ - type: z.string(), - text: z.string().optional(), - _meta: z.record(z.string(), z.unknown()).nullish(), - }) - .passthrough(); +export const contentBlockSchema = z.looseObject({ + type: z.string(), + text: z.string().optional(), + _meta: z.record(z.string(), z.unknown()).nullish(), +}); export const promptInput = z.object({ sessionId: z.string(), diff --git a/apps/code/src/main/services/oauth/schemas.ts b/apps/code/src/main/services/oauth/schemas.ts index e909c4471..aef4a0280 100644 --- a/apps/code/src/main/services/oauth/schemas.ts +++ b/apps/code/src/main/services/oauth/schemas.ts @@ -66,6 +66,6 @@ export const cancelFlowOutput = z.object({ export type CancelFlowOutput = z.infer; export const openExternalUrlInput = z.object({ - url: z.string().url(), + url: z.url(), }); export type OpenExternalUrlInput = z.infer; diff --git a/packages/agent/package.json b/packages/agent/package.json index e112079e8..07ef18fbf 100644 --- a/packages/agent/package.json +++ b/packages/agent/package.json @@ -112,7 +112,7 @@ "tar": "^7.5.0", "uuid": "13.0.0", "yoga-wasm-web": "^0.3.3", - "zod": "^3.24.1" + "zod": "^4.2.0" }, "files": [ "dist/**/*", diff --git a/packages/agent/src/server/bin.ts b/packages/agent/src/server/bin.ts index e85017622..aec0acfbe 100644 --- a/packages/agent/src/server/bin.ts +++ b/packages/agent/src/server/bin.ts @@ -7,25 +7,21 @@ import { claudeCodeConfigSchema, mcpServersSchema } from "./schemas"; const envSchema = z.object({ JWT_PUBLIC_KEY: z .string({ - required_error: - "JWT_PUBLIC_KEY is required for authenticating client connections", + error: "JWT_PUBLIC_KEY is required for authenticating client connections", }) .min(1, "JWT_PUBLIC_KEY cannot be empty"), - POSTHOG_API_URL: z - .string({ - required_error: - "POSTHOG_API_URL is required for LLM gateway communication", - }) - .url("POSTHOG_API_URL must be a valid URL"), + POSTHOG_API_URL: z.url({ + error: "POSTHOG_API_URL is required for LLM gateway communication", + }), POSTHOG_PERSONAL_API_KEY: z .string({ - required_error: + error: "POSTHOG_PERSONAL_API_KEY is required for authenticating with PostHog services", }) .min(1, "POSTHOG_PERSONAL_API_KEY cannot be empty"), POSTHOG_PROJECT_ID: z .string({ - required_error: + error: "POSTHOG_PROJECT_ID is required for routing requests to the correct project", }) .regex(/^\d+$/, "POSTHOG_PROJECT_ID must be a numeric string") @@ -34,7 +30,7 @@ const envSchema = z.object({ const program = new Command(); -function parseJsonOption( +function parseJsonOption( raw: string | undefined, schema: S, flag: string, diff --git a/packages/agent/src/server/schemas.ts b/packages/agent/src/server/schemas.ts index 65a3f603c..7eb4348a3 100644 --- a/packages/agent/src/server/schemas.ts +++ b/packages/agent/src/server/schemas.ts @@ -8,7 +8,7 @@ const httpHeaderSchema = z.object({ const remoteMcpServerSchema = z.object({ type: z.enum(["http", "sse"]), name: z.string().min(1, "MCP server name is required"), - url: z.string().url("MCP server url must be a valid URL"), + url: z.url({ error: "MCP server url must be a valid URL" }), headers: z.array(httpHeaderSchema).default([]), }); @@ -35,7 +35,7 @@ export const claudeCodeConfigSchema = z.object({ export const jsonRpcRequestSchema = z.object({ jsonrpc: z.literal("2.0"), method: z.string(), - params: z.record(z.unknown()).optional(), + params: z.record(z.string(), z.unknown()).optional(), id: z.union([z.string(), z.number()]).optional(), }); diff --git a/packages/electron-trpc/package.json b/packages/electron-trpc/package.json index 11c06d472..916cb9715 100644 --- a/packages/electron-trpc/package.json +++ b/packages/electron-trpc/package.json @@ -38,7 +38,7 @@ "typescript": "^5.8.3", "vite": "^6.0.7", "vitest": "^2.1.8", - "zod": "^3.24.1" + "zod": "^4.2.0" }, "peerDependencies": { "@trpc/client": ">=11.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 214b4c5b3..85471188f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -593,13 +593,13 @@ importers: dependencies: '@agentclientprotocol/sdk': specifier: 0.16.1 - version: 0.16.1(zod@3.25.76) + version: 0.16.1(zod@4.3.6) '@anthropic-ai/claude-agent-sdk': specifier: 0.2.76 - version: 0.2.76(zod@3.25.76) + version: 0.2.76(zod@4.3.6) '@anthropic-ai/sdk': specifier: ^0.78.0 - version: 0.78.0(zod@3.25.76) + version: 0.78.0(zod@4.3.6) '@hono/node-server': specifier: ^1.19.9 version: 1.19.9(hono@4.11.7) @@ -643,8 +643,8 @@ importers: specifier: ^0.3.3 version: 0.3.3 zod: - specifier: ^3.24.1 - version: 3.25.76 + specifier: ^4.2.0 + version: 4.3.6 devDependencies: '@posthog/git': specifier: workspace:* @@ -704,8 +704,8 @@ importers: specifier: ^2.1.8 version: 2.1.9(@types/node@24.12.0)(jsdom@26.1.0)(lightningcss@1.31.1)(msw@2.12.8(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0) zod: - specifier: ^3.24.1 - version: 3.25.76 + specifier: ^4.2.0 + version: 4.3.6 packages/git: dependencies: @@ -5189,6 +5189,7 @@ packages: '@xmldom/xmldom@0.8.11': resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} + deprecated: this version has critical issues, please update to the latest version '@xterm/addon-fit@0.10.0': resolution: {integrity: sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==} @@ -11090,9 +11091,9 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@agentclientprotocol/sdk@0.16.1(zod@3.25.76)': + '@agentclientprotocol/sdk@0.16.1(zod@4.3.6)': dependencies: - zod: 3.25.76 + zod: 4.3.6 '@alloc/quick-lru@5.2.0': {} @@ -11101,9 +11102,9 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@anthropic-ai/claude-agent-sdk@0.2.76(zod@3.25.76)': + '@anthropic-ai/claude-agent-sdk@0.2.76(zod@4.3.6)': dependencies: - zod: 3.25.76 + zod: 4.3.6 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.5 '@img/sharp-darwin-x64': 0.34.5 @@ -11115,11 +11116,11 @@ snapshots: '@img/sharp-win32-arm64': 0.34.5 '@img/sharp-win32-x64': 0.34.5 - '@anthropic-ai/sdk@0.78.0(zod@3.25.76)': + '@anthropic-ai/sdk@0.78.0(zod@4.3.6)': dependencies: json-schema-to-ts: 3.1.1 optionalDependencies: - zod: 3.25.76 + zod: 4.3.6 '@apidevtools/json-schema-ref-parser@11.7.2': dependencies: