@probelabs/visor 0.1.97 → 0.1.98

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +14 -14
  2. package/defaults/.visor.yaml +3 -2
  3. package/dist/check-execution-engine.d.ts.map +1 -1
  4. package/dist/config.d.ts +5 -0
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/defaults/.visor.yaml +3 -2
  7. package/dist/generated/config-schema.d.ts +6 -2
  8. package/dist/generated/config-schema.d.ts.map +1 -1
  9. package/dist/generated/config-schema.json +5 -2
  10. package/dist/index.js +69 -13
  11. package/dist/sdk/{check-execution-engine-S7BFPVWA.mjs → check-execution-engine-W5FLIWZL.mjs} +2 -2
  12. package/dist/sdk/{chunk-4VK6WTYU.mjs → chunk-POYXI3MQ.mjs} +2 -2
  13. package/dist/sdk/{chunk-4VK6WTYU.mjs.map → chunk-POYXI3MQ.mjs.map} +1 -1
  14. package/dist/sdk/sdk.d.mts +4 -2
  15. package/dist/sdk/sdk.d.ts +4 -2
  16. package/dist/sdk/sdk.js +48 -9
  17. package/dist/sdk/sdk.js.map +1 -1
  18. package/dist/sdk/sdk.mjs +49 -10
  19. package/dist/sdk/sdk.mjs.map +1 -1
  20. package/dist/types/config.d.ts +4 -2
  21. package/dist/types/config.d.ts.map +1 -1
  22. package/dist/utils/config-loader.d.ts +5 -0
  23. package/dist/utils/config-loader.d.ts.map +1 -1
  24. package/package.json +1 -1
  25. /package/dist/output/traces/{run-2025-10-19T14-24-36-341Z.ndjson → run-2025-10-19T19-05-29-328Z.ndjson} +0 -0
  26. /package/dist/output/traces/{run-2025-10-19T14-24-48-674Z.ndjson → run-2025-10-19T19-05-42-253Z.ndjson} +0 -0
  27. /package/dist/output/traces/{run-2025-10-19T14-24-49-238Z.ndjson → run-2025-10-19T19-05-42-805Z.ndjson} +0 -0
  28. /package/dist/output/traces/{run-2025-10-19T14-24-49-761Z.ndjson → run-2025-10-19T19-05-43-323Z.ndjson} +0 -0
  29. /package/dist/output/traces/{run-2025-10-19T14-24-50-279Z.ndjson → run-2025-10-19T19-05-43-841Z.ndjson} +0 -0
  30. /package/dist/sdk/{check-execution-engine-S7BFPVWA.mjs.map → check-execution-engine-W5FLIWZL.mjs.map} +0 -0
  31. /package/dist/traces/{run-2025-10-19T14-24-36-341Z.ndjson → run-2025-10-19T19-05-29-328Z.ndjson} +0 -0
  32. /package/dist/traces/{run-2025-10-19T14-24-48-674Z.ndjson → run-2025-10-19T19-05-42-253Z.ndjson} +0 -0
  33. /package/dist/traces/{run-2025-10-19T14-24-49-238Z.ndjson → run-2025-10-19T19-05-42-805Z.ndjson} +0 -0
  34. /package/dist/traces/{run-2025-10-19T14-24-49-761Z.ndjson → run-2025-10-19T19-05-43-323Z.ndjson} +0 -0
  35. /package/dist/traces/{run-2025-10-19T14-24-50-279Z.ndjson → run-2025-10-19T19-05-43-841Z.ndjson} +0 -0
@@ -1 +1 @@
1
- {"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 checks: {\n $ref: '#/definitions/Record%3Cstring%2CCheckConfig%3E',\n description: 'Check configurations',\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', 'checks', '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 },\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 ],\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 'command',\n 'http',\n 'http_input',\n 'http_client',\n 'memory',\n 'noop',\n 'log',\n 'memory',\n 'github',\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 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 checks: {},\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 const parsedConfig = yaml.load(configContent) as Partial<VisorConfig>;\n\n if (!parsedConfig || typeof parsedConfig !== 'object') {\n return null;\n }\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 * 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 if (!config.checks) {\n errors.push({\n field: 'checks',\n message: 'Missing required field: checks',\n });\n } else {\n // Validate each check configuration\n for (const [checkName, checkConfig] of Object.entries(config.checks)) {\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 const config = yaml.load(content) as Partial<VisorConfig>;\n\n if (!config || typeof config !== 'object') {\n throw new Error('Invalid default configuration');\n }\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 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 } from './types/config';\n\nexport type { VisorConfig, TagFilter };\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}\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 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"]}
1
+ {"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 },\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 ],\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 'command',\n 'http',\n 'http_input',\n 'http_client',\n 'memory',\n 'noop',\n 'log',\n 'memory',\n 'github',\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 } from './types/config';\n\nexport type { VisorConfig, TagFilter };\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}\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 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"]}