import { z } from "zod"; const commandSchema = z .object({ id: z.string(), action: z.string() }) .passthrough(); export function parseCommand(input) { let json; try { json = JSON.parse(input); } catch { return { success: false, error: "Invalid JSON" }; } const id = typeof json === "object" && json !== null && "id" in json ? String(json.id) : undefined; const result = commandSchema.safeParse(json); if (!result.success) { const errors = result.error.errors.map((e) => `${e.path.join(".")}: ${e.message}`).join(", "); return { success: false, error: `Validation error: ${errors}`, id }; } return { success: true, command: result.data }; } export function successResponse(id, data) { return { id, success: true, data }; } export function errorResponse(id, error) { return { id, success: false, error }; } /** * Serialize a response to JSON string. * Replaces lone Unicode surrogates with U+FFFD to avoid serde_json parse errors. */ function sanitizeUtf16(input) { // Fast path: most strings contain no surrogate code units. if (!/[\uD800-\uDFFF]/.test(input)) return input; // Replace lone high/low surrogates. Valid surrogate pairs are preserved. // Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toWellFormed return input.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(? typeof value === "string" ? sanitizeUtf16(value) : value); }