From 42c2533747619818d7ac8ebd780cf0f56c2873dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ignacy=20=C5=81=C4=85tka?= Date: Mon, 12 Oct 2026 14:28:50 +0200 Subject: [PATCH 1/2] fix(screenshot-diff): reject string values for captureBaseline/captureCurrent z.coerce.boolean() is JS truthiness, so the string "false" parsed to true and a caller that declined a live capture got one. Use z.boolean() like every other boolean param in the catalogue. Closes #811 --- packages/tool-server/src/tools/screenshot-diff/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tool-server/src/tools/screenshot-diff/index.ts b/packages/tool-server/src/tools/screenshot-diff/index.ts index c42e34ea0e..c701cb6664 100644 --- a/packages/tool-server/src/tools/screenshot-diff/index.ts +++ b/packages/tool-server/src/tools/screenshot-diff/index.ts @@ -42,13 +42,13 @@ const zodSchema = z .string() .min(1) .describe("Target device id from `list-devices` (iOS UDID or Android serial)."), - captureBaseline: z.coerce + captureBaseline: z .boolean() .optional() .describe( "Capture the baseline screenshot live at full resolution before diffing. Cannot be combined with captureCurrent." ), - captureCurrent: z.coerce + captureCurrent: z .boolean() .optional() .describe( From 1846c55e5dd42992df8c5b289871873b8bcf1886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ignacy=20=C5=81=C4=85tka?= Date: Mon, 12 Oct 2026 20:37:33 +0200 Subject: [PATCH 2/2] test(screenshot-diff): reject a string capture flag --- .../tool-server/test/screenshot-diff-tool.test.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/tool-server/test/screenshot-diff-tool.test.ts b/packages/tool-server/test/screenshot-diff-tool.test.ts index 6c2741ca94..01657cc81c 100644 --- a/packages/tool-server/test/screenshot-diff-tool.test.ts +++ b/packages/tool-server/test/screenshot-diff-tool.test.ts @@ -44,6 +44,17 @@ describe("screenshotDiffTool", () => { expect(result.success).toBe(false); }); + it.each(["captureBaseline", "captureCurrent"])("rejects a string %s", (flag) => { + const result = screenshotDiffTool.zodSchema!.safeParse({ + baselinePath: "/tmp/baseline.png", + currentPath: "/tmp/current.png", + udid: "ABC", + [flag]: "false", + }); + + expect(result.error?.issues).toMatchObject([{ code: "invalid_type", path: [flag] }]); + }); + it("requires udid and only declares the simulator-server service for live captures", () => { expect( screenshotDiffTool.zodSchema!.safeParse({