{"version":3,"sources":["../../src/generated/config-schema.ts","../../src/config.ts","../../src/utils/config-loader.ts","../../src/sdk.ts"],"sourcesContent":["// AUTO-GENERATED FILE. DO NOT EDIT.\n// Generated by scripts/generate-config-schema.js from src/types/config.ts\nexport const configSchema = {\n  $schema: 'http://json-schema.org/draft-07/schema#',\n  $ref: '#/definitions/VisorConfig',\n  definitions: {\n    VisorConfig: {\n      type: 'object',\n      properties: {\n        version: {\n          type: 'string',\n          description: 'Configuration version',\n        },\n        extends: {\n          anyOf: [\n            {\n              type: 'string',\n            },\n            {\n              type: 'array',\n              items: {\n                type: 'string',\n              },\n            },\n          ],\n          description:\n            'Extends from other configurations - can be file path, HTTP(S) URL, or \"default\"',\n        },\n        steps: {\n          $ref: '#/definitions/Record%3Cstring%2CCheckConfig%3E',\n          description: 'Step configurations (recommended)',\n        },\n        checks: {\n          $ref: '#/definitions/Record%3Cstring%2CCheckConfig%3E',\n          description:\n            \"Check configurations (legacy, use 'steps' instead) - always populated after normalization\",\n        },\n        output: {\n          $ref: '#/definitions/OutputConfig',\n          description: 'Output configuration',\n        },\n        http_server: {\n          $ref: '#/definitions/HttpServerConfig',\n          description: 'HTTP server configuration for receiving webhooks',\n        },\n        memory: {\n          $ref: '#/definitions/MemoryConfig',\n          description: 'Memory storage configuration',\n        },\n        env: {\n          $ref: '#/definitions/EnvConfig',\n          description: 'Global environment variables',\n        },\n        ai_model: {\n          type: 'string',\n          description: 'Global AI model setting',\n        },\n        ai_provider: {\n          type: 'string',\n          description: 'Global AI provider setting',\n        },\n        ai_mcp_servers: {\n          $ref: '#/definitions/Record%3Cstring%2CMcpServerConfig%3E',\n          description: 'Global MCP servers configuration for AI checks',\n        },\n        max_parallelism: {\n          type: 'number',\n          description: 'Maximum number of checks to run in parallel (default: 3)',\n        },\n        fail_fast: {\n          type: 'boolean',\n          description: 'Stop execution when any check fails (default: false)',\n        },\n        fail_if: {\n          type: 'string',\n          description: 'Simple global fail condition - fails if expression evaluates to true',\n        },\n        failure_conditions: {\n          $ref: '#/definitions/FailureConditions',\n          description: 'Global failure conditions - optional (deprecated, use fail_if)',\n        },\n        tag_filter: {\n          $ref: '#/definitions/TagFilter',\n          description: 'Tag filter for selective check execution',\n        },\n        routing: {\n          $ref: '#/definitions/RoutingDefaults',\n          description: 'Optional routing defaults for retry/goto/run policies',\n        },\n      },\n      required: ['version', 'output'],\n      additionalProperties: false,\n      description: 'Main Visor configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    'Record<string,CheckConfig>': {\n      type: 'object',\n      additionalProperties: {\n        $ref: '#/definitions/CheckConfig',\n      },\n    },\n    CheckConfig: {\n      type: 'object',\n      properties: {\n        type: {\n          $ref: '#/definitions/ConfigCheckType',\n          description: \"Type of check to perform (defaults to 'ai' if not specified)\",\n        },\n        prompt: {\n          type: 'string',\n          description:\n            'AI prompt for the check - can be inline string or file path (auto-detected) - required for AI checks',\n        },\n        appendPrompt: {\n          type: 'string',\n          description:\n            'Additional prompt to append when extending configurations - merged with parent prompt',\n        },\n        exec: {\n          type: 'string',\n          description:\n            'Command execution with Liquid template support - required for command checks',\n        },\n        stdin: {\n          type: 'string',\n          description:\n            'Stdin input for tools with Liquid template support - optional for tool checks',\n        },\n        url: {\n          type: 'string',\n          description: 'HTTP URL - required for http output checks',\n        },\n        body: {\n          type: 'string',\n          description: 'HTTP body template (Liquid) - required for http output checks',\n        },\n        method: {\n          type: 'string',\n          description: 'HTTP method (defaults to POST)',\n        },\n        headers: {\n          $ref: '#/definitions/Record%3Cstring%2Cstring%3E',\n          description: 'HTTP headers',\n        },\n        endpoint: {\n          type: 'string',\n          description: 'HTTP endpoint path - required for http_input checks',\n        },\n        transform: {\n          type: 'string',\n          description: 'Transform template for http_input data (Liquid) - optional',\n        },\n        transform_js: {\n          type: 'string',\n          description:\n            'Transform using JavaScript expressions (evaluated in secure sandbox) - optional',\n        },\n        schedule: {\n          type: 'string',\n          description: 'Cron schedule expression (e.g., \"0 2 * * *\") - optional for any check type',\n        },\n        focus: {\n          type: 'string',\n          description:\n            'Focus area for the check (security/performance/style/architecture/all) - optional',\n        },\n        command: {\n          type: 'string',\n          description:\n            'Command that triggers this check (e.g., \"review\", \"security-scan\") - optional',\n        },\n        on: {\n          type: 'array',\n          items: {\n            $ref: '#/definitions/EventTrigger',\n          },\n          description: \"Events that trigger this check (defaults to ['manual'] if not specified)\",\n        },\n        triggers: {\n          type: 'array',\n          items: {\n            type: 'string',\n          },\n          description: 'File patterns that trigger this check (optional)',\n        },\n        ai: {\n          $ref: '#/definitions/AIProviderConfig',\n          description: 'AI provider configuration (optional)',\n        },\n        ai_model: {\n          type: 'string',\n          description: 'AI model to use for this check - overrides global setting',\n        },\n        ai_provider: {\n          type: 'string',\n          description: 'AI provider to use for this check - overrides global setting',\n        },\n        ai_mcp_servers: {\n          $ref: '#/definitions/Record%3Cstring%2CMcpServerConfig%3E',\n          description: 'MCP servers for this AI check - overrides global setting',\n        },\n        claude_code: {\n          $ref: '#/definitions/ClaudeCodeConfig',\n          description: 'Claude Code configuration (for claude-code type checks)',\n        },\n        env: {\n          $ref: '#/definitions/EnvConfig',\n          description: 'Environment variables for this check',\n        },\n        timeout: {\n          type: 'number',\n          description: 'Timeout in seconds for command execution (default: 60)',\n        },\n        depends_on: {\n          type: 'array',\n          items: {\n            type: 'string',\n          },\n          description: 'Check IDs that this check depends on (optional)',\n        },\n        group: {\n          type: 'string',\n          description:\n            'Group name for comment separation (e.g., \"code-review\", \"pr-overview\") - optional',\n        },\n        schema: {\n          anyOf: [\n            {\n              type: 'string',\n            },\n            {\n              $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n            },\n          ],\n          description:\n            'Schema type for template rendering (e.g., \"code-review\", \"markdown\") or inline JSON schema object - optional',\n        },\n        template: {\n          $ref: '#/definitions/CustomTemplateConfig',\n          description: 'Custom template configuration - optional',\n        },\n        if: {\n          type: 'string',\n          description:\n            'Condition to determine if check should run - runs if expression evaluates to true',\n        },\n        reuse_ai_session: {\n          type: ['string', 'boolean'],\n          description:\n            'Check name to reuse AI session from, or true to use first dependency (only works with depends_on)',\n        },\n        session_mode: {\n          type: 'string',\n          enum: ['clone', 'append'],\n          description:\n            \"How to reuse AI session: 'clone' (default, copy history) or 'append' (share history)\",\n        },\n        fail_if: {\n          type: 'string',\n          description: 'Simple fail condition - fails check if expression evaluates to true',\n        },\n        failure_conditions: {\n          $ref: '#/definitions/FailureConditions',\n          description: 'Check-specific failure conditions - optional (deprecated, use fail_if)',\n        },\n        tags: {\n          type: 'array',\n          items: {\n            type: 'string',\n          },\n          description:\n            'Tags for categorizing and filtering checks (e.g., [\"local\", \"fast\", \"security\"])',\n        },\n        forEach: {\n          type: 'boolean',\n          description: 'Process output as array and run dependent checks for each item',\n        },\n        on_fail: {\n          $ref: '#/definitions/OnFailConfig',\n          description: 'Failure routing configuration for this check (retry/goto/run)',\n        },\n        on_success: {\n          $ref: '#/definitions/OnSuccessConfig',\n          description:\n            'Success routing configuration for this check (post-actions and optional goto)',\n        },\n        message: {\n          type: 'string',\n          description: 'Message template for log checks',\n        },\n        level: {\n          type: 'string',\n          enum: ['debug', 'info', 'warn', 'error'],\n          description: 'Log level for log checks',\n        },\n        include_pr_context: {\n          type: 'boolean',\n          description: 'Include PR context in log output',\n        },\n        include_dependencies: {\n          type: 'boolean',\n          description: 'Include dependency summaries in log output',\n        },\n        include_metadata: {\n          type: 'boolean',\n          description: 'Include execution metadata in log output',\n        },\n        operation: {\n          type: 'string',\n          enum: ['get', 'set', 'append', 'increment', 'delete', 'clear', 'list', 'exec_js'],\n          description: 'Memory operation to perform',\n        },\n        key: {\n          type: 'string',\n          description: 'Key for memory operation',\n        },\n        value: {\n          description: 'Value for set/append operations',\n        },\n        value_js: {\n          type: 'string',\n          description: 'JavaScript expression to compute value dynamically',\n        },\n        memory_js: {\n          type: 'string',\n          description: 'JavaScript code for exec_js operation with full memory access',\n        },\n        namespace: {\n          type: 'string',\n          description: 'Override namespace for this check',\n        },\n        op: {\n          type: 'string',\n          description:\n            \"GitHub operation to perform (e.g., 'labels.add', 'labels.remove', 'comment.create')\",\n        },\n        values: {\n          anyOf: [\n            {\n              type: 'array',\n              items: {\n                type: 'string',\n              },\n            },\n            {\n              type: 'string',\n            },\n          ],\n          description: 'Values for GitHub operations (can be array or single value)',\n        },\n        transport: {\n          type: 'string',\n          enum: ['stdio', 'sse', 'http'],\n          description:\n            'Transport type for MCP: stdio (default), sse (legacy), or http (streamable HTTP)',\n        },\n        methodArgs: {\n          $ref: '#/definitions/Record%3Cstring%2Cunknown%3E',\n          description: 'Arguments to pass to the MCP method (supports Liquid templates)',\n        },\n        argsTransform: {\n          type: 'string',\n          description: 'Transform template for method arguments (Liquid)',\n        },\n        sessionId: {\n          type: 'string',\n          description: 'Session ID for HTTP transport (optional, server may generate one)',\n        },\n        args: {\n          type: 'array',\n          items: {\n            type: 'string',\n          },\n          description: 'Command arguments (for stdio transport in MCP checks)',\n        },\n        workingDirectory: {\n          type: 'string',\n          description: 'Working directory (for stdio transport in MCP checks)',\n        },\n      },\n      additionalProperties: false,\n      description: 'Configuration for a single check',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    ConfigCheckType: {\n      type: 'string',\n      enum: [\n        'ai',\n        'command',\n        'http',\n        'http_input',\n        'http_client',\n        'noop',\n        'log',\n        'memory',\n        'github',\n        'claude-code',\n        'mcp',\n        'human-input',\n      ],\n      description: 'Valid check types in configuration',\n    },\n    'Record<string,string>': {\n      type: 'object',\n      additionalProperties: {\n        type: 'string',\n      },\n    },\n    EventTrigger: {\n      type: 'string',\n      enum: [\n        'pr_opened',\n        'pr_updated',\n        'pr_closed',\n        'issue_opened',\n        'issue_comment',\n        'manual',\n        'schedule',\n        'webhook_received',\n      ],\n      description: 'Valid event triggers for checks',\n    },\n    AIProviderConfig: {\n      type: 'object',\n      properties: {\n        provider: {\n          type: 'string',\n          enum: ['google', 'anthropic', 'openai', 'bedrock', 'mock'],\n          description: 'AI provider to use',\n        },\n        model: {\n          type: 'string',\n          description: 'Model name to use',\n        },\n        apiKey: {\n          type: 'string',\n          description: 'API key (usually from environment variables)',\n        },\n        timeout: {\n          type: 'number',\n          description: 'Request timeout in milliseconds',\n        },\n        debug: {\n          type: 'boolean',\n          description: 'Enable debug mode',\n        },\n        mcpServers: {\n          $ref: '#/definitions/Record%3Cstring%2CMcpServerConfig%3E',\n          description: 'MCP servers configuration',\n        },\n      },\n      additionalProperties: false,\n      description: 'AI provider configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    'Record<string,McpServerConfig>': {\n      type: 'object',\n      additionalProperties: {\n        $ref: '#/definitions/McpServerConfig',\n      },\n    },\n    McpServerConfig: {\n      type: 'object',\n      properties: {\n        command: {\n          type: 'string',\n          description: 'Command to execute for the MCP server',\n        },\n        args: {\n          type: 'array',\n          items: {\n            type: 'string',\n          },\n          description: 'Arguments to pass to the command',\n        },\n        env: {\n          $ref: '#/definitions/Record%3Cstring%2Cstring%3E',\n          description: 'Environment variables for the MCP server',\n        },\n      },\n      required: ['command'],\n      additionalProperties: false,\n      description: 'MCP Server configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    ClaudeCodeConfig: {\n      type: 'object',\n      properties: {\n        allowedTools: {\n          type: 'array',\n          items: {\n            type: 'string',\n          },\n          description: 'List of allowed tools for Claude Code to use',\n        },\n        maxTurns: {\n          type: 'number',\n          description: 'Maximum number of turns in conversation',\n        },\n        systemPrompt: {\n          type: 'string',\n          description: 'System prompt for Claude Code',\n        },\n        mcpServers: {\n          $ref: '#/definitions/Record%3Cstring%2CMcpServerConfig%3E',\n          description: 'MCP servers configuration',\n        },\n        subagent: {\n          type: 'string',\n          description: 'Path to subagent script',\n        },\n        hooks: {\n          type: 'object',\n          properties: {\n            onStart: {\n              type: 'string',\n              description: 'Called when check starts',\n            },\n            onEnd: {\n              type: 'string',\n              description: 'Called when check ends',\n            },\n            onError: {\n              type: 'string',\n              description: 'Called when check encounters an error',\n            },\n          },\n          additionalProperties: false,\n          description: 'Event hooks for lifecycle management',\n          patternProperties: {\n            '^x-': {},\n          },\n        },\n      },\n      additionalProperties: false,\n      description: 'Claude Code configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    EnvConfig: {\n      type: 'object',\n      additionalProperties: {\n        type: ['string', 'number', 'boolean'],\n      },\n      description: 'Environment variable reference configuration',\n    },\n    'Record<string,unknown>': {\n      type: 'object',\n      additionalProperties: {},\n    },\n    CustomTemplateConfig: {\n      type: 'object',\n      properties: {\n        file: {\n          type: 'string',\n          description: 'Path to custom template file (relative to config file or absolute)',\n        },\n        content: {\n          type: 'string',\n          description: 'Raw template content as string',\n        },\n      },\n      additionalProperties: false,\n      description: 'Custom template configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    FailureConditions: {\n      type: 'object',\n      additionalProperties: {\n        $ref: '#/definitions/FailureCondition',\n      },\n      description: 'Collection of failure conditions',\n    },\n    FailureCondition: {\n      anyOf: [\n        {\n          $ref: '#/definitions/SimpleFailureCondition',\n        },\n        {\n          $ref: '#/definitions/ComplexFailureCondition',\n        },\n      ],\n      description: 'Failure condition - can be a simple expression string or complex object',\n    },\n    SimpleFailureCondition: {\n      type: 'string',\n      description: 'Simple failure condition - just an expression string',\n    },\n    ComplexFailureCondition: {\n      type: 'object',\n      properties: {\n        condition: {\n          type: 'string',\n          description: 'Expression to evaluate using Function Constructor',\n        },\n        message: {\n          type: 'string',\n          description: 'Human-readable message when condition is met',\n        },\n        severity: {\n          $ref: '#/definitions/FailureConditionSeverity',\n          description: 'Severity level of the failure',\n        },\n        halt_execution: {\n          type: 'boolean',\n          description: 'Whether this condition should halt execution',\n        },\n      },\n      required: ['condition'],\n      additionalProperties: false,\n      description: 'Complex failure condition with additional metadata',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    FailureConditionSeverity: {\n      type: 'string',\n      enum: ['error', 'warning', 'info'],\n      description: 'Failure condition severity levels',\n    },\n    OnFailConfig: {\n      type: 'object',\n      properties: {\n        retry: {\n          $ref: '#/definitions/RetryPolicy',\n          description: 'Retry policy',\n        },\n        run: {\n          type: 'array',\n          items: {\n            type: 'string',\n          },\n          description: 'Remediation steps to run before reattempt',\n        },\n        goto: {\n          type: 'string',\n          description: 'Jump back to an ancestor step (by id)',\n        },\n        goto_event: {\n          $ref: '#/definitions/EventTrigger',\n          description: \"Simulate a different event when performing goto (e.g., 'pr_updated')\",\n        },\n        goto_js: {\n          type: 'string',\n          description: 'Dynamic goto: JS expression returning step id or null',\n        },\n        run_js: {\n          type: 'string',\n          description: 'Dynamic remediation list: JS expression returning string[]',\n        },\n      },\n      additionalProperties: false,\n      description: 'Failure routing configuration per check',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    RetryPolicy: {\n      type: 'object',\n      properties: {\n        max: {\n          type: 'number',\n          description: 'Maximum retry attempts (excluding the first attempt)',\n        },\n        backoff: {\n          $ref: '#/definitions/BackoffPolicy',\n          description: 'Backoff policy',\n        },\n      },\n      additionalProperties: false,\n      description: 'Retry policy for a step',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    BackoffPolicy: {\n      type: 'object',\n      properties: {\n        mode: {\n          type: 'string',\n          enum: ['fixed', 'exponential'],\n          description: 'Backoff mode',\n        },\n        delay_ms: {\n          type: 'number',\n          description: 'Initial delay in milliseconds',\n        },\n      },\n      additionalProperties: false,\n      description: 'Backoff policy for retries',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    OnSuccessConfig: {\n      type: 'object',\n      properties: {\n        run: {\n          type: 'array',\n          items: {\n            type: 'string',\n          },\n          description: 'Post-success steps to run',\n        },\n        goto: {\n          type: 'string',\n          description: 'Optional jump back to ancestor step (by id)',\n        },\n        goto_event: {\n          $ref: '#/definitions/EventTrigger',\n          description: \"Simulate a different event when performing goto (e.g., 'pr_updated')\",\n        },\n        goto_js: {\n          type: 'string',\n          description: 'Dynamic goto: JS expression returning step id or null',\n        },\n        run_js: {\n          type: 'string',\n          description: 'Dynamic post-success steps: JS expression returning string[]',\n        },\n      },\n      additionalProperties: false,\n      description: 'Success routing configuration per check',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    OutputConfig: {\n      type: 'object',\n      properties: {\n        pr_comment: {\n          $ref: '#/definitions/PrCommentOutput',\n          description: 'PR comment configuration',\n        },\n        file_comment: {\n          $ref: '#/definitions/FileCommentOutput',\n          description: 'File comment configuration (optional)',\n        },\n        github_checks: {\n          $ref: '#/definitions/GitHubCheckOutput',\n          description: 'GitHub check runs configuration (optional)',\n        },\n        suppressionEnabled: {\n          type: 'boolean',\n          description:\n            'Whether to enable issue suppression via visor-disable comments (default: true)',\n        },\n      },\n      required: ['pr_comment'],\n      additionalProperties: false,\n      description: 'Output configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    PrCommentOutput: {\n      type: 'object',\n      properties: {\n        format: {\n          $ref: '#/definitions/ConfigOutputFormat',\n          description: 'Format of the output',\n        },\n        group_by: {\n          $ref: '#/definitions/GroupByOption',\n          description: 'How to group the results',\n        },\n        collapse: {\n          type: 'boolean',\n          description: 'Whether to collapse sections by default',\n        },\n        debug: {\n          $ref: '#/definitions/DebugConfig',\n          description: 'Debug mode configuration (optional)',\n        },\n      },\n      required: ['format', 'group_by', 'collapse'],\n      additionalProperties: false,\n      description: 'PR comment output configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    ConfigOutputFormat: {\n      type: 'string',\n      enum: ['table', 'json', 'markdown', 'sarif'],\n      description: 'Valid output formats',\n    },\n    GroupByOption: {\n      type: 'string',\n      enum: ['check', 'file', 'severity', 'group'],\n      description: 'Valid grouping options',\n    },\n    DebugConfig: {\n      type: 'object',\n      properties: {\n        enabled: {\n          type: 'boolean',\n          description: 'Enable debug mode',\n        },\n        includePrompts: {\n          type: 'boolean',\n          description: 'Include AI prompts in debug output',\n        },\n        includeRawResponses: {\n          type: 'boolean',\n          description: 'Include raw AI responses in debug output',\n        },\n        includeTiming: {\n          type: 'boolean',\n          description: 'Include timing information',\n        },\n        includeProviderInfo: {\n          type: 'boolean',\n          description: 'Include provider information',\n        },\n      },\n      required: [\n        'enabled',\n        'includePrompts',\n        'includeRawResponses',\n        'includeTiming',\n        'includeProviderInfo',\n      ],\n      additionalProperties: false,\n      description: 'Debug mode configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    FileCommentOutput: {\n      type: 'object',\n      properties: {\n        enabled: {\n          type: 'boolean',\n          description: 'Whether file comments are enabled',\n        },\n        inline: {\n          type: 'boolean',\n          description: 'Whether to show inline comments',\n        },\n      },\n      required: ['enabled', 'inline'],\n      additionalProperties: false,\n      description: 'File comment output configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    GitHubCheckOutput: {\n      type: 'object',\n      properties: {\n        enabled: {\n          type: 'boolean',\n          description: 'Whether GitHub check runs are enabled',\n        },\n        per_check: {\n          type: 'boolean',\n          description: 'Whether to create individual check runs per configured check',\n        },\n        name_prefix: {\n          type: 'string',\n          description: 'Custom name prefix for check runs',\n        },\n      },\n      required: ['enabled', 'per_check'],\n      additionalProperties: false,\n      description: 'GitHub Check Runs output configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    HttpServerConfig: {\n      type: 'object',\n      properties: {\n        enabled: {\n          type: 'boolean',\n          description: 'Whether HTTP server is enabled',\n        },\n        port: {\n          type: 'number',\n          description: 'Port to listen on',\n        },\n        host: {\n          type: 'string',\n          description: 'Host/IP to bind to (defaults to 0.0.0.0)',\n        },\n        tls: {\n          $ref: '#/definitions/TlsConfig',\n          description: 'TLS/SSL configuration for HTTPS',\n        },\n        auth: {\n          $ref: '#/definitions/HttpAuthConfig',\n          description: 'Authentication configuration',\n        },\n        endpoints: {\n          type: 'array',\n          items: {\n            $ref: '#/definitions/HttpEndpointConfig',\n          },\n          description: 'HTTP endpoints configuration',\n        },\n      },\n      required: ['enabled', 'port'],\n      additionalProperties: false,\n      description: 'HTTP server configuration for receiving webhooks',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    TlsConfig: {\n      type: 'object',\n      properties: {\n        enabled: {\n          type: 'boolean',\n          description: 'Enable TLS/HTTPS',\n        },\n        cert: {\n          type: 'string',\n          description: 'Path to TLS certificate file or certificate content',\n        },\n        key: {\n          type: 'string',\n          description: 'Path to TLS key file or key content',\n        },\n        ca: {\n          type: 'string',\n          description: 'Path to CA certificate file or CA content (optional)',\n        },\n        rejectUnauthorized: {\n          type: 'boolean',\n          description: 'Reject unauthorized connections (default: true)',\n        },\n      },\n      required: ['enabled'],\n      additionalProperties: false,\n      description: 'TLS/SSL configuration for HTTPS server',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    HttpAuthConfig: {\n      type: 'object',\n      properties: {\n        type: {\n          type: 'string',\n          enum: ['bearer_token', 'hmac', 'basic', 'none'],\n          description: 'Authentication type',\n        },\n        secret: {\n          type: 'string',\n          description: 'Secret or token for authentication',\n        },\n        username: {\n          type: 'string',\n          description: 'Username for basic auth',\n        },\n        password: {\n          type: 'string',\n          description: 'Password for basic auth',\n        },\n      },\n      required: ['type'],\n      additionalProperties: false,\n      description: 'HTTP server authentication configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    HttpEndpointConfig: {\n      type: 'object',\n      properties: {\n        path: {\n          type: 'string',\n          description: 'Path for the webhook endpoint',\n        },\n        transform: {\n          type: 'string',\n          description: 'Optional transform template (Liquid) for the received data',\n        },\n        name: {\n          type: 'string',\n          description: 'Optional name/ID for this endpoint',\n        },\n      },\n      required: ['path'],\n      additionalProperties: false,\n      description: 'HTTP server endpoint configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    MemoryConfig: {\n      type: 'object',\n      properties: {\n        storage: {\n          type: 'string',\n          enum: ['memory', 'file'],\n          description: 'Storage mode: \"memory\" (in-memory, default) or \"file\" (persistent)',\n        },\n        format: {\n          type: 'string',\n          enum: ['json', 'csv'],\n          description: 'Storage format (only for file storage, default: json)',\n        },\n        file: {\n          type: 'string',\n          description: 'File path (required if storage: file)',\n        },\n        namespace: {\n          type: 'string',\n          description: 'Default namespace (default: \"default\")',\n        },\n        auto_load: {\n          type: 'boolean',\n          description: 'Auto-load on startup (default: true if storage: file)',\n        },\n        auto_save: {\n          type: 'boolean',\n          description: 'Auto-save after operations (default: true if storage: file)',\n        },\n      },\n      additionalProperties: false,\n      description: 'Memory storage configuration',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    TagFilter: {\n      type: 'object',\n      properties: {\n        include: {\n          type: 'array',\n          items: {\n            type: 'string',\n          },\n          description: 'Tags that checks must have to be included (ANY match)',\n        },\n        exclude: {\n          type: 'array',\n          items: {\n            type: 'string',\n          },\n          description: 'Tags that will exclude checks if present (ANY match)',\n        },\n      },\n      additionalProperties: false,\n      description: 'Tag filter configuration for selective check execution',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n    RoutingDefaults: {\n      type: 'object',\n      properties: {\n        max_loops: {\n          type: 'number',\n          description: 'Per-scope cap on routing transitions (success + failure)',\n        },\n        defaults: {\n          type: 'object',\n          properties: {\n            on_fail: {\n              $ref: '#/definitions/OnFailConfig',\n            },\n          },\n          additionalProperties: false,\n          description: 'Default policies applied to checks (step-level overrides take precedence)',\n          patternProperties: {\n            '^x-': {},\n          },\n        },\n      },\n      additionalProperties: false,\n      description: 'Global routing defaults',\n      patternProperties: {\n        '^x-': {},\n      },\n    },\n  },\n} as const;\nexport default configSchema;\n","import * as yaml from 'js-yaml';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { logger } from './logger';\nimport simpleGit from 'simple-git';\nimport {\n  VisorConfig,\n  CheckConfig,\n  ConfigCheckType,\n  EventTrigger,\n  ConfigOutputFormat,\n  GroupByOption,\n  ConfigValidationError,\n  EnvironmentOverrides,\n  MergedConfig,\n  ConfigLoadOptions,\n} from './types/config';\nimport { CliOptions } from './types/cli';\nimport { ConfigLoader, ConfigLoaderOptions } from './utils/config-loader';\nimport { ConfigMerger } from './utils/config-merger';\nimport Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\n\n/**\n * Valid event triggers for checks\n * Exported as a constant to serve as the single source of truth for event validation\n */\nexport const VALID_EVENT_TRIGGERS: readonly EventTrigger[] = [\n  'pr_opened',\n  'pr_updated',\n  'pr_closed',\n  'issue_opened',\n  'issue_comment',\n  'manual',\n  'schedule',\n  'webhook_received',\n] as const;\n\n/**\n * Configuration manager for Visor\n */\nexport class ConfigManager {\n  private validCheckTypes: ConfigCheckType[] = [\n    'ai',\n    'claude-code',\n    'mcp',\n    'command',\n    'http',\n    'http_input',\n    'http_client',\n    'memory',\n    'noop',\n    'log',\n    'memory',\n    'github',\n    'human-input',\n  ];\n  private validEventTriggers: EventTrigger[] = [...VALID_EVENT_TRIGGERS];\n  private validOutputFormats: ConfigOutputFormat[] = ['table', 'json', 'markdown', 'sarif'];\n  private validGroupByOptions: GroupByOption[] = ['check', 'file', 'severity', 'group'];\n\n  /**\n   * Load configuration from a file\n   */\n  public async loadConfig(\n    configPath: string,\n    options: ConfigLoadOptions = {}\n  ): Promise<VisorConfig> {\n    const { validate = true, mergeDefaults = true, allowedRemotePatterns } = options;\n\n    // Resolve relative paths to absolute paths based on current working directory\n    const resolvedPath = path.isAbsolute(configPath)\n      ? configPath\n      : path.resolve(process.cwd(), configPath);\n\n    try {\n      if (!fs.existsSync(resolvedPath)) {\n        throw new Error(`Configuration file not found: ${resolvedPath}`);\n      }\n\n      const configContent = fs.readFileSync(resolvedPath, 'utf8');\n      let parsedConfig: Partial<VisorConfig>;\n\n      try {\n        parsedConfig = yaml.load(configContent) as Partial<VisorConfig>;\n      } catch (yamlError) {\n        const errorMessage = yamlError instanceof Error ? yamlError.message : String(yamlError);\n        throw new Error(`Invalid YAML syntax in ${resolvedPath}: ${errorMessage}`);\n      }\n\n      if (!parsedConfig || typeof parsedConfig !== 'object') {\n        throw new Error('Configuration file must contain a valid YAML object');\n      }\n\n      // Handle extends directive if present\n      if (parsedConfig.extends) {\n        const loaderOptions: ConfigLoaderOptions = {\n          baseDir: path.dirname(resolvedPath),\n          allowRemote: this.isRemoteExtendsAllowed(),\n          maxDepth: 10,\n          allowedRemotePatterns,\n        };\n\n        const loader = new ConfigLoader(loaderOptions);\n        const merger = new ConfigMerger();\n\n        // Process extends\n        const extends_ = Array.isArray(parsedConfig.extends)\n          ? parsedConfig.extends\n          : [parsedConfig.extends];\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        const { extends: _extendsField, ...configWithoutExtends } = parsedConfig;\n\n        // Load and merge all parent configurations\n        let mergedConfig: Partial<VisorConfig> = {};\n        for (const source of extends_) {\n          console.log(`📦 Extending from: ${source}`);\n          const parentConfig = await loader.fetchConfig(source);\n          mergedConfig = merger.merge(mergedConfig, parentConfig);\n        }\n\n        // Merge with current config (child overrides parent)\n        parsedConfig = merger.merge(mergedConfig, configWithoutExtends);\n\n        // Remove disabled checks (those with empty 'on' array)\n        parsedConfig = merger.removeDisabledChecks(parsedConfig);\n      }\n\n      // Normalize 'checks' and 'steps' - support both keys for backward compatibility\n      parsedConfig = this.normalizeStepsAndChecks(parsedConfig);\n\n      if (validate) {\n        this.validateConfig(parsedConfig);\n      }\n\n      let finalConfig = parsedConfig;\n      if (mergeDefaults) {\n        finalConfig = this.mergeWithDefaults(parsedConfig);\n      }\n\n      return finalConfig as VisorConfig;\n    } catch (error) {\n      if (error instanceof Error) {\n        // Pass through detailed error messages unchanged\n        if (\n          error.message.includes('not found') ||\n          error.message.includes('Invalid YAML') ||\n          error.message.includes('extends') ||\n          error.message.includes('EACCES') ||\n          error.message.includes('EISDIR')\n        ) {\n          throw error;\n        }\n        // Add more context for generic errors\n        if (error.message.includes('ENOENT')) {\n          throw new Error(`Configuration file not found: ${resolvedPath}`);\n        }\n        if (error.message.includes('EPERM')) {\n          throw new Error(`Permission denied reading configuration file: ${resolvedPath}`);\n        }\n        throw new Error(`Failed to read configuration file ${resolvedPath}: ${error.message}`);\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Find and load configuration from default locations\n   */\n  public async findAndLoadConfig(options: ConfigLoadOptions = {}): Promise<VisorConfig> {\n    // Try to find the git repository root first, fall back to current directory\n    const gitRoot = await this.findGitRepositoryRoot();\n    const searchDirs = [gitRoot, process.cwd()].filter(Boolean) as string[];\n\n    for (const baseDir of searchDirs) {\n      const possiblePaths = [path.join(baseDir, '.visor.yaml'), path.join(baseDir, '.visor.yml')];\n\n      for (const configPath of possiblePaths) {\n        if (fs.existsSync(configPath)) {\n          return this.loadConfig(configPath, options);\n        }\n      }\n    }\n\n    // Try to load bundled default config\n    const bundledConfig = this.loadBundledDefaultConfig();\n    if (bundledConfig) {\n      return bundledConfig;\n    }\n\n    // Return minimal default config if no bundled config found\n    return this.getDefaultConfig();\n  }\n\n  /**\n   * Find the git repository root directory\n   */\n  private async findGitRepositoryRoot(): Promise<string | null> {\n    try {\n      const git = simpleGit();\n      const isRepo = await git.checkIsRepo();\n      if (!isRepo) {\n        return null;\n      }\n\n      // Get the repository root directory\n      const rootDir = await git.revparse(['--show-toplevel']);\n      return rootDir.trim();\n    } catch {\n      // Not in a git repository or git not available\n      return null;\n    }\n  }\n\n  /**\n   * Get default configuration\n   */\n  public async getDefaultConfig(): Promise<VisorConfig> {\n    return {\n      version: '1.0',\n      steps: {},\n      checks: {}, // Keep for backward compatibility\n      max_parallelism: 3,\n      output: {\n        pr_comment: {\n          format: 'markdown',\n          group_by: 'check',\n          collapse: true,\n        },\n      },\n    };\n  }\n\n  /**\n   * Load bundled default configuration from the package\n   */\n  public loadBundledDefaultConfig(): VisorConfig | null {\n    try {\n      // Try different paths to find the bundled default config (support CJS and ESM)\n      const possiblePaths: string[] = [];\n\n      // __dirname is available in CJS; guard for ESM builds\n      if (typeof __dirname !== 'undefined') {\n        possiblePaths.push(\n          path.join(__dirname, 'defaults', '.visor.yaml'),\n          path.join(__dirname, '..', 'defaults', '.visor.yaml')\n        );\n      }\n\n      // Try via package root\n      const pkgRoot = this.findPackageRoot();\n      if (pkgRoot) {\n        possiblePaths.push(path.join(pkgRoot, 'defaults', '.visor.yaml'));\n      }\n\n      // GitHub Action environment variable\n      if (process.env.GITHUB_ACTION_PATH) {\n        possiblePaths.push(\n          path.join(process.env.GITHUB_ACTION_PATH, 'defaults', '.visor.yaml'),\n          path.join(process.env.GITHUB_ACTION_PATH, 'dist', 'defaults', '.visor.yaml')\n        );\n      }\n\n      let bundledConfigPath: string | undefined;\n      for (const possiblePath of possiblePaths) {\n        if (fs.existsSync(possiblePath)) {\n          bundledConfigPath = possiblePath;\n          break;\n        }\n      }\n\n      if (bundledConfigPath && fs.existsSync(bundledConfigPath)) {\n        // Always log to stderr to avoid contaminating formatted output\n        console.error(`📦 Loading bundled default configuration from ${bundledConfigPath}`);\n        const configContent = fs.readFileSync(bundledConfigPath, 'utf8');\n        let parsedConfig = yaml.load(configContent) as Partial<VisorConfig>;\n\n        if (!parsedConfig || typeof parsedConfig !== 'object') {\n          return null;\n        }\n\n        // Normalize 'checks' and 'steps' for backward compatibility\n        parsedConfig = this.normalizeStepsAndChecks(parsedConfig);\n\n        // Validate and merge with defaults\n        this.validateConfig(parsedConfig);\n        return this.mergeWithDefaults(parsedConfig) as VisorConfig;\n      }\n    } catch (error) {\n      // Silently fail and return null - will fall back to minimal default\n      console.warn(\n        'Failed to load bundled default config:',\n        error instanceof Error ? error.message : String(error)\n      );\n    }\n\n    return null;\n  }\n\n  /**\n   * Find the root directory of the Visor package\n   */\n  private findPackageRoot(): string | null {\n    let currentDir = __dirname;\n\n    // Walk up the directory tree to find package.json\n    while (currentDir !== path.dirname(currentDir)) {\n      const packageJsonPath = path.join(currentDir, 'package.json');\n      if (fs.existsSync(packageJsonPath)) {\n        try {\n          const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n          // Check if this is the Visor package\n          if (packageJson.name === '@probelabs/visor') {\n            return currentDir;\n          }\n        } catch {\n          // Continue searching if package.json is invalid\n        }\n      }\n      currentDir = path.dirname(currentDir);\n    }\n\n    return null;\n  }\n\n  /**\n   * Normalize 'checks' and 'steps' keys for backward compatibility\n   * Ensures both keys are present and contain the same data\n   */\n  private normalizeStepsAndChecks(config: Partial<VisorConfig>): Partial<VisorConfig> {\n    // If both are present, 'steps' takes precedence\n    if (config.steps && config.checks) {\n      // Use steps as the source of truth\n      config.checks = config.steps;\n    } else if (config.steps && !config.checks) {\n      // Copy steps to checks for internal compatibility\n      config.checks = config.steps;\n    } else if (config.checks && !config.steps) {\n      // Copy checks to steps for forward compatibility\n      config.steps = config.checks;\n    }\n\n    return config;\n  }\n\n  /**\n   * Merge configuration with CLI options\n   */\n  public mergeWithCliOptions(config: Partial<VisorConfig>, cliOptions: CliOptions): MergedConfig {\n    // Apply CLI overrides to the config\n    const mergedConfig = { ...config };\n\n    // Override max_parallelism if specified in CLI\n    if (cliOptions.maxParallelism !== undefined) {\n      mergedConfig.max_parallelism = cliOptions.maxParallelism;\n    }\n\n    // Override fail_fast if specified in CLI\n    if (cliOptions.failFast !== undefined) {\n      mergedConfig.fail_fast = cliOptions.failFast;\n    }\n\n    return {\n      config: mergedConfig,\n      cliChecks: cliOptions.checks || [],\n      cliOutput: cliOptions.output || 'table',\n    };\n  }\n\n  /**\n   * Load configuration with environment variable overrides\n   */\n  public async loadConfigWithEnvOverrides(): Promise<{\n    config?: VisorConfig;\n    environmentOverrides: EnvironmentOverrides;\n  }> {\n    const environmentOverrides: EnvironmentOverrides = {};\n\n    // Check for environment variable overrides\n    if (process.env.VISOR_CONFIG_PATH) {\n      environmentOverrides.configPath = process.env.VISOR_CONFIG_PATH;\n    }\n    if (process.env.VISOR_OUTPUT_FORMAT) {\n      environmentOverrides.outputFormat = process.env.VISOR_OUTPUT_FORMAT;\n    }\n\n    let config: VisorConfig | undefined;\n\n    if (environmentOverrides.configPath) {\n      try {\n        config = await this.loadConfig(environmentOverrides.configPath);\n      } catch {\n        // If environment config fails, fall back to default discovery\n        config = await this.findAndLoadConfig();\n      }\n    } else {\n      config = await this.findAndLoadConfig();\n    }\n\n    return { config, environmentOverrides };\n  }\n\n  /**\n   * Validate configuration against schema\n   * @param config The config to validate\n   * @param strict If true, treat warnings as errors (default: false)\n   */\n  public validateConfig(config: Partial<VisorConfig>, strict = false): void {\n    const errors: ConfigValidationError[] = [];\n    const warnings: ConfigValidationError[] = [];\n\n    // First, run schema-based validation (runtime-generated).\n    // Unknown keys become schema errors (we convert additionalProperties to warnings by default).\n    this.validateWithAjvSchema(config, errors, warnings);\n\n    // Validate required fields\n    if (!config.version) {\n      errors.push({\n        field: 'version',\n        message: 'Missing required field: version',\n      });\n    }\n\n    // Unknown key warnings are produced by Ajv using the pre-generated schema.\n\n    // Validate that either 'checks' or 'steps' is present\n    if (!config.checks && !config.steps) {\n      errors.push({\n        field: 'checks/steps',\n        message:\n          'Missing required field: either \"checks\" or \"steps\" must be defined. \"steps\" is recommended for new configurations.',\n      });\n    }\n\n    // Use normalized checks for validation (both should be present after normalization)\n    const checksToValidate = config.checks || config.steps;\n    if (checksToValidate) {\n      // Validate each check configuration\n      for (const [checkName, checkConfig] of Object.entries(checksToValidate)) {\n        // Default type to 'ai' if not specified\n        if (!checkConfig.type) {\n          checkConfig.type = 'ai';\n        }\n        // 'on' field is optional - if not specified, check can run on any event\n        this.validateCheckConfig(checkName, checkConfig, errors, config);\n\n        // Unknown/typo keys at the check level are produced by Ajv.\n\n        // Validate MCP servers at check-level (basic shape only)\n        if (checkConfig.ai_mcp_servers) {\n          this.validateMcpServersObject(\n            checkConfig.ai_mcp_servers,\n            `checks.${checkName}.ai_mcp_servers`,\n            errors,\n            warnings\n          );\n        }\n        if ((checkConfig as CheckConfig).ai?.mcpServers) {\n          this.validateMcpServersObject(\n            (checkConfig as CheckConfig).ai!.mcpServers as Record<string, unknown>,\n            `checks.${checkName}.ai.mcpServers`,\n            errors,\n            warnings\n          );\n        }\n        // 3) Precedence warning if both are provided\n        if (checkConfig.ai_mcp_servers && (checkConfig as CheckConfig).ai?.mcpServers) {\n          const lower = Object.keys(checkConfig.ai_mcp_servers);\n          const higher = Object.keys((checkConfig as CheckConfig).ai!.mcpServers!);\n          const overridden = lower.filter(k => higher.includes(k));\n          warnings.push({\n            field: `checks.${checkName}.ai.mcpServers`,\n            message:\n              overridden.length > 0\n                ? `Both ai_mcp_servers and ai.mcpServers are set; ai.mcpServers overrides these servers: ${overridden.join(\n                    ', '\n                  )}`\n                : 'Both ai_mcp_servers and ai.mcpServers are set; ai.mcpServers takes precedence for this check.',\n          });\n        }\n\n        // Type-specific guidance for MCP placement to avoid silent ignores\n        try {\n          const anyCheck = checkConfig as unknown as Record<string, unknown>;\n          const aiObj = (anyCheck.ai as Record<string, unknown>) || undefined;\n          const hasBareMcpAtCheck = Object.prototype.hasOwnProperty.call(anyCheck, 'mcpServers');\n          const hasAiMcp = aiObj && Object.prototype.hasOwnProperty.call(aiObj, 'mcpServers');\n          const hasClaudeCodeMcp =\n            anyCheck.claude_code &&\n            typeof anyCheck.claude_code === 'object' &&\n            Object.prototype.hasOwnProperty.call(\n              anyCheck.claude_code as Record<string, unknown>,\n              'mcpServers'\n            );\n\n          if (checkConfig.type === 'ai') {\n            if (hasBareMcpAtCheck) {\n              warnings.push({\n                field: `checks.${checkName}.mcpServers`,\n                message:\n                  \"'mcpServers' at the check root is ignored for type 'ai'. Use 'ai.mcpServers' or 'ai_mcp_servers' instead.\",\n                value: (anyCheck as any).mcpServers,\n              });\n            }\n            if (hasClaudeCodeMcp) {\n              warnings.push({\n                field: `checks.${checkName}.claude_code.mcpServers`,\n                message:\n                  \"'claude_code.mcpServers' is ignored for type 'ai'. Use 'ai.mcpServers' or 'ai_mcp_servers' instead.\",\n              });\n            }\n          }\n\n          if (checkConfig.type === 'claude-code') {\n            if (hasAiMcp || checkConfig.ai_mcp_servers) {\n              warnings.push({\n                field: hasAiMcp\n                  ? `checks.${checkName}.ai.mcpServers`\n                  : `checks.${checkName}.ai_mcp_servers`,\n                message:\n                  \"For type 'claude-code', MCP must be configured under 'claude_code.mcpServers'. 'ai.mcpServers' and 'ai_mcp_servers' are ignored for this check.\",\n              });\n            }\n          }\n        } catch {\n          // best-effort hints; never fail validation here\n        }\n      }\n    }\n\n    // Validate global MCP servers if present\n    if (config.ai_mcp_servers) {\n      this.validateMcpServersObject(config.ai_mcp_servers, 'ai_mcp_servers', errors, warnings);\n    }\n\n    // Validate output configuration if present\n    if (config.output) {\n      this.validateOutputConfig(config.output as unknown as Record<string, unknown>, errors);\n    }\n\n    // Validate HTTP server configuration if present\n    if (config.http_server) {\n      this.validateHttpServerConfig(\n        config.http_server as unknown as Record<string, unknown>,\n        errors\n      );\n    }\n\n    // Validate max_parallelism if present\n    if (config.max_parallelism !== undefined) {\n      if (\n        typeof config.max_parallelism !== 'number' ||\n        config.max_parallelism < 1 ||\n        !Number.isInteger(config.max_parallelism)\n      ) {\n        errors.push({\n          field: 'max_parallelism',\n          message: 'max_parallelism must be a positive integer (minimum 1)',\n          value: config.max_parallelism,\n        });\n      }\n    }\n\n    // Validate tag_filter if present\n    if (config.tag_filter) {\n      this.validateTagFilter(config.tag_filter as unknown as Record<string, unknown>, errors);\n    }\n\n    // In strict mode, treat warnings as errors\n    if (strict && warnings.length > 0) {\n      errors.push(...warnings);\n    }\n\n    if (errors.length > 0) {\n      throw new Error(errors[0].message);\n    }\n\n    // Emit warnings (do not block execution) - only in non-strict mode\n    if (!strict && warnings.length > 0) {\n      for (const w of warnings) {\n        logger.warn(`⚠️  Config warning [${w.field}]: ${w.message}`);\n      }\n    }\n  }\n\n  /**\n   * Validate individual check configuration\n   */\n  private validateCheckConfig(\n    checkName: string,\n    checkConfig: CheckConfig,\n    errors: ConfigValidationError[],\n    config?: Partial<VisorConfig>\n  ): void {\n    // Default to 'ai' if no type specified\n    if (!checkConfig.type) {\n      checkConfig.type = 'ai';\n    }\n    // Backward-compat alias: accept 'logger' as 'log'\n    if ((checkConfig as any).type === 'logger') {\n      (checkConfig as any).type = 'log';\n    }\n\n    if (!this.validCheckTypes.includes(checkConfig.type)) {\n      errors.push({\n        field: `checks.${checkName}.type`,\n        message: `Invalid check type \"${checkConfig.type}\". Must be: ${this.validCheckTypes.join(', ')}`,\n        value: checkConfig.type,\n      });\n    }\n\n    // Only AI checks require prompts\n    if (checkConfig.type === 'ai' && !checkConfig.prompt) {\n      errors.push({\n        field: `checks.${checkName}.prompt`,\n        message: `Invalid check configuration for \"${checkName}\": missing prompt (required for AI checks)`,\n      });\n    }\n\n    // Command checks require exec field\n    if (checkConfig.type === 'command' && !checkConfig.exec) {\n      errors.push({\n        field: `checks.${checkName}.exec`,\n        message: `Invalid check configuration for \"${checkName}\": missing exec field (required for command checks)`,\n      });\n    }\n\n    // HTTP output checks require url and body fields\n    if (checkConfig.type === 'http') {\n      if (!checkConfig.url) {\n        errors.push({\n          field: `checks.${checkName}.url`,\n          message: `Invalid check configuration for \"${checkName}\": missing url field (required for http checks)`,\n        });\n      }\n      if (!checkConfig.body) {\n        errors.push({\n          field: `checks.${checkName}.body`,\n          message: `Invalid check configuration for \"${checkName}\": missing body field (required for http checks)`,\n        });\n      }\n    }\n\n    // Note: Do not add special-case validation for log 'message' here.\n    // Schema (Ajv) permits 'message' and related keys; provider enforces at execution time.\n\n    // HTTP input checks require endpoint field\n    if (checkConfig.type === 'http_input' && !checkConfig.endpoint) {\n      errors.push({\n        field: `checks.${checkName}.endpoint`,\n        message: `Invalid check configuration for \"${checkName}\": missing endpoint field (required for http_input checks)`,\n      });\n    }\n\n    // HTTP client checks require url field\n    if (checkConfig.type === 'http_client' && !checkConfig.url) {\n      errors.push({\n        field: `checks.${checkName}.url`,\n        message: `Invalid check configuration for \"${checkName}\": missing url field (required for http_client checks)`,\n      });\n    }\n\n    // Validate cron schedule if specified\n    if (checkConfig.schedule) {\n      // Basic cron validation - could use node-cron.validate() for better validation\n      const cronParts = checkConfig.schedule.split(' ');\n      if (cronParts.length < 5 || cronParts.length > 6) {\n        errors.push({\n          field: `checks.${checkName}.schedule`,\n          message: `Invalid cron expression for \"${checkName}\": ${checkConfig.schedule}`,\n          value: checkConfig.schedule,\n        });\n      }\n    }\n\n    // 'on' field is optional - if not specified, check can be triggered by any event\n    if (checkConfig.on) {\n      if (!Array.isArray(checkConfig.on)) {\n        errors.push({\n          field: `checks.${checkName}.on`,\n          message: `Invalid check configuration for \"${checkName}\": 'on' field must be an array`,\n        });\n      } else {\n        // Validate event triggers\n        for (const event of checkConfig.on) {\n          if (!this.validEventTriggers.includes(event)) {\n            errors.push({\n              field: `checks.${checkName}.on`,\n              message: `Invalid event \"${event}\". Must be one of: ${this.validEventTriggers.join(', ')}`,\n              value: event,\n            });\n          }\n        }\n      }\n    }\n\n    // Validate reuse_ai_session configuration\n    if (checkConfig.reuse_ai_session !== undefined) {\n      const isString = typeof checkConfig.reuse_ai_session === 'string';\n      const isBoolean = typeof checkConfig.reuse_ai_session === 'boolean';\n\n      if (!isString && !isBoolean) {\n        errors.push({\n          field: `checks.${checkName}.reuse_ai_session`,\n          message: `Invalid reuse_ai_session value for \"${checkName}\": must be string (check name) or boolean`,\n          value: checkConfig.reuse_ai_session,\n        });\n      } else if (isString) {\n        // When reuse_ai_session is a string, it must refer to a valid check\n        const targetCheckName = checkConfig.reuse_ai_session as string;\n        if (!config?.checks || !config.checks[targetCheckName]) {\n          errors.push({\n            field: `checks.${checkName}.reuse_ai_session`,\n            message: `Check \"${checkName}\" references non-existent check \"${targetCheckName}\" for session reuse`,\n            value: checkConfig.reuse_ai_session,\n          });\n        }\n      } else if (checkConfig.reuse_ai_session === true) {\n        // When reuse_ai_session is true, depends_on must be specified and non-empty\n        if (\n          !checkConfig.depends_on ||\n          !Array.isArray(checkConfig.depends_on) ||\n          checkConfig.depends_on.length === 0\n        ) {\n          errors.push({\n            field: `checks.${checkName}.reuse_ai_session`,\n            message: `Check \"${checkName}\" has reuse_ai_session=true but missing or empty depends_on. Session reuse requires dependency on another check.`,\n            value: checkConfig.reuse_ai_session,\n          });\n        }\n      }\n    }\n\n    // Validate session_mode configuration\n    if (checkConfig.session_mode !== undefined) {\n      if (checkConfig.session_mode !== 'clone' && checkConfig.session_mode !== 'append') {\n        errors.push({\n          field: `checks.${checkName}.session_mode`,\n          message: `Invalid session_mode value for \"${checkName}\": must be 'clone' or 'append'`,\n          value: checkConfig.session_mode,\n        });\n      }\n\n      // session_mode only makes sense with reuse_ai_session\n      if (!checkConfig.reuse_ai_session) {\n        errors.push({\n          field: `checks.${checkName}.session_mode`,\n          message: `Check \"${checkName}\" has session_mode but no reuse_ai_session. session_mode requires reuse_ai_session to be set.`,\n          value: checkConfig.session_mode,\n        });\n      }\n    }\n\n    // Validate tags configuration\n    if (checkConfig.tags !== undefined) {\n      if (!Array.isArray(checkConfig.tags)) {\n        errors.push({\n          field: `checks.${checkName}.tags`,\n          message: `Invalid tags value for \"${checkName}\": must be an array of strings`,\n          value: checkConfig.tags,\n        });\n      } else {\n        // Validate each tag\n        const validTagPattern = /^[a-zA-Z0-9][a-zA-Z0-9-_]*$/;\n        checkConfig.tags.forEach((tag, index) => {\n          if (typeof tag !== 'string') {\n            errors.push({\n              field: `checks.${checkName}.tags[${index}]`,\n              message: `Invalid tag at index ${index} for \"${checkName}\": must be a string`,\n              value: tag,\n            });\n          } else if (!validTagPattern.test(tag)) {\n            errors.push({\n              field: `checks.${checkName}.tags[${index}]`,\n              message: `Invalid tag \"${tag}\" for \"${checkName}\": tags must be alphanumeric with hyphens or underscores (start with alphanumeric)`,\n              value: tag,\n            });\n          }\n        });\n      }\n    }\n  }\n\n  /**\n   * Validate MCP servers object shape and values (basic shape only)\n   */\n  private validateMcpServersObject(\n    mcpServers: unknown,\n    fieldPrefix: string,\n    errors: ConfigValidationError[],\n    _warnings: ConfigValidationError[]\n  ): void {\n    if (typeof mcpServers !== 'object' || mcpServers === null) {\n      errors.push({\n        field: fieldPrefix,\n        message: `${fieldPrefix} must be an object mapping server names to { command, args?, env? }`,\n        value: mcpServers,\n      });\n      return;\n    }\n\n    for (const [serverName, cfg] of Object.entries(mcpServers as Record<string, unknown>)) {\n      const pathStr = `${fieldPrefix}.${serverName}`;\n      if (!cfg || typeof cfg !== 'object') {\n        errors.push({ field: pathStr, message: `${pathStr} must be an object`, value: cfg });\n        continue;\n      }\n      const { command, args, env } = cfg as { command?: unknown; args?: unknown; env?: unknown };\n      if (typeof command !== 'string' || command.trim() === '') {\n        errors.push({\n          field: `${pathStr}.command`,\n          message: `${pathStr}.command must be a non-empty string`,\n          value: command,\n        });\n      }\n      if (args !== undefined && !Array.isArray(args)) {\n        errors.push({\n          field: `${pathStr}.args`,\n          message: `${pathStr}.args must be an array of strings`,\n          value: args,\n        });\n      }\n      if (env !== undefined) {\n        if (typeof env !== 'object' || env === null) {\n          errors.push({\n            field: `${pathStr}.env`,\n            message: `${pathStr}.env must be an object of string values`,\n            value: env,\n          });\n        } else {\n          for (const [k, v] of Object.entries(env as Record<string, unknown>)) {\n            if (typeof v !== 'string') {\n              errors.push({\n                field: `${pathStr}.env.${k}`,\n                message: `${pathStr}.env.${k} must be a string`,\n                value: v,\n              });\n            }\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Validate configuration using generated JSON Schema via Ajv, if available.\n   * Adds to errors/warnings but does not throw directly.\n   */\n  private validateWithAjvSchema(\n    config: Partial<VisorConfig>,\n    errors: ConfigValidationError[],\n    warnings: ConfigValidationError[]\n  ): void {\n    try {\n      if (!__ajvValidate) {\n        // Preferred fast path: try plain JSON in dist/generated first\n        try {\n          const jsonPath = path.resolve(__dirname, 'generated', 'config-schema.json');\n\n          const jsonSchema = require(jsonPath);\n          if (jsonSchema) {\n            const ajv = new Ajv({ allErrors: true, allowUnionTypes: true, strict: false });\n            addFormats(ajv);\n            const validate = ajv.compile(jsonSchema);\n            __ajvValidate = (data: unknown) => validate(data);\n            __ajvErrors = () => validate.errors;\n          }\n        } catch {}\n        // Fallback: use embedded TS module (bundled by ncc)\n        if (!__ajvValidate) {\n          try {\n            const mod = require('./generated/config-schema');\n            const schema = mod?.configSchema || mod?.default || mod;\n            if (schema) {\n              const ajv = new Ajv({ allErrors: true, allowUnionTypes: true, strict: false });\n              addFormats(ajv);\n              const validate = ajv.compile(schema);\n              __ajvValidate = (data: unknown) => validate(data);\n              __ajvErrors = () => validate.errors;\n            } else {\n              return;\n            }\n          } catch {\n            return;\n          }\n        }\n      }\n\n      const ok = __ajvValidate(config);\n      const errs = __ajvErrors ? __ajvErrors() : null;\n      if (!ok && Array.isArray(errs)) {\n        for (const e of errs) {\n          const pathStr = e.instancePath\n            ? e.instancePath.replace(/^\\//, '').replace(/\\//g, '.')\n            : '';\n          const msg = e.message || 'Invalid configuration';\n          if (e.keyword === 'additionalProperties') {\n            const addl = (e.params && (e.params as any).additionalProperty) || 'unknown';\n            const fullField = pathStr ? `${pathStr}.${addl}` : addl;\n            const topLevel = !pathStr;\n            warnings.push({\n              field: fullField || 'config',\n              message: topLevel\n                ? `Unknown top-level key '${addl}' will be ignored.`\n                : `Unknown key '${addl}' will be ignored`,\n            });\n          } else {\n            // Defer to our existing programmatic validators for required/type errors\n            // to preserve friendly, stable error messages and avoid duplication.\n            logger.debug(`Ajv note [${pathStr || 'config'}]: ${msg}`);\n          }\n        }\n      }\n    } catch (err) {\n      logger.debug(`Ajv validation skipped: ${err instanceof Error ? err.message : String(err)}`);\n    }\n  }\n\n  // Unknown-key warnings are fully handled by Ajv using the generated schema\n  // Unknown-key hints are produced by Ajv (additionalProperties=false)\n\n  /**\n   * Validate tag filter configuration\n   */\n  private validateTagFilter(\n    tagFilter: Record<string, unknown>,\n    errors: ConfigValidationError[]\n  ): void {\n    const validTagPattern = /^[a-zA-Z0-9][a-zA-Z0-9-_]*$/;\n\n    // Validate include tags\n    if (tagFilter.include !== undefined) {\n      if (!Array.isArray(tagFilter.include)) {\n        errors.push({\n          field: 'tag_filter.include',\n          message: 'tag_filter.include must be an array of strings',\n          value: tagFilter.include,\n        });\n      } else {\n        tagFilter.include.forEach((tag: unknown, index: number) => {\n          if (typeof tag !== 'string') {\n            errors.push({\n              field: `tag_filter.include[${index}]`,\n              message: `Invalid tag at index ${index}: must be a string`,\n              value: tag,\n            });\n          } else if (!validTagPattern.test(tag as string)) {\n            errors.push({\n              field: `tag_filter.include[${index}]`,\n              message: `Invalid tag \"${tag}\": tags must be alphanumeric with hyphens or underscores`,\n              value: tag,\n            });\n          }\n        });\n      }\n    }\n\n    // Validate exclude tags\n    if (tagFilter.exclude !== undefined) {\n      if (!Array.isArray(tagFilter.exclude)) {\n        errors.push({\n          field: 'tag_filter.exclude',\n          message: 'tag_filter.exclude must be an array of strings',\n          value: tagFilter.exclude,\n        });\n      } else {\n        tagFilter.exclude.forEach((tag: unknown, index: number) => {\n          if (typeof tag !== 'string') {\n            errors.push({\n              field: `tag_filter.exclude[${index}]`,\n              message: `Invalid tag at index ${index}: must be a string`,\n              value: tag,\n            });\n          } else if (!validTagPattern.test(tag as string)) {\n            errors.push({\n              field: `tag_filter.exclude[${index}]`,\n              message: `Invalid tag \"${tag}\": tags must be alphanumeric with hyphens or underscores`,\n              value: tag,\n            });\n          }\n        });\n      }\n    }\n  }\n\n  /**\n   * Validate HTTP server configuration\n   */\n  private validateHttpServerConfig(\n    httpServerConfig: Record<string, unknown>,\n    errors: ConfigValidationError[]\n  ): void {\n    if (typeof httpServerConfig.enabled !== 'boolean') {\n      errors.push({\n        field: 'http_server.enabled',\n        message: 'http_server.enabled must be a boolean',\n        value: httpServerConfig.enabled,\n      });\n    }\n\n    if (httpServerConfig.enabled === true) {\n      // Port is required when enabled\n      if (\n        typeof httpServerConfig.port !== 'number' ||\n        httpServerConfig.port < 1 ||\n        httpServerConfig.port > 65535\n      ) {\n        errors.push({\n          field: 'http_server.port',\n          message: 'http_server.port must be a number between 1 and 65535',\n          value: httpServerConfig.port,\n        });\n      }\n\n      // Validate auth if present\n      if (httpServerConfig.auth) {\n        const auth = httpServerConfig.auth as Record<string, unknown>;\n        const validAuthTypes = ['bearer_token', 'hmac', 'basic', 'none'];\n\n        if (!auth.type || !validAuthTypes.includes(auth.type as string)) {\n          errors.push({\n            field: 'http_server.auth.type',\n            message: `Invalid auth type. Must be one of: ${validAuthTypes.join(', ')}`,\n            value: auth.type,\n          });\n        }\n      }\n\n      // Validate TLS configuration if present\n      if (httpServerConfig.tls && typeof httpServerConfig.tls === 'object') {\n        const tls = httpServerConfig.tls as Record<string, unknown>;\n\n        if (tls.enabled === true) {\n          // Cert and key are required when TLS is enabled\n          if (!tls.cert) {\n            errors.push({\n              field: 'http_server.tls.cert',\n              message: 'TLS certificate is required when TLS is enabled',\n            });\n          }\n          if (!tls.key) {\n            errors.push({\n              field: 'http_server.tls.key',\n              message: 'TLS key is required when TLS is enabled',\n            });\n          }\n        }\n      }\n\n      // Validate endpoints if present\n      if (httpServerConfig.endpoints && Array.isArray(httpServerConfig.endpoints)) {\n        for (let i = 0; i < httpServerConfig.endpoints.length; i++) {\n          const endpoint = httpServerConfig.endpoints[i] as Record<string, unknown>;\n          if (!endpoint.path || typeof endpoint.path !== 'string') {\n            errors.push({\n              field: `http_server.endpoints[${i}].path`,\n              message: 'Endpoint path must be a string',\n              value: endpoint.path,\n            });\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Validate output configuration\n   */\n  private validateOutputConfig(\n    outputConfig: Record<string, unknown>,\n    errors: ConfigValidationError[]\n  ): void {\n    if (outputConfig.pr_comment) {\n      const prComment = outputConfig.pr_comment as Record<string, unknown>;\n\n      if (\n        typeof prComment.format === 'string' &&\n        !this.validOutputFormats.includes(prComment.format as ConfigOutputFormat)\n      ) {\n        errors.push({\n          field: 'output.pr_comment.format',\n          message: `Invalid output format \"${prComment.format}\". Must be one of: ${this.validOutputFormats.join(', ')}`,\n          value: prComment.format as string,\n        });\n      }\n\n      if (\n        typeof prComment.group_by === 'string' &&\n        !this.validGroupByOptions.includes(prComment.group_by as GroupByOption)\n      ) {\n        errors.push({\n          field: 'output.pr_comment.group_by',\n          message: `Invalid group_by option \"${prComment.group_by}\". Must be one of: ${this.validGroupByOptions.join(', ')}`,\n          value: prComment.group_by as string,\n        });\n      }\n    }\n  }\n\n  /**\n   * Check if remote extends are allowed\n   */\n  private isRemoteExtendsAllowed(): boolean {\n    // Check environment variable first\n    if (\n      process.env.VISOR_NO_REMOTE_EXTENDS === 'true' ||\n      process.env.VISOR_NO_REMOTE_EXTENDS === '1'\n    ) {\n      return false;\n    }\n    // Default to allowing remote extends\n    return true;\n  }\n\n  /**\n   * Merge configuration with default values\n   */\n  private mergeWithDefaults(config: Partial<VisorConfig>): Partial<VisorConfig> {\n    const defaultConfig = {\n      version: '1.0',\n      checks: {},\n      max_parallelism: 3,\n      output: {\n        pr_comment: {\n          format: 'markdown' as ConfigOutputFormat,\n          group_by: 'check' as GroupByOption,\n          collapse: true,\n        },\n      },\n    };\n\n    // Deep merge with defaults\n    const merged = { ...defaultConfig, ...config };\n\n    // Ensure output has default values\n    if (merged.output) {\n      merged.output.pr_comment = {\n        ...defaultConfig.output.pr_comment,\n        ...merged.output.pr_comment,\n      };\n    } else {\n      merged.output = defaultConfig.output;\n    }\n\n    return merged;\n  }\n}\n\n// Cache Ajv validator across loads to avoid repeated heavy generation\nlet __ajvValidate: ((data: unknown) => boolean) | null = null;\nlet __ajvErrors: (() => import('ajv').ErrorObject[] | null | undefined) | null = null;\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { VisorConfig } from '../types/config';\n\n/**\n * Configuration source types\n */\nexport enum ConfigSourceType {\n  LOCAL = 'local',\n  REMOTE = 'remote',\n  DEFAULT = 'default',\n}\n\n/**\n * Cache entry for remote configurations\n */\ninterface CacheEntry {\n  config: Partial<VisorConfig>;\n  timestamp: number;\n  ttl: number;\n}\n\n/**\n * Options for loading configurations\n */\nexport interface ConfigLoaderOptions {\n  /** Base directory for resolving relative paths */\n  baseDir?: string;\n  /** Whether to allow remote extends (default: true) */\n  allowRemote?: boolean;\n  /** Cache TTL in milliseconds (default: 5 minutes) */\n  cacheTTL?: number;\n  /** Request timeout in milliseconds (default: 30 seconds) */\n  timeout?: number;\n  /** Maximum recursion depth (default: 10) */\n  maxDepth?: number;\n  /** Allowed remote URL patterns (default: ['https://github.com/', 'https://raw.githubusercontent.com/']) */\n  allowedRemotePatterns?: string[];\n  /** Project root directory for path traversal protection */\n  projectRoot?: string;\n}\n\n/**\n * Utility class for loading configurations from various sources\n */\nexport class ConfigLoader {\n  private cache: Map<string, CacheEntry> = new Map();\n  private loadedConfigs: Set<string> = new Set();\n\n  constructor(private options: ConfigLoaderOptions = {}) {\n    this.options = {\n      allowRemote: true,\n      cacheTTL: 5 * 60 * 1000, // 5 minutes\n      timeout: 30 * 1000, // 30 seconds\n      maxDepth: 10,\n      allowedRemotePatterns: [], // Empty by default for security\n      projectRoot: this.findProjectRoot(),\n      ...options,\n    };\n  }\n\n  /**\n   * Determine the source type from a string\n   */\n  private getSourceType(source: string): ConfigSourceType {\n    if (source === 'default') {\n      return ConfigSourceType.DEFAULT;\n    }\n    if (source.startsWith('http://') || source.startsWith('https://')) {\n      return ConfigSourceType.REMOTE;\n    }\n    return ConfigSourceType.LOCAL;\n  }\n\n  /**\n   * Fetch configuration from any source\n   */\n  public async fetchConfig(\n    source: string,\n    currentDepth: number = 0\n  ): Promise<Partial<VisorConfig>> {\n    // Check recursion depth\n    if (currentDepth >= (this.options.maxDepth || 10)) {\n      throw new Error(\n        `Maximum extends depth (${this.options.maxDepth}) exceeded. Check for circular dependencies.`\n      );\n    }\n\n    // Check for circular dependencies\n    const normalizedSource = this.normalizeSource(source);\n    if (this.loadedConfigs.has(normalizedSource)) {\n      throw new Error(\n        `Circular dependency detected: ${normalizedSource} is already in the extends chain`\n      );\n    }\n\n    const sourceType = this.getSourceType(source);\n\n    try {\n      this.loadedConfigs.add(normalizedSource);\n\n      switch (sourceType) {\n        case ConfigSourceType.DEFAULT:\n          return await this.fetchDefaultConfig();\n        case ConfigSourceType.REMOTE:\n          if (!this.options.allowRemote) {\n            throw new Error(\n              'Remote extends are disabled. Enable with --allow-remote-extends or remove VISOR_NO_REMOTE_EXTENDS environment variable.'\n            );\n          }\n          return await this.fetchRemoteConfig(source);\n        case ConfigSourceType.LOCAL:\n          return await this.fetchLocalConfig(source);\n        default:\n          throw new Error(`Unknown configuration source: ${source}`);\n      }\n    } finally {\n      this.loadedConfigs.delete(normalizedSource);\n    }\n  }\n\n  /**\n   * Normalize source path/URL for comparison\n   */\n  private normalizeSource(source: string): string {\n    const sourceType = this.getSourceType(source);\n\n    switch (sourceType) {\n      case ConfigSourceType.DEFAULT:\n        return 'default';\n      case ConfigSourceType.REMOTE:\n        return source.toLowerCase();\n      case ConfigSourceType.LOCAL:\n        const basePath = this.options.baseDir || process.cwd();\n        return path.resolve(basePath, source);\n      default:\n        return source;\n    }\n  }\n\n  /**\n   * Load configuration from local file system\n   */\n  private async fetchLocalConfig(filePath: string): Promise<Partial<VisorConfig>> {\n    const basePath = this.options.baseDir || process.cwd();\n    const resolvedPath = path.resolve(basePath, filePath);\n\n    // Validate against path traversal attacks\n    this.validateLocalPath(resolvedPath);\n\n    if (!fs.existsSync(resolvedPath)) {\n      throw new Error(`Configuration file not found: ${resolvedPath}`);\n    }\n\n    try {\n      const content = fs.readFileSync(resolvedPath, 'utf8');\n      const config = yaml.load(content) as Partial<VisorConfig>;\n\n      if (!config || typeof config !== 'object') {\n        throw new Error(`Invalid YAML in configuration file: ${resolvedPath}`);\n      }\n\n      // Update base directory for nested extends\n      const previousBaseDir = this.options.baseDir;\n      this.options.baseDir = path.dirname(resolvedPath);\n\n      try {\n        // Process extends if present\n        if (config.extends) {\n          const processedConfig = await this.processExtends(config);\n          return processedConfig;\n        }\n\n        return config;\n      } finally {\n        // Restore previous base directory\n        this.options.baseDir = previousBaseDir;\n      }\n    } catch (error) {\n      if (error instanceof Error) {\n        throw new Error(`Failed to load configuration from ${resolvedPath}: ${error.message}`);\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Fetch configuration from remote URL\n   */\n  private async fetchRemoteConfig(url: string): Promise<Partial<VisorConfig>> {\n    // Validate URL protocol\n    if (!url.startsWith('http://') && !url.startsWith('https://')) {\n      throw new Error(`Invalid URL: ${url}. Only HTTP and HTTPS protocols are supported.`);\n    }\n\n    // Validate against SSRF attacks\n    this.validateRemoteURL(url);\n\n    // Check cache\n    const cacheEntry = this.cache.get(url);\n    if (cacheEntry && Date.now() - cacheEntry.timestamp < cacheEntry.ttl) {\n      // Use stderr to avoid contaminating JSON/SARIF output\n      const outputFormat = process.env.VISOR_OUTPUT_FORMAT;\n      const logFn =\n        outputFormat === 'json' || outputFormat === 'sarif' ? console.error : console.log;\n      logFn(`📦 Using cached configuration from: ${url}`);\n      return cacheEntry.config;\n    }\n\n    // Use stderr to avoid contaminating JSON/SARIF output\n    const outputFormat = process.env.VISOR_OUTPUT_FORMAT;\n    const logFn = outputFormat === 'json' || outputFormat === 'sarif' ? console.error : console.log;\n    logFn(`⬇️  Fetching remote configuration from: ${url}`);\n\n    const controller = new AbortController();\n    const timeoutMs = this.options.timeout ?? 30000;\n    const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n    try {\n      const response = await fetch(url, {\n        signal: controller.signal,\n        headers: {\n          'User-Agent': 'Visor/1.0',\n        },\n      });\n\n      if (!response.ok) {\n        throw new Error(`Failed to fetch config: ${response.status} ${response.statusText}`);\n      }\n\n      const content = await response.text();\n      const config = yaml.load(content) as Partial<VisorConfig>;\n\n      if (!config || typeof config !== 'object') {\n        throw new Error(`Invalid YAML in remote configuration: ${url}`);\n      }\n\n      // Cache the configuration\n      this.cache.set(url, {\n        config,\n        timestamp: Date.now(),\n        ttl: this.options.cacheTTL || 5 * 60 * 1000,\n      });\n\n      // Process extends if present\n      if (config.extends) {\n        return await this.processExtends(config);\n      }\n\n      return config;\n    } catch (error) {\n      if (error instanceof Error) {\n        if (error.name === 'AbortError') {\n          throw new Error(`Timeout fetching configuration from ${url} (${timeoutMs}ms)`);\n        }\n        throw new Error(`Failed to fetch remote configuration from ${url}: ${error.message}`);\n      }\n      throw error;\n    } finally {\n      clearTimeout(timeoutId);\n    }\n  }\n\n  /**\n   * Load bundled default configuration\n   */\n  private async fetchDefaultConfig(): Promise<Partial<VisorConfig>> {\n    // Try different paths to find the bundled default config\n    const possiblePaths = [\n      // When running as GitHub Action (bundled in dist/)\n      path.join(__dirname, 'defaults', '.visor.yaml'),\n      // When running from source\n      path.join(__dirname, '..', '..', 'defaults', '.visor.yaml'),\n      // Try via package root\n      this.findPackageRoot() ? path.join(this.findPackageRoot()!, 'defaults', '.visor.yaml') : '',\n      // GitHub Action environment variable\n      process.env.GITHUB_ACTION_PATH\n        ? path.join(process.env.GITHUB_ACTION_PATH, 'defaults', '.visor.yaml')\n        : '',\n      process.env.GITHUB_ACTION_PATH\n        ? path.join(process.env.GITHUB_ACTION_PATH, 'dist', 'defaults', '.visor.yaml')\n        : '',\n    ].filter(p => p); // Remove empty paths\n\n    let defaultConfigPath: string | undefined;\n    for (const possiblePath of possiblePaths) {\n      if (fs.existsSync(possiblePath)) {\n        defaultConfigPath = possiblePath;\n        break;\n      }\n    }\n\n    if (defaultConfigPath && fs.existsSync(defaultConfigPath)) {\n      // Always log to stderr to avoid contaminating formatted output\n      console.error(`📦 Loading bundled default configuration from ${defaultConfigPath}`);\n      const content = fs.readFileSync(defaultConfigPath, 'utf8');\n      let config = yaml.load(content) as Partial<VisorConfig>;\n\n      if (!config || typeof config !== 'object') {\n        throw new Error('Invalid default configuration');\n      }\n\n      // Normalize 'checks' and 'steps' for backward compatibility\n      config = this.normalizeStepsAndChecks(config);\n\n      // Default configs shouldn't have extends, but handle it just in case\n      if (config.extends) {\n        return await this.processExtends(config);\n      }\n\n      return config;\n    }\n\n    // Return minimal default if bundled config not found\n    console.warn('⚠️  Bundled default configuration not found, using minimal defaults');\n    return {\n      version: '1.0',\n      checks: {},\n      output: {\n        pr_comment: {\n          format: 'markdown',\n          group_by: 'check',\n          collapse: true,\n        },\n      },\n    };\n  }\n\n  /**\n   * Process extends directive in a configuration\n   */\n  private async processExtends(config: Partial<VisorConfig>): Promise<Partial<VisorConfig>> {\n    if (!config.extends) {\n      return config;\n    }\n\n    const extends_ = Array.isArray(config.extends) ? config.extends : [config.extends];\n\n    // Remove extends from the config to avoid infinite recursion\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    const { extends: _extendsField, ...configWithoutExtends } = config;\n\n    // Load all parent configurations\n    const parentConfigs: Partial<VisorConfig>[] = [];\n    for (const source of extends_) {\n      const parentConfig = await this.fetchConfig(source, this.loadedConfigs.size);\n      parentConfigs.push(parentConfig);\n    }\n\n    // Merge configurations (will be implemented in config-merger.ts)\n    // For now, we'll import it dynamically\n    const { ConfigMerger } = await import('./config-merger');\n    const merger = new ConfigMerger();\n\n    // Merge all parent configs together first\n    let mergedParents: Partial<VisorConfig> = {};\n    for (const parentConfig of parentConfigs) {\n      mergedParents = merger.merge(mergedParents, parentConfig);\n    }\n\n    // Then merge with the current config (child overrides parent)\n    return merger.merge(mergedParents, configWithoutExtends);\n  }\n\n  /**\n   * Find project root directory (for security validation)\n   */\n  private findProjectRoot(): string {\n    // Try to find git root first\n    try {\n      const { execSync } = require('child_process');\n      const gitRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();\n      if (gitRoot) return gitRoot;\n    } catch {\n      // Not a git repo, continue\n    }\n\n    // Fall back to finding package.json\n    const packageRoot = this.findPackageRoot();\n    if (packageRoot) return packageRoot;\n\n    // Last resort: use current working directory\n    return process.cwd();\n  }\n\n  /**\n   * Validate remote URL against allowlist\n   */\n  private validateRemoteURL(url: string): void {\n    // If allowlist is empty, allow all URLs (backward compatibility)\n    const allowedPatterns = this.options.allowedRemotePatterns || [];\n    if (allowedPatterns.length === 0) {\n      return;\n    }\n\n    // Check if URL matches any allowed pattern\n    const isAllowed = allowedPatterns.some(pattern => url.startsWith(pattern));\n    if (!isAllowed) {\n      throw new Error(\n        `Security error: URL ${url} is not in the allowed list. Allowed patterns: ${allowedPatterns.join(', ')}`\n      );\n    }\n  }\n\n  /**\n   * Validate local path against traversal attacks\n   */\n  private validateLocalPath(resolvedPath: string): void {\n    const projectRoot = this.options.projectRoot || process.cwd();\n    const normalizedPath = path.normalize(resolvedPath);\n    const normalizedRoot = path.normalize(projectRoot);\n\n    // Check if the resolved path is within the project root\n    if (!normalizedPath.startsWith(normalizedRoot)) {\n      throw new Error(\n        `Security error: Path traversal detected. Cannot access files outside project root: ${projectRoot}`\n      );\n    }\n\n    // Additional check for sensitive system files\n    const sensitivePatterns = [\n      '/etc/passwd',\n      '/etc/shadow',\n      '/.ssh/',\n      '/.aws/',\n      '/.env',\n      '/private/',\n    ];\n\n    const lowerPath = normalizedPath.toLowerCase();\n    for (const pattern of sensitivePatterns) {\n      if (lowerPath.includes(pattern)) {\n        throw new Error(`Security error: Cannot access potentially sensitive file: ${pattern}`);\n      }\n    }\n  }\n\n  /**\n   * Find package root directory\n   */\n  private findPackageRoot(): string | null {\n    let currentDir = __dirname;\n    const root = path.parse(currentDir).root;\n\n    while (currentDir !== root) {\n      const packageJsonPath = path.join(currentDir, 'package.json');\n      if (fs.existsSync(packageJsonPath)) {\n        try {\n          const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n          // Check if this is the Visor package\n          if (packageJson.name === '@probelabs/visor') {\n            return currentDir;\n          }\n        } catch {\n          // Continue searching\n        }\n      }\n      currentDir = path.dirname(currentDir);\n    }\n\n    return null;\n  }\n\n  /**\n   * Clear the configuration cache\n   */\n  public clearCache(): void {\n    this.cache.clear();\n  }\n\n  /**\n   * Reset the loaded configs tracking (for testing)\n   */\n  public reset(): void {\n    this.loadedConfigs.clear();\n    this.clearCache();\n  }\n\n  /**\n   * Normalize 'checks' and 'steps' keys for backward compatibility\n   * Ensures both keys are present and contain the same data\n   */\n  private normalizeStepsAndChecks(config: Partial<VisorConfig>): Partial<VisorConfig> {\n    // If both are present, 'steps' takes precedence\n    if (config.steps && config.checks) {\n      // Use steps as the source of truth\n      config.checks = config.steps;\n    } else if (config.steps && !config.checks) {\n      // Copy steps to checks for internal compatibility\n      config.checks = config.steps;\n    } else if (config.checks && !config.steps) {\n      // Copy checks to steps for forward compatibility\n      config.steps = config.checks;\n    }\n\n    return config;\n  }\n}\n","/*\n Thin SDK façade for programmatic use of Visor.\n - No new execution logic; delegates to existing engine and config manager.\n - Dual ESM/CJS bundle via tsup.\n*/\n\nimport { CheckExecutionEngine } from './check-execution-engine';\nimport { ConfigManager } from './config';\nimport type { AnalysisResult } from './output-formatters';\nimport type { VisorConfig, TagFilter, HumanInputRequest } from './types/config';\nimport type { ExecutionContext } from './providers/check-provider.interface';\n\nexport type { VisorConfig, TagFilter, HumanInputRequest, ExecutionContext };\n\nexport interface VisorOptions {\n  cwd?: string;\n  debug?: boolean;\n  maxParallelism?: number;\n  failFast?: boolean;\n  tagFilter?: TagFilter;\n}\n\nexport interface RunOptions extends VisorOptions {\n  config?: VisorConfig;\n  configPath?: string;\n  checks?: string[]; // default: all checks from config\n  timeoutMs?: number;\n  output?: { format?: 'table' | 'json' | 'markdown' | 'sarif' };\n  /** Strict mode: treat config warnings (like unknown keys) as errors (default: false) */\n  strictValidation?: boolean;\n  /** Execution context for providers (CLI message, hooks, etc.) */\n  executionContext?: ExecutionContext;\n}\n\n/**\n * Load and validate a Visor config.\n * @param configOrPath - Config object, file path, or omit to discover defaults\n * @param options - Validation options\n * @returns Validated config with defaults applied\n */\nexport async function loadConfig(\n  configOrPath?: string | Partial<VisorConfig>,\n  options?: { strict?: boolean }\n): Promise<VisorConfig> {\n  const cm = new ConfigManager();\n\n  // If it's an object, validate and return with defaults\n  if (typeof configOrPath === 'object' && configOrPath !== null) {\n    cm.validateConfig(configOrPath, options?.strict ?? false);\n\n    // Apply lightweight defaults without expensive file system operations\n    const defaultConfig: Partial<VisorConfig> = {\n      version: '1.0',\n      checks: {},\n      max_parallelism: 3,\n      fail_fast: false,\n    };\n\n    return {\n      ...defaultConfig,\n      ...configOrPath,\n      checks: configOrPath.checks || {},\n    } as VisorConfig;\n  }\n\n  // If it's a string, load from file\n  if (typeof configOrPath === 'string') {\n    return cm.loadConfig(configOrPath);\n  }\n\n  // Otherwise discover default config file\n  return cm.findAndLoadConfig();\n}\n\n/** Expand check IDs by including their dependencies (shallow->deep). */\nexport function resolveChecks(checkIds: string[], config: VisorConfig | undefined): string[] {\n  if (!config?.checks) return Array.from(new Set(checkIds));\n  const resolved = new Set<string>();\n  const visiting = new Set<string>();\n  const result: string[] = [];\n\n  const dfs = (id: string, stack: string[] = []) => {\n    if (resolved.has(id)) return;\n    if (visiting.has(id)) {\n      const cycle = [...stack, id].join(' -> ');\n      throw new Error(`Circular dependency detected involving check: ${id} (path: ${cycle})`);\n    }\n    visiting.add(id);\n    const deps = config.checks![id]?.depends_on || [];\n    for (const d of deps) dfs(d, [...stack, id]);\n    if (!result.includes(id)) result.push(id);\n    visiting.delete(id);\n    resolved.add(id);\n  };\n\n  for (const id of checkIds) dfs(id);\n  return result;\n}\n\n/**\n * Run Visor checks programmatically. Returns the same AnalysisResult shape used by the CLI.\n * Thin wrapper around CheckExecutionEngine.executeChecks.\n */\nexport async function runChecks(opts: RunOptions = {}): Promise<AnalysisResult> {\n  const cm = new ConfigManager();\n  let config: VisorConfig;\n\n  if (opts.config) {\n    // Validate manually constructed config\n    // In strict mode, unknown keys are treated as errors\n    cm.validateConfig(opts.config, opts.strictValidation ?? false);\n    config = opts.config;\n  } else if (opts.configPath) {\n    config = await cm.loadConfig(opts.configPath);\n  } else {\n    config = await cm.findAndLoadConfig();\n  }\n\n  const checks =\n    opts.checks && opts.checks.length > 0\n      ? resolveChecks(opts.checks, config)\n      : Object.keys(config.checks || {});\n\n  const engine = new CheckExecutionEngine(opts.cwd);\n\n  // Set execution context if provided\n  if (opts.executionContext) {\n    engine.setExecutionContext(opts.executionContext);\n  }\n\n  const result = await engine.executeChecks({\n    checks,\n    workingDirectory: opts.cwd,\n    timeout: opts.timeoutMs,\n    maxParallelism: opts.maxParallelism,\n    failFast: opts.failFast,\n    outputFormat: opts.output?.format,\n    config,\n    debug: opts.debug,\n    tagFilter: opts.tagFilter,\n  });\n\n  return result;\n}\n"],"mappings":"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","names":["yaml","fs","path","outputFormat","logFn","ConfigMerger"]}