import { z } from "zod"; import { REVIEW_SENSITIVITY_GRID_LIMITS, isDiagnosticToken, isDiagnosticPlainRecord, validateReviewSensitivityGridRequest, expandReviewSensitivityGrid, runReviewSensitivityGrid, replayReviewSensitivityGrid, type ReviewSensitivityGridRequest, type ReviewSensitivityGrid } from "@actuarial-ts/core"; import { reviewPlanSchema } from "./reviewPlanContracts.js"; import { reviewSensitivityChangeSchema, reviewSensitivityObservationSchema } from "./reviewSensitivityContracts.js"; import { parseReviewBoundary } from "./reviewBoundary.js"; const token = z.string().refine(isDiagnosticToken), ceiling = (key: keyof typeof REVIEW_SENSITIVITY_GRID_LIMITS) => z.number().int().positive().max(REVIEW_SENSITIVITY_GRID_LIMITS[key]); export const reviewSensitivityGridRequestSchema: z.ZodType = z.object({ id: token, version: token, baseline: reviewPlanSchema, axes: z.array(z.object({ id: token, options: z.array(z.object({ id: token, change: reviewSensitivityChangeSchema.nullable() }).strict()).min(1).max(REVIEW_SENSITIVITY_GRID_LIMITS.maximumOptionsPerAxis) }).strict()).min(1).max(REVIEW_SENSITIVITY_GRID_LIMITS.maximumAxes), observations: z.array(reviewSensitivityObservationSchema).min(1).max(REVIEW_SENSITIVITY_GRID_LIMITS.maximumObservations), limits: z.object({ maximumAxes: ceiling("maximumAxes"), maximumOptionsPerAxis: ceiling("maximumOptionsPerAxis"), maximumRuns: ceiling("maximumRuns"), maximumObservations: ceiling("maximumObservations"), maximumCompatibilityChecks: ceiling("maximumCompatibilityChecks"), maximumInputCharacters: ceiling("maximumInputCharacters"), maximumOutputCharacters: ceiling("maximumOutputCharacters") }).strict(), }).strict(); export function parseReviewSensitivityGridRequest(input: unknown): ReviewSensitivityGridRequest { return validateReviewSensitivityGridRequest(parseReviewBoundary(reviewSensitivityGridRequestSchema, input)); } export function expandReviewSensitivityGridFromInput(input: unknown) { return expandReviewSensitivityGrid(parseReviewSensitivityGridRequest(input)); } export function runReviewSensitivityGridFromInput(input: unknown): ReviewSensitivityGrid { return runReviewSensitivityGrid(parseReviewSensitivityGridRequest(input)); } /** Exact replay preserves all saved fields before comparing the complete native result. */ export function replayReviewSensitivityGridFromInput(input: unknown): ReviewSensitivityGrid { return replayReviewSensitivityGrid(parseReviewBoundary(z.custom(isDiagnosticPlainRecord), input)); }