import { FieldType } from '@prisma/client'; import z from 'zod'; export const DETECTABLE_FIELD_TYPES = [ FieldType.SIGNATURE, FieldType.INITIALS, FieldType.NAME, FieldType.EMAIL, FieldType.DATE, FieldType.TEXT, FieldType.NUMBER, FieldType.RADIO, FieldType.CHECKBOX, ] as const; export const ZDetectableFieldType = z.enum(DETECTABLE_FIELD_TYPES); export const ZConfidenceLevel = z.enum(['low', 'medium-low', 'medium', 'medium-high', 'high']); export type TConfidenceLevel = z.infer; /** * Schema for a detected field's bounding box. * All values are normalized to a 0-1000 scale relative to the page dimensions. */ const ZBox2DSchema = z.array(z.number().min(0).max(1000)).length(4); /** * Schema for a detected field. */ export const ZDetectedFieldSchema = z.object({ type: ZDetectableFieldType.describe(`The field type based on nearby labels and visual appearance`), recipientKey: z .string() .describe( 'Recipient identifier from nearby labels (e.g., "Tenant", "Landlord", "Buyer", "Seller"). Empty string if no recipient indicated.', ), box2d: ZBox2DSchema.describe( 'Box2D [yMin, xMin, yMax, xMax] coordinates of the FILLABLE AREA only (exclude labels).', ), confidence: ZConfidenceLevel.describe('The confidence in the detection'), }); export type DetectedField = z.infer; export const ZSubmitDetectedFieldsInputSchema = z.object({ fields: z .array(ZDetectedFieldSchema) .describe('List of detected EMPTY fillable fields. Exclude pre-filled content and label text.'), }); export type SubmitDetectedFieldsInput = z.infer;