/** * Configuration Validator for AgentRouter * * Validates configuration objects against a JSON Schema using AJV. * Provides detailed, human-readable error messages on validation failure. */ import { type ErrorObject } from 'ajv'; import { type Config } from '../types.js'; /** * Validation result returned by the validator. */ export interface ValidationResult { /** Whether validation passed */ valid: boolean; /** Array of error messages (empty if valid) */ errors: string[]; /** Detailed error objects from AJV */ details?: ErrorObject[]; } /** * Configuration validator using AJV. */ export declare class ConfigValidator { private ajv; private validateFull; private validatePartial; constructor(); /** * Validate a complete configuration object. * Throws ConfigurationError if validation fails. * * @param config - Configuration object to validate * @returns The validated config (typed as Config) * @throws ConfigurationError if validation fails */ validate(config: unknown): Config; /** * Validate a partial configuration object (for merging). * Throws ConfigurationError if validation fails. * * @param config - Partial configuration object to validate * @returns The validated partial config * @throws ConfigurationError if validation fails */ validatePartialConfig(config: unknown): Partial; /** * Validate configuration and return a result object instead of throwing. * * @param config - Configuration object to validate * @param partial - Whether to validate as partial config * @returns ValidationResult with valid flag and any errors */ validateConfig(config: unknown, partial?: boolean): ValidationResult; /** * Perform semantic validation beyond schema validation. * Checks for logical consistency like provider references. * * @param config - Config object that passed schema validation * @throws ConfigurationError if semantic validation fails */ private validateSemantics; /** * Format AJV errors into human-readable messages. * * @param errors - Array of AJV error objects * @returns Array of formatted error strings */ private formatErrors; /** * Get a human-readable message for an AJV error. * * @param error - AJV error object * @returns Human-readable error message */ private getErrorMessage; } /** * Convenience function to validate a configuration object. * Creates a new validator instance and validates the config. * * @param config - Configuration object to validate * @returns The validated config * @throws ConfigurationError if validation fails */ export declare function validateConfig(config: unknown): Config; /** * Convenience function to check if a config is valid without throwing. * * @param config - Configuration object to check * @returns True if valid, false otherwise */ export declare function isValidConfig(config: unknown): config is Config; /** * Export the schema for external use (e.g., generating schema.json). */ export declare const configSchema: { readonly $schema: "http://json-schema.org/draft-07/schema#"; readonly type: "object"; readonly required: readonly ["version", "defaults", "roles", "providers"]; readonly additionalProperties: false; readonly properties: { readonly version: { readonly type: "string"; readonly pattern: "^\\d+\\.\\d+$"; readonly description: "Configuration schema version (e.g., \"1.0\")"; }; readonly defaults: { readonly type: "object"; readonly required: readonly ["temperature", "max_tokens", "timeout_ms"]; readonly additionalProperties: false; readonly properties: { readonly temperature: { readonly type: "number"; readonly minimum: 0; readonly maximum: 2; readonly description: "Default temperature for LLM requests (0-2)"; }; readonly max_tokens: { readonly type: "integer"; readonly minimum: 1; readonly maximum: 200000; readonly description: "Default maximum tokens for LLM responses"; }; readonly timeout_ms: { readonly type: "integer"; readonly minimum: 1000; readonly maximum: 600000; readonly description: "Default timeout in milliseconds (1s-10min)"; }; readonly failover: { readonly type: "object"; readonly additionalProperties: false; readonly properties: { readonly enabled: { readonly type: "boolean"; readonly description: "Enable automatic failover"; }; readonly max_total_retries: { readonly type: "integer"; readonly minimum: 0; readonly maximum: 20; readonly description: "Maximum total retries across all providers"; }; readonly health_check_interval_ms: { readonly type: "integer"; readonly minimum: 1000; readonly maximum: 3600000; readonly description: "Health check interval in ms"; }; readonly cooldown_ms: { readonly type: "integer"; readonly minimum: 0; readonly maximum: 3600000; readonly description: "Cooldown period before retrying unhealthy provider"; }; readonly prefer_cost_efficient: { readonly type: "boolean"; readonly description: "Prefer cheapest healthy provider"; }; }; }; }; }; readonly roles: { readonly type: "object"; readonly minProperties: 1; readonly additionalProperties: { readonly $ref: "#/$defs/roleConfig"; }; readonly description: "Role definitions mapping role names to configurations"; }; readonly providers: { readonly type: "object"; readonly minProperties: 1; readonly additionalProperties: { readonly $ref: "#/$defs/providerConfig"; }; readonly description: "Provider configurations"; }; }; readonly $defs: { readonly roleConfig: { readonly type: "object"; readonly required: readonly ["provider", "model"]; readonly additionalProperties: false; readonly properties: { readonly provider: { readonly type: "string"; readonly minLength: 1; readonly description: "Provider name (must match a key in providers)"; }; readonly model: { readonly type: "string"; readonly minLength: 1; readonly description: "Model identifier"; }; readonly system_prompt: { readonly type: "string"; readonly description: "System prompt / persona for this role"; }; readonly temperature: { readonly type: "number"; readonly minimum: 0; readonly maximum: 2; readonly description: "Temperature override (0-2)"; }; readonly max_tokens: { readonly type: "integer"; readonly minimum: 1; readonly maximum: 200000; readonly description: "Max tokens override"; }; readonly timeout_ms: { readonly type: "integer"; readonly minimum: 1000; readonly maximum: 600000; readonly description: "Timeout override in milliseconds"; }; readonly fallback: { readonly $ref: "#/$defs/fallbackConfig"; }; readonly fallback_chain: { readonly $ref: "#/$defs/fallbackChainConfig"; }; }; }; readonly fallbackConfig: { readonly type: "object"; readonly required: readonly ["provider", "model"]; readonly additionalProperties: false; readonly properties: { readonly provider: { readonly type: "string"; readonly minLength: 1; readonly description: "Fallback provider name"; }; readonly model: { readonly type: "string"; readonly minLength: 1; readonly description: "Fallback model identifier"; }; }; }; readonly fallbackChainConfig: { readonly type: "object"; readonly additionalProperties: false; readonly properties: { readonly providers: { readonly type: "array"; readonly minItems: 1; readonly items: { readonly type: "object"; readonly required: readonly ["provider", "model"]; readonly additionalProperties: false; readonly properties: { readonly provider: { readonly type: "string"; readonly minLength: 1; readonly description: "Provider name"; }; readonly model: { readonly type: "string"; readonly minLength: 1; readonly description: "Model identifier"; }; }; }; readonly description: "Ordered list of fallback providers"; }; readonly on_errors: { readonly type: "array"; readonly items: { readonly type: "integer"; readonly minimum: 100; readonly maximum: 599; }; readonly description: "HTTP status codes that trigger failover"; }; readonly retry: { readonly type: "object"; readonly additionalProperties: false; readonly properties: { readonly max_attempts: { readonly type: "integer"; readonly minimum: 0; readonly maximum: 10; readonly description: "Maximum retry attempts per provider"; }; readonly initial_delay_ms: { readonly type: "integer"; readonly minimum: 0; readonly maximum: 60000; readonly description: "Initial delay before first retry"; }; readonly max_delay_ms: { readonly type: "integer"; readonly minimum: 0; readonly maximum: 300000; readonly description: "Maximum delay between retries"; }; readonly strategy: { readonly type: "string"; readonly enum: readonly ["immediate", "linear", "exponential"]; readonly description: "Backoff strategy"; }; }; }; readonly health_check_interval_ms: { readonly type: "integer"; readonly minimum: 1000; readonly maximum: 3600000; readonly description: "Health check interval in ms"; }; readonly cooldown_ms: { readonly type: "integer"; readonly minimum: 0; readonly maximum: 3600000; readonly description: "Cooldown before retrying unhealthy provider"; }; }; }; readonly providerConfig: { readonly type: "object"; readonly additionalProperties: false; readonly properties: { readonly api_key: { readonly type: "string"; readonly description: "API key (supports ${ENV_VAR} interpolation)"; }; readonly base_url: { readonly type: "string"; readonly format: "uri"; readonly description: "Base URL for the provider API"; }; readonly organization: { readonly type: "string"; readonly description: "Organization ID (OpenAI)"; }; readonly project: { readonly type: "string"; readonly description: "Project ID (Google Cloud)"; }; readonly location: { readonly type: "string"; readonly description: "Region/location (Google Cloud)"; }; readonly headers: { readonly type: "object"; readonly additionalProperties: { readonly type: "string"; }; readonly description: "Additional headers for API requests"; }; readonly access_mode: { readonly type: "string"; readonly enum: readonly ["api", "session", "auto", "subscription"]; readonly description: "Access mode for Anthropic provider: \"api\" (direct API), \"session\" (Claude session delegation), \"auto\" (auto-detect), or \"subscription\" (deprecated legacy subprocess mode)"; }; readonly default_model: { readonly type: "string"; readonly description: "Default model for this provider"; }; }; }; }; }; //# sourceMappingURL=validator.d.ts.map