diff --git a/server/src/__tests__/error-handler.test.ts b/server/src/__tests__/error-handler.test.ts index 3d58f4fa27..cfd65a23a2 100644 --- a/server/src/__tests__/error-handler.test.ts +++ b/server/src/__tests__/error-handler.test.ts @@ -87,6 +87,31 @@ describe("errorHandler", () => { expect(res.__errorContext?.error?.message).toBe("db exploded"); }); + it("returns 400 for Zod validation errors from another module instance", () => { + const req = makeReq(); + const res = makeRes() as any; + const next = vi.fn() as unknown as NextFunction; + const issue = { + code: "invalid_type", + expected: "string", + received: "undefined", + path: ["provider"], + message: "Required", + }; + const err = Object.assign(new Error("Validation failed"), { + name: "ZodError", + issues: [issue], + errors: [issue], + }); + + errorHandler(err, req, res, next); + + expect(res.status).toHaveBeenCalledWith(400); + expect(res.json).toHaveBeenCalledWith({ error: "Validation error", details: [issue] }); + expect(res.err).toBeUndefined(); + expect(res.__errorContext).toBeUndefined(); + }); + it("records responsible-user denial codes on the active agent run", () => { const db = { marker: "db" }; const req = { diff --git a/server/src/middleware/error-handler.ts b/server/src/middleware/error-handler.ts index 8937dfdcbc..5ba9ad5821 100644 --- a/server/src/middleware/error-handler.ts +++ b/server/src/middleware/error-handler.ts @@ -23,6 +23,13 @@ function isRedactedSkillPolicyDenial(details: Record | null) { return details?.code === "skill_policy_denied"; } +function readZodIssues(err: unknown): unknown[] | null { + if (err instanceof ZodError) return err.issues; + if (!err || typeof err !== "object" || (err as { name?: unknown }).name !== "ZodError") return null; + const issues = (err as { issues?: unknown }).issues; + return Array.isArray(issues) ? issues : null; +} + function attachErrorContext( req: Request, res: Response, @@ -117,8 +124,9 @@ export function errorHandler( return; } - if (err instanceof ZodError) { - res.status(400).json({ error: "Validation error", details: err.errors }); + const zodIssues = readZodIssues(err); + if (zodIssues) { + res.status(400).json({ error: "Validation error", details: zodIssues }); return; }