{"version":3,"file":"validation.cjs","names":[],"sources":["../../../../src/batteries/generation/gemini/validation.ts"],"sourcesContent":["/**\n * Runtime validation schema and wrapper for Gemini media generation adapter options.\n *\n * @module @nhtio/adk/batteries/generation/gemini/validation\n *\n * @remarks\n * Validates `GeminiGenerationAdapterOptions` at construction time. Throws\n * `E_INVALID_GEMINI_GENERATION_OPTIONS` on failure — the same hard-fail policy as every other ADK\n * contract. `model` is required; unknown top-level keys are rejected so typos fail loud.\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { validator, ValidationError } from '@nhtio/validation'\nimport { E_INVALID_GEMINI_GENERATION_OPTIONS } from './exceptions'\nimport type { GeminiGenerationAdapterOptions } from './types'\n\nconst retrySchema = validator\n  .object({\n    maxAttempts: validator.number().integer().min(1).default(1),\n    baseDelayMs: validator.number().integer().min(0).default(500),\n    maxDelayMs: validator.number().integer().min(1).default(30_000),\n    retriableStatuses: validator\n      .array()\n      .items(validator.number().integer().min(100).max(599))\n      .default([429, 500, 502, 503, 504]),\n    honorRetryAfter: validator.boolean().default(true),\n  })\n  .unknown(false)\n\n/**\n * Validator schema for `GeminiGenerationAdapterOptions`. Rejects unknown top-level keys.\n */\nexport const geminiGenerationOptionsSchema = validator\n  .object<GeminiGenerationAdapterOptions>({\n    // Shared base\n    model: validator.string().min(1).required(),\n    // HTTP transport\n    apiKey: validator.string().optional(),\n    baseURL: validator.string().optional(),\n    headers: validator.object().pattern(validator.string(), validator.string()).optional(),\n    fetch: validator.function().optional(),\n    retry: retrySchema.optional(),\n    requestTimeoutMs: validator.number().integer().min(0).default(0),\n    // Gemini generation knobs\n    responseModalities: validator\n      .array()\n      .items(validator.string().valid('TEXT', 'IMAGE'))\n      .default(['TEXT', 'IMAGE']),\n    aspectRatio: validator.string().optional(),\n  })\n  .unknown(false)\n\nconst formatValidationDetails = (err: ValidationError): string =>\n  err.details.map((d) => d.message).join(' and ')\n\n/**\n * Validates an arbitrary input against `geminiGenerationOptionsSchema` and returns the resolved\n * options shape. Throws `E_INVALID_GEMINI_GENERATION_OPTIONS` (carrying the validator's report on\n * `cause`) on failure.\n *\n * @param input - The raw options object to validate.\n * @returns The resolved options object with defaults filled in.\n */\nexport const validateOptions = (input: unknown): GeminiGenerationAdapterOptions => {\n  const { value, error } = geminiGenerationOptionsSchema.validate(input, {\n    abortEarly: false,\n    convert: false,\n  })\n  if (error) {\n    throw new E_INVALID_GEMINI_GENERATION_OPTIONS([formatValidationDetails(error)], {\n      cause: error,\n    })\n  }\n  return value as GeminiGenerationAdapterOptions\n}\n\nconst isValidationError = (value: unknown): value is ValidationError =>\n  isError(value) && Array.isArray((value as ValidationError).details)\n\nvoid isValidationError\n"],"mappings":";;;;;;AAgBA,IAAM,cAAc,kBAAA,UACjB,OAAO;CACN,aAAa,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;CAC1D,aAAa,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG;CAC5D,YAAY,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAM;CAC9D,mBAAmB,kBAAA,UAChB,MAAM,EACN,MAAM,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG,CAAC,EACpD,QAAQ;EAAC;EAAK;EAAK;EAAK;EAAK;CAAG,CAAC;CACpC,iBAAiB,kBAAA,UAAU,QAAQ,EAAE,QAAQ,IAAI;AACnD,CAAC,EACA,QAAQ,KAAK;;;;AAKhB,IAAa,gCAAgC,kBAAA,UAC1C,OAAuC;CAEtC,OAAO,kBAAA,UAAU,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;CAE1C,QAAQ,kBAAA,UAAU,OAAO,EAAE,SAAS;CACpC,SAAS,kBAAA,UAAU,OAAO,EAAE,SAAS;CACrC,SAAS,kBAAA,UAAU,OAAO,EAAE,QAAQ,kBAAA,UAAU,OAAO,GAAG,kBAAA,UAAU,OAAO,CAAC,EAAE,SAAS;CACrF,OAAO,kBAAA,UAAU,SAAS,EAAE,SAAS;CACrC,OAAO,YAAY,SAAS;CAC5B,kBAAkB,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;CAE/D,oBAAoB,kBAAA,UACjB,MAAM,EACN,MAAM,kBAAA,UAAU,OAAO,EAAE,MAAM,QAAQ,OAAO,CAAC,EAC/C,QAAQ,CAAC,QAAQ,OAAO,CAAC;CAC5B,aAAa,kBAAA,UAAU,OAAO,EAAE,SAAS;AAC3C,CAAC,EACA,QAAQ,KAAK;AAEhB,IAAM,2BAA2B,QAC/B,IAAI,QAAQ,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO;;;;;;;;;AAUhD,IAAa,mBAAmB,UAAmD;CACjF,MAAM,EAAE,OAAO,UAAU,8BAA8B,SAAS,OAAO;EACrE,YAAY;EACZ,SAAS;CACX,CAAC;CACD,IAAI,OACF,MAAM,IAAI,+CAAA,oCAAoC,CAAC,wBAAwB,KAAK,CAAC,GAAG,EAC9E,OAAO,MACT,CAAC;CAEH,OAAO;AACT"}