{"version":3,"file":"validation.mjs","names":[],"sources":["../../../src/batteries/validation/validation.ts"],"sourcesContent":["/**\n * Runtime validation for ordering guard options.\n *\n * @module @nhtio/adk/batteries/validation/validation\n *\n * @remarks\n * This validates the public, declarative rule shape before middleware resolution. Profile names are\n * deliberately accepted alongside profile objects so consumers can extend the built-in catalog.\n */\n\nimport { validator } from '@nhtio/validation'\nimport { E_INVALID_ORDERING_GUARD_OPTIONS } from './exceptions'\nimport type { OrderingGuardOptions } from './types'\n\nconst primitiveKindSchema = validator.string().valid('message', 'thought', 'toolCall')\nconst roleSchema = validator.string().valid('user', 'assistant')\n\nconst orderRuleSchema = validator\n  .object({\n    type: validator.string().valid('order').required(),\n    id: validator.string().required(),\n    before: primitiveKindSchema.required(),\n    after: primitiveKindSchema.required(),\n    scope: validator.string().valid('adjacent-same-role-group', 'entire-turn').required(),\n    onlyLatestGroup: validator.boolean().optional(),\n    // Optional; absent means `advisory` for EVERY rule type. See OrderRule.severity.\n    severity: validator.string().valid('blocking', 'advisory').optional(),\n  })\n  .unknown(false)\n\nconst requiredMetadataRuleSchema = validator\n  .object({\n    type: validator.string().valid('requiredMetadata').required(),\n    id: validator.string().required(),\n    kind: primitiveKindSchema.required(),\n    applyTo: validator.string().valid('first-in-group', 'every').required(),\n    requiredPayloadKey: validator.string().required(),\n    severity: validator.string().valid('blocking', 'advisory').optional(),\n    gatedByReplayCompatibility: validator.array().items(validator.string()).optional(),\n    fallbackPayloadValue: validator.any().optional(),\n    fallbackReplayCompatibility: validator.string().optional(),\n    fallbackRepairAuthorized: validator.boolean().optional(),\n  })\n  .unknown(false)\n\nconst alternationRuleSchema = validator\n  .object({\n    type: validator.string().valid('alternation').required(),\n    id: validator.string().required(),\n    roles: validator.array().items(roleSchema).required(),\n    mode: validator.string().valid('strict').required(),\n    maxPerGroup: validator.number().integer().min(0).optional(),\n    // Optional; absent means `advisory` for EVERY rule type. See OrderRule.severity.\n    severity: validator.string().valid('blocking', 'advisory').optional(),\n  })\n  .unknown(false)\n\nconst adjacencyRuleSchema = validator\n  .object({\n    type: validator.string().valid('adjacency').required(),\n    id: validator.string().required(),\n    first: primitiveKindSchema.required(),\n    disallowBetween: validator.array().items(primitiveKindSchema).required(),\n    // Optional; absent means `advisory` for EVERY rule type. See OrderRule.severity.\n    severity: validator.string().valid('blocking', 'advisory').optional(),\n  })\n  .unknown(false)\n\nconst preservationRuleSchema = validator\n  .object({\n    type: validator.string().valid('preservation').required(),\n    id: validator.string().required(),\n    kind: primitiveKindSchema.required(),\n    invariant: validator\n      .string()\n      .valid('count-non-decreasing', 'payload-field-stable', 'pruned-after-latest-turn')\n      .required(),\n    payloadField: validator.string().optional(),\n    resetOnModelSwitch: validator.boolean().optional(),\n    // Optional; absent means `advisory` for EVERY rule type. See OrderRule.severity.\n    severity: validator.string().valid('blocking', 'advisory').optional(),\n  })\n  .unknown(false)\n\nconst roleRemapRuleSchema = validator\n  .object({\n    type: validator.string().valid('roleRemap').required(),\n    id: validator.string().required(),\n    kind: primitiveKindSchema.required(),\n    variant: validator.string().required(),\n    expectedRoleTag: validator.string().required(),\n    // Optional; absent means `advisory`. See RoleRemapRule.severity — the tag is a\n    // consumer-supplied payload field, so blocking is opt-in rather than the default.\n    severity: validator.string().valid('blocking', 'advisory').optional(),\n  })\n  .unknown(false)\n\nconst identifierFormatRuleSchema = validator\n  .object({\n    type: validator.string().valid('identifierFormat').required(),\n    id: validator.string().required(),\n    kind: primitiveKindSchema.required(),\n    maxLength: validator.number().integer().positive().optional(),\n    allowedPattern: validator.string().optional(),\n    severity: validator.string().valid('blocking', 'advisory').optional(),\n  })\n  .unknown(false)\n\nconst identifierUniquenessRuleSchema = validator\n  .object({\n    type: validator.string().valid('identifierUniqueness').required(),\n    id: validator.string().required(),\n    kind: primitiveKindSchema.required(),\n    renameStrategy: validator.function().optional(),\n    severity: validator.string().valid('blocking', 'advisory').optional(),\n    surface: validator.string().valid('dispatch', 'turn', 'both').optional(),\n  })\n  .unknown(false)\n\nconst nonEmptyTurnRuleSchema = validator\n  .object({\n    type: validator.string().valid('nonEmptyTurn').required(),\n    id: validator.string().required(),\n    role: validator.string().valid('assistant', 'user').required(),\n    onlyTerminal: validator.boolean().optional(),\n    severity: validator.string().valid('blocking', 'advisory').optional(),\n  })\n  .unknown(false)\n\nconst toolIdentityRuleSchema = validator\n  .object({\n    type: validator.string().valid('toolIdentity').required(),\n    id: validator.string().required(),\n    severity: validator.string().valid('blocking', 'advisory').optional(),\n  })\n  .unknown(false)\n\nconst schemaIntegrityRuleSchema = validator\n  .object({\n    type: validator.string().valid('schemaIntegrity').required(),\n    id: validator.string().required(),\n    severity: validator.string().valid('blocking', 'advisory').optional(),\n  })\n  .unknown(false)\n\nconst staleContentAdvisoryRuleSchema = validator\n  .object({\n    type: validator.string().valid('staleContentAdvisory').required(),\n    id: validator.string().required(),\n    kind: primitiveKindSchema.required(),\n    scope: validator.string().valid('before-latest-user-turn').required(),\n    optOutOptionKey: validator.string().required(),\n  })\n  .unknown(false)\n\nconst orderingRuleSchema = validator.alternatives(\n  orderRuleSchema,\n  requiredMetadataRuleSchema,\n  alternationRuleSchema,\n  adjacencyRuleSchema,\n  preservationRuleSchema,\n  roleRemapRuleSchema,\n  staleContentAdvisoryRuleSchema,\n  identifierFormatRuleSchema,\n  identifierUniquenessRuleSchema,\n  nonEmptyTurnRuleSchema,\n  toolIdentityRuleSchema,\n  schemaIntegrityRuleSchema\n)\n\nconst orderingProfileSchema = validator\n  .object({\n    name: validator.string().required(),\n    description: validator.string().required(),\n    permissive: validator.boolean().optional(),\n    rules: validator.array().items(orderingRuleSchema).required(),\n  })\n  .unknown(false)\n\nconst orderingGuardOptionsSchema = validator\n  .object({\n    profiles: validator\n      .array()\n      .items(validator.alternatives(validator.string(), orderingProfileSchema))\n      .min(1)\n      .required(),\n    mode: validator.string().valid('union-of-rules', 'each', 'first-match').optional(),\n    action: validator.string().valid('enforce', 'mutate').optional(),\n    onRepair: validator.string().valid('log', 'silent').optional(),\n    onViolation: validator.string().valid('nack', 'throw').optional(),\n    snapshotStashKey: validator.string().optional(),\n    disableAdvisoryRuleIds: validator.array().items(validator.string()).optional(),\n    allowMetadataFallbackRepair: validator.boolean().optional(),\n  })\n  .unknown(false)\n\n/**\n * Validates and returns ordering guard options.\n *\n * @param options - Candidate guard options.\n * @returns The validated options, preserving the caller's values.\n * @throws E_INVALID_ORDERING_GUARD_OPTIONS when the declarative shape is invalid.\n */\nexport const validateOptions = (options: OrderingGuardOptions): OrderingGuardOptions => {\n  const { value, error } = orderingGuardOptionsSchema.validate(options, {\n    abortEarly: false,\n    convert: false,\n  })\n  if (error) {\n    const detail = error.details.map((entry) => entry.message).join(' and ')\n    throw new E_INVALID_ORDERING_GUARD_OPTIONS([detail], { cause: error })\n  }\n  return value as OrderingGuardOptions\n}\n"],"mappings":"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"}